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