attribuer deux processus MPI par cœur
Comment puis-je attribuer 2 processus MPI par cœur?
Par exemple, si je ne mpirun -np 4 ./application
alors il devrait utiliser 2 cœurs physiques pour exécuter 4 processus MPI (2 processus par cœur). Je suis à l'aide de Open MPI 1.6. Je n'ai mpirun -np 4 -nc 2 ./application
, mais n'était pas en mesure de l'exécuter.
Il se plaint mpirun was unable to launch the specified application as it could not find an executable:
peut-être parce que vous orthographié application de mal?
Pas de. C'était juste une faute de frappe. '"application" n'est pas un vrai nom de l'application. Merci de remarquer que. Si j'ai pris '-nc 2' puis il a travaillé!
Dans votre commentaire, vous avez dit "nc -2" au lieu de "-nc 2". C'est 2 fautes de frappe dans les 2 messages. Êtes-vous sûr que vous n'en manque juste quelque chose de stupide parce que vous êtes pressé?
🙁 J'ai vérifié. Pas de fautes de frappe dans la commande. Travaillé sans-nc 2'
Je voudrais vous suggérer de fusionner le contenu de votre question ici.
Pas de. C'était juste une faute de frappe. '"application" n'est pas un vrai nom de l'application. Merci de remarquer que. Si j'ai pris '-nc 2' puis il a travaillé!
Dans votre commentaire, vous avez dit "nc -2" au lieu de "-nc 2". C'est 2 fautes de frappe dans les 2 messages. Êtes-vous sûr que vous n'en manque juste quelque chose de stupide parce que vous êtes pressé?
🙁 J'ai vérifié. Pas de fautes de frappe dans la commande. Travaillé sans-nc 2'
Je voudrais vous suggérer de fusionner le contenu de votre question ici.
OriginalL'auteur codereviewanskquestions | 2012-07-31
Vous devez vous connecter pour publier un commentaire.
orterun
(l'Open MPI SPMD/MPMD lanceur;mpirun/mpiexec
sont juste des liens symboliques) bénéficie d'un certain appui pour le processus de liaison, mais il n'est pas assez souple pour vous permettre de lier les deux processus par cœur. Vous pouvez essayer avec-bycore -bind-to-core
mais il de se tromper lorsque tous les cœurs déjà un processus affecté.Mais il existe une solution de contournement, vous pouvez utiliser un rankfile où vous spécifiez explicitement slot pour lier chaque rang. Voici un exemple: pour exécuter 4 processus sur un PROCESSEUR dual-core avec 2 processus par cœur, vous devez effectuer les opérations suivantes:
où
rankfile
est un fichier texte avec le contenu suivant:Cette place rangs 0 et 1 sur le core 0 du processeur 0 et de rangs 2 et 3 sur la base de 1 du processeur 0. Laid mais qui fonctionne:
Edit: De votre autre question est devient évident que vous êtes effectivement en cours d'exécution sur un hyperthread. Ensuite, vous devez comprendre la physique de la numérotation de vos processeurs logiques (c'est un peu déroutant mais la numérotation correspond à la valeur de
processor:
comme indiqué dans/proc/cpuinfo
). La meilleure façon de l'obtenir est d'installer lehwloc
de la bibliothèque. Il fournit lahwloc-ls
outil que vous pouvez utiliser comme ceci:Physique Id sont répertoriés après
P#
dans les crochets. Dans votre 8-core cas, la deuxième hyperthread du premier noyau (core 0) serait le plus susceptible d'avoir des ID8
et donc votre rankfile ressemblerait à quelque chose comme:(note de l'
p
préfixe - ne pas omettre)Si vous n'avez pas
hwloc
ou vous ne pouvez pas l'installer, alors que vous auriez à analyser/proc/cpuinfo
sur votre propre. Hyperthreads auraient les mêmes valeurs dephysical id
etcore id
mais différentsprocessor
etapicid
. La physique ID est égal à la valeur deprocessor
.Pour les futurs voyageurs, j'ai une question de suivi here
OriginalL'auteur Hristo Iliev
Je ne sais pas si vous avez plusieurs machines ou pas, et les détails de la façon dont vous voulez que le processus distribués, mais je considère la lecture:
mpirun page de man
Le manuel d'utilisation indique qu'il a les moyens de liaison des processus à différentes choses, y compris les nœuds, les sockets et les cœurs du processeur.
Il est important de noter que vous aurez à réaliser cette si vous exécutez simplement deux fois autant de processus que vous avez des cœurs du PROCESSEUR, car ils ont tendance à distribuer uniformément sur les cœurs à l'action de la charge.
Je voudrais essayer quelque chose comme ce qui suit, bien que le manuel est un peu ambigu et je ne suis pas sûr à 100% qu'il va se comporter comme prévu, aussi longtemps que vous avez un dual core:
La solution c'est l'
-npersocket 4
. Il suffit de le régler à deux fois le nombre de cœurs de PROCESSEUR sur chaque prise et il enverra 2 processus pour chaque core. Ils ne seront pas liés à l'cœurs, mais ils seront distribuer eux-mêmes sur leur propre.OriginalL'auteur Wug
Si vous utilisez PBS, ou quelque chose comme ça, je dirais que ce genre de présentation:
qsub -l select=128:ncpus=40:mpiprocs=16 -v NPROC=2048./pbs_script.csh
Dans le présent document, j'sélectionnez 128 nœuds de calcul, qui ont 40 cœurs, et 16 d'entre eux. Dans mon cas, j'ai 20 physique cœurs par nœud.
Dans cette présentation, je bloque tous les 40 cœurs du nœud et personne ne peut utiliser ces ressources. il permet d'éviter les autres peuples de l'aide de la même nœud, et en concurrence avec votre travail.
OriginalL'auteur Junqueira-Junior
À l'aide de Open MPI 4.0, deux commandes:
mpirun --oversubscribe -c 8 ./a.out
et
mpirun -map-by hwthread:OVERSUBSCRIBE -c 8 ./a.out
a fonctionné pour moi (j'ai un Ryzen 5 processeur à 4 cœurs et 8 cœurs logiques).
J'ai testé avec une boucle qui comprend les opérations sur les nombres réels. Tous les threads logiques sont utilisés, mais il semble qu'il n'y a pas d'accélération avantage puisque le calcul prend le double de la quantité de temps par rapport à l'utilisation
-c 4
option (avec pas d'un dépassement).OriginalL'auteur Tofi