由于 MPI-2 取消了 MPI-1 中的限制,即编译实现可能要求参数与argc
以下参数相同,因此您无需四处走动:argv
MPI_Init
main
在 MPI-2 实现中不允许强加此要求。需要符合 MPI 的实现以允许应用程序NULL
同时传递.argc
argv
main
但是您仍然必须测试 MPI 是否已经初始化,因为MPI_Init()
(or MPI_Init_thread()
) 应该被调用不超过一次。这是使用 完成的MPI_Initialized()
,因此您的代码应如下所示:
int initialized, finalized;
MPI_Initialized(&initialized);
if (!initialized)
MPI_Init(NULL, NULL);
// Perform work in parallel
...
// You also need this when your program is about to exit
MPI_Finalized(&finalized);
if (!finalized)
MPI_Finalize();
请注意,在应用程序的整个生命周期内,MPI 只能被初始化然后最终完成一次。如果要多次调用该函数,则围绕一个函数代码块MPI_Init() ... MPI_Finalize()
将不起作用,即 MPI 的运行方式与具有并行区域的 OpenMP 的运行方式不同。
顺便说一句,如果我可以初始化MPI int func,那么此时每个进程中是否都存在A?
一个正在运行的 MPI 程序由多个进程组成,这些进程具有自己的私有地址空间。通常这些是同一程序代码的多个副本(所谓的单程序多数据或 SPMD 范例),但也可以是多个程序的多个副本,编写为一起工作(也称为多程序多数据或 MPMD)。SPMD 是更简单和更常见的情况,其中所有进程执行完全相同的代码,直到它们的 MPI 等级用于将执行分支到多个方向。所以是的,A
存在于每个进程中,如果前面的计算中不涉及(伪)随机数/事件,那么A
在初始化 MPI 库之前,每个 MPI 进程中都将具有相同的值。注意MPI_Init()
与任何其他库调用一样,它只是一个常规库调用。它不会改变用户内存的内容——它只会让大量正在运行的 MPI 进程相互了解,并使它们能够相互通信,从而使它们能够共同工作以解决特定问题。