Cuda代码的优化方法(1)

本文整理自网络视频

Analysis

分析代码,找到hotspot函数,使用profiler测试,计算预期。

Parallelize

选择并行化方法,并实现。cuda并行库,自己实现,或Directives(OpenMP,OpenACC)

Optimize

profile驱动的优化,使用的工具有:

  • nsight Visual Studio Edition
  • nvvp NVIDIA Visual Profiler
  • nvprof 命令行profiling

Deploy

实际运行中去挖掘。

这四个过程即Nvidia推荐的APOD过程。

GPU优化原则

  • 最大化算数强度
  • 减少内存时间消耗
  • 合并访问全局内存
  • 避免线程发散

优化级别

  • 选择好算法
  • 有效率地编写规则
  • 体系结构优化
  • 指令集的位操作优化

举个例子

这里是一个矩阵转置的优化代码,由于一个thread block内不能超过1024个thread,所以需要分到几个block上进行。

WechatIMG299

内存访问模式

Coalesce,访问连续的数据块,

WechatIMG304

有效利用内存带宽

每个内存事务的平均延迟与带宽的乘积就是传送的字节数。类似于排队。
因此,增加传送的字节数,或者减少事务间的延迟,可以改善代码内存带宽。

减少平均延迟

  • 减少每个线程块中的线程数
  • 增加使用每个SM的线程块数

Occupancy占有率

根据具体的SM硬件资源来决定具体参数。

bank conflicts

总结

WechatIMG305