這次我們準(zhǔn)備聊下決定系統(tǒng)計(jì)算性能的兩大關(guān)鍵指標(biāo),1. 浮點(diǎn)運(yùn)算能力(FLOPS), 2. 內(nèi)存帶寬(Memory Bandwidth)。
一· 為什么這兩個(gè)指標(biāo)很重要
目前無(wú)論是嵌入式系統(tǒng),PC還是大型服務(wù)器都遵循了馮。諾依曼結(jié)構(gòu)。
對(duì)CPU密集型程序來(lái)說(shuō),執(zhí)行時(shí)候系統(tǒng)的內(nèi)部交互主要在處理器(包括控制器和運(yùn)算器)和存儲(chǔ)器之間展開(kāi),大概是如下圖過(guò)程。
所以CPU的處理能力以及訪(fǎng)存的效率對(duì)程序的性能起到了關(guān)鍵作用。大家知道計(jì)算一個(gè)程序執(zhí)行時(shí)間的公式如下(假設(shè)該程序是CPU Bound),
程序執(zhí)行時(shí)間(time) = 程序指令數(shù)目(Intructions) * 指令的平均時(shí)鐘數(shù)(CPI, Clock cycles/Instruction) * 時(shí)鐘周期(Seconds/Clock cycle)
為支持計(jì)算所需的精度和廣度,CPU/GPU ALU支持浮點(diǎn)運(yùn)算,單精度甚至雙精度都是必須的要求。這里我們引入FLOPS(floating point operations per second)的概念來(lái)表征CPU/GPU浮點(diǎn)運(yùn)算能力,所以針對(duì)浮點(diǎn)計(jì)算密集型程序,把FLOPS套到上面公式,我們可以用浮點(diǎn)運(yùn)算數(shù)目/FLOPS來(lái)估摸程序大概執(zhí)行時(shí)間。
訪(fǎng)存效率的重要性我們這里也可以再提一下,以GPU為例,無(wú)論是游戲還是深度學(xué)習(xí),都有大量的內(nèi)存讀寫(xiě)數(shù)據(jù)量。比如graphics里,有三角面片模型裝載,紋理采樣,深度測(cè)試(depth test),Alpha混合,以及圖像輸出等等。深度學(xué)習(xí)訓(xùn)練的時(shí)候,巨大的訓(xùn)練集/測(cè)試集輸入,迭代過(guò)程幾十萬(wàn),百萬(wàn)級(jí)別參數(shù)讀寫(xiě)。如果訪(fǎng)存成為瓶頸(Memory Bound),強(qiáng)大的計(jì)算能力也無(wú)從發(fā)揮。
二,如何知道FLOPS 和內(nèi)存帶寬
我們先看下如何得到兩個(gè)指標(biāo)的理論數(shù)值。
關(guān)于內(nèi)存帶寬,假設(shè)某款GPU,其顯示內(nèi)存的時(shí)鐘頻率為1546 MHZ,顯存的位寬(Interface Width)為384 bit, 則其帶寬的理論峰值計(jì)算如下,具體也可以參考https://en.wikipedia.org/wiki/Memory_bandwidth。
BW = 1546(clocks per second) * 384(memory interface width) * 2(DDR) / 8(In bytes) = 148GB/s
而GPU的理論FLOPS計(jì)算就要微妙很多,各個(gè)廠(chǎng)家對(duì)演算過(guò)程諱莫如深,一般不會(huì)公開(kāi),我們這里也不多著墨,大家參考廠(chǎng)家給出的數(shù)據(jù)罷了。ARM的網(wǎng)站寫(xiě)過(guò)一篇文章探討FLOPS營(yíng)銷(xiāo)噱頭一地雞毛的狀態(tài),F(xiàn)lipping the FLOPS - how ARM measures GPU compute performance,搜來(lái)看看,可以起到心理預(yù)防的作用。
相比理論數(shù)值,對(duì)碼農(nóng)來(lái)說(shuō),我們更關(guān)心是我們程序運(yùn)行的實(shí)際性能數(shù)值,這才是關(guān)系我們飯碗的要緊之處。假設(shè)一個(gè)程序的核心運(yùn)算是如下SAXPY,恰當(dāng)?shù)夭渴鸬紾PU或者多核CPU后,比如平均運(yùn)行時(shí)間為1us,我們?cè)撊绾斡?jì)算實(shí)際訪(fǎng)存帶寬和FOPS?
int N = 1 《《 22;
void saxpy(float a, float *x, float *y){
for (int i = 0; i 《 n; ++i)
y[i] = a*x[i] + y[i];
}
我們可以看到每次迭代,有三次內(nèi)存訪(fǎng)問(wèn)(x讀一次,y讀寫(xiě)各一次),而有兩次浮點(diǎn)運(yùn)算(乘加各一次)。所以實(shí)際BW和FOPS的計(jì)算如下,
BW = (3 * N * 4) / (1 / 1e9) = 120GB/s
FOPS = (2 * N) / (1 / 1e9) = 20GFLOPS
我們可以把實(shí)際數(shù)值和理論峰值比較下,確認(rèn)運(yùn)算瓶頸在何處,是memory bound還是cpu bound,然后進(jìn)一步優(yōu)化,關(guān)于這部分內(nèi)容,我們以后介紹roofline模型的時(shí)候還會(huì)涉及。
三,ALU和訪(fǎng)存的功耗水平
下圖來(lái)自David A. Patterson的另一本著作《計(jì)算機(jī)體系結(jié)構(gòu):量化研究方法》,羅列45nm制程各種類(lèi)型ALU和訪(fǎng)存的功耗大小以及他們相對(duì)水平,可以看到32b的內(nèi)存訪(fǎng)問(wèn)的功耗遠(yuǎn)超同樣位寬大小的運(yùn)算。
為什么我們要在這里留意功耗水平?移動(dòng)設(shè)備由于電池供電,尺寸大小散熱限制,對(duì)功耗異常敏感,功耗大小直接決定設(shè)備的使用價(jià)值。以后我們談到移動(dòng)GPU的設(shè)計(jì)的時(shí)候,可以了解如何在消除減少內(nèi)存訪(fǎng)問(wèn)方面極盡所能。另外比特幣礦場(chǎng)礦機(jī),數(shù)據(jù)中心的服務(wù)器,其數(shù)目都是以萬(wàn)記,它們更是電老虎,每天的電力消耗才是運(yùn)營(yíng)的最大費(fèi)用,會(huì)極大地影響了投資回報(bào)率,所以功耗水平有很重要的經(jīng)濟(jì)效果。最后目前全民倡導(dǎo)碳中和,綠色計(jì)算,身處產(chǎn)業(yè)鏈的我們,從硬件和軟件角度,努力提升功耗水平,也有很大社會(huì)意義。
編輯:lyn
-
cpu
+關(guān)注
關(guān)注
68文章
10889瀏覽量
212389 -
gpu
+關(guān)注
關(guān)注
28文章
4760瀏覽量
129132 -
ALU
+關(guān)注
關(guān)注
0文章
33瀏覽量
13115
原文標(biāo)題:GPU: 衡量計(jì)算效能的正確姿勢(shì)(2)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論