第一本cuda教材:
配套网课:
记得做网课作业。
然后就靠项目上手了。
我当时实习时候的项目是自己手撸了一遍caffe, 写了个内部的inference engine。顺带着学了很多 cuda 的实践。我觉得是个好项目,自己学了很多,但是看你自己兴趣/时间了。
==== 稍微更新下分割线
更新下上手之后对我帮助比较大的一些资料,这个时候对计算机底层不是很了解,做的东西还是浮于算法表面。
大致的知道要coalesced access,用vectorized datatype,以及大致的知道 atomics 慢,要避免 bank conflict, 但不是很懂architecture。
- 矩阵转置优化:
2. Reduction:
3. 图像上的连通区域分析 :
4. Summed area table (当时读的代码找不到了…让我到时候再找找)
上完班再来更一下==
我再上面这个阶段对于cuda的理解比较似是而非。很多时候知其然不知其所以然。
接下来对gpu/cuda 的理解从算法表面深入到体系结构了。
这个时候要祭出两本书,熟读后登堂入室。
- Computer architecture a quantitative approach https://www.elsevier.com/books/computer-architecture/hennessy/978-0-12-811905-1Computer ArchitectureComputer Architecture
- Parallel and High Performance Computing
以及microbenchmarking 里我一直会去读一下的报告
3. Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking
以上是我自己的学习路径。自己是数学系出身的所以很多东西都是在工作里慢慢才学起来。
我觉得计算机专业出身的话,可能学习的路径是反过来的。即体系结构出发,然后用cuda以及算法包装来达到目的。
我的领导就是我见过的最纯粹的体系结构派,碰到问题不是先写代码,而是先建一个excel表格来估算我们最好/最差的情况预期能达到怎样的效率。然后通过调整代码,调整算法,甚至调整编程语言(直接写ptx )来解决问题。
比如这个回答里的一篇文献,简单的矩阵转秩。里面作者的思路就是:转秩我们只会touch所有data 一次,那在理想情况下应该是和memcpy的效率一样。于是里面就通过各种技巧来逼近memcpy。
希望这篇回答能对大家有所帮助。