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