###### tags `平行程式設計` `資訊工程相關` # 平行程式設計 HW3 楊淨 109062530 ## Implementation 1. Which algorithm do you choose in hw3-1? 我使用一般的Floyd-Warshall,搭配openmp 對for 平行化 ![](https://i.imgur.com/MbGVXkt.png) 2. How do you divide your data in hw3-2, hw3-3? 本次作業就是直接做題目給的範例切法 ![](https://i.imgur.com/PJWERXQ.png) 這邊加速的問題在於一個block跟shared memory可以開到多大 一個BLOCK就是 `dim3 bk(B, B);` 這樣B最大測試後只能開到32 最一開始直接用範例給的round來設計,也就是說這樣要跑到⌈n/B⌉次 `int round = ceil(n, B);` 每一次就是運算一個block量的東西,share memory 就是開到`sdata[B][B]` 但這樣做會造成shared memory使用效率不足,所以到了P22之後的所有大測資我都超時。 後來參考很多網路上的討論與論文文件後,發現了一個能將shared memory使用效率更高的切法。 這邊是以shared memory最高大約能開到多少去設定Big Block ![](https://i.imgur.com/IkKCg6K.png) 這樣一個round就會變成`int round = ceil(n, BB);` 整體要的loop量就加速2倍了,為了達到這樣子能對齊每個sm 與 block 最一開始讀資料時要先將邊長填充,這樣才好實作shared mem 的copy ![](https://i.imgur.com/2ZvxEcp.png) 有了被填充後的邊長之後圖大概是長這樣, 橘色部位是多出來被填充以方便對齊SM與GLOBLE DATA, 資料有72 * 72, SHARE MEM 是64 * 64 一個BLOCKG是32 * 32 PaddingN 是 72+56=128 ![](https://i.imgur.com/Tk2Aezu.png) 再來就是一樣根據作業3提供的那張圖去算,將綠色區域想像成下圖的灰色區域 只是不一樣的是這次一次可以算4倍的範圍,只要設定好 offset就可以進行偏移運算。 ![](https://i.imgur.com/PJWERXQ.png) ![](https://i.imgur.com/mtOnubG.png) 以PHASE1為例子,紅色就是一個THREAD會運算到的點 這樣就能充分運用 SHARED MEMORY ![](https://i.imgur.com/mCTabe2.png) ![](https://i.imgur.com/2LM7NiZ.png) 3. What’s your configuration in hw3-2, hw3-3? And why? (e.g. blocking factor, #blocks, #threads) ![](https://i.imgur.com/mtOnubG.png) 如同我在第2節提到的,因為threads上限是32*32,所以一個BLOCK就直接設定成32 * 32 再來就是 SHARED MEMORY 這邊是使用到64 * 64 INT ![](https://i.imgur.com/PJWERXQ.png) 如圖第一個PHASE的BLOCK 只要一個就好了 第二個PHASE的BLOCK 他是2個邊長,我這邊實作上只開一個邊長,但利用OFFSET去做垂直跟水平的偏移。 第三個PHASE的BLOCK 就是直接取PaddingN的ceiling平方去做剩餘的運算。 4. How do you implement the communication in hw3-3? 5. Briefly describe your implementations in diagrams, figures or sentences. 如同前面說的 資料切成這樣 在PHASE1執行這一步,紅色是指1個THREAD做的 綠色是sdata,更新全部的值 ![](https://i.imgur.com/WkaNfdV.png) ![](https://i.imgur.com/Tk2Aezu.png) 全部的thread一起做就會變成一次將左上角的這個大PIVOT完成 ![](https://i.imgur.com/kL2iZMv.png) 在PHASE2執行這步,phase2同時定位垂直與水平, 以下圖第2個BLOCK blockIdx.x == 1為例, 他會將大block的東西都計算了,包含大於總資料n的區域, 不過那些計算我們最終資料是用不到的,我們只要非橘色區域。 ![](https://i.imgur.com/YWjDQMj.png) ![](https://i.imgur.com/GS0ASk0.png) 在PHASE3執行這步,phase2的時候已經將垂直與水平邊界都算好了, 圖以 blockIdx.y == 1 blockIdx.x == 1 時為例 ![](https://i.imgur.com/pkb5mZu.png) 紫色的格子是這個block計算的東西,紅色是已經算完的區域 ![](https://i.imgur.com/FEkrbC9.png) 這樣一來只要round跑完,中心就會由左上算到右下。 --- ## Profiling Results (hw3-2) Provide the profiling results of following metrics on the biggest kernel of your program using NVIDIA profiling tools. 這一部分我拿P21K1的資料來當測試,我認為這個資料量剛剛好 occupancy ![](https://i.imgur.com/1ogr9iL.png) sm efficiency ![](https://i.imgur.com/gyYkHqK.png) shared memory load/store throughput ![](https://i.imgur.com/r8ykkdq.png) global load/store throughput ![](https://i.imgur.com/PoHeb1V.png) ![](https://i.imgur.com/i0R2HAm.png) ## Experiment & Analysis 1. System Spec 這一部分我是使用實驗室的機器APOLLO(3-1)與HADES(3-2 3-3) ![](https://i.imgur.com/ugbwgv8.png) Hades: ![](https://i.imgur.com/SkLJ5d7.png) ![](https://i.imgur.com/ur85hQ4.png) ![](https://i.imgur.com/oA14N7a.png) ![](https://i.imgur.com/6OlJbl1.png) 2. ### Blocking Factor (hw3-2) Observe what happened with different blocking factors, and plot the trend in terms of Integer GOPS and global/shared memory bandwidth. (You can get the information from profiling tools or manual) (You might want to check nvprof and Metrics Reference) 因為p21k1 的資料量太大,一直超時不給跑 這部分我拿 p11k1 進行 --metrics inst_integer 計算再除以執行時間 首先 B=32 * 32 一個kernel 加起來共 13304960768 約133億次*172 /耗時1.2秒 =19092 GOPS ![](https://i.imgur.com/Qr8Br1S.png) ![](https://i.imgur.com/Gdy1VG1.png) B=16 * 16 ![](https://i.imgur.com/0Q3IPOB.png) ![](https://i.imgur.com/0JHxgCT.png) B=8 * 8 跑到超時 無法計算 ![](https://i.imgur.com/QmRrZ61.png) 使用的blockfactor: B * B | 8 * 8 = 64 | 16 * 16 = 256 | 32 * 32 = 1024 | | -------- | -------- | -------- | | X | 12040 GOPS | 19092 GOPS | ![](https://i.imgur.com/SfCdNDf.png) ### global/shared memory bandwidth B1024 ![](https://i.imgur.com/BFrZjuT.png) B256 ![](https://i.imgur.com/Y2iLsh1.png) B64 ![](https://i.imgur.com/wAJeXfS.png) ![](https://i.imgur.com/EaEx4x9.png) ![](https://i.imgur.com/xDFxivu.png) 3. Optimization (hw3-2) Any optimizations after you port the algorithm on GPU, describe them with sentences and charts. Here are some techniques you can implement: 這一部分我以P11K1當範例,比較了幾個版本: * CPU版本的 * 最初完成的CUDA版本(SM與BLOCK一樣大) * 最終版本(4倍SM以在一個THREAD中進行偏移計算) ![](https://i.imgur.com/0Ktg3q8.png) ![](https://i.imgur.com/0k1N79H.png) 4. Weak scalability (hw3-3) Observe weak scalability of the multi-GPU implementations 5. Time Distribution (hw3-2) Analyze the time spent in: computing communication memory copy (H2D, D2H) I/O of your program w.r.t. input size. 以測資p11k1 p16k1 p21k1 p25k1 為例 | | p11k1 | p16k1 | p21k1 | p25k1 | | -------- | -------- | -------- | -------- |-------- | | V | 11000 | 16000 | 20959 | 25000 | | E | 505586 | 5444739 | 987205 | 5780158 | ![](https://i.imgur.com/3g4cyBe.png) ![](https://i.imgur.com/4BPtLJF.png) ## Experience & conclusion What have you learned from this homework? 本次作業學到了不少與CUDA操作有關的用法,比起之前的LAB,這次最大的收穫在於實作SHARED MEMORY拓展後,更清楚如何運用SHARED MEMORY來加速運算,還有BLOCK大小的各項影響,原本認識的平行化都只是簡單的將FOR迴圈想辦法拆分,但這次作業為了將東西分散到GPU上的BLOCK,整個思維需要跳開好幾階,一開始一直想不到怎麼加速才好。 Feedback (optional) 希望作業報告能給再多一些實作的範例或步驟,有些東西沒碰過實在不太清楚要如何實作,學生可能會多花不少時間去猜要怎麼做才對。