El sistema de programación paralela Sieve C++ es un compilador y entorno de ejecución paralela de C++ diseñado y publicado por Codeplay , cuyo objetivo es simplificar la paralelización del código para que pueda ejecutarse de forma eficiente en sistemas multiprocesador o multinúcleo. Representa una alternativa a otros métodos de paralelización conocidos, como OpenMP , la plataforma de desarrollo RapidMind y Threading Building Blocks (TBB).
Introducción
Sieve es un compilador de C++ que toma una sección de código secuencial, anotada con marcadores Sieve, y la paraleliza automáticamente. El programador encapsula el código que desea paralelizar dentro de un ámbito léxico , etiquetado como 'sieve'. Dentro de este ámbito, comúnmente denominado 'bloque Sieve', se aplican ciertas reglas.:
- Todos los efectos secundarios dentro del bloque de tamiz se retrasan hasta el final del alcance.
- Se consideran efectos secundarios todas las modificaciones a los datos declarados fuera del ámbito del bloque de filtrado.
- Solo se pueden llamar a las funciones anotadas con sieve o immediate.
Retrasar los efectos secundarios elimina muchas pequeñas dependencias que normalmente impedirían la paralelización automática. El compilador puede reordenar de forma segura las lecturas y escrituras para permitir un mejor uso de varios mecanismos de movimiento de datos, como el acceso directo a memoria (DMA). Además, se puede simplificar el análisis de alias y el análisis de flujo de datos.De esta forma, el compilador puede dividir el código dentro del bloque de cribado con mucha más facilidad, para aprovechar el paralelismo.
Configuración de memoria
Esta separación de ámbitos también significa que el sistema Sieve se puede utilizar en arquitecturas de memoria no uniformes. Las CPU multinúcleo, como el microprocesador Cell utilizado en la PlayStation 3, son de este tipo, en el que los núcleos rápidos tienen memorias locales que deben utilizarse para explotar el rendimiento inherente del sistema. También es capaz de funcionar en sistemas de memoria compartida, como x86, lo que significa que puede ejecutarse en diversas arquitecturas. Los bloques Sieve también se pueden anidar.para sistemas con una jerarquía de diferentes memorias y elementos de procesamiento.
Paralelización y escalabilidad
El compilador sieve puede dividir el código dentro de un bloque sieve en fragmentos, ya sea implícitamente o explícitamente mediante una instrucción 'splithere'. Por ejemplo, el siguiente ejemplo muestra cómo paralelizar un bucle:
tamiz { para ( iterador i ( 0 ); i < longitud ; ++ i ) { R [ i ] = A [ i ] * B [ i ] dividir aquí ; } }El compilador añadirá implícitamente un punto de división encima del cuerpo del bucle for, como punto de entrada. Del mismo modo, se añadirá otro después como punto de salida.
En el sistema de tamiz, solo las variables locales del ámbito del bloque de tamiz pueden tener dependencias. Sin embargo, estas dependencias no deben cruzar los puntos de división; generarán advertencias del compilador . Para paralelizar este bucle, se puede usar una clase especial 'Iterator' en lugar de un contador de bucle entero estándar. Es seguro para la paralelización, y el programador puede crear nuevas clases Iterator a su antojo.Además de estas clases Iterator, el programador tiene la libertad de implementar clases llamadas 'Accumulators' que se utilizan para llevar a cabo operaciones de reducción.
La forma en que se implementan las clases Iterator ofrece diversas posibilidades de escalabilidad. El entorno de ejecución paralela Sieve emplea ejecución especulativa dinámica al ejecutarse en una plataforma de destino. Esto puede generar mejoras de velocidad muy significativas; sin embargo, ejecutarse en una máquina de un solo núcleo puede generar sobrecarga..
Determinismo
El determinismo es una característica inusual del sistema Sieve. Si la ejecución de un programa Sieve paralelo en una máquina multinúcleo produce un error, este no desaparecerá al ejecutarse en un solo núcleo para facilitar la depuración.Esto tiene la ventaja de eliminar las condiciones de carrera , uno de los errores más comunes en la programación concurrente . La eliminación de la necesidad de considerar estructuras de control de concurrencia dentro de un bloque sieve puede acelerar el tiempo de desarrollo y dar como resultado un código más seguro.
Sistemas compatibles
El sistema está diseñado para sistemas jerárquicos con núcleos de CPU homogéneos o heterogéneos que disponen de memorias locales, conectadas mediante motores DMA o modelos de transferencia de memoria similares.
Se ha demostrado que el tamizFunciona correctamente en sistemas x86 multinúcleo, la unidad de procesamiento físico Ageia PhysX y el microprocesador IBM Cell . Se genera código ANSI C si no hay un generador de código compilador disponible para una plataforma de destino específica. Esto permite la paralelización automática mediante los kits de herramientas de compilación de C existentes..
Véase también
Referencias
- Autoparalelización de programas Sieve en C++. Alastair Donaldson, Anton Lokhmotov, Colin Riley, Andrew Cook. En Actas del Taller Euro-Par sobre Procesamiento Altamente Paralelo en un Chip (HPPC'07), Rennes, Francia, agosto de 2007. Lecture Notes in Computer Science 4854, 2007.
- Los efectos secundarios retardados facilitan la programación multinúcleo. Anton Lokhmotov, Alan Mycroft, Andrew Richards. En Actas de la 13.ª Conferencia Internacional Euro-Par, Rennes, Francia, agosto de 2007. Lecture Notes in Computer Science 4641, 641-650, 2007.
- Implementación de concurrencia declarativa determinista mediante el método de tamices. S. Lindley. En las actas de DAMP 2007: Taller sobre aspectos declarativos de la programación multinúcleo. Niza, Francia, enero de 2007.
- El sistema de programación paralela Codeplay Sieve en C++. A. Richards. Libro blanco, 2006.
- Presentación del sistema Codeplay Sieve en C++ por Scott McKenzie, presentada en MicroGrid 2006 .
Enlaces externos
- Sitio web de Codeplay Sieve
- Lenguajes de programación concurrentes
- Interfaces de programación de aplicaciones
- Familia de lenguajes de programación C++