8

我想在一个函数中使用多进程,我该怎么做。

如您所知,MPI_Init 需要两个参数:“int argc, char **argv”。这是否意味着我必须在函数定义中添加这两个参数?

我的要求是我想并行化函数中的一个步骤而不是主程序中的步骤。

例如,

func(mat &A, vec &x) {
  some computation on A;
  auto B = sub_mat(A, 0, 10);
  B*x; // I want to parallelize this computation
}
main(){
  mat A;
  vec x;
  func(A, x);
}

我只想在B*x中使用MPI,但是不知道如何初始化MPI?顺便说一句,如果我可以初始化MPI int func,那么此时每个进程中是否都存在A?

帮助我,谢谢!

4

2 回答 2

11

由于 MPI-2 取消了 MPI-1 中的限制,即编译实现可能要求参数与argc以下参数相同,因此您无需四处走动:argvMPI_Initmain

在 MPI-2 实现中不允许强加此要求。需要符合 MPI 的实现以允许应用程序NULL同时传递.argcargvmain

但是您仍然必须测试 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 进程相互了解,并使它们能够相互通信,从而使它们能够共同工作以解决特定问题。

于 2012-07-28T14:27:08.860 回答
0

如果你想MPI_Init在子函数中使用,你必须传递int argc, char **argv给函数,以便传递它。

但是,即使您只想并行化子功能的一部分,您也可以(并且应该为更透明的代码)MPI_Init在程序的早期使用。例如,在其他初始化内容完成之后,或者如果你想在你的并行函数附近使用它,就在你调用函数之前。

原则上,函数不必知道argcand argv,不是吗?

于 2012-07-28T12:26:56.080 回答