Я изучал OpenMP и MPI и пытался выполнить каждую задачу, используя оба из них. Поэтому сейчас я работаю с проблемой потребитель-производитель. У меня уже есть рабочая версия OpenMP, но я не могу правильно выполнить MPI-часть этой проблемы.
Я пытаюсь переписать проблему OpenMP для потребителя-производителя из здесь с MPI вместо OpenMP. Что с этим не так? Как я могу улучшить свой код, чтобы получить правильный результат?
Теперь мой ввод выглядит как this .
ОБНОВЛЕНИЕ: Также я попробовал код MPI из здесь .
Мой код:
#include <mpi.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int n = 0;
int nextin = 0;
int nextout = 0;
int count = 0;
int empty = 1;
int full = 0;
int i,j;
char buffer[SIZE];
// Put on buffer
void put(char item)
{
buffer[nextin] = item;
nextin = (nextin + 1) % SIZE;
count++;
if (count == SIZE)
full = 1;
if (count == 1) // buffer was empty
empty = 0;
}
// Get from buffer
char get()
{
char item;
item = buffer[nextout];
nextout = (nextout + 1) % SIZE;
count--;
if (count == 0) // buffer is empty
empty = 1;
if (count == (SIZE-1))
// buffer was full
full = 0;
return item;
}
// Producer
int produced(int rankid){
char item;
item = 'A' + (i % 26);
put(item);
i++;
if(rankid >= 10)
printf("%d | Produce | %c\n",rankid, item);
else
printf("%d | Produce | %c\n",rankid, item);
printf("-------------------------\n");
sleep(1);
return 1;
}
// Consumer
int consumed(int rankid){
char item;
j++;
item = get();
if(item >= 'A' && item <= 'Z') {
if(rankid >= 10)
printf("%d | Consume | %c\n",rankid, item);
else
printf("%d | Consume | %c\n",rankid, item);
printf("-------------------------\n");
}
sleep(1);
return 0;
}
int main(int argc, char *argv[]) {
int myrank;
int a;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &a);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
int count=10;
if(myrank % 2 == 0){
for(int i=0;i<10;i++){
MPI_Recv(&a,1,MPI_INT,1,99,MPI_COMM_WORLD,&status);
if (a==0){
a=produced(myrank); //here it returns 1
MPI_Send(&a,1,MPI_INT,1,99,MPI_COMM_WORLD);
}
}
}
else {
a=0;
for (int 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(myrank);
n++;
}
}
if(n==count){
MPI_Finalize();
}
return 0;
}