入门/转行|GPU/CUDA C编程入门自学指南
来自:airylin
Motivation
(如果你对GPU编程的目的和难点已经有所了解,可以不看)
为什么需要学习gpu或CUDA C编程?AI、科学计算等应用场景中需要对模型、算法进行加速,自定义cuda c算子可以让算法跑的更快,针对算法利用硬件特性进行优化。
例如ai中目前常用的pytorch框架,运行模型时,gpu版本后端中调用的其实就是CUDA C编写的算子(或者说函数),因此当我们配置环境时,配置CUDA和cuDNN等都是为了使用这些后端的支持,从而让我们用python写的模型算法最终能够跑在GPU上,高速运行。
当然,要写出能够在GPU上高速运行的程序不一定完全依赖于CUDA C编程框架,只是CUDA近些年来都非常主流和垄断,当前OpenAI的Triton有一种取代CUDA C的野心,试图降低用户的GPU编程门槛。
那么学习GPU编程的难点在哪里呢?如果想写出一个高性能(跑得快)的GPU程序:
- 需要发掘上层算法中的并行性
- 对目标硬件结构有充分的了解
- 结合两者的计算和访存特点,将算法映射到目标硬件上
接下来就来介绍下如何学习CUDA C编程语言&如何学习GPU硬件相关知识。
学习路线
入门
入门推荐先搞懂cuda c编程模型的语法和(nvidia)gpu的基本结构,推荐一些资源:
1. 理解cuda c和gpu结构:
如果英语比较好时间充足建议浏览官网的编程指南:
https://docs.nvidia.com/cuda/cuda-c-programming-guide/
当然也有对应的中文版翻译,可以初期快速浏览下,但很久不更新了:
https://github.com/HeKun-NVIDIA/CUDA-Programming-Guide-in-Chinese
2. 学习gpu结构建议先看知乎上的一些博客,类似下面这篇梳理了NV GPU各代架构的发展和迭代过程:
https://zhuanlan.zhihu.com/p/394352476
3. 当然学习的最好方式还是跟着敲代码,推荐一本书:
《CUDA by Example》
中文译本:《GPU高性能编程CUDA实战》
虽然这本书比较老了,但是作为入门级别还是完全可以的,主要可以快速掌握如何编写cuda c算子,如何使用各级存储,并学习如何测性能,初步体验写算子的快乐。
4. 推荐我很喜欢的一本书,对于各种概念讲的较为深入:
《Professional CUDA C Programming》
中文译本:《CUDA C编程权威指南》
或者参考谭升的博客,翻译了前面重要的章节:人工智能编程 | 谭升的博客
这个阶段,你应该对以下两张图都有了一定的理解:


进阶
这个阶段需要你不断的编写代码,进行性能测试和瓶颈分析,并加深对硬件特性的理解。
1. 推荐可以多看别人写的kernel代码,并自己尝试写一些涉及reduce、共享内存操作的代码,这里推荐一个面试向github,里面写了一些AI中常用的算子:
https://github.com/DefTruth/CUDA-Learn-Notes
写AI算子的话,推荐 激活函数(element-wise)算子 -> softmax/normalization算子 -> 矩阵乘gemm(conv)这样逐步增加难度去学习;即按照 简单加减乘除运算 -> reduce运算 -> 矩阵乘运算 这样逐步增加难度,并且可优化空间也会变得更大。
2. 强烈推荐学习使用性能分析工具,如nvidia提供的nsight compute,或者硬件公司自己开发的工具等,查看kernel内部各种计算、访存的耗时情况,指令发射情况等等,这个阶段也可以开始看汇编代码了,可以使用compiler explorer查看生成的汇编代码,分析指令生成和排布情况等,帮助我们进一步理解硬件行为。
3. 加深对硬件的理解,至少要理解GPU中的一些访存合并、bank conflict之类的一些原理,并在代码中运用这些硬件特性,这里推荐一本gpgpu的架构书:
《通用图形处理器设计:GPGPU编程模型与架构原理》
然后就是看nvidia每一代架构的whitepaper,会有nv官方的对每代硬件的介绍。
结语
拖更了一个月终于写了,高性能AI系统学海无涯,欢迎各位同行或者感兴趣的姐妹来讨论交流!~
你的回复
回复请先 登录 , 或 注册相关内容推荐
最新讨论 ( 更多 )
- 已入职场 | 休息日的工作消息需要回吗 (momo)
- 入门/转行|好想知道走码➕英语好能出国吗 (Bai)
- 入门/转行|如何提高本科就业可能性 (YoYo)
- 入门/转行|纯文科转码·留学申请总结 (幸运的皮皮鸭)
- 已入职场|国内厂996在职自救半年润出国经历 (momo)