开发者

MPI - producer and consumer

how to simply make an producer and consumer app. Producer make item, sends it to the consumer, while consumer waits until he has this item. He use it, item is gone and he sends request to create new one to the producer. And over a over again.

I have mode some MPI_send and MPI_recv combination, but it just go only once. Producer make one item, consumer consume one item and app is deadlocked. Should I use non blocking recieve and send?

int count=10;
if(myrank==0){     //server
 for(i=0;i<10;i++){
    MPI_Recv(&a,1,MPI_INT,1,99,MPI_COMM_WORLD,&status);
    if (a==0){
      a=produced(); //here it returns 开发者_运维知识库1
      MPI_Send(&a,1,MPI_INT,1,99,MPI_COMM_WORLD);
    }
  }

}
else{//client
 for(i=0;i<10;i++){
    if(a==0){
       a=0;
       MPI_Send(&a,1,MPI_INT,0,99,MPI_COMM_WORLD);
    }else{
       MPI_Recv(&a,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
       a=consumed();
       n++;
    }
    if(n==count){
       MPI_Finalize();

    }

 } 

}

edit:

int produced(){
   sleep(1);
   printf("Produced item\n");
   return 1;

}

int consumed(){
   sleep(1);
   printf("Consumed item\n");
   return 0;

}


You shouldn't need non-blocking io for this. The problem is that nothing changes the client state so it will never receive anything. Try:

else { //client
  a=0;
  for (i=0;i<10;i++) {
    MPI_Send(&a,1,MPI_INT,0,99,MPI_COMM_WORLD);
    do {
      MPI_Recv(&a,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
    } while (a != 1);
    a=consumed();
  }

  MPI_Finalize();
}

Note the while loop isn't really needed above but as you have checked the server received data, I assumed you would want to check the client data received.

Edit: Changed to reflect source code for consumed() and produced()

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜