我是否应该将命令行参数传递给 MPI_Init?

计算科学 C++ C mpi
2021-11-25 11:56:48

在编写 MPI 3.0 代码时,我应该传递argc和调用还是不传递argvMPI_Init为什么?

编辑:由于比尔巴特的回答提出了一些问题,我想发表一些评论:

  • 自 MPI 1.1 起,不需要传递argc/ 。argv
  • 问题具体是关于为什么应该/不应该通过argc/ argv为什么你不应该不是真正的答案)。
  • 尽管如此,有时您仍然无法传递argc/argvMPI_Init(如果 main 不在您的控制范围内并且 MPI 是实现细节,则编写使用静态初始化来启动 MPI 的库)。

EDIT2:你为什么不使用MPI_Init(argc, argv)的问题现在出现得太频繁了。一些原因:

  • 为了与旧的/不兼容的/兼容的 MPI < 1.1 实现兼容而这样做是不可能的,因为如果您使用的是 MPI2 或 MPI3 功能,那么这些功能无论如何都不起作用。

  • MPI_Init()以相同的方式初始化 MPI 运行时MPI_Init(argc, argv)

  • MPI_Init(argc, argv)从 中删除传递给 MPI 运行时的参数argcargv 初始化 MPI。AFAIK 这是清理的唯一方法argcargv所以如果你需要这些没有 MPI 参数,你需要使用它。

  • MPI_Init()可以用在更多的情况下MPI_Init(argc, argv)例如,使用 MPI 作为实现细节的库可以测试 MPI 是否已初始化,如果未初始化,则调用MPI_Init()并且会发生正确的事情。您的用户不知道您正在使用 mpi,不需要将 , 传递argcargv您的库,不需要更改他们的 main(如果它不带参数)来使用您的库....

3个回答

我肯定会传递它们,但我会传递像 MPI_init(&argc,&argv) 这样的指针,允许在你的函数中完全有效地调用 MPI_init(NULL,NULL)。

我不知道 3.0 标准中是否有一些新的东西使它在 C/C++ 中可选不通过它们,但我肯定会通过它们。我不知道当前状态,但过去许多实现在执行时向您的程序传递了额外的命令行参数,然后在MPI_Init(). 如果您想使用命令行参数将选项传递给您的程序,如果您不让实现进行编辑,那么您将不得不解释您的参数以及来自特定实现的潜在未知数量和样式的参数您正在使用。这些论点也很可能因实施而异。

MPI_Init()argcand打电话是很正常的,那argv你为什么不呢?

该标准建议(粗体):

MPI 标准没有说明程序在 MPI_INIT 之前或 MPI_FINALIZE 之后可以做什么。在 MPICH 实现中,您应该尽可能少地执行.

该版本的一个副作用(argv, argc)是它迫使您放入MPI_Initmain 而不是更深的调用堆栈。不是万无一失的,但它隐含地告诉你要MPI_Init尽早main而不是在一个可以调用两次的函数中。

我认为这就是您在运行时系统中所拥有的;例如,最好在编译时强制执行此操作。