如果我用数组运行我的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
与其将头发分为是否已声明,请告诉我们它们初始化的位置和值。 –