MPI - производитель и потребитель - PullRequest
0 голосов
/ 26 марта 2011

как просто сделать приложение для производителя и потребителя. Производитель делает товар, отправляет его потребителю, а потребитель ждет, пока у него не появится этот товар. Он использует его, предмет пропал и отправляет запрос на создание нового производителю. И снова и снова.

У меня есть режим комбинации MPI_send и MPI_recv, но он срабатывает только один раз. Производитель делает один элемент, потребитель потребляет один элемент, и приложение заходит в тупик. Должен ли я использовать неблокирующее получение и отправку?

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();

    }

 } 

}

редактирование:

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

}

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

}

1 Ответ

2 голосов
/ 26 марта 2011

Для этого вам не нужен неблокирующий ввод. Проблема в том, что ничто не меняет состояние клиента, поэтому оно никогда ничего не получит. Попробуйте:

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();
}

Обратите внимание, что цикл while на самом деле не нужен выше, но поскольку вы проверили полученные сервером данные, я предположил, что вы захотите проверить полученные клиентские данные.

Редактировать: Изменено отображение исходного кода для consumed() и produced()

...