Неправильный подсчёт суммы с помощью редукции 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 не знаю как решить эту проблему.


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