メモリ処理

OptiStructのモジュール群

OptiStructは、バージョン2020の時点では、一部の単精度(64ビット整数、32ビット浮動小数点)モジュールを除き、主に完全に64ビット(64ビット整数、64ビット浮動小数点)のモジュールでパッケージ化されています。

OptiStructは、バージョン2020の時点では、一部の単精度(64ビット整数32ビット浮動小数点)モジュールを除き、主に完全に64ビット64ビット整数、64ビット浮動小数点)のモジュールでパッケージ化されています。単精度モジュールは、必要に応じて-sp実行オプションで選択することができます。

OptiStruct 2021.1以降、MPI実行時の各種メモリ実行オプション設定(-fixlen-maxlen-lenなど)において、指定した値は、デフォルトでは各ホストのものであると認識されます。それ以前のバージョンでは、MPIプロセスごとに値を入力するのがデフォルトでした。これは、 -hostmem yes/no実行オプションまたは SYSSETTING,HOSTMEM,YES/NOオプションで制御します。

仮想メモリと物理メモリ

OptiStructでは、システムに実際に搭載されているRAMサイズを超える量(すなわちインストールされているRAMサイズ以上)のメモリが使用できます。これは、仮想メモリ(スワップスペース)によって実現されます。

しかし、OptiStructは、実際のRAMのみを使用するように設定した方がより効率的です(RAMの一部がオペレーティングシステム、および同時実行中の他のコードによって使用されるようにします)。実際に使用可能なRAMより多くのメモリが要求されると、スワッピングが発生するため、OptiStructの動作速度は大幅に低下します。この場合、CPUがほとんど使用されていないにもかかわらず、ディスクの回転音が常に聞こえるようになります。また、ディスクアクセスへのCPU待機のために、経過時間とCPU時間との差が非常に大きくなることもあります。

OptiStructの各ランは-lenオプションを使用し、どれだけのメモリをOptiStructが使用できるかを示すことが推奨されます。OptiStructは、この引数なしでも正しく実行しますが(デフォルト値8000 = 8 GB RAMを仮定)、その場合、より多くのメモリで実行することが許されている場合と比べて効率は落ちます。

OptiStructでのメモリの指定(–lenコマンドラインオプションの使用による)は実際には、実行に使用可能な物理的RAMサイズについてOptiStructにヒントを与えるだけです。すなわち、オペレーティングシステムおよびその他の実行プログラムによって使用されない物理メモリ量を指定する必要があり、先に説明したとおり、コンピュータ内の全サイズより常に小さくなければなりません。この情報に基づいて、OptiStructは、指定されたメモリ量の範囲内で実行できる最速のアルゴリズムを使用しようとします。こうしたアルゴリズムが使用できない場合、最小メモリ要件のアルゴリズムが使用されます。–lenに物理的RAMサイズよりも大きな値を指定すると、計算実行時に過剰なスワッピングが発生する可能性があり、ソリューションプロセスの速度が大幅に低下します。

ほとんどのマシンでは、使用可能なメモリについて、OptiStructがオペレーティングシステムに情報を求めます。この情報は、.outファイルのヘッダーに出力され、このリソースの不足によって実行できなくなる可能性がある場合に警告を発するために使用することができます。この情報は動的である(すなわち、同じマシンで稼働する他のプログラムとともに変化する)ため、OptiStructの内部では決して使用されることはなく、代わって、ユーザーの提供する情報(例えば–len引数で、もしくはコンフィギュレーションファイルから)が使われます。

使用されるメモリの制御

標準モードの操作においては、OptiStructは必要なメモリ量を自動的に見積もり、そのメモリ量を継続的にオペレーティングシステムに要求します。

上記の-lenオプションに加え、次のオプションを使用して、OptiStructによるメモリ割り当て方法を制御できます。

標準モードの操作においては、OptiStructは必要なメモリ量を自動的に見積もり、そのメモリ量を継続的にオペレーティングシステムに要求します。コマンドライン引数-minlenを自動モードで使用して、最初からより多くのメモリを提供することで、連続するステップを減らすことができます。メモリを増分的に何度も要求するよりも、一括して要求した方が、メモリを効率良く使用できる場合もあります。場合によっては、大量のメモリを要求した状態で-minlenを使用すると、他のいくつかのプロセスに十分なスペースが残されないことがあります(下記の-fixlenを参照)。

コマンドライン引数-maxlenを自動モードで使用することもできます。このためには、-fixlenスイッチを使用します。このスイッチは、指定のメモリ量以上を使うことをOptiStructに許可しないため、バッチスケジューリングのインストールにおいて役立ちます。
注: この引数によって許可されているより多くのメモリを必要とするモデルの場合、OptiStructは、解析の途中で(しばしば、かなりの計算時間を費やした後に)実行を停止します。
メモリを制御するための他の方法としては、-coreコマンドラインがあります。-core inを使用して最大メモリを選択し、最高のソルバーパフォーマンスを実現する一方で、-core outまたは-core minを使用して、最小限のメモリリソースで問題を解析します。-checkを使用すると、in-coreまたはout-of-coreソリューションで使用されるメモリの推定量を確認できます。-core-minlen、および-maxlenを組み合わせて、さまざまな目的を達成します。
コアモード メモリ使用量 ディスクスペース使用量
-core min 最小 最大
-core out
-core in 最大 最小

通常、OptiStructのほとんどの方程式ソルバー(例えばMUMPS)は、in-coreとout-coreの2つのメモリコアモードしか持っていません。BCSソルバーの場合、3つのメモリモード(in-core、out-core、min-core)がすべて利用可能です。一般的に、大多数のモデルでは、in-coreモードかout-coreモードのどちらかを使用する必要があります。特定のモデルについては、チェックラン(-check)を実行し、推奨メモリが使用可能であればin-coreモード、そうでなければout-coreモードを使用します。

もう1つのメモリ制御手段である固定モードオプション-fixlenでは、メモリは1回だけ割り当てられ、サイズ変更は禁止されます。-fixlenオプションを使用すると、OptiStructは実行を開始しますが、しばらくするとメモリ割り当てエラーが発生し、実行は失敗に終わることもあります。これは、OptiStructソルバーによって必要とされるメモリ量に加え、追加の少量のメモリを使用するバンド幅ミニマイザーをOptiStructが起動するため、使用可能なメモリのほとんどすべてが-fixlen引数によって要求された際に起こり得ます。この問題を解決するには、-fixlenオプションで要求するメモリ量を少し減らしてみます。MUMPSスパースソルバーは、オペレーティングシステムからも直接メモリを割り当てます。-fixlenによって多くのメモリが割り当てられた場合、MUMPSソルバーは使用するメモリリソースがなくなったり、効率が非常に低い仮想メモリを使用する必要が生じることがあります。この状況は、多くのプロセスを使用して実行される領域分割において実際に発生する可能性があります。この場合、-fixlenは各MPIプロセス用のメモリを参照します。

一般に、すべてのケースで自動メモリモードが推奨されます。

コンフィギュレーションファイル

メモリ制御のすべてのオプションは、コンフィギュレーションファイルコンフィギュレーションファイルで指定できますが、このコンフィギュレーションファイルが共通のファイルサーバーで共有されている場合、これはお奨めできません。このコンフィギュレーションファイルは特定のハードウェアに対して個別に調整する必要があり、各マシンのローカルなコンフィギュレーションファイル内に配置する必要があります。