Al escribir el código MPI 3.0, ¿debería pasar argc
y argv
a la MPI_Init
llamada o no, y por qué?
EDITAR: Dado que la respuesta de Bill Barth planteó algunas preguntas, quiero hacer algunos comentarios:
- Pasar
argc
/argv
no 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
/argv
aMPI_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
, yargv
e inicializa MPI. AFAIK es la única forma de limpiarargc
y,argv
por 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
,argv
a 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
/ dempiexec
alguna 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.argc
yargv
partir 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()
conargc
yargv
, ¿por qué no?fuente
mpirun
/mpiexec
con algunos parámetros,mpirun
puedo 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 .