嵌套OMP DO指令 - Fortran

时间:2014-04-23 15:28:06

标签: fortran openmp

我在尝试将OMP DO指令嵌套在Fortran中的另一个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 PARALLEL指令,我知道它是如何工作的。但我对这个问题感到头疼。

关于它发生了什么的任何想法?

非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

https://computing.llnl.gov/tutorials/openMP/

只要(some code here)表示的代码不包含任何循环,这应该有效。