從兩屆圖靈獎(2018-2019)看GPU發展史

1. 引言

多年以後,面對圖形處理器(GPU)在人工智能、加密貨幣、高性能計算、自動駕駛等多研究領域的廣泛應用,如今的遊戲發燒友們是否會回想起,1999年Nvidia發佈專業遊戲顯卡GeForce256時那個炎熱的夏天?

GPU應用

GeForce256發佈以後GPU一詞才被大衆所接受,實際上1994年索尼發佈PS1的時候就提出了GPU的概念,當時使用的是由東芝爲索尼設計的GPU。

而後來在2002年ATI(已被AMD收購)提出的VPU(Visual Processing Unit)一詞則在時代的浪潮中消失無蹤。

從GeForce256發佈至今的21年時間,GPU實現了從PC遊戲時代到AI時代的巨大跨越。本文將和大家一起揭祕GPU爲何能夠撬動計算機圖形學和人工智能這兩個博大精深的領域。

2. GPU與計算機圖形學

今年3月18日,國際計算機學會ACM官方公佈了2019年度圖靈獎(計算機界的諾貝爾獎)獲得者Hanrahan和Catmull,以表彰他們對3D計算機圖形學的貢獻。

Hanrahan提出的renderMan很大程度上對GPU產生了影響。例如着色器(Shader)一詞的出現,最先是由Pixar與1988年五月發佈的renderMan接口規範中提出。

renderMan技術製作了一系列成功電影,其中包括《阿凡達》、《玩具總動員》、《泰坦尼克號》等。

renderMan渲染的阿凡達

另外,Hanrahan和他的學生還開發了一種用於 GPU 的語言:Brook,並最終催生了 NVIDIA的CUDA。

事實上,計算機圖形學是一個廣泛的學科,其中包括:

  • 物理模擬:涉及各個物理分支相關數學。
  • 模型處理:微積分,線性代數、微分幾何、優化理論。
  • 渲染:微積分、概率、光學中相關數學。

而我們的GPU,正是用來爲計算機圖形學中實時圖像渲染加速的。

GPU的硬件設計上引入了圖形管線,使得各任務可以通過流水線進行並行處理。

同時通過可編程的着色器,使得GPU硬件能夠根據圖形學算法更好的被使用。

通過下一節我們可以詳細的瞭解到什麼是GPU圖形管線和可編程着色器。

2.1 GPU圖形管線

GPU圖形管線共分爲三個部分,分別是應用程序階段、幾何階段、光柵化階段。

我們在最終在屏幕上看到的畫面,就是3D模型經過這三個階段渲染後得到的。

GPU圖形管線

  • 應用程序階段

圖形渲染管線概念上的第一個階段,開發者通過程序的方式對圖元數據等信息進行配置和調控,最後傳輸到下個階段。

  • 幾何階段

幾何階段分爲模型視點變換、頂點着色、裁剪、屏幕映射等步驟。

模型視點變換 :由每個模型自己的局部座標系轉換到世界座標系,然後到視覺空間,通過將每個模型的各頂點座標與相應的變換矩陣相乘來實現。

下圖是一個模型視點變換的實例,每個建模好的立方體的座標是以原點爲中心的局部座標系,可以通過矩陣變換將各模型放到同一個世界座標系中。

模型視點變換

頂點着色:着色是指確定材質的顏色,材質的顏色實際上和光照有關。目前常用的光照模型是馮氏光照模型,包括環境、漫反射和鏡面光照。

裁剪 :對於在屏幕空間外的物體,我們並沒有必要去計算它的顏色等信息

屏幕映射:是將之前步驟得到的座標映射到對應的屏幕座標系上。

  • 光柵化階段

給定經過變換和投影之後的頂點,顏色以及紋理座標(均來自於幾何階段),給每個像素正確配色,以便正確繪製整幅圖像,這個過程叫光柵化。

光柵化包括三角形設定、三角形遍歷、像素着色、融合階段(如下圖所示)。

光柵化階段

三角形設定階段:計算三角形表面的差異和三角形表面的其他相關數據。

三角形遍歷階段:到那些採樣點或像素在三角形中的過程通常叫三角形遍歷。

像素着色階段:主要目的是計算所有需要逐像素計算操作的過程。

融合階段:合成當前儲存於緩衝器中的由之前的像素着色階段產生的片段顏色。

2.2 可編程着色器

可編程着色器(shader),簡單來說就是可以運行在GPU上的程序,這種程序會使用特定的着色語言(類似於C語言)。

2.2.1 着色器語言

不同圖形編程接口對應不同的着色語言,Windows平臺上的圖形編程接口DirectX使用的是HLSL,而跨平臺的圖形編程接口OpenGL則是使用的GLSL,HLSL與GLSL的語法與C語言十分相似。而新一代圖形編程接口Vulkan則是直接定義了一套二進制中間語言SPIR-V。

HLSL與GLSL都可以編譯成獨立於機器的中間語言(SPIR-V本身就是中間語言),然後在驅動中通過編譯器轉換成實際的機器語言。這樣可以實現對不同硬件的兼容,因爲不同廠商可以在驅動中調用自己的編譯器生成自家GPU識別的指令。

有了着色語言以後,我們的工程師就可以通過高級語言來控制GPU對圖形進行實時渲染。

但實際上我們的GPU一開始支持的Shader並沒有那麼多。這與GPU硬件的可編程渲染架構發展有關。

GPU可編程渲染架構經歷了分離渲染架構到統一渲染架構的進化過程。

如下圖所示,左邊是分離渲染架構,右邊是統一渲染架構。

分離架構 vs 統一渲染架構

分離渲染架構:頂點着色器與像素着色器在兩個不同的着色器核(紅色部分)上運行。

統一渲染架構:所有的着色器程序都可以在同一個着色器核上運行。

與分離渲染架構相比,統一渲染架構更加靈活且利用率更高。

下面以DirectX(openGL也有對應的版本)發佈爲線索,分別介紹分離渲染架構與統一渲染架構的發展歷史。

2.2.2 分離渲染架構

  • 1999年微軟DirectX7提供了硬件頂點變換的編程接口,NV的Geforc256對此進行了支持,從此NV公司從衆多顯卡製造商中殺出重圍,逐漸佔據了龍頭老大的地位。

  • 2001年DirectX8發佈,包含Shader Model 1.0標準。遵循這一模型的GPU可以具備頂點和像素的可編程性。同年,NVIDIA發佈了Geforce3,ATI發佈了Radeon8500,這兩種GPU支持頂點編程。但是這一時期的GPU都不支持像素編程,只是提供了簡單的配置功能。

  • 2002年,DirectX9.0公佈,包含Shader Model 2.0。此模型是真正的可編程頂點着色器及像素着色器。頂點着色器主要執行頂點的變換、完成光照與材質的運用及計算等相關操作。

  • 2003年,NVIDIA和ATI發佈的新產品都同時具備了可編程頂點處理和可編程像素處理器。從此,GPU具備了可編程屬性,也叫做可編程圖形處理單元。

2.2.3 統一渲染架構

  • 2006年包含DirectX10的 Shader Model4.0發佈,採用統一渲染架構,使用統一的流處理器。這一時期,比較有代表性的GPU有NVIDIA的Geforce9600和ATI的Radeon 3850。

  • 2010年,包含DirectX11的Shader Model 5.0 發佈,增加了曲面細分着色器、外殼着色器、鑲嵌單元着色器、域着色器、計算着色器。
    這一時期比較有代表性的GPU是GeForece405

  • 2014年,DirectX 12發佈,主要特性有輕量化驅動層、硬件級多線程渲染支持、更完善的硬件資源管理,比較有代表性的GPU有GeForceGT 710

  • 2018,DirectX 12.1發佈,代表性GPU是TITAN RTX,擁有1770MHz主頻,24G顯存,384位帶寬,支持8K分辨率。

以上僅列舉了部分Shader Model的特性,如要查看完整特性,有興趣的同學可以參考這個鏈接Shader Model

2.3 小結

上一節介紹了GPU渲染架構發展歷史、GPU圖形管線、以及能夠在GPU上運行的高級着色語言。

可以看到,GPU對圖形渲染的過程需要並行處理海量數據,涉及大量矩陣運算,這一特性使得GPU能夠在人工智能應用中發揮巨大的作用。

下一節我們將看到GPU的這些特性是如何爲深度學習加速的。

3. GPU與人工智能

2018年,國際計算機學會將圖靈獎頒發給了深度學習領域的三位大師Hinton,LeCun 和 Bengio。

深度學習剛被提出的時候曾經遭到學術屆的質疑,而如今卻成爲了人工智能領域的熱點。

人工智能的三大要素:算法、算力、大數據。

深度學習被質疑的一部分原因正是因爲當時的計算能力無法滿足深度學習的要求,而如今異構計算則成爲了深度學習的重要支柱。

使用不同的類型指令集、不同的體系架構的計算單元,組成一個混合的系統,執行計算的特殊方式,就叫做異構計算。

3.1 異構計算

目前關於深度學習流行的異構解決方案共三種,分別是ASIC、FPGA、GPU。

但是從開發人員數量和受歡迎程度以及生態系統來說,GPU無疑是最有優勢的。

通過下面三種方案的對比,我們可以看到這三種方案各自的優缺點。

  • CPU+ASIC

ASIC即專用集成電路,是指應特定用戶要求和特定電子系統的需要而設計、製造的集成電路。

優點::體積小、功耗低、計算性能高、計算效率高、芯片出貨量越大成本越低。

缺點:算法固定,一旦算法變化就無法使用。目前人工智能算法遠沒有到算法平穩期,ASIC專用芯片如何做到適應各種算法是個最大的問題。

實例:寒武紀的NPU、地平線的BPU、Google的TPU都是屬於ASIC。如圖是Google的TPU,兼具了CPU與ASIC的特點。

Google TPU

  • CPU+FPGA

FPGA是一種硬件可重構的體系結構。它的英文全稱是Field Programmable Gate Array,中文名是現場可編程門陣列。

CPU+FPGA

優點:靈活性高、無需取指令、譯碼,執行效率高。FPGA中的寄存器和片上內存由各自的邏輯進行控制無需仲裁和緩存。多個邏輯單元之間的通信已經確定,無需通過共享內存進行通信。

缺點:總體性價比和效率不佔優勢。FPGA的大規模開發難度偏高,從業人員相對較少,生態環境不如GPU。

實例:微軟使用FPGA爲Bing搜索智能化進行加速。

  • CPU+GPU

CPU+GPU

GPU具有更好的生態環境,例如具備CUDA支持的GPU爲用戶學習Caffe、Theano等研究工具提供了很好的入門平臺。爲初學者提供了相對更低的應用門檻。

除此之外,CUDA在算法和程序設計上相比其他應用更加容易,通過NVIDIA多年的推廣也積累了廣泛的用戶羣,開發難度更小。

最後則是部署環節,GPU通過PCI-e接口可以直接部署在服務器中,方便快速。得益於硬件支持與軟件編程、設計方面的優勢,GPU才成爲了目前應用最廣泛的平臺。

3.2 GPU與深度學習

與大多機器學習算法一樣,深度學習依賴於數學和統計學計算。人工神經網絡(ANN),卷積神經網絡(CNN)和循環神經網絡(RNN)是一些現代深度學習的實現。

這些算法都有以下基本運算:

  • 矩陣相乘:所有的深度學習模型中都包括這一運算,計算十分密集。
  • 卷積:也是深度學習中常用的運算,佔用了模型中大部分的浮點運算。

上節中提到,GPU在進行圖像渲染時間需要處理每秒大量的矩陣乘法運算,

下圖是一個簡單直觀的例子:將一幅圖像倒置,在我們肉眼看來是一幅連續的圖形,在GPU看來實際上是由多個離散的像素組成,將圖像倒置實際上對每個像素做矩陣乘法。

當然這只是一個簡單的例子,實際上的3D渲染處理的數據比這更多也更加複雜。

GPU並行處理

深度學習同樣需要並行處理,因爲神經網絡是一種典型的並行結構,每個節點的計算簡單且獨立,但是數據龐大,通常深度學習的模型需要幾百億甚至幾萬億的矩陣運算。

神經網絡結構

可以看到,圖形渲染與深度學習有着相似之處。這兩種場景都需要處理每秒大量的矩陣乘法運算。

而GPU擁有數千個內核的處理器,能夠並行執行數百萬個數學運算。

因此GPU完美地與深度學習技術相契合。使用GPU做輔助計算,能夠更快地提高AI的性能。

總的來說,GPU做深度學習有三大優勢:

  • 每一個GPU擁有大量的處理器核心,允許大量的並行處理。

  • 深度學習需要處理大量的數據,需要大量的內存帶寬(最高可達到750GB/S,而傳統的CPU僅能提供50GB/S),因此GPU更適合深度學習。

  • 更高的浮點運算能力。浮點運算能力是關係到3D圖形處理的一個重要指標。現在的計算機技術中,由於大量多媒體技術的應用,浮點數的計算大大增加了,比如3D圖形的渲染等工作,因此浮點運算的能力是考察處理器計算能力的重要指標。

3.3 小結

本節介紹了異構計算對深度學習加速的優缺點,主要包括FPGA、ASIC、GPU三種硬件解決方案。

最後通過比較GPU進行圖形渲染與深度學習計算時的相似之處,解釋了GPU爲何能夠加速深度學習,以及GPU加速深度學習的優勢。

4. 總結

計算機圖形學與人工智能是兩個博大精深的領域,本文僅從GPU實時渲染與GPU並行加速的角度進行了闡述。

寫這篇文章的初衷是因爲聯想到GPU與近三年來的圖靈獎領域息息相關。

2019年圖靈獎授予了計算機圖形學領域、2018年授予了深度學習領域,2017年授予了計算機體系結構領域。

GPU實時渲染、GPU並行加速、GPU架構分別與這三個領域有着千絲萬縷的聯繫,因此想到了寫這樣一篇GPU探祕的文章。

5. 推薦閱讀

  • A New Golden Age for Computer Architecture

2017年圖靈獎得主的一篇關於計算機體系結構發展的介紹,簡單易懂,無論做軟件還是硬件都非常值得一讀。

  • Computer Architecturre:A Quantitative Approach

與上一篇文章是同一作者,本書已經出版到第六版,裏面包括了指令級並行、數據級並行、線程級並行等知識,瞭解這些能讓你寫的程序更加高效。

  • Real-Time Rendering

一本關於3D圖形實時渲染不可多得的書籍,網友戲稱這本書爲絕世武功的總綱。

公衆號(程序芯世界)回覆:GPU 即可獲取上述資料。

關於作者

目前在一家半導體公司從事GPU編譯器研發,未來打算寫一些關於計算機基礎和計算機熱點文章,歡迎大家關注我的公衆號(程序芯世界)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章