Dans Is OpenMP (parallel for) in g++ 4.7 not very efficient? 2.5x at 5x CPU, j'ai déterminé que les performances de mon programme varient entre 11s et 13s (la plupart du temps toujours au-dessus de 12s, et parfois aussi lent que 13.4 s) à environ 500% CPU en utilisant le #pragma omp parallel for
par défaut, et l'accélération OpenMP est seulement 2,5x à 5x CPU w/g++-4.7 -O3 -fopenmp
, sur un Xeon 8-thread à 4 cœurs. J'ai essayé d'utiliser schedule(static) num_threads(4)
, et j'ai remarqué que mon programme se termine toujours en 11.5s à 11.7s (toujours en dessous de 12s) à environ 320% CPU, par exemple, fonctionne plus régulièrement et utilise moins de ressources (même si la meilleure exécution est une demi-seconde plus lentement que la valeur aberrante rare avec hyperthreading).OpenMP: n'utilisez pas les cœurs hyperthreading (moitié `num_threads()` w/hyperthreading)
Y at-il OpenMP-moyen simple de détecter hyperthreading et réduire num_threads()
au nombre réel de cœurs de processeur?
(Il y a une question similaire, Poor performance due to hyper-threading with OpenMP: how to bind threads to cores, mais dans mes tests, je l'ai trouvé qu'une simple réduction de 8 à 4 fils en quelque sorte déjà fait ce travail avec/g ++ - 4.7 sur Debian 7 sifflante et Xeon E3-1240v3 , donc, cette question est simplement de réduire num_threads()
au nombre de cœurs.)
Non, il n'y a pas de façon simple de le faire entièrement automatique. Mais il y a http://stackoverflow.com/q/2901694/620382 + 'omp_set_num_threads'. Encore une fois, je recommande de contrôler manuellement la configuration des threads sur chaque système, si possible. – Zulan
Pourquoi cette question a-t-elle été dépréciée ?! – cnst