1

Fotran 2003を使用して作成し、を使用してコンパイルしたFortranプログラムがあります。

IA-32バージョン12.1.2.273ビルド20111128で実行されるアプリケーション用のインテル(R)FortranコンパイラーXE

プログラムを長期間実行した後(これは物理的な計算です)、次のように読み取られます:
Fortran RTLメッセージバッファを割り当てるためのメモリが不足しています、メッセージ

プログラムのメモリリークに関係していると思います。リークが発生している場所とその修正方法を確認するにはどうすればよいですか。

4

3 に答える 3

6

最初の回答が示すように、あなたの質問は非常に一般的であり、特定の回答にそれほど修正することはできません。ポインタを使用していますか?ポインタは割り当て可能なものよりも安全性が低くなります---仕事をする場合は割り当て可能なものに切り替えます。

ifortのデバッグオプションに関する提案:-O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone

于 2012-03-17T19:48:45.657 に答える
2

これは答えというよりも拡張されたコメントです...

あなたはメモリリークがあると推測しましたが、推測を診断に変えるのに役立つ情報を私たちに提供していません。そのような情報がない場合、いくつかのアドバイス...

a)Fortranプログラムでのメモリリークは、他のプログラムで発生するのと同じ方法で発生します。プログラマーは、終了時に変数の割り当てを解除することを忘れる(または無視する)。Fortran 2003では、割り当て可能なスカラーを使用できることを忘れないでください。

b)長期にわたる科学計算では、出力の大きな配列が繰り返し構築されているのを見つけるのは珍しいことではありません。計算中に、最後まで待つよりも、これらをディスクに書き込む方がよい場合があります。I / O(まあ、ほとんどはO)時間でヒットしますが、メモリ使用量を節約します。

c)Intel Inspectorやさまざまなオープンソースプログラムなど、メモリリークを見つけるのに役立つさまざまなツールがあります。

d)プログラムの実行中に、プログラムに必要なメモリがどのように変化するかを十分に理解する必要があります。

e)そして時々、このドメインでは、答えは単にRAMを追加購入することです。

于 2012-03-17T18:11:57.800 に答える
1

私はあなたがすでにコンパイラからあなたに答えを得たと思います:不十分なメモリ。プログラムのある時点で、大きなメモリを割り当てようとしています。

「-O0-debug-traceback -check -ftrapuv」フラグを使用してプログラムをコンパイルし、再度実行することができます。Intelデバッガーを使用して、プログラムを1行ずつ確認することができます(つまり、問題が発生する可能性がある場所を意味します)。運が良ければ、valgrindのような他のツールを使用する必要はありません。

いつか、Gfortranでコンパイルすることも役立つでしょう。配列の境界を確認するには、さまざまなコンパイラオプションを使用する必要があることに注意してください。

最後のヒントは、「associate」構造の使用に関するものです。私は個人的にそれを使用するのに多くの問題を抱えていました。使用する場合は、コードから削除して、もう一度確認してください。

于 2012-03-27T00:24:17.290 に答える