2011-11-29 15 views
5

Sto lavorando con i programmi MPI su un supercomputer SMP. Vorrei identificare quali processi condividono lo stesso nodo, ad esempio impostando una chiave intera uguale in tutti i processi sullo stesso nodo e diversa da un nodo a un altro. L'obiettivo sarebbe quindi utilizzare questa chiave per dividere un comunicatore e avere sottocomunicatori che raccolgono solo i processi nello stesso nodo.MPI: acquisizione del numero di nodi (non processi) in un comunicatore

Quindi la funzione sarà simile

int identify_node(MPI_Comm* comm); // returns a key characterizing a node 

Supponendo una semplice distribuzione di processi come 0,1,2,3 su node_1, 4,5,6,7 su node_2, ecc è una questione di una formula semplice, ma mi piacerebbe ottenere lo stesso risultato senza alcuna 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 avranno lo stesso hash (non mi piace questo perché se un giorno ho due nomi con lo stesso hash, sarà difficile tracciare il problema), o usare un qualche tipo di algoritmo di accordo tra i processi (quale non lo so ancora).

Come lo faresti (in modo efficiente se possibile)?

Matthieu

risposta

3

Hai ragione che un ipotesi sulla distribuzione sarebbe poco saggio, dal momento rango riordino è in realtà una tecnica up-and-coming per migliorare le prestazioni a costo di quella regolarità.

Un buon algoritmo di hashing sul valore di ritorno di MPI_Get_processor_name dovrebbe essere abbastanza sicuro, ma se si desidera ricontrollare, è sempre possibile raccogliere i nomi effettivi all'interno di ciascun gruppo utilizzando MPI_Gatherv e confrontarli direttamente.

Sembra che lo this question indirizzi le stesse preoccupazioni.

+0

Grazie, la domanda che hai citato è davvero molto vicina. Penso che farò quello che mi consigli: ottenere un hash del nome del processore, quindi eseguire un secondo controllo con MPI_Gatherv. – sunmat

Problemi correlati