Cuda代码的优化方法(1)
本文整理自网络视频。
Analysis
分析代码,找到hotspot函数,使用profiler测试,计算预期。
NVIDIA Visual Profiler
https://developer.nvidia.com/nvidia-visual-profilerProfiling CUDA code on Visual Profiler
https://www.youtube.com/watch?v=kAdYhOb5ljw
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上进行。

内存访问模式
Coalesce,访问连续的数据块,

有效利用内存带宽
每个内存事务的平均延迟与带宽的乘积就是传送的字节数。类似于排队。
因此,增加传送的字节数,或者减少事务间的延迟,可以改善代码内存带宽。
减少平均延迟
- 减少每个线程块中的线程数
- 增加使用每个SM的线程块数
Occupancy占有率
根据具体的SM硬件资源来决定具体参数。
bank conflicts
总结
