2016-05-03 12 views
0

これを行うにはスマートな方法があるのだろうかと思っていました。私が3つのノード0,1,2を持っているとしましょう。そして、各ノードに配列a0、a1、a2があるとしましょう。各ノードの内容はMPI通信パターン

a0 = {0, 1, 2, 1} 
a1 = {1, 2, 2, 0} 
a2 = {0, 0, 1, 2} 

のようなものが巧妙な通信パターンが存在している場合ので、それはすなわち、ノード

a0 = {0, 0, 0, 0} 
a1 = {1, 1, 1, 1} 
a2 = {2, 2, 2, 2} 

私が考えているアプローチを対応だし、各番号を移動するには、並べ替え伴うだろうと一時的なバッファーが、私は賢い方法があったかどうか疑問に思っていた?

+2

私は理解していない - など、1 A1、あなただけの0とA0を埋めるcan't?おそらくあなたの問題が、あなたの例で示されているよりも多くあります。また、 "3つのノード、0,1,2"という意味と、MPIの "ノード"(コンピュータ)または配列の0,1,2の値との関係については、明確ではありません。 –

+0

Johnに感謝します。私はチューランが正しい道にいると思う。 3つのノードは別々のコンピュータです。はい、それ以上の問題があります。私は自分の意図をより明確にするために配列の値を選んだだけです。私はそれで失敗したと思うxp – inJeans

答えて

1

次のようにして、このためMPI_Alltoallvを使用することができます。

  1. ソートlocal_dataa)昇順で各要素の節点に対応することによって。
  2. send_displacements[r]が、ノードrを参照するlocal_dataの最初の要素のインデックスを示すように、send_displacementsの配列を作成します。
  3. send_counts[r]がノードrに対応するlocal_dataの要素の数に等しくなるようにsend_countsの配列を作成します。これは最後のランクを除いてsend_counts[r] = send_displacements[r+1] - send_displacements[r]と計算できます。
  4. MPI_Alltoall(send_counts, 1, MPI_INT, recv_counts, 1, MPI_INT, comm)
  5. recv_displacements[r] = sum(recv_counts[r'] for all r' < r)のように計算する。
  6. recv_dataにsum(recv_counts)要素を用意します。
  7. MPI_Alltoallv(local_data, send_counts, send_displacements, MPI_INT, recv_data, recv_counts, recv_displacements, MPI_INT, comm)
+0

ありがとうZulan私はこれが私が心に持っていたアプローチだと思います(もう少し詳しく説明します)。これはこの種の問題の典型的なコミュニケーションパターンですか? – inJeans

+0

私はこれがこの問題に近づくための非常に慣れ親しんだ方法だと言います。しかし、私はこれが共通の問題だとは思わない。 – Zulan

関連する問題