GPGPU,簡稱通用計算技術,是一種讓顯卡來參與本來CPU計算任務的技術,它從提出到現在不過十餘年時間,但是發展堪稱神速,本期超能課堂就帶大家來了解一下這項技術,並尋找在我們身邊GPGPU的應用。

什麼是GPGPU


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

舉個最經典的例子,在十多年前,高清視頻剛流行起來的時候,當時編碼高清視頻對於當時的電腦來說,還是一件很困難的事情。視頻編碼過程中,大部分運算都是浮點類型的,而GPU對於這種類型的計算相當拿手,計算起來量又大又快,所以人們就想到,能不能利用GPU來編碼高清視頻。正巧當時業界的研究重點轉向了GPGPU,英偉達第一個推出了一套比較完整的解決方案,將原本使用CPU的運算搬到了GPU之上,使得視頻編碼速度比原先快了幾倍之多。如果有DIY資歷比較老的讀者可能還依稀記得,當時許多文章都介紹如何使用顯卡加速解碼藍光視頻,對於視頻的編解碼加速,便是最早離我們距離最近的GPGPU應用。

爲什麼要GPGPU呢?

CPU因爲有着通用性的需求,所以往往它上面單個核心會設計的非常大而全面,並且由於CPU計算的特性,核心中很大一部分面積用來構建緩存(一個核心中往往有L1和L2兩級緩存)和控制單元(解碼器與分支預測等前端單元),而實際用來運算的單元面積可能僅僅只佔整個核心的一半甚至不到(如圖)。種種原因使得CPU沒有辦法做非常大的規模,一個核心中能塞入的東西有限,而總體的核心數需要控制在一個合理範圍中,多了就可能會發生各種各樣的問題。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

八核Coffee Lake的核心圖,可以看到四個核心的面積已經接近右邊的集成GPU

而GPU的設計理念就不一樣了,本身圖形計算就是一項簡單而暴力的“粗活”,複雜度遠不如CPU要負責的各種各樣不同類型的活,想要提高圖形計算速度的一個很簡單的辦法就是擴大處理器中含有的單元數量。所以GPU對於特定的計算任務,因爲有着更大的計算單元,所以很容易就可以達到比CPU更高的計算速度,表現出來就是現在的GPU在浮點運算吞吐量上遠超CPU。

在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

CPU與GPU在構造上的不同


各種GPGPU的實現

因爲GPU更加適合用來進行大批量特定計算的特性,幾大圖形軟硬件廠商都紛紛推出了自己的GPGPU計算解決方案,主要有以下幾種:

ATI Stream

首先提出GPGPU實現的廠商是被收購前的ATI,並專門提供了一套開發工具包(SDK)給程序員以調用GPU來參與計算的能力。不過由於各種限制和AMD收購ATI後產生的混亂,這套SDK在與Nvidia CUDA的競爭中處於下風,後來因爲AMD官方轉向支持OpenCL,這套SDK最終停止了開發。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

ATI Stream Logo



Nvidia CUDA

CUDA是Nvidia在G80時代推出的一項技術,全稱Compute Unified Device Architechture,統一計算架構。從G80那代核心開始,Nvidia率先採用了一種統一設計的架構,將原本的管線分工式設計轉變爲統一化的處理器設計。CUDA就伴隨着G80核心的發佈一起公之於衆,這套平臺可以讓程序員用C和C++來編寫用GPU運行的程序,學習成本比ATI Stream要低一些。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

Nvidia CUDA Logo

CUDA也是目前應用最爲廣泛的一種GPGPU實現,在Nvidia的強力推廣之下,CUDA在許多領域大放異彩。

OpenCL

上面兩個GPGPU的實現都是有平臺針對性的,要想用他們的解決方案你就得用他們家的硬件,而OpenCL就不一樣了。

OpenCL最早是一組由蘋果公司開發出來的用於異構計算的框架,蘋果公司將這套框架的草案提交到Khronos組織,作爲一種開放標準供業界使用。在2008年末,1.0版本正式公開,目前Intel、AMD與Nvidia的GPU都支持這套框架。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

OpenCL Logo

不過OpenCL並不僅限於在x86平臺上面提供異構計算的框架,由於跨平臺和開放標註的特性,它還可以使用專門的可編程電路來加速計算。所以業界對於它的支持非常廣泛,下圖就是OpenCL聯盟成員。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

OpenCL聯盟

DirectCompute

DirectCompute是微軟從DirectX 10開始加入的用於通用計算目的的API集,可以調用GPU進行加速計算。從Vista開始,Windows的各種桌面特效就開始採用DirectCompute來加速計算。在DirectX 11中,微軟完善了這套API,並且在Windows系統上更多地使用GPU來加速計算系統界面的各種特效。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

GPU-Z顯示該GPU支持的通用計算特性


具體應用

媒體編碼加速

在十年多以前,H.264等面向高清應用的視頻編碼格式剛流行起來的時候,因爲CPU的性能限制,編碼一段H.264的視頻是一件相當耗費時間的事情,所以人們想到了用GPU來加速視頻的編碼。Nvidia剛推出CUDA的時候,就將加速視頻編碼作爲該技術的一大賣點來宣傳,並免費提供了一個支持CUDA技術來轉碼的軟件BadaBoom。不過後來,Nvidia在顯卡上加入了專門用於視頻編解碼的硬件電路,並開放了名爲NVENC的編碼API供軟件調用,通用計算也就此離開了這個可以說是最早利用它,也是離我們最近的領域。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

BadaBoom加速視頻轉碼

Adobe也很早就在旗下的CS和CC系列軟件中加入了GPGPU的支持,比如Premiere Pro和After Effect都支持OpenCL來加速視頻的實時預覽和特效。

視頻補幀與畫面優化

在英偉達、英特爾和AMD三家相繼在自己的GPU中加入專用計算電路用以加速編解碼視頻之後,通用計算就離開了這個領域。但是有些不滿足於既有的視頻品質的人們又開發出了新的可以利用GPGPU的功能:視頻補幀。

視頻補幀指的是在原本低幀數的視頻,通過上下幀的計算,渲染出一幀原本不存在的畫面補在兩幀之間,使其觀感更加流暢。比如將24幀的視頻補幀至60幀,因爲這個過程的計算量過於龐大,使用CPU跟不上視頻播放的速度,沒法做到實時補幀,所以開發者就將這個功能搬到了GPU上來運行,比如很多人都在用的SVP4,就是一個利用GPGPU的補幀軟件。

在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

SVP4補幀軟件界面

在視頻畫面優化領域,目前地球上最強的視頻渲染器MadVR也是利用GPGPU來優化視頻畫面表現,比如視頻播放中出現的色帶、色環,還有在壓制過程中出現的瑕疵等,都可以使用GPGPU在視頻的播放過程中進行實時的彌補。

人工智能與深度學習

人工智能與深度學習是近年來非常熱門的兩個有關聯的領域,訓練人工智能需要非常大的數據計算量,這時候就可以利用上GPU的特長,比如熱門的深度學習框架TensorFlow就可以使用CUDA來加速學習。

Nvidia在這兩年也不斷展示了他們在機器學習方面的一些結果,比如在RTX系列上引入的DLSS(深度學習抗鋸齒)技術就是利用機器學習來達成的。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

DLSS技術

科研領域的應用


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

科研領域的應用

上圖是CUDA在科研領域的一些應用,可以看到GPU確實在很多方面開始默默影響着我們的生活。

超級計算機

老黃從G80開始就一直同步推出同架構的純計算卡,歸於Tesla品牌之下。於是就誕生了很多用Tesla計算卡來組建的超級計算機,比如競爭貝爾·戈登獎的六個入圍者中,有五個使用了由NVIDIA GPU提供支持的超級計算機。最近英偉達還聯手ARM,在超級計算機領域中繼續發力,預計未來採用GPGPU技術的超級計算機將會越來越多。


在人工智能、超級計算機等領域開花結果,通用計算技術是什麼?

Tesla V100加速模塊


總結

GPGPU這個相對於PC整個歷史還算是比較新的概念,經過十餘年的發展已經不僅侷限於PC,還走向了其他領域,紮根於我們生活的每個角落。GPGPU已經在許多雲計算平臺上得到了應用,相信在以後,GPU會更加深入我們電子生活的方方面面,在那裏默默地發熱。

相關文章