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

Posted

技术标签:

【中文标题】为啥 MPI_Init 接受指向 argc 和 argv 的指针?【英文标题】:Why does MPI_Init accept pointers to argc and argv?为什么 MPI_Init 接受指向 argc 和 argv 的指针? 【发布时间】:2011-02-08 05:41:27 【问题描述】:

这就是我们使用 MPI_Init 函数的方式

int main(int argc, char **argv)

    MPI_Init(&argc, &argv);
…

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

【问题讨论】:

它们通过引用传递以允许 MPI 实现在不向 main 提供命令行参数的环境中提供它们。 mpi-forum.org/docs/mpi-11-html/node151.html 有人可以举例说明这一点吗? 【参考方案1】:

根据 OpenMPI 手册页: MPI_Init(3) man page

Open MPI 接受 C/C++ argc 和 argv 参数给 main,但既不修改、解释也不分发它们。

【讨论】:

MPICH 并没有提出同样的主张,但我对 MPICH 3.3.2 的小实验表明,在初始化 mpi 之前,argv 中的所有无关参数都已清理完毕,因此似乎不需要用 &argc 和 &argv 做任何事情。【参考方案2】:

我不是专家,但我相信简单的答案是您正在使用的每个节点都使用自己的代码副本。传递这些参数允许每个节点访问 argc 和 argv,即使它们没有通过命令行界面传递。 调用 MPI_Init 的原始节点或主节点传递了这些参数。 MPI_Init 也允许其他节点访问它们。

【讨论】:

【参考方案3】:

根据此处所述的答案:

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 参数。

【讨论】:

至少来自 OpenMPI 3.1.1 的 mpirun 甚至在调用子程序之前剥离了它的参数,所以你甚至会在调用 MPI_Init 之前得到 argc = 3 我很好奇你观察到这种行为的分布。这是有道理的,但我无法用 mpich 或 openmpi 重现它。【参考方案4】:

只传递两个指针的开销较小。

【讨论】:

其实我的意思是调用函数为 MPI_Init(argc, argv); 嗯,在实践中很多时候 MPI 代码是整个可执行文件,因此传递所有命令行参数是有意义的。但请记住,argc 和 argv 只是局部变量名。在你调用 MPI_Init() 之前,你可以在你的代码中传递你想要的任何东西。【参考方案5】:

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

【讨论】:

他们为什么要这样做?如果我在调用 MPI_Init 之前检查参数会怎样 解析 MPI 特定参数。我没有 MPI 的示例,但 GTK GUI 工具包具有几乎相同的 gtk_init 功能,可以过滤掉一些常见的 X 命令行选项,例如 --display--screen @RohitBanga 您可以检查argcargv 的内容在调用MPI_Init 之前。此外,如果您想保留原件,您可以将虚拟参数传递给MPI_Init。 :)(我同意这不是很优雅,但有一个解决方法。)

以上是关于为啥 MPI_Init 接受指向 argc 和 argv 的指针?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MPI_Barrier 在 C++ 中会导致分段错误

MPI基础知识

将“argc”拼写为“argv”会导致 char ** 和 int 之间的比较 - 为啥?

main中的argv和argc

int main(int argc,char *argv[]) 解释

c语言中命令行参数argc,argv[ ]