如果我用數組運行我的fortran程序(查看代碼),我得到錯誤的計算值。如果我使用intel檢查器(-mi3),它會告訴我每次在程序中使用一個大數組時,都會出現內存問題「無效的內存訪問」,並且在/ lib64/ld-linux-x86- 64.so.2。 首先,我認爲我沒有足夠的內存空間,但在具有16 GB內存的64位計算機上,有足夠的內存空間(:free -m〜14 GB)。 如果我估計我的程序的內存大小,大約4 GB應該足夠了。當我的程序正在運行時,已用內存從0%增加到〜20%,並停在那裏,直到程序終止「正常」。所以我認爲我有足夠的內存空間。對於小型陣列(例如nemax = 3 000 000),我可以在intel檢查器中獲得正確的計算值並且無錯誤。我也用旗檢查了所有數組。 我用ifort -mcmodel = medium -shared-intel -o test test.f90編譯程序。 我不知道如何解決這些內存訪問錯誤?有沒有人有想法? 感謝您的幫助!無效的內存訪問Fortran檢查器
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
您已明確使用隱式鍵入。然後,您將使用未聲明和未初始化的變量,例如'is','ns'和'msite'來控制您的循環。如果你沒有初始化'ns',那麼'diag(is)'引用一個無效的內存位置就不足爲奇了。並且請不要告訴我,您已經省略了這些變量的聲明和初始化,調試其他人的代碼很難,當我看到所有這些變量時,隱藏必要的行是非常糟糕的運動。 –
感謝您的評論,但爲什麼我的變量未聲明。如果我使用隱式實數* 8(a-h,o-z),所有以i-n開始的變量都是整數。 – user2003049
與其將頭髮分爲是否已聲明,請告訴我們它們初始化的位置和值。 –