2011-04-03 7 views
1

私はプログラムを作成しています。ここでは、C言語のMPIで2-4のプロセスが使われます。私は、実際の行の下にある各行を、サイクリックマッピングによって異なるプロセスに送信しています。MPI - 行列の行を送受信する

行列5 * 6に対して、アクティブな行0と4つのプロセスがある場合、行1をプロセス1に、行2をプロセス2に、行3をプロセス3に、行4をプロセス1に再度送ります。私はいくつかの計算を行い、いくつかの値をプロセス0に戻したいと考えています。プロセス0では、元の行列にそのeseを追加します。私の質問は、どのSendとRecvコールを使うべきですか?

いくつかの理論的なコードがあります:

if(master){ 

    for(...) 
    //sending values to other processes 
    } 

    for(...) 
    //recieving values from other processes 
    } 
}else{//for other non-master processes 
    recieve value from master 
    doing some computing 
    sending value back to master 

} 

私だけの単純なブロッキング送信を使用する場合は、行1と4を取得するので、私は、プロセス1に何が起こるか分からない、と私はCALれる前にrecv in master、プロセス1の私の価値 - 行1は行4で上書きされるので、私は1セットのデータが欠けているでしょうか?私の質問では、どのような種類のMPI_Sendを使うべきですか?

答えて

0

行4を待っている間にproc 1が行1で何かをやり始めることができれば、非ブロッキングを利用できるかもしれませんが、ブロッキングもやはり始めるのが良いでしょう。

アルゴリズムには多くの同期が組み込まれています。誰もが現在の行に基づいて作業する必要があります。したがって、受信プロセスでは、この手順の各反復で期待される作業の量を知る必要があります。これは、行の総数と現在処理中の繰り返しを知っている場合は簡単です。したがって、2つの行を待っている場合は、2つのブロックrecvを実行するか、2つのnonblocking recvを起動し、1つ待ち、最初の行の処理をすぐに開始できます。しかしおそらく最も簡単に働くことを阻止するのが最も簡単です。

開始時にも、すべてのセンドを同時に開始することができるように、マスタープロセスが終了しても効果的です。 waitallは何らかの順序でそれらを処理できます。

しかし、この1対多の通信よりも優れているのは、おそらくより効率的に進むことが期待できるscattervを使用することでしょう。

この一連の質問に対して多くの回答とコメントがありましたが、実際にはこれまで対処していないと思われるものがあります。このプロジェクトを教育目的でやっていることを本当に願っています。 Scalapack,PETSc、およびPlapackのような調整されてテストされたツールが無料でダウンロードされている場合、実際にあなた自身の並列線形代数ソルバーを実際に実装することは完全に完全に狂っているでしょう。

+0

こんにちは、はい、それは教育目的のため、回答ありがとうございます – Waypoint

関連する問題