私のコードでは、ローカルベクトルの一部を交換する任意の数のプロセスがあります。ローカル ベクトルはペアのベクトルであるため、MPI 派生データ型を使用しています。原則として、各プロセスが他のプロセスに送信する要素の数がわからないため、バッファのサイズも送信する必要があります。特に、各プロセスは、ランク: myrank-1 のプロセスとランク: myrank+1 のプロセスとデータを交換します。myrank-1 の代わりにプロセス 0 の場合、ランク comm_size-1 のプロセスと交換します。また、プロセスが myrank+1 ではなく comm_size-1 の場合、ランク 0 のプロセスと交換します。これが私のコードです。
unsigned int size1tobesent;
size1tobesent=last.size();//Buffer size
int slpartner = (rank + 1) % p;
int rlpartner = (rank - 1 + p) % p;
unsigned int sizereceived1;
MPI_Sendrecv(&size1tobesent, 1, MPI_UNSIGNED, slpartner, 0,&sizereceived1,1,
MPI_UNSIGNED, rlpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Vect first1(sizereceived1);
MPI_Sendrecv(&last[0], last.size(), mytype, slpartner, 0,&first1[0],sizereceived1,
mytype, rlpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
unsigned int size2tobesent;
size2tobesent=first.size();//Buffer size2
unsigned int sizereceived2;
MPI_Sendrecv(&size2tobesent, 1, MPI_UNSIGNED, rlpartner, 0,
&sizereceived2,1,MPI_UNSIGNED, slpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
Vect last1(sizereceived2);
MPI_Sendrecv(&first[0], first.size(), mytype, rlpartner, 0,&last1[0],
sizereceived2 ,mytype, slpartner, 0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
2 つまたは 3 つのプロセスでコードを実行すると、すべて期待どおりに動作します。3 つ以上の場合、結果は予測できません。これが入力データの特定の組み合わせによるものなのか、それとも見落としている理論上のエラーがあるのか はわかりません。最後に、このコードが for サイクルの一部であることを考慮してください。