1 到 1000 的并列数求和

Sum of the numbers 1 to 1000 in parallel

以下代码使用 2n 个 CPU 来计算 11000 的总和。每个处理器计算此聚合的一部分并独立显示输出。

所有处理器计算的最终结果由第一个处理器收集并聚合,最终结果显示在输出中。

#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 是零?

以下函数return 错误

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);

只需传递对 MyNodeNodes 的引用:

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

MPI_Comm_size returns MPI_SUCCESS on success. Otherwise, the return value is an error code.