有人可以解释并告诉我更多有关MPI_Comm_split通信器的信息吗?
MPI_Comm_split(MPI_COMM_WORLD, my_row, my_rank,&my_row_comm);
这只是我通过阅读一些基本文档遇到的示例。也许有人可以告诉我此沟通工具的工作方式?
最佳答案
首先,让我们看一下手册页:
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
允许区分您将创建的各个“团队”,例如 Jersey 足球的颜色。比赛中,各队会穿上以区别自己(因此,我认为是这样的命名)。 key
仅允许选择决定如何将这些过程分类为它们所属的新通信器。例如,如果设置key = rank;
,则每个新传播者newcomm
中的排名而不是排名本身的顺序将遵循原始传播者comm
中的排名顺序。但是,如果您不关心顺序,则可以设置key=0;
,并且每个新的传播者中的排名将由库决定... 最后,举两个简单的例子:
MPI_Comm_split(comm, 0, rank, &newcomm)
只会将comm
复制为newcomm
(与MPI_Comm_dup()
一样)MPI_Comm_split(comm, rank, rank, &newcomm)
只会为每个进程MPI_COMM_SELF