Сумма чисел от 1 до 1000 параллельно - PullRequest
0 голосов
/ 21 мая 2018

Следующий код использует 2n ЦП для вычисления суммы от 1 до 1000.Каждый из процессоров вычисляет часть этого агрегата и независимо отображает выходные данные.

Конечный результат вычислений всех процессоров собирается первым процессором и агрегируется, а окончательный результат отображается в выходных данных.

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

static int MyNode, Nodes;
using namespace std;
int main(int* argc, char** argv[])
{
    MPI_Init(argc, argv);
    MyNode = MPI_Comm_rank(MPI_COMM_WORLD, &MyNode);
    Nodes =  MPI_Comm_size(MPI_COMM_WORLD, &Nodes);
    MPI_Status status;
    int sum = 0;
    int accum = 0;
    int FIndex = 1000 * MyNode / Nodes + 1;
    int LIndex = 1000 * (MyNode + 1) /
        Nodes;
    for (int I = FIndex; I <= LIndex; I = I + 1)
        sum += I;
    if (MyNode != 0)
        MPI_Send(&sum, 1, MPI_INT, 0, 1,
            MPI_COMM_WORLD);
    else
        for (int J = 1; J < Nodes; J = J + 1) {
            MPI_Recv(&accum, 1, MPI_INT,
                J, 1, MPI_COMM_WORLD,
                &status);
            sum += accum;
        }
    if (MyNode == 0) {
        cout << "Total Nodes is " << Nodes << ".The sum from 1 to 1000 is: " << sum << endl;
    }
    MPI_Finalize();
    return 0;
}

После запуска я сталкиваюсь с проблемой: Integer division by zero. (MyNode / Nodes)

, почему MyNode, Nodes равны нулю?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Просто передайте ссылку на MyNode и Nodes:

MPI_Comm_rank(MPI_COMM_WORLD, &MyNode);
MPI_Comm_size(MPI_COMM_WORLD, &Nodes);

MPI_Comm_size возвращает MPI_SUCCESS в случае успеха.В противном случае возвращаемое значение является кодом ошибки.

0 голосов
/ 21 мая 2018

Следующие функции возвращают ошибки, если таковые имеются

MyNode = MPI_Comm_rank(MPI_COMM_WORLD, &MyNode);
Nodes =  MPI_Comm_size(MPI_COMM_WORLD, &Nodes);

Поскольку вы сохраняете состояние ошибки в MyNode и Nodes, (в этом случае ошибки нет) Значение MyNOde и Nodes равно 0.

Измените это на

int err;
err = MPI_Comm_rank(MPI_COMM_WORLD, &MyNode);
err =  MPI_Comm_size(MPI_COMM_WORLD, &Nodes);
...