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
Другие вопросы по тегам