1

私は、グリッドベースで計算を実行する科学アプリケーションの作成者です (有限差分グリッド計算を考えてください)。各グリッド セルは、状態変数とセル固有の定数の値を保持するデータ オブジェクトによって表されます。これまで、すべてのグリッド セル オブジェクトは、シミュレーション中に常に RAM に存在していました。

私のコードを使用している人々が、使用可能な RAM よりも多くのグリッド セルでコードを実行したいという状況に遭遇しています。セルのサブセットのみに関する情報が常に RAM に保持されるように、コードを修正することを考えています。残念ながら、グリッド (または必要に応じてマトリックス) は疎ではないため、考えられる解のクラス全体が排除されます。

質問:この種のデータ アクセス (つまり、定数と変数の取得、変数の更新、将来の参照用の保存、メモリのワイプ、移動など) を容易にするように設計されたライブラリが世の中にあると思います。Google で数時間検索した後、およびスタックオーバーフロー、この種のライブラリは比較的少数しか見つかりませんでした。

HSL数学ライブラリの次のようないくつかのオプションを認識しています: http://www.hsl.rl.ac.uk/specs/hsl_of01.pdf。私は、オープン ソースで、Fortran または C で書かれたものを使用したいと考えています (私のコードはほとんどが Fortran 95/2003 で、適切な手段として少し C と Python が投入されています!)

利用可能なライブラリに関する提案や、問題を再構築する方法に関するアドバイスをいただければ幸いです。ありがとう!

4

1 に答える 1

1

弾丸を噛んで、自分で転がしますか?

私は常に、数十年にわたる 30,000 件以上の 30 時間ごとのデータ シリーズなど、大きすぎるデータを扱っています。データの規則性 (夏時間の切り替えは問題ですが) のため、ランダム アクセス ディスク ファイルと、一連の番号と日付番号を使用するプロシージャ ReadDay と WriteDay を含むスキームを考案するのは非常に簡単であることがわかりました。シリーズの開始日と終了日は異なります。したがって、配列内の 1 日のデータは Array(Run,DayNum) かもしれませんが、現在は ReturnCode = ReadDay(Run,DayNum,Array) などであり、その日のデータの有無を示すコードなどです。 1日のデータは便利なサイズで、通常の(ほぼ)サイズです。シリーズごとに 1 つのレコードのバッファーを割り当て、GB ではなく ~100MB のメモリで実行されます。

配列は非スパースであるため、規則的です。グリッド セルのデータが固定サイズであるとすれば、各レコードが 1 つのセル、またはおそらく行に相当するセル (または列に相当するセル) またはいくつかの価値のあるブロブ サイズを保持するランダム アクセス ディスク ファイルを考案できます。ディスク ファイルの割り当てサイズとして、4,096 バイト/レコードを選択します。コンピュータのオペレーティング システムとディスク ストレージ コントローラに、実際のメモリへのバッファリングを実行させます。ただし、通常の実行は、ローカル データの計算が重い場合を除き、データ転送の速度に制限されます。したがって、データ要求がバッファから満たされ始めるまで、数パーセントの CPU 使用率が得られます。

Fortran は関数に対して配列と同じ構文を使用するため (たとえば Pascal とは異なり)、DIMENSION ARRAY(Big,Big) を宣言する代わりに、それを削除して FUNCTION ARRAY(i,j) を考案すると、ソース ファイル内のすべての読み取り参照が残ります。彼らはあるとして。残念ながら、「パリンドローム」関数宣言がない場合、配列への値の代入は別の構文で行う必要があり、サブルーチンなどを考案します。おそらく、スクラッチパッド配列を照合し、便利な構文で作業し、変更された場合は書き戻すことができます。

于 2012-08-09T00:16:53.767 に答える