mpirun -np x taskを介してタスクがx倍に増加すると、PBS出力「mem」と「vmem」が同じままになることを理解する方法

mpirun -np x taskを介してタスクがx倍に増加すると、PBS出力「mem」と「vmem」が同じままになることを理解する方法

私が試した簡単な実験は次のとおりです。

モデルシミュレーションを実行する「sim.exe」というアクションが与えられたら、MPIを使用して1つのノード(共有メモリシステム)でx「sim.exe」を同時に実行します。私は異なるx値(例:1、4、8、16)を使用して4つの異なる実行を試みました。その後、PBSレポート「Memory Used」と「Vmem Used」でメモリ使用量を確認しました。 「メモリー使用」と「メモリー使用」が異なる実行で同じままであることを観察しました。 "mem" = 8,432KB および "vmem" = 489,716KB。

投稿によると、「mem」と「vmem」の私の理解は、作業に使用されるメモリリソースです。memとvmemについてそして物理メモリ使用量の処理。それでは、ジョブのジョブが倍増しても、「mem」と「vmem」が同じままになるのはなぜですか?

これらすべてのジョブは、PBSジョブスケジューラを介して送信されます。各ジョブに対してジョブが送信されると、すべてのコアとRAMが要求されます。#PBS -l select=1:ncpus=24:mem=96GB

この質問の更新:

私はx "sim.exe"を同時に起動する代わりにthreadingPythonでこれをテストしました。mpiそのため、xスレッドを起動し、各スレッドでサブプロセスを使用して「sim.exe」モデルシミュレーションを呼び出しました。 x = 1,4,8,16を使用して4つの実験を再試行しました。 xが増加するにつれて、タスクで使用される「mem」と「vmem」が直線的に増加することが観察されましたが、これは私が予想したものに近いです。

もしそうなら、PBSが「mem」と「vmen」を正しく計算しない可能性はありますか? PBSは1インスタンスのメモリ使用量のみを計算するようです。

答え1

わかりませんが、私が覚えている限り、MPIはノードごとに1つのインスタンスのみを起動し、いくつかの初期化後にプロセスを要求されたレプリカxにフォークします。つまりsim.exe、フォーク後に追加のメモリを割り当てないと、すべてのメモリがレプリカ間で共有され、xその量はプロセスを追跡するためのオペレーティングシステムの小さなオーバーヘッド以外にメモリ使用量に影響を与えません。x

分岐後にいくつかのデータをロードするか、いくつかのメモリを割り当てると、メモリ使用量とx

スレッドサブプロセスシナリオでは、すべてのxプロセスが独自の初期化を実行するため、MPIシナリオほど多くのメモリは共有されません。 (彼らはまだライブラリメモリに似たメモリマッピングI / Oを共有しています。)

この動作を完全に理解するには、それを置き換える小さなMPIプログラムを作成し、いくつかのMBのsim.exe静的データ(たとえば、いくつかの種類の静的配列)と動的に割り当てられたメモリを使用してインスタンスサイズと数量を試すことを提案します。 。私の考えでは、静的データは同じノードの並列MPIインスタンス間で共有されますが、動的データ(MPIがインスタンスをフォークした後に割り当てられる)は共有されていないようです。

追加資料: fork()の書き込み中のコピーは複数のブランチをどのように処理しますか?

関連情報