You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 11:39:00