gpt4 book ai didi

c++ - 使用 MPI 在超立方体中广播

转载 作者:行者123 更新时间:2023-11-30 02:18:05 25 4
gpt4 key购买 nike

我正在尝试从超立方体中的进程0广播一个充满1的 vector

int main(int argc, char **argv) {
int myRank, nProc;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
MPI_Comm_size(MPI_COMM_WORLD, &nProc);
MPI_Request request;
MPI_Status status;

MPI_Barrier(MPI_COMM_WORLD);
double start = MPI_Wtime();

std::vector<int> vector(100, 0);
if (myRank == 0) {vector = std::vector<int>(100, 1);}

//Broadcast in a hypercube
int dimension = log2(nProc);

for (int step = 0 ; step < dimension ; step++) {
std::bitset<6> tmpRank(myRank);
if (tmpRank >> step == 0) { //source
int neighbor = static_cast<int>(tmpRank.flip(step).to_ulong()); //The neighbor of a source at the step i is the i_th bit flipped, re-converted to int in order to send
MPI_Send(vector.data(), vector.size(), MPI_INT, neighbor, 0, MPI_COMM_WORLD);
}
else { //destination ( if(rank >> step == 1) )
//MPI_Status status;
MPI_Irecv(vector.data(), vector.size(), MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &request);
}
}
//

MPI_Barrier(MPI_COMM_WORLD);
double end = MPI_Wtime();

std::cout << "I am process " << myRank << " last element of my vector after broadcast is " << vector.back() << std::endl;

if (myRank==0) std::cout << " operation time : " << end-start << "[s]" << std::endl;

MPI_Finalize();
}

我有输出:

 I am process 0 last element of my vector after broadcast is 1
operation time : 3.40939e-05[s]
I am process 1 last element of my vector after broadcast is 1
I am process 2 last element of my vector after broadcast is 1
I am process 3 last element of my vector after broadcast is 0

为什么最后一个进程没有收到 vector ?错误必须来自 sendreceive 但我不知道我应该使用哪个函数(Isend、Irecv、Send、Recv)。谢谢

最佳答案

在访问任何参与数据之前,您必须明确完成所有非阻塞通信(在您的情况下为 MPI_Irecv)。这意味着您既不能转发数据,也不能因为完成而将其打印出来。使用 MPI_WaitMPI_Test 或任何它的 any/some/all 变体作为合适的。

如果您不需要非阻塞通信,如您的示例所示,请改用阻塞通信(即 MPI_Recv)。

实际上,在可能的情况下使用集合而不是点对点,在您的例子中是 MPI_Bcast。实现自己的广播不是一个好主意,除非您想学习或真正知道自己在做什么。

关于c++ - 使用 MPI 在超立方体中广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52642745/

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