Ошибка MPI с матрицей: ошибка сегментации - PullRequest
0 голосов
/ 14 апреля 2020

Была написана программа для поиска минимального значения в матрице. При малых значениях размерности матрицы она работает правильно, однако, если размерность превышает 350x350, то при расчете на другом количестве узлов возникает аналогичная ошибка.

mpirun заметил, что процесс имеет ранг 4 с PID 15014 на кластере узлов, вышедшем по сигналу 11 (ошибка сегментации).

Все работает на двух ядрах, но не всегда на других.

Я использую следующие команды:

mpi cc Lab777. c -o 1 -lm -std = c99

mpirun -np 16 ./1

Код:

#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>  
#include <time.h>

#define ROWS 350
#define COLS 350
#define max 999999999

void rand_matrix(int array[ROWS][COLS])
{
    srand((unsigned int)time(NULL));
    for (int i = 0; i < ROWS; i++)
        for (int j = 0; j < COLS; j++)
            array[i][j] = rand();
}

void show(int array[ROWS][COLS])
{
    for (int i = 0; i < ROWS; i++)
    {
        printf("\n");
        for (int j = 0; j < COLS; j++)
        {
            printf("\t|%d|", array[i][j]);
        }
        printf("\n");
    }
}

void convert(int array[ROWS][COLS], int *conv_arr)
{
    int k = 0;
    for (int i = 0; i < ROWS; i++)
        for (int j = 0; j < COLS; j++)
        {
            conv_arr[k] = array[i][j];
            k++;
        }
}

int find_min(int *array, int piece, int num_of_pieces)
{
    int result = max;
    for (int i = 0; i < (ROWS * COLS / (num_of_pieces)); i++)
        if (array[i] < result)
            result = array[i];
    return result;
}

int main(int argc, char *argv[])
{
    int matrix[ROWS][COLS], lin_arr[ROWS * COLS], min;
    double startwtime, endwtime;

    int ProcNum;
    int ProcRank;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
    MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
    int recv_matrix[ProcNum][ROWS * COLS], func[ProcNum];

    if (ProcRank == 0)
    {
        printf("Matrix is filling\n");
        rand_matrix(matrix);
        convert(matrix, lin_arr);
        printf("Matrix:\n");
        //show(matrix);

    }
    startwtime = MPI_Wtime(); 
    MPI_Scatter(&lin_arr[(ProcRank) * (ROWS * COLS / (ProcNum))], (ROWS * COLS / (ProcNum)), MPI_INT, &recv_matrix[ProcRank],(ROWS * COLS / (ProcNum)), MPI_INT, 0, MPI_COMM_WORLD);
    func[ProcRank] = find_min(recv_matrix[ProcRank], ProcRank, ProcNum);
    MPI_Reduce(&func[ProcRank], &min, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);
    endwtime = MPI_Wtime();
    if (ProcRank == 0)
    {
        printf("Min value: %d\n", min);
        printf("Time: %.4f\n", endwtime-startwtime);
    }
    MPI_Finalize();

    return 0;
}

UPD:

Попытка уменьшить память для recv_matrix и func. Я добавил следующую строку:

#define MAXPROC 20

И изменил следующее:

int recv_matrix[MAXPROC][ROWS * COLS], func[MAXPROC];

Но теперь он работает с меньшим размером матрицы

...