有人可以解释并告诉我更多有关MPI_Comm_split通信器的信息吗?
MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm);
这只是我通过阅读一些基本文件而遇到的例子。也许有人可以告诉我这个沟通者是如何工作的?
答案 0 :(得分:6)
首先,让我们看看手册页:
MPI_Comm_split(3) MPI MPI_Comm_split(3)
NAME
MPI_Comm_split - Creates new communicators based on colors and keys
SYNOPSIS
int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)
INPUT PARAMETERS
comm - communicator (handle)
color - control of subset assignment (nonnegative integer). Processes
with the same color are in the same new communicator
key - control of rank assignment (integer)
OUTPUT PARAMETERS
newcomm
- new communicator (handle)
那是做什么的?
好吧,顾名思义,它会将传播者comm
分成不相交的子传播者newcomm
。 comm
的每个进程将成为这些子通信器中的一个唯一,因此输出newcomm
只是一个单一的通信器(对于当前进程)。但是,从全球来讲,您必须了解newcomm
的许多版本都是不同的子通信器,对输入comm
进行分区。
这就是函数的作用。但它是如何做到的呢?
好吧,这两个参数color
和key
发挥作用:
color
是一个整数值,允许决定当前进程将落入哪个子通信器。更具体地说,comm
具有相同数值的color
的所有进程将是同一子通信器newcomm
的一部分。例如,如果您要定义color = rank%2;
(rank
中comm
的进程等级,那么您将创建(全局)两个新的通信器:一个用于奇数进程排名,一个甚至排名的过程。但是,请记住,每个流程只会看到他们所属的这些新传播者中的一个...总而言之,color
允许分辨各个团队"你会创造出来,比如橄榄球队的颜色会在比赛中穿出来区分自己(因此我认为是命名)。key
将允许有选择地决定如何将流程分配到他们所属的新通信器中。例如,如果您设置key = rank;
,那么每个新传播者newcomm
中的排名<(>排名)(不是排名本身)将遵循原始传播者中的排名顺序{ {1}}。但如果你不关心订购,你也可以设置comm
,每个新传播者的排名都是图书馆决定的...... 最后,两个简单的例子:
key=0;
只会将MPI_Comm_split(comm, 0, rank, &newcomm)
复制到comm
(就像newcomm
)MPI_Comm_dup()
只会为每个流程返回等效的MPI_Comm_split(comm, rank, rank, &newcomm)