Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Computación en paralelo en placas Raspberry Pi 4B + IoT simplificada

Construyendo y ejecutando un código paralelo en C ++ 17, implementado usando la especificación del modelo Khronos CL / SYCL, en placas Raspberry Pi IoT.

Nuestras metas…

Este proyecto proporciona pautas útiles, consejos y tutoriales para construir un código paralelo moderno en C ++ 17/2 × 0, implementado usando el modelo de programación CL / SYCL, y ejecutándolo en la próxima generación de placas IoT Raspberry Pi 4B, basadas en las innovadoras CPU RISC-V de 64 bits y cuatro núcleos ARM Cortex-A72.

Una audiencia de lectores aprenderá cómo configurar una placa de IoT Raspberry 4B, lista para usar, y usarla para computación paralela, entregando un código paralelo en C ++ 17, con Khronos CL / triSYCL y Aksel Alpay. Las distribuciones de código abierto del proyecto hipSYCL, instalando y configurando la Colección de compiladores de GNU (GCC) y LLVM / Clang-9.xx Arm / Aarch64-toolchains, para construir los ejecutables del código paralelo y ejecutarlo en el sistema operativo Raspbian Buster 10.6.

Descripción general de las placas de IoT de Raspberry PI 4B +

La próxima generación de placas innovadoras Raspberry Pi 4B + IoT, basadas en las potentes CPU RISC-V simétricas de 64 bits y multinúcleo de ARM, proporciona un rendimiento sin límites y, por lo tanto, la máxima productividad de la computación paralela. El uso de las últimas placas Raspberry Pi permite mejorar drásticamente la velocidad del rendimiento real de los procesos computacionales, en el borde, como la recopilación y preprocesamiento de datos en tiempo real, antes de entregarlos a un centro de datos para su procesamiento, en exa -escala. La ejecución de estos procesos en paralelo aumenta significativamente la eficiencia de esas soluciones basadas en la nube, atendiendo miles de millones de solicitudes de clientes o proporcionando análisis de datos y otras inferencias.

Antes de basar nuestra discusión sobre la construcción y ejecución de un código paralelo en C ++ 17, diseñado utilizando la especificación del modelo de programación heterogénea CL / SYCL para las placas Raspberry Pi con arquitectura Arm / Aarch64, dediquemos un momento y tomemos un breve Eche un vistazo a la próxima generación de placas Raspberry Pi 4B + y sus especificaciones técnicas:

Las placas Raspberry Pi 4B + IoT se fabrican sobre la base de los innovadores chips Broadcom BCM2711B0 (SoC), equipados con las últimas CPU ARM Quad-Core Cortex-A72 @ 1.5GHz 64-bit RISC-V, que brindan un rendimiento y escalabilidad máximos, al mismo tiempo que aprovechan para la computación paralela, en el borde.

La Raspberry Pi es conocida por las nanocomputadoras de tamaño diminuto "fiables" y "rápidas", diseñadas para la minería de datos y la computación paralela. Principalmente, las nuevas características arquitectónicas de hardware de las CPU RISC-V simétricas de 64 bits de múltiples núcleos de ARM, como DSP, SIMD, VFPv4 y soporte de virtualización de hardware, son capaces de brindar una mejora significativa al rendimiento, aceleración y escalabilidad de los clústeres de IoT, que procesan datos de forma masiva en el borde.

Específicamente, una de las ventajas más importantes de las últimas placas Raspberry Pi 4B + es la memoria LPDDR4 de bajo perfil con capacidad de RAM de 2, 4 u 8 GiB de su elección, que opera a 3200Mhz y proporciona un ancho de banda de transacciones de memoria típicamente grande, lo que afecta positivamente el rendimiento. de la computación paralela, en general. Las placas con 4 GiB de RAM instalados y más, se recomiendan encarecidamente para minería de datos y computación paralela. Además, los chips SoC BCM2711B0 se incluyen con varios dispositivos y periféricos integrados, como las GPU Broadcom VideoCore VI @ 500Mhz, los adaptadores PCI-Ex Gigabit Ethernet, etc.

Para construir y ejecutar un código moderno paralelo específico en C ++ 17, implementado utilizando el modelo de programación heterogéneo CL / SYCL, lo primero que realmente necesitamos es una placa Raspberry Pi 4B + IoT con el último sistema operativo Raspbian Buster 10.6 instalado y configurado para el primer uso.

Aquí hay una breve lista de verificación de los requisitos de hardware y software que deben cumplirse de antemano:

Hardware:

Software:

Dado que tenemos una placa de IoT Raspberry Pi 4B +, ahora podemos proceder a encenderla y configurarla de inmediato.

Configuración de una placa de IoT Raspberry Pi 4B

Antes de comenzar, debemos descargar la última versión de la imagen completa del sistema operativo Raspbian Buster 10.6.0 del repositorio oficial de Raspberry Pi. Para instalar la imagen del sistema operativo Raspbian en la tarjeta SD, también necesitaremos descargar y usar la aplicación Raspbian Imager 1.4, disponible para varias plataformas, como Windows, Linux o macOS:

Además, también debemos descargar e instalar la aplicación MobaXterm para establecer una conexión a la placa Raspberry Pi, de forma remota, a través de los protocolos SSH o FTP:

Dado que el sistema operativo Raspbian Buster y la aplicación Imager se han descargado e instalado con éxito, usaremos la aplicación Imager para hacer lo siguiente:

1. Borre la tarjeta SD, formateándola al sistema de archivos FAT32, por defecto;

2. Extraiga la imagen del sistema operativo Raspbian Buster preinstalada (* .img) en la tarjeta SD;

Dado que los pasos anteriores se completaron con éxito, simplemente retire la tarjeta SD del lector de tarjetas y conéctela a la ranura para tarjetas SD de la placa Raspberry Pi. Luego, conecte los cables micro-HDMI y Ethernet. Por último, conecte el conector del cable de alimentación de CC y encienda la placa. Finalmente, el sistema se iniciará con el sistema operativo Raspbian Buster, instalado en la tarjeta SD, y se le pedirá que realice varios pasos posteriores a la instalación para configurarlo para el primer uso.

Dado que la placa se ha encendido, asegúrese de que se hayan completado todos los siguientes pasos posteriores a la instalación:

1. Abra la consola bash y establezca la contraseña "root":

  [correo electrónico protegido]:~ $ sudo passwd root  

2. Inicie sesión en la consola bash de Raspbian con privilegios de "root":

  [correo electrónico protegido]:~ $ sudo -s  

3. Actualice el firmware y el sistema base Linux de Raspbian con los siguientes comandos:

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

4. Reinicie el sistema por primera vez:

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

5. Instale el cargador de arranque de Raspbian más reciente y reinicie el sistema, una vez más:

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

6. Inicie la herramienta de configuración "raspi-config":

  [correo electrónico protegido]:~ # sudo raspi-config  

7. Complete los siguientes pasos con la herramienta "raspi-config":

* Actualice la herramienta "raspi-config":

* Deshabilite la GUI de escritorio de Raspbian al arrancar:

Opciones del sistema >> Inicio / Inicio de sesión automático >> Inicio de sesión automático en consola:

* Expanda el tamaño de la partición raíz "/" en la tarjeta SD:

Después de realizar la configuración posterior a la instalación de Raspbian, finalmente reinicie el sistema. Después de reiniciar, se le pedirá que inicie sesión. Utilice el nombre de usuario "root" y la contraseña, previamente configurada, para iniciar sesión en la consola bash con privilegios de root.

Dado que ha iniciado sesión correctamente, instale la cantidad de paquetes de APT-repositories utilizando el siguiente comando, en bash-console:

  [correo electrónico protegido]:~ # sudo apt install -y net-tools openssh-server  

Estos dos paquetes son necesarios para configurar la interfaz de red de Raspberry Pi o el servidor OpenSSH para conectarse a la placa, de forma remota, a través del protocolo SSH, utilizando MobaXterm.

Configure la interfaz de red de la placa "eth0" modificando / etc / network / interfaces, por ejemplo:

  auto eth0iface eth0 inet staticaddress 192.168.87.100netmask 255.255.255.0 retransmisión 192.168.87.255gateway 192.168.87.254 nameserver 192.168.87.254  

Junto a la interfaz de red, realice una configuración básica del servidor OpenSSH, descomentando estas líneas en / etc / ssh / sshd_config :

  PermitRootLogin yesStrictModes noPasswordAuthentication yesPermitEmptyPasswords sí  

Esto habilitará el inicio de sesión "root", en la consola bash, a través del protocolo SSH, sin ingresar una contraseña.

Finalmente, intente conectar la placa a través de la red, usando la aplicación MobaXterm y abriendo la sesión SSH remota al host con la dirección IP:192.168.87.100. También debe poder iniciar sesión con éxito en la consola bash de Raspbian, con las credenciales, previamente configuradas:

Desarrollo de un código paralelo en C ++ 17 usando CL / SYCL-Model

En 2020, Khronos Group, Intel Corp. y otros proveedores, anunciaron la nueva y revolucionaria plataforma de cómputo paralelo heterogénea (XPU), que brinda la capacidad de descargar una ejecución de cargas de trabajo de procesamiento de datos "pesadas" a una amplia gama de aceleración de hardware (por ejemplo, GPGPU o FPGA) objetivos, distintos de las CPU host, únicamente. Conceptualmente, el desarrollo de código paralelo, utilizando la plataforma XPU, se basa completamente en la especificación del modelo de programación Khronos CL / SYCL, una capa de abstracción de la biblioteca OpenCL 2.0.

Aquí hay un pequeño ejemplo, que ilustra el código en C ++ 17, implementado usando la capa de abstracción del modelo CL / SYCL:

  #include 
 usando el espacio de nombres 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) {// Trabajar en paralelo});}); q.wait ();  

El fragmento de código en C ++ 17, que se muestra arriba, se entrega, completamente basado en el uso del modelo de programación CL / SYCL. Crea una instancia de un objeto cl ::sycl ::queue {} con la lista de inicializadores de parámetros predeterminados, para enviar SYCL-kernels, para una ejecución, al destino de aceleración de la CPU del host, utilizado por defecto. A continuación, invoca el método cl ::sycl ::submit (…), que tiene un único argumento del objeto cl ::sycl ::handler {}, para acceder a los métodos, que proporcionan una funcionalidad básica del kernel, basada en varios de algoritmos paralelos, incluido el método cl ::sycl ::handler ::paralelo_for (…).

El siguiente método se utiliza para implementar un ciclo paralelo estrecho, generado desde dentro de un kernel en ejecución. Cada iteración de este ciclo se ejecuta en paralelo, por su propio hilo. El cl ::sycl ::handler ::paralelo_for (…) acepta dos argumentos principales del objeto cl ::sycl ::range <> {} y una función lamda específica, invocada, durante cada iteración del ciclo. El objeto cl ::sycl ::range <> {} básicamente define una cantidad de iteraciones de bucle paralelo, que se ejecutan, para cada dimensión específica, en caso de que se colapsen múltiples bucles anidados, mientras se procesan datos multidimensionales.

En el código, desde arriba, el objeto cl ::sycl ::range <1> (N) se usa para programar N-iteraciones del ciclo paralelo, en una sola dimensión. La función lambda del método paralelo_for (…) acepta un solo argumento de otro objeto cl ::sycl ::id <> {}. Además de cl ::sycl ::range <> {}, este objeto implementa un contenedor de vector, cada elemento, del cual, es un valor de índice para cada dimensión y cada iteración del ciclo paralelo, respectivamente. Pasado como argumento a un código en el alcance de la función lamda, el siguiente objeto se usa para recuperar los valores de índice específicos. El cuerpo de la función lamda contiene un código que realiza parte del procesamiento de datos, en paralelo.

Después de que un kernel específico ha sido enviado a la cola y generado para una ejecución, el siguiente código invoca el método cl ::sycl ::wait () sin argumentos para establecer una sincronización de barrera, asegurando que no se ejecutará ningún código, hasta ahora , hasta que el kernel que se está generando haya completado su trabajo paralelo.

El modelo de programación heterogéneo CL / SYCL es altamente eficiente y se puede utilizar para una amplia variedad de aplicaciones.

Sin embargo, Intel Corp. y CodePlay Software Inc, pronto, dejarán de admitir CL / SYCL para arquitecturas de hardware, distintas de x86_64. Esto hizo imposible entregar un código C ++ paralelo, utilizando las bibliotecas CL / SYCL específicas, dirigidas a Arm / Aarch64 y otras arquitecturas.

Actualmente, hay una serie de proyectos de biblioteca de código abierto CL / SYCL, desarrollados por una gran cantidad de desarrolladores y entusiastas, que brindan soporte para más arquitecturas de hardware, en lugar de x86_64, solo.

Desde 2016, Khronos Group, Inc. publica las revisiones de su proyecto de código abierto de la biblioteca triSYCL (https://github.com/triSYCL/triSYCL), recomendado para usarlo como banco de pruebas al evaluar la última capa del modelo de programación CL / SYCL especificación y envío de comentarios a los comités de Khronos e ISO. Sin embargo, la siguiente distribución de la biblioteca no es "estable" y se puede utilizar únicamente con fines de demostración, y no para crear un código CL / SYCL, en producción. Además, la distribución de la biblioteca Khronos triSYCL es totalmente compatible con la compilación multiplataforma, en una máquina de desarrollo x86_64, utilizando la cadena de herramientas multiplataforma Arm / Aarch64 de GNU, en lugar de crear un código, "de forma nativa", con compiladores LLVM / Clang, en Raspberry. Pi.

En 2019, Aksel Alpay, en la Universidad de Heidelberg (Alemania), implementó la última biblioteca de especificación de capa del modelo de programación CL / SYCL, dirigida a varias arquitecturas de hardware, incluidas las arquitecturas Arm / Aarch64 de Raspberry Pi, y contribuyó con la versión más "estable". de la distribución de la biblioteca de código abierto hipSYCL a GitHub (https://github.com/illuhad/hipSYCL).

Además, en esta historia, analizaremos la instalación y configuración de las cadenas de herramientas GCC / G ++ - 10.xx multiplataforma de GNU y las cadenas de herramientas LLVM / Clang-9.xx "nativas" de Arm / Aarch64, y el uso de las distribuciones de bibliotecas triSYCL y hipSYCL, para entregar un código paralelo moderno en C ++ 17, basado en el uso de las bibliotecas, que se está discutiendo.

Fuente:Computación en paralelo en placas de IoT Raspberry Pi 4B + simplificada


Proceso de manufactura

  1. Temperatura y humedad sencillas en Raspberry Pi
  2. Proyecto IoT 101:Temperatura de transmisión desde su Raspberry Pi
  3. Sensores Java ME 8 + Raspberry Pi + =Mundo IoT (Parte 1)
  4. Fácil detector de llanto para bebés con Raspberry Pi
  5. Cree su primer IOT con una Raspberry Pi, un sensor DHT11 y Thingspeak.
  6. Inicio fácil en el mundo de IoT con MQTT
  7. Proyecto de IoT basado en Raspberry PI que conecta el sensor DHT11
  8. Windows 10 IoT Core en Raspberry Pi 2 - Datos del sensor Adafruit
  9. Windows 10 IoT Core para Raspberry Pi 3 Modelo B +
  10. BeagleBone y Raspberry Pi obtienen complementos FPGA
  11. DER:Control simplificado