# OpenACC

OpenACC (Para Aceleradores Abiertos) es un estándar de programación para la informática paralela desarrollada 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. Al igual que en OpenMP, OpenACC es un estándar de programación donde el programador de C, C++ o Fortran introduce directivas del compilador para acelerar el código.
En ISC'12 OpenACC fue demostrado que trabaja en aceleradores Nvidia, AMD y Intel, sin datos sobre su rendimiento.
Versión 2.5 de la especificación fue publicada en octubre del 2015.
El modelo de ejecución de OpenAcc permite a los usuarios tener cuatro niveles de paralelismo: thread, gang, worker y vector.
Thread: Es el típico término usado en el paralelismo que es un proceso con un determinado ID y un ciclo de vida.
Gang: Los grupos de trabajadores se llaman gangs (Los programadores de CUDA reconocerán que un gang es otro nombre para un bloque de subprocesos de CUDA). Las Gangs funcionan independientemente unas de otras.
Worker: Los grupos de subprocesos que pueden operar juntos en un SIMD de forma vectorial se denominan trabajadores. (Los programadores de CUDA reconocerán que un trabajador es solo el nombre de OpenAcc para una deformación).
Vectors: Los vectores hacen que los subprocesos de trabajo funcionen al mismo tiempo cuando se ejecutan vectores o instrucciones SIMD.
Se puede decir que es un herramienta de código para procesar tareas con dos partes: una forma secuencial por la CPU y partes que tienen funciones de cómputo intensivas, las cuales ameritan mayor procesamiento por parte de la GPU.

## Historia

Alrededor del 2010, Los vendedores de compiladores empezaron a buscar directivas para las GPUs para simplificar la forma de programar GPU mediante el compilador. En sus inicios, OpenACC pretendía ser para todo tipo de aceleradores. Sin embargo, terminó soportando solo GPU de Nvidia.
OpenMP, que es un enfoque similar a OpenACC, tiene el objetivo de admitir todos los diferentes tipos de aceleradores. El estándar OpenACC fue lanzado en noviembre de 2011 en la conferencia Súper computación.
Fue desarrollado por un grupo de compañías PGI, CAPS, NVDIA y CRAY con ideas muy similares a OpenMP. OpenACC 1.0 fue la primera versión y fue lanzada en noviembre de 2011, centrado únicamente en directivas de compilación para aceleradores, un enfoque descriptivo de la programación paralela con la portabilidad del rendimiento como una consideración primordial.
Posteriormente, en 2013 aparece la versión 2.0, que brinda un mejor soporte a las estructuras de datos complejas. En los siguientes años se llega hasta la versión 2.7 (2018) que solucionan errores a versiones anteriores. Finalmente en 2019 llega la versión 3.0, en 2020 la versión 3.1 y la 3.2 en 2021, que es la más reciente.

## Empresas relacionadas

Con el propósito de hacer las cosas más fáciles para que los programadores utilicen las ventajas de la computación paralela, NVIDIA junto a Cray Inc, The Portland Group (PGI) y CAPS Enterprise anunciaron el estándar de programación paralela denominado OpenACC.

### NVIDIA

En 1993 fue fundada por Jensen Huang, Chris Malachowsky y Curtis Priem. Para que las directivas de OpenACC se habiliten a la línea de comando del compilador, de manera predeterminada; los compiladores NVIDIA HPC paralelizarán y descargarán las regiones OpenACC a las GPU NVIDIA.

### Cray Inc

En 1972, el diseñador de ordenadores Seymour Cray, fundó Cray Research, Inc. “La tecnología Cray está diseñada para permitir que los científicos e ingenieros logren avances notables acelerando el rendimiento, mejorando la eficiencia y ampliando las capacidades de sus aplicaciones más exigentes” (NVIDIA, 2011).

### The Portland Group

Fundado en 1989, “es el principal proveedor de herramientas y compiladores paralelos de Fortran, C y C++ de alto rendimiento para estaciones de trabajo, servidores y clústeres basados en procesadores x64 de Intel y AMD, y aceleradores de GPU de NVIDIA” (NVIDIA, 2011). Los compiladores de PGI incorporan capacidades de optimización global, vectorización, canalización de software y paralelización de memoria compartida dirigidas a procesadores Intel y AMD.

### CAPS Enterprise

Es un importante proveedor de soluciones orientadas a la migración e implementación de aplicaciones en procesadores de muchos núcleos.

## Soporte de compilador

Soporte de OpenACC está disponible en compiladores comerciales de PGI (desde versión 12.6), Cray, y CAPS.

### IDEs

Para los entornos de desarrollo integrados se debe poder trabajar con C/C++ y/o Fortran, lenguajes con los que trabaja OpenACC. Los compiladores de OpenACC están diseñados y disponibles para su descarga desde múltiples proveedores y organizaciones académicas, los cuales son los siguientes.

#### Compiladores comerciales

Hewlett Packard, SDK de HPC de NVIDIA y Centro Nacional de Supercomputación de Wuxi.

#### Compiladores de código abierto

CCG 10.

#### Compiladores académicos

Proyecto compilador Omni, Riken (Universidad de Tsukuba), OpenARC (Laboratorio nacional de Oak Ridge), OpenUH (Universidad de Houston, Universidad de Stony Brook) y ROSEACC (universidad de Delaware).

## Uso

En una manera similar a OpenMP 3.x En sistemas homogéneos o el más antiguo OpenHMPP, el modo primario de programar en OpenACC es directivas. Las especificaciones también incluyen una biblioteca de ejecución que define varias funciones de soporte. Para explotarlas, el usuario tendría que incluir "openacc.h" En C o "openacc_lib.h" En Fortran; y entonces llamar la función acc_init.

### Campos de Utilización

OpenACC beneficia una amplia gama de programadores en los campos de química, biología, física, análisis de datos. En general, es cuando se necesita procesar grandes cantidades de datos y analizarlos de forma rápida como la predicción del clima, la cual tiene muchos datos de entrada al sistema y deben ser procesados rápidamente para llegar a una predicción útil sin que colapse el sistema de cómputo que se está usando.