假设我有一些看起来像这样的代码:
#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
之前有任何代码是不好的做法吗?
答案 0 :(得分:7)
“我打电话给MPI_Init
时记忆会发生什么”的简短回答是:什么都没有。
MPI_Init
在调用进程中初始化MPI库。没有更多,没有更少。在MPI_Init
调用时,所有MPI进程已经存在,他们只是彼此不了解而无法进行通信。
每个MPI流程都是一个单独执行的程序。这些进程不共享内存,并通过传递消息进行通信。
确实,调用MPI_Init
的进程甚至可以完全是不同的程序,只要它们传递的消息匹配即可。这是MPMD模型。
答案 1 :(得分:2)
当你运行mpi代码时,你在不同的进程中运行相同的代码(它们不能共享内存),所以每个进程都有自己的数组。
数组应该相等,除非你的数据依赖于时间(进程不一定是同步的),进程级别(我认为级别仅在init调用之后可用)或任何随机数生成器(有些可能生成随机种子)同样)。