異構計算的優勢,不單是來自於因為計算單元增加之後,所帶來的平行性,更重要的是,因為引入了異質性的兩種或更多種的計算單元,來構成一個計算系統,而不同類型的計算單元所擅長的計算型態、所適合解決的計算問題,都不盡相同。

在許多應用裡,我們所要解決的計算問題,其中都是混雜著多種型態的計算問題,相較於同構的計算系統,異構的系統能夠運用不同的計算單元,分別應對不同型態的計算問題,使得各種問題,都能被派送到最適合的計算單元來處理。

因為問題本身就混雜著多種特質,而這使同樣也混雜著多種計算單元的異構計算系統,得以發揮其優勢。

將CPU和GPU搭配而成的計算系統
目前有一種開始被愈來愈多開發者採用的異構計算系統,便是嘗試著運用電腦上的CPU加上圖形處理用的GPU,構成異構計算系統,來解決一些特定的計算問題。

原本GPU的存在,只是在繪圖卡上的獨立晶片,用來提供一些無論是2D或3D圖形處理時所會需要用到的計算。由於圖形處理的計算有其特性,所以圖形處理單元,也就是GPU,便是專門設計用來迎合此類的計算需求的。

正因為GPU是為了特定的計算應用需求而設計的,所以它的特性也和CPU大不相同。

基本上,通用性質的電腦其CPU設計取向,就是通用性質的,它必須對於各種可能的計算需求,有著廣泛而平均表現,它必須兼顧平行性、通用性,以及滿足各類計算需求間的平衡性。

因為,電腦的使用者可能會使用它,來處理各種可能的事務。

異構計算已經出現在一般人生活中
在現今許多和圖形處理有關的應用系統,例如電腦遊戲,其實,都可以說是運用了異構計算的方式,主要是應用在圖形的即時渲染(Realtime Rendering)之上。

在圖形即時渲染的應用裡,CPU會依據使用者的輸入以及一定的計算規則,決定接下來要呈現的圖形物件性質,包括有什麼物件,以及它們要顯示的位置。在決定之後,再將這些計算的結果交由GPU接手,由GPU負責計算這些物件的繪製及顯示。此外,因為CPU和GPU可平行運作,當GPU正在計算當前這個畫面的內容時,CPU已經可以開始著手下一個畫面內容的計算了。

在這樣的應用裡,CPU和GPU分別負責各自擅長的計算類型。CPU負責邏輯成份高的工作,而GPU則負責大量、同時計算密度高的工作。

正如前文中已經提過的,這種異構計算系統之所以能提升效能的原因,不單只是因為CPU和GPU可以獨立平行計算,而是因為這樣的應用可以拆解成兩類特性的計算工作,一類適合CPU,而另一類適合GPU。

所以,不單從平行性,更重要的是,從異構性中得到效能的提升。

CPU vs. GPU

正因為CPU和GPU被設計要解決的計算類型不同,所以它們天生的設計理想和結果,就有很大的差異。

CPU有能力做複雜的邏輯判斷、迴圈,以及流程的分支控制。

但是,如此一來,因為其複雜的本質,CPU就無法有很高的平行性。相反的,GPU反而擅長做大量、簡單的計算工作,在分支、邏輯判斷的能力卻相對弱多了。

魚與熊掌不可得兼,事物的優點往往就是帶來缺點的原因,而這也正是異構性質所來帶來的好處——避計算單元的缺點而取其優點,達到截長補短的效果。

一般認為,若是涉及許多分支控制的指令,無法使用單一指令多資料流(SIMD)的方式來處理的計算,CPU會是比較好的選項。

而若是計算本身是涉及大量浮點數的SIMD類型計算工作,便較適合交由GPU來處理,因為可以將計算工作畫分,成為對多項資料同時進行相同計算,由多個獨立執行緒負責計算。

從硬體的特性來看,CPU的每個核心(core),每次只能執行一個執行緒。多執行緒的多工機制,乃是在作業系統層次上提供。當作業系統因為各種原因,例如執行緒I/O的等待,引發context switch的動作時,就必須將當前執行的執行緒其各種狀態(像是暫存器等)保留起來,再載入下一個排程要執行之執行緒的狀態,並恢復其執行。這麼一來,就會衍生出不小的額外負擔。

但是,GPU對於執行緒的管理,則是在硬體層次上進行,甚至不會帶來額外的負擔。這使得執行緒的切換,反而成了一個好事情,因為當某個執行緒因為某種原因必須停滯執行時,GPU便可以立即切換到另一個處於就緒狀態的執行緒,這反而提高了執行上的利用率。

目前主流的CPU通常有2到8個核心,但是因為要提供複雜的機制,所以,核心數量就難以增加。而目前像Nvidia的GTX 690,總共有16個處理器,而每個處理器就有192個CUDA核心,總共可同時容納最多32,768個執行緒。這說明了CPU和GPU在硬體上的先天差異。

一般來說,CPU有著較低的記憶體頻寬、高耗能、中度平行化,有較深的指令管線,但有好的隨機存取能力、能支援通用型的程式設計需求。而GPU則有較高的記憶體頻寬、低耗能、有較淺的指令管線、循序存取、適用於平行化資料操作的程式應用。

對於大量SIMD的計算工作,即使GPU的時脈弱於CPU,但是因為能夠大幅提升計算的平行性,使得在大量浮點數的運算上,GPU能夠佔盡優勢。

GPGPU的應用開始出現
因此,近年來有了一個新的名詞——GPGPU(General-Purpose computing on Graphics Processing Units),意思是說,雖然傳統上GPU是被設計用來處理和圖形有關的計算,但是,由於現代GPU也可以被用來處理通用類型的資料計算,尤其是SIMD的應用。

所以,GPU變成了不單只是為了處理圖形處理的計算,而被推廣到更具通用性的資料計算。像是氣象的模擬、分子模型、物理或化學研究上的計算,都有適合GPU計算特性的部份。

於是,GPU不單只能用在圖形處理,它的應用變得更通用了,所以才有了GPGPU這樣的稱呼。

有了GPGPU之後,原先我們單純只交由CPU執行計算的模式,就開始有了很大的轉變,尤其是對於一些純大量數值的演算,將它們由CPU上移至GPGPU,來執行計算後,便可以發揮GPGPU的特長,增加計算的效能。

尤其像一些要對整個大型矩陣中的元素套用相同算術操作的動作,若在CPU上執行,必須利用迴圈,逐一針對矩陣中的每個元素做計算。但利用GPGPU來計算,則可平行、同時對矩陣中的多個元素做計算,速度可以大幅提升。

此外,原先適合CPU執行的計算,仍然保留在CPU上進行。如此由CPU和GPGPU組成的異構計算系統,便能充份地分別發揮CPU和GPU的長處,使系統得到更高的效能表現。

 

專欄作者

熱門新聞

Advertisement