8

私はFortranで書かれた流体の流れと熱伝達の解析プログラムの最適化に取り組んでいます。ますます大きなメッシュシミュレーションを実行しようとすると、メモリ制限の問題が発生します。ただし、メッシュはそれほど大きくはありません。一般的なCFDコードを実行するには、わずか500,000個のセルと小さなピーナッツが必要です。問題のために80GBのメモリを要求しても、仮想メモリが不足しているためにクラッシュします。

どのアレイがそのすべてのメモリを占有しているのか、いくつか推測できます。特に1つは(28801,345600)に割り当てられています。計算が間違っている場合は訂正してください。ただし、倍精度配列は値ごとに8ビットです。したがって、このアレイのサイズは28801 * 345600 * 8 = 79.6 GBになりますか?

さて、この配列のほとんどは計算全体でゼロになると思うので、それらを格納する必要はありません。解のアルゴリズムを変更して、ゼロ以外の値のみを格納し、はるかに小さな配列で処理できると思います。ただし、サイズを縮小するための適切なアレイを確認したいと思います。それで、最初に、上記の配列サイズを正しく計算しましたか?そして第二に、実行時にFortranにMBまたはGB単位の配列サイズを表示させる方法はありますか?最もメモリを大量に消費する配列を出力することに加えて、実行時にコードのメモリ要件がどのように変化するかを確認したいと思います。

4

1 に答える 1

4

メモリ使用量は、仮想メモリを備えたシステムでは非常に漠然と定義された概念です。大量のメモリを割り当てることができますが(仮想メモリサイズが大きい)、実際にアクティブに使用されているのはその一部にすぎません(常駐セットサイズが小さい-RSS)。

Unixシステムはgetrusage(2)、呼び出し元のスレッド/プロセス/プロセスの子によって使用されているシステムリソースの量に関する情報を返すシステムコールを提供します。特に、プロセスが開始されてからこれまでに到達したRSSの最大値を提供します。構造体のフィールドのgetrusage(2)値を呼び出して返す単純なFortran呼び出し可能ヘルパーC関数を作成できます。ru_maxrssrusage

Linuxで実行していて、移植性を気にしない場合は、を開いてから読み取ることができます/proc/self/status。これは単純なテキストの疑似ファイルであり、特に、プロセスの仮想メモリ使用量に関する統計を含む数行が含まれています。

...
VmPeak:     9136 kB
VmSize:     7896 kB
VmLck:         0 kB
VmHWM:      7572 kB
VmRSS:      6316 kB
VmData:     5224 kB
VmStk:        88 kB
VmExe:       572 kB
VmLib:      1708 kB
VmPTE:        20 kB
...

さまざまなフィールドの説明-ここVmDataあなたは主に、、およびに興味がVmRSSあります。で通常の​​ファイルとして開き、Fortranコードで完全に処理できます。VmHWMVmSize/proc/self/statusOPEN()

ulimit -aおよびで設定されているメモリ制限も参照してくださいulimit -aH。ハード仮想メモリのサイズ制限を超えている可能性があります。分散リソースマネージャー(SGE / OGE、Torque / PBS、LSFなど)を介してジョブを送信する場合は、ジョブに十分なメモリを要求していることを確認してください。

于 2012-06-21T18:04:16.003 に答える