Outils pour utilisateurs

Outils du site


lang:cpp:openmp

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:openmp [2019/03/11 01:31] – Ajout de "reduction" et "section" rootlang:cpp:openmp [2022/09/05 23:05] (Version actuelle) – [linear] : fix format root
Ligne 1: Ligne 1:
-====Compilateur====+====Compilation==== 
 +===Compilateur===
 Pour activer l'option : ''-openmp'' pour ''GCC'', ''/openmp'' pour Visual Studio (''Projet''|''Propriétés''|''C/C++''|''Langage''|''Prise en charge de OpenMP''). Pour activer l'option : ''-openmp'' pour ''GCC'', ''/openmp'' pour Visual Studio (''Projet''|''Propriétés''|''C/C++''|''Langage''|''Prise en charge de OpenMP'').
  
 [[https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf|OpenMP Application Programming Interface (Norme OpenMP v4.5)]] {{ :lang:cpp:openmp:openmp-4.5.pdf |Archive du 09/03/2019}} [[https://www.openmp.org/wp-content/uploads/openmp-4.5.pdf|OpenMP Application Programming Interface (Norme OpenMP v4.5)]] {{ :lang:cpp:openmp:openmp-4.5.pdf |Archive du 09/03/2019}}
  
-[[https://bisqwit.iki.fi/story/howto/openmp/|Guide into OpenMP: Easy multithreading programming for C++]] {{ :lang:cpp:openmp:guide_into_openmp_easy_multithreading_programming_for_c_.mhtml |Archive du 09/03/2019}}+[[https://www.openmp.org/wp-content/uploads/openmp-examples-4.5.0.pdf|OpenMP Application Programming Interface Examples]], {{ :lang:cpp:openmp:openmp-examples-4.5.0.pdf |Archive du 11/02/2019}} 
 + 
 +[[https://bisqwit.iki.fi/story/howto/openmp/|Guide into OpenMP: Easy multithreading programming for C++]] {{ :lang:cpp:openmp:guide_into_openmp_easy_multithreading_programming_for_c_2019-10-16_15_43_58_.html |Archive du 10/02/2018 le 16/10/2019}} 
 + 
 +===CMake=== 
 + 
 +<code cmake> 
 +find_package(OpenMP) 
 +if(OpenMP_CXX_FOUND) 
 +  target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX) 
 +endif() 
 +</code> 
 + 
 +[[https://cliutils.gitlab.io/modern-cmake/modern-cmake.pdf|Modern CMake]] {{ :lang:cpp:openmp:modern-cmake.pdf |Archive du 01/30/2020 le 04/03/2020}}
  
 ====Généralités de #pragma==== ====Généralités de #pragma====
Ligne 302: Ligne 316:
 </code> </code>
  
-<note important>Les bornes de la boucle intérieure ne doit pas dépendre de la variable de la boucle externe.</note>+<WRAP center round important 60%> 
 +Les bornes de la boucle intérieure ne doit pas dépendre de la variable de la boucle externe. 
 +</WRAP>
  
 <code> <code>
Ligne 367: Ligne 383:
  
 ====#pragma omp simd==== ====#pragma omp simd====
 +[[https://doc.itc.rwth-aachen.de/download/attachments/28344675/SIMD+Vectorization+with+OpenMP.PDF|SIMD Vectorization with OpenMP]] {{ :lang:cpp:openmp:simd_vectorization_with_openmp.pdf |Archive du 09/03/2019}}
 +
 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 :
  
-{{ :lang:cpp:openmp:simd-1.svg?600 |}}+{{ :lang:cpp:openmp:simd-1.svg |}}
  
 <code c> <code c>
Ligne 377: Ligne 395:
 </code> </code>
  
-[[https://doc.itc.rwth-aachen.de/download/attachments/28344675/SIMD+Vectorization+with+OpenMP.PDF|SIMD Vectorization with OpenMP]] {{ :lang:cpp:openmp:simd_vectorization_with_openmp.pdf |Archive du 09/03/2019}}+===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,b:16) 
 +void add_arrays(float *__restrict__ a, float *__restrict__ b) 
 +
 +  #pragma omp simd aligned(a,b:16) 
 +  for(int n=0; n<8; ++n) a[n] += b[n]; 
 +}  
 +</code> 
 + 
 +''%%__restrict__%%'' permet de dire que le contenu ne change pas et que personne ne pointe dessus sauf la variable utilisée. 
 + 
 +===safelen=== 
 +Limite le nombre de calculs en parallèle via ''simd''. Utile si deux tableaux se superposent. 
 + 
 +===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:2) 
 +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 ''taskwait'' pour attendre que les tâches soient terminées. 
 + 
 +====#pragma omp single==== 
 +Impose l'exécution d'un bloc par un seul thread. Ci-dessous, la boucle est exécutée une seule fois son contenu est exécuté en parallèle grâce à ''#pragma omp task''. 
 + 
 +<code c> 
 +<#pragma omp parallel 
 +
 +  #pragma omp single 
 +  { 
 +    #pragma omp task 
 +    { 
 +      printf("%d\n", omp_get_thread_num()); 
 +    } 
 +    #pragma omp task 
 +    { 
 +      printf("%d\n", omp_get_thread_num()); 
 +    } 
 +    #pragma omp task 
 +    { 
 +      printf("%d\n", omp_get_thread_num()); 
 +    } 
 +    #pragma omp taskwait 
 +    printf("Fin %d\n", omp_get_thread_num()); 
 +  } 
 +
 +</code> 
 + 
 +====Bugs messages d'erreur==== 
 +===Charger dynamiquement une DLL qui est liée à OpenMP=== 
 + 
 +OpenMP gère ses threads comme WindowsQuand un thread a terminé ce qu'il avait à faire, il reste dans la ''pool'' et est stocké en vue d'une éventuelle réutilisation. 
 + 
 +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 définir obligatoirement la variable d'environnement ''OMP_WAIT_POLICY'' à ''passive'' pour que la durée avant libération de la mémoire des threads après leur mort soit nulle. 
 + 
 +Selon le code source de gcc (''libgomp\env.c'') et la fonction ''parse_wait_policy'' :
  
 +^''OMP_WAIT_POLICY''^Durée de vie du pool^
 +|Non défini.        | 3 ms               |
 +|''active''         | 5 minutes          |
 +|''passive''        | 0 ms               |
  
 +[[https://stackoverflow.com/questions/34439956/vc-crash-when-freeing-a-dll-built-with-openmp|VC++: crash when freeing a DLL built with openMP]] {{ :lang:cpp:openmp:visual_c_-_vc_crash_when_freeing_a_dll_built_with_openmp_-_stack_overflow_2019-10-16_16_27_25_.html |Archive du 23/12/2015 le 16/10/2019}}
lang/cpp/openmp.1552264304.txt.gz · Dernière modification : 2019/03/11 01:31 de root