проблема распараллеливания с помощью 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;
}
`