Потребитель-Производитель - MPI - PullRequest
0 голосов
/ 13 мая 2018

Я изучал 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;

}
...