cuda中unroll的作用

FindHao 2018-11-9 469

3.5 展开循环

循环展开是一个尝试通过减少分支出现的频率和循环维护指令来优化循环的技术。在循环展开中,循环主体在代码中要多次被编写,而不是只编写一次循环主体再使用另一个循环来反复执行的。任何的封闭循环可将它的迭代次数减少或完全删除。循环体的复制数量被称为循环展开因子,迭代次数就变为了原始循环迭代次数除以循环展开因子。在顺序数组中,当循环的迭代次数在循环执行之前就已经知道时,循环展开是最有效提升性能的方法。考虑下面的代码:
image

如果重复操作一次循环体,迭代次数能减少到原始循环的一半:
image

从高级语言层面上来看,循环展开使性能提高的原因可能不是显而易见的。这种提升来自于编译器执行循环展开时低级指令的改进和优化。例如,在前面循环展开的例子中,条件i< 100只检查了50次,而在原来的循环中则检查了100次。另外,因为在每个循环中每个语句的读和写都是独立的,所以CPU可以同时发出内存操作。

在CUDA中,循环展开的意义非常重大。我们的目标仍然是相同的:通过减少指令消耗和增加更多的独立调度指令来提高性能。因此,更多的并发操作被添加到流水线上,以产生更高的指令和内存带宽。这为线程束调度器提供更多符合条件的线程束,它们可以帮助隐藏指令或内存延迟。


最新回复 (2)
全部楼主
  • FindHao 2018-11-9
    0 引用 2
    https://stackoverflow.com/questions/12167926/forcing-cuda-to-use-register-for-a-variable/12169588#12169588
  • FindHao 2018-11-9
    0 引用 3

    循环展开通
    常是提高ILP的有效方法,原因在于通过循环展开编译器可以在更长的无数据依赖的指令序列中对
    指令进行排序从而最大化指令吞吐率并最小化流水线中的停顿,同时减少循环索引和部分存储器

    地址的计算。

    --《GPU、CUDA-计算高级优化技术精简手册.pdf》

返回