분할 오류로 인해 Fortran 프로그램이 즉시 충돌합니다.

분할 오류로 인해 Fortran 프로그램이 즉시 충돌합니다.

나는 내가 직접 컴파일하고 실행 파일을 수백 번 실행한 Fortran 프로그램을 가지고 있지만(재컴파일이나 다른 작업 없이) 이제 실행하면 분할 오류로 인해 즉시 충돌합니다. 현재 프로그램의 다른 세 가지 인스턴스가 실행 중입니다. top다음을 출력합니다.

top - 15:37:06 up 5 days,  1:06,  2 users,  load average: 3,00, 3,01, 3,06
Tasks: 290 total,   4 running, 285 sleeping,   0 stopped,   1 zombie
%Cpu(s): 24,4 us,  0,0 sy,  0,0 ni, 75,5 id,  0,1 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem :  8058952 total,  2409096 free,  2964692 used,  2685164 buff/cache
KiB Swap:  8263676 total,  8263676 free,        0 used.  4614096 avail Mem 

PID USER   PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                      
1230 user  20   0 12,329g 675720   3080 R 100,0  8,4  14:17.45 tetramer                                                                    
1236 user  20   0 12,329g 675688   3052 R 100,0  8,4  13:58.96 tetramer                                                                    
1234 user  20   0 12,329g 675800   3168 R 100,0  8,4  14:02.23 tetramer                                                                                                                                                     

많은 메모리(적어도 가상 메모리)를 사용하지만 지금까지는 실제 메모리 사용량이 충분히 낮으면 여러 인스턴스를 동시에 실행할 수 있습니다. 다음은 문제의 Fortran 코드이며 write.

   IMPLICIT REAL*8(A-H,O-Z)
c
  PARAMETER ( np = 220 )
c
  PARAMETER ( ndim = 25000)
  PARAMETER ( ndim2 = ndim*(ndim+1)/2 )
C
  DIMENSION  array(np,6,6),array2(np)
c
  DIMENSION  vector(50), vector2(50)
  DIMENSION  v1(159,30001),v2(159,30001),v3(159,30001)
C
  COMMON /PARM/com1(99000) ,com2(0:8,0:8,99000)
 1        ,com3(0:8),com4(0:8,0:8,0:8),nmax,mmax
 1        ,com5(0:8,0:8)
C
  COMMON /SET/ AX(0:4,-4:4,50),AY(0:4,-4:4,50),AZ(0:4,-4:4,50)
 1          ,DD(0:4,-4:4,50), dd2(0:4,-4:4), nmax0(0:4,-4:4)
C
  DIMENSION  AH( ndim2 ),AF( ndim2 ),AF2(ndim2)
  DIMENSION  E( ndim ),VEC( ndim,ndim)
  DIMENSION   AH2(ndim,ndim),TEMP(ndim,ndim)
  dimension nbarray(6)
C
  CHARACTER*1   PARI
C
  write(6,*) ' ######   ##### '

왜 갑자기 분할 오류가 발생하는지 정말 모르겠습니다. 내가 아는 한 나는 프로그램의 어떤 메모리에도 액세스하지 않았습니다(방금 할당됨). 그러면 어떻게 분할 오류가 발생합니까?

또한 프로그램의 출력을 Perlskript로 파이프할 때 SIGPIPE어떤 이유에서든 오류가 발생하지만 Perlskript가 아닌 포트란 프로그램이 충돌합니다.

여기서 무슨 일이 일어나고 있는지, 어떻게 해결할 수 있는지 아는 사람이 있나요?

관련이 있다면 우분투 16.04를 실행하고 있습니다.

편집: 요청된 출력은 다음과 같습니다.

~$ ldd ./tetramer 
    not a dynamic executable

~$ strace ./tetramer 
    execve("./tetramer", ["./tetramer"], [/* 32 vars */]) = -1 ENOMEM (Cannot allocate memory)
    --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---
    +++ killed by SIGSEGV +++
    Segmentation fault (core dumped)

또한 몇 가지 테스트를 수행했는데 분할 오류로 인해 프로그램이 충돌한 경우는 항상 네 번째였습니다. 최근에 다시 설치했는데(오래된 우분투를 지우고 16.04를 설치했습니다) 아마도 16.04 미만에서는 한 번에 세 개만 실행할 수 있었고 눈치 채지 못했습니다. 재설치하기 전에 3개 이상의 인스턴스가 있었다고 확신합니다.

나는 이것이 총 메모리와 스왑을 더한 메모리가 16GB에 불과할 때 프로그램이 12GB의 메모리를 할당하려고 시도한다는 사실과 관련이 있을 수 있다고 생각하지만, 지금 사용하고 있는 매개변수로는 실제로 약 1GB만 필요합니다(RES 열에서). ), 그래서 인스턴스를 3개 이상 실행할 수 없는 이유를 이해할 수 없습니다.

관련 정보