MPI中的变量使用

MPI中的变量使用,mpi,Mpi,在MPI中,如果我有以下代码,会为两个进程创建变量“a”的副本吗?还是必须在每个循环中声明“a”?还是两者都一样 main() { int a; if(rank==0) { a+=1; } if(rank==1) { a+=2; } } MPI有一个分布式内存编程范例 简单地说,如果您有一个应用程序二进制文件(例如:hello.out),并且如果您通过mpirun-n4hello.out使用mpi运行时运行它,那么会发生以下情况: 它启动了应用程序的4个

在MPI中,如果我有以下代码,会为两个进程创建变量“a”的副本吗?还是必须在每个循环中声明“a”?还是两者都一样

main()
{
 int a;

 if(rank==0)
 {
      a+=1;
 }

 if(rank==1)
 {
   a+=2;
 }

 }

MPI有一个分布式内存编程范例

简单地说,如果您有一个应用程序二进制文件(例如:
hello.out
),并且如果您通过
mpirun-n4hello.out
使用mpi运行时运行它,那么会发生以下情况:

它启动了应用程序的4个实例
hello.out
(我们可以说它类似于在4个不同的节点上启动4个不同的应用程序)。他们彼此不认识。它们在自己的地址空间中执行自己的代码。这意味着,每个变量、函数等都属于它自己的实例,不与任何其他进程共享。因此,所有进程都有自己的变量
a

i、 e,下面的代码将在不同的核心/节点中同时调用4次(如果我们使用
mpirun-n4
)。因此,变量
a
将在所有4个实例中都可用。您可以使用
rank
标识MPI进程并操纵其值。在下面的示例中,
a
将存储进程
rank
值。所有进程都将打印
My rank is a
,其中
a
的值从
0
4
。只有一个进程将打印
I am rank 0
,因为
a==0
对于
rank 0
的进程只有
true

main()
{
 int a;
 int rank;
 MPI_Init(NULL, NULL);
 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 a=rank;
 printf("My rank is %d",a);
 if(a==0)
 {
    printf("I am rank 0");
 }
}
因此,为了相互交互,启动的进程(例如:
hello.out
)使用MPI(消息传递接口)库(如@Hristo-Iliev所述)


因此,基本上,这就像在多个核心/节点上启动相同的常规C程序,并使用消息传递相互通信(正如Gilles Gouaillardet在评论中指出的那样)。

MPI只是一个库,所以您的程序只是一个常规的
C
程序,其中MPI任务是独立的进程。MPI中没有OpenMP中的共享变量。每个MPI列组在其单独的地址空间中运行,所有变量都是私有的,除非使用消息传递或RMA窗口共享。