配列を使用して fortran プログラムを実行すると、間違った計算値が得られます (コードを見てください)。intel インスペクタ (-mi3) を使用すると、プログラムで大きな配列の 1 つが使用されるたびに「無効なメモリ アクセス」というメモリの問題が発生し、/lib64/ld-linux-x86- にもエラーが発生することがわかります。 64.so.2. まず、十分なメモリ容量がないと思っていましたが、16 GB のメモリを搭載した 64 ビット マシンには十分なメモリ容量があります (:free -m ~14 GB)。プログラムのメモリ サイズを見積もると、約 4 GB で十分なはずです。プログラムの実行中に、使用メモリが 0% から ~20% に増加し、プログラムが「正常に」終了するまでそこで停止します。だから私は十分なメモリスペースを持っていると思います。小さな配列 (例: nemax=3 000 000) の場合、正しい計算値が得られ、intel インスペクターでエラーは発生しません。また、フラグ check all を使用して配列をチェックしました。プログラムを ifort -mcmodel=medium -shared-intel -o test test.f90 でコンパイルします。これらのメモリアクセスエラーを解決するために他に何ができるでしょうか? 誰かアイデアはありますか?? ご協力いただきありがとうございます!
module lz_data
integer,parameter :: maxsite=16
integer,parameter :: nmax =6000000
integer,parameter :: nemax=300000000
real*8,save :: diag(nmax)
real*8,save :: werte(nemax) !Here are the only large arrays
integer,save :: izeile(nemax)
integer,save :: ispalt(nemax)
integer,save :: nentry
end module lz_data
prgram test
use lz_data
implicit real*8 (a-h,o-z)
real*8 umat(maxsite,maxsite)
logical lav(nmax,maxsite)
logical lbv(nmax,maxsite)
...
do is=1,ns
diag(is)=0.0d0 ! HERE the debugging tool says invalid memory access
do i=1,msite
do j=1,msite
if (lav(is,i).and.lbv(is,j)) diag(is)=diag(is)+umat(i,j) ! invalid memory access
enddo
enddo
enddo