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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

異構(gòu)并行計算工程師成長詳解

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

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

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

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

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

計算和訪存

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

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

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

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

指令級并行

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

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

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

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

多核

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

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

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

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

多路與NUMA

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

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

硬件平臺

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

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

X86

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

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

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

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

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

ARM

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

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

GPU

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

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

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

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

FPGA

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

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

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

編程環(huán)境

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

Intel AVX/AVX512 Intrinsic

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

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

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

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

ARM NEON Intrinsic

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

NEON支持數(shù)據(jù)并行,一個指令可同時對多個數(shù)據(jù)進行操作,同時操作的數(shù)據(jù)個數(shù)由向量寄存器的長度和數(shù)據(jù)類型共同決定。

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

OpenMP

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

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

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

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

MPI

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

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

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

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

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

OpenCL

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

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

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

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

CUDA

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

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

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

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

編程模式

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

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

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

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

任務(wù)并行模式

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

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

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

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

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

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

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

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

技術(shù)進展

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

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

市場需求

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

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

隨著人工智能的興起,市場對異構(gòu)并行計算從業(yè)人員的認知逐漸變得理性。越來越多的企業(yè)認識到:異構(gòu)并行計算是人工智能企業(yè)最核心的競爭力之一??梢灶A(yù)見在不遠的將來,異構(gòu)并行計算工程師會越來越吃香。

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

    關(guān)注

    59

    文章

    1561

    瀏覽量

    68313
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    索尼誠邀軟件工程師參與PS免費手游平臺設(shè)計

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

    個電源工程師的成長路徑

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

    如何成為一名嵌入式C語言高手?

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

    如何成為一名嵌入式C語言高手?

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

    單片機如何通過代碼控制硬件:一名工程師的分享

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

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

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

    一名嵌入式工程師的漲薪經(jīng)歷

    下面是位嵌入式工程師的漲薪經(jīng)歷,希望可以幫助到你,幫到其他的在校學(xué)生。 ? 階段 1 大到大三這個階段我與大多數(shù)學(xué)生相同: ? 、學(xué)習(xí)本專業(yè)知識(電子信息類專業(yè)) 二、學(xué)習(xí)嵌入式
    的頭像 發(fā)表于 01-05 08:39 ?345次閱讀

    優(yōu)秀電源工程師的必備技能大揭秘!

    就帶大家細數(shù)下優(yōu)秀電源工程師具備的那些技能。新手必備課程成為一名電源高手需要扎實的理論基礎(chǔ),涉及電路原理、語言編程和控制理論等多個學(xué)科領(lǐng)域。為了幫助大家更好地掌握
    的頭像 發(fā)表于 12-19 08:23 ?1477次閱讀
    優(yōu)秀電源<b class='flag-5'>工程師</b>的必備技能大揭秘!

    #人工智能 #FPGA 怎么成為個合格的FPGA工程師

    fpga工程師
    明德?lián)P助教小易老師
    發(fā)布于 :2023年12月18日 21:19:01

    異構(gòu)眾核系統(tǒng)高性能計算架構(gòu)

    隨著計算機技術(shù)的發(fā)展,單核處理器已經(jīng)難以滿足高性能計算的需求,眾核處理器成為種有效的解決方案。眾核處理器是指在個芯片上集成多個處理器核
    的頭像 發(fā)表于 11-30 08:27 ?616次閱讀
    <b class='flag-5'>異構(gòu)</b>眾核系統(tǒng)高性能<b class='flag-5'>計算</b>架構(gòu)

    FPGA工程師需要具備哪些技能?

    還需要了解基于FPGA構(gòu)建DSP系統(tǒng)的流水線、并行處理、嵌入式處理等技術(shù),以及使用FPGA進行大規(guī)模計算的方法。 五、通信協(xié)議 通信協(xié)議是FPGA設(shè)計的重要組成部分。FPGA工程師需要掌握
    發(fā)表于 11-09 11:03

    如何成為一名優(yōu)秀的嵌入式工程師

    如何成為一名優(yōu)秀的嵌入式工程師?嵌入式學(xué)習(xí)的第步,首先是C語言。 1.理解內(nèi)存管理:C語言不同于高級語言,它不會自動管理內(nèi)存。因此,你需要理解并掌握如何使用malloc()、fre
    發(fā)表于 11-07 15:36

    ?硬件工程師就業(yè)前景和未來發(fā)展方向

    大家好,我是硬件花園,一名樂于分享的硬件工程師。關(guān)注我,了解更多精彩內(nèi)容! 硬件工程師的就業(yè)前景和發(fā)展方向有很多,以下是我整理出來的些常見的發(fā)展方向: 1. 技術(shù)層面 硬件
    的頭像 發(fā)表于 10-20 08:43 ?3205次閱讀

    #FPGA 本科生也能成為FPGA研發(fā)工程師

    fpga工程師
    明德?lián)P助教小易老師
    發(fā)布于 :2023年09月23日 08:05:36