5

プログラムの実行中にかなり頻繁に呼び出されるサブルーチンがあります。できるだけ多くの割り当て可能な配列を使用しようとしましたが、サブルーチンは問題なく数回呼び出されましたが、ある時点で次のように終了します。

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計算が間違っていることを示唆しています (大きすぎます)。この終了は、いくつかのループの繰り返しを減らすことによって、後で計算時間を節約するだけです。

4

1 に答える 1