调用MPI_Init()后内存会发生什么变化?

lim*_*mes 3 memory mpi

假设我有一些看起来像这样的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*sev 8

对"当我打电话时记忆会发生什么"的简短回答MPI_Init是:什么都没有.

MPI_Init在调用进程中初始化MPI库.没有更多,没有更少.在MPI_Init通话时,所有MPI进程已经存在,他们只是彼此不了解并且无法通信.

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

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

  • 对于内存来说这是事实,但是你应该小心你在'MPI_Init`之前做的事情.一些实现可以在`MPI_Init`中分叉进程,或者做任何魔术来设置它们的进程.例如,[MPICH文档](http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Init.html)建议不要在"MPI_Init"之前修改外部状态.如有疑问,请在"MPI_Init"之后执行此操作 (3认同)