这就是我们如何使用MPI_Init函数
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
为什么MPI_Init使用指向argc和argv的指针而不是argv的值?
答案 0 :(得分:19)
根据这里所说的答案:
Passing arguments via command line with MPI
大多数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参数区分开来将是非常困难的(不可能?)。
答案 1 :(得分:4)
我的猜测可能允许从命令行中删除mpi参数。 通过指针传递参数count允许从main点修改其值。
答案 2 :(得分:1)
我不是专家,但我相信简单的答案是,您正在使用的每个节点都在使用自己的代码副本。传递这些参数允许每个节点都可以访问argc和argv,即使它们没有通过命令行界面传递它们。 调用MPI_Init 的原始节点或主节点传递了这些参数。 MPI_Init也允许其他节点访问它们。
答案 3 :(得分:1)
根据OpenMPI手册页: MPI_Init(3) man page
Open MPI接受main的C / C ++ argc和argv参数,但既不修改,解释也不分发它们。
答案 4 :(得分:-3)
传递两个指针的开销较小。