forrtl: 严重 (151): 可分配数组已分配-

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

我是 Fortran 新手,这是我第一次使用 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

有什么想法吗?

我更改了代码,终于成功了! 指令 !$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