parallel-processing - 如何在 MPI 中检查接收消息

标签 parallel-processing mpi

我正在尝试编写 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 语句检查接收消息,我可以用超时或等待表达式检查吗?
*我知道这段代码很琐碎,但我希望它可以帮助我们。

谢谢

最佳答案

很难确切地说出您想要什么,但听起来您可能正在寻找的是与测试配对的非阻塞接收或 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
}

关于parallel-processing - 如何在 MPI 中检查接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29424585/

相关文章:

linux - 安装 mpich2 总是安装我 mpich

parallel-processing - 每个 CPU 的核心数以什么速度增加?

.net - Task.WaitAll 的线程局部对象

c++ - OpenMP/C++ 如何并行递增一个变量?

c - 与openmp中线程数相关的性能

c++ - cuda可以结合activeX技术使用吗?

c++ - 来自 MPI 的奇怪段错误

c++ - MPI_Barrier() 的行为?

mpi - MPI/OpenMP 混合代码中的计时单一功能