我正在 CUDA Kepler GTX680 上编写体积光线投射算法。该算法是寄存器密集型的,这会导致高寄存器溢出或最大占用率的 50%。提高吞吐量的推荐方法是对指令进行排序以支持指令级并行性。
为了实现架构的最大吞吐量,各种管道必须保持忙碌。算术单元的管道长度为 cca。22 条指令,因此为了实现它们的全部吞吐量,必须在每个时钟周期安排一个新的算术运算。我希望交换 warp(由于其不满足的数据依赖性而停用一个 warp 并激活另一个准备好运行的 warp)不会触及算术单元管道。因此,我假设 CUDA 架构通过交换多个扭曲有效地隐藏了一些指令依赖关系,就像它隐藏内存延迟一样。这个假设正确吗?
指令获取和解码是否流水线化?管道有多长?我想如果当前的warp由于不满足的数据依赖性而被换出,那么指令管道会被刷新,因此交换warp并不是完全免费的,对吧?分支如何影响指令处理?我想分支指令必须停止指令流水线,直到评估分支条件,这似乎使谓词评估比分支更便宜。是这样吗?
Kepler GK104/110 架构的指令缓存有多大,它是如何组织的?可能对于一个复杂的内核来说,取指令的速度可能是瓶颈吗?
我将感谢任何可以阐明我提到的任何领域的参考资料。NVidia 制作了大量的 PowerPoint 要点演示,但这些仅作为口头演示的补充有用。