1

MPI_Reduce を使用する場合、複雑なデータ構造を処理する必要があります。そのため、MPI_Op_create を使用して独自の reduce 関数を定義する必要があります。しかし問題は、非常に単純なユーザー定義関数であっても、1 つまたは複数のプロセスがクラッシュし続けていることです。これは MPI_SUM と同じです。

コードは以下に添付されています。MPI_Reduce のパラメーターを「myOp」から「MPI_SUM」に変更すると、コードは完全に機能することに注意してください。したがって、問題はユーザー定義関数「myOp」にあると確信しています。しかし、関数「MAX_DataSet」でさらにデバッグすると、関数が適切に機能し、内部で正しい結果が得られることが示されました。しかし、プログラムは MPI_Reduce を正しく実行できません。その理由は何ですか...どんな助けでも大歓迎です!

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

using std::cout;
using std::endl;

void MAX_DataSet(int *in, int *inout, int *len, MPI_Datatype *datatype);

int main(int argc,char **argv)
{
    int procSize, procID, x, sum;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &procSize);
    MPI_Comm_rank(MPI_COMM_WORLD, &procID);
    MPI_Op myOp;
    MPI_Op_create((MPI_User_function*)MAX_DataSet, true, &myOp);

    if (procID == 0)
        x = 15;
    else
        x = procID;
    MPI_Reduce(&x, &sum, 1, MPI_INT, myOp, 0, MPI_COMM_WORLD);
    if (procID == 0)    // process 0 cannot go here
        cout << sum << endl;

    MPI_Finalize();
    return 0;
}

void MAX_DataSet(int *in, int *inout, int *len, MPI_Datatype *datatype)
{
    for (int i = 0; i < *len; i++)
    {
        *inout = *in + *inout;
        in++;
        inout++;
    }
}
4

0 に答える 0