CUDA程序性能调优
目录
1、kernel function parameters
2、 local variables
3、shared memory with __syncthreads__ call
4、device function calls
5、loop/if
参考文献:CUDA程序调优指南(二):性能调优 - 知乎
介绍了GPU的结构以及资源的控制要素(GPU硬件结构和程序具体参数设置_yu132563的专栏-CSDN博客),下面就可以对CUDA进行程序的调优,从而在不同的GPU上面运行同一个CUDA程序的参数设置方法。
对于一个CUDA kernel function而言,其通常由如下几个部分组成:
kernel function paras
local variables
shared memory with __syncthreads__ call
device function call
loop/if
<<<BlocksNum, ThreadsNumPerBlock>>>
我们分别考虑如何对这些部分进行优化。
1、kernel function parameters
__global__
function的参数是存在constant mem里的,并且其大小被限制为4KB。通常来说,我们传入的参数都比较少,因此这些参数大部分是直接缓存在SM上的register上的,因此读取起来最快。但如果register不够用,那么就会被放到constant mem/cache上,速度就会变慢。
2、 local variables
对于单独的local var,其会被放在register里面,因此读写极快。对于数组类型的local var,根据访问pattern的不同,速度也不同(见per-thread array的访问)。总结而言是这样的:
- 【Static Indexing】:会被放到register里,读写极快
- 【Dynamic indexing with Uniform Access】:会被放到Local Mem里,略慢。但 更高的math/load比 配合 缓存到L1/L2cache里,也可以很快
- 【Dynamic indexing with Non-uniform Access】:由于会让SM产生多个访存指令,所以最慢。 但可以通过把其放到shared mem里加速
3、shared memory with __syncthreads__
call
shared memory需要尽量避免bank confilicts,这样读取最快,一个cycle clock就可以读取128byte。除此之外,因为shared memory由同一block内的thread共享,所以在初始化shared mem之后,需要调用__syncthreads__
来对同一block内的所有threads进行同步。
4、device function calls
编译器会自行决定device function是否会被inlined(多数情况下会inline)。通常来说,inline会更好,因为少了函数调用的开销。
5、loop/if
在书写kernel function时,应尽量避免loop/if,因为这两个在代码里引入了分支结构。
如果代码有分支,那么
- SM首先执行那些进入first branch的threads,此时其余threads在等待
- 然后执行进入second branch的threads,前面的线程等待。
因此在可能的情况下,我们应该尽量使用模板参数来替换掉loop/if:
- 如果
if
所判断的条件在kernel launch时就能确定(即作为kernel的一个parameter传入的),那就可以用模板参数来代替该parameter,这样编译器会自动优化掉另一分支。 - 同理,如果for-loop的边界也在kernel launch时就能确定,那也可用模板参数代替。
针对一些边界是常量(如0->5)的循环,在循环体足够简单的情况下,可以使用#pragma unroll
来告诉编译器展开该循环。
参考文献:CUDA程序调优指南(二):性能调优 - 知乎
CUDA程序性能调优相关推荐
- java多线程程序性能调优 优化过程
我, 一多年c++开发,由于项目原因需要对一个性能底下的多线程java程序进行调优,百度google了几把,妈蛋,没有发现指导如何java线程调优的文章啊,都是一些java使用规范,我去,那我大jav ...
- 性能测试实践|PerfDog助力微信小游戏/小程序性能调优
概述 随着近年来微信生态圈的发展,小游戏,小程序也随之爆火,同样伴随着的便是对于小游戏/小程序的用户体验的严格要求:微信团队也在自家的微信平台推荐使用PerfDog测试小游戏/小程序的性能. 1.评测 ...
- [development][profile][dpdk] KK程序性能调优
KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项de ...
- 【程序性能调优】分析gprof 结果含义
1.gprof gprof-test gmon.out -p 得到每个函数占用的执行时间 % time :此函数使用的程序总运行时间的百分比. cumula ...
- 成为Java GC专家(5)—Java性能调优原则
2019独角兽企业重金招聘Python工程师标准>>> 这是"成为Java GC专家"系列的第五篇文章.在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同 ...
- java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
java jvm调优 我已经花了几个月的时间考虑审查有关性能调优,JVM,Java中的GC,Mechanical Sympathy等主题的文章和视频的缓存,并最终花了点时间–也许这就是重点我什么时候才 ...
- (第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...
我已经花了几个月的时间考虑审查有关性能调优,JVM,Java中的GC,Mechanical Sympathy等主题的文章和视频的缓存,并最终花了点时间–也许这就是重点我什么时候需要做我的智力进步! 感 ...
- aix系统java堆_浅谈AIX环境下的Java性能调优
1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...
- Android性能调优实例
本文主要分享自己在appstore项目中的性能调优点,包括 同步改异步.缓存.Layout优化.数据库优化.算法优化.延迟执行等. 一.性能瓶颈点 整个页面主要由6个Page的ViewPager,每个 ...
最新文章
- mysql存储过程语法及实例
- 听说「面向对象是怎样工作的?」是一道送命题?| 7月书讯
- 解决使用CoreData时报duplicate symbol错误问题
- 事务、事件(文件、时间、调度和执行)、复制、分片(范围、哈希)、简单的论坛系统分析
- uniapp 输入框防抖节流_拉动一下控制台大小,后台请求数量爆炸,竟是没做好防抖与节流...
- 分子动力学模拟软件_机器学习模拟1亿原子:中美团队获2020「超算诺贝尔奖」戈登贝尔奖...
- kindEditor文本编辑器
- 【LeetCode 148】链表的归并排序
- 分布式服务防雪崩熔断器(Hystrix),实现服务降级
- 最新版ins安装包下载
- 安卓开发之NDK开发基础(一)
- 2023年新年倒计时HTML源代码,2023年春节倒计时代码
- 书中第十章货币实验Currencies App在openexchangerates.org上的开发者密钥
- 华为服务器系列产品介绍,裸金属服务器产品介绍
- github热门java项目_盘点Github上热门的Java开源项目
- 夜深人静写算法(三十七)- 威尔逊定理
- Oracle列合并成行之wm_concat函数浅析
- Python入门笔记,看完直接玩几个小案例是没有问题滴~
- 计算机网络vlan的作用,计算机网络之九:VLAN
- 小米、HomeKit之间设备互联?智汀家庭云助你实现兼容性