gpt4 book ai didi

c++ - MPI Isend 和 Irecv 问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:01 25 4
gpt4 key购买 nike

我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到生产线上的下一个流程,然后当前流程才能处理它的业务。

接收进程需要接收才能继续计算,但是当我没有 MPI_Wait 时它永远不会获取数据,而当我这样做时它只会永远挂起。我究竟做错了什么?

注意:我只将 Cin 设置为 3,以便查看消息何时未通过。目前它只是挂起。

void ComputeS5C()
{
MPI_Request send_request, recv_request;
MPI_Status status;
int Cin[1] = {3};
if(my_rank == 0){Cin[0] = 0;}
else {
MPI_Irecv(Cin, 1, MPI_INT, my_rank - 1, 0, MPI_COMM_WORLD, &recv_request);
MPI_Wait(&recv_request, &status);
fprintf(stderr, "RANK:%d Message Received from rank%d: Cin=%d\n", my_rank, my_rank-1, Cin[0]);
}

int k;
for(k = 0; k < Size_5; k++)
{
int s5clast;
if(k==0)
{
s5clast = Cin[0];
}
else
{
s5clast = s5c[k-1];
}

s5c[k] = s5g[k] | (s5p[k]&s5clast);
}

//if not highest rank, pass the carryin upstream
if(my_rank < world_size - 1){
MPI_Isend(&s5c[k], 1, MPI_INT, my_rank+1, 1, MPI_COMM_WORLD, &send_request);
fprintf(stderr, "RANK:%d Message sent to rank%d: Cin=%d\n", my_rank, my_rank+1, s5c[k]);
}
MPI_Wait(&send_request, &status);
}

最佳答案

您的代码中的错误与标签 的不匹配有关。消息使用 tag = 1 发送,使用 tag = 0 接收。发送和接收不匹配解释了为什么所有进程都在等待发送的消息被消耗。更改标签,使它们匹配。

请注意,在使用 MPI_Irecv 时,您始终需要 MPI_Wait 以确保知道何时可以安全地使用接收到的数据。我认为在您的示例中使用 MPI_Recv 更合适。

关于c++ - MPI Isend 和 Irecv 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430273/

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