有没有办法在MPI中获得唯一的通信器标识符?

时间:2016-02-22 13:51:16

标签: mpi

我希望能够为某个传播者获得一个唯一的ID,但是当你通过MPI_Comm_split()调用得到这个传播者时,这似乎是一项不可能完成的任务。我知道,当MPI_Comm_split()被集体调用时,每个产生的不相交的传播者都具有相同的上下文ID但不同的组信息。我期望通过调用MPI_Comm_group(),与某个通信器关联的组处理程序对于由拆分创建的每个通信器是不同的,但在所有通信器中都是相同的!

[CODE]

#include <mpi.h>
#include <stdio.h>

int main() {
    MPI_Init(NULL, NULL);
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm split_comm;
    MPI_Comm_split(MPI_COMM_WORLD, rank / 3, rank, &split_comm);
    int split_rank;
    MPI_Group split_group;
    MPI_Comm_group(split_comm, &split_group);
    MPI_Comm_rank(split_comm, &split_rank);
    printf("rank: %d| comm: %u, group: %u\n", split_rank, split_comm, split_group);
}

如果使用mpirun -np 6 ./exec运行上面的代码,结果为:

rank: 0| comm: 2214592516, group: 2281701376
rank: 1| comm: 2214592514, group: 2281701376
rank: 2| comm: 2214592514, group: 2281701376
rank: 0| comm: 2214592514, group: 2281701376
rank: 1| comm: 2214592514, group: 2281701376
rank: 2| comm: 2214592514, group: 2281701376

因此无法确定一个过程属于哪两个传播者。

有没有办法获得一个唯一标识通信器的id?

2 个答案:

答案 0 :(得分:1)

如评论中所述,您无法控制MPI为其COMMs设置的值。但是,您可以按如下方式设置通讯名称,

#include <mpi.h>
#include <stdio.h>
#include <iostream>

int main() {

    MPI_Init(NULL, NULL);
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm split_comm;
    int colour = rank/3;
    MPI_Comm_split(MPI_COMM_WORLD, colour, rank, &split_comm);

    // Define string from split colour and use to set comm name
    std::string name = "Comm-";
    name += std::to_string(colour);
    const char * commname = name.c_str();
    MPI_Comm_set_name(split_comm, commname);

    int split_rank;
    MPI_Group split_group;
    MPI_Comm_group(split_comm, &split_group);
    MPI_Comm_rank(split_comm, &split_rank);

    //Retrieve commname and print
    int rlen;
    char nameout[MPI_MAX_OBJECT_NAME];
    MPI_Comm_get_name(split_comm, nameout, &rlen);
    printf("rank: %d| comm: %u, comm_name: %s, group: %u\n", split_rank, split_comm, nameout, split_group);
}

mpirun -np 6 ./exec示例的输出为

rank: 0| comm: 2214592516, comm_name: Comm-0, group: 2281701376
rank: 1| comm: 2214592514, comm_name: Comm-0, group: 2281701376
rank: 2| comm: 2214592514, comm_name: Comm-0, group: 2281701376
rank: 0| comm: 2214592514, comm_name: Comm-1, group: 2281701376
rank: 1| comm: 2214592514, comm_name: Comm-1, group: 2281701376
rank: 2| comm: 2214592514, comm_name: Comm-1, group: 2281701376

这可以解决问题吗?

答案 1 :(得分:0)

如上所述,没有(便携式)方式来访问MPI内部。而且我甚至不指望它有你需要的东西。

要一般地处理这个问题,您可以使用“PMPI”分析界面包装所有mpi通信器管理功能(有关详细信息,请参阅MPI标准14.2。)。每当生成新的通信器时,您就会在每个进程中本地存储有关它的信息,并为其分配一个本地递增的计数器值。然后,您可以使用PMPI_Comm_groupPMPI_Group_sizePMPI_Group_translate_ranks来获取成员进程。同时,具有最低全局等级的组成员的增量计数器和成员数组在全局意义上唯一地标识通信器。对于交流者来说,这有点棘手。