2012-02-07 27 views
14

Estoy usando llamadas MPI para ejecutar un procedimiento en múltiples procesos usando C++. Las primeras líneas de mi función principal aspecto:Pasando argumentos a través de la línea de comandos 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]); 

Ahora cuando yo haga y ejecutar mi programa usando

mpiexec -n 1 program 10 10 

Quiero x e y que se asignará a los valores 10 y 10, como se son los argumentos 4 y 5 pasados. Pero esto no está sucediendo y asigna estas variables a 0 y 0 en consecuencia. y mi programa no se ejecuta como se desea.

Tengo mi código de serie ejecutándose cuando cambio estos números. Es solo que soy nuevo en MPI.

¿Puede sugerirme dónde me estoy equivocando?

+0

¿Ha intentado simplemente imprimir el contenido de 'argv'? ¿Cuál es el resultado? – suszterpatt

+0

Lo hice. Cuando imprimí el contenido en la matriz, reconoció los dos argumentos 10, 10 pero no en las posiciones 4 y 5. – freshmaster

+0

Parece estar leyéndolos como argv [1] y argv [2]. Resolví mi problema, sí, pero quería saber por qué sucede esto. No estoy exactamente entendiendo MPI_Init. – freshmaster

Respuesta

15

En la mayoría de las implementaciones de MPI en Linux/Windows/Mac OSX, cuando llama al MPI_Init(&argc, &argv), la lista de argumentos se modifica como si hubiera ejecutado el problema de serie como program 10 10; se come la lista de argumentos hasta el ejecutable, que potencialmente puede contener cualquier cantidad de opciones para el comando mpirun.

La norma no especifica esto; el estándar deja un montón de cosas sobre los procesos de inicio y el proceso de inicialización algo vago, ya que MPI tiene que trabajar en sistemas que se comportan de manera muy diferente a los sistemas de tipo POSIX. Pero nunca he visto una implementación de MPI en un entorno de tipo POSIX que no hace esto.

(Actualizado para agregar :) El comentario de g.inozemtsev sobre la pregunta es una explicación excelente y concisa sobre por qué sucede.

Cuestiones relacionadas