Неправильный подсчёт суммы с помощью редукции MPI
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <mpi.h>
#define N 10
using namespace std;
int main(int argc, char** argv) {
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int* vector_all = nullptr;
if (rank == 0) {
vector_all = new int[N];
srand(time(NULL));
for (int i = 0; i < N; i++) {
vector_all[i] = rand() % 20 + 1;
}
cout << "Vector: ";
for (int i = 0; i < N; ++i) {
cout << vector_all[i] << " ";
}
cout << endl;
}
int local_sum = 0;
int local_size = N / size;
int* vector_local = new int[local_size];
MPI_Scatter(vector_all, local_size, MPI_INT, vector_local, local_size, MPI_INT, 0, MPI_COMM_WORLD);
for (int i = 0; i < local_size; i++) {
local_sum += vector_local[i];
}
cout << "Process " << rank << " local sum: " << local_sum << endl;
int level = 1;
while (level < size) {
int remote = rank ^ level;
if (remote < size) {
int recv_sum;
MPI_Send(&local_sum, 1, MPI_INT, remote, 0, MPI_COMM_WORLD);
MPI_Recv(&recv_sum, 1, MPI_INT, remote, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
if (rank > remote) {
local_sum += recv_sum;
}
else {
local_sum = recv_sum;
}
}
level *= 2;
}
int global_sum = 0;
MPI_Reduce(&local_sum, &global_sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if (rank == 0) {
cout << "Total sum: " << global_sum << endl;
}
delete[] vector_local;
if (rank == 0) {
delete[] vector_all;
}
MPI_Finalize();
return 0;
}
Этот код вычисляет сумму элементов вектора с использованием модифицированной каскадной схемы, используя данные команды: широковещательная рассылка, редукция, распределение и сборка данных.
Программа корректно считает локальные суммы, но неправильно подсчитывает глобальную. Покажу на примере вывода: Vector: 5 3 8 2 2 6 18 12 14 19 | Номер процесса | Локальная сумма | | --------- | -------------- | | Process 0 | local sum: 8 | | Process 4 | local sum: 33 | | Process 1 | local sum: 10 | | Process 2 | local sum: 8 | | Process 3 | local sum: 30 |
Total sum: 230
Из-за небольшого опыта работы с MPI не знаю как решить эту проблему.