【问题标题】:How can I check receive message in MPI如何在 MPI 中检查接收消息
【发布时间】:2015-04-03 23:21:27
【问题描述】:

我正在尝试编写 MPI 发送/接收代码,但我遇到了问题。我想检查接收消息。如果我有任何来源的消息,请阅读此内容。否则,继续代码。

MPI_Comm_size(MPI_COMM_WORLD,&p);
MPI_Comm_rank(MPI_COMM_WORLD,&id);
MPI_Status status;
int source,ask,request,answer,tag=10;
for(i=first; i<last; i++){
    if(there is a message for my id){
        MPI_Recv(&request,1,MPI_INT,MPI_ANY_SOURCE,tag,MPI_COMM_WORLD,&status);
        answer = request*request;
        source = status.MPI_SOURCE;
        MPI_Send(&answer,1,MPI_INT,source,tag+1,MPI_COMM_WORLD);
    }
    square=i*i;
    if(last < square){
    MPI_Send(&square,1,MPI_INT,id-1,tag,MPI_COMM_WORLD);
    MPI_Recv(&square,1,MPI_INT,id-1,tag+1,MPI_COMM_WORLD,&status);
    }
    local[i]=square;
}

如果我无法使用 if 语句检查接收消息,我可以使用超时或等待表达式检查吗? *我知道这段代码微不足道,但我希望它可以帮助我们。

谢谢

【问题讨论】:

    标签: parallel-processing mpi


    【解决方案1】:

    很难准确地说出您想要什么,但听起来您可能正在寻找与测试配对的非阻塞接收或MPI_IMPROBEMPI_MRECV 配对。

    因此,对于非阻塞接收版本,您的代码最终看起来更像:

    int flag = 0;
    for (i=first; i<last; i++) {
        MPI_Irecv(&data, 1, MPI_INT, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &mpi_request);
        MPI_Test(&mpi_request, &flag, &status);
        while (!flag) {
             // Do other stuff
             MPI_Test(&mpi_request, &flag, &status);
        }
        // Do stuff with message
    }
    

    带有探针的版本会略有不同,但最终非常相似:

    MPI_Message message;
    int flag;
    for (i=first; i<last; i++) {
        MPI_Improbe(MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &flag, &message, &status);
        while (!flag) {
             // Do other stuff
             MPI_Test(&mpi_request, &flag, &status);
        }
        MPI_Mrecv(&data, 1, MPI_INT, &message, &status);
        // Do stuff with message
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2015-10-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      相关资源
      最近更新 更多