主题:[讨论]请教内存分配时出的一个问题
xiechaoming
[专家分:0] 发布于 2010-05-26 19:46:00
最近碰到一个很奇怪的问题,我的一个程序在Linux windows下都能跑的,后来我对程序进行了修改,然后再windows下能跑,转到Linux下编译也能通过,就是跑的时候有一个变量,allocate的时候大小稍微大一点点就老是提示出现段错误,程序自动退出,神的很!
我给一个小一点的大小时比如 14390 就能通过这一句,给1439040就不行。原来的老程序也有这一句,开辟的数组比这大几个量级都没问题,把这一行搬到主程序最前面编译,大小给1439040也没有问题(那是个全局变量)。
整个程序内存用量也只有不到1G,不存在内存不够的问题。不知道有没有哪位大侠能解释这个问题。我用的Linux是 federo 10 吧,编译器采用gfortran
最后更新于:2010-05-28 11:41:00
6 楼
xiechaoming [专家分:0] 发布于 2010-05-29 16:36:00
ps,那个程序不仅在windows(32位)下能跑,跑的结果还是正确的。应yeg001兄的要求,我还是贴出那个子程序吧,如下所示:
!
! 本程序完成 线性代数方程组求解
!
subroutine linearsolve
use constf
use fdata
use gdata
implicit none
integer size,size1,size2,size3,size4,nptrq1,nptrq2,nptrq3,n,fdimension,itemp
integer sizerq,sizesimp,xsize,sizetime
integer i,j,k,loc1,npttime
real*8, allocatable:: arq1(:),arq2(:),arq3(:),arq4(:),arq5(:),arq6(:)
real*8, allocatable:: urq1(:),urq2(:),urq3(:),urq4(:),urq5(:),urq6(:)
real*8, allocatable:: dtadmb(:)
character*50 filename
integer ITMAX,iter,resolve,deltai,nptx
fdimension = pointerarray(BBB+1,8)*dimm
size = pointerarray(BBB+1,8)*partialrqsize(1)
sizerq = size
allocate (prpq1(size),prpq2(size),prpq3(size),prpq4(size),prpq5(size))
write (*,*) ' rq1...... '
call equation_rq
size = pointerarray(BBB+1,8)*partialrqsize(1)
allocate (arq1(size),arq2(size),arq3(size),arq4(size),arq5(size))
arq1 = 0.0d0
arq2 = 0.0d0
arq3 = 0.0d0
arq4 = 0.0d0
arq5 = 0.0d0
nptrq1 = 1
nptrq2 = 1
nptrq3 = 1
do n = 1,BBB
imax = idimb(n)+1
jmax = jdimb(n)+1
kmax = kdimb(n)+1
size1 = partialrqsize(1)
size2 = (imax-1)*(jmax-1)*(kmax-1)
size3 = partialrqsize(2)
size4 = partialrqsize(3)
call singlefilling(n,prpq1(nptrq1),prpq2(nptrq1),prpq3(nptrq1),prpq4(nptrq1),prpq5(nptrq1), &
size1,size2,arq1(nptrq1),arq2(nptrq1),arq3(nptrq1),arq4(nptrq1),arq5(nptrq1))
nptrq1 = nptrq1+size2*size1
end do
call neighborsettingsrq
call neighborfill(arq1,arq2,arq3,arq4,arq5,sizerq)
deallocate (prpq1, prpq2, prpq3, prpq4, prpq5,brq1,brq2,brq3,brq4,brq5)
!********************************************* 预处理 *************************************************
fdimension = pointerarray(BBB+1,8)*5
size = pointerarray(BBB+1,8)*partialrqsize(2)
sizesimp = size
allocate (prpu1(size),prpu2(size),prpu3(size),prpu4(size),prpu5(size))
write (*,*) ' equation rq2...... '
call equation_rq
allocate (urq1(size),urq2(size),urq3(size),urq4(size),urq5(size))
urq1 = 0.0d0
urq2 = 0.0d0
urq3 = 0.0d0
urq4 = 0.0d0
urq5 = 0.0d0
nptrq1 = 1
do n = 1,BBB
imax = idimb(n)+1
jmax = jdimb(n)+1
kmax = kdimb(n)+1
size1 = partialrqsize(2)
size2 = (imax-1)*(jmax-1)*(kmax-1)
call singlefillinge2(n,prpu1(nptrq1),prpu2(nptrq1),prpu3(nptrq1),prpu4(nptrq1),prpu5(nptrq1), &
size1,size2,urq1(nptrq1),urq2(nptrq1),urq3(nptrq1),urq4(nptrq1),urq5(nptrq1))
nptrq1 = nptrq1+size2*size1
end do
deallocate (prpu1, prpu2, prpu3, prpu4, prpu5)
size = pointerarray(BBB+1,8)-1
allocate(dtadmb(size))
call filldt(dtadmb,size)
sizetime = size
!********************************************* 开始求解 *************************************************
fy1=-fy1 ! 全局变量
fy2=-fy2
fy3=-fy3
size = pointerarray(BBB+1,2)*qnum-qnum ! 当前算例下这个size 值等于 1439040
xsize = size
[color=FF0000] write (*,*) 'size=',size
allocate (yy(size), xx(size),mm(size)) ! 出问题的地方*********************** yy,xx,mm为全局变量,real*8
write (*,*) 'size=',size[/color]
yy=0; xx=0; mm=0
write(*,*) ' solving 1 ...... '
filename = 'res1.txt'
call linearsolvefunc1(fy2,xx,arq1,arq2,arq3,arq4,arq5,urq1,urq2,urq3,urq4,urq5,dtadmb,sizerq,sizesimp, &
xsize,restol,nstep,fdimension,sizetime,filename)
deallocate(dtadmb,arq1,arq2,arq3,arq4,arq5,urq1,urq2,urq3,urq4,urq5)
write (*,*) ' 方程求解OK '
open(1, file = 'xdata.txt',form='unformatted')
if (resolve==1) then
do n=1,size
write(1) yy(n),xx(n)
end do
else
do n=1,size
read(1) yy(n),xx(n)
end do
end if
close(1)
end