multithreading - omp - ¿Se puede usar OpenMP para GPU?
openmp tutorial (4)
El estándar OpenMP 4.0 incluye soporte para aceleradores (GPU, DSP, Xeon Phi, etc.), pero no conozco ninguna implementación de existencia del estándar OpenMP 4.0 para GPU, solo experiencia temprana .
OpenACC es de hecho similar a OpenMP y fácil de usar. Buen tutorial de OpenACC: parte 1 y parte 2 .
Desafortunadamente, creo que no hay una solución portátil para CPU y GPU, al menos por ahora (excepto para OpenCL, pero es de un nivel muy bajo en comparación con OpenMP y OpenACC).
Si necesita una solución portátil, podría considerar usar el acelerador Intel Xeon Phi en lugar de la GPU. El compilador Intel Fortran (y C / C ++) incluye compatibilidad con OpenMP tanto para CPU como para Xeon Phi.
Además, para crear una solución realmente portátil, no es suficiente utilizar una tecnología paralela adecuada. Debe modificar su programa para proporcionar el nivel suficiente de paralelismo. Consulte " Programación paralela estructurada " o libros similares para ver ejemplos de posibles enfoques.
He estado buscando en la web, pero todavía estoy muy confundido sobre este tema. ¿Alguien puede explicar esto más claramente? Vengo de una formación en Ingeniería Aeroespacial (no de una de Ciencias de la Computación), así que cuando leo en línea sobre OpenMP / CUDA / etc. y multiproceso, realmente no entiendo mucho de lo que se dice.
Actualmente estoy tratando de paralelizar un software interno de CFD escrito en FORTRAN. Estas son mis dudas:
OpenMP comparte la carga de trabajo usando múltiples hilos de la CPU. ¿Se puede usar para permitir que la GPU también obtenga parte del trabajo?
He leído sobre OpenACC. ¿Es similar a OpenMP (fácil de usar)?
También he leído sobre CUDA y kernels, pero no tengo mucha experiencia en programación paralela y no tengo la menor idea de qué es un kernel.
- ¿Existe una forma fácil y portátil de compartir mi carga de trabajo con la GPU, para FORTRAN (si OpenMP no hace eso y OpenACC no es portátil)?
¿Me puede dar una respuesta tipo "para tontos"?
La respuesta anterior cubre la mayor parte, pero dado que usted habló acerca de darle un poco de trabajo a la GPU, es posible que desee echar un vistazo a los frameworks para computación heterogénea (CPU + GPU simultáneamente), como StarPU .
Como StarPU es solo para C / C ++, tiene ForOpenCL for Fortran.
En cualquier caso, deberá considerar el rendimiento-conveniencia de la compensación.
Sí. Las construcciones de objetivo OpenMP 4 se diseñaron para admitir una amplia gama de aceleradores. El soporte del compilador para GPU NVIDIA está disponible en GCC 7+ (ver 1 y 2 , aunque este último no se ha actualizado para reflejar el soporte de OpenMP 4 GPU), Clang (vea 3 , 4 , 5 ) y Cray. El soporte del compilador para las GPU de Intel está disponible en el compilador Intel C / C ++ (consulte, por ejemplo, 6 ).
La implementación Clang / LLVM desarrollada por IBM de OpenMP 4+ para GPU NVIDIA está disponible en https://github.com/clang-ykt . La receta de compilación se proporciona en "compilador OpenMP para sistemas heterogéneos CORAL / OpenPower" .
El compilador Cray admite el objetivo OpenMP para GPU NVIDIA. Del manual de referencia de Cray Fortran (8.5) :
Las directivas de destino de OpenMP 4.5 son compatibles con la orientación de GPU NVIDIA o el objetivo actual de la CPU. Se debe cargar un módulo de objetivo de acelerador apropiado para usar las directivas de destino.
El compilador de Intel admite el objetivo OpenMP para gráficos Intel Gen para C / C ++ pero no para Fortran. Además, los teams
y distribute
cláusulas de distribute
no son compatibles porque no son necesarios / apropiados. A continuación se muestra un ejemplo simple que muestra cómo funcionan las características del objetivo OpenMP en diferentes entornos.
void vadd2(int n, float * a, float * b, float * c)
{
#pragma omp target map(to:n,a[0:n],b[0:n]) map(from:c[0:n])
#if defined(__INTEL_COMPILER) && defined(__INTEL_OFFLOAD)
#pragma omp parallel for simd
#else
#pragma omp teams distribute parallel for simd
#endif
for(int i = 0; i < n; i++)
c[i] = a[i] + b[i];
}
Las opciones del compilador para Intel y GCC son las siguientes. No tengo la configuración de GCC para GPU NVIDIA, pero puede ver la documentación de las opciones de -foffload
adecuadas.
$ icc -std=c99 -qopenmp -qopenmp-offload=gfx -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS
$ gcc-7 -fopenmp -c vadd2.c && echo "SUCCESS" || echo "FAIL"
SUCCESS
Para agregar a lo que se dijo sobre el soporte en otras plataformas anteriores: IBM contribuye con dos compiladores de OpenMP 4.5: uno es el de código abierto Clang / LLVM. El otro es el compilador XL de IBM. Ambos compiladores comparten la misma biblioteca auxiliar de descarga OpenMP, pero difieren en la generación y optimización del código del compilador para la GPU. Para Fortran, el compilador XL Fortran admite un gran subconjunto de la descarga de OpenMP 4.5 a las GPU NVIDIA, comenzando en la versión 15.1.5 . (Y la versión 13.1.5 para XL C / C ++). Se agregarán más características este año y el próximo, con el objetivo de brindar soporte completo en 2018. Si tiene POWER, puede unirse al programa XL compiler beta para obtener acceso a nuestras últimas funciones de descarga OpenMP en Fortran y C / C ++. .