这就是我们使用 MPI_Init 函数的方式
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
为什么 MPI_Init 使用指向 argc 和 argv 的指针而不是 argv 的值?
根据此处所述的答案:
大多数 MPI 实现将删除此函数中所有与 mpirun 相关的参数,以便在调用它之后,您可以处理命令行参数,就好像它是正常的(非 mpirun)命令执行一样。
即之后
mpirun -np 10 myapp myparam1 myparam2
argc = 7(?) 因为 mpirun 参数(它似乎也添加了一些)并且 myparam1 和 myparam2 的索引是未知的
但是之后
MPI_Init(&argc, &argv)
argc = 3 并且 myparam1 在 argv[1] 并且 myparam2 在 argv[2]
显然这超出了标准,但我已经在 linux mpich 上对其进行了测试,而且似乎确实如此。如果没有这种行为,将很难(不可能?)区分应用程序参数和 mpirun 参数。
我的猜测可能允许从命令行中删除 mpi 参数。通过指针传递参数计数允许从 main 点修改其值。
根据 OpenMPI 手册页: MPI_Init(3) 手册页
Open MPI 接受 C/C++ argc 和 argv 参数给 main,但既不修改、解释也不分发它们。
我不是专家,但我相信简单的答案是您正在使用的每个节点都在使用自己的代码副本。传递这些参数允许每个节点访问 argc 和 argv,即使它们没有通过命令行界面传递。调用 MPI_Init 的原始节点或主节点将传递这些参数。MPI_Init 也允许其他节点访问它们。
只传递两个指针的开销较小。