您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>主機(jī)配件>顯卡>

深度學(xué)習(xí)之GPU硬件選型

2018年01月06日 12:01 電子發(fā)燒友網(wǎng) 作者: 用戶評(píng)論(0

深度學(xué)習(xí)在2012年大放異彩,gpu計(jì)算也走入了人們的視線之中,它使得大規(guī)模計(jì)算神經(jīng)網(wǎng)絡(luò)成為可能。人們可以通過(guò)07年推出的CUDA(Compute Unified Device Architecture)用代碼來(lái)控制gpu進(jìn)行并行計(jì)算。本文首先根據(jù)顯卡一些參數(shù)來(lái)推薦何種情況下選擇何種gpu顯卡,然后談?wù)劯鷆uda編程比較相關(guān)的硬件架構(gòu)。

1.選擇怎樣的GPU型號(hào)

這幾年主要有AMD和NVIDIA在做顯卡,到目前為止,NVIDIA公司推出過(guò)的GeForce系列卡就有幾百?gòu)垼?],雖然不少都已經(jīng)被淘汰了,但如何選擇適合的卡來(lái)做算法也是一個(gè)值得思考的問(wèn)題,Tim Dettmers[2]的文章給出了很多有用的建議,根據(jù)自己的理解和使用經(jīng)歷(其實(shí)只用過(guò)GTX 970…)我也給出一些建議。

 深度學(xué)習(xí)之GPU硬件選型

179上面并沒(méi)有考慮筆記本的顯卡,做算法加速的話還是選臺(tái)式機(jī)的比較好。性價(jià)比最高的我覺(jué)得是GTX 980ti,從參數(shù)或者一些用戶測(cè)評(píng)來(lái)看,性能并沒(méi)有輸給TITAN X多少,但價(jià)格卻便宜不少。從圖1可以看出,價(jià)位差不多的顯卡都會(huì)有自己擅長(zhǎng)的地方,根據(jù)自己的需求選擇即可。要處理的數(shù)據(jù)量比較小就選擇頻率高的,要處理的數(shù)據(jù)量大就選顯存大core數(shù)比較多的,有double的精度要求就最好選擇kepler架構(gòu)的。tesla的M40是專門(mén)為深度學(xué)習(xí)制作的,如果只有深度學(xué)習(xí)的訓(xùn)練,這張卡雖然貴,企業(yè)或者機(jī)構(gòu)購(gòu)買(mǎi)還是比較合適的(百度的深度學(xué)習(xí)研究院就用的這一款[3]),相對(duì)于K40單精度浮點(diǎn)運(yùn)算性能是4.29Tflops,M40可以達(dá)到7Tflops。QUADRO系列比較少被人提起,它的M6000價(jià)格比K80還貴,性能參數(shù)上也并沒(méi)有好多少。

在挑選的時(shí)候要注意的幾個(gè)參數(shù)是處理器核心(core)、工作頻率、顯存位寬、單卡or雙卡。有的人覺(jué)得位寬最重要,也有人覺(jué)得核心數(shù)量最重要,我覺(jué)得對(duì)深度學(xué)習(xí)計(jì)算而言處理器核心數(shù)和顯存大小比較重要。這些參數(shù)越多越高是好,但是程序相應(yīng)的也要寫(xiě)好,如果無(wú)法讓所有的core都工作,資源就被浪費(fèi)了。而且在購(gòu)入顯卡的時(shí)候,如果一臺(tái)主機(jī)插多張顯卡,要注意電源的選擇。

2.一些常見(jiàn)的名稱含義

上面聊過(guò)了選擇什么樣的gpu,這一部分介紹一些常見(jiàn)名詞。隨著一代一代的顯卡性能的更新,從硬件設(shè)計(jì)上或者命名方式上有很多的變化與更新,其中比較常見(jiàn)的有以下一些內(nèi)容。

gpu架構(gòu):Tesla、Fermi、Kepler、Maxwell、Pascal

芯片型號(hào):GT200、GK210、GM104、GF104等

顯卡系列:GeForce、Quadro、Tesla

GeForce顯卡型號(hào):G/GS、GT、GTS、GTX

gpu架構(gòu)指的是硬件的設(shè)計(jì)方式,例如流處理器簇中有多少個(gè)core、是否有L1 or L2緩存、是否有雙精度計(jì)算單元等等。每一代的架構(gòu)是一種思想,如何去更好完成并行的思想,而芯片就是對(duì)上述思想的實(shí)現(xiàn),芯片型號(hào)GT200中第二個(gè)字母代表是哪一代架構(gòu),有時(shí)會(huì)有100和200代的芯片,它們基本設(shè)計(jì)思路是跟這一代的架構(gòu)一致,只是在細(xì)節(jié)上做了一些改變,例如GK210比GK110的寄存器就多一倍。有時(shí)候一張顯卡里面可能有兩張芯片,Tesla k80用了兩塊GK210芯片。這里第一代的gpu架構(gòu)的命名也是Tesla,但現(xiàn)在基本已經(jīng)沒(méi)有這種設(shè)計(jì)的卡了,下文如果提到了會(huì)用Tesla架構(gòu)和Tesla系列來(lái)進(jìn)行區(qū)分。

而顯卡系列在本質(zhì)上并沒(méi)有什么區(qū)別,只是NVIDIA希望區(qū)分成三種選擇,GeFore用于家庭娛樂(lè),Quadro用于工作站,而Tesla系列用于服務(wù)器。Tesla的k型號(hào)卡為了高性能科學(xué)計(jì)算而設(shè)計(jì),比較突出的優(yōu)點(diǎn)是雙精度浮點(diǎn)運(yùn)算能力高并且支持ECC內(nèi)存,但是雙精度能力好在深度學(xué)習(xí)訓(xùn)練上并沒(méi)有什么卵用,所以Tesla系列又推出了M型號(hào)來(lái)做專門(mén)的訓(xùn)練深度學(xué)習(xí)網(wǎng)絡(luò)的顯卡。需要注意的是Tesla系列沒(méi)有顯示輸出接口,它專注于數(shù)據(jù)計(jì)算而不是圖形顯示。

最后一個(gè)GeForce的顯卡型號(hào)是不同的硬件定制,越往后性能越好,時(shí)鐘頻率越高顯存越大,即G/GS《GT《GTS《GTX。

3.gpu的部分硬件

這一部分以下面的GM204硬件圖做例子介紹一下GPU的幾個(gè)主要硬件(圖片可以點(diǎn)擊查看大圖,不想圖片占太多篇幅)[4]。這塊芯片它是隨著GTX 980和970一起出現(xiàn)的。一般而言,gpu的架構(gòu)的不同體現(xiàn)在流處理器簇的不同設(shè)計(jì)上(從Fermi架構(gòu)開(kāi)始加入了L1、L2緩存硬件),其他的結(jié)構(gòu)大體上相似。主要包括主機(jī)接口(host interface)、復(fù)制引擎(copy engine)、流處理器簇(Streaming Multiprocessors)、圖形處理簇GPC(graphics processing clusters)、內(nèi)存等等。

39主機(jī)接口,它連接了gpu卡和PCI Express,它主要的功能是讀取程序指令并分配到對(duì)應(yīng)的硬件單元,例如某塊程序如果在進(jìn)行內(nèi)存復(fù)制,那么主機(jī)接口會(huì)將任務(wù)分配到復(fù)制引擎上。

復(fù)制引擎(圖中沒(méi)有表示出來(lái)),它完成gpu內(nèi)存和cpu內(nèi)存之間的復(fù)制傳遞。當(dāng)gpu上有復(fù)制引擎時(shí),復(fù)制的過(guò)程是可以與核函數(shù)的計(jì)算同步進(jìn)行的。隨著gpu卡的性能變得強(qiáng)勁,現(xiàn)在深度學(xué)習(xí)的瓶頸已經(jīng)不在計(jì)算速度慢,而是數(shù)據(jù)的讀入,如何合理的調(diào)用復(fù)制引擎是一個(gè)值得思考的問(wèn)題。

流處理器簇SM是gpu最核心的部分,這個(gè)翻譯參考的是GPU編程指南,SM由一系列硬件組成,包括warp調(diào)度器、寄存器、Core、共享內(nèi)存等。它的設(shè)計(jì)和個(gè)數(shù)決定了gpu的計(jì)算能力,一個(gè)SM有多個(gè)core,每個(gè)core上執(zhí)行線程,core是實(shí)現(xiàn)具體計(jì)算的處理器,如果core多同時(shí)能夠執(zhí)行的線程就多,但是并不是說(shuō)core越多計(jì)算速度一定更快,最重要的是讓core全部處于工作狀態(tài),而不是空閑。不同的架構(gòu)可能對(duì)它命名不同,kepler叫SMX,maxwell叫SMM,實(shí)際上都是SM。而GPC只是將幾個(gè)sm組合起來(lái),在做圖形顯示時(shí)有調(diào)度,一般在寫(xiě)gpu程序不需要考慮這個(gè)東西,只要掌握SM的結(jié)構(gòu)合理的分配SM的工作即可。

圖中的內(nèi)存控制器控制的是L2內(nèi)存,每個(gè)大小為512KB。

4.流處理器簇的結(jié)構(gòu)

上面介紹的是gpu的整個(gè)硬件結(jié)構(gòu),這一部分專門(mén)針對(duì)流處理器簇SM來(lái)分析它內(nèi)部的構(gòu)造是怎樣的。首先要明白的是,gpu的設(shè)計(jì)是為了執(zhí)行大量簡(jiǎn)單任務(wù),不像cpu需要處理的是復(fù)雜的任務(wù),gpu面對(duì)的問(wèn)題能夠分解成很多可同時(shí)獨(dú)立解決的部分,在代碼層面就是很多個(gè)線程同時(shí)執(zhí)行相同的代碼,所以它相應(yīng)的設(shè)計(jì)了大量的簡(jiǎn)單處理器,也就是stream process,在這些處理器上進(jìn)行整形、浮點(diǎn)型的運(yùn)算。下圖給出了GK110的SM結(jié)構(gòu)圖。它屬于kepler架構(gòu),與之前的架構(gòu)比較大的不同是加入了雙精度浮點(diǎn)運(yùn)算單元,即圖中的DP Unit。所以用kepler架構(gòu)的顯卡進(jìn)行雙精度計(jì)算是比較好的。

深度學(xué)習(xí)之GPU硬件選型

上面提到過(guò)的一個(gè)SM有多個(gè)core或者叫流處理器,它是gpu的運(yùn)算單元,做整形、浮點(diǎn)型計(jì)算??梢哉J(rèn)為在一個(gè)core上一次執(zhí)行一個(gè)線程,GK110的一個(gè)SM有192個(gè)core,因此一次可以同時(shí)執(zhí)行192個(gè)線程。core的內(nèi)部結(jié)構(gòu)可以查看[5],實(shí)現(xiàn)算法一般不會(huì)深究到core的結(jié)構(gòu)層面。SFU是特殊函數(shù)單元,用來(lái)計(jì)算log/exp/sin/cos等。DL/ST是指Load/Store,它在讀寫(xiě)線程執(zhí)行所需的全局內(nèi)存、局部?jī)?nèi)存等。

一個(gè)SM有192個(gè)core,8個(gè)SM有1536個(gè)core,這么多的線程并行執(zhí)行需要有統(tǒng)一的管理,假如gpu每次在1536個(gè)core上執(zhí)行相同的指令,而需要計(jì)算這一指令的線程不足1536個(gè),那么就有core空閑,這對(duì)資源就是浪費(fèi),因此不能對(duì)所有的core做統(tǒng)一的調(diào)度,從而設(shè)計(jì)了warp(線程束)調(diào)度器。32個(gè)線程一組稱為線程束,32個(gè)線程一組執(zhí)行相同的指令,其中的每個(gè)thread稱為lane。一個(gè)線程束接受同一個(gè)指令,里面的32個(gè)線程同時(shí)執(zhí)行,不同的線程束可執(zhí)行不同指令,那么就不會(huì)出現(xiàn)大量線程空閑的問(wèn)題了。但是在線程束調(diào)度上還是存在一些問(wèn)題,假如某段代碼中有if…else…,在調(diào)度一整個(gè)線程束32個(gè)線程的時(shí)候不可能做到給thread0~15分配分支1的指令,給thread16~31分配分支2的指令(實(shí)際上gpu對(duì)分支的控制是,所有該執(zhí)行分支1的線程執(zhí)行完再輪到該執(zhí)行分支2的線程執(zhí)行),它們獲得的都是一樣的指令,所以如果thread16~31是在分支2中它們就需要等待thread0~15一起完成分支1中的計(jì)算之后,再獲得分支2的指令,而這個(gè)過(guò)程中,thread0~15又在等待thread16~31的工作完成,從而導(dǎo)致了線程空閑資源浪費(fèi)。因此在真正的調(diào)度中,是半個(gè)warp執(zhí)行相同指令,即16個(gè)線程執(zhí)行相同指令,那么給thread0~15分配分支1的指令,給thread16~31分配分支2的指令,那么一個(gè)warp就能夠同時(shí)執(zhí)行兩個(gè)分支。這就是圖中Warp Scheduler下為什么會(huì)出現(xiàn)兩個(gè)dispatch的原因。

另外一個(gè)比較重要的結(jié)構(gòu)是共享內(nèi)存shared memory。它存儲(chǔ)的內(nèi)容在一個(gè)block(暫時(shí)認(rèn)為是比線程束32還要大的一些線程個(gè)數(shù)集合)中共享,一個(gè)block中的線程都可以訪問(wèn)這塊內(nèi)存,它的讀寫(xiě)速度比全局內(nèi)存要快,所以線程之間需要通信或者重復(fù)訪問(wèn)的數(shù)據(jù)往往都會(huì)放在這個(gè)地方。在kepler架構(gòu)中,一共有64kb的空間大小,供共享內(nèi)存和L1緩存分配,共享內(nèi)存實(shí)際上也可看成是L1緩存,只是它能夠被用戶控制。假如共享內(nèi)存占48kb那么L1緩存就占16kb等。在maxwell架構(gòu)中共享內(nèi)存和L1緩存分開(kāi)了,共享內(nèi)存大小是96kb。而寄存器的讀寫(xiě)速度又比共享內(nèi)存要快,數(shù)量也非常多,像GK110有65536個(gè)。

此外,每一個(gè)SM都設(shè)置了獨(dú)立訪問(wèn)全局內(nèi)存、常量?jī)?nèi)存的總線。常量?jī)?nèi)存并不是一塊內(nèi)存硬件,而是全局內(nèi)存的一種虛擬形式,它跟全局內(nèi)存不同的是能夠高速緩存和在線程束中廣播數(shù)據(jù),因此在SM中有一塊常量?jī)?nèi)存的緩存,用于緩存常量?jī)?nèi)存。

小結(jié)

本文談了談gpu的一些重要的硬件組成,就深度學(xué)習(xí)而言,我覺(jué)得對(duì)內(nèi)存的需求還是比較大的,core多也并不是能夠全部用上,但現(xiàn)在開(kāi)源的庫(kù)實(shí)在完整,想做卷積運(yùn)算有cudnn,想做卷積神經(jīng)網(wǎng)絡(luò)caffe、torch,想做rnn有mxnet、tensorflow等等,這些庫(kù)內(nèi)部對(duì)gpu的調(diào)用做的非常好并不需用戶操心,但了解gpu的一些內(nèi)部結(jié)構(gòu)也是很有意思的。

另,一開(kāi)始接觸GPU并不知道是做圖形渲染的…所以有些地方可能理解有誤,主要基于計(jì)算來(lái)討論GPU的構(gòu)造。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

( 發(fā)表人:彭菁 )

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?