以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);