1つのメインアレイに特定のデータを追加することを目的としたプログラムがあります。乱数テストpassesTest(randomNumber)
は毎秒数百万回実行され、非常にまれにテストに合格して、乱数がアレイの最後にプッシュされます。したがって、ほとんどの場合、計算が行われている間、アレイはそこに座っているだけです。
この手順をMPIと並列化することにしました。これは、乱数テストを実行する1000個のプロセッサが大幅に高速化されると考えたためです。また、メモリの書き込みは非常にまれであるため、MPIはこの作業に適しています。残念なことに、私のプログラムは、mpirun -np 1
追加するプロセスごとに最速で、大幅に遅くなります。
while
を含むループの最後にpassesTest(randomNumber)
、MPI::COMM_WORLD.Allgather()
配列にプッシュする必要のある新しい乱数があるかどうかを示すフラグを各プロセスから収集する必要があります。フラグのいずれかがあれば、true
別のフラグを実行Allgather()
して実際にこのデータを収集し、各プロセスの配列のローカルコピーにプッシュします。繰り返しにAllgather()
なりますが、テストに合格することはめったにないため、この2番目の実行は非常にまれです。
したがって、私のボトルネックは、新しいデータがあるかどうかを確認するために、各MPIプロセスからすべてのフラグを収集していると推測しています。各乱数のテストは高速に実行されるため、複数のプロセスからデータを収集するオーバーヘッドのために、1秒あたり数十億のwhileループが大幅に削減されたと思います。これは良い推測ですか?私はMPIを初めて使用するため、どのようなタイムスケールが関係しているかわかりませんAllgather()
。
これが理由である場合、テストに合格したときに他のプロセスとのみ「対話」するにはどうすればよいですか?これが本当にやりたいことのすべてです。つまり、乱数がテストに合格した場合は、他のすべてのプロセスにメッセージを送信して、実行中の処理を停止し、その番号を配列に追加します。