天天看點

高性能計算學習路線(針對大二同學)

高性能計算學習路線(針對大二同學)

給組裡高性能計算方向同學拟的學習路線,包括基礎課程、常備文檔和手冊、開源項目三個部分組成。基礎課程包括“(并行)算法設計與分析”、“數值算法”、計算機系統、作業系統和并行體系結構與程式設計,常備文檔和手冊包括了C/C++語言文檔、CUDA文檔、MPI文檔、Unix程式設計文檔和太湖之光平台的文檔等。開源項目包括了基礎課程的習題解答與lab代碼、一些并行算法優化樣例以及一些并行計算相關比賽的項目實戰。

下面是給團隊裡的大二的同學列的高性能計算方向學習路線和學習資料彙總,可以供有這方面學習需求的同學參考。 (後面我會再加一個分布式機器學習方向學習路線,持續更新中...)

基礎課程

(并行)算法設計與分析

離散數學基礎好的同學可以直接看《算法導論》,該書是算法設計領域非常權威的資料(對應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。

常備文檔和手冊

  1. C/C++語言官方文檔:https://en.cppreference.com/w/
  2. CUDA官方文檔:https://docs.nvidia.com/cuda/
  3. MPI官方文檔:https://www.mpi-forum.org/docs/ + 都志輝寫的那個MPI接口講解。
  4. Unix接口速查:Richard Stevens《Unix進階程式設計》
  5. Linux下面的awk、sed等工具使用和Makefile編寫、程式怎麼連結這些雜七雜八的:《鳥哥的Linux私房菜》+ man文檔
  6. 神威的文檔和手冊(針對主攻CPC的同學)

開源項目

  1. 算法導論的習題解答:https://github.com/walkccc/CLRS
  2. CSAPP的習題解答:https://github.com/DreamAndDead/CSAPP-3e-Solutions
  3. 數值分析算法的實作:https://github.com/lonelyprince7/NumericalAnalysis (zhy自己實作的,haha)
  4. Nvidia的CUDA優化官方樣例:https://github.com/NVIDIA/cuda-samples。
  5. MIT 6.828的Lab:https://github.com/SmallPond/MIT6.828_OS
  6. CMU 15-213的Lab:https://github.com/JonnyKong/CMU-15-213-Intro-to-Computer-Systems
  7. 2020年的CPC決賽賽題-基于太湖之光平台的通用型網格計算方法:https://github.com/lonelyprince7/Grid-Computing
  8. 2020年的CPC初賽賽題-基于太湖之光超算平台與MPI叢集的的分布式圖BFS算法:https://github.com/lonelyprince7/DistributedBFS
  9. 2019年的CPC初賽賽題-基于神威·太湖之光超算平台的模闆卷積運算優化:https://github.com/lonelyprince7/Stencil
  10. CUDA矩陣乘法的優秀開源實作:https://github.com/NVIDIA/cutlass
  11. CUDA矩陣分解算法的優秀開源實作:https://github.com/cuMF/cumf_als
  12. 基于C++的迷你深度學習架構實作:https://github.com/E1eveNn/xshinnosuke_cpp
  13. 基于Intel平台的深度學習算子優化:https://github.com/PasaLab/dolphin
  14. OpenMP實作的一個異步坐标更新算法,像優化深度學習底層架構的同學可以看看:https://github.com/ZhiminPeng/ARock
  15. 和上面一樣,也是一個分布式優化算法項目:https://github.com/uclaopt/TMAC
  16. 其他的打比賽方面就需要不斷去借鑒往年參賽隊伍的優化代碼,以練促學了

數學是符号的藝術,音樂是上界的語言。

繼續閱讀