1

我正在 CUDA Kepler GTX680 上编写体积光线投射算法。该算法是寄存器密集型的,这会导致高寄存器溢出或最大占用率的 50%。提高吞吐量的推荐方法是对指令进行排序以支持指令级并行性。

为了实现架构的最大吞吐量,各种管道必须保持忙碌。算术单元的管道长度为 cca。22 条指令,因此为了实现它们的全部吞吐量,必须在每个时钟周期安排一个新的算术运算。我希望交换 warp(由于其不满足的数据依赖性而停用一个 warp 并激活另一个准备好运行的 warp)不会触及算术单元管道。因此,我假设 CUDA 架构通过交换多个扭曲有效地隐藏了一些指令依赖关系,就像它隐藏内存延迟一样。这个假设正确吗?

指令获取和解码是否流水线化?管道有多长?我想如果当前的warp由于不满足的数据依赖性而被换出,那么指令管道会被刷新,因此交换warp并不是完全免费的,对吧?分支如何影响指令处理?我想分支指令必须停止指令流水线,直到评估分支条件,这似乎使谓词评估比分支更便宜。是这样吗?

Kepler GK104/110 架构的指令缓存有多大,它是如何组织的?可能对于一个复杂的内核来说,取指令的速度可能是瓶颈吗?

我将感谢任何可以阐明我提到的任何领域的参考资料。NVidia 制作了大量的 PowerPoint 要点演示,但这些仅作为口头演示的补充有用。

4

1 回答 1

3

最好每个问题问一个问题。

因此,我假设 CUDA 架构通过交换多个扭曲有效地隐藏了一些指令依赖关系,就像它隐藏内存延迟一样。这个假设正确吗?

是的,机器隐藏任何类型延迟的主要机制是让多个 Warp 准备好执行,无论是来自相同的还是不同的块。

因此交换warp并不是完全免费的,对吧?(将多个问题合并为一个)

不,交换经线是零成本。第一点(延迟隐藏)取决于此。从这里的 C 编程指南:

由多处理器处理的每个 warp 的执行上下文(程序计数器、寄存器等)在 warp 的整个生命周期内都在芯片上维护。因此,从一个执行上下文切换到另一个执行上下文没有成本,并且在每个指令发出时间,warp 调度程序都会选择一个线程准备好执行其下一条指令的线程(warp 的活动线程)并将指令发布给这些线程.

对于一般的架构理解,我推荐 Fermi白皮书、Kepler GK104 (GTX680)白皮书和 Kepler GK110白皮书

于 2013-03-03T15:22:29.717 回答