Проблема со сборкой результатов в MPI

Реализовать умножение матрицы на вектор с помощью MPI. Исходные данные генерируются в соответствии с заданной размерностью случайным образом. Для контроля корректности решения задачи предусмотреть заполнение матрицы и вектора единицами. Результат выводится на экран, при решении больших задач на время вывод результата отключается.

Исходные данные первоначально размещаются в одном процессе, в двумерном и одномерном массиве соответственно. Рассылка исходных данных осуществляется посредством парных взаимодействий с использованием производных типов данных. Результат получает один процесс. Сборка результатов при помощи коллективных взаимодействий и базовых типов данных.

'''

#include <iostream>
#include <mpi.h>
#include <iostream>


#define N 3

void multiply_array_by_number(int arr[], int number) {
    for (int i = 0; i < N; i++) {
        arr[i] *= number;
    }
}

void fill_with_random(int arr[][N], int vec[]) {
    srand(time(NULL));
    for (int i = 0; i < N; i++) {
        vec[i] = rand()%10;
        for (int j = 0; j < N; j++) {
            arr[i][j] = rand() % 10;
        }
    }
}


void fill_with_ones(int arr[][N], int vec[]) {
    for (int i = 0; i < N; i++) {
        vec[i] = 1;
        for (int j = 0; j < N; j++) {
            arr[i][j] = 1;
        }
    }
}

void print_matrix(int arr[][N]) {
    std::cout << "Matrix:" << std::endl;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }
}
void print_vector(int vec[]) {
    std::cout << "Vector:" << std::endl;
    for (int i = 0; i < N; i++) {
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;
}

void transpose_matrix(int matrix[][N]) {
    int temp;
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            // Меняем местами элементы матрицы
            temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

int main(int argc, char** argv) {

    int process_number, threadsCount;

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &process_number); // номер процесса
    MPI_Comm_size(MPI_COMM_WORLD, &threadsCount); // количество процессов

    int send_array[N];
    int result[N];

    // Создание производного типа данных
    MPI_Datatype type;
    MPI_Type_contiguous(N, MPI_INT, &type);
    MPI_Type_commit(&type);


    clock_t start = clock();

    // Работа нулевого процесса
    if (process_number == 0) {

        // Генерация исходных данных
        int arr[N][N];
        int vec[N];

        fill_with_random(arr, vec);
        
        print_matrix(arr);
        // Транспонируем матрицу для передачи столбца
        transpose_matrix(arr);


        for (int i = 1; i <= N; i++) {

            MPI_Send(&arr[i-1], 1, type, i, 0, MPI_COMM_WORLD);
            MPI_Send(&vec[i-1], 1, MPI_INT, i, 0, MPI_COMM_WORLD);

        }
        
       
        clock_t end = clock();

        double seconds = (double)(end - start) / CLOCKS_PER_SEC;

        //std::cout << "Result: " << res << " Time:" << seconds << " Threads:" << threadsCount-1 << "\n";
    }
    else {
        int num;
        MPI_Recv(&send_array, 1, type, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        MPI_Recv(&num, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

        multiply_array_by_number(send_array, num);

        //print_vector(send_array);

       //MPI_Send(&row, 1, type, 0, 0, MPI_COMM_WORLD);

    }

    MPI_Reduce(&send_array, &result, N, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);

    if (process_number == 0) {
        print_vector(result);
    }
    MPI_Finalize();


}

'''

Проблема в сборке результатов коллективным взаимодействием. MPI_Reduce как будто не делает ничего с массивом result. Вывод получается такой

введите сюда описание изображения

Как правильно использовать MPI_Reduce? Или как в данном случае использовать MPI_Gather?


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