n個のプロセスがあり、それぞれがintなどのローカルデータを所有しているとします。
ここで、 MPI_Allreduce()関数を再実装します。つまり、これらすべてのintのグローバル合計を計算し、結果の合計をプロセスにブロードキャストします。
私は以下のコードのようにそれをやろうとしました:
int temp;
int my_sum = temp = my_data;
for (int i = 1; i < size; ++i) {
int partner = (my_rank + 1) % size;
MPI_Sendrecv_replace(&temp, 1, MPI_INT,
partner, 0,
my_rank, 0,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);
my_sum += temp;
}
プロセスがリングファヒオンで通信するようにしますが、それはブロックしています。なんで?正しく動作するようにコードを変更するにはどうすればよいですか?
注:問題の代替(より良い)解決策を提案しないでください(明らかに、そのうちの1つはMPI_Allreduce()関数を使用することです)。私の目標は、このコードスニペットが期待どおりに機能しない理由を理解することです。