【发布时间】:2014-05-14 14:56:45
【问题描述】:
我使用MPI非阻塞通信(MPI_Irecv, MP_Isend)来监控slave的空闲状态,代码如下。
排名 0:
int dest = -1;
while( dest <= 0){
int i;
for(i=1;i<=slaves_num;i++){
printf("slave %d, now is %d \n",i,idle_node[i]);
if (idle_node[i]== 1) {
idle_node[i] = 0;
dest = i;
break;
}
}
if(dest <= 0){
MPI_Irecv(&idle_node[1],1,MPI_INT,1,MSG_IDLE,MPI_COMM_WORLD,&request);
MPI_Irecv(&idle_node[2],1,MPI_INT,2,MSG_IDLE,MPI_COMM_WORLD,&request);
MPI_Irecv(&idle_node[3],1,MPI_INT,3,MSG_IDLE,MPI_COMM_WORLD,&request);
// MPI_Wait(&request,&status);
}
usleep(100000);
}
idle_node[dest] = 0;//indicates this slave is busy now
排名 1、2、3:
while(1)
{
...//do something
MPI_Isend(&idle,1,MPI_INT,0,MSG_IDLE,MPI_COMM_WORLD,&request);
MPI_Wait(&request,&status);
}
它有效,但我希望它更快,所以我删除了该行:
usleep(100000);
那么 rank 0 就这样进入死机状态:
slave 1, now is 0
slave 2, now is 0
slave 3, now is 0
slave 1, now is 0
slave 2, now is 0
slave 3, now is 0
...
那么是不是表示我使用MPI_Irecv时只是告诉MPI我想在这里接收消息(还没有收到消息),而MPI需要其他时间才能接收到真实的数据?还是其他原因?
【问题讨论】:
标签: nonblocking openmpi