2017-09-12 9 views
1

私は、同じ大きな 配列(〜4 GB)をロードし、この配列の チャンクで完璧な並列処理を行う必要があるPythonアプリケーションを持っています。アレイはディスクに保存されます。同じノード内の共有メモリを使用するPythonハイブリッドマルチプロセッシング/ MPI

通常、このアプリケーションは、 のようなクラスターコンピューター上で実行します。各ノードには、8個の コンピューティングコアと約32GBの合計RAMがあります。

n = 80 mpi4pyという最も簡単な方法(うまくいかない)があります。それが動作しない理由は、 各MPIコアが4GBマップをロードするため、のRAMが32GBになるので、MemoryErrorになります。しかし、このアプローチが原因でネットワーク 帯域幅の問題の遅い -

代替はrank=0が 4GBの配列をロードする唯一のプロセスであり、そしてそれはMPIコアの残り に、配列のチャンクを出し農場ということです。

最善のアプローチは、各 ノード上の残りの7つのコアであれば1つのだけコア各ノード負荷 4GBのアレイと、このアレイは、(multiprocessing介して?)共有メモリ として利用可能になるであろう。

どうすればこの問題を解決できますか? MPIにノード を認識させ、座標をmultiprocessingにするにはどうすればよいですか?

答えて

1

multiprocessingモジュールには共有メモリがありません。

メモリビューを使用して、大量の配列を共有する方法はjoblibです。データの重複を避けるためにmanual memory mappingを使用することができます。

各ノードで一度だけデータを渡す方法を見つけるには、ノードごとに1つのMPIプロセスを起動し、大量のnumpy配列入力に自動的にmemmapingを使用するので、残りの計算にはjoblibを使用します。

+0

私はそれを試していませんが、これは私に指摘されています: https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array 'マルチプロセッシングでメモリを共有する方法' – dbrane

+0

これは共有メモリを効果的にエミュレートしますが、メモリマップよりも遅いです。これは、プロキシ関数を使用して読み書きする同期処理(通信効率的ではありません)に依存するためです。また、線形代数が必要な場合、効率的なnumpy計算を使用することはできません。 –

関連する問題