2015-12-08 56 views
0
/var/spool/torque/mom_priv/jobs/775.head.cluster.SC: line 22: 28084 Segmentation fault  ./a.out 

我在Fortran語言新,這是我第一次與HPC和OpenMP工作。 在我的代碼中,我有一個應該平行的循環。我使用了一些動態變量,它們都是並行循環中的虛擬變量。forrtl:嚴重(151):分配數組已經allocated-

我分配動態變量並聯迴路

!$OMP PARALLEL DO 
    do 250 iconf = 1,config 

    allocate(randx(num),randy(num),randz(num),unit_cg(num),   & 
&   x(nfftdim1),y(nfftdim2),z(nfftdim3),fr1(num),   & 
&   fr2(num),fr3(num),theta1(order,num),     & 
&   theta2(order,num),theta3(order,num),     & 
&   Q(nfftdim1,nfftdim2,nfftdim3)) 

... call some subroutines and do calculations ... 

    deallocate(randx,randy,randz,unit_cg,fr1,fr2,fr3,theta1,theta2, & 
&   theta3,x,y,z,Q) 
    250 continue 
    !$OMP END PARALLEL DO 

我被遺漏的代碼無關的一些部分。當執行程序,出現此錯誤:

forrtl: severe (151): allocatable array is already allocated 

我分配的並行區域外的變量,它適用於小數據,但對於大數據出現此錯誤:

/var/spool/torque/mom_priv/jobs/775.head.cluster.SC: line 22: 28084 Segmentation fault  ./a.out 

我使用的私有動態變量(虛擬變量)子句:

!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(randx,randy,randz,   & 
!$OMP& unit_cg,fr1,fr2,fr3,theta1,theta2,theta3,x,y,z,Q,    & 
!$OMP& dir_ene,rec_ene,corr_ene,energy_final,plproduct_avg,    & 
!$OMP& correlation_term) 

和並行循環內分配的變量,但同樣的錯誤, 最後我改變了鱈魚e到:

allocate(randx(num),randy(num),randz(num),unit_cg(num),   & 
&   x(nfftdim1),y(nfftdim2),z(nfftdim3),fr1(num),   & 
&   fr2(num),fr3(num),theta1(order,num),     & 
&   theta2(order,num),theta3(order,num),     & 
&   Q(nfftdim1,nfftdim2,nfftdim3)) 

!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(randx,randy,randz,   & 
!$OMP& unit_cg,fr1,fr2,fr3,theta1,theta2,theta3,x,y,z,Q,    & 
!$OMP& dir_ene,rec_ene,corr_ene,energy_final,plproduct_avg,    & 
!$OMP& correlation_term) 


    do 250 iconf = 1,config 

... call some subroutines and do calculations ... 

    250 continue 

    !$OMP END PARALLEL DO 
     deallocate(randx,randy,randz,unit_cg,fr1,fr2,fr3,theta1,theta2, & 
&   theta3,x,y,z,Q) 

它在運行時失敗。它啓動N(線程數)循環,但不能完成它們,並再次出現此錯誤:

/var/spool/torque/mom_priv/jobs/775.head.cluster.SC: line 22: 28084 Segmentation fault  ./a.out 

任何想法?

+2

您想要在循環'private'中分配的所有變量。或者你不想在循環內部但是在外部分配它們。 –

+0

你的意思是我應該使用'!$ OMP PARALLEL DO PRIVATE()'並將所有可分配的變量放在括號中?如果我在循環之外分配內存不足,不是嗎? –

+1

這取決於你正在嘗試做什麼。也許你應該試着把它放在循環之外。你確定你的串行代碼按預期工作嗎?我們不知道'num','order'和'iconf'的值是從哪裏來的。 –

回答

2

我改變了代碼,最後它工作! 指令!$OMP PARALLEL DO是兩個指令!$OMP PARALLEL!$OMP DO的快捷方式。我使用了這兩個指令(而不是!$OMP PARALLEL DO)並將其分配到並行區域內。我猜(但我不確定),現在編譯器知道如何獲取私有變量的內存,因爲我在分配之前放置了私有子句,因此segmentation fault不會發生。

!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(iconf,d,randx,     & 
!$OMP& randy,randz,unit_cg,theta1,theta2,theta3,fr1,fr2,fr3,Q,   & 
!$OMP& plproduct_avg) 

     allocate(randx(num),randy(num),randz(num),unit_cg(num),   & 
    &   fr1(num),fr2(num),fr3(num),theta1(order,num),   & 
    &   theta2(order,num),theta3(order,num),      & 
    &   Q(nfftdim1,nfftdim2,nfftdim3)) 

!$OMP DO 
    do 250 iconf = 1,config 
... call some subroutines and do calculations ... 
    250 continue 
!$OMP END DO 

    deallocate(randx,randy,randz,unit_cg,fr1,fr2,fr3,theta1,theta2, & 
&   theta3,Q) 

!$OMP END PARALLEL 
+0

謝謝馬克的評論,我編輯了答案。 –