1

の「count」パラメーターの違いを正しく理解しているかどうかはわかりません。

    int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, 
           MPI_Op op, int root, MPI_Comm comm);

および の 'blocklens' パラメーター:

int MPI_Type_struct(int count,
               int blocklens[],
               MPI_Aint indices[],
               MPI_Datatype old_types[],
               MPI_Datatype *newtype);

自分のタイプのリダクションを実行したいとします:

typedef struct buffers_s
{
   double *buf1, *buf2;
} Buffers;

ここで、buf1 と buf2 は両方とも N 個の要素に割り当てられます。

次に、MPI_Type_struct() を呼び出して 'Buffers' に基づいて新しい mpi タイプ 'Custom_MPI_Type' を作成するときに、'count' を 2 に、blocklens[0] を N に、blocklens[1] も N に設定します。

次に、MPI タイプが作成されたら、リダクション オペレータ 'MyOp' も作成したと仮定して、'datatype' を 'Custom_MPI_Type' に設定して MPI_Reduce() を呼び出します。それでは、'count' パラメータの値はどうあるべきでしょうか?

私の経験から、N に設定すると機能しますが、作成したばかりの MPI タイプが長さ N の 2 つのブロックで構成されていることを既に指定していることを考えると、その意味がよくわかりません。

別の言い方をすると、MPI_FLOAT などの基本型の配列で MPI_Reduce() を使用する場合、「count」パラメーターは、MPI_Reduce() の最初の引数として指定されたアドレスから始まる MPI_FLOAT 型の要素の数を指定します...論理的にはカスタム データ型を使用する場合、この型が MPI_DOUBLE などの特定の基本 MPI_Datatype の N 要素の 2 つのブロックで構成されることを MPI が既に認識している場合、count を Custom_MPI_Type 型の 1 要素に設定する必要があります。

誰かがそれをすべて説明できますか?

4

1 に答える 1

0

MPI の派生データ型は、一般に、 などの型では機能しませんBuffers。Jonathan Dursi は、他の質問で理由を説明しています。構造体データ型は、次のような C/C++ 構造体で動作することを意味します。

#define N 1000

typedef struct buffers_s
{
   double buf1[N], buf2[N];
} Buffers;

この場合、とのインスタンスの先頭からのオフセットはbuf1、 との両方が動的に割り当てられたメモリを指している場合とは異なり、常に同じです。buf2Buffersbuf1buf2

つまり、 (のblocklengthsパラメーターはMPI-2 では廃止され、MPI-3.0 では削除されているため、使用しないでください) は、データ型自体の形状を記述するために使用されます。新しいデータ型の - 番目の要素に含まれるtype の要素の数を MPI に通知します。上記の構造の場合、.MPI_Type_create_structMPI_Type_structblocklengts[i]old_types[i]iblocklengths[0] = blocklengths[1] = N

へのcount引数は、削減するMPI_Reduceの要素の数を MPI に伝えます。datatype構造体のデータ型である場合datatype、構造体のインスタンスがいくつあるかを意味します。の 10 個のインスタンスの配列がある場合、上記のコード例を続けますBuffers

Buffers bufs[10];

次に10count引数で指定します。これは、構造体型コンストラクターのブロック数と完全に直交しています。1 つのプロセスによって通信される要素の総数はcount、 のすべての要素の合計の倍になりblocklengts[]ます。派生データ型の要素が 1 つだけ削減されている場合は、1 に設定する必要があると正しく結論付けましたcount

于 2012-11-19T09:15:48.173 に答える