Una herramienta de paralelización automática es un programa informático que facilita la paralelización automática de código secuencial (de un solo hilo) existente, transformándolo en código paralelo ( multihilo o vectorizado). Su objetivo es facilitar la reutilización de software ya escrito, aprovechando las ventajas de rendimiento de la paralelización , lo que reduce la cantidad de software que se necesita reescribir y evita tener que reescribirlo por completo.
En el pasado, el hardware paralelo solo se implementaba en máquinas de gama alta o mediante computación distribuida , pero con la llegada de las unidades de procesamiento gráfico (GPU) y las unidades centrales de procesamiento (CPU) multinúcleo a los dispositivos de consumo, se ha generalizado también en ordenadores de gama baja. Por lo tanto, se ha vuelto deseable automatizar el proceso de conversión de aplicaciones antiguas de un solo hilo para aprovechar el hardware paralelo. Además, las herramientas de paralelización automática permiten centrarse en el desarrollo de aplicaciones de un solo hilo sin dejar de beneficiarse de la paralelización. Algunas consideraciones en la conversión incluyen el manejo de problemas como la sincronización y la prevención de interbloqueos , que no se presentan en la computación de un solo hilo.
Necesidad de paralelización automática
Los métodos anteriores proporcionaban soluciones para lenguajes como Fortran y C ; sin embargo, no eran suficientes. Estos métodos abordaban la paralelización de secciones para sistemas específicos, como bucles o secciones de código determinadas. Identificar oportunidades de paralelización es un paso crítico al generar aplicaciones multihilo. Esta necesidad de paralelizar aplicaciones se aborda parcialmente mediante herramientas que analizan el código para explotar el paralelismo. Estas herramientas utilizan métodos tanto en tiempo de compilación como en tiempo de ejecución . Estos métodos están integrados en algunos compiladores de paralelización, pero el usuario debe identificar el código paralelizado y marcarlo con construcciones de lenguaje especiales. El compilador identifica estas construcciones y analiza el código marcado para su paralelización. Algunas herramientas paralelizan solo formas especiales de código, como bucles. Por lo tanto, se necesita una herramienta completamente automática para convertir código secuencial en código paralelo. [ 1 ]
Procedimiento general de paralelización
1. El proceso comienza con la identificación de secciones de código con potencial para paralelismo. A menudo, esta tarea resulta difícil, ya que el programador que trabaja en la paralelización no fue quien la escribió originalmente o es nuevo en el dominio de la aplicación. Por lo tanto, aunque esta primera etapa del proceso de paralelización parezca sencilla, al principio puede que no lo sea.
2. La siguiente etapa consiste en preseleccionar las secciones de código identificadas que realmente se pueden paralelizar. Esta etapa es crucial y compleja, ya que implica un análisis exhaustivo, especialmente en códigos escritos en C y C++, donde intervienen punteros difíciles de analizar. Se requieren diversos métodos especializados, como el análisis de alias de punteros y el análisis de efectos secundarios de funciones, para determinar si una sección de código depende de otra. Cuantas más dependencias existan en las secciones de código identificadas, menores serán las posibilidades de paralelización.
3. En ocasiones, las dependencias se eliminan modificando el código, y esta es la siguiente etapa de la paralelización. El código se transforma de tal manera que la función, y por lo tanto el resultado, permanece inalterada, pero se elimina cualquier dependencia, si la hubiera, de otras secciones de código u otras instrucciones.
4. La última etapa de la paralelización consiste en generar el código paralelo. Este código siempre es funcionalmente similar al código secuencial original, pero incorpora construcciones o secciones de código que, al ejecutarse, crean múltiples hilos o procesos.
Método de paralelización automática
Véase también el artículo principal sobre paralelización automática .
Escanear
Esta es la primera etapa, donde el escáner lee los archivos fuente de entrada para identificar todos los usos estáticos y externos. Cada línea del archivo se compara con patrones predefinidos para separarla en tokens . Estos tokens se almacenarán en un archivo que posteriormente utilizará el motor de gramática. El motor de gramática verificará los patrones de tokens que coincidan con las reglas predefinidas para identificar variables, bucles, sentencias de control, funciones, etc., en el código.
Analizar
El analizador se utiliza para identificar secciones de código que pueden ejecutarse simultáneamente. El analizador utiliza la información de datos estáticos proporcionada por el analizador sintáctico. Primero, el analizador identifica todas las funciones independientes entre sí y las marca como tareas individuales. Luego, determina qué tareas tienen dependencias entre sí.
Cronograma
El planificador enumera todas las tareas y sus dependencias entre sí en cuanto a tiempos de ejecución e inicio. El planificador genera una planificación óptima en cuanto al número de procesadores a utilizar o el tiempo total de ejecución de la aplicación.
Generación de código
El planificador genera una lista de todas las tareas y los detalles de los núcleos en los que se ejecutarán, junto con el tiempo de ejecución. El generador de código insertará construcciones especiales que el planificador leerá durante la ejecución. Estas construcciones le indicarán al planificador en qué núcleo se ejecutará cada tarea, así como las horas de inicio y finalización.
Herramientas de paralelización
Existen numerosas herramientas de paralelización automática para Fortran, C, C++ y otros lenguajes.
YUCA
YUCCA es una herramienta de conversión automática de código secuencial a paralelo desarrollada por KPIT Technologies Ltd., Pune. Recibe como entrada código fuente en C , que puede contener varios archivos fuente y de cabecera. Genera como salida código paralelo multihilo transformado mediante funciones de POSIX Threads ( pthreads ) y construcciones de OpenMP . La herramienta YUCCA realiza la paralelización a nivel de tareas y bucles.
Par4All
Par4All es un compilador (entorno de trabajo) de paralelización y optimización automática para programas secuenciales en C y Fortran. Este compilador de código fuente a código fuente adapta las aplicaciones existentes a diversos entornos de hardware, como sistemas multinúcleo, supercomputadoras y GPU . Genera un nuevo código fuente, lo que permite que el código fuente original de la aplicación permanezca sin cambios.
Cetus
Cetus es una infraestructura de compilación para la transformación de código fuente a código fuente de programas de software escritos en C. Este proyecto es desarrollado por la Universidad de Purdue . Cetus está escrito en Java . Proporciona la infraestructura básica para escribir herramientas o compiladores de paralelización automática. Los métodos básicos de paralelización implementados son la privatización, el reconocimiento de variables de reducción y la sustitución de variables por inducción .
En febrero de 2013 se añadió una nueva interfaz gráfica de usuario (GUI) . En mayo de 2013 se incorporaron cálculos de aceleración y visualización de gráficos. También en mayo de 2013 se añadió un servidor remoto Cetus con modelo cliente-servidor , que permite a los usuarios transformar código C a través del servidor. Esto resulta muy útil cuando Cetus se ejecuta en una plataforma distinta a Linux . En mayo de 2013 se implementó una versión experimental de Cetus para Hubzero , que también permite ejecutar Cetus a través de un navegador web.
Plutón
Pluto (estilizado como PLUTO) es una herramienta de paralelización automática basada en el modelo poliédrico , que, para la optimización del compilador, es una representación de programas que facilita la realización de transformaciones de alto nivel, como la optimización de anidamiento de bucles y la paralelización de bucles. Pluto transforma programas C de código fuente a código fuente para lograr paralelismo de grano grueso y localidad de datos simultáneamente. El marco de transformación principal funciona principalmente mediante la búsqueda de transformaciones afines para la segmentación y fusión eficientes, pero no se limita a estas. El código paralelo OpenMP para multinúcleos se puede generar automáticamente a partir de secciones de programas C secuenciales.
estrella polar
El compilador Polaris toma como entrada un programa Fortran 77, lo transforma para que se ejecute eficientemente en una computadora paralela y genera esta versión del programa en uno de los varios dialectos Fortran paralelos posibles . Polaris realiza sus transformaciones en varias fases de compilación . Además de muchas fases comunes, Polaris incluye capacidades avanzadas que realizan las siguientes tareas: privatización de matrices, prueba de dependencia de datos , reconocimiento de variables de inducción , análisis procedimental Inter y análisis simbólico de programas .
Compilador Intel C++
La función de paralelización automática del compilador Intel C++ traduce automáticamente las partes secuenciales del programa de entrada a código multihilo semánticamente equivalente. La paralelización automática determina los bucles que son buenos candidatos para la compartición de tareas, realiza el análisis del flujo de datos para verificar la correcta ejecución paralela y particiona los datos para la generación de código multihilo, según sea necesario en la programación con directivas OpenMP . Las aplicaciones OpenMP y de paralelización automática proporcionan las ventajas de rendimiento que ofrece la memoria compartida en sistemas multiprocesador.
Asesor de Intel
Intel Advisor 2017 es una herramienta de optimización de vectorización y creación de prototipos de subprocesos. Integra varios pasos en su flujo de trabajo para buscar sitios paralelos, permitir a los usuarios marcar bucles para vectorización y subprocesos, verificar las dependencias de bucle y los patrones de acceso a la memoria para los bucles marcados, e insertar directivas pragma para vectorización y subprocesos.
AutoPar
AutoPar es una herramienta que inserta automáticamente directivas OpenMP en código C/C++ serial de entrada. Para programas con directivas OpenMP preexistentes, la herramienta verifica su corrección cuando se activa la opción correspondiente. A diferencia de las herramientas convencionales, AutoPar incorpora el conocimiento del usuario (semántica) para descubrir más oportunidades de paralelización.
iPat/OMP
Esta herramienta proporciona a los usuarios la asistencia necesaria para la paralelización OpenMP de un programa secuencial. Está implementada como un conjunto de funciones en el editor Emacs. Todas las actividades relacionadas con la paralelización del programa, como seleccionar una parte del programa, invocar un comando de asistencia y modificar el programa según la información de asistencia que muestra la herramienta, se pueden gestionar en el entorno del editor de código fuente. [ 2 ]
Compilador Fortran de Viena (VFC)
El compilador Vienna Fortran es un nuevo sistema de paralelización de código fuente a código fuente para High Performance Fortran (HPF+, una versión optimizada de HPF), que satisface las necesidades de las aplicaciones irregulares.
SUIF
SUIF ( Stanford University Intermediate Format) es una infraestructura gratuita diseñada para apoyar la investigación colaborativa en la optimización y paralelización de compiladores. SUIF es un compilador completamente funcional que acepta Fortran y C como lenguajes de entrada. El código paralelizado se genera como una versión paralela en C del programa , con formato SPMD (Single Program, Multiple Data ), que puede ser compilada por compiladores nativos de C en diversas arquitecturas. [ 3 ]
Compilador Omni OpenMP
El compilador Omni OpenMP traduce programas C y Fortran con directivas OpenMP a código C apto para compilar con un compilador nativo vinculado a la biblioteca de tiempo de ejecución Omni OpenMP. Realiza paralelización de bucles for.
Optimizador de arquitectos de temporización
El optimizador de Timing-Architects utiliza un enfoque basado en simulación para mejorar la asignación y paralelización de tareas en múltiples núcleos. Mediante un análisis de rendimiento y en tiempo real basado en simulación, se comparan diferentes alternativas de asignación de tareas. Se consideran las dependencias y los efectos específicos de la plataforma del procesador. El optimizador TA se utiliza en la ingeniería de sistemas embebidos.
TRACO
Utiliza el marco de trabajo Iteration Space Slicing y Free Schedule Framework. Su núcleo se basa en la aritmética de Presburger y la operación de cierre transitivo. Las dependencias de bucle se representan mediante relaciones. TRACO utiliza las bibliotecas Omega Calculator, CLOOG e ISL, y el analizador de dependencias Petit. El compilador optimiza la localidad con paralelismo de grano fino y grueso para aplicaciones C/C++. Esta herramienta ha sido desarrollada por el equipo de la Universidad Tecnológica de Pomerania Occidental (Bielecki, Palkowski, Klimek y otros autores) http://traco.sourceforge.net .
SecuenciaL
SequenceL es un lenguaje de programación funcional de propósito general y un conjunto de herramientas de paralelización automática, cuyos principales objetivos de diseño son el rendimiento en hardware con procesadores multinúcleo, la facilidad de programación, la portabilidad y optimización de la plataforma, y la claridad y legibilidad del código. Su principal ventaja es que permite escribir código sencillo que aprovecha automáticamente toda la potencia de procesamiento disponible, sin que los programadores tengan que identificar paralelismos, especificar la vectorización, evitar condiciones de carrera ni considerar otros desafíos de los métodos de programación manual basados en directivas, como OpenMP.
Los programas escritos en SequenceL se pueden compilar a código multihilo que se ejecuta en paralelo, sin necesidad de que el programador indique explícitamente cómo o qué paralelizar. Desde 2015, las versiones del compilador SequenceL generan código paralelo en C++ y OpenCL, lo que permite su compatibilidad con la mayoría de los lenguajes de programación más populares, como C, C++, C# , Fortran, Java y Python . Un entorno de ejecución específico de la plataforma gestiona los hilos de forma segura, proporcionando automáticamente un rendimiento paralelo en función del número de núcleos disponibles.
OMP2MPI
OMP2MPI [ 4 ] genera automáticamente código fuente MPI a partir de OpenMP . Esto permite que el programa aproveche arquitecturas sin memoria compartida, como clústeres o sistemas multiprocesador en chip (MPSoC) basados en red en chip (NoC). OMP2MPI ofrece una solución que permite una mayor optimización por parte de un experto que desee obtener mejores resultados.
OMP2HMPP
OMP2HMPP, [ 5 ] una herramienta que traduce automáticamente un código fuente C de alto nivel ( OpenMP ) a HMPP. La versión generada rara vez diferirá de una versión HMPP codificada manualmente, y proporcionará una importante aceleración, cercana al 113%, que podría mejorarse posteriormente mediante código CUDA codificado manualmente .
emmtrix Parallel Studio
emmtrix Parallel Studio es una herramienta de paralelización de código fuente a código fuente, combinada con una interfaz gráfica interactiva (GUI), desarrollada por emmtrix Technologies GmbH. Recibe como entrada código fuente en C, MATLAB , Simulink , Scilab o Xcos y genera código C paralelo como salida. Se basa en una planificación estática y una interfaz de programación de aplicaciones ( API ) de paso de mensajes para la ejecución del programa paralelo. Todo el proceso de paralelización se controla y visualiza en una GUI interactiva, lo que permite al usuario final tomar decisiones sobre la paralelización. Está diseñado para arquitecturas multinúcleo integradas, combinadas con aceleradores GPU y FPGA ( Field-Programmable Gate Array ).
Compilador CLAW
El compilador CLAW traduce programas Fortran con directivas claw a código Fortran adecuado para un objetivo de supercomputadora específico, complementado con directivas OpenMP u OpenACC.
PaSH
PaSH es un compilador de paralelización para scripts de shell de Unix . [ 6 ]
Véase también
Referencias
- ^ "Aumento del paralelismo en procesadores multinúcleo mediante paralelismo inducido", por Vinay G. Vaidya, PushpRaj Agrawal, Aditi Athavale, Anish Sane, Sudhakar Sah y Priti Ranadive
- ↑ “Desarrollo e implementación de una herramienta interactiva de asistencia para la paralelización en OpenMP: iPat/OMP” por Makoto Ishihara, Hiroki Honda y Mitsuhisa Sato
- ↑ "Una visión general del compilador SUIF para máquinas paralelas escalables", En Actas de la Séptima Conferencia SIAM sobre Procesamiento Paralelo para Computación Científica, 1993 por Saman P. Amarasinghe, Jennifer M. Anderson, Monica S. Lam, Chauwen Tseng
- ↑ Albert Saa-Garriga, David Castells-Rufas y Jordi Carrabina. 2015. OMP2MPI: Generación automática de código MPI a partir de programas OpenMP . En Sistemas Embebidos de Alto Rendimiento Energéticamente Eficientes. ACM.
- ↑ Albert Saa-Garriga, David Castells-Rufas y Jordi Carrabina. 2014. OMP2HMPP: Generación de código fuente HMPP a partir de programas con extensiones Pragma. En Sistemas embebidos de alto rendimiento y eficiencia energética. ACM.
- ↑ Zewe, Adam; Instituto Tecnológico de Massachusetts. "Esta técnica aumenta significativamente la velocidad de los programas que se ejecutan en el intérprete de comandos de Unix" . techxplore.com . Consultado el 8 de junio de 2022 .
Enlaces externos
- AutoPar
- compilador de Plutón
- par4all
- Cetus
- Traco
- OMP2MPI
- OMP2HMPP
- emmtrix Parallel Studio
- Computación paralela