MPI中的变量使用
在MPI中,如果我有以下代码,会为两个进程创建变量“a”的副本吗?还是必须在每个循环中声明“a”?还是两者都一样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个
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窗口共享。