為計(jì)算密集型應(yīng)用選擇最佳多核架構(gòu)
從微小而且集成度非常高的片上系統(tǒng),到大型數(shù)據(jù)中心,多核革命已經(jīng)呈現(xiàn)出烽火燎原之勢(shì)。那么,當(dāng)你在設(shè)計(jì)自己的系統(tǒng)時(shí),怎樣才能把多核技術(shù)發(fā)揮到極致呢?另外需要注意的是,要在一個(gè)多核系統(tǒng)中把每一份計(jì)算能力都充分利用起來,并不是一件容易的事。
當(dāng)今的多核處理器絕不僅僅是把多個(gè)處理器放進(jìn)同一個(gè)芯片那么簡單。領(lǐng)先的處理器提供商在其產(chǎn)品中植入了很多有用的特殊功能。例如,散列(hashing)、高速緩存(caching)、處理器間通信、中斷管理和內(nèi)存管理等。這些功能特性如果能夠善加利用,就會(huì)讓AMP架構(gòu)高效率地運(yùn)行起來,這就需要在軟件上進(jìn)行專門的優(yōu)化。
我們知道,多核處理架構(gòu)基本上可以分為對(duì)稱多處理(SMP)和非對(duì)稱多處理(AMP)兩種。SMP架構(gòu)的特征是同等地看待每一個(gè)處理器內(nèi)核,不會(huì)特別指定哪個(gè)內(nèi)核或者哪些內(nèi)核去執(zhí)行哪個(gè)特定的任務(wù),完全由操作系統(tǒng)來平均地分配和協(xié)調(diào)內(nèi)核之間的工作。AMP架構(gòu)的特征是與SMP相反,不是同等地看待每一個(gè)處理器內(nèi)核,而是把特定的任務(wù)分配給特定的內(nèi)核來運(yùn)行。這樣做的好處是減少了重復(fù)性工作的相關(guān)數(shù)據(jù)切換,從而獲得較高的運(yùn)行效率。
例如,你可以拿到某一款典型的多核處理器--例如Freescale T4240,它具備12個(gè)多線程的內(nèi)核,每個(gè)內(nèi)核可供2個(gè)線程來調(diào)度共享。12個(gè)內(nèi)核被分為3組,每4個(gè)內(nèi)核為一組,共享2MB的Cache。相信你已經(jīng)感覺到,這個(gè)系統(tǒng)還是挺復(fù)雜的。那么,你要讓所有的內(nèi)核都來運(yùn)行單一一個(gè)OS Domain,并由它來調(diào)度所有的線程,還是把全部的計(jì)算能力劃分成多個(gè)獨(dú)立的OS Domain,各自承擔(dān)不同的任務(wù)?哪一種方案會(huì)比較好呢?實(shí)際上,這必須根據(jù)應(yīng)用類型來進(jìn)行取舍。這個(gè)應(yīng)用在并行處理時(shí)是否足夠安全?它屬于數(shù)據(jù)密集型應(yīng)用嗎?能否發(fā)揮共享Level 2 Cache所具備的優(yōu)勢(shì),很可能是你做出判斷時(shí)應(yīng)該重點(diǎn)考慮的一個(gè)因素。
采用內(nèi)置GPU的一組標(biāo)準(zhǔn)CPU,例如Intel Core i7,也是常用的硬件方案。這類系統(tǒng)可在4個(gè)內(nèi)核中實(shí)現(xiàn)8個(gè)超線程,并且利用GPU來實(shí)現(xiàn)復(fù)雜的通用計(jì)算。對(duì)于典型的計(jì)算密集型應(yīng)用來說,盡管開發(fā)這種CPU-GPU混合異構(gòu)架構(gòu)會(huì)增加系統(tǒng)的復(fù)雜度,但由此帶來的性能提升仍然具有很大的吸引力,這讓我們不厭其煩地進(jìn)行嘗試。
一旦理解了對(duì)應(yīng)用如何進(jìn)行分解,我們就有了選擇何種方法和語言來開發(fā)這個(gè)應(yīng)用的依據(jù)。如果采用多操作系統(tǒng)架構(gòu),不論是SMP還是AMP,通常都必須利用共享內(nèi)存在不同OS Domain之間傳遞數(shù)據(jù)。雖然這不是僅有的方式,但卻是常用方式--把帶有一些數(shù)據(jù)的命令傳遞給某個(gè)OS Domain,然后由一個(gè)中斷程序來做出相應(yīng)的處理。但是,有什么API可以使用呢?
這里有好幾種選擇。多核聯(lián)盟(Multicore Association)推出了MCAPI (Multicore Communication API)標(biāo)準(zhǔn),如圖1所示。這是專為multi-OS環(huán)境而設(shè)計(jì)的,可以建構(gòu)在相關(guān)的技術(shù)規(guī)范和MRAPI (Multicore Resource API)之上。MRAPI作為一種資源,為多OS Domain之間提供了共享內(nèi)存。
圖1:基本的多核軟件配置
對(duì)于這種架構(gòu),其他可供選擇的架構(gòu)是類似的自帶專用API。無論你做出何種選擇,都希望它是便于配置和維護(hù)的,這樣才是最有利于長遠(yuǎn)發(fā)展的最佳方案。其中一個(gè)重要的影響因素是所選接口自身的資源消耗情況。系統(tǒng)中眾多的內(nèi)核通常都是共享內(nèi)存的,其數(shù)據(jù)傳輸速度遠(yuǎn)遠(yuǎn)高于以太網(wǎng)。如果你把應(yīng)用分割為在多個(gè)OS Domain中運(yùn)行的原因之一是防止Cache Thrashing (多個(gè)線程在執(zhí)行中讀寫同一個(gè)cache line,進(jìn)入競爭狀態(tài)),那么降低接口對(duì)資源的消耗占用就顯得尤為必要。[!--empirenews.page--]
對(duì)于SMP架構(gòu)的編程來說,同樣有好多種選擇。在這種情況下,同一個(gè) OS Domain內(nèi)包含了多個(gè)相同架構(gòu)的CPU.選擇之一是采用操作系統(tǒng)內(nèi)部可用的線程模式。在標(biāo)準(zhǔn)線程的OS環(huán)境中,通常有多種語言可供選擇,例如:OpenMP、OpenCL和Cilk/Cilk++等。每種編程環(huán)境都有不同的語法,有些比較簡單,但提供的控制水平有所差異。相對(duì)于典型的C語言語法,有些需要擴(kuò)展性的改變。有些則并不支持所有的架構(gòu),所以你需要仔細(xì)檢查所選的語言、編譯器與操作系統(tǒng)是否可以很好地相互匹配和支持。
如果你有興趣和能力將編程技藝發(fā)揮到極致,以便充分調(diào)動(dòng)系統(tǒng)中的每一個(gè)“門”,可以考慮采用GPGPU (通用GPU編程,General Purpose GPU programming)。那么你需要注意到這些因素:語言、驅(qū)動(dòng)程序和帶寬。GPU是專門設(shè)計(jì)用來在像素級(jí)對(duì)圖形進(jìn)行操作,計(jì)算數(shù)據(jù)矢量,以及復(fù)雜的3D視圖高幀速處理。因此,它們具備針對(duì)小數(shù)據(jù)集快速進(jìn)行復(fù)雜計(jì)算的能力。
驅(qū)動(dòng)程序?qū)τ贕PGPU來說,絕不是無關(guān)緊要的瑣事,必須從操作系統(tǒng)方面獲得很好的支持。許多GPU提供商并不提供源代碼,因?yàn)檫@屬于他們知識(shí)產(chǎn)權(quán)的一部分。同時(shí),他們通常也只是針對(duì)比較流行的操作系統(tǒng)才提供驅(qū)動(dòng)程序??赡苡行┎僮飨到y(tǒng)他們并不支持。
接下來你要考慮GPGPU語言的選擇。OpenCL出自 Khronos標(biāo)準(zhǔn)。CUDA專用于Nvidia GPU。它們都采用了類似的方法來實(shí)現(xiàn)并行編程,而性能基準(zhǔn)測試指標(biāo)則有所不同,在不同硬件環(huán)境中的表現(xiàn)有些差異。由于OpenCL是一個(gè)開放標(biāo)準(zhǔn),所以在大多數(shù)平臺(tái)中都可以使用,它帶有編譯器,而且不需要修改代碼就可以應(yīng)用于CPU與GPU混合的系統(tǒng)。這顯然是值得注意到的優(yōu)勢(shì)。
最后,遠(yuǎn)程GPU需要處理的數(shù)據(jù)量有多大,需要經(jīng)過何種類型的總線,也會(huì)影響你的決定。越是數(shù)據(jù)密集型的應(yīng)用,GPU就應(yīng)該越靠近CPU。如果兩者之間必須經(jīng)過PCIe 總線,那就必須與外設(shè)分享帶寬,這很可能會(huì)使性能受到較大的影響。如果GPU與CPU比較接近,由此造成的影響會(huì)相對(duì)降低。
特別是對(duì)于消費(fèi)電子產(chǎn)品來說,如可穿戴設(shè)備、移動(dòng)手持設(shè)備、數(shù)字成像設(shè)備、家用網(wǎng)關(guān)以及寬帶接入等設(shè)備,面臨的一個(gè)重要挑戰(zhàn)就是以小體積、低功耗的運(yùn)行環(huán)境來處理越來越大量的圖像、聲音甚至人體生理特征數(shù)據(jù)。為了針對(duì)這類運(yùn)行環(huán)境在較短的時(shí)間內(nèi)開發(fā)出優(yōu)異的多核系統(tǒng),開發(fā)平臺(tái)如何選擇就顯得尤為關(guān)鍵。
風(fēng)河公司最近針對(duì)最新版的VxWorks 7實(shí)時(shí)操作系統(tǒng)推出了面向各個(gè)行業(yè)的行業(yè)領(lǐng)域。這些Profile針對(duì)VxWorks 7擴(kuò)充了一系列非常有價(jià)值的功能,幫助客戶滿足不斷演變的市場和技術(shù)要求,從而抓住物聯(lián)網(wǎng)所帶來的新的市場發(fā)展機(jī)遇,其中就包括消費(fèi)電子領(lǐng)域,專門針對(duì)小體積聯(lián)網(wǎng)設(shè)備,如可穿戴設(shè)備、移動(dòng)手持設(shè)備、數(shù)字成像設(shè)備、家用網(wǎng)關(guān)以及寬帶接入設(shè)備等,提供快速啟動(dòng)、小體積、低功耗的運(yùn)行環(huán)境,還特別強(qiáng)調(diào)對(duì)于GPU和2D/3D圖形用戶界面的支持能力,因而可以將多核處理器的優(yōu)勢(shì)最大限度地發(fā)揮出來。
總之,在這里并不存在點(diǎn)石成金的魔法棒。你必須深入研究每一種架構(gòu)選擇,包括硬件、軟件、語言以及編譯器,才能準(zhǔn)確地評(píng)估每一部分對(duì)整體性能的影響,才能針對(duì)特定的算法進(jìn)行最佳的優(yōu)化。一勞永逸,這在高性能計(jì)算系統(tǒng)中是不存在的,至少到目前為止是如此!
圖2:MCAPI 是一個(gè)消息傳遞應(yīng)用的接口,帶有協(xié)議和語義規(guī)范,規(guī)定了其功能特性在任何應(yīng)用實(shí)現(xiàn)中都必須遵循的行為規(guī)范。