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++;
}
}