微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决OpenACC | Fortran 90:并行化嵌套 DO 循环的最佳方法是什么?

我正在尝试使用 OpenACC 中的“折叠”指令并行化以下嵌套的 DO 循环结构(下面的第一个代码)。最外层循环中存在的变量“nbl”也存在于其他 DO 循环中,因此存在依赖性。多亏了编译器,它提前显示错误。所以我不得不妥协并只对剩下的四个最里面的循环构造“折叠”指令。有没有办法通过利用“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,1)*Cx(i,5) + Cx(i,2)
    
ENDDO
ENDDO
ENDDO
ENDDO
ENDDO
!$acc end parallel loop

具有较少并行性的妥协工作代码

DO nbl = 1,nblocks
!$acc parallel loop collapse(4)
DO n_prim = 1,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。