通过MPI运行时传播argc和argv的内容

通过MPI运行时传播argc和argv的内容,mpi,command-line-arguments,Mpi,Command Line Arguments,一致性MPI程序依赖MPI运行时为具有相同argc和argv内容的每个列组启动进程是否有效?或者是否有必要从指定的主级广播内容?为了澄清,仅保证在调用MPI_Init()之后定义argc/argv,即使调用之前所有进程都存在。这就是为什么MPI_Init()使用指向argc和argv的指针,特别是为了通过MPI_Init()调用在所有进程上初始化它们 因此,您必须使用: MPI_Init(&argc, &argv); 而不是 MPI_Init(NULL, NULL); 实际上

一致性MPI程序依赖MPI运行时为具有相同argc和argv内容的每个列组启动进程是否有效?或者是否有必要从指定的主级广播内容?

为了澄清,仅保证在调用MPI_Init()之后定义argc/argv,即使调用之前所有进程都存在。这就是为什么MPI_Init()使用指向argc和argv的指针,特别是为了通过MPI_Init()调用在所有进程上初始化它们

因此,您必须使用:

MPI_Init(&argc, &argv);
而不是

MPI_Init(NULL, NULL);

实际上,许多MPI实现在Init调用之前提供命令行参数,但您不应该依赖于此。

只是为了澄清,只能保证在调用MPI_Init()之后定义argc/argv,即使在调用之前所有进程都存在。这就是为什么MPI_Init()使用指向argc和argv的指针,特别是为了通过MPI_Init()调用在所有进程上初始化它们

因此,您必须使用:

MPI_Init(&argc, &argv);
而不是

MPI_Init(NULL, NULL);

实际上,许多MPI实现在Init调用之前提供命令行参数,但您不应该依赖于此。

该标准没有明确说明情况是否如此,因为它试图抽象出MPI列组形成的实际过程

一方面,第8.8节便携式MPI进程启动建议存在一个名为
mpiexec
的便携式进程启动器(如果执行环境需要的话),建议将启动器视为
MPI\u COMM\u SPAWN
的命令行版本

另一方面,
MPI_COMM_SPAWN
在其参数中包含一组要传递给派生进程的命令行参数,以及那些应该传递的命令行参数(第10.3.2节启动进程和建立通信):

如果操作系统允许,则会向程序提供参数。[……]

但引用的一段之后的一段是:

如果Fortran实现提供了允许程序获取其参数的例程,则参数可能通过该机制可用。在C语言中,如果操作系统不支持出现在
main()
argv
中的参数,MPI实现可以将参数添加到传递给MPI_INIT的
argv
中。(强调矿山)


因此,我认为:建议MPI实现尽最大努力为所有级别提供
mpiexec
命令的命令行参数,但是没有给出绝对的保证。

该标准没有明确说明情况是否如此,因为它试图抽象出MPI等级形成的实际过程

一方面,第8.8节便携式MPI进程启动建议存在一个名为
mpiexec
的便携式进程启动器(如果执行环境需要的话),建议将启动器视为
MPI\u COMM\u SPAWN
的命令行版本

另一方面,
MPI_COMM_SPAWN
在其参数中包含一组要传递给派生进程的命令行参数,以及那些应该传递的命令行参数(第10.3.2节启动进程和建立通信):

如果操作系统允许,则会向程序提供参数。[……]

但引用的一段之后的一段是:

如果Fortran实现提供了允许程序获取其参数的例程,则参数可能通过该机制可用。在C语言中,如果操作系统不支持出现在
main()
argv
中的参数,MPI实现可以将参数添加到传递给MPI_INIT的
argv
中。(强调矿山)


因此,我将其理解为:建议MPI实现尽最大努力为所有级别提供
mpiexec
命令的命令行参数,但没有给出绝对保证。

该建议在MPI 2.0中已经过时。看见一致性实现需要允许传递NULL。(这与原始问题的要求不同,即在进程启动之前,运行时是否在argc+argv中提供命令行参数。)该建议在MPI 2.0中已经过时。看见一致性实现需要允许传递NULL。(这与原始问题的要求不同,即在进程启动之前,运行时是否在argc+argv中提供命令行参数。)