2017-01-05 2 views
0

J'ai écrit un programme OpenMP, l'exécutant sur une machine à deux cœurs.Affinité de thread OpenMP: Définir 2 threads dans le programme, combien de cœurs sont en cours d'exécution?

Lorsque j'ai changé le numéro de fil de 1 à 2 et de 2 à 4, je n'ai pas réussi à accélérer le 2x.

2 fils à 4 fils, ce sont les hyperthreads. Hyperthreads ne peuvent généralement pas accélérer 2x en raison de la limitation des ressources. Toutefois, 1 threads à 2 threads, ne peut toujours pas accélérer le 2x, je me sens confus à ce sujet.J'ai cherché et trouvé le concept d'affinité du processeur, mais je ne peux pas comprendre comment fonctionne OpenMP.

Lorsque j'utilise 2 threads, est-ce que le planning statique d'OpenMP organise 2 threads en 1 core ou 2 core? Fonction

omp_get_thread_num() ne peut me dire la réponse puisque la valeur de retour est 0 ou 1, mais je ne sais pas qu'ils sont en cours d'exécution sur 1 noyau ou 2.

Merci pour l'aide.

+0

Sans code c'est difficile de répondre parce que nous devinerions surtout ce qui se passe. Pour commencer: omp_get_thread_num() renvoie l'identifiant du thread. Donc Thread 1 renvoie 0 et Thread 2 - 1 et ainsi de suite. – Taron

+0

La méthode habituelle pour attribuer 2 threads à des cœurs séparés malgré l'hyperthreading est avec omp_places = cœurs. Si votre openmp ne supporte pas cela, il se peut que vous ayez besoin de plus de threads que de cœurs afin d'utiliser pleinement tous les cœurs. – tim18

+0

Puis-je écrire du code pour savoir quel est le noyau de Thread 1, quel est le noyau de Thread 2? –

Répondre

1

peut utiliser l'affinité de fil avec proc_bind:

Fermer enter image description here

propagation enter image description here

Maître enter image description here

J'espère que cela vous aidera à choisir l'option appropriée pour travailler .

+0

Merci, Ruslan. J'essaye d'employer l'affinité de fil d'OpenMP, cependant, il est facile de placer la variable d'environnement d'OpenmP dans Linux, mais ne fonctionne pas dans VS, sur la plate-forme de Windows. –

+0

Fonctionne, si vous utilisez le compilateur Intel. Compilateur de VS ne supporte que OpenMP 2.0, dans ce lien sur le site Web d'Intel, vous pouvez trouver cette information https://software.intel.com/en-us/node/522691 –

+0

Merci, Ruslan. J'ai changé le compilateur de VC++ en Intel afin que je puisse utiliser le paramètre proc_bind. –