xun*_*ang 7 c c++ parallel-processing mpi
我想在函数中使用多进程,我该如何实现它.
如您所知,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);
}
Run Code Online (Sandbox Code Playgroud)
我只想在B*x中使用MPI,但我不知道如何初始化MPI?顺便说一下,如果我可以初始化MPI int func,那么此时每个进程中是否存在A?
帮帮我,谢谢!
你不需要传递argc,argv因为MPI-2解除了MPI-1中的限制,编译实现可能要求参数MPI_Init与参数相同main:
在MPI-2中,不允许实施此要求.MPI的一致实现都必须允许应用程序通过
NULL两者的argc和argv的参数main.
但是你仍然必须测试MPI是否已经初始化,因为MPI_Init()(或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();
Run Code Online (Sandbox Code Playgroud)
请注意,MPI可以初始化,然后在应用程序的整个生命周期内只完成一次.这是围绕一个功能代码块,MPI_Init() ... MPI_Finalize()如果要多次调用该函数将无法工作,即MPI的功能与OpenMP及其并行区域的功能相同.
顺便说一下,如果我可以初始化MPI int func,那么此时每个进程中是否存在A?
正在运行的MPI程序由具有各自私有地址空间的多个进程组成.通常这些是相同程序代码的多个副本(所谓的单程序多数据或SPMD范例),但也可以是多个程序的多个副本,一起编写(也称为多程序多数据或MPMD).SPMD是更简单和更常见的情况,其中所有进程执行完全相同的代码,直到使用其MPI等级将执行分支到多个方向的点.所以是的,A存在于每个进程中,并且如果在前面的计算中不涉及(伪)随机数/事件,则A在MPI库初始化之前的每个MPI进程中将具有相同的值.请注意,这MPI_Init()只是一个常规库调用,与任何其他库调用一样.它不会改变用户内存的内容 - 它只会使大量运行的MPI进程彼此了解并使它们能够相互通信,从而使它们能够集体工作以解决特定问题.
如果要MPI_Init在子函数中使用,则必须传递int argc, char **argv给该函数,才能将其传递下去。
但即使您只想并行化子函数的一部分,您也可以(并且应该为了更透明的代码)MPI_Init在程序的早期使用。例如,在其他初始化工作完成后,或者如果您想在并行函数附近使用它,则在调用该函数之前。
原则上该函数不必知道argcand argv,不是吗?
| 归档时间: |
|
| 查看次数: |
7083 次 |
| 最近记录: |