主题:[讨论]请教内存分配时出的一个问题
			 xiechaoming
				 [专家分:0]  发布于 2010-05-26 19:46:00
 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
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