MPI: ottenere il numero di nodi (non processi) in un comunicatore
-
25-10-2019 - |
Domanda
Sto lavorando con programmi MPI su un supercomputer SMP. Desidero identificare i processi condividono lo stesso nodo, ad esempio impostando una chiave intero che è uguale in tutti i processi sullo stesso nodo, e diverso da un nodo ad un altro. L'obiettivo sarebbe quindi di utilizzare questa chiave per dividere un comunicatore e hanno sub-comunicatori in grado di raccogliere solo i processi nello stesso nodo.
Quindi, la funzione sarà simile
int identify_node(MPI_Comm* comm); // returns a key characterizing a node
Supponendo una distribuzione semplice di processi come 0,1,2,3 su node_1, 4,5,6,7 su node_2, ecc si tratta di una semplice formula, ma vorrebbe ottenere lo stesso risultato senza ipotesi sulla distribuzione.
ho un idea di come farlo usando MPI_Get_processor_name: calcolando un hash del nome e assumere non ci sono due nomi otterrà lo stesso hash (non mi piace questo perché se un giorno ho due nomi con lo stesso hash , sarà difficile tenere traccia del problema), o usare qualche tipo di algoritmo accordo tra processi (quale? non lo so ancora).
Come hai fatto (in modo efficiente se possibile)?
Matthieu
Soluzione
Hai ragione che un ipotesi sulla distribuzione sarebbe poco saggio, dal momento rango riordino è in realtà un up-and-coming tecnica per migliorare le prestazioni a costo di quella regolarità.
Un algoritmo di hashing buon sul valore di ritorno di MPI_Get_processor_name
dovrebbe essere abbastanza sicuro, ma se si vuole controllare due volte, si può sempre raccogliere i nomi reali all'interno di ogni gruppo utilizzando MPI_Gatherv
e confrontare direttamente loro.
indirizzi questa domanda le stesse preoccupazioni.