OpenACC (para 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 heterogéneos de CPU / GPU . [1]
Lanzamiento estable | 2.7 / noviembre de 2018 |
---|---|
Escrito en | C , C ++ y Fortran |
Sistema operativo | Multiplataforma |
Plataforma | Multiplataforma |
Tipo | API |
Sitio web | www |
Al igual que en OpenMP , el programador puede anotar el código fuente de C , C ++ y Fortran para identificar las áreas que deben acelerarse utilizando directivas del compilador y funciones adicionales. [2] Al igual que OpenMP 4.0 y versiones posteriores, 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 estándar OpenMP para fusionarse con la especificación OpenMP y crear una especificación común que amplíe OpenMP para admitir aceleradores en una versión futura de OpenMP. [3] [4] Estos esfuerzos resultaron en un informe técnico [5] para comentarios y discusión programado para incluir la Conferencia anual de Supercomputación (noviembre de 2012, Salt Lake City ) y para abordar el soporte de aceleradores que no son de Nvidia con aportes de los 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 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 acelerado código). 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] La última versión de la especificación, la versión 2.7, se publicó en noviembre de 2018. [12]
Soporte del compilador
El soporte de OpenACC está disponible en compiladores comerciales de PGI (desde la versión 12.6) y (solo para hardware Cray) Cray. [7] [13]
OpenUH [14] es un compilador OpenACC de código abierto basado en Open64 compatible con C y FORTRAN, desarrollado por el grupo HPCTools de la Universidad de Houston .
OpenARC [15] es un compilador de C de código abierto desarrollado en Oak Ridge National Laboratory para soportar todas las características de la especificación OpenACC 1.0. Un compilador experimental [16] de código abierto, accULL, es desarrollado por la Universidad de La Laguna ( solo lenguaje C ). [17]
Omni Compiler [18] [19] es un compilador de código abierto desarrollado en HPCS Laboratory. de la Universidad de Tsukuba y el equipo de investigación del entorno de programación del Centro RIKEN de Ciencias Computacionales, Japón, apoyó OpenACC, XcalableMP
y XcalableACC combinando XcalableMP y OpenACC.IPMACC [20] es un compilador 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: datos , núcleos , bucle y caché .
El soporte de GCC para OpenACC tardó en llegar. [21] En septiembre de 2013 se anunció una implementación de orientación de GPU de Samsung; este código traducido de OpenACC 1.1 anotado a OpenCL . [16] El anuncio de una implementación "real" siguió dos meses después, esta vez de NVIDIA y basado en OpenACC 2.0. [22] Esto provocó cierta controversia, ya que la implementación solo se enfocaría en el lenguaje ensamblador PTX de NVIDIA , para el cual no había disponible ensamblador de código abierto o tiempo de ejecución. [23] [24] El soporte experimental para OpenACC / PTX terminó en GCC a partir de la versión 5.1. Las series de versiones GCC6 y GCC7 incluyen una implementación muy mejorada de la especificación OpenACC 2.0a. [25] [26] GCC 9.1 ofrece compatibilidad casi completa con OpenACC 2.5. [27]
Uso
De manera similar a OpenMP 3.x en un sistema homogéneo o al OpenHMPP anterior , el modo principal de programación en OpenACC son las directivas. [28] Las especificaciones también incluyen una biblioteca en tiempo de ejecución que define varias funciones de soporte. Para explotarlos, el usuario debe incluir "openacc.h" en C u "openacc_lib.h" en Fortran; [29] y luego llame a la función acc_init () .
Directivas
OpenACC define una lista extensa de pragmas (directivas), [30] por ejemplo:
# pragma acc paralelos # pragma acc kernels
Ambos se utilizan para definir núcleos de cálculo en paralelo que se ejecutarán en el acelerador, utilizando una semántica distinta [31] [32]
#pragma acc datos
Es la directiva principal para definir y copiar datos hacia y desde el acelerador.
#pragma acc loop
Se utiliza para definir el tipo de paralelismo en una región parallel
o kernels
.
#pragma acc cache #pragma acc update #pragma acc declare #pragma acc espera
API en tiempo de ejecución
Hay algunos de tiempo de ejecución de la API de funciones definidas también: acc_get_num_devices()
, 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, sin embargo, esto se puede anular mediante el uso de pandillas y trabajadores. Una pandilla consta de trabajadores y opera sobre una serie de elementos de procesamiento (como con un grupo de trabajo en OpenCL).
Ver también
- C ++ AMP
- OpenCL
- OpenHMPP
- OpenMP
- XcalableACC
- XcalableMP
Referencias
- ^ "Nvidia, Cray, PGI y CAPS lanzan el estándar de programación 'OpenACC' para computación paralela" . El indagador . 4 de noviembre de 2011.
- ^ "Versión estándar de OpenACC 2.5" (PDF) . OpenACC.org . Consultado el 2 de junio de 2017 .
- ^ "¿Cómo se relaciona la API de OpenACC con la API de OpenMP?" . OpenACC.org . Consultado el 14 de enero de 2014 .
- ^ "¿Cómo se originaron las especificaciones de OpenACC?" . OpenACC.org . Consultado el 14 de enero de 2014 .
- ^ "El consorcio OpenMP publica el primer informe técnico" . OpenMP.org . 5 de noviembre de 2012 . Consultado el 14 de enero de 2014 .
- ^ "OpenMP en SC12" . OpenMP.org . 29 de agosto de 2012 . Consultado el 14 de enero de 2014 .
- ^ a b "Informes del grupo OpenACC que amplían el soporte para el estándar de programación del acelerador" . HPCwire . 20 de junio de 2012. Archivado desde el original el 23 de junio de 2012 . Consultado el 14 de enero de 2014 .
- ^ "OpenACC versión 2.0 publicado para comentario" . OpenACC.org . 12 de noviembre de 2012 . Consultado el 14 de enero de 2014 .
- ^ "Especificaciones de OpenACC 2.0 | www.openacc.org" . www.openacc.org . Archivado desde el original el 4 de abril de 2016 . Consultado el 23 de marzo de 2016 .
- ^ "OpenACC Standards Group anuncia el lanzamiento de la especificación 2.5; los proveedores miembros agregan soporte para ARM y x86 como dispositivos paralelos | www.openacc.org" . www.openacc.org . Archivado desde el original el 26 de julio de 2016 . Consultado el 22 de marzo de 2016 .
- ^ "¿Qué hay de nuevo en OpenACC 2.6? | OpenACC" . www.openacc.org . Consultado el 1 de mayo de 2018 .
- ^ "¡Novedades de OpenACC 2.7! | OpenACC" . www.openacc.org . Consultado el 7 de enero de 2019 .
- ^ "Estándar OpenACC para ayudar a los desarrolladores a aprovechar los aceleradores de cómputo GPU" . Laboratorios Xbit . 16 de noviembre de 2011. Archivado desde el original el 16 de enero de 2014 . Consultado el 14 de enero de 2014 .
- ^ "Compilador OpenUH" . Archivado desde el original el 25 de enero de 2014 . Consultado el 4 de marzo de 2014 .
- ^ "Compilador OpenARC" . Consultado el 4 de noviembre de 2014 .
- ^ a b Larabel, Michael (30 de septiembre de 2013). "Soporte de GCC publicado para OpenACC en la GPU" . Phoronix .
- ^ "accULL La implementación de la investigación OpenACC" . Consultado el 14 de enero de 2014 .
- ^ "Compilador Omni" . omni-compiler.org . Consultado el 18 de noviembre de 2019 .
- ^ Omni Compiler para programas C y Fortran con directivas XcalableMP y OpenACC: omni-compiler / omni-compiler , omni-compiler, 2019-10-17 , recuperado el 2019-11-17
- ^ "Compilador IPMACC" . Consultado el 31 de enero de 2017 .
- ^ Larabel, Michael (4 de diciembre de 2012). "OpenACC todavía no ama a los compiladores abiertos" . Phoronix .
- ^ Larabel, Michael (14 de noviembre de 2013). "OpenACC 2.0 con soporte de GPU llegando a GCC" . Phoronix .
- ^ Larabel, Michael (15 de noviembre de 2013). "NVIDIA, Mentor Graphics puede dañar GCC" . Phoronix .
- ^ Larabel, Michael (21 de noviembre de 2013). "In-Fighting continúa sobre OpenACC en GCC" . Phoronix .
- ^ "OpenACC - Wiki de GCC" .
- ^ Schwinge, Thomas (15 de enero de 2015). "Fusionar el conjunto actual de cambios de OpenACC de gomp-4_0-branch" . gcc (lista de correo). gcc.gnu.org . Consultado el 15 de enero de 2015 .
- ^ Jelinek, Jakub (3 de mayo de 2019). "GCC 9.1 Publicado" . LWN.net .
- ^ "Paralelismo fácil de GPU con OpenACC" . Dr. Dobb's . 11 de junio de 2012 . Consultado el 14 de enero de 2014 .
- ^ "Tarjeta de referencia rápida API OpenACC, versión 1.0" (PDF) . NVidia . Noviembre de 2011 . Consultado el 14 de enero de 2014 .
- ^ "Versión estándar 2.0 de OpenACC" (PDF) . OpenACC.org . Consultado el 14 de enero de 2014 .
- ^ "Núcleos OpenACC y construcciones paralelas" . Información privilegiada de PGI . Agosto de 2012 . Consultado el 14 de enero de 2014 .
- ^ "Sección paralela de OpenACC VS kernels" . Base de conocimientos empresarial CAPS . 3 de enero de 2013. Archivado desde el original el 16 de enero de 2014 . Consultado el 14 de enero de 2014 .
enlaces externos
- https://www.openacc.org/
- Ejemplo de uso de Nvidia: parte 1 , parte 2