我正在开发一个 OpenACC 计算流体动力学代码,通过将整体计算分解为一堆小操作来增加循环内计算的粒度。我的最终目标是通过将原始复杂任务拆分为 GPU 上更简单的一系列任务来减少每个威胁的寄存器数量。
例如,对于计算域的特定节点,我有许多公式要计算:
!$acc parallel loop ...
do i=1,n
D1 = s(i+1,1) - s(i-1,1)
D2 = s(i+1,2) - s(i-1,2)
...
R = D1 + D2 + ...
enddo
如您所见,我可以将计算分散到一个块的线程中,最后将结果(通过归约)汇总到 R。因此,我定义了一个内部并行循环,如下所示:
!$acc parallel loop
do i=1,n
!$acc parallel loop ...
do j=1,m
D[j] = s(i+1,j) - s(i-1,j)
end
!$acc parallel loop reduction(+:R)
do j=1,m
R = R + D[j]
enddo
enddo
但是,我需要将 D 定义为所有线程的共享内存,但实际上我不知道 OpenACC 的最佳方式是什么?(我使用了 !$acc 缓存,但性能更差)。此外,我需要将一些未更改的数据发送到常量内存,但我不知道该怎么做。
有没有什么有效的方法可以将这个想法实施到 OpenACC 中?我真的很感谢你的帮助。
非常感谢,贝扎德