2010-04-15 10 views
16

questo è il modo in cui utilizzare la funzione MPI_InitPerché MPI_Init accetta puntatori su argc e argv?

int main(int argc, char **argv) 
{ 
    MPI_Init(&argc, &argv); 
… 
} 

puntatori uso Perché MPI_Init a argc e argv invece di valori di argv?

+2

Vengono passati per riferimento per consentire a un'implementazione MPI di fornirli in ambienti in cui gli argomenti della riga di comando non vengono forniti al main. http://www.mpi-forum.org/docs/mpi-11-html/node151.html qualcuno può far luce su questo con un esempio? –

risposta

3

la mia ipotesi per consentire potenzialmente di rimuovere gli argomenti mpi dalla riga di comando. il conteggio degli argomenti che passa per puntatore consente di modificarne il valore dal punto di main.

+0

perché dovrebbero farlo? cosa succede se esamino gli argomenti prima di chiamare MPI_Init –

+2

Per analizzare argomenti specifici MPI. Non ho un esempio per MPI, ma GTK GUI toolkit ha quasi la stessa funzione 'gtk_init', che filtra alcune comuni opzioni della linea di comando X, come' --display' e '--screen'. –

-3

Meno costi generali per passare solo due puntatori.

+0

in realtà intendevo invocare la funzione come MPI_Init (argc, argv); –

+1

che è anche meno spese generali. –

+0

Bene, molte volte in pratica il codice MPI è l'intero eseguibile quindi avrebbe senso passare tutti gli argomenti della riga di comando. Ricorda però che argc e argv sono solo nomi di variabili locali. Dentro il tuo codice prima di chiamare MPI_Init() puoi passarlo come vuoi. –

16

Secondo la risposta dichiarato qui:

Passing arguments via command line with MPI

implementazioni maggior MPI rimuoverà tutti gli argomenti mpirun legati in questa funzione in modo che, dopo aver chiamato, è possibile affrontare argomenti della riga di comando come se erano un'esecuzione di comando normale (non mpirun).

cioè dopo

mpirun -np 10 myapp myparam1 myparam2 

argc = 7 (?) A causa dei parametri mpirun (sembra anche aggiungere un po ') e gli indici di myparam1 e myparam2 sono sconosciuti

ma dopo

MPI_Init(&argc, &argv) 

argc = 3 e myparam1 è argv [1] e myparam2 è argv [2]

Apparentemente questo è al di fuori dello standard, ma l'ho provato su linux mpich e certamente sembra essere il caso. Senza questo comportamento sarebbe molto difficile (impossibile?) Distinguere i parametri dell'applicazione dai parametri di mpirun.

1

Non sono un esperto, ma credo che la semplice risposta sia che ogni nodo con cui si sta lavorando sta lavorando con la propria copia del codice. Passare questi argomenti consente a ciascuno dei nodi di avere accesso ad argc e argv anche se non sono stati passati attraverso l'interfaccia della riga di comando. Il nodo originale o principale che chiama MPI_Init è ha passato questi argomenti. MPI_Init consente agli altri nodi di accedervi.