web-dev-qa-db-fra.com

OpenMP peut-il être utilisé pour les GPU?

J'ai fait des recherches sur le Web mais je suis encore très confus à propos de ce sujet. Quelqu'un peut-il expliquer cela plus clairement? Je viens du monde de l’ingénierie aérospatiale (et non de l’informatique), donc quand je lis en ligne sur OpenMP/CUDA/etc. et multithreading, je ne comprends pas vraiment beaucoup de ce qui se dit.

J'essaie actuellement de mettre en parallèle un logiciel CFD interne écrit en FORTRAN. Ce sont mes doutes:

  1. OpenMP partage la charge de travail en utilisant plusieurs threads de la CPU. Peut-il être utilisé pour permettre au GPU d’obtenir une partie du travail?

  2. J'ai lu sur OpenACC. Est-ce similaire à OpenMP (facile à utiliser)?

J'ai aussi lu sur CUDA et les noyaux, mais je n'ai pas beaucoup d'expérience en programmation parallèle et je n'ai pas la moindre idée de ce qu'est un noyau. 

  1. Existe-t-il un moyen simple et portable de partager ma charge de travail avec le processeur graphique pour FORTRAN (si OpenMP ne le fait pas et que OpenACC n'est pas portable)?

Pouvez-vous me donner une réponse de type "pour les nuls"?

18
André Almeida
  1. OpenMP 4.0 standard inclut la prise en charge des accélérateurs (GPU, DSP, Xeon Phi, etc.), mais je ne connais aucune implémentation existante du standard OpenMP 4.0 pour GPU, seulement première expérience .

  2. OpenACC est en effet similaire à OpenMP et facile à utiliser. Bon tutoriel OpenACC: partie 1 et partie 2 .

Malheureusement, je pense qu’il n’existe pas de solution portable pour le processeur et le processeur graphique, du moins pour le moment (à l’exception de OpenCL, mais son niveau est trop bas par rapport à OpenMP et OpenACC).

Si vous avez besoin d’une solution portable, vous pouvez envisager d’utiliser Intel Xeon Phi accélérateur au lieu d’un GPU. Le compilateur Intel Fortran (et C/C++) inclut la prise en charge OpenMP pour les processeurs et Xeon Phi.

De plus, pour créer une solution réellement portable, il ne suffit pas d'utiliser une technologie parallèle adaptée. Vous devez modifier votre programme afin de fournir un niveau de parallélisme suffisant. Voir " Programmated Parallel Programming " ou des ouvrages similaires pour des exemples d'approches possibles.

6
Andrey Sozykin

Oui. Les constructions de cible OpenMP 4 ont été conçues pour prendre en charge une large gamme d’accélérateurs. Le support du compilateur pour les GPU NVIDIA est disponible auprès de GCC 7+ (voir 1 et 2 , bien que ce dernier n’ait pas été mis à jour pour refléter le support OpenMP 4 GPU), Clang (voir 3 , 4 , 5 ) et Cray. La prise en charge du compilateur pour les processeurs graphiques Intel est disponible dans le compilateur Intel C/C++ (voir par exemple 6 ).

L'implémentation d'OpenMP 4+ pour GPU NVIDIA développée par IBM pour Clang/LLVM est disponible à l'adresse https://github.com/clang-ykt . La recette de construction est fournie dans "Compilateur OpenMP pour systèmes hétérogènes CORAL/OpenPower" .

Le compilateur Cray prend en charge la cible OpenMP pour les GPU NVIDIA. De Cray Fortran Reference Manual (8.5) :

Les directives de cible OpenMP 4.5 sont prises en charge pour cibler les GPU NVIDIA ou la cible de processeur en cours. Un Le module cible d'accélérateur approprié doit être chargé pour utiliser les directives cible.

Le compilateur Intel prend en charge OpenMP target pour les graphiques Intel Gen pour C/C++ mais pas Fortran. De plus, les clauses teams et distribute ne sont pas prises en charge car elles ne sont pas nécessaires/appropriées. Vous trouverez ci-dessous un exemple simple illustrant le fonctionnement des fonctionnalités cibles OpenMP dans différents environnements.

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];
}

Les options du compilateur pour Intel et GCC sont les suivantes. Je n'ai pas de configuration GCC pour les GPU NVIDIA, mais vous pouvez voir la documentation pour les options -foffload appropriées.

$ 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
4
Jeff

Pour ajouter à ce qui a été dit à propos du support sur les autres plates-formes ci-dessus: IBM contribue à deux compilateurs OpenMP 4.5: L’un est l’un source libre Clang/LLVM. L'autre est le compilateur XL d'IBM. Les deux compilateurs partagent la même bibliothèque de déchargement OpenMP d'assistance, mais diffèrent par la génération de code et l'optimisation du compilateur pour le GPU. Pour Fortran, le compilateur XL Fortran prend en charge un vaste sous-ensemble d'OpenMP 4.5, qui effectue le déchargement sur les GPU NVIDIA, à partir de la version 15.1.5 . (Et version 13.1.5 pour XL C/C++). De nouvelles fonctionnalités sont ajoutées cette année et l'année prochaine dans le but de fournir une assistance complète en 2018. Si vous êtes sur POWER, vous pouvez rejoindre le programme bêta du compilateur XL pour accéder à nos dernières fonctionnalités de déchargement OpenMP en Fortran et en C/C++ .

3
Rafik Zurob

La réponse précédente en couvre la majeure partie, mais puisque vous avez parlé de donner du travail au GPU aussi, vous voudrez peut-être jeter un coup d'œil aux frameworks pour l'informatique hétérogène (CPU + GPU simultanément), tels que StarPU .

Etant donné que StarPU n’est que pour C/C++, vous avez ForOpenCL pour Fortran.

Dans tous les cas, vous devrez considérer le compromis performance-confort.

1
a3mlord