2012-04-11 18 views
0

OpenMPIを使用して異なるプロセッサにhist(1:1000)という同じアレイを割り当てたい場合、プロセッサが変更されたときにこの変更が残りのプロセッサで更新されるようにします。MPIを使用して別のプロセッサで同じアレイを使用する方法

私はコードを書いてhist(1:1000)と宣言しましたが、問題はhistが各プロセッサで独立して更新されているため、情報に基づいて別のヒストグラムを更新するために「マスターノード」にデータを送信することですこれは私が欲しくないものです。私は同じヒストグラムを各プロセッサで更新したいと思っています。

OpenMPIでこれを行うことはできますか?

+0

ヒストリを共有変数として宣言してみましたか? – Neo

+0

どうすればいいですか?敬具。 – armando

+0

おっと..私の間違い..私はOpenMPとして誤解しています。ちょうどopenmpIであることに気がつきました。以下の答えで述べたmgilsonのように、OpenMPを使用できるのであれば、共有変数を持つことができます。ただし、OpenMPはスケーラビリティに影響します。したがって、MPIを続行する場合は、MPI_Gatherのような収集操作を使用する必要があります。その周りに他の方法はありません! – Neo

答えて

6

私の知る限り、この種のことはMPIでは不可能です。 MPIの目的は、あるプロセスから別のプロセスへのメッセージの受け渡しを実装することです(したがって、名前 - メッセージ受け渡しインターフェイス)。共有メモリを使いたいのであれば、少なくともgcc/gfortranとおそらく他のコンパイラのホストでサポートされているOpenMPのようなものを使うのが最善の方法です(おそらくそこにあると思います)。あなたはスレッドを使うことができます...しかし、最終的には、これらのどれもがMPIのような1000年代のプロセッサには対応しません。言いましたように、ヒストグラムはヒストグラムを保存しているので、使用しているすべてのヒストグラムの合計がほしいのではないかと思います。 hist。彼らは変更されてきた後にMPIは「

1

私はドン

http://mpi.deino.net/mpi_functions/MPI_Allreduce.html

(あなたが望む操作はおそらくMPI_SUMある)

が、例えばこれを見る...あなたのためのすべてのアレイを合計することができますあなたのアプリケーションを正確に知っていますが、MPI_Bcast関数に興味があるかもしれません。それはあなたのすべてのプロセッサに配列をブロードキャストします。しかし、多くのMPI_Bcastを使うのは良い考えではありません。なぜなら、長い時間が処理ではなく通信に使われるからです。

+0

MPI_Allreduceは、MPI_Reduceとそれに続くMPI_Bcastと考えることができます(ただし、より効率的に実装されることが期待されます)。 – mgilson

0

one-sided通信の助けを借りて、あるプロセスのアレイを他のプロセスと共有することができます。しかし、これは多くの人にとって最適ではない解決策とみなされています。おそらく、アルゴリズムを再考して、メッセージパッシングを通してより多くのメッセージを作成する方が良いでしょう。

+0

broken link one-sided。 –

+0

@ bogdan.rusuありがとう、それを修正しました。 – haraldkl

関連する問題