проблема распараллеливания с помощью MPI

Изучаю MPI. Передо мной стоит задача распараллелить поиск ближайшего вектора(строка матрицы) от введенного(массива) пользователем с помощью НОК. Вот, что у меня выходит, но при запуске на нескольких процессах, программа виснет. Подскажите, пожалуйста, как поправить. `

#include <iostream>
#include <stdlib.h>
#include <mpi.h>
#include <stdio.h>
#include<random>
#include <ctime>
using namespace std;
#define M 4
#define N 3

int gcd(int a, int b) {
    while (a != b)
        if (a > b) a -= b;
        else b -= a;
    return a;
}

int main(int argc, char** argv)
{
    setlocale(LC_ALL, "RUS");
    srand(time(NULL));
    int* answers = new int[M];
    int rank; 
    int size; 
    int sendbuf[M][N];

    int mybuf[N];

   int mybud[N], news[M];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    int evc = 0, pr = 0;
    if (rank == 0)
    {

        for (int i = 0; i < M; i++)
        {
            printf("\n");
            for (int j = 0; j < N; j++)
            {
                sendbuf[i][j] = 1 + rand() % 15;
                printf("%d\t", sendbuf[i][j]);
            }
        }
        printf("\n\n\n\n\n\n");

        for (int i = 0; i < N; i++)
        {
            std::cin >> mybuf[i];

        }
        printf("\n\n\n\n\n\n");

    }
    int* counts = new int[M * N];
    int* displs = new int[M * N];
;

    for (int i = 0; i < size; i++)
    {
        counts[i] = (M * N) / size + (1 < (M * N) % size);
        displs[i] = 0;
        for (int j = 0; j < i; j++)
            displs[i] += counts[j];
    }
    int recbuf[M*N];

    MPI_Scatterv(&sendbuf, counts,displs, MPI_INT, &recbuf, N*M, MPI_INT, 0, MPI_COMM_WORLD);

    MPI_Scatter(&mybuf, N, MPI_INT, &mybud, N, MPI_INT, 0, MPI_COMM_WORLD);


        printf("\n");
        int(*f)[N];
        f = (int(*)[N])recbuf;


        for (int i = 0; i < M; i++) 
        {
            pr = 0;
            printf("\n\n");
            for (int j = 0; j < N; j++)
            {   
                evc = gcd(f[i][j], mybud[j]);

                printf("\t%d\t", evc); 
                pr += evc;

            }
            printf("\t\t\t%d\n", pr);
            answers[i] = pr;
        }


    std::cout << MPI_Reduce(&answers, &news, M, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

        delete []answers;

    MPI_Finalize();


    return 0;
}

`


Ответы (0 шт):