【问题标题】:Why is MPI_Isend hanging here?为什么 MPI_Isend 挂在这里?
【发布时间】:2017-06-02 22:25:19
【问题描述】:

我正在尝试从左到右发送缓冲区(0->1、1->2 2->3 等...)。我很确定进程正在从正确的合作伙伴发送和接收,但代码挂起或输出段错误。

#include "mpi.h"
#include <iostream>
int main(int argc, char *argv[])
{
int comm_rank, num_procs, recieve1, send1;
int buffer[10];
MPI_Request request, request2;
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);


send1 = (comm_rank + 1) % num_procs;
recieve1 = comm_rank - 1;
if (recieve1 < 0)
    recieve1 = num_procs - 1;

//std::cout << "Comm Rank = " << comm_rank << "\trecieve1 = " << recieve1 << "\tsend1 = " << send1 << std::endl;     

if (comm_rank == 0)
    send1 = 1;
if (comm_rank == num_procs-1)
    recieve1 = num_procs-2;

if (comm_rank != 0) 
{
    MPI_Irecv(buffer, 10, MPI_INT, recieve1, 123, MPI_COMM_WORLD, &request);
    std::cout << comm_rank << " <- " << recieve1 << std::endl;
}
if (comm_rank != num_procs-1)
{
    MPI_Isend(buffer, 10, MPI_INT, send1, 123, MPI_COMM_WORLD, &request2);
    std::cout << comm_rank << " -> " << send1 << std::endl;
}
MPI_Wait(&request, &status);
MPI_Wait(&request2, &status);


MPI_Finalize();
return 0;
}

【问题讨论】:

    标签: c++ parallel-processing segmentation-fault mpi freeze


    【解决方案1】:

    您在 requestrequest2 上无条件地执行 MPI_Wait,而您有条件地执行 MPI_Isend / MPI_Irecv。您只能等待实际发起的请求。

    【讨论】:

    • @MichaelPortobello:将requestrequest2 都初始化为MPI_REQUEST_NULL。这样你就可以无条件调用MPI_Wait
    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2018-12-10
    • 2010-12-25
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多