2017-06-13 4 views
1

Lorsque j'utilise OpenMP sur les systèmes Intel, je trouve souvent utile de définir KMP_AFFINITY=verbose,(other options...) afin que la bibliothèque crache les cœurs auxquels mes threads sont réellement liés. Je trouve cela utile lors de l'expérimentation avec différentes options de liaison de thread. Actuellement, je travaille avec un système Power8 et je me demande s'il existe un équivalent de KMP_AFFINITY=verbose pour les distributions GNU et/ou IBM OpenMP. En d'autres termes, comment puis-je obtenir des informations sur l'emplacement de mes threads si je compile mon exécutable OpenMP avec g ++ ou xlC++? Avec xlC++, vous pouvez définir la variable d'environnement OMP_DISPLAY_ENV sur TRUE ou VERBOSE pour obtenir cette information.Equivalent de KMP_AFFINITY = verbose pour les bibliothèques gnu et ibm openmp?

+0

Libgomp ne prend pas en charge l'affinité pour les cibles telles que Windows. Pour des cibles telles que Linux où Intel openmp prend en charge les appels gcc openmp, ce serait un moyen d'accomplir ce que vous demandez. – tim18

Répondre

1

GCC OpenMP documentation (libgomp) dit que c'est pas possible actuellement:

Il n'y a pas de routine de la bibliothèque libgomp pour déterminer si une spécification d'affinité CPU est en vigueur. En guise de solution de contournement, des fonctions de bibliothèque spécifiques à une langue, par exemple, getenv en C ou GET_ENVIRONMENT_VARIABLE dans Fortran, peuvent être utilisées pour interroger le paramètre de la variable d'environnement GOMP_CPU_AFFINITY. Une affinité de CPU définie au démarrage ne peut pas être modifiée ou désactivée pendant l'exécution de l'application.

Vous pouvez essayer d'utiliser GOMP_DEBUG et voir si elle fait ce que vous cherchez.

+0

'OMP_DISPLAY_ENV = VERBOSE' fait imprimer' GOMP_CPU_AFFINITY', mais il apparaît vide ('GOMP_CPU_AFFINITY = ''') même si je mets explicitement OMP_PLACES. 'export GOMP_DEBUG = 1' n'ajoute rien à la sortie non plus. Je ne suis pas sûr si je fais quelque chose de mal, ou je travaille avec une version de libgomp qui n'est pas très bavarde. –

+0

Imprime probablement les valeurs des variables d'environnement qui définissent les variables de contrôle interne (ICV). Si vous définissez 'GOMP_CPU_AFFINITY', il peut imprimer cette valeur. Une autre possibilité est de vous écrire une fonction qui imprime cela. Je l'ai fait en utilisant [sched_getaffinity] (https://linux.die.net/man/2/sched_getaffinity). Vous pouvez vérifier ceci [exemple utile] (https://github.com/karelzak/util-linux/blob/143ea06851104ffaa9d3fe8de09c721d2364de64/lib/cpuset.c#L150). Peut-être que vous pouvez même soumettre un patch à libgomp qui fait ce que vous cherchez. –

+0

Merci. J'espérais qu'il y avait une solution aussi rapide et complète que KMP_AFFINITY mais au moins cela me donne quelques outils pour travailler avec. –

1

Tous les détails peuvent être trouvés sur le IBM Knowledge Center.

+0

Merci pour votre réponse. J'ai déjà essayé OMP_DISPLAY_ENV. La sortie affiche les valeurs de variable d'environnement, y compris OMP_PLACES. Cependant, il ne semble pas me dire exactement quels noyaux chaque thread finit par être lié, comme le fait KMP_AFFINITY, à moins que je ne manque quelque chose. Mon objectif ici est de voir le placement des threads qui résulte d'une combinaison donnée de variables d'environnement, donc connaître les variables d'environnement n'est pas très utile. –

+0

Malheureusement, xlC++ n'a pas quelque chose d'aussi pratique que KMP_AFFINITY = verbose, mais si vous êtes prêt à modifier votre code et essayer une fonctionnalité non documentée dans xlC++, il existe une fonction _xlsmp_thread_binding() qui affichera l'affinité CPU pour le thread appelant. Comme ce n'est pas officiellement supporté, cela ne fonctionnera peut-être pas pour vous, mais cela pourrait valoir la peine d'être photographié. – trudeaun

+0

Merci, je vais essayer ça. –