隨著深度學習(人工智能)的火熱,異構并行計算越來越受到業(yè)界的重視。從開始談深度學習必談GPU,到談深度學習必談計算力。計算力不但和具體的硬件有關,且和能夠發(fā)揮硬件能力的人所擁有的水平(即異構并行計算能力)高低有關。
一個簡單的比喻是:兩個芯片計算力分別是10T和 20T,某人的異構并行計算能力為0.8,他拿到了計算力為10T的芯片,而異構并行計算能力為0.4的人拿到了計算力為20T的芯片,而實際上最終結果兩人可能相差不大。異構并行計算能力強的人能夠更好地發(fā)揮硬件的能力,而本文的目標就是告訴讀者要變成一個異構并行計算能力強的工程師需要學習哪些知識。
異構并行計算是筆者提出的一個概念,它本質上是由異構計算和并行計算組合而來,一方面表示異構并行計算工程師需要同時掌握異構計算的知識,同時也需要掌握并行計算的知識;另一方面是為更好地發(fā)展和豐富異構計算和并行計算。通過異構并行計算進一步提升了知識的系統(tǒng)性和關聯性,讓每一個異構并行計算工程師都能夠獲得想要的工作,拿到值得的薪水。
對于一個異構并行計算工程師的日常來說,他的工作涉及的方面很廣,有硬件,有軟件,有系統(tǒng),有溝通;是一個對硬實力和軟實力都有非常高要求的崗位。
異構并行計算的難度是非常高的,而市場對這個職位的需求一直在提升,期待讀者能夠和我一起投身于異構并行計算的行列,為異構并行計算在中國的推廣做出貢獻。
異構并行計算工程師技能樹
要想成為一個優(yōu)秀的異構并行計算工程師需要掌握許多知識和技能,這些技能可以分為兩個方面:
讀者可以從圖1具體了解到異構并行計算工程師需要掌握的技能和知識。
圖1 異構并行計算工程師技能樹
異構并行計算工程師成長詳解
每個人甚至每個技術領域都是在不停的成長,通常公司的崗位會區(qū)分為初級、中級、高級、主任等,這是按照貢獻、能力和責任大小來分,并不適合用來表示技術。為了更好地幫助讀者學習知識,本文從技能體系角度來分析,因此并不能對應到各個公司招聘的崗位需求上,也意味著讀者不能簡單的把本文的技能和各個公司的崗位級別對應。
為了幫助讀者更好地理解,本文會使用先硬件后軟件的方式介紹。和異構并行工程師相關性最大的硬件知識即處理器特性,我們從這一點開始。
現代處理器的特性
從系統(tǒng)啟動到終止,處理器一條接著一條地執(zhí)行存儲器中的指令,站在使用者的角度來看就好像是前一條指令執(zhí)行完之后下一條指令才開始執(zhí)行,是一個完完全全的串行過程。實際上,現代處理器利用了指令級并行技術,同一時刻存在著多條指令同時被執(zhí)行,并且處理器執(zhí)行指令的順序無需和匯編代碼給出的指令順序完全一致,編譯器和處理器只需要保證最終結果一致即可,這類處理器稱為“亂序執(zhí)行處理器”。而嚴格按照順序一次執(zhí)行一條指令,只有前一條執(zhí)行完才開始執(zhí)行后一條指令的處理器,稱為“按序處理器”。而即使是在按序執(zhí)行處理器上,編譯器也可以對源代碼進行類似的優(yōu)化,以提高程序性能。對于一個特定的流水線來說,現代亂序執(zhí)行處理器只保證指令執(zhí)行階段可以亂序,而其他階段通常還是順序的。目前主流的CPU和GPU,甚至DSP,無論是在服務器端,還是在移動端基本上都已經是亂序執(zhí)行處理器了。
今天大多數處理器都是哈佛架構的變體,其根本特征是在程序執(zhí)行時把指令和數據分開存儲,程序員通常可以忽略指令存儲,實際上異構并行計算更關注的是:計算和數據訪問。
計算和訪存
以作者正在使用的處理器E5-2680v3來說,其主頻為2.6GHz,支持FMA指令集,其單核單精度浮點計算能力為2.6*2*8*2=83.2 GFlops;而單通道內存的帶寬大約為20GB/s。主流處理器的處理速度遠快于內存讀寫速度,為了減小訪問數據時的延遲,現代主流處理器主要采用了兩種方式:
-
利用程序訪問數據的局部性特點:采用了一系列小而快的緩存保存正在訪問和將要被訪問的數據,如果數據會被多次訪問且數據能夠被緩存容納,則能夠以近似于內存的價格獲得近似于緩存的速度;
-
利用程序的并行性:在一個控制流由于高延遲的操作而阻塞時,執(zhí)行另一個控制流,這樣能夠提高處理器核心的利用率,保證處理器核心一直在忙碌的狀態(tài)。
簡單來說,前一種方法是將經常訪問的數據保存在低延遲的緩存中,以減少訪問數據時的延遲,通過更快為處理器提供數據而提高性能,主要是目前主流的CPU采用。而后一種方法則盡量保證運算單元一直在忙碌工作,通過提高硬件的利用率以提高程序的吞吐量,這種方法目前主要為主流的GPU所采用。這兩種辦法沒有天然的壁壘,現代處理器(無論是CPU還是GPU)都采用了這兩種方法,區(qū)別只是更偏重于使用哪一種方法。
指令級并行
現代處理器具有許多和代碼性能優(yōu)化相關的特點,本節(jié)主要介紹以下部分:
-
指令級并行技術:主要有流水線、多發(fā)射、VLIW、亂序執(zhí)行、分支預測、超標量等技術;向量化:主要有SIMT和SIMD技術;
-
軟件開發(fā)人員如果了解現代多核向量處理器的這些特性,就能寫出性能效率超過一般開發(fā)人員的代碼。
多核
多核是指一個CPU模塊里包含多個核心,每個核心是一個獨立的計算整體,能夠執(zhí)行線程。現代處理器都是多核處理器,并且為多核使用場景所優(yōu)化。
多核的每個核心里面具有獨立的一級緩存,共享的或獨立的二級緩存,有些機器還有獨立或共享的三級/四級緩存,所有核心共享內存DRAM。通常第一級緩存是多核處理器的一個核心獨享的,而最后一級緩存(Last Level Cache, LLC)是多核處理器的所有核心共享的,大多數多核處理器的中間各層也是獨享的。如Intel Core i7處理器具有4~8個核,一些版本支持超線程,其中每個核心具有獨立的一級數據緩存和指令緩存、統(tǒng)一的二級緩存,并且所有的核心共享統(tǒng)一的三級緩存。
由于共享LLC,因此多線程或多進程程序在多核處理器上運行時,平均每個進程或線程占用的LLC緩存相比使用單線程時要小,這使得某些LLC或內存限制的應用的可擴展性看起來沒那么好。
由于多核處理器的每個核心都有獨立的一級、有時還有獨立的二級緩存,使用多線程/多進程程序時可利用這些每個核心獨享的緩存,這是超線性加速(指在多核處理器上獲得的性能收益超過核數)的原因之一。
多路與NUMA
硬件生產商還將多個多核芯片封裝在一起,稱之為多路,多路之間以一種介于共享和獨享之間的方式訪問內存。由于多路之間缺乏緩存,因此其通信代價通常不比DRAM低。一些多核也將內存控制器封裝進多核之中,直接和內存相連,以提供更高的訪存帶寬。
多路上還有兩個和內存訪問相關的概念:UMA(均勻內存訪問)和NUMA(非均勻內存訪問)。UMA是指多個核心訪問內存中的任何一個位置的延遲是一樣的,NUMA和UMA相對,核心訪問離其近(指訪問時要經過的中間節(jié)點數量少)的內存其延遲要小。如果程序的局部性很好,應當開啟硬件的NUMA支持。
硬件平臺
異構并行計算人員的能力最終需要通過運行在硬件上的程序來證明,這意味著異構并行計算編程人員對硬件的了解與其能力直接正相關。
目前大家接觸到處理器主要類型有:X86、ARM、GPU、FPGA等,它們的差別非常大。
X86
X86是Intel/AMD及相關廠商生產的一系列CPU處理器的統(tǒng)稱,也是大家日常所見。X86廣泛應用在桌面、服務器和云上。
SSE是 X86 向量多核處理器支持的向量指令,具有16個長度為128位(16個字節(jié))的向量寄存器,處理器能夠同時操作向量寄存器中的16個字節(jié),因此具有更高的帶寬和計算性能。AVX將SSE的向量長度延長為256位(32字節(jié)),并支持浮點乘加。現在,Intel已將向量長度增加到512位。由于采用顯式的SIMD編程模型,SSE/AVX的使用比較困難,范圍比較有限,使用其編程是一件比較痛苦的事情。
MIC是Intel的眾核架構,它擁有大約60左右個X86核心,每個核心包括向量單元和標量單元。向量單元包括32個長度為512位(64字節(jié))的向量寄存器,支持16個32位或8個64位數同時運算。目前的MIC的核為按序的,因此其性能優(yōu)化方法和基于亂序執(zhí)行的X86處理器核心有很大不同。
為了減小使用SIMD指令的復雜度,Intel寄希望于其編譯器的優(yōu)化能力,實際上Intel的編譯器向量化能力非常不錯,但是通常手工編寫的向量代碼性能會更好。在MIC上編程時,軟件開發(fā)人員的工作部分由顯式使用向量指令轉化為改寫C代碼和增加編譯制導語句以讓編譯器產生更好的向量指令。
另外,現代64位X86 CPU還利用SSE/AVX指令執(zhí)行標量浮點運算。
ARM
目前高端的智能手機、平板使用多個ARM核心和多個GPU核心。在人工智能時代,運行在移動設備上的應用對計算性能需求越來越大,而由于電池容量和功耗的原因,移動端不可能使用桌面或服務器高性能處理器,因此其對性能優(yōu)化具有很高需求。
目前市場上的高性能ARM處理器主要是32位的A7/A9/A15,已經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的一級數據緩存,四個核心最高可共享4MB統(tǒng)一的二級緩存。ARM 64支持的向量指令集稱為asimd,指令功能基本上兼容neon,但是寄存器和入棧規(guī)則具有明顯的不同,這意味著用neon寫的匯編代碼不能兼容asimd。
GPU
GPGPU是一種利用處理圖形任務的GPU來完成原本由CPU處理(與圖形處理無關的)的通用計算任務。由于現代GPU強大的并行處理能力和可編程流水線,令其可以處理非圖形數據。特別在面對單指令流多數據流(SIMD),且數據處理的運算量遠大于數據調度和傳輸的需要時,GPGPU在性能上大大超越了傳統(tǒng)的CPU應用程序。
GPU是為了渲染大量像素而設計的,并不關心某個像素的處理時間,而關注單位時間內能夠處理的像素數量,因此帶寬比延遲更重要。考慮到渲染的大量像素之間通常并不相關,因此GPU將大量的晶體管用于并行計算,故在同樣數目的晶體管上,具有比CPU更高的計算能力。
CPU和GPU的硬件架構設計思路有很多不同,因此其編程方法很不相同,很多使用CUDA的開發(fā)人員有機會重新回顧學習匯編語言的痛苦經歷。GPU的編程能力還不夠強,因此必須要對GPU特點有詳細了解,知道哪些能做,哪些不能做,才不會出現項目開發(fā)途中發(fā)覺有一個功能無法實現或實現后性能很差而導致項目中止的情況。
由于GPU將更大比例的晶體管用于計算,相對來說用于緩存的比例就比CPU小,因此通常局部性滿足CPU要求而不滿足GPU要求的應用不適合GPU。由于GPU通過大量線程的并行來隱藏訪存延遲,一些數據局部性非常差的應用反而能夠在GPU上獲得很好的收益。另外一些計算訪存比低的應用在GPU上很難獲得非常高的性能收益,但是這并不意味著在GPU實現會比在CPU上實現差。CPU+GPU異構計算需要在GPU和CPU之間傳輸數據,而這個帶寬比內存的訪問帶寬還要小,因此那種需要在GPU和CPU之間進行大量、頻繁數據交互的解決方案可能不適合在GPU上實現。
FPGA
FPGA是現場可編程門陣列的縮寫,隨著人工智能的流行,FPGA越來越得到產業(yè)界和學術界的重視。FPGA的主要特點在于其可被用戶或設計者重新進行配置,FPGA的配置可以通過硬件描述語言進行,常見的硬件描述語言有VHDL和verilog。
使用VHDL和Verilog編程被人詬病的一點在于其編程速度。隨著FPGA的流行,其編程速度越來越得到重視,各個廠商都推出了各自的OpenCL編程環(huán)境,雖然OpenCL降低了編程難度,但是其靈活性和性能也受到很大的限制。
傳統(tǒng)上,FPGA用于通信,現在FPGA也用于計算和做硬件電路設計驗證。目前主流的兩家FPGA廠商是Altera和Xilinx,Intel在2014年收購了Altera,估計在2018年,Intel X86+FPGA的異構產品會出現在市場。
編程環(huán)境
本節(jié)將詳細介紹目前主流的并行編程環(huán)境,既包括常見的指令級并行編程技術,也包括線程級并行編程技術和進程級技術。
Intel AVX/AVX512 Intrinsic
SSE/AVX是Intel推出的用以挖掘SIMD能力的匯編指令。由于匯編編程太難,后來Intel又給出了其內置函數版本(intrinsic)。
SSE/AVX指令支持數據并行,一個指令可以同時對多個數據進行操作,同時操作的數據個數由向量寄存器的長度和數據類型共同決定。如SSE4向量寄存器(xmm)長度為128位,即16個字節(jié)。如果操作float或int型數據,可同時操作4個,如果操作char型數據,可同時操作16個,而AVX向量寄存器(ymm)長度為256位,即32字節(jié)。
雖然SSE4/AVX指令向量寄存器的長度為128/256 位,但是同樣支持更小長度的向量操作。在64位程序下,SSE4/AVX 向量寄存器的個數是16個。
SSE指令要求對齊,主要是為了減少內存或緩存操作的次數。SSE4指令要求16字節(jié)對齊,而AVX指令要求32字節(jié)對齊。SSE4及以前的SSE指令不支持不對齊的讀寫操作,為了簡化編程和擴大應用范圍,AVX指令支持非對齊的讀寫。
ARM NEON Intrinsic
NEON是ARM處理器上的SIMD指令集擴展,由于ARM在移動端得到廣泛應用,目前NEON的使用也越來越普遍。
NEON支持數據并行,一個指令可同時對多個數據進行操作,同時操作的數據個數由向量寄存器的長度和數據類型共同決定。
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綁定,也被實現為庫。目前常用的GCC、ICC和Visual Studio都支持OpenMP。
OpenMP API包括以下幾個部分:一套編譯器偽指令,一套運行時函數,一些環(huán)境變量。OpenMP已經被大多數計算機硬件和軟件廠商所接受,成為事實上的標準。
OpenMP提供了對并行算法的高層的抽象描述,程序員通過在源代碼中插入各種pragma偽指令來指明自己的意圖,編譯器據此可以自動將程序并行化,并在必要之處加入同步互斥等通信。當選擇告訴編譯器忽略這些pragma或者編譯器不支持OpenMP時,程序又可退化為串行程序,代碼仍然可以正常運作,只是不能利用多線程來加速程序執(zhí)行。OpenMP提供的這種對于并行描述的高層抽象降低了并行編程的難度和復雜度,這樣程序員可以把更多的精力投入到并行算法本身,而非其具體實現細節(jié)。對基于數據并行的多線程程序設計,OpenMP是一個很好的選擇。同時,使用OpenMP也提供了更強的靈活性,可以適應不同的并行系統(tǒng)配置。線程粒度和負載均衡等是傳統(tǒng)并行程序設計中的難題,但在OpenMP中,OpenMP庫從程序員手中接管了這兩方面的部分工作。
OpenMP的設計目標為:標準、簡潔實用、使用方便、可移植。作為高層抽象,OpenMP并不適合需要復雜的線程間同步、互斥及對線程做精密控制的場合。OpenMP的另一個缺點是不能很好地在非共享內存系統(tǒng)(如計算機集群)上使用,在這樣的系統(tǒng)上,MPI更適合。
MPI
MPI(Message Passing Interface,消息傳遞接口)是一種消息傳遞編程環(huán)境。消息傳遞指用戶必須通過顯式地發(fā)送和接收消息來實現處理器間的數據交換。MPI定義了一組通信函數,以將數據從一個MPI進程發(fā)送到另一個MPI進程。在消息傳遞并行編程中,每個控制流均有自己獨立的地址空間,不同的控制流之間不能直接訪問彼此的地址空間,必須通過顯式的消息傳遞來實現。這種編程方式是大規(guī)模并行處理機(MPP)和機群(Cluster)采用的主要編程方式。實踐表明MPI的擴展性非常好,無論是在幾個節(jié)點的小集群上,還是在擁有成千上萬節(jié)點的大集群上,都能夠很好地應用。
由于消息傳遞程序設計要求用戶很好地分解問題,組織不同控制流間的數據交換,并行計算粒度大,特別適合于大規(guī)模可擴展并行算法。MPI是基于進程的并行環(huán)境。進程擁有獨立的虛擬地址空間和處理器調度,并且執(zhí)行相互獨立。MPI設計為支持通過網絡連接的機群系統(tǒng),且通過消息傳遞來實現通信,消息傳遞是MPI的最基本特色。
MPI是一種標準或規(guī)范的代表,而非特指某一個對它的具體實現,MPI成為分布式存儲編程模型的代表和事實上的標準。迄今為止,所有的并行計算機制造商都提供對MPI的支持,可以在網上免費得到MPI在不同并行計算機上的實現,一個正確的MPI程序可以不加修改地在所有的并行機上運行。
MPI只規(guī)定了標準并沒有給出實現,目前主要的實現有OpenMPI、Mvapich和MPICH,MPICH相對比較穩(wěn)定,而OpenMPI性能較好,Mvapich則主要是為了Infiniband 而設計。
MPI主要用于分布式存儲的并行機,包括所有主流并行計算機。但是MPI也可以用于共享存儲的并行機,如多核微處理器。編程實踐證明MPI的可擴展性非常好,其應用范圍從幾個機器的小集群到工業(yè)應用的上萬節(jié)點的工業(yè)級集群。MPI已在Windows上、所有主要的UNIX/Linux工作站上和所有主流的并行機上得到實現。使用MPI進行消息傳遞的C或Fortran并行程序可不加改變地運行在使用這些操作系統(tǒng)的工作站,以及各種并行機上。
OpenCL
OpenCL(Open Computing Language,開放計算語言),先由Apple設計,后來交由Khronos Group維護,是異構平臺并行編程的開放的標準,也是一個編程框架。Khronos Group是一個非盈利性技術組織,維護著多個開放的工業(yè)標準,并且得到了工業(yè)界的廣泛支持。OpenCL的設計借鑒了CUDA的成功經驗,并盡可能的支持多核CPU、GPU或其他加速器。OpenCL不但支持數據并行,還支持任務并行。同時OpenCL內建了多GPU并行的支持。這使得OpenCL的應用范圍比CUDA廣,但是目前OpenCL的API參數比較多(因為不支持函數重載),因此函數相對難以熟記。
OpenCL覆蓋的領域不但包括GPU,還包括其他的多種處理器芯片。到現在為止,支持OpenCL的硬件主要局限在CPU、GPU和FPGA上,目前提供OpenCL開發(fā)環(huán)境的主要有NVIDIA、AMD、ARM、Qualcomm、Altera和Intel,其中NVIDIA和AMD都提供了基于自家GPU的OpenCL實現,而AMD和Intel提供了基于各自CPU的OpenCL實現。目前它們的實現都不約而同地不支持自家產品以外的產品。由于硬件的不同,為了寫出性能優(yōu)異的代碼,可能會對可移植性造成影響。
OpenCL包含兩個部分:一是語言和API,二是架構。為了C程序員能夠方便、簡單地學習OpenCL,OpenCL只是給C99進行了非常小的擴展,以提供控制并行計算設備的API以及一些聲明計算內核的能力。軟件開發(fā)人員可以利用OpenCL開發(fā)并行程序,并且可獲得比較好的在多種設備上運行的可移植性。
OpenCL的目標是一次編寫,能夠在各種硬件條件下編譯的異構程序。由于各個平臺的軟硬件環(huán)境不同,高性能和平臺間兼容性會產生矛盾。而OpenCL允許各平臺使用自己硬件的特性,這又增大了這一矛盾。但是如果不允許各平臺使用自己的特性,卻會阻礙硬件的改進。
CUDA
CUDA認為系統(tǒng)上可以用于計算的硬件包含兩個部分:一個是CPU(稱為主機),一個是GPU(稱為設備),CPU控制/指揮GPU工作,GPU只是CPU的協(xié)處理器。目前CUDA只支持NVIDIA的GPU,而CPU由主機端編程環(huán)境負責。
CUDA是一種架構,也是一種語言。作為一種架構,它包括硬件的體系結構(G80、GT200、Fermi、Kepler)、硬件的CUDA計算能力及CUDA程序是如何映射到GPU上執(zhí)行;作為一種語言,CUDA提供了能夠利用GPU計算能力的方方面面的功能。CUDA的架構包括其編程模型、存儲器模型和執(zhí)行模型。CUDA C語言主要說明了如何定義計算內核(kernel)。CUDA架構在硬件結構、編程方式與CPU體系有極大不同,關于CUDA的具體細節(jié)讀者可參考CUDA相關的書籍。
CUDA以C/C++語法為基礎而設計,因此對熟悉C系列語言的程序員來說,CUDA的語法比較容易掌握。另外CUDA只對ANSI C進行了最小的擴展,以實現其關鍵特性:線程按照兩個層次進行組織、共享存儲器(shared memory)和柵欄(barrier)同步。
目前CUDA提供了兩種API以滿足不同人群的需要:運行時API和驅動API。運行時API基于驅動API構建,應用也可以使用驅動API。驅動API通過展示低層的概念提供了額外的控制。使用運行時API時,初始化、上下文和模塊管理都是隱式的,因此代碼更簡明。一般一個應用只需要使用運行時API或者驅動API中的一種,但是可以同時混合使用這兩種。筆者建議讀者優(yōu)先使用運行時API。
編程模式
和串行編程類似,并行編程也表現出模式的特征,并行編程模式是對某一類相似并行算法的解決方案的抽象。
和串行編程類似,并行編程對于不同應用場景也有不同的解決方法。由于并行的特殊性,串行的解決方法不能直接移植到并行環(huán)境上,因此需要重新思考、設計解決方法。并行編程模式大多數以數據和任務(過程化的操作)為中心來命名,也有一些是以編程方法來命名。
經過幾十年的發(fā)展,人們已經總結出一系列有效的并行模式,這些模型的適用場景各不相同。本節(jié)將簡要說明一些常用并行模式的特點、適用的場景和情況,具體的描述和實現則在后文詳細描述。
需要說明的是:從不同的角度看,一個并行應用可能屬于多個不同的并行模式,本質原因在于這些并行模式中存在重疊的地方。由于模式并非正交,因此適用于一種模式的辦法可能也適用于另一種模式,讀者需要舉一反三。
任務并行模式
任務并行是指每個控制流計算一件事或者計算多個并行任務的一個子任務,通常其粒度比較大且通信很少或沒有。
由于和人類的思維方式比較類似,任務并行比較受歡迎,且又易于在原有的串行代碼的基礎上實現。
數據并行模式
數據并行是指一條指令同時作用在多個數據上,那么可以將一個或多個數據分配給一個控制流計算,這樣多個控制流就可以并行,這要求待處理的數據具有平等的特性,即幾乎沒有需要特殊處理的數據。如果對每個數據或每個小數據集的處理時間基本相同,那么均勻分割數據即可;如果處理時間不同,就要考慮負載均衡問題。通常的做法是盡量使數據集的數目遠大于控制流數目,動態(tài)調度以基本達到負載均衡。
數據并行對控制的要求比較少,因此現代GPU利用這一特性,大量減少控制單元的比例,而將空出來的單元用于計算,這樣就能在同樣數量的晶體管上提供更多的原生計算能力。
基于進程的、基于線程的環(huán)境,甚至指令級并行環(huán)境都可以很好地應用在數據并行上。必要時可同時使用這三種編程環(huán)境,在進程中分配線程,在線程中使用指令級并行處理多個數據,這稱為混合計算。
異構并行計算領域現狀
在2005年之前,處理器通常提升頻率來提升計算性能,由于性能是可預測的,因此在硬件生產商、研究人員和軟件開發(fā)人員之間形成了一個良性循環(huán)。由于功耗的限制,處理器頻率不能接著提升,硬件生產商轉而使用向量化或多核技術。而以GPU計算為代表的異構并行計算的興起,加上人工智能的加持,異構并行計算從學術界走向工業(yè)界,獲得了大眾的認可。今天幾乎所有主流的處理器硬件生產商都已經在支持OpenCL,未來異構并行計算必將無處不在。今天無論上技術上還是市場上,它都獲得了長足的發(fā)展,筆者可以預計在未來的十年,異構并行計算必將進一步深入發(fā)展,并且在更多的行業(yè)產生價值。
技術進展
由于工藝制程的影響,芯片的集成度提升會越來越難,現在14nm已經量產,未來7nm也將很快。隨著制程技術到達極限,某些廠商通過制程領先一代的優(yōu)勢會消失,軟件公司會進一步重視異構并行計算人才的價值。而一些硬件廠商會進化成系統(tǒng)廠商,不再只是提供單純的硬件,進而會硬件和系統(tǒng)軟件一起提供,通過把軟件的成本轉嫁到硬件上來獲得利潤。
隨著異構并行計算影響力的提升,各個廠商和組織開發(fā)了一系列的技術,如WebCL、OpenVX、Vulkan等。這些技術進一步豐富和擴張了異構并行計算的領域,更促進了異構并行計算。今天基本上每家硬件和系統(tǒng)軟件公司都或多或少的涉及到了異構并行計算。
市場需求
隨著人工智能的興起,市場對異構并行計算領域人員的需求已經從傳統(tǒng)的科學計算、圖像處理轉到互聯網和新興企業(yè),目前人員缺口已經很大了,從51job和智聯招聘上能夠查到許多招聘信息。
由于目前還在行業(yè)的早期,異構并行計算開發(fā)人員的能力和老板期望和支出之間存在明顯的認知差距,再加上異構并行計算開發(fā)人員的工作成果往往需要和產品間接反應,故在多個層面上存在博弈。對于異構并行計算領域的人員來說,這個博弈有點不公平,因為職業(yè)特點要求異構并行計算領域的從業(yè)人員要比算法設計人員更了解算法實現細節(jié)、要比算法實現人員更了解算法的應用場景,再加上編程上的難度和需要付出更多的時間。但是由于行業(yè)剛形成不久,老板們并沒有意識到這一點,他們還只是把異構并行計算從業(yè)人員當成普通的開發(fā)者,矛盾就產生了。
隨著人工智能的興起,市場對異構并行計算從業(yè)人員的認知逐漸變得理性。越來越多的企業(yè)認識到:異構并行計算是人工智能企業(yè)最核心的競爭力之一。可以預見在不遠的將來,異構并行計算工程師會越來越吃香。
-
工程師
+關注
關注
59文章
1559瀏覽量
68167 -
異構
+關注
關注
0文章
37瀏覽量
12969 -
并行計算
+關注
關注
0文章
27瀏覽量
9390
原文標題:如何成為一名異構并行計算工程師
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論