Проблема со сборкой результатов в 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?
