如何解决MPI中的可变用法
在MPI中,如果我有以下代码,是否将为两个进程创建变量“ a”的副本,还是必须在每个循环中声明“ a”?还是两个都一样?
main()
{
int a;
if(rank==0)
{
a+=1;
}
if(rank==1)
{
a+=2;
}
}
解决方法
MPI具有分布式内存编程范例。
简单地说,如果您有一个应用程序二进制文件(例如:hello.out
),并且如果您使用mpirun -n 4 hello.out
在mpi运行时中运行它,那么会发生以下情况:
它启动应用程序hello.out
的4个实例(我们可以说它类似于在4个不同的节点中启动4个不同的应用程序)。他们彼此不认识。他们在自己的地址空间中执行自己的代码。这意味着,每个变量,函数等都属于它自己的实例,并且不与任何其他进程共享。因此,所有进程都有自己的变量a
。
即,下面的代码将在不同的内核/节点中同时调用4次(如果我们使用mpirun -n 4
)。因此,变量a
将在所有4个实例中可用。您可以使用rank
来识别您的MPI流程并控制其价值。在下面的示例中,a
将存储进程rank
的值。所有进程都将打印My rank is a
和a
,并从0
到4
取值。而且只有一个进程会打印I am rank 0
,因为对于a==0
来说,true
只会是rank 0
。
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 在注释中指出)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。