在MPI_Bcast中排名

sui*_*gls 2 mpi

MPI_Bcast(void *buffer,  int count,  MPI_Datatype datatype,  int root,  MPI_Comm comm)
Run Code Online (Sandbox Code Playgroud)

此函数不需要rank参数。如何知道每个流程的等级?

我们应该调用MPI_COMM_RANK()广播之前,是否有任何数据结构(如通信器)存储进程等级?

Hri*_*iev 5

也许您认为不可能,但是MPI库中的函数可以在内部进行与您用来获取进程的等级或通信器大小的MPI调用相同的调用。这就是为什么MPI_Bcast()不需要调用进程的等级的原因,因为它只是调用内部实现MPI_Comm_rank()以获得它。这是来自MPI_Bcast()Open MPI中一种实现的小样本(更具体地说,这是来自提供实现集体操作的算法tunedcoll框架的模块中的拆分二叉树实现):

int
ompi_coll_tuned_bcast_intra_split_bintree ( void* buffer,
                                            int count, 
                                            struct ompi_datatype_t* datatype, 
                                            int root,
                                            struct ompi_communicator_t* comm,
                                            mca_coll_base_module_t *module,
                                            uint32_t segsize )
{
    ...
    int rank, size;
    ...

    size = ompi_comm_size(comm);
    rank = ompi_comm_rank(comm);

    ...
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它调用的内部实现的MPI_Comm_size()MPI_Comm_rank()。这些是Open MPI中非常便宜的电话。进程的等级存储在与通信器相关联的进程组中,并在创建通信器期间被复制到通信器结构中的字段中(以节省一些将指针指向该组的指针的CPU周期)(更多信息)有关信息,请参阅openmpi-source/ompi/communicator/communicator.hopenmpi-source/ompi/group/group.h)。

实际上,没有MPI通信原语明确地承担调用过程的等级-它始终在内部解决。您仅在具有一个的那些集合操作中指定在何处发送数据(例如,在中MPI_SEND)或从何处接收数据(例如,在中MPI_RECV)或数据根。