나는 내가 직접 컴파일하고 실행 파일을 수백 번 실행한 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개 이상 실행할 수 없는 이유를 이해할 수 없습니다.