【问题标题】:CUDA ILP, instruction fetch, pipelining and branchingCUDA ILP、指令获取、流水线和分支
【发布时间】: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


【解决方案1】:

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

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

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

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

不,交换经线是零成本。第一点(延迟隐藏)取决于此。来自C编程指南here

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

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

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 2016-11-10
    • 2013-09-08
    • 2013-11-22
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多