El paralelismo masivo acelerado de C++ ( C++ AMP para abreviar ) es una biblioteca basada en DirectX 11 y una especificación abierta creada por Microsoft para implementar programas paralelos para sistemas híbridos en C++. El sistema C++AMP le permite transferir cálculos a GPU (aceleradores de video) sin realizar una gran cantidad de cambios en los programas. El código que no puede ejecutarse en la GPU, por ejemplo debido a su complejidad, se ejecutará automáticamente en la CPU mediante instrucciones SIMD (SSE). La implementación del sistema de Microsoft (la única hasta ahora) está incluida en Visual Studio 2012 e incluye un depurador y un generador de perfiles. Microsoft u otros podrían implementar soporte para otras plataformas y hardware en el futuro.
La versión inicial de Microsoft de C++ AMP requiere Windows 7 o Windows Server 2008 R2. [una]
La construcción de sintaxis " restrict(amp)" se ha agregado al lenguaje, que se puede especificar para cualquier función (incluida una función lambda), lo que indica que se puede ejecutar en el acelerador C ++ AMP. La palabra clave restrict en este caso significa que el compilador debe evaluar si la función dada es adecuada para la GPU (si usa solo las funciones del lenguaje C ++ que se pueden ejecutar en la mayoría de las GPU).
Ejemplo de uso:
void myFunc () restringir ( amp ) { // código de función }Microsoft u otros futuros proveedores de sistemas compatibles con C++ AMP podrían agregar otros especificadores de restricción además de "amp".
El resto de C++ AMP está disponible a través de un archivo de encabezado <amp.h>y el espacio de nombres de "concurrencia". Clases principales de C++ AMP: matriz (contenedor de datos para el acelerador), array_view (contenedor de datos), índice (coordenadas de puntos en el espacio cartesiano N-dimensional con coordenadas enteras), extensión (dimensión entera N-dimensional), acelerador (unidad de computación, p. , GPU en la que se asignará la memoria y se iniciará el cálculo), accelerator_view (vista del acelerador).
También se define una función global parallel_for_eachque le permite definir un bucle paralelo para C++ AMP.
Ejemplo de función C++ usando C++ AMP para sumar dos matrices 2D:
void AddArrays ( int n , int m , int * pA , int * pB , int * pSum ) { concurrency :: array_view < int , 2 > a ( n , m , pA ), b ( n , m , pB ), sum ( n , m , pSum ); simultaneidad :: paralelo_para_cada uno ( suma . extensión , [ = ]( simultaneidad :: índice < 2 > i ) restringir ( amp ) { suma [ yo ] = un [ yo ] + segundo [ yo ]; }); }