forrtl: серьезно (151): выделяемый массив уже выделен
/var/spool/torque/mom_priv/jobs/775.head.cluster.SC: line 22: 28084 Segmentation fault ./a.out
Я новичок в Фортране, и впервые работаю с HPC и OpenMP. В моем коде у меня есть цикл, который должен быть параллельным. Я использую некоторые динамические переменные, которые все являются фиктивными в параллельном цикле.
Я выделяю динамические переменные в параллельном цикле
!$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
Я использовал предложение PRIVATE для динамических переменных (фиктивные переменные):
!$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)
и распределенные переменные внутри параллельного цикла, но та же ошибка, наконец я изменил код на:
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
любая идея?
1 ответ
Я изменил код и, наконец, он работает! Директива !$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