我调用MPI_Init()后会发生什么?

问题描述:

假设我有一些代码,看起来像这样:我调用MPI_Init()后会发生什么?

#include "mpi.h" 

int main(int argc, char** argv) 
{ 
    int my_array[10]; 
    //fill the array with some data 

    MPI_Init(&argc, &argv); 

    // Some code here 

    MPI_Finalize(); 
    return 0; 
} 

每个MPI实例将获得自己的my_array的副本?只有0级?他们都没有?在MPI_Init之前有任何代码是不好的做法吗?

当你运行mpi代码时,你在不同的进程中运行相同的代码(它们不能共享内存),所以每个进程都有自己的数组。

数组应该是相等的,除非你的数据取决于时间(进程不一定是同步的),进程级别(我认为等级只在init调用后可用)或任何随机数发生器(有些可能会产生随机数种子)。

“我拨打MPI_Init时发生什么事情”的简短答案是:什么都没有。

MPI_Init初始化调用过程中的MPI库。没有更多,没有更多。在调用MPI_Init时,所有的MPI进程已经存在,它们只是不了解对方,并且不能进行通信。

每个MPI过程是一个单独执行的程序。这些进程不共享内存,并通过传递消息进行通信。

事实上,调用MPI_Init的进程甚至可以完全是不同的程序,只要它们传递的消息匹配即可。这是MPMD模型。

+0

您能否介绍有关动态进程管理的文档,以及可能的一些好的示例代码? – rudolph9 2012-07-28 04:06:48

+1

MPI中的动态过程管理非常有限。主要的限制是沟通者一旦创建就不能改变。所以一旦'MPI_Init'为最初的一组进程创建'MPI_COMM_WORLD',就不可能再添加更多的进程。您可以使用[MPI_Comm_spawn](http://www.mpi-forum.org/docs/mpi22-report/node203.htm#Node203)创建一组新进程。新进程获得了自己的'MPI_COMM_WORLD'和一个[intercommunicator](http://www.mpi-forum.org/docs/mpi22-report/node143.htm#Node143)链接这两个世界。 – 2012-07-28 04:19:56

+2

对于内存来说这是正确的,但你应该小心你在'MPI_Init'之前做的事情。一些实现可能会在'MPI_Init'中分叉进程,或者做任何魔法来设置他们的进程。例如。 [MPICH文档](http://www.mcs.anl.gov/research/projects/mpi/www/www/MPI_Init.html)建议不要在'MPI_Init'之前修改外部状态。当有疑问时,在'MPI_Init'之后执行# – Zulan 2012-08-02 08:15:17