我要问的是我是否有这样的事情:
int main(int argc, char *argv[]) //<---input from command line
{
我是否需要使用 MPI_Bcast 将该数据发送到所有进程,或者是否所有进程都获取命令行输入数据?
如果您使用 MPI_Init(&argc,&argv) 这可以解决您的问题:)
无需广播任何内容;)
将完整的命令行传递给所有 MPI 进程是初始启动机制的一部分。MPI 标准有意省略了这一点,但大多数 MPI 实现都做正确的事情 (tm),并且实际上将所有命令行参数传递给 MPI 作业中的所有进程。甚至可以将不同的命令行参数传递给不同的等级,甚至可以在单个 MPI 作业中启动多个不同的可执行文件。
例如,以下命令将启动 10 个相同可执行文件的副本,program
并为每个副本传递相同的命令行参数arg1
和arg2
:
$ mpiexec -n 10 program arg1 arg2
以下命令将启动 10 个副本program
并将其传递arg1
给前五个进程(等级 0 到 4)和arg2
接下来的五个进程(等级 5 到 9):
$ mpiexec -n 5 program arg1 : -n 5 program arg2
以下命令将启动 5 个program1
with argumentsarg1
副本和 5 个program2
with arguments副本arg2
:
$ mpiexec -n 5 program1 arg1 : -n 5 program2 arg2
调用MPI_Init()
与启动 MPI 进程的机制无关。在非常古老的 MPI-1 规范中需要传递argc
和argv
到MPI_Init
,因为许多 MPI 实现使用额外的命令行参数来引导 MPI 作业。然而,这个要求在某种程度上是人为的,因为 Fortran 绑定没有那个参数(在 Fortran 77 中没有获取命令行参数的标准方法),并且以某种方式它们被正确实现。因此 MPI-2 删除了这一要求并允许NULL
s 改为传递,以便可以编写通常无法访问命令行参数的并行库。因此,大多数 MPI 实现转而通过环境变量或其他特定于操作系统的机制提供所有必要的引导信息。