如何解决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 举报,一经查实,本站将立刻删除。