CUDA分支优化
来源:互联网 发布:淘宝买家秀福利大尺度 编辑:程序博客网 时间:2024/05/16 03:46
CUDA分支优化
标签: cuda分支优化warpSM
2015-07-16 10:24 293人阅读 评论(0)收藏举报
分类:
版权声明:本文为博主原创文章,未经博主允许不得转载。
在CUDA中,分支会极大的减弱性能,因为SM没有分支预测,因此只能让束内线程在每个分支上都执行一遍,当然如果某个分支没有线程执行,就可以忽略,因此要减少分支的数目。可以简单的说:
1. 同一个warp中的所有线程执行相同的命令。
2. 并不是所有线程都会执行。
产生分支的一个常见场景就是if,else
语句的使用,比如常用的边界判定。下面从一个实力说起。看如下代码:
<code class="hljs cs has-numbering"> <span class="hljs-keyword">int</span> tid = threadIdx.x; <span class="hljs-keyword">if</span>(tid == <span class="hljs-number">0</span>) <span class="hljs-keyword">var</span> = <span class="hljs-keyword">var</span> + <span class="hljs-number">1</span>; <span class="hljs-keyword">else</span> <span class="hljs-keyword">var</span> = <span class="hljs-keyword">var</span> + <span class="hljs-number">2</span>; <span class="hljs-keyword">var</span> = <span class="hljs-number">3</span> * <span class="hljs-keyword">var</span>;</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>
上述代码在一个warp中执行的情况如下图所示:
- 第一行所有线程执行
int tid = threadIdx.x;
。 - 所以第二行
if(tid == 0) var = var + 1
判断,由于只有线程0执行var = var + 1;
- 第三行是线程0到线程31执行
else var = var + 2;
- 第四行所有线程执行
var = 3 * var;
上述代码有两个方面的缺陷:
1. cuda线程执行if,else
语句的效率非常低。
2. 由于判断产生了分支,导致第二行和第三行是串行执行的。
解决方法:
1. 通过查找表去掉分支
2. 通过计算去掉分支,例如:上述代码可以转换为:var = 3*(var+1+(var>0))
因此,我们在编程的时候要尽量是warp块完美对齐,也就是说一个warp里都满足条件或者都不满足条件,如果实在无法对齐,也就是说产生分支的时候,可以用上述的方法解决分支问题。
0 0
- CUDA分支优化
- CUDA分支优化
- cuda编程优化小技巧之分支优化
- CUDA优化
- cuda优化
- CUDA优化
- cuda优化
- CUDA 学习(十九)、优化策略4:线程使用、计算和分支
- CUDA ---2 分支控制,变量
- CUDA: CUDA程序优化步骤
- CUDA程序性能优化
- CUDA程序优化
- CUDA程序优化
- CUDA 矩阵乘法优化
- cuda优化要点
- cuda优化策略
- CUDA: 矩阵乘法优化
- CUDA程序优化技巧
- cuda二维数组内存分配和数据拷贝
- 我对对java集合类的理解
- 一个关于定义的程序
- JAVA集合(一)
- 有10亿个整数,要求选取重复次数最多的100个整数
- CUDA分支优化
- JavaScript函数作为命名空间
- cuda warp
- vs2015连接oracle的方法
- rsyslog 一重启就会开始同步之前所有通配的日志文件
- 混圈子的人
- [C#] 读写App.config配置文件的方法
- async,await本质以及与Task的关系。
- java多线程