CUDA ILP,指令获取,流水线操作和分支

时间:2013-03-03 12:44:03

标签: cuda

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

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

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

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

我会感谢任何可能阐明我提到的任何领域的参考资料。 NVidia制作了大量的PowerPoint子弹点演示文稿,但这些仅作为口头演示的补充。

1 个答案:

答案 0 :(得分:3)

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

  因此,我假设CUDA架构通过交换多个warp来有效地隐藏了一些指令依赖性,就像隐藏内存延迟一样。这个假设是否正确?

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

  因此,交换warp并不是完全免费的,对吗? (将多个问题折叠到这个问题中)

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

  

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

对于一般的建筑理解,我会推荐费米whitepaper,开普勒GK104(GTX680)whitepaper和开普勒GK110 whitepaper