天天看點

從深度學習gpu選擇來談談gpu的硬體架構

轉自:http://suanfazu.com/t/gpu-gpu/12326

從深度學習在2012年大放異彩,gpu計算也走入了人們的視線之中,它使得大規模計算神經網絡成為可能。人們可以通過07年推出的CUDA(Compute Unified Device Architecture)用代碼來控制gpu進行并行計算。本文首先根據顯示卡一些參數來推薦何種情況下選擇何種gpu顯示卡,然後談談跟cuda程式設計比較相關的硬體架構。

1.選擇怎樣的GPU型号

這幾年主要有AMD和NVIDIA在做顯示卡,到目前為止,NVIDIA公司推出過的GeForce系列卡就有幾百張[1],雖然不少都已經被淘汰了,但如何選擇适合的卡來做算法也是一個值得思考的問題,Tim Dettmers[2]的文章給出了很多有用的建議,根據自己的了解和使用經曆(其實隻用過GTX 970…)我也給出一些建議。

從深度學習gpu選擇來談談gpu的硬體架構

10

上面并沒有考慮筆記本的顯示卡,做算法加速的話還是選桌上型電腦的比較好。成本效益最高的我覺得是GTX 980ti,從參數或者一些使用者測評來看,性能并沒有輸給TITAN X多少,但價格卻便宜不少。從圖1可以看出,價位差不多的顯示卡都會有自己擅長的地方,根據自己的需求選擇即可。要處理的資料量比較小就選擇頻率高的,要處理的資料量大就選顯存大core數比較多的,有double的精度要求就最好選擇kepler架構的。tesla的M40是專門為深度學習制作的,如果隻有深度學習的訓練,這張卡雖然貴,企業或者機構購買還是比較合适的(百度的深度學習研究院就用的這一款[3]),相對于K40單精度浮點運算性能是4.29Tflops,M40可以達到7Tflops。QUADRO系列比較少被人提起,它的M6000價格比K80還貴,性能參數上也并沒有好多少。

在挑選的時候要注意的幾個參數是處理器核心(core)、工作頻率、顯存位寬、單卡or雙卡。有的人覺得位寬最重要,也有人覺得核心數量最重要,我覺得對深度學習計算而言處理器核心數和顯存大小比較重要。這些參數越多越高是好,但是程式相應的也要寫好,如果無法讓所有的core都工作,資源就被浪費了。而且在購入顯示卡的時候,如果一台主機插多張顯示卡,要注意電源的選擇。

2.一些常見的名稱含義

上面聊過了選擇什麼樣的gpu,這一部分介紹一些常見名詞。随着一代一代的顯示卡性能的更新,從硬體設計上或者命名方式上有很多的變化與更新,其中比較常見的有以下一些内容。

  • gpu架構:Tesla、Fermi、Kepler、Maxwell、Pascal
  • 晶片型号:GT200、GK210、GM104、GF104等
  • 顯示卡系列:GeForce、Quadro、Tesla
  • GeForce顯示卡型号:G/GS、GT、GTS、GTX

gpu架構指的是硬體的設計方式,例如流處理器簇中有多少個core、是否有L1 or L2緩存、是否有雙精度計算單元等等。每一代的架構是一種思想,如何去更好完成并行的思想,而晶片就是對上述思想的實作,晶片型号GT200中第二個字母代表是哪一代架構,有時會有100和200代的晶片,它們基本設計思路是跟這一代的架構一緻,隻是在細節上做了一些改變,例如GK210比GK110的寄存器就多一倍。有時候一張顯示卡裡面可能有兩張晶片,Tesla k80用了兩塊GK210晶片。這裡第一代的gpu架構的命名也是Tesla,但現在基本已經沒有這種設計的卡了,下文如果提到了會用Tesla架構和Tesla系列來進行區分。

而顯示卡系列在本質上并沒有什麼差別,隻是NVIDIA希望區分成三種選擇,GeFore用于家庭娛樂,Quadro用于工作站,而Tesla系列用于伺服器。Tesla的k型号卡為了高性能科學計算而設計,比較突出的優點是雙精度浮點運算能力高并且支援ECC記憶體,但是雙精度能力好在深度學習訓練上并沒有什麼卵用,是以Tesla系列又推出了M型号來做專門的訓練深度學習網絡的顯示卡。需要注意的是Tesla系列沒有顯示輸出接口,它專注于資料計算而不是圖形顯示。

最後一個GeForce的顯示卡型号是不同的硬體定制,越往後性能越好,時鐘頻率越高顯存越大,即G/GS<GT<GTS<GTX。

3.gpu的部分硬體

這一部分以下面的GM204硬體圖做例子介紹一下GPU的幾個主要硬體(圖檔可以點選檢視大圖,不想圖檔占太多篇幅)[4]。這塊晶片它是随着GTX 980和970一起出現的。一般而言,gpu的架構的不同展現在流處理器簇的不同設計上(從Fermi架構開始加入了L1、L2緩存硬體),其他的結構大體上相似。主要包括主機接口(host interface)、複制引擎(copy engine)、流處理器簇(Streaming Multiprocessors)、圖形處理簇GPC(graphics processing clusters)、記憶體等等。

從深度學習gpu選擇來談談gpu的硬體架構

2

主機接口,它連接配接了gpu卡和PCI Express,它主要的功能是讀取程式指令并配置設定到對應的硬體單元,例如某塊程式如果在進行記憶體複制,那麼主機接口會将任務配置設定到複制引擎上。

複制引擎(圖中沒有表示出來),它完成gpu記憶體和cpu記憶體之間的複制傳遞。當gpu上有複制引擎時,複制的過程是可以與核函數的計算同步進行的。随着gpu卡的性能變得強勁,現在深度學習的瓶頸已經不在計算速度慢,而是資料的讀入,如何合理的調用複制引擎是一個值得思考的問題。

流處理器簇SM是gpu最核心的部分,這個翻譯參考的是GPU程式設計指南,SM由一系列硬體組成,包括warp排程器、寄存器、Core、共享記憶體等。它的設計和個數決定了gpu的計算能力,一個SM有多個core,每個core上執行線程,core是實作具體計算的處理器,如果core多同時能夠執行的線程就多,但是并不是說core越多計算速度一定更快,最重要的是讓core全部處于工作狀态,而不是空閑。不同的架構可能對它命名不同,kepler叫SMX,maxwell叫SMM,實際上都是SM。而GPC隻是将幾個sm組合起來,在做圖形顯示時有排程,一般在寫gpu程式不需要考慮這個東西,隻要掌握SM的結構合理的配置設定SM的工作即可。

圖中的記憶體控制器控制的是L2記憶體,每個大小為512KB。

4.流處理器簇的結構

上面介紹的是gpu的整個硬體結構,這一部分專門針對流處理器簇SM來分析它内部的構造是怎樣的。首先要明白的是,gpu的設計是為了執行大量簡單任務,不像cpu需要處理的是複雜的任務,gpu面對的問題能夠分解成很多可同時獨立解決的部分,在代碼層面就是很多個線程同時執行相同的代碼,是以它相應的設計了大量的簡單處理器,也就是stream process,在這些處理器上進行整形、浮點型的運算。下圖給出了GK110的SM結構圖。它屬于kepler架構,與之前的架構比較大的不同是加入了雙精度浮點運算單元,即圖中的DP Unit。是以用kepler架構的顯示卡進行雙精度計算是比較好的。

從深度學習gpu選擇來談談gpu的硬體架構

上面提到過的一個SM有多個core或者叫流處理器,它是gpu的運算單元,做整形、浮點型計算。可以認為在一個core上一次執行一個線程,GK110的一個SM有192個core,是以一次可以同時執行192個線程。core的内部結構可以檢視[5],實作算法一般不會深究到core的結構層面。SFU是特殊函數單元,用來計算log/exp/sin/cos等。DL/ST是指Load/Store,它在讀寫線程執行所需的全局記憶體、局部記憶體等。

一個SM有192個core,8個SM有1536個core,這麼多的線程并行執行需要有統一的管理,假如gpu每次在1536個core上執行相同的指令,而需要計算這一指令的線程不足1536個,那麼就有core空閑,這對資源就是浪費,是以不能對所有的core做統一的排程,進而設計了warp(線程束)排程器。32個線程一組稱為線程束,32個線程一組執行相同的指令,其中的每個thread稱為lane。一個線程束接受同一個指令,裡面的32個線程同時執行,不同的線程束可執行不同指令,那麼就不會出現大量線程空閑的問題了。但是線上程束排程上還是存在一些問題,假如某段代碼中有if…else…,在排程一整個線程束32個線程的時候不可能做到給thread0~15配置設定分支1的指令,給thread16~31配置設定分支2的指令(實際上gpu對分支的控制是,所有該執行分支1的線程執行完再輪到該執行分支2的線程執行),它們獲得的都是一樣的指令,是以如果thread16~31是在分支2中它們就需要等待thread0~15一起完成分支1中的計算之後,再獲得分支2的指令,而這個過程中,thread0~15又在等待thread16~31的工作完成,進而導緻了線程空閑資源浪費。是以在真正的排程中,是半個warp執行相同指令,即16個線程執行相同指令,那麼給thread0~15配置設定分支1的指令,給thread16~31配置設定分支2的指令,那麼一個warp就能夠同時執行兩個分支。這就是圖中Warp Scheduler下為什麼會出現兩個dispatch的原因。

另外一個比較重要的結構是共享記憶體shared memory。它存儲的内容在一個block(暫時認為是比線程束32還要大的一些線程個數集合)中共享,一個block中的線程都可以通路這塊記憶體,它的讀寫速度比全局記憶體要快,是以線程之間需要通信或者重複通路的資料往往都會放在這個地方。在kepler架構中,一共有64kb的空間大小,供共享記憶體和L1緩存配置設定,共享記憶體實際上也可看成是L1緩存,隻是它能夠被使用者控制。假如共享記憶體占48kb那麼L1緩存就占16kb等。在maxwell架構中共享記憶體和L1緩存分開了,共享記憶體大小是96kb。而寄存器的讀寫速度又比共享記憶體要快,數量也非常多,像GK110有65536個。

此外,每一個SM都設定了獨立通路全局記憶體、常量記憶體的總線。常量記憶體并不是一塊記憶體硬體,而是全局記憶體的一種虛拟形式,它跟全局記憶體不同的是能夠高速緩存和線上程束中廣播資料,是以在SM中有一塊常量記憶體的緩存,用于緩存常量記憶體。

5.小結

本文談了談gpu的一些重要的硬體組成,就深度學習而言,我覺得對記憶體的需求還是比較大的,core多也并不是能夠全部用上,但現在開源的庫實在完整,想做卷積運算有cudnn,想做卷積神經網絡caffe、torch,想做rnn有mxnet、tensorflow等等,這些庫内部對gpu的調用做的非常好并不需使用者操心,但了解gpu的一些内部結構也是很有意思的。

另,一開始接觸GPU并不知道是做圖形渲染的…是以有些地方可能了解有誤,主要基于計算來讨論GPU的構造。

參考:

  1. List of Nvidia graphics processing units
  2. Which GPU(s) to Get for Deep Learning: My Experience and Advice for Using GPUs in Deep Learning
  3. Inside the GPU Clusters that Power Baidu’s Neural Networks
  4. Whitepaper NVIDIA GeForce GTX 980
  5. Life of a triangle - NVIDIA’s logical pipeline

原文:http://chenrudan.github.io/blog/2015/12/20/introductionofgpuhardware.html

繼續閱讀