重力の干渉が問題です。システムにN個の粒子があり、M個のプロセスがある。 現在のプロセスの個々のブロックにパーティクル(すべて11個のパラメータがあります)の新しい位置を計算し、その後、すべての他のプロセスに新しいデータをブロードキャストします。MPI_BCastからデータを受信する方法
double * particles;
...
int startForProcess = numberOfParticlesPerThread * 11 * rank;
int endForProcess = startForProcess + numberOfParticlesPerThread * 11;
calculateNewPosition(particles, startForProcess, endForProcess, nParticles, rank);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(particles+startForProcess, endForProcess - startForProcess, MPI_DOUBLE, rank, MPI_COMM_WORLD);
残念ながら、各スレッドで私はこのスレッドで行われた変更を見ることができます。 はここに私のコードです。プロセス間に通信はありません。
私に間違っていると教えてください。
私はこのストレートを手に入れましょう:各プロセス(MPIはスレッドではなくプロセスで動作します)をして、結果を他の人と共有したいですか? 「Bcast」は1対1の呼び出しであり、全部ではありません。 – suszterpatt
g.inozemtsevによるMPI_Allgatherの答えはあなたの質問に対する正解ですが、実はこのコードをプロダクションコードとして使用することは望ましくありません。実際のn-bodyシミュレーションにこのアプローチを使用する予定がある場合は、離れたパーティクルが重力に寄与しないという事実を利用する他のアプローチがあります - barnes-hut、fast multipoleメソッド、particle-meshなどn^2アプローチを使用する直接的な計算機であっても、通常、「パイプライン化」型のコミュニケーション手法を使用します。 –