打开ACC | Fortran 90:并行化嵌套 DO 循环的最佳方法是什么?

OpenACC | Fortran 90: What is the best way to parallelize nested DO loop?

我正在尝试使用 OpenACC 中的 'Collapse' 指令并行化以下嵌套 DO 循环结构(下面的第一个代码)。存在于最外层循环中的变量 'nbl' 存在于其他 DO 循环中,因此存在依赖性。感谢编译器提前显示错误。所以我不得不妥协,只对剩下的四个最内层循环构造 'collapse' 指令。有没有办法通过利用“nbl = 1,nblocks”的并行性来并行化此循环以获得最大性能?

编译器:pgfortran 标志:-acc -fast -ta=tesla:managed -Minfo=accel

由于最外层 DO 循环和其他内部 DO 循环之间的数据依赖性而出错的代码:

!$acc parallel loop collapse(5)
DO nbl = 1,nblocks
DO n_prim = 1,nprims
DO k = 1, NK(nbl)
DO j = 1, NJ(nbl)
DO i = 1, NI(nbl)

    Px(i,j,k,nbl,n_prim) = i*j + Cx(i,j,k,nbl,1)*Cx(i,j,k,nbl,5) + Cx(i,j,k,nbl,2)
    
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
!$acc end parallel loop

具有较少并行性的受损工作代码:

DO nbl = 1,nblocks
!$acc parallel loop collapse(4)
DO n_prim = 1,nprims
DO k = 1, NK(nbl)
DO j = 1, NJ(nbl)
DO i = 1, NI(nbl)

    Px(i,j,k,nbl,n_prim) = i*j + Cx(i,j,k,nbl,1)*Cx(i,j,k,nbl,5) + Cx(i,j,k,nbl,2)
    
ENDDO
ENDDO
ENDDO
ENDDO
!$acc end parallel loop
ENDDO

谢谢!

依赖于循环上限的数组查找。为了崩溃循环,在进入之前必须知道循环的迭代次数,但这里的次数是可变的。

尝试如下操作并将并行性分为两个级别:

!$acc parallel loop collapse(2)
DO nbl = 1,nblocks
DO n_prim = 1,nprims
!$acc loop collapse(3)
DO k = 1, NK(nbl)
DO j = 1, NJ(nbl)
DO i = 1, NI(nbl)