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/12 01:06] – Complétion de "SIMD" 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'').
  
Ligne 6: Ligne 7:
 [[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://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_.mhtml |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_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 304: 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 373: Ligne 387:
 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 395: Ligne 409:
 </code> </code>
  
-''__restrict__'' permet de dire que le contenu ne change pas et que personne ne pointe dessus sauf la variable utilisée.+''%%__restrict__%%'' permet de dire que le contenu ne change pas et que personne ne pointe dessus sauf la variable utilisée.
  
 ===safelen=== ===safelen===
Ligne 405: Ligne 419:
 ===linear=== ===linear===
 Incrémente pour chaque boucle une variable. Incrémente pour chaque boucle une variable.
-<code>+<code cpp>
 #pragma omp simd linear(b:2) #pragma omp simd linear(b:2)
 for(int n=0; n<8; ++n) array[n] = b; for(int n=0; n<8; ++n) array[n] = b;
Ligne 446: Ligne 460:
 </code> </code>
  
 +====Bugs / messages d'erreur====
 +===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 ''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.1552349205.txt.gz · Dernière modification : 2019/03/12 01:06 de root