の「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 要素に設定する必要があります。
誰かがそれをすべて説明できますか?