Pourquoi OpenMP programme ne fonctionne que dans un seul thread
J'ai juste essayé OpenMP avec un simple programme c
test() {
for(int i=0;i<100000000;i++);
}
main() {
printf("Num of CPU: %d\n", omp_get_num_procs());
#pragma omp parallel for num_threads(4)
for(int i=0;i<100;i++) test();
}
Compilé avec g++ -fopenmp
. Il peut correctement impression que j'ai 4 Processeurs, mais toutes les fonctions de test sont en cours d'exécution à thread 0
.
J'ai essayé de modifier le OMP_NUM_THREADS
. Mais il n'a pas d'effet aussi.
J'avais tout de même que les exemples en ligne mais pourquoi n'aurais-je pas le faire fonctionner?
Comment savez-vous qu'il ne s'exécute qu'un thread?
Oui j'ai vérifié dans le test() par l'impression de l'omp_get_thread_num().
Avez-vous vérifier
Merci, j'ai vérifié omp_get_max_threads() dans le test() et il est à 4. Mais encore chaque test() s'exécute sur le nombre de thread 0.
Est-il possible que le compilateur optimise toutes les boucles qu'ils ne font rien, et puis chaque thread termine plus vite que la boucle de la création d'eux peut exécuter en tant qu'ils ne font rien... donc il n'y a qu'un seul thread en cours d'exécution. Juste une théorie, probablement mal 🙂
Oui j'ai vérifié dans le test() par l'impression de l'omp_get_thread_num().
Avez-vous vérifier
omp_get_max_threads()
pour voir si openmp choses qu'il ne peut utiliser qu'un seul thread pour une raison quelconque?Merci, j'ai vérifié omp_get_max_threads() dans le test() et il est à 4. Mais encore chaque test() s'exécute sur le nombre de thread 0.
Est-il possible que le compilateur optimise toutes les boucles qu'ils ne font rien, et puis chaque thread termine plus vite que la boucle de la création d'eux peut exécuter en tant qu'ils ne font rien... donc il n'y a qu'un seul thread en cours d'exécution. Juste une théorie, probablement mal 🙂
OriginalL'auteur Eines He | 2012-04-18
Vous devez vous connecter pour publier un commentaire.
Votre problème est ici:
La clause compromissoire est
num_threads(4)
, pasnum_thread(4)
. Incorrect openmp pragmas sont ignorés et si vous vous retrouviez avec un programme séquentiel. 🙂Je suis surpris que vous n'obtenez pas un avertissement du compilateur, parce que j'ai fait.
Lui: Alors c'est très étrange, parce que j'ai collé votre code compilé et il a couru et il a travaillé sur les 4 coeurs.
Comment définissez-vous de votre environnement? Je pense que le code est assez basique et ne pouvait pas aller mal. J'utilise g++ 4.6.1 et libomp1. Je pense que le openmp est sûrement parce que je n'ai pas de problème en vérifiant le nombre de processeurs ...etc. Ça doit être une où je n'ai pas mis le environnement correctement.
Hmm... j'ai testé cela sur Windows avec cl.exe. Je vais le tester sur mon environnement Linux le plus tôt possible et de vous en informer.
Ok, alors j'ai testé sur ubuntu avec g++ 4.5.2 et il fonctionne aussi très bien.
OriginalL'auteur Tudor
J'ai eu ce problème dans visual studio et j'ai enfin compris que j'avais oublié d'activer Open MP dans visual studio. Il ne me donne pas d'erreur mais exécuté le programme de seulement un thread
Sauvé mon temps. Thx.
OriginalL'auteur hamed246
utiliser la fonction omp_set_num_threads(4) avant d'appeler l'omp section parallèle.
aussi, comment voulez-vous déterminer le nombre de threads ??
intégrer votre printfs dans une section critique juste pour s'assurer que tout va bien imprimé.
OriginalL'auteur prathmesh.kallurkar
J'ai rencontré la même situation, sur mon bureau ubuntu quand je étend numpy le module avec du code C. openmp seulement couru avec un fil. Il m'est arrivé de supprimer libopenblas-de base et installer libatlas-base-dev.(pour traiter avec numpy problème d'installation) Puis multi-threads openmp est venu de retour:)
Je l'ai testé sur un serveur ubuntu avec 64 cœurs et il fonctionne aussi mon bureau!
Je pense que c'est parce que libopenblas conflits avec des bibliothèques comme atlas.
OriginalL'auteur GBY