嵌套OMP DO指令-Fortran

嵌套OMP DO指令-Fortran,fortran,openmp,Fortran,Openmp,我在Fortran中尝试将OMP DO指令嵌套到另一个OMP DO指令时遇到问题 以下是代码: DO in=2,n_niveles allocate(cvalor(2,npuntosp(in),npuntost(in))) !allocate(avalor(2,npuntosp(in-1),npuntost(in-1))) allocate(valor_t2(npuntost(in),npuntosp(in-1),2)) !$OMP PARALLEL NUM_TH

我在Fortran中尝试将OMP DO指令嵌套到另一个OMP DO指令时遇到问题

以下是代码:

DO in=2,n_niveles
    allocate(cvalor(2,npuntosp(in),npuntost(in)))
    !allocate(avalor(2,npuntosp(in-1),npuntost(in-1)))
    allocate(valor_t2(npuntost(in),npuntosp(in-1),2))
    !$OMP PARALLEL NUM_THREADS(hilos) DEFAULT(PRIVATE) FIRSTPRIVATE(n_niveles,in) SHARED(npuntosp,npuntost,cubos,central_reg,sumazm1n,expo,mphi,mtheta)
    !$OMP DO SCHEDULE(STATIC)
    DO aux=1,cubos(in-1)%ncubos_nivel
       ...
       (some code here)
       ...
       !$OMP PARALLEL NUM_THREADS(hilos) DEFAULT(PRIVATE) FIRSTPRIVATE(cuboj,in) SHARED(valor_t2,cvalor)
       !$OMP DO SCHEDULE(STATIC)                
       do i=1,npuntost(in) 
           val=mtheta(in-1)%inicio(i,1) 
           do jj=val,val+mtheta(in-1)%inicio(i,2) 
               do k=1,npuntosp(in-1) 
                   valor_t2(i,k,1)=valor_t2(i,k,1)+mtheta(in-1)%matriz(i,jj)*sumazm1n(in-1)%region(cuboj)%valor(1,k,jj)   
                   valor_t2(i,k,2)=valor_t2(i,k,2)+mtheta(in-1)%matriz(i,jj)*sumazm1n(in-1)%region(cuboj)%valor(2,k,jj)        
               end do
           end do 

           do k=1,npuntosp(in) 
               val=mphi(in-1)%inicio(k,1) 
               do jj=val,val+mphi(in-1)%inicio(k,2)
                   cvalor(1,k,i)=cvalor(1,k,i)+valor_t2(i,jj,1)*mphi(in-1)%matriz(jj,k)
                   cvalor(2,k,i)=cvalor(2,k,i)+valor_t2(i,jj,2)*mphi(in-1)%matriz(jj,k)
               end do
           end do 
       end do
       !$OMP END DO
       !$OMP END PARALLEL

       ...
       (some code here)
       ...
    END DO
    !$OMP END DO
    !$OMP END PARALLEL
    deallocate(cvalor)
    deallocate(valor_t2)
END DO
执行代码时,第二个OpenMP并行区域内发生访问冲突异常。有时,该异常会因变量valor_t2处的溢出而更改

也许OpenMP不支持这种并行化,但我在网上搜索过,没有找到任何关于它的信息。我知道OpenMP支持使用相互嵌套的各种OMP并行指令,我知道它是如何工作的。但是这个问题让我头疼

你知道发生了什么吗


非常感谢你

您需要在顶层的do循环中使用
collapse
子句。有关信息,请参阅下面的链接:


只要由
(此处的一些代码)
表示的代码不包含任何循环,这应该可以工作

您是否尝试过调试器(或竞争条件检测器)?一段可以编译的代码片段会更好。这让我想起了过去两天在未命名的最大商业Fortran编译器中盲目调试
collapse
的实现是有缺陷的。但是+1,感谢您的提示,循环之间可能有一些代码。尽管仍然存在一些问题,OP需要的私有化是否能够实现。不要给你施加过多的压力,@VladimirF,但是如果OP正在使用编译器,命名编译器可能会有帮助。可能是一条私人消息?我尝试过使用collapse,但与代码不兼容。在
(这里有一些代码)
的第二部分中,有更多的循环(很抱歉,我从来没有想到这会很重要)。这个想法是每个线程启动更多的线程来计算所提到的循环中的内容。我认为发布完整的代码或一个演示您尝试执行的操作的最小示例会有所帮助。我想看看循环是否可以重新安排,使
collapse
子句可以发挥作用。您可能还希望在只并行其中一个循环(内部或外部)的情况下测量代码的性能,以查看是否可以在不并行这两个循环的情况下获得接近最优的性能。