为什么MPI_Init接受指向argc和argv的指针?

Roh*_*nga 23 mpi argv argc

这就是我们如何使用MPI_Init函数

int main(int argc, char **argv)
{
    MPI_Init(&argc, &argv);
…
}
Run Code Online (Sandbox Code Playgroud)

为什么MPI_Init使用指向argc和argv的指针而不是argv的值?

小智 19

根据这里所说的答案:

通过MPI命令行传递参数

大多数MPI实现将删除此函数中所有与mpirun相关的参数,以便在调用它之后,您可以解决命令行参数,就像它是正常(非mpirun)命令执行一样.

即之后

mpirun -np 10 myapp myparam1 myparam2
Run Code Online (Sandbox Code Playgroud)

argc = 7(?)因为mpirun参数(它似乎也添加了一些)并且myparam1和myparam2的索引是未知的

但是之后

MPI_Init(&argc, &argv)
Run Code Online (Sandbox Code Playgroud)

argc = 3,myparam1位于argv [1],myparam2位于argv [2]

显然这不符合标准,但我已经在linux mpich上进行了测试,看起来确实如此.没有这种行为,将应用参数与mpirun参数区分开来将是非常困难的(不可能的?).

  • 至少 OpenMPI 3.1.1 中的 `mpirun` 在调用子程序之前剥离了它的参数,所以即使在调用 `MPI_Init` 之前你也会得到 `argc = 3`。 (2认同)

Any*_*orn 4

我猜测可能允许从命令行删除 mpi 参数。通过指针传递参数计数允许从 main 点修改其值。

  • 解析 MPI 特定参数。我没有 MPI 的示例,但 GTK GUI 工具包具有几乎相同的“gtk_init”函数,它过滤掉一些常见的 X 命令行选项,例如“--display”和“--screen”。 (2认同)