霍光
近些年的計(jì)算領(lǐng)域,異構(gòu)計(jì)算可算是最為引人注目的話題之一。過去幾年里,以NVIDIA的CUDA為代表的基于C語言的API為GPU計(jì)算贏得了更廣泛的用戶。2009年,全球召開了兩次異構(gòu)計(jì)算大會(huì)。最近來自NVIDIA的消息中提到,目前CUDAZone網(wǎng)站上的CUDA應(yīng)用程序與論文數(shù)量已經(jīng)突破了500大關(guān)。
然而,異構(gòu)計(jì)算還面臨很多認(rèn)識(shí)上的誤區(qū)。例如,在一些報(bào)道里,提出了“未來GPU可能會(huì)取代CPU”、“GPU的內(nèi)核數(shù)量是CPU的幾百倍,計(jì)算速度與之成正比”等論調(diào)。
事實(shí)上,CPU與GPU從設(shè)計(jì)思路和架構(gòu)上先天就存在著差異。這些差異決定了GPU不可能取代CPU,或者說,能取代CPU的GPU已經(jīng)不再是GPU了。
異構(gòu)計(jì)算的真正意義,其實(shí)在于發(fā)揮不同架構(gòu)處理器在不同方面的優(yōu)勢(shì),從而實(shí)現(xiàn)系統(tǒng)整體計(jì)算能力的最大化利用。
CPU和GPU從設(shè)計(jì)之初,其目標(biāo)就各不相同,這可以用一個(gè)比喻來說明:電工??频漠厴I(yè)生與英語專業(yè)的畢業(yè)生,前者修理電器的速度遠(yuǎn)遠(yuǎn)快于后者,這并不能說明前者的整體能力遠(yuǎn)高于后者——其實(shí),對(duì)較復(fù)雜的進(jìn)口電器,可能需要后者將說明書翻譯成中文,前者再按照說明書將電器修好。
CPU在設(shè)計(jì)之初就是按照兼顧程序執(zhí)行的并行性、通用性和平衡性的要求來規(guī)劃的。在改進(jìn)指令執(zhí)行效率的過程中,CPU中被不停地加入新的指令集,這使得CPU已經(jīng)成為計(jì)算機(jī)中設(shè)計(jì)最復(fù)雜的芯片。例如,除了支持常規(guī)指令集之外,英特爾的SSE、AMD的3DNow!等指令集都是在技術(shù)演進(jìn)構(gòu)成中逐漸加入CPU的,而僅SSE4指令集就包括54條新指令。
與之相反,GPU的單一處理核心卻較誕生之初顯得簡(jiǎn)單——最早,針對(duì)圖形處理的關(guān)鍵計(jì)算,GPU將處理單元分為頂點(diǎn)著色器、光柵化引擎、紋理貼圖單元等不同部分,分別完成不同計(jì)算任務(wù)。而統(tǒng)一渲染架構(gòu)提出后,統(tǒng)一的計(jì)算單元取代了之前的不同單元。以NVIDIA GeForce 8800為例,它具有16組共128個(gè)統(tǒng)一標(biāo)量著色器,也被稱作流處理器。這里的每個(gè)流處理器實(shí)際上只能完成1D標(biāo)量的加乘操作。在實(shí)際計(jì)算中,必須將所有的運(yùn)算拆分成1D運(yùn)算來執(zhí)行。
從兩者的差異可以看出,對(duì)于復(fù)雜指令調(diào)度、循環(huán)、分支、邏輯判斷以及執(zhí)行等的程序任務(wù),GPU有心無力。只有在可拆分成簡(jiǎn)單指令的重復(fù)的高度并行數(shù)值計(jì)算中,GPU才能體現(xiàn)出其強(qiáng)大的能力。對(duì)此,美國(guó)Stone Ridge科技公司創(chuàng)始人兼總裁文森特(Vincent Natoli)曾做出“如果算法涉及許多分支指令,很難用流計(jì)算或SIMD處理,那么CPU將是最佳選擇;如果算法是浮點(diǎn)SIMD類型的問題,可劃分為許多對(duì)不同數(shù)據(jù)執(zhí)行相同操作的獨(dú)立線程,那么GPU將是很好的選擇;如果問題主要涉及整數(shù)或定點(diǎn),可以被轉(zhuǎn)化為流的形式,具有非傳統(tǒng)的數(shù)據(jù)表達(dá)形式和空間并行性,FPGA則是最佳選擇”的論斷。
另一方面,針對(duì)GPU的程序編寫也較為困難。文森特指出,根據(jù)經(jīng)驗(yàn),即使使用CUDA這一很容易掌握的API,同一算法在CPU、GPU上開發(fā)的時(shí)間也大致為1∶1.25。
由以上分析可以看出,GPU與CPU并不存在取代的關(guān)系。相反,兩者互相取長(zhǎng)補(bǔ)短才能實(shí)現(xiàn)最終的良好系統(tǒng)表現(xiàn)。
為了更好地發(fā)揮不同架構(gòu)處理器的能力,開發(fā)人員也在不遺余力地尋找更快捷地實(shí)現(xiàn)異構(gòu)計(jì)算的方法。OpenCL就是建立異構(gòu)計(jì)算標(biāo)準(zhǔn)的嘗試之一。人們?cè)O(shè)計(jì)它的目的是“用平易近人的語言,使用不同的計(jì)算支援”。
如果OpenCL這個(gè)標(biāo)準(zhǔn)制定完成了,它將給異構(gòu)計(jì)算帶來多大的影響呢?讓我們拭目以待。