高效能運算學習路線(針對大二同學)

lonelyprince7發表於2021-10-30

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

基礎課程

(並行)演算法設計與分析

離散數學基礎好的同學可以直接看《演算法導論》,該書是演算法設計領域非常權威的資料(對應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. 其他的打比賽方面就需要不斷去借鑑往年參賽隊伍的優化程式碼,以練促學了

相關文章