1. 程式人生 > >GPU(顯示卡)的開源驅動調研

GPU(顯示卡)的開源驅動調研

1.     概要

在桌面作業系統中,由於廠商對顯示卡驅動的完美支援,使用者購買顯示卡時只需關注顯示卡的硬體特性,一般遵循“價格越貴效能越好”。作為核心競爭力,顯示卡廠商不會也不願意完全開源自己的顯示卡驅動,只發布編譯好的二進位制機器碼。不同的CPU其二進位制碼是不一樣的,因此不被顯示卡廠商支援的CPU則無法使用這些驅動,只能轉而求助於並不完善的開源驅動。這類CPU的使用者在選購顯示卡時不能僅僅考慮該款顯示卡理論上有多牛,因為在開源驅動環境下,顯示卡也許遠遠達不到其主頁上宣稱的效能和功能。

本文首先介紹顯示卡命名方法;然後以AMD Radeon顯示卡(俗稱A卡)和龍芯3A處理器為例,介紹開源驅動的組成,效能和功能;其間會與Nvidia顯示卡(N卡)做簡單比較,說明在開源驅動下,我們應該選擇A卡而不是遊戲玩家最喜歡的N卡。

主要內容有:

  • 顯示卡的命名方法:A卡和N卡
  • 如何確認開源驅動是否支援某款顯示卡
  • 顯示卡驅動的效能比較

本文只針對遊戲顯示卡(即桌面顯示卡),不考慮專業顯示卡等其他顯示卡。本章分別介紹AMD/ATI Radeon顯示卡、Nvidia GeForce顯示卡的命名規則。

AMD/ATI顯示卡的命名分為三個階段。

2.1.1. 字尾命名階段

Radeon HD300之前採用字尾命名規則,其高中低端的順序如:

XTX > XT > XL/GTO > Pro/GT > SE

其中:

XTXATI系列中最高階顯示卡型號的字尾;

XT:代表了頂級顯示卡的型號,一般就執行頻率稍低於XTX,例如高階顯示卡

Radeon X1950XTRadeon HD 2900XT,它們都採用了XT這個字尾;

XL:用於ATI高階顯示卡系列的字尾,級別比頂級級別的XT低,主要表現在頻率和管線上有所縮水;

GTO:用於中高階顯示卡系列,比XL級別稍低。

Pro/GTProGT的級別都要低於XT,一般來說,採用同一核心代號的ATI顯示卡,Pro的級別要稍高於GT,如X1950ProX1950GT,主要表現在執行頻率上,Pro要高於GT。但我們需要區分清楚,當採用不同核心代號的ATI顯示卡時,GT的級別是可以高於Pro的,如X1650GTX1650Pro,單從命名上看貌似X1650Pro要高階於X1650GT,但實際卻是相反的,

X1650Pro採用了RV530的顯示核心,要低階於1650GT採用的RV560,因此X1650Pro的級別要低於X1650GT

SE:全名為“Special Edition(特殊版),主要用於ATI中低端顯示卡系列的字尾,採用這個字尾的顯示卡在管線上會有所縮減。

2.1.2. HD+數字命名階段

ATIRadeon HD 3000系列開始採用了新的命名方法,拿Radeon HD3870為例,其中“3”代表了顯示卡代數、“8”代表了系列,而“70”則代表了顯示卡的系列內型號,數字越大代表的級別就越高。這種命名方式比起過去的更為直觀更容易區分開。

又例如HD6770HD69506是代表他們是第幾代產品;後面的78代表高中低端系列:89是高階,67是中端,45是低端產品;後面的70代表系列內的高中低端產品:507090分別對應低中高階。 6770就是67系列的高階,6950就是69系列的中端。

2.1.3. Rx+xxx命名階段

201310AMD正式宣佈了新一代的獨立顯示卡產品,同時也標誌著沿用六代的“Radeon HD”命名方式成為歷史,“Radeon Rx”閃亮登場。

新一代顯示卡的命名並不是接著HD7000繼續順延。HD8000命名留給了OEM,先前一條「欲重現9550輝煌」的新聞(傳言:AMD現已決定將HD 8000命名方式留給OEM產品,而零售產品則會改名,用HD 9000系列來替代)令大家以為新顯示卡在HD8000名稱被佔用之後順理成章地會叫做HD9000,同時期待會有重生的Radeon HD9550。不過最終登場是全新的Rx-xxx方式的命名,新顯示卡系列為Rx-2xx。具體來說,目前AMD自高到低將推出R9 290XR9 290R9 280XR9 270XR7 260XR7 250這些型號。

2.1.4. A卡名稱與其GPU核心架構代號的對應關係

Family

Engineering Names

Marketing Names

Fixed-pipeline family

R100

R100, RV100, RV200, RS100, RS200

7xxx, 320-345

R200

R200, RV250, RV280, RS300

8xxx - 9250

R300

R300, R350, RV350, RV380, RS400, RS480

9500 - 9800, X300 - X600, X1050 - X1150, 200M

R400

R420, R423, RV410, RS600, RS690, RS740

X700 - X850, X12xx, 2100

R500

RV515, R520, RV530, RV560, RV570, R580

X1300 - X2300, HD2300

TeraScale-family

R600

R600, RV610, RV630, RV620, RV635, RV670, RS780, RS880

HD2400 - HD4290

R700

RV770, RV730, RV710, RV740

HD4330 - HD5165, HD5xxV

Evergreen

CEDAR, REDWOOD, JUNIPER, CYPRESS, PALM (Wrestler/Ontario), SUMO (Llano), SUMO2 (Llano)

HD5430 - HD5970, all HD6000 not listed under Northern Islands, HD7350

Northern Islands

(北大西洋諸島)

ARUBA (Trinity/Richland), BARTS, TURKS, CAICOS, CAYMAN

HD6450, HD6570, HD6670, HD6790 - HD6990, HD64xxM, HD67xxM, HD69xxM, HD7450 - HD7670

Graphics

Core Next-family

Southern Islands

(南太平洋島)

CAPE VERDE, PITCAIRN, TAHITI, OLAND, HAINAN

(注:CAPE VERDE和OLAND都在北大西洋)

HD7750 - HD7970, R9 270, R9-280, R7 240, R7 250

Sea Islands

(海群島)

BONAIRE, KABINI(印度卡比尼河), KAVERI(印度卡佛理島), HAWAII


其中:注:紅色為未來產品

R100-R500Fixed-pipeline family

R600-Northern IslandsTeraScale-family

Southern Islands-最後是Graphics Core Next-family

我們討論的N卡都是基於GeForceGeForceNvidia的桌面遊戲顯示卡系列,除此之外還有針對移動平臺和專業圖形工作站的系列,在此不討論。

2.2.1. N卡命名規則

nVIDIA喜歡採用有規律的命名方式,對相同核心的不同型號顯示卡,以不同的命名規則區分開,以方便消費群體識別好顯示卡之間的級別。

nVIDIA各代顯示卡都遵循了由高至低命名規則Ultra >GTX >GTS >GT >GS >LE

Ultra:字面意思直譯就有“激進,極端”的意思。而在nVIDIA的產品中也是如此,只要字尾帶了這個傢伙,一定是那類晶片中最高階的,它的命名級別比GTX還要高,細數NV的歷代王者,基本都能看到它熟悉的身影。如8800Ultra,它就屬於8800GTX的高頻版本。

GTX:一般可以理解為GT eXtreme,代表了極端、極致的意思,用於nVIDIA最高級別的型號,如8800GTX和最新的9800GTX,都採用了GTX的字尾。

GTS:超級加強版Giga-TexelShader”的縮寫,千萬畫素的意思,也就是每秒的畫素填充率達到千萬以上。GTS最早出現在Geforce2產品中,代表當時的最高階的Geforce2。而現在一般用於表示GTX的縮減版,級別在GTX之後,如8800GTS

GT:頻率提升版本"GeForceTechnoloty"的縮寫,級別低於GTS,也是廣為使用者群體所接受的產品型號之一,主打中端——中高階的消費市場,較具代表的就是nVIDIA7”系列的7600GT

GSGS一般用於命名nVIDIA的主打產品,一般可以看作是GT的縮減版,級別低於GT,較為具代表性的就是7600GS。值得注意的是,採用GS命名的顯示卡,其核心架構可以和GT一樣,只是在執行頻率上落後於GT,但也可以是在核心架構上直接縮減,如7600GS的核心架構就和7600GT一樣,而8800GS的核心架構則比8800GT要有所縮水,我們在選購顯示卡時,要注意區分開。

LE"Limit Edition"的縮寫,表示限制版本,代表某一產品系列中的低端產品,主要是頻率與標準版本相比有一定的下降。如:7300LE

其實關於nVIDIA顯示卡的命名字尾還有許多,如XTZTTiSEGE等,在這裡就不一一列舉了,因為常見的顯示卡命名字尾,並不包含它們在內,下面我們來了解顯示卡顯示核心的架構概念。

2.2.2. N卡名稱與其GPU核心代號的對應關係

Code name

Official Name

Nvidia 3D

object codename

里程碑事件

NV04

Riva TNT, TNT2

Fahrenheit

NV10

GeForce 256, GeForce 2, GeForce 4 MX

Celsius

NV20

GeForce 3, GeForce 4 Ti

Kelvin

VS出現

NV30

GeForce 5 / GeForce FX

Rankine

NV40

GeForce 6, GeForce 7

Curie

NV50

GeForce 8, GeForce 9, GeForce 100, GeForce 200, GeForce 300

Tesla

NVC0

GeForce 400, GeForce 500

Fermi

NVE0

GeForce 600, GeForce 700, GeForce GTX Titan

Kepler

NV110

GeForce 750

Maxwell

3.     顯示卡的發展(略)

顯示卡的開源驅動包括Linux核心支援、2D驅動支援、3D驅動支援。

4.1.1. A卡

通過核心程式碼drivers/gpu/drm/radeon/radeon_family.h中的enum radeon_family可以看到,

2.6.36核心支援到Evergreen;

2.6.32核心(龍芯反向移植版)支援到Southern Islands;

3.15核心支援到Sea Islands,包括Sea Islands的最新架構Hawaii;但不支援最新的Volcanic Islands.(核心對Hawaii的完全支援要等到3.17)

4.1.2. N卡

通過核心程式碼drivers/gpu/drm/nouveau/core/engine/device/nve0.c中的nve0_identify可以看到,

2.6.36核心支援到GFxxx;

2.6.32核心(龍芯反向移植版)支援到Kelper的GK110;

3.15核心支援到Kelper的GK208;但不支援最新的Maxwell。

4.2.1. A卡

A卡的2D驅動為xorg-video-ati,其官網描述如下:Driver for ATI/AMD Radeon based video chips,everything from Radeon 7000 (R100) to Radeon HD 7000 (Southern Islands) series。

更新的A卡需要使用glamor 2D驅動。

4.2.2. N卡

N卡的2D驅動為xorg-video-nouveau,其官網描述如下:2D/3D acceleration supported on all cards。

4.3.1. A卡

Mesa的dri驅動src/mesa/drivers/dri/下有radeon,r200

Gallium驅動 src/gallium/drivers/下有r300,r600,radeonsi

其中:

radeon支援R100

r200支援R200

r300(稱作r300g)支援R300,R400,R500

r600(稱作r600g)支援R600,R700,Evergreen,Northern Islands

radeonsi支援Southern Islands,Sea Islands

4.3.2. N卡

Gallium驅動src/gallium/drivers/nouveau/nvc0

儘管目錄為nvc0,其實包括了對nve0(即Kepler)的支援;但是對最新的Maxwell的支援還在開發中。

4.3.3. Mesa對標準的支援

當前版本

Date

4.4
2013-07-22

3.1
2014-03-17

1.1
2008-12-03

1.5
2014-03-19

1.4
2005-12-16

3.10
2013-04-03

11.2
2011-09-13

10.2

(2014-06-06)[10]

3.3[11]

3.0

1.1

1.4

1.4

deprecated

9.0c

10.1

(2014-03-04)[12]

3.3[13]

3.0

1.1

1.4

1.4

deprecated

9.0c

10.0

(2013-11-30)[14]

3.3[15]

3.0

1.1

1.4

1.4

deprecated

9.0c

9.0

(2012-10-08)

3.1[16]

2.0

1.1

1.4

1.4

 ?

 ?

8.0

(2012-02-08)

3.0

2.0

1.1

1.4

1.4

 ?

 ?

7.0

(2007-06-22)

2.1

N/A

N/A

N/A

1.4

 ?

 ?

6.0

(2004-01-06)

1.5

N/A

N/A

N/A

1.3

 ?

 ?

5.0

(2002-11-13)

1.4

N/A

N/A

N/A

1.3

 ?

 ?

4.0

(2001-10-22)

1.3

N/A

N/A

N/A

1.3

 ?

 ?

註釋:

紅色為舊版本;黃色為舊版本,但持續支援;綠色為最新版本

目前Mesa只能支援到OpenGL 3.3;而閉源驅動可以支援到OpenGL 4.4

4.4.1. 概況

由前面對開源驅動的三個主要部分的介紹,可以看出開源驅動的開發速度至少落後閉源驅動一代。

A卡支援到上一代的Sea Islands,不支援最新的Volcanic IslandsN卡支援上一代的Kepler,不支援最新的Maxwell

不僅如此,開源驅動對上一代的顯示卡支援也不是最好的,效能遠遠低於閉源驅動。

不過讓人感到樂觀的是,近年兩大顯示卡陣營的開源驅動團隊都加大了投入(特別是AMDA卡開源驅動團隊是AMD的員工;而N卡開源驅動團隊則獨立於Nvidia公司);另外,由於顯示卡更新換代很快,所以上一代的顯示卡仍然會是很多領域的主流產品。

開源驅動值得期待。

4.4.2. Radeon驅動開發者

Alex Deucherthe lead open-source Radeon driver developer atAMD

ChristianKöniganother open-source AMD driver developer

JohnBridgmananother regular to the Phoronix Forums at AMD

Ian Romanick

等等

5.1.   A卡與N卡的閉源驅動效能比較(目的:A卡與N卡誰的效能好)

phoronix2014612日進行的測試《35-Way NVIDIA/AMDProprietary Linux Graphics Driver Comparison》如下:

結果顯示:

N卡完勝A卡,N卡的閉源驅動無論從效能還是相容性都比A卡做得好。

5.2.   A卡與N卡的開源驅動效能比較(目的:選擇A卡還是 N卡)

phoronix 2014725日進行的測試《Nouveau vs. Radeon vs.Intel Tests On Linux 3.16, Mesa 10.3-devel》如下:

結果顯示:

A卡完勝N卡,不過由於nouveau驅動增加了re-colocking支援(半支援),其效能已經比之前有較明顯的提升。

摘抄Michael Larabel的評論:The NVIDIAKepler GPU performance has improved with Linux 3.16 thanks to re-clockingsupport, but for most Kepler GPUs the re-clocking support only works partiallyand cannot be fully-clocked to the highest performance state. However, at leastthe Nouveau code is moving in the right direction. For Linux gamers caringabout open-source drivers, AMD Radeon remains the best choice for apleasurable, high performance experience.

5.3.   N卡的開源驅動和閉源驅動效能比較(目的:N卡開源驅動進展是否樂觀)

phoronix2014728日進行的測試《Even With Re-Clocking,Nouveau Remains Behind NVIDIA's Proprietary Linux Driver》如下:

結果顯示:

在為Kepler增加了re-clocking支援後,相應的N卡開源驅動效能有明顯提升。但是目前只有GeForce GTX 650是全支援,能夠達到閉源驅動340.2460%80%的效能;而其他的Kelper顯示卡只得到re-clocking的部分支援,只能達到閉源驅動的20%40%的效能。

另外,GTX650只相當於A卡中的HD6770,不考慮購買。

5.4.   A卡的開源驅動和閉源驅動效能比較(目的:A卡開源驅動進展是否樂觀)

phoronix 201434日進行的測試如下:

結果顯示:

基於不同平臺,Windows8.1Linux的閉源驅動效能差不多;基於相同的Linux平臺,HD5000/6000的開源驅動效能接近閉源驅動,HD7000及以上顯示卡的開源驅動效能差得比較遠。

phoronix 2014727日的文章《Open-Source AMD Users Report Hawaii GPUAcceleration Is Working》如下:

結果顯示:

Hawaii(如R9 290XR9 290)的驅動據說可以工作了:提交核心補丁並更新了Hawaiimicrocode檔案,使HawaiiGPU硬體加速可以正常工作。HawaiiA卡最新的架構,值得關注。

目前尚無資料。

phoronix2014729日的文章《Hawaii Bug-Fixes Start Hitting MainlineRadeonSI Gallium3D》如下:

結果顯示:

       AMD的開發人員728日向Mesa提交了一系列解決Hawaiiradeonsi驅動bug的補丁。另外,核心對Hawaii的支援要等到3.17,摘抄Labarel的評論:Open-sourceAMD Linux users wishing to use a Hawaii GPU will still need to utilize thepatches that will not be queued up until the Linux 3.17 kernel (along with updating their Radeon microcode files) but the RadeonSIGallium3D Mesa improvements are starting to hit the mainline tree. 

5.5.   A卡系列的開源驅動效能比較(目的:選擇哪款A卡)

phoronix2014723日進行的測試如下:

對下面7A卡進行效能測試

-Sapphire Radeon HD 6770 1GB
-Sapphire Radeon HD 6870 1GB
-Sapphire Radeon HD 6950 2GB
- ASUSRadeon HD 7850 1GB
- XFXRadeon HD 7950 3GB
-Sapphire Radeon R7 260X 2GB
-Gigabyte Radeon R9 270X 2G

結果顯示:

HD6870的綜合性能最好,HD6950在少量OpenGL測試程式上表現得比HD6870略好(閉源驅動下,HD6950效能明顯比HD6870好一些);另外,radeonsi驅動還有很多工作需要做,最新的顯示卡們(例如HD7xxxR9 200R7 200)的效能明顯不如幾年前的HD6870HD6950

另外,radeonsi對某些OpenGL程式不支援。見Larabel的評論:AMD GPU LLVM back-enderrors still prevented a number of the more demanding OpenGL games/benchmarksfrom running properly on the RadeonSI driver for the AMD GCN graphicsprocessors. 

phoronix2014623日的文章《Open-Source Radeon Performance BoostedBy Linux 3.16》如下:

結果顯示:

3.16核心添加了一些列A卡的補丁,包括GPU VM optimizationslarge PTE supportHDMI deepcolor support HDMI audio clean-ups,以及其他bug-fixesGCN顯示卡效能提升20%30%

3.16核心於201483日星期日正式釋出。

參考文件

1.     顯示卡命名規則

2.     Radeon

3.     RadeonFeature

4.     Nouveau