問題タブ [mpi4py]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1704 参照

python - MPI の設計パターン: 送信のブロック時にルート プロセスをスリープさせ、適切な負荷分散を行う

次のような mpi4py を使用して、Python で MPI コードを実行しています。

ルート プロセスが常にビジー状態 (CPU 使用率 100%) であることに気付きました。ワーカー プロセスが次のメッセージを受信する準備ができるまで、ルート プロセスをスリープ状態にすることを好みます。この動作を容易にする MPI プログラミングのパターンにはどのようなものがありますか? おそらく、ルートプロセスも機能しているはずですか?

この設計のもう 1 つの欠陥は次のとおりです... ワーカー proc 4 が 3 より前に終了した場合、4 は 3 が終了するのを待ってから、ルートから作業を続行するための新しいメッセージを取得する必要があります。次のメッセージを常にアイドル プロセスに送信しようとするルート プロセスを設計する方法について何か提案はありますか? メッセージを受信する最初のプロセスは通常、最初に完了するプロセスであるため、これはほとんど問題ありません。ただし、ワークロードがメッセージごとに変化する場合、これが常に当てはまるとは限りません。

ありがとう、ケビン

0 投票する
1 に答える
2027 参照

python - mpi4pyを使用してプロセスを異なるノードに送信する

クラスター内の複数のノードで評価したい関数があります。を使用してクラスターで実行する簡単な例を取得しましMPI4pyたが、物事をもう少しユーザーフレンドリーにする (のmap機能を実装するなどmultiprocessing) だけでなく、生成されるプロセスの数をもう少し制御できる python パッケージを見つけたいと思っていました。どのノードで。実装するパッケージはいくつか見mapましたが、各ノードで生成されるプロセスの数を制御するパッケージはありません。

次のコードは、私の言いたいことをほぼ示しています。ただし、通常の方法で記述する代わりにMPI4py、関数で行うように記述しましたmap。私がこのように書いたのは、これが最終的にコードを実装したい方法であり(をエミュレートするモジュールをmap使用)、MPIを使用して自分がやりたいことを達成する方法がよくわからないためです。 .

各ノードに送信されるプロセスの数を制御したい理由は、内部の命令の一部fooがマルチスレッド化できるためです ( dotMKL ライブラリーにもリンクされるように)。

それぞれ 2 つのコアを持つ 12 台のコンピューターのクラスターがある場合、12 のノードのそれぞれに 1 つのジョブを送信するだけで、暗黙的に両方のコアを利用できます。両方のプロセスが両方のコアを使用しようとすると、スレッド スラッシングの可能性が心配なので、24 個のジョブ (コアごとに 1 つ) を生成したくありません。また、最初の 6 つのノードに 2 つではなく、各ノードに 1 つを送信するかどうかわからないため、12 のプロセスを生成することもできません。

まず、これは大きな懸念事項でしょうか。12 プロセスではなく 24 プロセスを実行すると、パフォーマンスにどの程度の影響がありますか?

それが違いを生む場合、上にオーバーレイしMPI4pyて探していることを実行するpythonパッケージはありますか?

0 投票する
1 に答える
1541 参照

python - IPython ノートブック MPI クラスターの開始

MPI 機能を備えた IPython クラスターを開始しようとして非常に苦労しています。まず、MPI と MPI4py がインストールされており、動作しています。ipython内からmpi pythonコードを実行する方法をついに見つけました。ただし、IPython ノートブックで動作する mpi プロファイルを取得しようとしていて、途方に暮れています。私はすべてのドキュメントを読み、このテーマに関する講義をたくさん見ましたが、誰かがしていることを再現しようとするたびに、常にエラーが発生します。わかりましたので、bashプロンプトから入力すると:

ノートブックに移動して、そのクラスターを確認できます。次に、アクション開始ボタンを押して開始すると、起動します。しかし、そうすると:

私は得る:

さらに私がする場合:

rc=parallel.Client() 行を指すエラーが発生します。したがって、これらは両方ともデフォルトのクラスターで正常に機能します...また、試しました

bashプロンプトから、そこからクラスターを開始しようとすると、いつでもプロンプトが返されません。GUIボタンでprofile = mpiを開始した後にノートブックからこれを配置すると、次のようになります。

別のエラーが表示されます。この 2 日間シミュレーションを実行できるように、このことを実行しようとしてきましたが、これを行う方法を誰も知らない学校にいます。誰か助けてください

0 投票する
1 に答える
546 参照

parallel-processing - MPI と mpi4py を使用したループのメモリ効率の高い並列化

私は並列プログラミングと MPI に不慣れで、このおそらく簡単な問題で立ち往生しています...

重力的に相互作用する N 個の粒子のシステムを時間的に進化させるコードを書こうとしています。これは、私が行った単純なアルゴリズムを使用すると非常に簡単です。しかし今、私は自分のコードを並列化したいと考えています。具体的には、mpi4py を使用して Python で書いています。単純化された (そして非常に最適化可能ですが、それは重要ではありません) 非並列実装は次のようになります。

このアルゴリズムを並列化するにはどうすればよいですか? パーティクルの数Nが非常に多くなる可能性があるため、メモリを節約するために、ルート プロセスにのみ保存しますposvel私が最初に考えたのは - ループを並列化することでしたiが、すべてのプロセスは依然として全体にアクセスする必要がposあります! velつまり、Scatter/Gather スキームは役に立ちません。

posすべてのプロセスでandのコピーをvelメモリ内に保持する必要がありますか、それとも何らかの方法がありますか? 簡単な方法は、重複を作成せずに、すべてのプロセスを含むメモリposを共有することです。velこれが MPI (特に mpi4py) で可能かどうかはわかりません。

どんな助けでもありがたく受け入れます!

0 投票する
1 に答える
547 参照

python - mpi4py の収集は、ランクに一致する要素を持つリストを作成しますか?

プログラムで mpi4py を使用しています。n>1 のコアでプログラムを実行し、各コアには独自のリスト (数字の「core_specific_list」と呼ぶことができます) があります。ランク 0 のコアに、「big_list」と呼ぶことができる 1 つの大きなリストにすべてのリストを収集させたいと考えています。 .

プログラムを次のように開始します (変数を定義するためだけに):

したがって、大きなリストにこれを実行させるために、各コアに次の呼び出しをさせます。

これにより、期待どおりに big_list作成されます (各要素は他のランクの core_specific_list の 1 つです)。また、各リスト要素は送信者のランク順に並んでいるようです (つまり、big_list の要素 0 はランク 0 の core_specific_list などです)。

質問:しかし、この仮定は正しいですか? つまり、big_list の要素 j はランク j の core_specific_list ですか? (私が行ったようにいくつかのケースでこれをテストできることは理解していますが、この仮定に頼ることができることを絶対に確認する必要があります)

ありがとうございました。

0 投票する
0 に答える
690 参照

python - MPI4py: プロセス間のループを介した MPI 通信

私のプログラムには2つのプロセスがあります。process(0)マスターはどこにあり、process(1)スレーブはどこですか。両方に共通のループがあります (0 から 4 まで増加します)。ivalue( ) をprocess(1)fromに送信しようとしていますprocess(0)。しかし、 fromprocess(1)の新しい値を取得しません。iprocess(0)

これは現在私が得る出力です:

理想的には、process(1)印刷する必要があります[0] [1] [2] [3] [4]

0 投票する
1 に答える
970 参照

python - mpi4py のどの操作が「同期」操作ですか

MPI をインポートする mpi4py を使用して Python コードを作成しています。次に、グローバル コミュニケーター MPI.COMM_WORLD をセットアップし、変数 comm に格納します。

このコードを n > 1 のスレッドで実行していますが、ある時点ですべてのスレッドが for ループに入ります (すべてのコアで反復回数が同じになります)。

for ループ内には、「comm.reduce(...)」呼び出しがあります。これはコアの数が少ない場合は機能するようですが、問題のサイズが大きくなると (たとえば 64 コアの場合)、プログラムが「ハング」することがあります。

これが reduce(...) 呼び出しと関係があるかどうか疑問に思っています。この呼び出しにはすべてのスレッドが必要であることはわかっています (つまり、合計で 2 つのスレッドを実行するとします。1 つのスレッドがループに入り、もう 1 つのスレッドが何らかの理由でループに入らない場合、reduce(...) 呼び出しが待機するため、プログラムはハングします。両方のスレッドに対して)。

私の質問は次のとおり です。reduce 呼び出しは「同期」タスクですか、つまり、「comm.Barrier()」呼び出しのように機能しますか? また、可能であれば、より一般的に、同期タスクは何ですか (バリア以外にある場合)?