分割エラーのため、Fortran プログラムは直ちにクラッシュします。

分割エラーのため、Fortran プログラムは直ちにクラッシュします。

私は自分でコンパイルし、実行可能ファイルを何百回実行した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つ以上のインスタンスを実行できない理由を理解できません。

ベストアンサー1

おすすめ記事