プログラムの実行中にかなり頻繁に呼び出されるサブルーチンがあります。できるだけ多くの割り当て可能な配列を使用しようとしましたが、サブルーチンは問題なく数回呼び出されましたが、ある時点で次のように終了します。
malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
これは、最初の配列が割り当てられるサブルーチンの開始時に発生します。
代わりに割り当て不可能な配列を使用すると、サブルーチンはより頻繁に呼び出されますが、次のように再び終了します。
wait: 28674: Memory fault(coredump)
変数の宣言の直後にいくつかの値を計算せずに書き出すため、呼び出し時に終了すると想定しています。
呼びだし
do k=1, kreise
write(*,*)k
call rundheit(n(k),kreis(k,1:n(k),3),kreis(k,1:n(k),2),outrnd)
end do
'kreise' には最大 1500 の値が含まれる場合があります。呼び出し前、サブルーチン内、および呼び出し後に渡されたパラメーターの値を印刷して確認しました。
'kreise' を制限すると問題は解決しますが、制限は実用的な解決策ではありません。すべてのデータを評価する必要があります。それの骨折ではありません。
私の環境に関する注意事項:
私のプログラムは、Intel Fortran コンパイラを使用して FEM シミュレーション ソフトウェアによってコンパイルされたサブルーチンです。私の知る限り、コンパイラ オプションを変更する機会はなく、FEM ソフトウェアによって展開されるサブルーチンに多くの依存関係があるため、コードを単独でコンパイルすることはできません。
この正確なサブルーチンを開発し、別のはるかに小さく単純なシミュレーションで問題なく実行しました。この特定のサブルーチンを使用しない限り、実際の「より大きな」シミュレーションも問題なく実行されます (違いは主にノード密度であり、計算中に考慮されるデータの量です)。問題なく。サブルーチンが行うのは、いくつかのインクリメントの間に結果をフェッチし、いくつかの分析を行い、シミュレーションを変更せずにいくつかのレポートを作成することだけです。
問題はメモリ処理に関係していると思いますが、私にはわかりません。
ありがとう。
更新
を使用してサブルーチンをコンパイルした-check all
ところ、非難されたサブルーチンの前にエラーが発生することがわかりました。2 つの配列、そのうちの 1 つである n() は何度か範囲外ですが、呼び出し中にエラーが何らかの形で (より) 重大になります。奇妙な部分は、エラーが発生したときに境界を超えたいくつかの反復であることです。たとえば、ここでは両方の配列にサイズが(1:72)
あり、k = 135 から 267 のどこかで呼び出しが中断されます (いくつかの実行中に見つかった最小値と最大値) )。
Kreise
問題は、ループ中に値が設定されるintegerです。
...
allocate(n(l))
allocate(pos(l))
...
do kreise = 1,l
pos(kreise)=minvalX+(Kreise-1)*IncX
if(pos(kreise).gt.maxvalX) exit
end do
kreise
常に l+1 になる場所。なんで?
注:pos(kreise).gt.maxvalX
真であってはなりません。true になることは問題ではありませんが、l
計算が間違っていることを示唆しています (大きすぎます)。この終了は、いくつかのループの繰り返しを減らすことによって、後で計算時間を節約するだけです。