[英]MPI_Irecv doesn't receive message in this easy code
我有这段代码用于测试MPI_Irecv和MPI_Isend
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(flag != 0);
}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}
如果我执行此代码,有时它会从1到9打印cc,有时它什么也不打印。
这很有意义,因为可以在进程1完成之后执行进程0。
但是,如果我让进程1是这样的无限循环:
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(true);
}
我认为进程1每次都会将cc从1打印到9,但不会。
如果我在进程1中插入MPI_Wait(),似乎进程1每次都会将cc从1打印到9。 但是,如果其他进程没有发送任何消息,并且我实际上希望进行非阻塞通信,它将永远等待。
回复评论:
1.关于版本:mpiexec --version mpiexec(OpenRTE)2.1.1
2.我不明白“ MPI进度线程”是什么意思。
实际上,我希望每个进程都可以彼此通信而不会阻塞,并且每次接收时都在缓冲区中获取信息。
3.可执行代码如下
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <unistd.h>
int main(void)
{
MPI_Comm allcomm;
int i;
int size, rank, irank;
int tablesize, localtablesize;
int *table,*table2;
allcomm = MPI_COMM_WORLD;
MPI_Init(NULL, NULL);
MPI_Comm_size(allcomm, &size);
MPI_Comm_rank(allcomm, &rank);
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} //while(flag!=0);
while(true);
}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}
MPI_Finalize();
}
您的程序不正确。
例如,如果等级1
快于等级0
,则第一个MPI_Test()
将不匹配任何消息,然后直接进入MPI_Finalize()
底行,此程序可能在0到10行之间打印。 如果等级1
以某种方式落后于等级0
,则该程序仅打印10行,但是由于两个等级都不同步,因此这种情况极不可能发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.