Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Parallel Computing auf Raspberry Pi 4B+ IoT-Boards leicht gemacht

Erstellen und Ausführen eines parallelen Codes in C++17, implementiert mit der Khronos CL/SYCL-Modellspezifikation, auf Raspberry Pi IoT-Boards.

Unsere Ziele…

Dieses Projekt bietet nützliche Richtlinien, Tipps und Tutorials zum Erstellen eines modernen parallelen Codes in C++17/2×0, implementiert mit dem CL/SYCL-Programmiermodell, und zum Ausführen auf der nächsten Generation von Raspberry Pi 4B IoT-Boards, basierend auf die innovativen ARM Cortex-A72, Quad-Core, 64-Bit RISC-V CPUs.

Ein Leserpublikum wird erfahren, wie ein Raspberry 4B IoT-Board out-of-the-box eingerichtet und für paralleles Computing verwendet wird, indem ein paralleler Code in C++17 bereitgestellt wird, mit dem Khronos CL/triSYCL und Aksel Alpays Die Open-Source-Distributionen des hipSYCL-Projekts, die die GNU Compiler Collection (GCC) und die LLVM/Clang-9.xx Arm/Aarch64-Toolchains installieren und konfigurieren, um die ausführbaren Dateien des parallelen Codes zu erstellen und in Raspbian Buster 10.6 OS auszuführen.

Raspberry PI 4B+ IoT-Boards Übersicht

Die nächste Generation innovativer Raspberry Pi 4B+ IoT-Boards, basierend auf den leistungsstarken symmetrischen 64-Bit-RISC-V-Mehrkernprozessoren von ARM, bietet eine entfesselte Leistung und damit die ultimative Produktivität des parallelen Computings selbst. Durch die Verwendung der neuesten Raspberry Pi-Boards kann die tatsächliche Leistungsbeschleunigung der Rechenprozesse am Edge drastisch verbessert werden, z -Skala. Die parallele Ausführung dieser Prozesse erhöht die Effizienz dieser Cloud-basierten Lösungen erheblich, indem sie Milliarden von Kundenanfragen bedienen oder Datenanalysen und andere Inferenzen bereitstellen.

Bevor wir unsere Diskussion über das Erstellen und Ausführen eines parallelen Codes in C++17 begründen, der unter Verwendung der heterogenen CL/SYCL-Programmiermodellspezifikation für die Raspberry Pi-Boards mit Arm/Aarch64-Architektur entwickelt wurde, lassen Sie uns einen Moment Zeit verbringen und eine kurze Blick auf die nächste Generation von Raspberry Pi 4B+ Boards und ihre technischen Daten:

Die Raspberry Pi 4B+ IoT-Boards werden auf Basis der innovativen Broadcom BCM2711B0 (SoC)-Chips hergestellt, die mit den neuesten ARM Quad-Core Cortex-A72 @ 1,5 GHz 64-Bit RISC-V-CPUs ausgestattet sind und eine ultimative Leistung und Skalierbarkeit bei gleichzeitiger Nutzung bieten es für das parallele Rechnen, am Rand.

Der Raspberry Pi ist bekannt für die „zuverlässigen“ und „schnellen“ winzigen Nano-Computer, die für Data Mining und Parallel Computing entwickelt wurden. Grundsätzlich neue Hardware-Architekturmerkmale der symmetrischen 64-Bit-RISC-V-CPUs mit mehreren Kernen von ARM, wie DSP, SIMD, VFPv4 und Hardware-Virtualisierungsunterstützung, sind in der Lage, die Leistung, Beschleunigung und Skalierbarkeit von die IoT-Cluster, die massiv Daten verarbeiten, am Edge.

Einer der wichtigsten Vorteile der neuesten Raspberry Pi 4B+ Boards ist insbesondere der Low-Profile-LPDDR4-Speicher mit wahlweise 2, 4 oder 8 GiB RAM-Kapazität, der mit 3200 MHz arbeitet und eine typischerweise große Bandbreite für Speichertransaktionen bietet, was sich positiv auf die Leistung auswirkt des parallelen Rechnens im Allgemeinen. Die Boards mit 4 GiB RAM und höher werden dringend für Data Mining und Parallel Computing empfohlen. Außerdem werden die BCM2711B0 SoC-Chips mit einer Vielzahl von integrierten Geräten und Peripheriegeräten gebündelt, wie z. B. Broadcom VideoCore VI @ 500Mhz GPUs, PCI-Ex Gigabit Ethernet Adapter usw.

Um einen spezifischen parallelen modernen Code in C++17 zu erstellen und auszuführen, der mit dem heterogenen Programmiermodell CL/SYCL implementiert ist, brauchen wir zuerst ein Raspberry Pi 4B+ IoT-Board mit dem neuesten installierten und konfigurierten Raspbian Buster 10.6 OS die erste Verwendung.

Hier eine kurze Checkliste der Hard- und Softwarevoraussetzungen, die vorher erfüllt sein müssen:

Hardware:

Software:

Da wir ein Raspberry Pi 4B+ IoT-Board haben, können wir es jetzt sofort einschalten und einrichten.

Einrichten eines Raspberry Pi 4B IoT-Boards

Bevor wir beginnen, müssen wir die neueste Version des Raspbian Buster 10.6.0 Full OS-Images aus dem offiziellen Raspberry Pi-Repository herunterladen. Um das Raspbian OS-Image auf der SD-Karte zu installieren, müssen wir auch die Raspbian Imager 1.4-Anwendung herunterladen und verwenden, die für verschiedene Plattformen wie Windows, Linux oder macOS verfügbar ist:

Außerdem müssen wir die MobaXterm-Anwendung herunterladen und installieren, um eine Remote-Verbindung zum Raspberry Pi-Board über das SSH- oder FTP-Protokoll herzustellen:

Da das Raspbian Buster OS und die Imager-Anwendung erfolgreich heruntergeladen und installiert wurden, verwenden wir die Imager-Anwendung, um Folgendes zu tun:

1. Löschen Sie die SD-Karte, indem Sie sie standardmäßig auf das FAT32-Dateisystem formatieren;

2. Extrahieren Sie das vorinstallierte Raspbian Buster OS-Image (*.img) auf die SD-Karte;

Da die obigen Schritte erfolgreich abgeschlossen wurden, entfernen Sie einfach die SD-Karte aus dem Kartenleser und stecken Sie sie in den SD-Kartensteckplatz des Raspberry Pi-Boards. Schließen Sie dann die Micro-HDMI- und Ethernet-Kabel an. Schließlich stecken Sie den Stecker des DC-Stromversorgungskabels ein und schalten die Platine ein. Schließlich bootet das System mit dem auf der SD-Karte installierten Raspbian Buster OS und fordert Sie auf, mehrere Schritte nach der Installation durchzuführen, um es für die erste Verwendung zu konfigurieren.

Stellen Sie nach dem Einschalten des Boards sicher, dass alle folgenden Schritte nach der Installation abgeschlossen sind:

1. Öffne die Bash-Konsole und setze das ‚root‘-Passwort:

[email protected]:~ $ sudo passwd root 

2. Melden Sie sich mit ‚root‘-Rechten an der Raspbian-Bash-Konsole an:

[email protected]:~ $ sudo -s 

3. Aktualisieren Sie das Linux-Basissystem und die Firmware von Raspbian mit den folgenden Befehlen:

[email protected]:~# sudo apt [email protected]:~# sudo apt [email protected]:~# sudo rpi-update 

4. Starten Sie das System zum ersten Mal neu:

[email protected]:~# sudo shutdown -r now 

5. Installieren Sie den neuesten Raspbian-Bootloader und starten Sie das System noch einmal neu:

[email protected]:~# sudo rpi-eeprom-update -d [email protected]:~# sudo shutdown -r now 

6. Starten Sie das Setup-Tool „raspi-config“:

[email protected]:~# sudo raspi-config 

7. Führen Sie die folgenden Schritte mit dem Tool „raspi-config“ aus:

* Aktualisieren Sie das ‘raspi-config’-Tool:

* Deaktivieren Sie die Desktop-GUI von Raspbian beim Booten:

Systemoptionen>> Boot/Autologin>> Autologin für die Konsole:

* Erweitern Sie die Root-Partitionsgröße „/“ auf der SD-Karte:

Nachdem Sie die Raspbian-Post-Install-Konfiguration durchgeführt haben, starten Sie das System schließlich neu. Nach dem Neustart werden Sie aufgefordert, sich anzumelden. Verwenden Sie den „root“-Benutzernamen und das zuvor festgelegte Passwort, um sich mit Root-Rechten an der Bash-Konsole anzumelden.

Nachdem Sie sich erfolgreich angemeldet haben, installieren Sie die Anzahl der Pakete aus APT-Repositorys mit dem folgenden Befehl in der bash-console:

[email protected]:~# sudo apt install -y net-tools openssh-server 

Diese beiden Pakete werden benötigt, um entweder die Netzwerkschnittstelle des Raspberry Pi oder den OpenSSH-Server für die Remote-Verbindung zum Board über das SSH-Protokoll mit MobaXterm zu konfigurieren.

Konfigurieren Sie die Netzwerkschnittstelle „eth0“ des Boards, indem Sie /etc/network/interfaces ändern, zum Beispiel:

auto eth0iface eth0 inet staticaddress 192.168.87.100netmask 255.255.255.0broadcast 192.168.87.255gateway 192.168.87.254nameserver 192.168.87.254 

Führen Sie neben der Netzwerkschnittstelle eine grundlegende Konfiguration des OpenSSH-Servers durch, indem Sie diese Zeilen in der /etc/ssh/sshd_config . auskommentieren :

PermitRootLogin yesStrictModes noPasswordAuthentication yesPermitEmptyPasswords yes 

Dies ermöglicht die ‚root‘-Anmeldung an der Bash-Konsole über das SSH-Protokoll, ohne ein Passwort einzugeben.

Versuchen Sie schließlich, das Board über das Netzwerk zu verbinden, indem Sie die MobaXterm-Anwendung verwenden und die Remote-SSH-Sitzung zum Host mit der IP-Adresse 192.168.87.100 öffnen. Sie müssen sich auch mit den zuvor festgelegten Anmeldeinformationen erfolgreich an der Bash-Konsole von Raspbian anmelden können:

Entwicklung eines parallelen Codes in C++17 mit CL/SYCL-Modell

Im Jahr 2020 kündigten die Khronos Group, Intel Corp. und andere Anbieter die revolutionäre neue heterogene parallele Compute-Plattform (XPU) an, die die Möglichkeit bietet, eine Ausführung „schwerer“ Datenverarbeitungs-Workloads auf eine weit verbreitete Hardwarebeschleunigung (z FPGAs) nur andere Ziele als die Host-CPUs. Konzeptionell basiert die parallele Codeentwicklung unter Verwendung der XPU-Plattform vollständig auf der Khronos CL/SYCL-Programmiermodellspezifikation, einer Abstraktionsschicht der OpenCL 2.0-Bibliothek.

Hier ist ein kleines Beispiel, das den Code in C++17 veranschaulicht, der mit der Abstraktionsschicht des CL/SYCL-Modells implementiert wurde:

#include 
unter Verwendung des Namespace cl::sycl;constexpr std::uint32_t N =1000;cl::sycl::queue q{};q.submit([&](cl::sycl::handler &cgh) { cgh.parallel_for(cl::sycl::range<1>{N}, \ [=](cl::sycl ::id<1> idx) { // Parallel arbeiten });});q.wait(); 

Das oben gezeigte Codefragment in C++17 wird vollständig auf der Grundlage des CL/SYCL-Programmiermodells ausgeliefert. Es instanziiert ein cl::sycl::queue{}-Objekt mit der Standardparameter-Initialisierungsliste, um SYCL-Kernel zur Ausführung an das standardmäßig verwendete Beschleunigungsziel der Host-CPU zu übergeben. Als nächstes ruft es die cl::sycl::submit(…)-Methode auf, die ein einzelnes Argument des cl::sycl::handler{}-Objekts hat, um auf Methoden zuzugreifen, die eine grundlegende Kernel-Funktionalität bereitstellen, basierend auf verschiedenen von parallele Algorithmen, einschließlich der Methode cl::sycl::handler::parallel_for(…).

Die folgende Methode wird verwendet, um eine enge parallele Schleife zu implementieren, die aus einem laufenden Kernel heraus erzeugt wird. Jede Iteration dieser Schleife wird parallel von einem eigenen Thread ausgeführt. Der cl::sycl::handler::parallel_for(…) akzeptiert zwei Hauptargumente des cl::sycl::range<>{}-Objekts und eine spezifische Lamda-Funktion, die während jeder Schleifeniteration aufgerufen wird. Das cl::sycl::range<>{}-Objekt definiert grundsätzlich eine Anzahl von parallelen Schleifeniterationen, die für jede spezifische Dimension ausgeführt werden, falls mehrere verschachtelte Schleifen während der Verarbeitung mehrdimensionaler Daten reduziert werden.

Im obigen Code wird das cl::sycl::range<1>(N)-Objekt zum Planen von N-Iterationen der parallelen Schleife in einer einzigen Dimension verwendet. Die Lambda-Funktion der parallel_for(…)-Methode akzeptiert ein einzelnes Argument eines anderen cl::sycl::id<>{}-Objekts. Neben cl::sycl::range<>{} implementiert dieses Objekt einen Vektorcontainer, dessen Element ein Indexwert für jede Dimension bzw. jede Iteration der Parallelschleife ist. Als Argument an einen Code im Gültigkeitsbereich der Lamda-Funktion übergeben, wird das folgende Objekt zum Abrufen der spezifischen Indexwerte verwendet. Der Körper der Lamda-Funktion enthält einen Code, der einen Teil der Datenverarbeitung parallel durchführt.

Nachdem ein bestimmter Kernel an die Warteschlange übergeben und zur Ausführung gespawnt wurde, ruft der folgende Code die Methode cl::sycl::wait() ohne Argumente auf, um eine Barriere-Synchronisation festzulegen, um sicherzustellen, dass bisher kein Code ausgeführt wird , bis der zu spawnende Kernel seine parallele Arbeit abgeschlossen hat.

Das heterogene Programmiermodell CL/SYCL ist hocheffizient und kann für eine Vielzahl von Anwendungen verwendet werden.

Intel Corp. und CodePlay Software Inc haben jedoch bald die Unterstützung von CL/SYCL für andere Hardwarearchitekturen als x86_64 eingestellt. Dies machte es unmöglich, einen parallelen C++-Code unter Verwendung der spezifischen CL/SYCL-Bibliotheken bereitzustellen, der auf Arm/Aarch64 und andere Architekturen abzielte.

Derzeit gibt es eine Reihe von CL/SYCL-Open-Source-Bibliotheksprojekten, die von einer Vielzahl von Entwicklern und Enthusiasten entwickelt wurden und die Unterstützung für mehr Hardwarearchitekturen als nur x86_64 bieten.

Seit 2016 veröffentlicht Khronos Group, Inc. die Überarbeitungen ihres Open-Source-Projekts für die triSYCL-Bibliothek (https://github.com/triSYCL/triSYCL), empfohlen für die Verwendung als Testumgebung bei der Evaluierung der neuesten CL/SYCL-Programmiermodellschicht Spezifikation und Senden eines Feedbacks an Khronos- und ISO-Komitees. Die folgende Bibliotheksverteilung ist jedoch nicht „stabil“ und kann nur zu Demonstrationszwecken und nicht zum Erstellen eines CL/SYCL-Codes in der Produktion verwendet werden. Außerdem unterstützt die Khronos triSYCL-Bibliotheksdistribution vollständig die plattformübergreifende Kompilierung auf einem x86_64-Entwicklungscomputer unter Verwendung der plattformübergreifenden Toolchain von GNU Arm/Aarch64, anstatt einen Code „nativ“ mit LLVM/Clang-Compilern auf Raspberry zu erstellen Pi.

Im Jahr 2019 implementierte Aksel Alpay von der Universität Heidelberg (Deutschland) die neueste Spezifikationsbibliothek für das CL/SYCL-Programmiermodell, die auf verschiedene Hardware-Architekturen abzielte, einschließlich der Arm/Aarch64-Architekturen des Raspberry Pi, und steuerte die „stabilste“ Version bei der hipSYCL Open-Source-Bibliotheksdistribution an GitHub (https://github.com/illuhad/hipSYCL).

Darüber hinaus werden wir in dieser Geschichte die Installation und Konfiguration der plattformübergreifenden GCC/G++-10.xx- und „nativen“ Arm/Aarch64-Toolchains LLVM/Clang-9.xx von GNU und die Verwendung der Bibliotheksdistributionen triSYCL und hipSYCL besprechen. für die Bereitstellung eines modernen parallelen Codes in C++17, basierend auf der Verwendung der Bibliotheken, die diskutiert werden.

Quelle:Parallel Computing auf Raspberry Pi 4B+ IoT-Boards leicht gemacht


Herstellungsprozess

  1. Einfache Temperatur und Luftfeuchtigkeit auf Raspberry Pi
  2. IoT 101-Projekt:Stream-Temperatur von Ihrem Raspberry Pi
  3. Java ME 8 + Raspberry Pi + Sensoren =IoT World (Teil 1)
  4. Einfacher DIY-Baby-Weindetektor mit Raspberry Pi
  5. Erstellen Sie Ihr erstes IOT mit einem Raspberry Pi, einem DHT11-Sensor und Thingspeak.
  6. Einfacher Einstieg in die Welt des IoT mit MQTT
  7. Raspberry PI-basiertes IoT-Projekt zum Verbinden des DHT11-Sensors
  8. Windows 10 IoT Core auf Raspberry Pi 2 – Adafruit-Sensordaten
  9. Windows 10 IoT Core für Raspberry Pi 3 Model B+
  10. BeagleBone und Raspberry Pi erhalten FPGA-Add-ons