2016-09-12 4 views
0

私はプロセス間に「仮想ボール」をバウンスするプログラムを書いています。ルートプロセス、すなわちランク0のタスクは、ゲームを初期化し、rand() % size(初期ランクによってシードされた乱数が生成される)によって決定されるランダムプロセスにそれを送る。私がやってみたことMPIのさまざまなプロセスと送受信する

:これは、次のランダムプロセスではなく、このコードを実行している時にボールを送り、

int rnk= rand() % size; MPI_Send(&ball,1, MPI_INT, rnk, MPI_COMM_WORLD);

を遮断するMPI_Send関数によって、最大保持されています。私はちょうど並列プログラミングを始めたので、私はこれを十分に把握していません。ランダムなプロセスにどのように送信すれば、さらにランダムなプロセスに送信するのですか?

指針、ヒント、本、チュートリアルは歓迎します。

+2

あなたが試したことの[mcve]を入力してください。 – Zulan

+1

を参照してください。http://stackoverflow.com/questions/4348900/mpi-recv-from-an-unknown-source – francis

+0

問題は、MPIプロセスの1つが競合状態のためにハングしていたことでした。私はそれを解決し、プログラムは期待どおりに実行されました。 –

答えて

0

MPI_ANY_SOURCEをソースとして使用できます(francisのコメントを参照)。

最初に送信する必要があるルート以外のすべてのプロセスで、最初にMPI_Recvを呼び出していることを確認してください。

1

rootが最初に自分自身に送信しようとすると、ここで問題が発生します(これは、rand()の%sizeが0になる可能性があるため)。

  • 最初に受信をポストすると、(@ Gregorで指摘されているように)送信コールには届かないためブロックされます。
  • しかし、最初に送信をポストした場合、MPI_Send()はではないので、受信コールに進むことは保証されませんは非同期であることが保証されています(つまり、同期送信一致する受信を永久に待つ)。

デッドロックの可能性を回避するために、送信者が送信しないようにするか、ノンブロッキングセンド(またはノンブロッキング受信)を使用する必要があります。

関連する問題