Domanda

Voglio eseguire facilmente le comunicazioni collettive indepandently su ogni macchina del mio cluster. Diciamo che ho 4 macchine con 8 core su ogni, il mio programma mpi correrebbe 32 task MPI. Quello che vorrei è, per una data funzione:

  • su ciascun host, un solo compito di eseguire un calcolo, altre attività non fare nulla durante questo calcolo. Nel mio esempio, 4 task MPI farà il calcolo, altri 28 sono in attesa.
  • una volta che il calcolo è fatto, ogni attività MPI su ogni eseguirà una comunicazione collettiva SOLO alle attività locali (compiti in esecuzione sullo stesso host).

Concettualmente, ho capito devo creare un comunicatore per ogni host. Ho cercato in giro, e ho trovato niente da fare esplicitamente che. Io non sono veramente confortevole con gruppi MPI e comunicatori. Ecco le mie due domande:

  • è MPI_Get_processor_name è abbastanza unica per un tale comportamento?
  • , più in generale, avete un pezzo di codice che fare?
È stato utile?

Soluzione

La specifica dice che MPI_Get_processor_name restituisce "Un identificatore unico per l'attuale (al contrario di virtuale) del nodo", quindi penso che si sarebbe ok con quello. Immagino che tu faresti un riuniscono per assemblare tutti i nomi host e gruppi quindi assegnare di processori per andare fuori e fare i loro comunicatori; o MPI_COMM_WORLD DUP, trasformare i nomi in hash interi, e utilizzare mpi_comm_split per partizionare il set.

Si potrebbe anche prendere la janneb approccio suggerisce e le opzioni di utilizzo implementazione specifici per mpirun per assicurare che i compiti assegna implementazione MPI in quel modo; OpenMPI utilizza --byslot per generare questo ordinamento; con mpich2 è possibile utilizzare -print-rank-mappa per vedere la mappatura.

Ma è davvero quello che vuoi fare? Se gli altri processi sono seduti inattivo mentre un processore sta lavorando, come questo è meglio di tutti in modo ridondante di eseguire il calcolo? (O è questo O intensivo molto di memoria o di I /, e siete preoccupati contesa?) Se avete intenzione di fare un sacco di questo - trattamento di parallelizzazione su nodo molto diverso da parallelizzazione off-node - allora si consiglia di pensare a modelli di programmazione ibridi -. che eseguono un compito MPI per nodo e MPI_spawning sottocompiti o usando OpenMP per le comunicazioni on-node, sia come suggerito da HPM

Altri suggerimenti

Non credo che (il pensiero educato, non definitiva) che sarete in grado di fare ciò che si vuole del tutto dall'interno del programma di MPI.

La risposta del sistema a una chiamata a MPI_Get_processor_name dipende dal sistema; sul sistema che potrebbe tornare node00, node01, node02, node03 a seconda dei casi, o potrebbe tornare my_big_computer per qualsiasi processore si sono effettivamente in esecuzione su. Il primo è più probabile, ma non è garantito.

Una strategia potrebbe essere quella di avviare 32 processi e, se è possibile determinare quale nodo ciascuno è in esecuzione, partizionare communicator in 4 gruppi, uno per ogni nodo. In questo modo è possibile gestire inter- e intra-comunicazioni se stessi come si desidera.

Un'altra strategia potrebbe essere quella di iniziare 4 processi e li pin a nodi diversi. Come si pin processi di nodi (o processori) dipenderà dalla vostra runtime MPI e qualsiasi sistema di gestione dei lavori si potrebbe avere, come ad esempio Grid Engine. Questo probabilmente comporterà delle variabili di ambiente - ma non ci dicono nulla circa il sistema run-time, quindi non possiamo immaginare quello che potrebbe essere. Si potrebbe quindi avere ciascuno dei 4 processi dinamicamente escursione ulteriori 7 (o 8) processi e pin quelli allo stesso nodo come il processo iniziale. Per fare questo, leggere sul tema della intercommunicators e la documentazione del sistema in fase di esecuzione.

Una terza strategia, ora sta diventando un po 'pazzo, sarebbe quello di iniziare 4 programmi separati MPI (8 processi ciascuno), uno su ogni nodo del cluster, e di unirsi a loro come loro esecuzione. Leggi MPI_Comm_connect e MPI_Open_port per i dettagli.

Infine, per divertimento extra, si potrebbe prendere in considerazione ibridare il vostro programma, in esecuzione di un unico processo MPI su ogni nodo, e hanno ciascuno dei singoli processi di eseguire un programma OpenMP memoria condivisa (sotto).

In genere l'ambiente di runtime MPI può essere controllato per esempio da variabili d'ambiente come le attività sono distribuiti su nodi. L'impostazione predefinita tende ad essere l'allocazione sequenziale, che è, per il suo esempio con 32 task distribuiti su 4 macchine 8-core che avresti avuto

  • macchina 1: MPI ranghi 0-7
  • macchina 2: MPI ranghi 8-15
  • macchina 3: MPI ranghi 16-23
  • macchina 4: MPI ranghi 24-31

E sì, MPI_Get_processor_name dovrebbe ottenere il nome dell'host in modo da poter capire dove i confini tra padroni di casa sono.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top