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

Memory 调用MPI_Init()后内存会发生什么变化?,memory,mpi,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; } 每个MPI实例是否都会获得自己的my_数组副本?只排名0?没

假设我有如下代码:

#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_数组副本?只排名0?没有?在
MPI\u Init
之前有任何代码都是不好的做法吗?

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

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

简短回答“当我调用
MPI\u init时内存会发生什么情况?”是:没什么

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

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


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

您能给我看一下关于动态流程管理的文档,也许还有一些好的示例代码吗?MPI中的动态流程管理非常有限。主要的限制是通讯器一旦创建就不能更改。因此,一旦
MPI_Init
为初始进程集创建了
MPI_COMM_WORLD
,就不可能再添加更多的进程了。您可以使用创建一组新的流程。新进程有自己的
MPI\u COMM\u WORLD
,并有一个连接两个世界的接口。这对于内存来说是正确的,但在
MPI\u Init
之前,您应该小心操作。一些实现可能会在
MPI_Init
中分叉进程,或者使用任何魔法来设置它们的进程。例如,建议不要在
MPI\u Init
之前修改外部状态。如果有疑问,请在
MPI_Init
@Zulan之后执行,谢谢-我不知道有任何实现可以这样做,所以我做了更多的研究。显然,AMPI使用线程来实现MPI进程,但它将全局变量转换为私有变量。因此,在这种情况下,在MPI_Init上确实发生了一些非常有趣的事情:)调用
MPI_Init()
的进程怎么可能是完全不同的程序呢?难道还不需要使用
mpirun
启动进程吗?这不是只启动一个程序吗?