通过MPI运行时传播argc和argv的内容
一致性MPI程序依赖MPI运行时为具有相同argc和argv内容的每个列组启动进程是否有效?或者是否有必要从指定的主级广播内容?为了澄清,仅保证在调用MPI_Init()之后定义argc/argv,即使调用之前所有进程都存在。这就是为什么MPI_Init()使用指向argc和argv的指针,特别是为了通过MPI_Init()调用在所有进程上初始化它们 因此,您必须使用:通过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_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中提供命令行参数。)