Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Parallel computergebruik op Raspberry Pi 4B+ IoT-borden gemakkelijk gemaakt

Een parallelle code bouwen en uitvoeren in C++17, geïmplementeerd met behulp van de Khronos CL/SYCL-modelspecificatie, op Raspberry Pi IoT-kaarten.

Onze doelen…

Dit project biedt nuttige richtlijnen, tips en tutorials voor het bouwen van een moderne parallelle code in C++17/2×0, geïmplementeerd met behulp van het CL/SYCL-programmeermodel, en het uitvoeren ervan op de volgende generatie Raspberry Pi 4B IoT-kaarten, gebaseerd op de innovatieve ARM Cortex-A72, Quad-core, 64-bit RISC-V CPU's.

Een publiek van lezers zal te weten komen over het kant-en-klaar opzetten van een Raspberry 4B IoT-bord en het gebruiken voor parallel computergebruik, het leveren van een parallelle code in C++17, met de Khronos CL/triSYCL en Aksel Alpay's de open-source distributies van het hipSYCL-project, het installeren en configureren van de GNU Compiler Collection (GCC) en LLVM/Clang-9.xx Arm/Aarch64-toolchains, voor het bouwen van de uitvoerbare bestanden van de parallelle code en het uitvoeren ervan in Raspbian Buster 10.6 OS.

Raspberry PI 4B+ IoT Boards-overzicht

De volgende generatie innovatieve Raspberry Pi 4B+ IoT-kaarten, gebaseerd op de krachtige ARM's multi-core symmetrische 64-bit RISC-V CPU's, biedt zelf ontketende prestaties en daarmee de ultieme productiviteit van parallel computergebruik. Het gebruik van de nieuwste Raspberry Pi-kaarten maakt het mogelijk om de werkelijke prestatiesnelheid van de computationele processen, aan de rand, drastisch te verbeteren, zoals het verzamelen en voorverwerken van gegevens in realtime, voordat deze aan een datacenter worden geleverd voor verwerking, op exa -schaal. Door deze processen parallel te laten verlopen, wordt de efficiëntie van die cloudgebaseerde oplossingen aanzienlijk vergroot, doordat ze miljarden verzoeken van klanten kunnen verwerken of gegevensanalyse en andere conclusies kunnen trekken.

Voordat we onze discussie gaan baseren op het bouwen en uitvoeren van een parallelle code in C++17, ontworpen met behulp van CL/SYCL heterogene programmeermodelspecificatie voor de Raspberry Pi-kaarten met Arm/Aarch64-architectuur, laten we even stilstaan ​​en een korte blik op de volgende generatie Raspberry Pi 4B+ boards en de technische specificaties:

De Raspberry Pi 4B+ IoT-kaarten zijn vervaardigd op basis van de innovatieve Broadcom BCM2711B0 (SoC)-chips, uitgerust met de nieuwste ARM Quad-Core Cortex-A72 @ 1,5 GHz 64-bit RISC-V CPU's, die ultieme prestaties en schaalbaarheid bieden, terwijl het voor parallel computergebruik, aan de rand.

De Raspberry Pi staat bekend om de "betrouwbare" en "snelle" kleine nanocomputers, ontworpen voor datamining en parallel computing. Voornamelijk nieuwe hardware-architectuurkenmerken van de multi-core symmetrische 64-bit RISC-V CPU's van de ARM, zoals DSP, SIMD, VFPv4 en hardwarevirtualisatie-ondersteuning, kunnen de prestaties, versnellingssnelheid en schaalbaarheid aanzienlijk verbeteren de IoT-clusters, die massaal data verwerken, aan de rand.

Een van de belangrijkste voordelen van de nieuwste Raspberry Pi 4B+-kaarten is met name het onopvallende LPDDR4-geheugen met 2, 4 of 8 GiB RAM-capaciteit naar keuze, werkend op 3200 Mhz en een typisch grote bandbreedte voor geheugentransacties, wat een positieve invloed heeft op de prestaties parallel computergebruik in het algemeen. De boards met 4 GiB RAM geïnstalleerd en hoger worden sterk aanbevolen voor datamining en parallel computing. Ook worden de BCM2711B0 SoC-chips gebundeld met verschillende geïntegreerde apparaten en randapparatuur, zoals Broadcom VideoCore VI @ 500Mhz GPU's, PCI-Ex Gigabit Ethernet-adapters, enz.

Voor het bouwen en uitvoeren van een specifieke parallelle moderne code in C++17, geïmplementeerd met behulp van het CL/SYCL heterogene programmeermodel, is de eerste die we echt nodig hebben een Raspberry Pi 4B+ IoT-board met het nieuwste Raspbian Buster 10.6 OS geïnstalleerd en geconfigureerd voor het eerste gebruik.

Hier is een korte checklist van de hardware- en softwarevereisten waaraan vooraf moet zijn voldaan:

Hardware:

  • Raspberry Pi 4 Model B0, 4GB IoT-bord;
  • Micro-SD-kaart 16 GB voor Raspbian OS en gegevensopslag;
  • DC-voeding:5,0 V/2-3 A via USB Type-C-connector (minimaal 3 A – voor datamining en parallel computergebruik);

Software:

  • Raspbian Buster 10.6.0 Volledig besturingssysteem;
  • Raspbian Imager 1.4;
  • MobaXterm 20.3 build 4396, of een andere SSH-client;

Omdat we een Raspberry Pi 4B+ IoT-bord hebben, kunnen we het nu direct aanzetten en instellen.

Een Raspberry Pi 4B IoT-bord opzetten

Voordat we beginnen, moeten we de nieuwste release van de Raspbian Buster 10.6.0 Full OS-image downloaden van de officiële Raspberry Pi-repository. Om de Raspbian OS-image op de SD-kaart te installeren, moeten we ook de Raspbian Imager 1.4-applicatie downloaden en gebruiken, beschikbaar voor verschillende platforms, zoals Windows, Linux of macOS:

  • Raspbian Buster 10.6.0
  • Raspbian Imager 1.4

Daarnaast moeten we ook de MobaXterm-applicatie downloaden en installeren om op afstand een verbinding met het Raspberry Pi-bord tot stand te brengen via de SSH- of FTP-protocollen:

  • MobaXterm 20.3

Aangezien het Raspbian Buster OS en de Imager-applicatie met succes zijn gedownload en geïnstalleerd, zullen we de Imager-applicatie gebruiken om het volgende te doen:

1. Wis de SD-kaart en formatteer deze standaard naar het FAT32-bestandssysteem;

2. Pak de vooraf geïnstalleerde Raspbian Buster OS-image (*.img) uit naar de SD-kaart;

Aangezien de bovenstaande stappen met succes zijn voltooid, hoeft u alleen maar de SD-kaart uit de kaartlezer te verwijderen en deze in de SD-kaartsleuf van het Raspberry Pi-bord te steken. Sluit vervolgens de micro-HDMI- en Ethernet-kabels aan. Sluit ten slotte de connector van de gelijkstroomvoedingskabel aan en zet het bord aan. Ten slotte start het systeem op met het Raspbian Buster-besturingssysteem, geïnstalleerd op de SD-kaart, en wordt gevraagd om verschillende stappen na de installatie uit te voeren om het te configureren voor het eerste gebruik.

Zorg ervoor dat alle volgende stappen na de installatie zijn voltooid, aangezien het bord is ingeschakeld:

1. Open de bash-console en stel het 'root'-wachtwoord in:

[email protected]:~ $ sudo passwd root 

2. Log in op de Raspbian bash-console met 'root'-rechten:

[email protected]:~ $ sudo -s 

3. Upgrade het Linux-basissysteem en de firmware van de Raspbian met behulp van de volgende opdrachten:

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

4. Start het systeem voor de eerste keer opnieuw op:

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

5. Installeer de nieuwste Raspbian-bootloader en start het systeem opnieuw op:

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

6. Start de 'raspi-config' setup tool:

[email protected]:~# sudo raspi-config 

7. Voer de volgende stappen uit met behulp van de ‘raspi-config’ tool:

* Werk de tool 'raspi-config' bij:

* Schakel de desktop-GUI van de Raspbian uit tijdens het opstarten:

Systeemopties>> Opstarten / automatisch inloggen>> Automatisch inloggen op console:

* Vergroot de root '/' partitiegrootte op de SD-kaart:

Na het uitvoeren van de Raspbian-configuratie na de installatie, start u eindelijk het systeem opnieuw op. Na het opnieuw opstarten wordt u gevraagd om in te loggen. Gebruik de 'root' gebruikersnaam en het wachtwoord, eerder ingesteld, om in te loggen op de bash-console met root-rechten.

Aangezien u succesvol bent ingelogd, installeert u het aantal pakketten van APT-repositories met behulp van de volgende opdracht in bash-console:

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

Deze twee pakketten zijn vereist voor het configureren van de Raspberry Pi's netwerkinterface of de OpenSSH-server voor verbinding met het bord, op afstand, via het SSH-protocol, met behulp van MobaXterm.

Configureer de netwerkinterface van het bord 'eth0' door de /etc/network/interfaces te wijzigen, bijvoorbeeld:

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 

Voer naast de netwerkinterface een basisconfiguratie van de OpenSSH-server uit door deze regels in de /etc/ssh/sshd_config :

PermitRootLogin yesStrictModes neePasswordAuthentication yesPermitEmptyPasswords ja 

Dit zal de 'root' login inschakelen, in de bash-console, via het SSH-protocol, zonder een wachtwoord in te voeren.

Probeer ten slotte om het bord via het netwerk te verbinden, met behulp van de MobaXterm-toepassing en open de externe SSH-sessie naar de host met IP-adres:192.168.87.100. Je moet ook in staat zijn om met succes in te loggen op de bash-console van de Raspbian, met de inloggegevens die eerder zijn ingesteld:

Een parallelle code ontwikkelen in C++17 met behulp van CL/SYCL-Model

In 2020 hebben Khronos Group, Intel Corp. en andere leveranciers het revolutionaire nieuwe heterogene parallelle computerplatform (XPU) aangekondigd, dat de mogelijkheid biedt om een ​​uitvoering van "zware" gegevensverwerkingsworkloads over te hevelen naar een wijdverbreide hardwareversnelling (bijv. GPGPU of FPGA's) doelen, behalve de host-CPU's, alleen. Conceptueel is de ontwikkeling van parallelle code, met gebruikmaking van het XPU-platform, volledig gebaseerd op de specificatie van het Khronos CL/SYCL-programmeermodel, een abstractielaag van de OpenCL 2.0-bibliotheek.

Hier is een klein voorbeeld, ter illustratie van de code in C++17, geïmplementeerd met behulp van de CL/SYCL-model abstractielaag:

#include 
met 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) { // Doe wat parallel werk });});q.wait(); 

Het hierboven getoonde codefragment in C++17 wordt opgeleverd, geheel gebaseerd op het gebruik van het CL/SYCL-programmeermodel. Het maakt een cl::sycl::queue{}-object aan met de standaard lijst met parameterinitialisaties, voor het indienen van SYCL-kernels, voor een uitvoering, naar het versnellingsdoel van de host-CPU's, dat standaard wordt gebruikt. Vervolgens roept het de methode cl::sycl::submit(...) aan, met een enkel argument van het object cl::sycl::handler{}, voor toegang tot methoden die een basiskernelfunctionaliteit bieden, gebaseerd op verschillende parallelle algoritmen, inclusief de cl::sycl::handler::parallel_for(…) methode.

De volgende methode wordt gebruikt voor het implementeren van een strakke parallelle lus, voortgebracht vanuit een draaiende kernel. Elke iteratie van deze lus wordt parallel uitgevoerd, door zijn eigen draad. De cl::sycl::handler::parallel_for(...) accepteert twee hoofdargumenten van het cl::sycl::range<>{} object en een specifieke lamda-functie, aangeroepen, tijdens elke lusiteratie. Het cl::sycl::range<>{}-object definieert in feite een aantal parallelle lusiteraties, die worden uitgevoerd, voor elke specifieke dimensie, in het geval dat meerdere geneste lussen worden samengevouwen, terwijl multidimensionale gegevens worden verwerkt.

In de bovenstaande code wordt het object cl::sycl::range<1>(N) gebruikt voor het plannen van N-iteraties van de parallelle lus, in een enkele dimensie. De lambda-functie van de parallel_for(...) methode accepteert een enkel argument van een ander cl::sycl::id<>{} object. Naast de cl::sycl::range<>{}, implementeert dit object een vectorcontainer, waarvan elk element een indexwaarde is voor respectievelijk elke dimensie en elke iteratie van de parallelle lus. Doorgegeven als een argument aan een code in het bereik van de lamda-functie, wordt het volgende object gebruikt voor het ophalen van de specifieke indexwaarden. De body van de lamda-functie bevat een code die parallel een deel van de gegevensverwerking uitvoert.

Nadat een specifieke kernel in de wachtrij is geplaatst en is voortgebracht voor uitvoering, roept de volgende code de methode cl::sycl::wait() aan zonder argumenten om een ​​barrièresynchronisatie in te stellen, zodat er tot nu toe geen code wordt uitgevoerd , totdat de kernel die wordt voortgebracht zijn parallelle werk heeft voltooid.

Het heterogene programmeermodel CL/SYCL is zeer efficiënt en kan voor een groot aantal toepassingen worden gebruikt.

Intel Corp. en CodePlay Software Inc hebben echter binnenkort de ondersteuning van CL/SYCL voor andere hardware-architecturen dan de x86_64 afgeschaft. Dit maakte het onmogelijk om een ​​parallelle C++-code te leveren, gebruikmakend van de specifieke CL/SYCL-bibliotheken, gericht op Arm/Aarch64 en andere architecturen.

Momenteel zijn er een aantal CL/SYCL open-source bibliotheekprojecten, ontwikkeld door een groot aantal ontwikkelaars en enthousiastelingen, die ondersteuning bieden voor meer hardware-architecturen, in plaats van alleen de x86_64.

Sinds 2016 brengt Khronos Group, Inc. de revisies uit van hun triSYCL-bibliotheek-open-sourceproject (https://github.com/triSYCL/triSYCL), aanbevolen voor gebruik als testbed tijdens het evalueren van de nieuwste CL/SYCL-programmeermodellaag specificatie en het sturen van feedback naar Khronos- en ISO-commissies. De volgende bibliotheekdistributie is echter niet "stabiel" en kan alleen worden gebruikt voor demonstratiedoeleinden en niet voor het bouwen van een CL/SYCL-code in productie. Ook ondersteunt de Khronos triSYCL-bibliotheekdistributie volledig de platformonafhankelijke compilatie, op een x86_64 ontwikkelingsmachine, met behulp van de Arm/Aarch64 platformonafhankelijke toolchain van GNU, in plaats van een code te bouwen, "native", met LLVM/Clang-compilers, op Raspberry Pi.

In 2019 implementeerde Aksel Alpay, aan de Universiteit van Heidelberg (Duitsland), de nieuwste specificatiebibliotheek voor CL/SYCL-programmeermodellagen, gericht op verschillende hardware-architecturen, waaronder de Arm/Aarch64-architecturen van de Raspberry Pi, en droeg bij aan de meest "stabiele" release van de hipSYCL open-source bibliotheekdistributie naar GitHub (https://github.com/illuhad/hipSYCL).

Verder zullen we in dit verhaal praten over het installeren en configureren van GNU's platformonafhankelijke GCC/G++-10.xx en "native" Arm/Aarch64's LLVM/Clang-9.xx toolchains, en het gebruik van de triSYCL en hipSYCL bibliotheekdistributies, voor het leveren van een moderne parallelle code in C++17, gebaseerd op het gebruik van de bibliotheken die worden besproken.

Bron:Parallel Computing op Raspberry Pi 4B+ IoT Boards gemakkelijk gemaakt


Productieproces

  1. Eenvoudige temperatuur en vochtigheid op Raspberry Pi
  2. IoT 101-project:stream de temperatuur van je Raspberry Pi
  3. Java ME 8 + Raspberry Pi + Sensors =IoT World (deel 1)
  4. Eenvoudige doe-het-zelf huilende babydetector met Raspberry Pi
  5. Bouw je eerste IOT met een Raspberry Pi, DHT11-sensor en Thingspeak.
  6. Eenvoudige start in de wereld van IoT met MQTT
  7. Raspberry PI-gebaseerd IoT-project dat DHT11-sensor verbindt
  8. Windows 10 IoT Core op Raspberry Pi 2 – Adafruit-sensorgegevens
  9. Windows 10 IoT Core voor Raspberry Pi 3 Model B+
  10. BeagleBone en Raspberry Pi krijgen FPGA-add-ons
  11. DER:Bediening eenvoudig gemaakt