再談GPU的內(nèi)存帶寬
本文轉(zhuǎn)載自微信公眾號(hào)「GPU and Computing」,作者GPUComputing 。轉(zhuǎn)載本文請(qǐng)聯(lián)系GPU and Computing公眾號(hào)。
在先前的文章中《近距離看GPU計(jì)算(2)》,我們談到GPU相比CPU有更大的內(nèi)存帶寬,此言不虛,這也是眾核GPU有源源不斷數(shù)據(jù)彈藥供給,能夠發(fā)揮強(qiáng)大算力的主要原因。如下表所示(GDDR和HBM都是GPU的顯存規(guī)格),基本上GPU的內(nèi)存帶寬要比CPU多一個(gè)數(shù)量級(jí)。
但是考慮到GPU運(yùn)算核心的數(shù)量,平均下來顯存帶寬真的足夠富裕嗎?參考資料1的《Memory bandwidth》文章提供了很有趣的視角,我們?cè)谶@里介紹下。MOS 6502發(fā)布于1975年,是微型計(jì)算機(jī)發(fā)展史上非常重要的一塊芯片。6502一般運(yùn)行在1M時(shí)鐘頻率,每個(gè)時(shí)鐘可以訪問1Byte內(nèi)存數(shù)據(jù),6502的一條指令需要花費(fèi)3~5個(gè)時(shí)鐘,所以平均下來每條指令大概可以獲得4B內(nèi)存數(shù)據(jù)。
與此相對(duì)照,Intel的Core i7-7700K是一款目前比較主流的桌面CPU,運(yùn)行頻率4.2G,內(nèi)存帶寬大概50GB/s。i7-7700K一共有4個(gè)處理核心,所以每個(gè)核心大概可以均攤到12.5GB/s的內(nèi)存帶寬,也就是每個(gè)時(shí)鐘可以訪問約3B的內(nèi)存數(shù)據(jù)。該CPU的IPC(Instruction Per Clock)為1,極優(yōu)化的代碼可以達(dá)到的IPC為3,按此計(jì),每條指令可得1B的內(nèi)存數(shù)據(jù),跟老前輩6502相比,已經(jīng)落后不少。更進(jìn)一步,現(xiàn)代CPU支持256位長(zhǎng)度的SIMD指令,每個(gè)時(shí)鐘最多執(zhí)行3條指令,類比GPU,我們以32位為一個(gè)通道作為單獨(dú)執(zhí)行線程,這樣每個(gè)時(shí)鐘我們一共有24條指令執(zhí)行,所以每條指令可以訪問0.125B內(nèi)存數(shù)據(jù)或者說每8條指令得到1B內(nèi)存數(shù)據(jù)。
我們?cè)倩剡^頭來看看GPU的情形。以NVidia GeForce GTX 1080Ti為例,內(nèi)存帶寬484GB/s,處理單元工作頻率為1.48G,所以對(duì)整個(gè)GPU來說,每個(gè)時(shí)鐘大概可以訪問327B內(nèi)存數(shù)據(jù)。這個(gè)GPU一共有28個(gè)SM(類似CPU的處理核心),每個(gè)SM有128個(gè)SP,所以總共有3584個(gè)SP(類似先前SIMD32位通道)。這樣每個(gè)SM一個(gè)時(shí)鐘大概可以訪問11.7B的內(nèi)存數(shù)據(jù),平均到128個(gè)SP,一個(gè)SP一個(gè)時(shí)鐘得到0.09B數(shù)據(jù),換個(gè)好聽的說法就是每11條指令可以得到1B內(nèi)存數(shù)據(jù),比CPU的指標(biāo)還惡劣。
需要再次重申的是,因?yàn)樵O(shè)計(jì)目標(biāo)的問題,CPU其實(shí)更關(guān)注訪存延遲指標(biāo),所以相形之下,內(nèi)存帶寬的壓力對(duì)GPU更為顯著。這也是為什么我們先前說過的GPU也開始配置多級(jí)Cache的原因,除了改善訪存延遲,也可以降低內(nèi)存帶寬壓力。另外我們?cè)凇禛PU歷史之二三事》里也提到Nvidia和AMD都開始擁抱移動(dòng)GPU常用的TBR(Tile Based Rendering)的繪制技術(shù),內(nèi)存帶寬的壓力也應(yīng)該是重要的驅(qū)動(dòng)因素。而作為軟件人員,在設(shè)計(jì)算法的時(shí)候,我們要重視算法的運(yùn)算強(qiáng)度(見《Roofline模型初步》),要充分利用片上內(nèi)存包括硬件Cache和軟件Cache(Shared Memory),以及注意內(nèi)存的合并訪問(Memory Coalescing)等等來優(yōu)化內(nèi)存帶寬。
主要參考資料:
https://fgiesen.wordpress.com/2017/04/11/memory-bandwidth/