MPI:获取给定通信器中所有处理器的排名
MPI: get ranks of all processors in a given communicator
我有一个通讯器,如何获取该通讯器中处理器的所有等级?
我能找到的只是如何获取给定通信器中的处理器数量,但似乎没有获取排名集合的函数。
排名总是线性分配的。如果您的通信器大小为 p
,则所有处理器的等级将为 0, 1, 2, ..., p-1
。
如果您的通信器是 MPI_COMM_WORLD 的子通信器,那么处理器将重新标记从 0
到子通信器大小的等级。
如果您正在寻找您的子通信器的处理器的全球排名(在 MPI_COMM_WORLD
中指定)。您必须使用 MPI_Gather
或 MPI_Allgather
,进程排名在 MPI_COMM_WORLD
:
// get global rank
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// getting size of your communicator
int size;
MPI_Comm_size(your_comm, &size);
// all-gather global ranks
int * ranks = malloc(sizeof(int)*size);
MPI_Allgather(&rank, 1, MPI_INT, ranks, 1, MPI_INT, your_comm);
添加到 Patrick 的回答中:
要获得从 comm_1 到 comm_2 的进程等级,反之亦然,您可以先提取基础 MPI_Group
,然后使用 MPI_Group_translate_ranks
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Comm my_comm;
int n;
MPI_Comm_size(comm, &n);
int rank1[n] = {0,1,2,3,...}
int rank2[n];
// Some Code
MPI_Group world_group;
MPI_Group my_comm_group;
MPI_Comm_group(comm, &world_group);
MPI_Comm_group(my_comm, &my_comm_group);
MPI_Group_translate_ranks(world_group, n, rank1, my_comm_group, rank2);
你会在数组rank2中得到数组rank1对应的ranks。
我有一个通讯器,如何获取该通讯器中处理器的所有等级?
我能找到的只是如何获取给定通信器中的处理器数量,但似乎没有获取排名集合的函数。
排名总是线性分配的。如果您的通信器大小为 p
,则所有处理器的等级将为 0, 1, 2, ..., p-1
。
如果您的通信器是 MPI_COMM_WORLD 的子通信器,那么处理器将重新标记从 0
到子通信器大小的等级。
如果您正在寻找您的子通信器的处理器的全球排名(在 MPI_COMM_WORLD
中指定)。您必须使用 MPI_Gather
或 MPI_Allgather
,进程排名在 MPI_COMM_WORLD
:
// get global rank
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// getting size of your communicator
int size;
MPI_Comm_size(your_comm, &size);
// all-gather global ranks
int * ranks = malloc(sizeof(int)*size);
MPI_Allgather(&rank, 1, MPI_INT, ranks, 1, MPI_INT, your_comm);
添加到 Patrick 的回答中:
要获得从 comm_1 到 comm_2 的进程等级,反之亦然,您可以先提取基础 MPI_Group
,然后使用 MPI_Group_translate_ranks
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Comm my_comm;
int n;
MPI_Comm_size(comm, &n);
int rank1[n] = {0,1,2,3,...}
int rank2[n];
// Some Code
MPI_Group world_group;
MPI_Group my_comm_group;
MPI_Comm_group(comm, &world_group);
MPI_Comm_group(my_comm, &my_comm_group);
MPI_Group_translate_ranks(world_group, n, rank1, my_comm_group, rank2);
你会在数组rank2中得到数组rank1对应的ranks。