并行计算:高性能计算学习路线(针对大二同学)
下面是给团队里的大二的同学列的高性能计算方向学习路线和学习资料汇总,可以供有这方面学习需求的同学参考。 (后面我会再加一个分布式机器学习方向学习路线,持续更新中...)
基础课程
(并行)算法设计与分析
离散数学基础好的同学可以直接看《算法导论》,该书是算法设计领域非常权威的资料(对应MIT 6.006课程),比如20年CPC初赛的图BFS算法的伪代码就直接截取自该书。离散数学基础差一点的学习可以看学堂在线邓俊辉老师的《数据结构》公开课,该课程对初学者非常友好。
数值算法
并行算法优化不光包括面向树、图等离散对象的算法,也有面向矩阵、多项式等连续对象的算法,包括但不限于LU分解、QR算法、高斯消元、有限元分析、离散傅里叶变换等。这部分与离散算法有所不同的是,需要特别注意数值稳定性、数值淹没、数值算法收敛性等问题。可以参考Timothy-Sauer的《数值分析》,可以用C/C++自己实现下上面的算法。
计算机系统
在算法优化过程中需要特别注意从整个计算机系统层面的宏观思考,而系统既包括单机也包括多机,即包括单核也包括多核。比如一提到“并行”这个词,你就要想到多机器之间的进程级并行、单机器上的线程级并行、指令级的流水线并行等。此外,以空间换时间是个很常用的手段,一提到局部性原理,你就要想到网络、磁盘访问的缓冲区局部性、内存中数组排列的访存局部性、CPU高速缓存中的局部性等。这方面推荐《CSAPP》这本书及其配套的Lab(对应CMU 15-213课程)。这是该课程网站:https://www.cs.cmu.edu/~213/, 相关lab也可以从GitHub上下载。
操作系统
操作系统是CS中对编程能力要求最高的一门课,据说OS课的实验完全搞懂了,几万行代码的项目随便上(大雾)。一般而言,像Unix的系统编程接口(如pthread)和网络编程接口在计算机系统课程中已经学过了,OS这门课的重点就是如何实现这些接口,比如fork的底层实现、锁的底层实现、中断机制的底层实现等,这方面可以看《Operating Systems: Three Easy Pieces》(中文译名操作系统导论)搭配MIT 6.828的几个lab。该课程网站:https://abelay.github.io/6828seminar/index.html。 同样,相关lab也可以从Github上下载。视频方面,推荐哈工大李治军的操作系统和南京大学蒋炎岩老师的《操作系统:设计与实现》课程。
并行体系结构与编程
台湾新竹清华大学周志远老师的网课《并行计算与并行编程课程》讲的非常不错,该课程仿照CMU 15-418课程的结构设置,着重介绍并行计算通用的理论和思想,对CUDA、MPI、OpenMP、Spark等实际技术都有包括。教材的话目前我看到的最好的就是David B.Kirk写的《大规模并行处理器编程实战》,这本书以CUDA为载体,介绍了许多并行计算的通用思想,包括访存带宽优化、线程粒度、原子操作等。NvidiaCUDA自带了许多官方样例,包括了对傅里叶变换、N体问题、卷积运算等许多算法优化案例,项目地址如下:https://github.com/NVIDIA/cuda-samples。
常备文档和手册
- C/C++语言官方文档:https://en.cppreference.com/w/
- CUDA官方文档:https://docs.nvidia.com/cuda/
- MPI官方文档:https://www.mpi-forum.org/docs/ + 都志辉写的那个MPI接口讲解。
- Unix接口速查:Richard Stevens《Unix高级编程》
- Linux下面的awk、sed等工具使用和Makefile编写、程序怎么链接这些杂七杂八的:《鸟哥的Linux私房菜》+ man文档
- 神威的文档和手册(针对主攻CPC的同学)
开源项目
- 算法导论的习题解答:https://github.com/walkccc/CLRS
- CSAPP的习题解答:https://github.com/DreamAndDead/CSAPP-3e-Solutions
- 数值分析算法的实现:https://github.com/lonelyprince7/NumericalAnalysis (zhy自己实现的,haha)
- Nvidia的CUDA优化官方样例:https://github.com/NVIDIA/cuda-samples。
- MIT 6.828的Lab:https://github.com/SmallPond/MIT6.828_OS
- CMU 15-213的Lab:https://github.com/JonnyKong/CMU-15-213-Intro-to-Computer-Systems
- 2020年的CPC决赛赛题-基于太湖之光平台的通用型网格计算方法:https://github.com/lonelyprince7/Grid-Computing
- 2020年的CPC初赛赛题-基于太湖之光超算平台与MPI集群的的分布式图BFS算法:https://github.com/lonelyprince7/DistributedBFS
- 2019年的CPC初赛赛题-基于神威·太湖之光超算平台的模板卷积运算优化:https://github.com/lonelyprince7/Stencil
- CUDA矩阵乘法的优秀开源实现:https://github.com/NVIDIA/cutlass
- CUDA矩阵分解算法的优秀开源实现:https://github.com/cuMF/cumf_als
- 基于C++的迷你深度学习框架实现:https://github.com/E1eveNn/xshinnosuke_cpp
- 基于Intel平台的深度学习算子优化:https://github.com/PasaLab/dolphin
- OpenMP实现的一个异步坐标更新算法,像优化深度学习底层架构的同学可以看看:https://github.com/ZhiminPeng/ARock
- 和上面一样,也是一个分布式优化算法项目:https://github.com/uclaopt/TMAC
- 其他的打比赛方面就需要不断去借鉴往年参赛队伍的优化代码,以练促学了