0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣成為一名異構(gòu)并行計(jì)算工程師

工程師人生 ? 來(lái)源:工程師吳畏 ? 2019-04-09 16:41 ? 次閱讀

隨著深度學(xué)習(xí)人工智能)的火熱,異構(gòu)并行計(jì)算越來(lái)越受到業(yè)界的重視。從開(kāi)始談深度學(xué)習(xí)必談GPU,到談深度學(xué)習(xí)必談?dòng)?jì)算力。計(jì)算力不但和具體的硬件有關(guān),且和能夠發(fā)揮硬件能力的人所擁有的水平(即異構(gòu)并行計(jì)算能力)高低有關(guān)。

一個(gè)簡(jiǎn)單的比喻是:兩個(gè)芯片計(jì)算力分別是10T和 20T,某人的異構(gòu)并行計(jì)算能力為0.8,他拿到了計(jì)算力為10T的芯片,而異構(gòu)并行計(jì)算能力為0.4的人拿到了計(jì)算力為20T的芯片,而實(shí)際上最終結(jié)果兩人可能相差不大。異構(gòu)并行計(jì)算能力強(qiáng)的人能夠更好地發(fā)揮硬件的能力,而本文的目標(biāo)就是告訴讀者要變成一個(gè)異構(gòu)并行計(jì)算能力強(qiáng)的工程師需要學(xué)習(xí)那些知識(shí)。

異構(gòu)并行計(jì)算是筆者提出的一個(gè)概念,它本質(zhì)上是由異構(gòu)計(jì)算和并行計(jì)算組合而來(lái),一方面表示異構(gòu)并行計(jì)算工程師需要同時(shí)掌握異構(gòu)計(jì)算的知識(shí),同時(shí)也需要掌握并行計(jì)算的知識(shí);另一方面是為更好地發(fā)展和豐富異構(gòu)計(jì)算和并行計(jì)算。通過(guò)異構(gòu)并行計(jì)算進(jìn)一步提升了知識(shí)的系統(tǒng)性和關(guān)聯(lián)性,讓每一個(gè)異構(gòu)并行計(jì)算工程師都能夠獲得想要的工作,拿到值得的薪水。

對(duì)于一個(gè)異構(gòu)并行計(jì)算工程師的日常來(lái)說(shuō),他的工作涉及的方面很廣,有硬件,有軟件,有系統(tǒng),有溝通;是一個(gè)對(duì)硬實(shí)力和軟實(shí)力都有非常高要求的崗位。

異構(gòu)并行計(jì)算的難度是非常高的,而市場(chǎng)對(duì)這個(gè)職位的需求一直在提升,期待讀者能夠和我一起投身于異構(gòu)并行計(jì)算的行列,為異構(gòu)并行計(jì)算在中國(guó)的推廣做出貢獻(xiàn)。

異構(gòu)并行計(jì)算工程師技能樹(shù)

要想成為一個(gè)優(yōu)秀的異構(gòu)并行計(jì)算工程師需要掌握許多知識(shí)和技能,這些技能可以分為兩個(gè)方面:

處理器體系,處理器如何執(zhí)行具體的指令;

系統(tǒng)平臺(tái)方面,這又可以分成多個(gè)細(xì)的主題,包括硬件的特點(diǎn),軟件編程相關(guān)的平臺(tái)和基礎(chǔ)設(shè)施。

讀者可以從圖1具體了解到異構(gòu)并行計(jì)算工程師需要掌握的技能和知識(shí)。

怎樣成為一名異構(gòu)并行計(jì)算工程師

異構(gòu)并行計(jì)算工程師成長(zhǎng)詳解

每個(gè)人甚至每個(gè)技術(shù)領(lǐng)域都是在不停的成長(zhǎng),通常公司的崗位會(huì)區(qū)分為初級(jí)、中級(jí)、高級(jí)、主任等,這是按照貢獻(xiàn)、能力和責(zé)任大小來(lái)分,并不適合用來(lái)表示技術(shù)。為了更好地幫助讀者學(xué)習(xí)知識(shí),本文從技能體系角度來(lái)分析,因此并不能對(duì)應(yīng)到各個(gè)公司招聘的崗位需求上,也意味著讀者不能簡(jiǎn)單的把本文的技能和各個(gè)公司的崗位級(jí)別對(duì)應(yīng)。

為了幫助讀者更好地理解,本文會(huì)使用先硬件后軟件的方式介紹。和異構(gòu)并行工程師相關(guān)性最大的硬件知識(shí)即處理器特性,我們從這一點(diǎn)開(kāi)始。

現(xiàn)代處理器的特性

從系統(tǒng)啟動(dòng)到終止,處理器一條接著一條地執(zhí)行存儲(chǔ)器中的指令,站在使用者的角度來(lái)看就好像是前一條指令執(zhí)行完之后下一條指令才開(kāi)始執(zhí)行,是一個(gè)完完全全的串行過(guò)程。實(shí)際上,現(xiàn)代處理器利用了指令級(jí)并行技術(shù),同一時(shí)刻存在著多條指令同時(shí)被執(zhí)行,并且處理器執(zhí)行指令的順序無(wú)需和匯編代碼給出的指令順序完全一致,編譯器和處理器只需要保證最終結(jié)果一致即可,這類(lèi)處理器稱(chēng)為“亂序執(zhí)行處理器”。而嚴(yán)格按照順序一次執(zhí)行一條指令,只有前一條執(zhí)行完才開(kāi)始執(zhí)行后一條指令的處理器,稱(chēng)為“按序處理器”。而即使是在按序執(zhí)行處理器上,編譯器也可以對(duì)源代碼進(jìn)行類(lèi)似的優(yōu)化,以提高程序性能。對(duì)于一個(gè)特定的流水線來(lái)說(shuō),現(xiàn)代亂序執(zhí)行處理器只保證指令執(zhí)行階段可以亂序,而其他階段通常還是順序的。目前主流的CPU和GPU,甚至DSP,無(wú)論是在服務(wù)器端,還是在移動(dòng)端基本上都已經(jīng)是亂序執(zhí)行處理器了。

今天大多數(shù)處理器都是哈佛架構(gòu)的變體,其根本特征是在程序執(zhí)行時(shí)把指令和數(shù)據(jù)分開(kāi)存儲(chǔ),程序員通??梢院雎灾噶畲鎯?chǔ),實(shí)際上異構(gòu)并行計(jì)算更關(guān)注的是:計(jì)算和數(shù)據(jù)訪問(wèn)。

計(jì)算和訪存

以作者正在使用的處理器E5-2680v3來(lái)說(shuō),其主頻為2.6GHz,支持FMA指令集,其單核單精度浮點(diǎn)計(jì)算能力為2.6*2*8*2=83.2 GFlops;而單通道內(nèi)存的帶寬大約為20GB/s。主流處理器的處理速度遠(yuǎn)快于內(nèi)存讀寫(xiě)速度,為了減小訪問(wèn)數(shù)據(jù)時(shí)的延遲,現(xiàn)代主流處理器主要采用了兩種方式:

利用程序訪問(wèn)數(shù)據(jù)的局部性特點(diǎn):采用了一系列小而快的緩存保存正在訪問(wèn)和將要被訪問(wèn)的數(shù)據(jù),如果數(shù)據(jù)會(huì)被多次訪問(wèn)且數(shù)據(jù)能夠被緩存容納,則能夠以近似于內(nèi)存的價(jià)格獲得近似于緩存的速度;

利用程序的并行性:在一個(gè)控制流由于高延遲的操作而阻塞時(shí),執(zhí)行另一個(gè)控制流,這樣能夠提高處理器核心的利用率,保證處理器核心一直在忙碌的狀態(tài)。

簡(jiǎn)單來(lái)說(shuō),前一種方法是將經(jīng)常訪問(wèn)的數(shù)據(jù)保存在低延遲的緩存中,以減少訪問(wèn)數(shù)據(jù)時(shí)的延遲,通過(guò)更快為處理器提供數(shù)據(jù)而提高性能,主要是目前主流的CPU采用。而后一種方法則盡量保證運(yùn)算單元一直在忙碌工作,通過(guò)提高硬件的利用率以提高程序的吞吐量,這種方法目前主要為主流的GPU所采用。這兩種辦法沒(méi)有天然的壁壘,現(xiàn)代處理器(無(wú)論是CPU還是GPU)都采用了這兩種方法,區(qū)別只是更偏重于使用哪一種方法。

指令級(jí)并行

現(xiàn)代處理器具有許多和代碼性能優(yōu)化相關(guān)的特點(diǎn),本節(jié)主要介紹以下部分:

指令級(jí)并行技術(shù):主要有流水線、多發(fā)射、VLIW、亂序執(zhí)行、分支預(yù)測(cè)、超標(biāo)量等技術(shù);

向量化:主要有SIMT和SIMD技術(shù);

軟件開(kāi)發(fā)人員如果了解現(xiàn)代多核向量處理器的這些特性,就能寫(xiě)出性能效率超過(guò)一般開(kāi)發(fā)人員的代碼。

多核

多核是指一個(gè)CPU模塊里包含多個(gè)核心,每個(gè)核心是一個(gè)獨(dú)立的計(jì)算整體,能夠執(zhí)行線程?,F(xiàn)代處理器都是多核處理器,并且為多核使用場(chǎng)景所優(yōu)化。

多核的每個(gè)核心里面具有獨(dú)立的一級(jí)緩存,共享的或獨(dú)立的二級(jí)緩存,有些機(jī)器還有獨(dú)立或共享的三級(jí)/四級(jí)緩存,所有核心共享內(nèi)存DRAM。通常第一級(jí)緩存是多核處理器的一個(gè)核心獨(dú)享的,而最后一級(jí)緩存(Last Level Cache, LLC)是多核處理器的所有核心共享的,大多數(shù)多核處理器的中間各層也是獨(dú)享的。如Intel Core i7處理器具有4~8個(gè)核,一些版本支持超線程,其中每個(gè)核心具有獨(dú)立的一級(jí)數(shù)據(jù)緩存和指令緩存、統(tǒng)一的二級(jí)緩存,并且所有的核心共享統(tǒng)一的三級(jí)緩存。

由于共享LLC,因此多線程或多進(jìn)程程序在多核處理器上運(yùn)行時(shí),平均每個(gè)進(jìn)程或線程占用的LLC緩存相比使用單線程時(shí)要小,這使得某些LLC或內(nèi)存限制的應(yīng)用的可擴(kuò)展性看起來(lái)沒(méi)那么好。

由于多核處理器的每個(gè)核心都有獨(dú)立的一級(jí)、有時(shí)還有獨(dú)立的二級(jí)緩存,使用多線程/多進(jìn)程程序時(shí)可利用這些每個(gè)核心獨(dú)享的緩存,這是超線性加速(指在多核處理器上獲得的性能收益超過(guò)核數(shù))的原因之一。

多路與NUMA

硬件生產(chǎn)商還將多個(gè)多核芯片封裝在一起,稱(chēng)之為多路,多路之間以一種介于共享和獨(dú)享之間的方式訪問(wèn)內(nèi)存。由于多路之間缺乏緩存,因此其通信代價(jià)通常不比DRAM低。一些多核也將內(nèi)存控制器封裝進(jìn)多核之中,直接和內(nèi)存相連,以提供更高的訪存帶寬。

多路上還有兩個(gè)和內(nèi)存訪問(wèn)相關(guān)的概念:UMA(均勻內(nèi)存訪問(wèn))和NUMA(非均勻內(nèi)存訪問(wèn))。UMA是指多個(gè)核心訪問(wèn)內(nèi)存中的任何一個(gè)位置的延遲是一樣的,NUMA和UMA相對(duì),核心訪問(wèn)離其近(指訪問(wèn)時(shí)要經(jīng)過(guò)的中間節(jié)點(diǎn)數(shù)量少)的內(nèi)存其延遲要小。如果程序的局部性很好,應(yīng)當(dāng)開(kāi)啟硬件的NUMA支持。

硬件平臺(tái)

異構(gòu)并行計(jì)算人員的能力最終需要通過(guò)運(yùn)行在硬件上的程序來(lái)證明,這意味著異構(gòu)并行計(jì)算編程人員對(duì)硬件的了解與其能力直接正相關(guān)。

目前大家接觸到處理器主要類(lèi)型有:X86、ARM、GPU、FPGA等,它們的差別非常大。

X86

X86是Intel/AMD及相關(guān)廠商生產(chǎn)的一系列CPU處理器的統(tǒng)稱(chēng),也是大家日常所見(jiàn)。X86廣泛應(yīng)用在桌面、服務(wù)器和云上。

SSE是 X86 向量多核處理器支持的向量指令,具有16個(gè)長(zhǎng)度為128位(16個(gè)字節(jié))的向量寄存器,處理器能夠同時(shí)操作向量寄存器中的16個(gè)字節(jié),因此具有更高的帶寬和計(jì)算性能。AVX將SSE的向量長(zhǎng)度延長(zhǎng)為256位(32字節(jié)),并支持浮點(diǎn)乘加?,F(xiàn)在,Intel已將向量長(zhǎng)度增加到512位。由于采用顯式的SIMD編程模型,SSE/AVX的使用比較困難,范圍比較有限,使用其編程是一件比較痛苦的事情。

MIC是Intel的眾核架構(gòu),它擁有大約60左右個(gè)X86核心,每個(gè)核心包括向量單元和標(biāo)量單元。向量單元包括32個(gè)長(zhǎng)度為512位(64字節(jié))的向量寄存器,支持16個(gè)32位或8個(gè)64位數(shù)同時(shí)運(yùn)算。目前的MIC的核為按序的,因此其性能優(yōu)化方法和基于亂序執(zhí)行的X86處理器核心有很大不同。

為了減小使用SIMD指令的復(fù)雜度,Intel寄希望于其編譯器的優(yōu)化能力,實(shí)際上Intel的編譯器向量化能力非常不錯(cuò),但是通常手工編寫(xiě)的向量代碼性能會(huì)更好。在MIC上編程時(shí),軟件開(kāi)發(fā)人員的工作部分由顯式使用向量指令轉(zhuǎn)化為改寫(xiě)C代碼和增加編譯制導(dǎo)語(yǔ)句以讓編譯器產(chǎn)生更好的向量指令。

另外,現(xiàn)代64位X86 CPU還利用SSE/AVX指令執(zhí)行標(biāo)量浮點(diǎn)運(yùn)算。

ARM

目前高端的智能手機(jī)、平板使用多個(gè)ARM核心和多個(gè)GPU核心。在人工智能時(shí)代,運(yùn)行在移動(dòng)設(shè)備上的應(yīng)用對(duì)計(jì)算性能需求越來(lái)越大,而由于電池容量和功耗的原因,移動(dòng)端不可能使用桌面或服務(wù)器高性能處理器,因此其對(duì)性能優(yōu)化具有很高需求。

目前市場(chǎng)上的高性能ARM處理器主要是32位的A7/A9/A15,已經(jīng)64位的A53/A57/A72。ARM A15 MP是一個(gè)多核向量處理器,它具有4個(gè)核心,每個(gè)核心具有64KB一級(jí)緩存,4個(gè)核心最大可共享2MB的二級(jí)緩存。ARM 32支持的向量指令集稱(chēng)為NEON。NEON具有16個(gè)長(zhǎng)度為128位的向量寄存器(這些寄存器以q開(kāi)頭,也可表示為32個(gè)64位寄存器,以d開(kāi)頭),可同時(shí)操作向量寄存器的16個(gè)字節(jié),因此使用向量指令可獲得更高的性能和帶寬。ARM A72 MP是一個(gè)多核向量處理器,其最多具有4個(gè)核心,每個(gè)核心獨(dú)享32KB的一級(jí)數(shù)據(jù)緩存,四個(gè)核心最高可共享4MB統(tǒng)一的二級(jí)緩存。ARM 64支持的向量指令集稱(chēng)為asimd,指令功能基本上兼容neon,但是寄存器和入棧規(guī)則具有明顯的不同,這意味著用neon寫(xiě)的匯編代碼不能兼容asimd。

GPU

GPGPU是一種利用處理圖形任務(wù)的GPU來(lái)完成原本由CPU處理(與圖形處理無(wú)關(guān)的)的通用計(jì)算任務(wù)。由于現(xiàn)代GPU強(qiáng)大的并行處理能力和可編程流水線,令其可以處理非圖形數(shù)據(jù)。特別在面對(duì)單指令流多數(shù)據(jù)流(SIMD),且數(shù)據(jù)處理的運(yùn)算量遠(yuǎn)大于數(shù)據(jù)調(diào)度和傳輸?shù)男枰獣r(shí),GPGPU在性能上大大超越了傳統(tǒng)的CPU應(yīng)用程序。

GPU是為了渲染大量像素而設(shè)計(jì)的,并不關(guān)心某個(gè)像素的處理時(shí)間,而關(guān)注單位時(shí)間內(nèi)能夠處理的像素?cái)?shù)量,因此帶寬比延遲更重要??紤]到渲染的大量像素之間通常并不相關(guān),因此GPU將大量的晶體管用于并行計(jì)算,故在同樣數(shù)目的晶體管上,具有比CPU更高的計(jì)算能力。

CPU和GPU的硬件架構(gòu)設(shè)計(jì)思路有很多不同,因此其編程方法很不相同,很多使用CUDA的開(kāi)發(fā)人員有機(jī)會(huì)重新回顧學(xué)習(xí)匯編語(yǔ)言的痛苦經(jīng)歷。GPU的編程能力還不夠強(qiáng),因此必須要對(duì)GPU特點(diǎn)有詳細(xì)了解,知道哪些能做,哪些不能做,才不會(huì)出現(xiàn)項(xiàng)目開(kāi)發(fā)途中發(fā)覺(jué)有一個(gè)功能無(wú)法實(shí)現(xiàn)或?qū)崿F(xiàn)后性能很差而導(dǎo)致項(xiàng)目中止的情況。

由于GPU將更大比例的晶體管用于計(jì)算,相對(duì)來(lái)說(shuō)用于緩存的比例就比CPU小,因此通常局部性滿足CPU要求而不滿足GPU要求的應(yīng)用不適合GPU。由于GPU通過(guò)大量線程的并行來(lái)隱藏訪存延遲,一些數(shù)據(jù)局部性非常差的應(yīng)用反而能夠在GPU上獲得很好的收益。另外一些計(jì)算訪存比低的應(yīng)用在GPU上很難獲得非常高的性能收益,但是這并不意味著在GPU實(shí)現(xiàn)會(huì)比在CPU上實(shí)現(xiàn)差。CPU+GPU異構(gòu)計(jì)算需要在GPU和CPU之間傳輸數(shù)據(jù),而這個(gè)帶寬比內(nèi)存的訪問(wèn)帶寬還要小,因此那種需要在GPU和CPU之間進(jìn)行大量、頻繁數(shù)據(jù)交互的解決方案可能不適合在GPU上實(shí)現(xiàn)。

FPGA

FPGA是現(xiàn)場(chǎng)可編程門(mén)陣列的縮寫(xiě),隨著人工智能的流行,F(xiàn)PGA越來(lái)越得到產(chǎn)業(yè)界和學(xué)術(shù)界的重視。FPGA的主要特點(diǎn)在于其可被用戶或設(shè)計(jì)者重新進(jìn)行配置,F(xiàn)PGA的配置可以通過(guò)硬件描述語(yǔ)言進(jìn)行,常見(jiàn)的硬件描述語(yǔ)言有VHDL和verilog。

使用VHDL和Verilog編程被人詬病的一點(diǎn)在于其編程速度。隨著FPGA的流行,其編程速度越來(lái)越得到重視,各個(gè)廠商都推出了各自的OpenCL編程環(huán)境,雖然OpenCL降低了編程難度,但是其靈活性和性能也受到很大的限制。

傳統(tǒng)上,F(xiàn)PGA用于通信,現(xiàn)在FPGA也用于計(jì)算和做硬件電路設(shè)計(jì)驗(yàn)證。目前主流的兩家FPGA廠商是Altera和Xilinx,Intel在2014年收購(gòu)了Altera,估計(jì)在2018年,Intel X86+FPGA的異構(gòu)產(chǎn)品會(huì)出現(xiàn)在市場(chǎng)。

編程環(huán)境

本節(jié)將詳細(xì)介紹目前主流的并行編程環(huán)境,既包括常見(jiàn)的指令級(jí)并行編程技術(shù),也包括線程級(jí)并行編程技術(shù)和進(jìn)程級(jí)技術(shù)。

Intel AVX/AVX512 Intrinsic

SSE/AVX是Intel推出的用以挖掘SIMD能力的匯編指令。由于匯編編程太難,后來(lái)Intel又給出了其內(nèi)置函數(shù)版本(intrinsic)。

SSE/AVX指令支持?jǐn)?shù)據(jù)并行,一個(gè)指令可以同時(shí)對(duì)多個(gè)數(shù)據(jù)進(jìn)行操作,同時(shí)操作的數(shù)據(jù)個(gè)數(shù)由向量寄存器的長(zhǎng)度和數(shù)據(jù)類(lèi)型共同決定。如SSE4向量寄存器(xmm)長(zhǎng)度為128位,即16個(gè)字節(jié)。如果操作float或int型數(shù)據(jù),可同時(shí)操作4個(gè),如果操作char型數(shù)據(jù),可同時(shí)操作16個(gè),而AVX向量寄存器(ymm)長(zhǎng)度為256位,即32字節(jié)。

雖然SSE4/AVX指令向量寄存器的長(zhǎng)度為128/256 位,但是同樣支持更小長(zhǎng)度的向量操作。在64位程序下,SSE4/AVX 向量寄存器的個(gè)數(shù)是16個(gè)。

SSE指令要求對(duì)齊,主要是為了減少內(nèi)存或緩存操作的次數(shù)。SSE4指令要求16字節(jié)對(duì)齊,而AVX指令要求32字節(jié)對(duì)齊。SSE4及以前的SSE指令不支持不對(duì)齊的讀寫(xiě)操作,為了簡(jiǎn)化編程和擴(kuò)大應(yīng)用范圍,AVX指令支持非對(duì)齊的讀寫(xiě)。

ARM NEON Intrinsic

NEON是ARM處理器上的SIMD指令集擴(kuò)展,由于ARM在移動(dòng)端得到廣泛應(yīng)用,目前NEON的使用也越來(lái)越普遍。

NEON支持?jǐn)?shù)據(jù)并行,一個(gè)指令可同時(shí)對(duì)多個(gè)數(shù)據(jù)進(jìn)行操作,同時(shí)操作的數(shù)據(jù)個(gè)數(shù)由向量寄存器的長(zhǎng)度和數(shù)據(jù)類(lèi)型共同決定。

ARMv7具有16個(gè)128位的向量寄存器,命名為q0~q15,這16個(gè)寄存器又可以分成32個(gè)64位寄存器,命名為d0~d31。其中qn和d2n、d2n+1是一樣的,故使用匯編寫(xiě)代碼時(shí)要注意避免寄存器覆蓋。

OpenMP

OpenMP是Open Multi-Processing的簡(jiǎn)稱(chēng),是一個(gè)基于共享存儲(chǔ)器的并行環(huán)境。OpenMP支持C/C++/Fortran綁定,也被實(shí)現(xiàn)為庫(kù)。目前常用的GCC、ICC和Visual Studio都支持OpenMP。

OpenMP API包括以下幾個(gè)部分:一套編譯器偽指令,一套運(yùn)行時(shí)函數(shù),一些環(huán)境變量。OpenMP已經(jīng)被大多數(shù)計(jì)算機(jī)硬件和軟件廠商所接受,成為事實(shí)上的標(biāo)準(zhǔn)。

OpenMP提供了對(duì)并行算法的高層的抽象描述,程序員通過(guò)在源代碼中插入各種pragma偽指令來(lái)指明自己的意圖,編譯器據(jù)此可以自動(dòng)將程序并行化,并在必要之處加入同步互斥等通信。當(dāng)選擇告訴編譯器忽略這些pragma或者編譯器不支持OpenMP時(shí),程序又可退化為串行程序,代碼仍然可以正常運(yùn)作,只是不能利用多線程來(lái)加速程序執(zhí)行。OpenMP提供的這種對(duì)于并行描述的高層抽象降低了并行編程的難度和復(fù)雜度,這樣程序員可以把更多的精力投入到并行算法本身,而非其具體實(shí)現(xiàn)細(xì)節(jié)。對(duì)基于數(shù)據(jù)并行的多線程程序設(shè)計(jì),OpenMP是一個(gè)很好的選擇。同時(shí),使用OpenMP也提供了更強(qiáng)的靈活性,可以適應(yīng)不同的并行系統(tǒng)配置。線程粒度和負(fù)載均衡等是傳統(tǒng)并行程序設(shè)計(jì)中的難題,但在OpenMP中,OpenMP庫(kù)從程序員手中接管了這兩方面的部分工作。

OpenMP的設(shè)計(jì)目標(biāo)為:標(biāo)準(zhǔn)、簡(jiǎn)潔實(shí)用、使用方便、可移植。作為高層抽象,OpenMP并不適合需要復(fù)雜的線程間同步、互斥及對(duì)線程做精密控制的場(chǎng)合。OpenMP的另一個(gè)缺點(diǎn)是不能很好地在非共享內(nèi)存系統(tǒng)(如計(jì)算機(jī)集群)上使用,在這樣的系統(tǒng)上,MPI更適合。

MPI

MPI(Message Passing Interface,消息傳遞接口)是一種消息傳遞編程環(huán)境。消息傳遞指用戶必須通過(guò)顯式地發(fā)送和接收消息來(lái)實(shí)現(xiàn)處理器間的數(shù)據(jù)交換。MPI定義了一組通信函數(shù),以將數(shù)據(jù)從一個(gè)MPI進(jìn)程發(fā)送到另一個(gè)MPI進(jìn)程。在消息傳遞并行編程中,每個(gè)控制流均有自己獨(dú)立的地址空間,不同的控制流之間不能直接訪問(wèn)彼此的地址空間,必須通過(guò)顯式的消息傳遞來(lái)實(shí)現(xiàn)。這種編程方式是大規(guī)模并行處理機(jī)(MPP)和機(jī)群(Cluster)采用的主要編程方式。實(shí)踐表明MPI的擴(kuò)展性非常好,無(wú)論是在幾個(gè)節(jié)點(diǎn)的小集群上,還是在擁有成千上萬(wàn)節(jié)點(diǎn)的大集群上,都能夠很好地應(yīng)用。

由于消息傳遞程序設(shè)計(jì)要求用戶很好地分解問(wèn)題,組織不同控制流間的數(shù)據(jù)交換,并行計(jì)算粒度大,特別適合于大規(guī)??蓴U(kuò)展并行算法。MPI是基于進(jìn)程的并行環(huán)境。進(jìn)程擁有獨(dú)立的虛擬地址空間和處理器調(diào)度,并且執(zhí)行相互獨(dú)立。MPI設(shè)計(jì)為支持通過(guò)網(wǎng)絡(luò)連接的機(jī)群系統(tǒng),且通過(guò)消息傳遞來(lái)實(shí)現(xiàn)通信,消息傳遞是MPI的最基本特色。

MPI是一種標(biāo)準(zhǔn)或規(guī)范的代表,而非特指某一個(gè)對(duì)它的具體實(shí)現(xiàn),MPI成為分布式存儲(chǔ)編程模型的代表和事實(shí)上的標(biāo)準(zhǔn)。迄今為止,所有的并行計(jì)算機(jī)制造商都提供對(duì)MPI的支持,可以在網(wǎng)上免費(fèi)得到MPI在不同并行計(jì)算機(jī)上的實(shí)現(xiàn),一個(gè)正確的MPI程序可以不加修改地在所有的并行機(jī)上運(yùn)行。

MPI只規(guī)定了標(biāo)準(zhǔn)并沒(méi)有給出實(shí)現(xiàn),目前主要的實(shí)現(xiàn)有OpenMPI、Mvapich和MPICH,MPICH相對(duì)比較穩(wěn)定,而OpenMPI性能較好,Mvapich則主要是為了Infiniband 而設(shè)計(jì)。

MPI主要用于分布式存儲(chǔ)的并行機(jī),包括所有主流并行計(jì)算機(jī)。但是MPI也可以用于共享存儲(chǔ)的并行機(jī),如多核微處理器。編程實(shí)踐證明MPI的可擴(kuò)展性非常好,其應(yīng)用范圍從幾個(gè)機(jī)器的小集群到工業(yè)應(yīng)用的上萬(wàn)節(jié)點(diǎn)的工業(yè)級(jí)集群。MPI已在Windows上、所有主要的UNIX/Linux工作站上和所有主流的并行機(jī)上得到實(shí)現(xiàn)。使用MPI進(jìn)行消息傳遞的C或Fortran并行程序可不加改變地運(yùn)行在使用這些操作系統(tǒng)的工作站,以及各種并行機(jī)上。

OpenCL

OpenCL(Open Computing Language,開(kāi)放計(jì)算語(yǔ)言),先由Apple設(shè)計(jì),后來(lái)交由Khronos Group維護(hù),是異構(gòu)平臺(tái)并行編程的開(kāi)放的標(biāo)準(zhǔn),也是一個(gè)編程框架。Khronos Group是一個(gè)非盈利性技術(shù)組織,維護(hù)著多個(gè)開(kāi)放的工業(yè)標(biāo)準(zhǔn),并且得到了工業(yè)界的廣泛支持。OpenCL的設(shè)計(jì)借鑒了CUDA的成功經(jīng)驗(yàn),并盡可能的支持多核CPU、GPU或其他加速器。OpenCL不但支持?jǐn)?shù)據(jù)并行,還支持任務(wù)并行。同時(shí)OpenCL內(nèi)建了多GPU并行的支持。這使得OpenCL的應(yīng)用范圍比CUDA廣,但是目前OpenCL的API參數(shù)比較多(因?yàn)椴恢С趾瘮?shù)重載),因此函數(shù)相對(duì)難以熟記。

OpenCL覆蓋的領(lǐng)域不但包括GPU,還包括其他的多種處理器芯片。到現(xiàn)在為止,支持OpenCL的硬件主要局限在CPU、GPU和FPGA上,目前提供OpenCL開(kāi)發(fā)環(huán)境的主要有NVIDIA、AMD、ARM、Qualcomm、Altera和Intel,其中NVIDIA和AMD都提供了基于自家GPU的OpenCL實(shí)現(xiàn),而AMD和Intel提供了基于各自CPU的OpenCL實(shí)現(xiàn)。目前它們的實(shí)現(xiàn)都不約而同地不支持自家產(chǎn)品以外的產(chǎn)品。由于硬件的不同,為了寫(xiě)出性能優(yōu)異的代碼,可能會(huì)對(duì)可移植性造成影響。

OpenCL包含兩個(gè)部分:一是語(yǔ)言和API,二是架構(gòu)。為了C程序員能夠方便、簡(jiǎn)單地學(xué)習(xí)OpenCL,OpenCL只是給C99進(jìn)行了非常小的擴(kuò)展,以提供控制并行計(jì)算設(shè)備的API以及一些聲明計(jì)算內(nèi)核的能力。軟件開(kāi)發(fā)人員可以利用OpenCL開(kāi)發(fā)并行程序,并且可獲得比較好的在多種設(shè)備上運(yùn)行的可移植性。

OpenCL的目標(biāo)是一次編寫(xiě),能夠在各種硬件條件下編譯的異構(gòu)程序。由于各個(gè)平臺(tái)的軟硬件環(huán)境不同,高性能和平臺(tái)間兼容性會(huì)產(chǎn)生矛盾。而OpenCL允許各平臺(tái)使用自己硬件的特性,這又增大了這一矛盾。但是如果不允許各平臺(tái)使用自己的特性,卻會(huì)阻礙硬件的改進(jìn)。

CUDA

CUDA認(rèn)為系統(tǒng)上可以用于計(jì)算的硬件包含兩個(gè)部分:一個(gè)是CPU(稱(chēng)為主機(jī)),一個(gè)是GPU(稱(chēng)為設(shè)備),CPU控制/指揮GPU工作,GPU只是CPU的協(xié)處理器。目前CUDA只支持NVIDIA的GPU,而CPU由主機(jī)端編程環(huán)境負(fù)責(zé)。

CUDA是一種架構(gòu),也是一種語(yǔ)言。作為一種架構(gòu),它包括硬件的體系結(jié)構(gòu)(G80、GT200、Fermi、Kepler)、硬件的CUDA計(jì)算能力及CUDA程序是如何映射到GPU上執(zhí)行;作為一種語(yǔ)言,CUDA提供了能夠利用GPU計(jì)算能力的方方面面的功能。CUDA的架構(gòu)包括其編程模型、存儲(chǔ)器模型和執(zhí)行模型。CUDA C語(yǔ)言主要說(shuō)明了如何定義計(jì)算內(nèi)核(kernel)。CUDA架構(gòu)在硬件結(jié)構(gòu)、編程方式與CPU體系有極大不同,關(guān)于CUDA的具體細(xì)節(jié)讀者可參考CUDA相關(guān)的書(shū)籍。

CUDA以C/C++語(yǔ)法為基礎(chǔ)而設(shè)計(jì),因此對(duì)熟悉C系列語(yǔ)言的程序員來(lái)說(shuō),CUDA的語(yǔ)法比較容易掌握。另外CUDA只對(duì)ANSI C進(jìn)行了最小的擴(kuò)展,以實(shí)現(xiàn)其關(guān)鍵特性:線程按照兩個(gè)層次進(jìn)行組織、共享存儲(chǔ)器(shared memory)和柵欄(barrier)同步。

目前CUDA提供了兩種API以滿足不同人群的需要:運(yùn)行時(shí)API和驅(qū)動(dòng)API。運(yùn)行時(shí)API基于驅(qū)動(dòng)API構(gòu)建,應(yīng)用也可以使用驅(qū)動(dòng)API。驅(qū)動(dòng)API通過(guò)展示低層的概念提供了額外的控制。使用運(yùn)行時(shí)API時(shí),初始化、上下文和模塊管理都是隱式的,因此代碼更簡(jiǎn)明。一般一個(gè)應(yīng)用只需要使用運(yùn)行時(shí)API或者驅(qū)動(dòng)API中的一種,但是可以同時(shí)混合使用這兩種。筆者建議讀者優(yōu)先使用運(yùn)行時(shí)API。

編程模式

和串行編程類(lèi)似,并行編程也表現(xiàn)出模式的特征,并行編程模式是對(duì)某一類(lèi)相似并行算法的解決方案的抽象。

和串行編程類(lèi)似,并行編程對(duì)于不同應(yīng)用場(chǎng)景也有不同的解決方法。由于并行的特殊性,串行的解決方法不能直接移植到并行環(huán)境上,因此需要重新思考、設(shè)計(jì)解決方法。并行編程模式大多數(shù)以數(shù)據(jù)和任務(wù)(過(guò)程化的操作)為中心來(lái)命名,也有一些是以編程方法來(lái)命名。

經(jīng)過(guò)幾十年的發(fā)展,人們已經(jīng)總結(jié)出一系列有效的并行模式,這些模型的適用場(chǎng)景各不相同。本節(jié)將簡(jiǎn)要說(shuō)明一些常用并行模式的特點(diǎn)、適用的場(chǎng)景和情況,具體的描述和實(shí)現(xiàn)則在后文詳細(xì)描述。

需要說(shuō)明的是:從不同的角度看,一個(gè)并行應(yīng)用可能屬于多個(gè)不同的并行模式,本質(zhì)原因在于這些并行模式中存在重疊的地方。由于模式并非正交,因此適用于一種模式的辦法可能也適用于另一種模式,讀者需要舉一反三。

任務(wù)并行模式

任務(wù)并行是指每個(gè)控制流計(jì)算一件事或者計(jì)算多個(gè)并行任務(wù)的一個(gè)子任務(wù),通常其粒度比較大且通信很少或沒(méi)有。

由于和人類(lèi)的思維方式比較類(lèi)似,任務(wù)并行比較受歡迎,且又易于在原有的串行代碼的基礎(chǔ)上實(shí)現(xiàn)。

數(shù)據(jù)并行模式

數(shù)據(jù)并行是指一條指令同時(shí)作用在多個(gè)數(shù)據(jù)上,那么可以將一個(gè)或多個(gè)數(shù)據(jù)分配給一個(gè)控制流計(jì)算,這樣多個(gè)控制流就可以并行,這要求待處理的數(shù)據(jù)具有平等的特性,即幾乎沒(méi)有需要特殊處理的數(shù)據(jù)。如果對(duì)每個(gè)數(shù)據(jù)或每個(gè)小數(shù)據(jù)集的處理時(shí)間基本相同,那么均勻分割數(shù)據(jù)即可;如果處理時(shí)間不同,就要考慮負(fù)載均衡問(wèn)題。通常的做法是盡量使數(shù)據(jù)集的數(shù)目遠(yuǎn)大于控制流數(shù)目,動(dòng)態(tài)調(diào)度以基本達(dá)到負(fù)載均衡。

數(shù)據(jù)并行對(duì)控制的要求比較少,因此現(xiàn)代GPU利用這一特性,大量減少控制單元的比例,而將空出來(lái)的單元用于計(jì)算,這樣就能在同樣數(shù)量的晶體管上提供更多的原生計(jì)算能力。

基于進(jìn)程的、基于線程的環(huán)境,甚至指令級(jí)并行環(huán)境都可以很好地應(yīng)用在數(shù)據(jù)并行上。必要時(shí)可同時(shí)使用這三種編程環(huán)境,在進(jìn)程中分配線程,在線程中使用指令級(jí)并行處理多個(gè)數(shù)據(jù),這稱(chēng)為混合計(jì)算。

異構(gòu)并行計(jì)算領(lǐng)域現(xiàn)狀

在2005年之前,處理器通常提升頻率來(lái)提升計(jì)算性能,由于性能是可預(yù)測(cè)的,因此在硬件生產(chǎn)商、研究人員和軟件開(kāi)發(fā)人員之間形成了一個(gè)良性循環(huán)。由于功耗的限制,處理器頻率不能接著提升,硬件生產(chǎn)商轉(zhuǎn)而使用向量化或多核技術(shù)。而以GPU計(jì)算為代表的異構(gòu)并行計(jì)算的興起,加上人工智能的加持,異構(gòu)并行計(jì)算從學(xué)術(shù)界走向工業(yè)界,獲得了大眾的認(rèn)可。今天幾乎所有主流的處理器硬件生產(chǎn)商都已經(jīng)在支持OpenCL,未來(lái)異構(gòu)并行計(jì)算必將無(wú)處不在。今天無(wú)論上技術(shù)上還是市場(chǎng)上,它都獲得了長(zhǎng)足的發(fā)展,筆者可以預(yù)計(jì)在未來(lái)的十年,異構(gòu)并行計(jì)算必將進(jìn)一步深入發(fā)展,并且在更多的行業(yè)產(chǎn)生價(jià)值。

技術(shù)進(jìn)展

由于工藝制程的影響,芯片的集成度提升會(huì)越來(lái)越難,現(xiàn)在14nm已經(jīng)量產(chǎn),未來(lái)7nm也將很快。隨著制程技術(shù)到達(dá)極限,某些廠商通過(guò)制程領(lǐng)先一代的優(yōu)勢(shì)會(huì)消失,軟件公司會(huì)進(jìn)一步重視異構(gòu)并行計(jì)算人才的價(jià)值。而一些硬件廠商會(huì)進(jìn)化成系統(tǒng)廠商,不再只是提供單純的硬件,進(jìn)而會(huì)硬件和系統(tǒng)軟件一起提供,通過(guò)把軟件的成本轉(zhuǎn)嫁到硬件上來(lái)獲得利潤(rùn)。

隨著異構(gòu)并行計(jì)算影響力的提升,各個(gè)廠商和組織開(kāi)發(fā)了一系列的技術(shù),如WebCL、OpenVX、Vulkan等。這些技術(shù)進(jìn)一步豐富和擴(kuò)張了異構(gòu)并行計(jì)算的領(lǐng)域,更促進(jìn)了異構(gòu)并行計(jì)算。今天基本上每家硬件和系統(tǒng)軟件公司都或多或少的涉及到了異構(gòu)并行計(jì)算。

市場(chǎng)需求

隨著人工智能的興起,市場(chǎng)對(duì)異構(gòu)并行計(jì)算領(lǐng)域人員的需求已經(jīng)從傳統(tǒng)的科學(xué)計(jì)算、圖像處理轉(zhuǎn)到互聯(lián)網(wǎng)和新興企業(yè),目前人員缺口已經(jīng)很大了,從51job和智聯(lián)招聘上能夠查到許多招聘信息。

由于目前還在行業(yè)的早期,異構(gòu)并行計(jì)算開(kāi)發(fā)人員的能力和老板期望和支出之間存在明顯的認(rèn)知差距,再加上異構(gòu)并行計(jì)算開(kāi)發(fā)人員的工作成果往往需要和產(chǎn)品間接反應(yīng),故在多個(gè)層面上存在博弈。對(duì)于異構(gòu)并行計(jì)算領(lǐng)域的人員來(lái)說(shuō),這個(gè)博弈有點(diǎn)不公平,因?yàn)槁殬I(yè)特點(diǎn)要求異構(gòu)并行計(jì)算領(lǐng)域的從業(yè)人員要比算法設(shè)計(jì)人員更了解算法實(shí)現(xiàn)細(xì)節(jié)、要比算法實(shí)現(xiàn)人員更了解算法的應(yīng)用場(chǎng)景,再加上編程上的難度和需要付出更多的時(shí)間。但是由于行業(yè)剛形成不久,老板們并沒(méi)有意識(shí)到這一點(diǎn),他們還只是把異構(gòu)并行計(jì)算從業(yè)人員當(dāng)成普通的開(kāi)發(fā)者,矛盾就產(chǎn)生了。

隨著人工智能的興起,市場(chǎng)對(duì)異構(gòu)并行計(jì)算從業(yè)人員的認(rèn)知逐漸變得理性。越來(lái)越多的企業(yè)認(rèn)識(shí)到:異構(gòu)并行計(jì)算是人工智能企業(yè)最核心的競(jìng)爭(zhēng)力之一??梢灶A(yù)見(jiàn)在不遠(yuǎn)的將來(lái),異構(gòu)并行計(jì)算工程師會(huì)越來(lái)越吃香。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 工程師
    +關(guān)注

    關(guān)注

    59

    文章

    1571

    瀏覽量

    68574
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么嵌入式驅(qū)動(dòng)開(kāi)發(fā)工程師可以拿高薪?

    技術(shù)領(lǐng)域具有不可替代的地位。 成為一名優(yōu)秀的嵌入式驅(qū)動(dòng)工程師只需要深耕以下幾點(diǎn): 1)堅(jiān)實(shí)的技術(shù)基礎(chǔ): 首先,需要有堅(jiān)實(shí)的基礎(chǔ),包括計(jì)算機(jī)組成原理、微處理器與微控制器架構(gòu)以及電路設(shè)計(jì)
    發(fā)表于 01-07 16:56

    OpenAI從谷歌DeepMind挖角三高級(jí)工程師

    近日,據(jù)Wired最新報(bào)道,OpenAI在人才爭(zhēng)奪戰(zhàn)中取得了顯著成果,成功從競(jìng)爭(zhēng)對(duì)手谷歌DeepMind“挖角”了三高級(jí)計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)領(lǐng)域的專(zhuān)家。 據(jù)悉,這三工程師分別是Lu
    的頭像 發(fā)表于 12-04 14:13 ?328次閱讀

    文看懂】什么是異構(gòu)計(jì)算

    隨著人工智能、深度學(xué)習(xí)、大數(shù)據(jù)處理等技術(shù)的快速發(fā)展,計(jì)算需求的復(fù)雜性不斷提升。傳統(tǒng)的單一計(jì)算架構(gòu)已難以滿足高效處理復(fù)雜任務(wù)的要求,異構(gòu)計(jì)算因此應(yīng)運(yùn)而生,成為現(xiàn)代
    的頭像 發(fā)表于 12-04 01:06 ?1628次閱讀
    【<b class='flag-5'>一</b>文看懂】什么是<b class='flag-5'>異構(gòu)計(jì)算</b>?

    嵌入式軟件工程師如何提升自己?

    嵌入式軟件工程師如何提升自己? 作為一名嵌入式軟件工程師,在這個(gè)充滿機(jī)遇和挑戰(zhàn)的領(lǐng)域里,如何提升自己顯得非常重要,它決定了你未來(lái)的發(fā)展方向和成就。接下來(lái),我們起探討
    發(fā)表于 06-12 11:20

    索尼誠(chéng)邀軟件工程師參與PS免費(fèi)手游平臺(tái)設(shè)計(jì)

    據(jù)悉,近日,澳大利亞知名媒體TweakTown發(fā)現(xiàn),索尼互動(dòng)娛樂(lè)正在為其旗下的PlayStation Studios Mobile招募一名資深的軟件工程師,負(fù)責(zé)設(shè)計(jì)PlayStation的免費(fèi)手機(jī)游戲平臺(tái)。
    的頭像 發(fā)表于 05-23 17:08 ?748次閱讀

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    嵌入式軟件工程師和硬件工程師的區(qū)別? 嵌入式軟件工程師 嵌入式軟件工程師是軟件開(kāi)發(fā)領(lǐng)域中的種專(zhuān)業(yè)工程師
    發(fā)表于 05-16 11:00

    個(gè)電源工程師的成長(zhǎng)路徑

    即將走馬上任電源工程師這個(gè)崗位,請(qǐng)問(wèn)各位大佬,這個(gè)崗位的職業(yè)路徑般是怎樣的?
    發(fā)表于 04-08 14:19

    如何成為一名嵌入式C語(yǔ)言高手?

    如何成為一名嵌入式C語(yǔ)言高手? 嵌入式系統(tǒng)是當(dāng)今科技領(lǐng)域的核心,而C語(yǔ)言則是嵌入式系統(tǒng)開(kāi)發(fā)中最常用的編程語(yǔ)言之。成為一名嵌入式C語(yǔ)言高手
    發(fā)表于 04-07 16:03

    如何成為一名嵌入式C語(yǔ)言高手?

    如何成為一名嵌入式C語(yǔ)言高手? 嵌入式系統(tǒng)是當(dāng)今科技領(lǐng)域的核心,而C語(yǔ)言則是嵌入式系統(tǒng)開(kāi)發(fā)中最常用的編程語(yǔ)言之。成為一名嵌入式C語(yǔ)言高手
    發(fā)表于 03-25 14:12

    fpga工程師前景如何

    FPGA工程師的前景看起來(lái)相當(dāng)積極和廣闊。隨著5G通信、物聯(lián)網(wǎng)、邊緣計(jì)算和人工智能等技術(shù)的快速發(fā)展,F(xiàn)PGA工程師的需求將進(jìn)步增加。FPGA芯片具有可編程性強(qiáng)、
    的頭像 發(fā)表于 03-14 16:32 ?3224次閱讀

    單片機(jī)如何通過(guò)代碼控制硬件:一名工程師的分享

    今天跟大家聊聊單片機(jī)是怎樣通過(guò)代碼來(lái)操控硬件的。作為一名單片機(jī)工程師,我們平時(shí)的工作就像是給單片機(jī)編寫(xiě)“指令集”,讓它按照我們的意圖去驅(qū)動(dòng)各種硬件設(shè)備。
    的頭像 發(fā)表于 03-06 14:46 ?1577次閱讀
    單片機(jī)如何通過(guò)代碼控制硬件:<b class='flag-5'>一名</b><b class='flag-5'>工程師</b>的分享

    優(yōu)秀電源工程師需要哪些必備技能?

    就帶大家細(xì)數(shù)下優(yōu)秀電源工程師具備的那些技能。、新手必備課程成為一名電源高手需要扎實(shí)的理論基礎(chǔ),涉及電路原理、語(yǔ)言編程和控制理論等多個(gè)學(xué)科
    發(fā)表于 01-29 11:29