目录

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,因为这两个在代码里引入了分支结构。

如果代码有分支,那么

  1. SM首先执行那些进入first branch的threads,此时其余threads在等待
  2. 然后执行进入second branch的threads,前面的线程等待。

因此在可能的情况下,我们应该尽量使用模板参数来替换掉loop/if:

  • 如果if所判断的条件在kernel launch时就能确定(即作为kernel的一个parameter传入的),那就可以用模板参数来代替该parameter,这样编译器会自动优化掉另一分支。
  • 同理,如果for-loop的边界也在kernel launch时就能确定,那也可用模板参数代替。

针对一些边界是常量(如0->5)的循环,在循环体足够简单的情况下,可以使用#pragma unroll来告诉编译器展开该循环。

参考文献:CUDA程序调优指南(二):性能调优 - 知乎

CUDA程序性能调优相关推荐

  1. java多线程程序性能调优 优化过程

    我, 一多年c++开发,由于项目原因需要对一个性能底下的多线程java程序进行调优,百度google了几把,妈蛋,没有发现指导如何java线程调优的文章啊,都是一些java使用规范,我去,那我大jav ...

  2. 性能测试实践|PerfDog助力微信小游戏/小程序性能调优

    概述 随着近年来微信生态圈的发展,小游戏,小程序也随之爆火,同样伴随着的便是对于小游戏/小程序的用户体验的严格要求:微信团队也在自家的微信平台推荐使用PerfDog测试小游戏/小程序的性能. 1.评测 ...

  3. [development][profile][dpdk] KK程序性能调优

    KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项de ...

  4. 【程序性能调优】分析gprof 结果含义

    1.gprof gprof-test gmon.out -p 得到每个函数占用的执行时间 % time                       :此函数使用的程序总运行时间的百分比. cumula ...

  5. 成为Java GC专家(5)—Java性能调优原则

    2019独角兽企业重金招聘Python工程师标准>>> 这是"成为Java GC专家"系列的第五篇文章.在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同 ...

  6. java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

    java jvm调优 我已经花了几个月的时间考虑审查有关性能调优,JVM,Java中的GC,Mechanical Sympathy等主题的文章和视频的缓存,并最终花了点时间–也许这就是重点我什么时候才 ...

  7. (第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

    我已经花了几个月的时间考虑审查有关性能调优,JVM,Java中的GC,Mechanical Sympathy等主题的文章和视频的缓存,并最终花了点时间–也许这就是重点我什么时候需要做我的智力进步! 感 ...

  8. aix系统java堆_浅谈AIX环境下的Java性能调优

    1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...

  9. Android性能调优实例

    本文主要分享自己在appstore项目中的性能调优点,包括 同步改异步.缓存.Layout优化.数据库优化.算法优化.延迟执行等. 一.性能瓶颈点 整个页面主要由6个Page的ViewPager,每个 ...

最新文章

  1. mysql存储过程语法及实例
  2. 听说「面向对象是怎样工作的?」是一道送命题?| 7月书讯
  3. 解决使用CoreData时报duplicate symbol错误问题
  4. 事务、事件(文件、时间、调度和执行)、复制、分片(范围、哈希)、简单的论坛系统分析
  5. uniapp 输入框防抖节流_拉动一下控制台大小,后台请求数量爆炸,竟是没做好防抖与节流...
  6. 分子动力学模拟软件_机器学习模拟1亿原子:中美团队获2020「超算诺贝尔奖」戈登贝尔奖...
  7. kindEditor文本编辑器
  8. 【LeetCode 148】链表的归并排序
  9. 分布式服务防雪崩熔断器(Hystrix),实现服务降级
  10. 最新版ins安装包下载
  11. 安卓开发之NDK开发基础(一)
  12. 2023年新年倒计时HTML源代码,2023年春节倒计时代码
  13. 书中第十章货币实验Currencies App在openexchangerates.org上的开发者密钥
  14. 华为服务器系列产品介绍,裸金属服务器产品介绍
  15. github热门java项目_盘点Github上热门的Java开源项目
  16. 夜深人静写算法(三十七)- 威尔逊定理
  17. Oracle列合并成行之wm_concat函数浅析
  18. Python入门笔记,看完直接玩几个小案例是没有问题滴~
  19. 计算机网络vlan的作用,计算机网络之九:VLAN
  20. 小米、HomeKit之间设备互联?智汀家庭云助你实现兼容性

热门文章

  1. 总的来讲safari上面的research gate和canvas会出现奇奇怪怪的bug,但是chrome没问题
  2. 2108889队2021年数学建模美赛C题花絮视频!
  3. UNITY引擎变量调用产生不必要内存分配
  4. 一台linux通过另一台linux访问互联网
  5. Zabbix的架构配置选项
  6. 免费OA系统品牌有那些?
  7. 在ubuntu16.04.1配置qemu-img,qemu-nbd
  8. 假日教程-ZStack映像檔系列(TurnkeyLinux Observium)
  9. FusionCharts參数中文说明
  10. hdu 1546(最短路)