Сокращение переменной OMP внутри подпрограммы, вызываемой в блоке OMP - PullRequest
1 голос
/ 02 апреля 2019

У меня есть переменная, на которую указывает этот указатель в одной из моих подпрограмм:

complex(dp), pointer :: Pkc(:,:)=>NULL()

Я также выделяю ее в той же подпрограмме:

call MIO_Allocate(Pkc,[1,1,1],[ptsTot,nAt,2],'Pkc','diag')

Внутри этой подпрограммы яиспользуйте его внутри области OMP:

!$OMP PARALLEL DO PRIVATE(iee, ie, unfoldedK), REDUCTION(+:Ake1, Ake2, Ake), &  
!$OMP& SHARED(Pkc, KptsG, E, Kpts, AkeGaussian1, AkeGaussian2, AkeGaussian, nAt, nspin, is, ucell, gcell, H0, maxNeigh, hopp, NList, Nneigh, neighCell, gaussian, Epts) 
  do ik=1,ptsTot ! K loop
  ...
  call DiagSpectralWeightWeiKuInequivalentInequivalent(nAt,nspin,is,Pkc(ik,:,:),E(:,is),Kpts(:,ik),unfoldedK(:),ucell,gcell,H0,maxNeigh,hopp,NList,Nneigh,neighCell)
  ...
  end do
!$OMP END PARALLEL DO

, где новая вызываемая подпрограмма задается

subroutineDiagSpectralWeightWeiKu(N,ns,is,PkcLoc,E,K,KG,cell,H0,maxN,hopp,N List,Nneigh,neighCell)
...
complex(dp), intent(out) :: PkcLoc(N,2)
...
do j=1,N ! These are the eigenvectors with band index J
do in=1,N
PkcLoc(j,1) = PkcLoc(j,1) + exp(-cmplx_i*dot_product(KG, RtsVec(in,:))) * Hts(in,j)
end do
end do
...
end subroutine DiagSpectralWeightWeiKuInequivalent

Как я могу убедиться, что PkcLoc получает правильное поведение при выполнении OMP?Я получаю ошибки сегментации, которые, как я полагаю, связаны с отсутствующим REDUCTION в PkcLoc.

Любой совет, как решить эту проблему?

Я нашел этот поток , но это отличается в том смысле, что в моем случае цикл do находится за пределами вызываемой подпрограммы.

...