OpenACC ( aceleradores abiertos ) es un estándar de programación para computación paralela desarrollado por Cray , CAPS, Nvidia y PGI . El estándar está diseñado para simplificar la programación paralela de sistemas de CPU / GPU heterogéneos . [1]
Al igual que en OpenMP , el programador puede anotar el código fuente de C , C++ y Fortran para identificar las áreas que se deben acelerar utilizando directivas del compilador y funciones adicionales. [2] Al igual que OpenMP 4.0 y versiones más recientes, OpenACC puede apuntar a las arquitecturas de CPU y GPU y lanzar código computacional en ellas.
Los miembros de OpenACC han trabajado como miembros del grupo de estándares OpenMP para fusionarse en la especificación OpenMP para crear una especificación común que extienda OpenMP para soportar aceleradores en una futura versión de OpenMP. [3] [4] Estos esfuerzos dieron como resultado un informe técnico [5] para comentarios y debate programado para incluir la Conferencia anual de supercomputación (noviembre de 2012, Salt Lake City ) y para abordar el soporte de aceleradores que no sean de Nvidia con aportes de proveedores de hardware que participan en OpenMP. [6]
En ISC'12 se demostró que OpenACC funciona en aceleradores Nvidia , AMD e Intel , sin datos de rendimiento. [7]
El 12 de noviembre de 2012, en la conferencia SC12, se presentó un borrador de la especificación de OpenACC versión 2.0. [8] Las nuevas capacidades sugeridas incluyen nuevos controles sobre el movimiento de datos (como un mejor manejo de datos no estructurados y mejoras en el soporte para memoria no contigua), y soporte para llamadas de función explícitas y compilación separada (permitiendo la creación y reutilización de bibliotecas de código acelerado). OpenACC 2.0 se lanzó oficialmente en junio de 2013. [9]
La versión 2.5 de la especificación se publicó en octubre de 2015, [10] mientras que la versión 2.6 se publicó en noviembre de 2017. [11] Posteriormente, la versión 2.7 se publicó en noviembre de 2018. [12]
La última versión es la 3.2, que se lanzó en noviembre de 2021. [13]
El soporte de OpenACC está disponible en compiladores comerciales de PGI (a partir de la versión 12.6) y (solo para hardware Cray) Cray. [7] [14]
OpenUH [15] es un compilador OpenACC de código abierto basado en Open64 que admite C y FORTRAN, desarrollado por el grupo HPCTools de la Universidad de Houston .
OpenARC [16] es un compilador de código abierto de C desarrollado en el Laboratorio Nacional de Oak Ridge para soportar todas las características de la especificación OpenACC 1.0. Un compilador experimental de código abierto, accULL, está siendo desarrollado por la Universidad de La Laguna ( solo lenguaje C ). [18]
Omni Compiler [19] [20] es un compilador de código abierto desarrollado en el Laboratorio HPCS. de la Universidad de Tsukuba y el Equipo de Investigación del Entorno de Programación del Centro RIKEN para la Ciencia Computacional, Japón, apoyaron OpenACC, XcalableMP y XcalableACC combinando XcalableMP y OpenACC.
IPMACC [21] es un compilador de C de código abierto desarrollado por la Universidad de Victoria que traduce OpenACC a CUDA, OpenCL e ISPC. Actualmente, solo se admiten las siguientes directivas: data , kernels , loop y cache .
El soporte de GCC para OpenACC tardó en llegar. [22] En septiembre de 2013, Samsung anunció una implementación orientada a GPU; esto tradujo el código anotado de OpenACC 1.1 a OpenCL . [17] El anuncio de una implementación "real" se produjo dos meses después, esta vez de NVIDIA y basada en OpenACC 2.0. [23] Esto desató cierta controversia, ya que la implementación solo apuntaría al lenguaje ensamblador PTX de NVIDIA , para el cual no había ningún ensamblador o entorno de ejecución de código abierto disponible. [24] [25] El soporte experimental para OpenACC/PTX terminó en GCC a partir de la versión 5.1. Las series de lanzamiento GCC6 y GCC7 incluyen una implementación muy mejorada de la especificación OpenACC 2.0a. [26] [27] GCC 9.1 ofrece un soporte casi completo para OpenACC 2.5. [28]
De manera similar a OpenMP 3.x en sistemas homogéneos o al anterior OpenHMPP , el modo principal de programación en OpenACC son las directivas. [29] Las especificaciones también incluyen una biblioteca de tiempo de ejecución que define varias funciones de soporte. Para aprovecharlas, el usuario debe incluir "openacc.h" en C o "openacc_lib.h" en Fortran; [30] y luego llamar a la función acc_init() .
OpenACC define una extensa lista de pragmas (directivas), [31] por ejemplo:
#pragma acc paralelo #pragma acc núcleos
Ambos se utilizan para definir núcleos de computación paralelos que se ejecutarán en el acelerador, utilizando semánticas distintas [32] [33]
#pragma datos de contabilidad
Es la directiva principal para definir y copiar datos hacia y desde el acelerador.
#bucle pragma acc
Se utiliza para definir el tipo de paralelismo en una parallel
región kernels
.
#pragma acc caché #pragma acc actualización #pragma acc declaración #pragma acc espera
También se definen algunas funciones APIacc_get_num_devices()
en tiempo de ejecución: , acc_set_device_type()
, acc_get_device_type()
, acc_set_device_num()
, acc_get_device_num()
, acc_async_test()
, acc_async_test_all()
, acc_async_wait()
, acc_async_wait_all()
, acc_init()
, acc_shutdown()
, acc_on_device()
, acc_malloc()
, acc_free()
.
OpenACC generalmente se encarga de la organización del trabajo para el dispositivo de destino, pero esto se puede anular mediante el uso de grupos y trabajadores. Un grupo consta de trabajadores y opera sobre una serie de elementos de procesamiento (como con un grupo de trabajo en OpenCL).
{{cite web}}
: CS1 maint: URL no apta ( enlace ){{cite mailing list}}
: Parámetro desconocido |agency=
ignorado ( ayuda )