我正在尝试编写 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_IMPROBE
与 MPI_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/