私は自分でコンパイルし、実行可能ファイルを何百回実行したFortranプログラムを持っていますが(再コンパイルや他の操作なしで)、実行すると分割エラーのためにすぐにクラッシュします。現在、プログラムの他の3つのインスタンスが実行されています。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ではないFortranプログラムがクラッシュします。
ここで何が起こっているのか、どうやって解決できるのかを知っている人はいますか?
関連があれば、Ubuntu 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)
また、いくつかのテストを行いましたが、分割エラーが原因でプログラムがクラッシュした場合は常に4回目でした。最近再インストールしましたが(古いUbuntuをクリアして16.04をインストールしました)、おそらく16.04未満では一度に3つしか実行できず、気付かなかったでしょう。再インストールする前に、3つ以上のインスタンスがあったと確信しています。
私はこれが合計メモリとスワップを加えたメモリが16GBにすぎないときにプログラムが12GBのメモリを割り当てようとするという事実に関連している可能性があると思いますが、今使用しているパラメータには実際には約1GBしか必要ありません(RES列から)。 )だから、3つ以上のインスタンスを実行できない理由を理解できません。