OpenACC | Fortran90 含依赖的嵌套DO循环如何最大化并行性能?
问题根因
你使用collapse(5)报错的核心原因是:OpenACC的collapse指令要求所有被折叠的循环的上界必须是编译期确定的常量,或是不随被折叠循环索引变化的外层不变量。你代码中NK(nbl)、NJ(nbl)、NI(nbl)的取值都随最外层循环索引nbl动态变化,编译器无法直接将5层循环压平为一维的线程映射,因此会抛出依赖错误。
优化方案
你不需要将nbl层纳入collapse范围,只要将nbl层设为gang级并行,内部4层循环做collapse即可,全程仅启动1次GPU内核,完全利用nbl层的并行性,避免原有妥协版本循环启动内核的额外开销:
!$acc parallel loop gang independent DO nbl = 1,nblocks !$acc loop collapse(4) vector independent 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
该方案的并行逻辑为:每个nbl迭代分配给一个独立的GPU gang,gang内部的4层循环压平后映射到vector线程,没有跨迭代依赖,符合OpenACC规范。
验证方式
用你现有的编译参数 -acc -fast -ta=tesla:managed -Minfo=accel 编译即可,编译器输出的accel信息会显示内核的gang级并行度为nblocks,vector级并行度为四层循环的总迭代数,并行度远高于你当前的妥协版本。
内容的提问来源于stack exchange,提问作者Prof. Albus Dumbledore
相关产品推荐
相关产品推荐

