以MPI\u Bcast表示的排名
此函数不需要秩参数。它如何知道每个流程的排名以MPI\u Bcast表示的排名,mpi,Mpi,此函数不需要秩参数。它如何知道每个流程的排名 在广播之前,我们应该调用MPI\u COMM\u RANK(),是否有任何数据结构(如通信器)存储进程的秩?int root,是广播根的秩,本质上MPI broadcast将消息从秩根发送到所有其他秩 此外,我认为在MPI_Init之后调用以下内容是“最佳实践” MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm) 这将为每个处理
在广播之前,我们应该调用
MPI\u COMM\u RANK()
,是否有任何数据结构(如通信器)存储进程的秩?int root
,是广播根的秩,本质上MPI broadcast将消息从秩根发送到所有其他秩
此外,我认为在MPI_Init之后调用以下内容是“最佳实践”
MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
这将为每个处理器或核心分配一个从0到n-1的整数秩值
及
这将创建一个int,其中Numproces是处理器总数请考虑三种可能的
MPI\u Bcast()
实现:
root+1
,然后发送到root+2
,然后发送到root+3
,等等。这是一个线性数量级N
时具有数据副本的每个进程将数据转发到rank xor 2^N
。这是对数数量级在每种情况下,
MPI\u Bcast()
函数都知道哪个进程将获得下一条消息。在第一种和第三种情况下,任何非根进程都将简单地接收数据;在第二种情况下,每个进程在收到数据后将继续转发过程。然而,在所有的实现中,发送和接收的顺序都取决于哪个进程是根进程。(这就是为什么所有进程都必须调用MPI\u Bcast()
,无论是否为root。)您是对的,列组存储在通信器中,可用于内部实现MPI\u Bcast
。创建通信器时将指定列组。例如,MPI\u COMM\u WORLD
由MPI\u Init
创建
MPI\u Comm\u rank
仅从通信器获取秩值。广播前不需要打电话。然而,了解排名通常是做任何有意义的编程所必需的
请注意,由于MPI\u Bcast是一个集合调用,因此需要由通信器中的所有进程执行。也许您认为这是不可能的,但MPI库中的函数可以在内部进行与您用于获取进程排名或通信器大小相同的MPI调用。这就是为什么
MPI\u Bcast()
不需要调用进程的秩,因为它只是调用MPI\u Comm\u rank()
的内部实现来获得它。下面是一个小示例,来自OpenMPI中的一个MPI\u Bcast()
实现(更具体地说,这是来自tuned
模块中的拆分二叉树实现,该模块来自提供实现集合操作的算法的coll
框架):
int
ompi\u coll\u Tunned\u bcast\u intra\u split\u bintree(无效*缓冲区,
整数计数,
结构ompi_数据类型*t数据类型,
int根,
结构ompi_communicator_t*comm,
mca\u coll\u base\u模块\u t*模块,
uint32_t segsize)
{
...
int等级、大小;
...
大小=ompi_comm_大小(comm);
秩=ompi_comm_秩(comm);
...
}
如您所见,它调用MPI\u Comm\u size()和MPI\u Comm\u rank()的内部实现。在开放MPI中,这些调用非常便宜。进程的列组存储在与通信器关联的进程组中,并在创建通信器期间复制到通信器结构中的一个字段中(以节省一些CPU周期,取消对该组指针的引用)(有关更多信息,请参阅openmpi-source/ompi/communicator/communicator.h
和openmpi-source/ompi/group/group.h
)
事实上,没有任何MPI通信原语明确地接受调用进程的等级-它总是在内部解析。您只指定发送数据的位置(例如在MPI_发送
)或从何处接收数据(例如在MPI_RECV
)或者是有一个集合操作的数据根。我也会阅读文档,OpenMPI有一个最好的文档MPI@pyCthon,OpenMPI文档只是在(这很好-无需重新发明轮子,也无需重复标准中优秀措辞背后的工作)。只需澄清:MPI_Comm_rank和MPI_Comm_size不分配等级或大小。这些只是从通信器检索等级和大小值的访问器。只需澄清:等级是标识符(索引)进程组中与特定通信器关联的进程的名称。@HristoIliev好的,我太迂腐了:)另一个答案可能是误导性的:这个问题明确地问在MPI\u Bcast
之前是否需要调用MPI\u Comm\u rank
,答案听起来像是这样。学究式是好的,尤其是涉及标准的地方:)很好的解释,但它没有触及OP的问题。
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size( MPI_COMM_WORLD, &Numprocs);