lang:cpp:openmp
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
lang:cpp:openmp [2019/03/11 01:31] – Ajout de "reduction" et "section" root | lang:cpp:openmp [2022/09/05 23:05] (Version actuelle) – [linear] : fix format root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====Compilateur==== | + | ====Compilation==== |
+ | ===Compilateur=== | ||
Pour activer l' | Pour activer l' | ||
[[https:// | [[https:// | ||
- | [[https:// | + | [[https:// |
+ | |||
+ | [[https:// | ||
+ | |||
+ | ===CMake=== | ||
+ | |||
+ | <code cmake> | ||
+ | find_package(OpenMP) | ||
+ | if(OpenMP_CXX_FOUND) | ||
+ | target_link_libraries(MyTarget PUBLIC OpenMP:: | ||
+ | endif() | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
====Généralités de #pragma==== | ====Généralités de #pragma==== | ||
Ligne 302: | Ligne 316: | ||
</ | </ | ||
- | <note important> | + | <WRAP center round important |
+ | Les bornes de la boucle intérieure ne doit pas dépendre de la variable de la boucle externe. | ||
+ | </WRAP> | ||
< | < | ||
Ligne 367: | Ligne 383: | ||
====#pragma omp simd==== | ====#pragma omp simd==== | ||
+ | [[https:// | ||
+ | |||
Cela parallélise les instructions de calcul pour utiliser au mieux les SSE* et autres. On peut autant y faire des calculs flottants qu'en entier. Le fonctionnement est similaire aux calculs CUDA : | Cela parallélise les instructions de calcul pour utiliser au mieux les SSE* et autres. On peut autant y faire des calculs flottants qu'en entier. Le fonctionnement est similaire aux calculs CUDA : | ||
- | {{ : | + | {{ : |
<code c> | <code c> | ||
Ligne 377: | Ligne 395: | ||
</ | </ | ||
- | [[https://doc.itc.rwth-aachen.de/ | + | ===aligned=== |
+ | SSE2 a besoin que les variables soient alignées en multiple de 16 octets. On peut dire à OpenMP que les variables sont toujours correctement alignées. Mais dans le cas contraire, les calculs seront faux. | ||
+ | |||
+ | On peut déclarer soit au niveau de la variable, soit au niveau de la fonction. | ||
+ | |||
+ | <code c> | ||
+ | #pragma omp declare simd aligned(a, | ||
+ | void add_arrays(float *__restrict__ a, float *__restrict__ b) | ||
+ | { | ||
+ | #pragma omp simd aligned(a, | ||
+ | for(int n=0; n<8; ++n) a[n] += b[n]; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | '' | ||
+ | |||
+ | ===safelen=== | ||
+ | Limite le nombre de calculs en parallèle via '' | ||
+ | |||
+ | ===simdlen=== | ||
+ | Taille des blocs SIMD à calculer en même temps. | ||
+ | |||
+ | ===linear=== | ||
+ | Incrémente pour chaque boucle une variable. | ||
+ | <code cpp> | ||
+ | #pragma omp simd linear(b: | ||
+ | for(int n=0; n<8; ++n) array[n] = b; | ||
+ | </code> | ||
+ | |||
+ | Ne marche pas avec GCC 8. | ||
+ | |||
+ | ===uniform=== | ||
+ | Indique d'une variable est une constante. | ||
+ | |||
+ | ====#pragma omp task==== | ||
+ | Déclare des tâches qui seront exécutée dans un thread parallèle. | ||
+ | |||
+ | On utilise '' | ||
+ | |||
+ | ====#pragma omp single==== | ||
+ | Impose l' | ||
+ | |||
+ | <code c> | ||
+ | <#pragma omp parallel | ||
+ | { | ||
+ | #pragma omp single | ||
+ | { | ||
+ | #pragma omp task | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | #pragma omp task | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | #pragma omp task | ||
+ | { | ||
+ | printf(" | ||
+ | } | ||
+ | #pragma omp taskwait | ||
+ | printf(" | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ====Bugs | ||
+ | ===Charger dynamiquement une DLL qui est liée à OpenMP=== | ||
+ | |||
+ | OpenMP gère ses threads comme Windows. Quand un thread a terminé ce qu'il avait à faire, il reste dans la '' | ||
+ | |||
+ | Dans le cas de la DLL de OpenMP, si on décharge la DLL ayant chargé OpenMP et que le pool de threads n'est pas vide, il y a un crash. | ||
+ | |||
+ | Solution | ||
+ | |||
+ | Selon le code source de gcc ('' | ||
+ | ^'' | ||
+ | |Non défini. | ||
+ | |'' | ||
+ | |'' | ||
+ | [[https:// |
lang/cpp/openmp.1552264304.txt.gz · Dernière modification : 2019/03/11 01:31 de root