
Abstract: 本文通過矩陣轉置這一個例子,調整,優化核函數,使其達到最優的內存帶寬Keywords: 帶寬,吞吐量,矩陣轉置
開篇廢話
下面是廢話,與本文知識無關,可以直接跳到下面紅字處開始本文知識的學習。
廢話繼續,這兩天沒更新博客了,上一篇是轉發的MIT人工智能實驗室的研究指南,也就是告訴剛入學的研究生怎么做研究,要怎么積累,那篇文章發表在1988年,MIT的AI實驗室網站目前仍然能檢索的到,通讀全文,感受很多,也學會了很多東西,當一個健康的框架搭好了以后,后面的好功能會源源不斷的涌現,教育也是,當一套體系形成,那么就會有源源不斷的人才和成果出現,相反,如果體系本身漏洞百出,根基不穩,短時間真的改不了,人也一樣,價值觀一旦確定,這個人的人生也就基本定型了——正所謂三歲看老。
今天廢話有點多,如果沒興趣,可以直接跳到這里
上一章我們研究怎么通過調整線程網格結構和核函數來達到SM的最高利用率,今天我們來研究如何達到內存帶寬的最大利用率。
還是要提那個老例子,但是說實話,這的很形象,也很有用,記住這個例子基本就能了解CUDA的優化大概要從哪入手了:一條大路(內存讀取總線)連接了工廠生產車間(GPU)和材料倉庫(全局內存),生產車間又有很多的工作小組(SM),材料倉庫有很多小庫房(內存分塊),工作小組同時生產相同的產品互不干擾(并行),我們有車從材料倉庫開往工廠車間,什么時候發車,運輸什么由工作小組遠程電話指揮(內存請求),發車前,從材料倉庫裝貨的時候,還要聽從倉庫管理員的分配,因為可能同一間庫房可能只允許一個車來拿材料(內存塊訪問阻塞),然后這些車單向的開往工廠,這時候就是交通問題了,如果我們的路是單向(從倉庫到工廠)8車道,每秒鐘能通過16輛車,那么我們把這個指標稱為帶寬。當然我們還有一條路是將成品運輸到成品倉庫,這也是一條路,與原料庫互不干擾,和材料倉庫到工廠的路一樣,也有寬度,也是單向的,如果這條路堵住,和倉庫到工廠的路堵住一樣,此時工廠要停工等待。最理想的狀態是,路上全是車,并且全都高速行駛,工廠里的所有工人都在滿負荷工作,沒有等待,這就是優化的最終目標,如果這個目標達到了,還想進一步提高效率,那么你就只能優化你的工藝了(算法)
上面的這個就是粗糙的GPU工作過程。例子還是比較貼切的,但是有點描述粗糙,多讀兩遍應該會有點收獲的。
內存延遲是影響核函數的一大關鍵,內存延遲,也就是從你發起內存請求到數據進入SM的寄存器的整個時間。
內存帶寬,也就是SM訪問內存的速度,它以單位時間內傳輸的字節數進行測量。
上一節我們用了兩種方法改善內核性能:
- 最大化線程束的數量來隱藏內存延遲,維持更多的正在執行的內存訪問達到更好的總線利用率
- 通過適當的對齊和合并訪問,提高帶寬效率
然而,當前內核本身的內存訪問方式就有問題,上面兩種優化相當于給一個拖拉機優化空氣動力學外觀,杯水車薪。
我們本文要做的就是看看這個核函數對應的問題,其極限效率是多少,在理想效率之下,我們來進行優化,我們本文那矩陣轉置來進行研究,看看如何把一種看起來沒辦法優化的內核,重新設計讓它達到更好的性能。
內存帶寬
完整內容參考 https://face2ai.com/CUDA-F-4-4-核函數可達到的帶寬/