CUDA(22)之优化之Unrolling Loop/ 并行粒度

摘要

本文主要简洁通俗地讲讲CUDA Unrolling Loop。

 

1. Unrolling Loop

loop unrolling 不同于内存优化(hardware accessing),这是一种指令级优化(software programming)。如果说编程上For循环是一种以计算性能的打折作为代价来实现编程的简单化的编程思路,那么Loop unrolling将是一种以编程复杂为代价来提升并行代码性能的高级的编程方式;更进一步地,For循环可以看成是loop unrolling零优化的状态;所以,计算性能loop unrolling严格优于或至少等于For语句——这是CPU,GPU的硬件的系统结构所致。

 

2. 例子一

传统实现

 

for (int i = 0; i < 100; i++) {
    a[i] = b[i] + c[i];
}

 

 

3. 例子二

指令并行化

 

for (int i = 0; i < 100; i += 2) {
    a[i] = b[i] + c[i];
    a[i+1] = b[i+1] + c[i+1];
}   


3. 并行粒度

 

Unrolling Loop可以进一步抽象出“并行粒度”的概念,比如,例子一中一个线程处理一个指令(任务轻),例子二中一个线程处理两个指令(任务重);另一方面,就CUDA而言,例子一需要的blocks数目少,例子二需要的blocks数目多。因为总体的性能是由线程执行时间与blocks数目决定的(线程计算能力范围内任务轻重耗时相近,计算能力外任务重耗时大;并行blocks能力范围内(比如NVIDIA GTX780Ti一次可并行192blcoks)blcoks的数目多数目少二者耗时相近),能力范围外,blocks数多点调度数目多点,耗时长点————总而言之,这是一个tradeoff问题,我们做的就是寻找一种策略在blocks块数目与线程处理时间之间的处理平衡,达到性能最大优化。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值