gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:59:36 28 4
gpt4 key购买 nike

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

[代码]

#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?

最佳答案

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

#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

这可以解决问题吗?

关于mpi - 有没有办法在 MPI 中获取唯一的通信器标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555387/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com