2010-04-15 31 views
16

esta es la forma en que usamos la función MPI_Init¿Por qué MPI_Init acepta punteros a argc y argv?

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

punteros de uso ¿por qué MPI_Init a argc y argv en lugar de los valores de argv?

+2

Se pasan por referencia para permitir que una implementación de MPI los proporcione en entornos donde los argumentos de línea de comandos no se proporcionan a main. http://www.mpi-forum.org/docs/mpi-11-html/node151.html ¿alguien puede arrojar más luz sobre esto con un ejemplo? –

Respuesta

3

Supongo que puedo permitir eliminar los argumentos de mpi de la línea de comandos. pasar conteo de argumento por puntero permite modificar su valor desde el punto de main.

+0

¿por qué harían eso? ¿Qué pasa si examino los argumentos antes de llamar a MPI_Init –

+2

Para analizar argumentos específicos de MPI? No tengo ejemplos para MPI, pero el kit de herramientas GTK GUI tiene una función 'gtk_init' casi idéntica, que filtra algunas opciones comunes de línea de comandos X, como' --display' y '--screen'. –

-3

Es menor sobrecarga solo para pasar dos punteros.

+0

en realidad me refería a invocar la función como MPI_Init (argc, argv); –

+1

que también es menos sobrecarga. –

+0

Bueno, muchas veces en la práctica, el código MPI es el ejecutable completo, por lo que tendría sentido pasar todos los argumentos de la línea de comandos. Recuerde, sin embargo, argc y argv son solo nombres de variables locales. Dentro de tu código antes de llamar a MPI_Init() puedes pasarlo como quieras. –

16

De acuerdo con la respuesta declaró aquí:

Passing arguments via command line with MPI

implementaciones más MPI eliminará todos los argumentos relacionados mpirun en esta función de manera que, después de llamar a él, puede hacer frente a los argumentos de línea de comandos como si se eran una ejecución de comando normal (no mpirun).

es decir, después

mpirun -np 10 myapp myparam1 myparam2 

argc = 7 (?) Debido a los parámetros mpirun (que también parece añadir un poco) y los índices de myparam1 y myparam2 son desconocidos

pero después

MPI_Init(&argc, &argv) 

argc = 3 y myparam1 está en argv [1] y myparam2 está en argv [2]

Aparentemente esto está fuera del estándar, pero lo he probado en linux mpich y ciertamente parece ser el caso. Sin este comportamiento, sería muy difícil (¿imposible?) Distinguir los parámetros de aplicación de los parámetros mpirun.

1

No soy un experto pero creo que la respuesta simple es que cada nodo con el que está trabajando está trabajando con su propia copia del código. Pasar estos argumentos permite que cada uno de los nodos tenga acceso a argc y argv aunque no se les haya pasado a través de la interfaz de línea de comando. El nodo original o maestro que llama a MPI_Init es pasado estos argumentos. MPI_Init permite que los otros nodos también accedan a ellos.

Cuestiones relacionadas