2013-03-22 12 views
7

Ho implementato una connessione peer-to-peer in MPI utilizzando MPI_Open_port e MPI_Comm_accept. Eseguo un server e un programma client utilizzandoDifferenza tra l'esecuzione di un programma con e senza mpirun

[email protected]:~$ mpirun server 
[email protected]:~$ mpirun client 

su computer diversi. Ho notato che

[email protected]:~$ ./server 
[email protected]:~$ ./client 

funziona anche bene. Sai se c'è qualche differenza tra l'avvio di un file eseguibile MPI con e senza mpirun?

Ovviamente, non posso fornire ulteriori parametri (ad esempio mpirun --mca btl self,openib) e il grado di tutti i processi è 0, che è tutto perfettamente valido. Ma c'è qualcosa di meno ovvio?

risposta

15

esecuzione senza mpirun/mpiexec si chiama "Singleton MPI_INIT" e fa parte delle raccomandazioni MPI per le implementazioni di alta qualità, che si trova sotto §10.5.2 nell'ultima MPI standard di documento:

uno di alta qualità l'implementazione consentirà a qualsiasi processo (compresi quelli non avviati con un meccanismo di "applicazione parallela") di diventare un processo MPI chiamando lo MPI_INIT. Un tale processo può quindi connettersi ad altri processi MPI utilizzando le routine MPI_COMM_ACCEPT e MPI_COMM_CONNECT o generare altri processi MPI. MPI non impone questo comportamento, ma lo incoraggia fortemente laddove tecnicamente fattibile.

Se un processo entra MPI_INIT e determina che non sono state prese misure speciali (cioè, non è stato dato le informazioni per formare un MPI_COMM_WORLD con altri processi) riesce e forma un programma MPI singoletto, cioè quella in cui MPI_COMM_WORLD ha dimensioni 1.

utilizzando mpirun nel tuo caso è il meccanismo "applicazione parallela", menzionato nel testo standard. Fornisce MPI_INIT con le informazioni necessarie per stabilire MPI_COMM_WORLD su tutti i processi avviati. Senza le informazioni dal mpirun i processi possono essere eseguiti solo come istanze MPI singleton e quindi tutti hanno il valore 0 (che è OK, poiché ogni MPI_COMM_WORLD è separato).