Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Le calcul parallèle sur les cartes IoT Raspberry Pi 4B+ en toute simplicité

Construire et exécuter un code parallèle en C++17, implémenté à l'aide de la spécification du modèle Khronos CL/SYCL, sur les cartes IoT Raspberry Pi.

Nos objectifs…

Ce projet fournit des directives, des conseils et des didacticiels utiles pour créer un code parallèle moderne en C++17/2×0, implémenté à l'aide du modèle de programmation CL/SYCL, et l'exécuter sur la prochaine génération de cartes IoT Raspberry Pi 4B, basées sur les processeurs innovants ARM Cortex-A72, Quad-core, 64 bits RISC-V.

Un public de lecteurs découvrira comment configurer une carte IoT Raspberry 4B, prête à l'emploi, et l'utiliser pour le calcul parallèle, en fournissant un code parallèle en C++17, avec Khronos CL/triSYCL et Aksel Alpay's Les distributions open source du projet hipSYCL, installant et configurant la collection de compilateurs GNU (GCC) et les chaînes d'outils LLVM/Clang-9.xx Arm/Aarch64, pour créer les exécutables du code parallèle et les exécuter dans le système d'exploitation Raspbian Buster 10.6.

Présentation des cartes IoT Raspberry PI 4B+

La prochaine génération de cartes IoT Raspberry Pi 4B+ innovantes, basée sur les puissants processeurs RISC-V symétriques multicœurs 64 bits d'ARM, offre des performances déchaînées et, par conséquent, la productivité ultime du calcul parallèle lui-même. L'utilisation des dernières cartes Raspberry Pi permet d'améliorer considérablement l'accélération des performances réelles des processus de calcul, à la périphérie, telles que la collecte et le prétraitement des données en temps réel, avant de les transmettre à un centre de données pour traitement, sur exa -échelle. L'exécution de ces processus en parallèle augmente considérablement l'efficacité de ces solutions basées sur le cloud, en répondant à des milliards de demandes de clients ou en fournissant des analyses de données et d'autres inférences.

Avant de fonder notre discussion sur la construction et l'exécution d'un code parallèle en C++17, conçu en utilisant la spécification de modèle de programmation hétérogène CL/SYCL pour les cartes Raspberry Pi avec l'architecture Arm/Aarch64, passons un moment et prenons un court coup d'œil sur la prochaine génération de cartes Raspberry Pi 4B+ et ses caractéristiques techniques :

Les cartes IoT Raspberry Pi 4B+ sont fabriquées sur la base des puces innovantes Broadcom BCM2711B0 (SoC), équipées des derniers processeurs ARM Quad-Core Cortex-A72 @ 1,5 GHz 64 bits RISC-V, offrant des performances et une évolutivité ultimes, tout en tirant parti pour le calcul parallèle, à la périphérie.

Le Raspberry Pi est connu pour ses nano-ordinateurs « fiables » et « rapides » de petite taille, conçus pour l'exploration de données et le calcul parallèle. Principalement les nouvelles fonctionnalités architecturales matérielles des processeurs RISC-V symétriques multicœurs 64 bits d'ARM, telles que DSP, SIMD, VFPv4 et la prise en charge de la virtualisation matérielle, sont capables d'apporter une amélioration significative aux performances, à l'accélération et à l'évolutivité de les clusters IoT, traitant massivement les données, à la périphérie.

Plus précisément, l'un des avantages les plus importants des dernières cartes Raspberry Pi 4B+ est la mémoire LPDDR4 à profil bas avec une capacité de RAM de 2, 4 ou 8 Gio au choix, fonctionnant à 3200Mhz et fournissant une bande passante de transactions mémoire généralement importante, affectant positivement les performances de l'informatique parallèle, en général. Les cartes avec 4 Gio de RAM installés, et plus, sont fortement recommandées pour l'exploration de données et le calcul parallèle. En outre, les puces SoC BCM2711B0 sont fournies avec divers appareils et périphériques intégrés, tels que les GPU Broadcom VideoCore VI @ 500Mhz, les adaptateurs Ethernet Gigabit PCI-Ex, etc.

Pour créer et exécuter un code moderne parallèle spécifique en C++17, implémenté à l'aide du modèle de programmation hétérogène CL/SYCL, le premier dont nous avons vraiment besoin est une carte IoT Raspberry Pi 4B+ avec le dernier système d'exploitation Raspbian Buster 10.6 installé et configuré pour la première utilisation.

Voici une brève liste de contrôle des exigences matérielles et logicielles, qui doivent avoir été remplies au préalable :

Matériel :

Logiciel :

Depuis que nous avons une carte IoT Raspberry Pi 4B+, nous pouvons maintenant procéder à son allumage et à sa configuration, prêts à l'emploi.

Configuration d'une carte IoT Raspberry Pi 4B

Avant de commencer, nous devons télécharger la dernière version de l'image complète du système d'exploitation Raspbian Buster 10.6.0 à partir du référentiel officiel Raspberry Pi. Pour installer l'image Raspbian OS sur la carte SD, nous devrons également télécharger et utiliser l'application Raspbian Imager 1.4, disponible pour diverses plates-formes, telles que Windows, Linux ou macOS :

De plus, nous devons également télécharger et installer l'application MobaXterm pour établir une connexion à la carte Raspberry Pi, à distance, via les protocoles SSH ou FTP :

Étant donné que le système d'exploitation Raspbian Buster et l'application Imager ont été téléchargés et installés avec succès, nous utiliserons l'application Imager pour effectuer les opérations suivantes :

1. Effacez la carte SD, en la formatant au système de fichiers FAT32, par défaut ;

2. Extrayez l'image pré-installée du système d'exploitation Raspbian Buster (*.img) sur la carte SD ;

Étant donné que les étapes ci-dessus ont été effectuées avec succès, retirez simplement la carte SD du lecteur de carte et branchez-la dans la fente pour carte SD de la carte Raspberry Pi. Ensuite, connectez les câbles micro-HDMI et Ethernet. Enfin, branchez le connecteur du câble d'alimentation CC et allumez la carte. Enfin, le système démarrera avec le système d'exploitation Raspbian Buster, installé sur la carte SD, invitant à effectuer plusieurs étapes de post-installation pour le configurer pour la première utilisation.

Depuis que la carte a été mise sous tension, assurez-vous que toutes les étapes de post-installation suivantes ont été effectuées :

1. Ouvrez la console bash et définissez le mot de passe « root » :

[email protected] :~ $ sudo passwd root 

2. Connectez-vous à la console bash Raspbian avec les privilèges « root » :

[email protected] :~ $ sudo -s 

3. Mettez à niveau le système de base Linux et le micrologiciel de Raspbian à l'aide des commandes suivantes :

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

4. Redémarrez le système pour la première fois :

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

5. Installez le dernier bootloader de Raspbian et redémarrez le système, une fois de plus :

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

6. Lancez l'outil de configuration 'raspi-config' :

[email protected] :~# sudo raspi-config 

7. Effectuez les étapes suivantes à l'aide de l'outil 'raspi-config' :

* Mettre à jour l'outil « raspi-config » :

* Désactivez l'interface graphique du bureau de Raspbian au démarrage :

Options système>> Démarrage/Connexion automatique>> Connexion automatique à la console :

* Augmentez la taille de la partition racine '/' sur la carte SD :

Après avoir effectué la configuration post-installation de Raspbian, redémarrez enfin le système. Après le redémarrage, vous serez invité à vous connecter. Utilisez le nom d'utilisateur « root » et le mot de passe, préalablement définis, pour vous connecter à la console bash avec les privilèges root.

Puisque vous vous êtes connecté avec succès, installez le nombre de packages à partir des référentiels APT en utilisant la commande suivante, dans bash-console :

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

Ces deux packages sont nécessaires pour configurer l'interface réseau du Raspberry Pi ou le serveur OpenSSH pour se connecter à la carte, à distance, via le protocole SSH, en utilisant MobaXterm.

Configurez l'interface réseau « eth0 » de la carte en modifiant le fichier /etc/network/interfaces, par exemple :

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 

À côté de l'interface réseau, effectuez une configuration de base du serveur OpenSSH, en décommentant ces lignes dans le /etc/ssh/sshd_config :

PermitRootLogin yesStrictModes noPasswordAuthentication yesPermitEmptyPasswords yes 

Cela permettra la connexion « root », dans la console bash, via le protocole SSH, sans entrer de mot de passe.

Enfin, essayez de connecter la carte sur le réseau, en utilisant l'application MobaXterm et en ouvrant la session SSH distante à l'hôte avec l'adresse IP :192.168.87.100. Vous devez également pouvoir vous connecter avec succès à la console bash de Raspbian, avec les informations d'identification, préalablement définies :

Développement d'un code parallèle en C++17 à l'aide du modèle CL/SYCL

En 2020, Khronos Group, Intel Corp. et d'autres fournisseurs ont annoncé la nouvelle plate-forme de calcul parallèle hétérogène (XPU) révolutionnaire, offrant la possibilité de décharger une exécution de charges de travail de traitement de données « lourdes » vers une accélération matérielle généralisée (par exemple, GPGPU ou FPGA) cibles, autres que les CPU hôtes, uniquement. Conceptuellement, le développement de code parallèle, utilisant la plate-forme XPU, est entièrement basé sur la spécification du modèle de programmation Khronos CL/SYCL, - une couche d'abstraction de la bibliothèque OpenCL 2.0.

Voici un petit exemple, illustrant le code en C++17, implémenté à l'aide de la couche d'abstraction du modèle CL/SYCL :

#include 
en utilisant l'espace de noms 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) { // Travaille en parallèle });});q.wait(); 

Le fragment de code en C++17, illustré ci-dessus, est livré, entièrement basé sur l'utilisation du modèle de programmation CL/SYCL. Il instancie un objet cl::sycl::queue{} avec la liste des initialiseurs de paramètres par défaut, pour soumettre les noyaux SYCL, pour une exécution, à la cible d'accélération des CPU hôtes, utilisée par défaut. Ensuite, il invoque la méthode cl::sycl::submit(…), ayant un seul argument de l'objet cl::sycl::handler{}, pour accéder aux méthodes, qui fournissent une fonctionnalité de base du noyau, basée sur divers des algorithmes parallèles, dont la méthode cl::sycl::handler::parallel_for(…).

La méthode suivante est utilisée pour implémenter une boucle parallèle étroite, générée à partir d'un noyau en cours d'exécution. Chaque itération de cette boucle est exécutée en parallèle, par son propre thread. Le cl::sycl::handler::parallel_for(…) accepte deux arguments principaux de l'objet cl::sycl::range<>{} et une fonction lamda spécifique, invoquée, lors de chaque itération de boucle. L'objet cl::sycl::range<>{} définit essentiellement une quantité d'itérations de boucles parallèles, exécutées, pour chaque dimension spécifique, au cas où plusieurs boucles imbriquées sont réduites, lors du traitement de données multidimensionnelles.

Dans le code ci-dessus, l'objet cl::sycl::range<1>(N) est utilisé pour planifier les N-itérations de la boucle parallèle, dans une seule dimension. La fonction lambda de la méthode parallel_for(…) accepte un seul argument d'un autre objet cl::sycl::id<>{}. En plus du cl::sycl::range<>{}, cet objet implémente un conteneur vectoriel, dont chaque élément est une valeur d'index pour chaque dimension et chaque itération de la boucle parallèle, respectivement. Passé comme argument à un code dans la portée de la fonction lamda, l'objet suivant est utilisé pour récupérer les valeurs d'index spécifiques. Le corps de la fonction lamda contient un code qui effectue une partie du traitement des données, en parallèle.

Une fois qu'un noyau spécifique a été soumis à la file d'attente et généré pour une exécution, le code suivant invoque la méthode cl::sycl::wait() sans arguments pour définir une synchronisation de barrière, garantissant qu'aucun code ne sera exécuté, jusqu'à présent , jusqu'à ce que le noyau généré ait terminé son travail parallèle.

Le modèle de programmation hétérogène CL/SYCL est très efficace et peut être utilisé pour un large éventail d'applications.

Cependant, Intel Corp. et CodePlay Software Inc ont bientôt abandonné la prise en charge de CL/SYCL pour les architectures matérielles, autres que x86_64. Cela rendait impossible la livraison d'un code C++ parallèle, utilisant les bibliothèques CL/SYCL spécifiques, ciblant Arm/Aarch64 et d'autres architectures.

À l'heure actuelle, il existe un certain nombre de projets de bibliothèque open source CL/SYCL, développés par un grand nombre de développeurs et de passionnés, prenant en charge davantage d'architectures matérielles, plutôt que le x86_64, uniquement.

Depuis 2016, Khronos Group, Inc. publie les révisions de son projet open source de bibliothèque triSYCL (https://github.com/triSYCL/triSYCL), recommandé pour l'utiliser comme banc d'essai tout en évaluant la dernière couche de modèle de programmation CL/SYCL spécification et l'envoi d'un retour d'information aux comités Khronos et ISO. Cependant, la distribution de bibliothèque suivante n'est pas « stable » et peut être utilisée uniquement à des fins de démonstration, et non pour créer un code CL/SYCL, en production. De plus, la distribution de la bibliothèque Khronos triSYCL prend entièrement en charge la compilation multiplateforme, sur une machine de développement x86_64, en utilisant la chaîne d'outils multiplateforme Arm/Aarch64 de GNU, plutôt que de construire un code, « nativement », avec les compilateurs LLVM/Clang, sur Raspberry Pi.

En 2019, Aksel Alpay, à l'Université de Heidelberg (Allemagne), a mis en œuvre la dernière bibliothèque de spécifications de couche de modèle de programmation CL/SYCL, ciblant diverses architectures matérielles, y compris les architectures Arm/Aarch64 de Raspberry Pi, et a contribué à la version la plus « stable » de la distribution de la bibliothèque open source hipSYCL sur GitHub (https://github.com/illuhad/hipSYCL).

De plus, dans cette histoire, nous discuterons de l'installation et de la configuration des chaînes d'outils multiplateformes GCC/G++-10.xx et « natives » Arm/Aarch64 LLVM/Clang-9.xx, et de l'utilisation des distributions des bibliothèques triSYCL et hipSYCL, pour fournir un code parallèle moderne en C++17, basé sur l'utilisation des bibliothèques, en cours de discussion.

Source :calcul parallèle sur les cartes IoT Raspberry Pi 4B+ en toute simplicité


Processus de fabrication

  1. Température et humidité faciles sur Raspberry Pi
  2. Projet IoT 101 :Diffuser la température de votre Raspberry Pi
  3. Java ME 8 + Raspberry Pi + Sensors =IoT World (Part 1)
  4. Détecteur de pleurs de bébé bricolage facile avec Raspberry Pi
  5. Créez votre premier IOT avec un Raspberry Pi, un capteur DHT11 et Thingspeak.
  6. Débutez facilement dans le monde de l'IoT avec MQTT
  7. Raspberry PI Based IoT Project Connecting DHT11 Sensor
  8. Windows 10 IoT Core sur Raspberry Pi 2 – Données du capteur Adafruit
  9. Windows 10 IoT Core pour Raspberry Pi 3 modèle B+