2012-02-07 9 views
14

Sto usando le chiamate MPI per eseguire una procedura su più processi usando C++. Le prime righe della mia funzione principale assomigliano:Passare argomenti via linea di comando con MPI

int main(int argc, char *argv[]){ 
int comm_sz; 
int my_rank; 

MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); 
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 

x = atoi(argv[4]); 
y = atoi(argv[5]); 

Ora, quando eseguo ed eseguire il mio programma utilizzando

mpiexec -n 1 program 10 10 

voglio x e y da assegnare i valori di 10 e 10, come sono gli argomenti 4 e 5 passati. Ma questo non sta accadendo e assegna queste variabili a 0 e 0 di conseguenza. e il mio programma non funziona come desiderato.

Ho il mio codice seriale in esecuzione quando cambio questi numeri. È solo che sono nuovo di MPI.

Potete suggerire dove sto andando male?

+0

Hai provato semplicemente a stampare il contenuto di 'argv'? Qual è il risultato? – suszterpatt

+0

L'ho fatto. Quando ho stampato il contenuto nell'array, ha riconosciuto i due argomenti 10, 10 ma non nelle posizioni 4 e 5. – freshmaster

+0

Sembra che li stia leggendo come argv [1] e argv [2]. Ho risolto il mio problema sì, ma volevo sapere perché sta succedendo. Non sto capendo esattamente MPI_Init. – freshmaster

risposta

15

Nella maggior parte delle implementazioni MPI su Linux/Windows/Mac OSX, quando si chiama MPI_Init(&argc, &argv), l'elenco degli argomenti viene modificato proprio come se si fosse eseguito il problema seriale come program 10 10; Mangia l'elenco degli argomenti fino all'eseguibile, che potenzialmente può contenere un numero qualsiasi di opzioni del comando mpirun stesso.

Lo standard non lo specifica; lo standard lascia molte cose sul processo di avvio e il processo di inizializzazione un po 'vago, poiché MPI deve lavorare su sistemi che si comportano in modo molto diverso rispetto ai sistemi di tipo POSIX. Ma non ho mai visto un'implementazione MPI in un ambiente di tipo POSIX che non lo fa.

(aggiornato per aggiungere :) Il commento di g.inozemtsev sulla domanda è un'eccellente spiegazione concisa riguardo a perché ciò accade.

Problemi correlati