Al escribir el código MPI 3.0, ¿debería pasar argcy argva la MPI_Initllamada o no, y por qué?
EDITAR: Dado que la respuesta de Bill Barth planteó algunas preguntas, quiero hacer algunos comentarios:
- Pasar
argc/argvno es necesario desde MPI 1.1. - La pregunta es específicamente sobre por qué debería / no debería pasar
argc/argv( por qué no debería, entonces no es realmente una respuesta). - Aún así, a veces no puede pasar
argc/argvaMPI_Init(escribir una biblioteca que usa inicialización estática para iniciar MPI si main está fuera de su control y MPI es un detalle de implementación).
EDIT2: La pregunta por qué noMPI_Init(argc, argv) usarías ha llegado con demasiada frecuencia ahora. Algunos motivos:
No es posible hacerlo por razones de compatibilidad con implementaciones MPI <1.1 antiguas / no conformes / compatibles, ya que si está utilizando las funciones MPI2 o MPI3, no funcionarán de todos modos.
MPI_Init()inicializa el tiempo de ejecución de MPI de la misma manera queMPI_Init(argc, argv)MPI_Init(argc, argv)elimina los argumentos que se pasan a la MPI tiempo de ejecución deargc, yargve inicializa MPI. AFAIK es la única forma de limpiarargcy,argvpor lo tanto, si necesita que estos no tengan argumentos MPI, debe usarlo.MPI_Init()se puede usar en más situaciones queMPI_Init(argc, argv). Por ejemplo, su biblioteca que usa MPI como detalle de implementación puede probar si MPI se inicializa, y si no, llameMPI_Init()y sucederá lo correcto. Su usuario no sabe que está utilizando MPI, no necesita pasarargc,argva la biblioteca, no necesita cambiar su principal (en caso de que se está llevando sin argumentos) para utilizar su biblioteca ....

MPI_Init()que tiene que obtener correctamente los argumentos a los que pasasmpirun/ dempiexecalguna manera (no se especifica cómo), y dado queMPI_Init()se pueden usar en más situaciones queMPI_Init(argc, argv)(y sin soluciones), no lo hago ' Realmente no veo el punto de usarMPI_Init(argc, argv)si está apuntando a MPI 3.0.argcyargvpartir de argumentos MPI e inicializar MPI, useMPI_Init(argc, argv), de lo contrarioMPI_Init()está bien (y a veces es necesario).Respuestas:
Definitivamente los pasaría, pero pasaría los punteros como este MPI_init (& argc, & argv), permitiendo una llamada perfectamente válida MPI_init (NULL, NULL) en su función.
fuente
No sé si hay algo nuevo en el estándar 3.0 que lo hace opcional en C / C ++ para no pasarlos, pero definitivamente los pasaría. No sé el estado actual, pero en el pasado muchas implementaciones pasaron argumentos adicionales de la línea de comandos a su programa cuando se ejecutaron y luego los editaron
MPI_Init(). Si desea utilizar argumentos de línea de comandos para pasar opciones a su programa, si no deja que la implementación realice su edición, deberá interpretar tanto sus argumentos como un número y estilo de argumentos potencialmente desconocido de la implementación particular Tu estas usando. Es muy probable que estos argumentos varíen de una implementación a otra.Es bastante normal que llamar
MPI_Init()conargcyargv, ¿por qué no?fuente
mpirun/mpiexeccon algunos parámetros,mpirunpuedo configurar algunas variables de entorno antes de iniciar mi programa y luego leerlas desde adentroMPI_Init. (2) No he probado todas las implementaciones posibles, pero como dice la pregunta, solo estoy interesado en las implementaciones compatibles con MPI 3.0. No hay muchos de los que son arcanos .