3

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

#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吗?

4

2 回答 2

8

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

MPI_Init在调用过程中初始化 MPI 库。不多也不少。在MPI_Init调用的时候,所有的 MPI 进程都已经存在,只是它们彼此还不知道,无法通信。

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

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

于 2012-07-28T02:12:58.523 回答
2

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

数组应该相等,除非您的数据取决于时间(进程不一定同步)、进程排名(我认为排名仅在 init 调用后可用)或任何随机数生成器(有些也可能生成随机种子) .

于 2012-07-27T22:06:56.287 回答