1. 程式人生 > >異構平行計算工程師

異構平行計算工程師

隨著深度學習(人工智慧)的火熱,異構平行計算越來越受到業界的重視。從開始談深度學習必談GPU,到談深度學習必談計算力。計算力不但和具體的硬體有關,且和能夠發揮硬體能力的人所擁有的水平(即異構平行計算能力)高低有關。

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

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

對於一個異構平行計算工程師的日常來說,他的工作涉及的方面很廣,有硬體,有軟體,有系統,有溝通;是一個對硬實力和軟實力都有非常高要求的崗位。

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

異構平行計算工程師技能樹

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

  1. 處理器體系,處理器如何執行具體的指令;
  2. 系統平臺方面,這又可以分成多個細的主題,包括硬體的特點,軟體程式設計相關的平臺和基礎設施。

讀者可以從圖1具體瞭解到異構平行計算工程師需要掌握的技能和知識。

圖片描述

圖1 異構平行計算工程師技能樹

異構平行計算工程師成長詳解

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

為了幫助讀者更好地理解,本文會使用先硬體後軟體的方式介紹。和異構並行工程師相關性最大的硬體知識即處理器特性,我們從這一點開始。

現代處理器的特性

從系統啟動到終止,處理器一條接著一條地執行儲存器中的指令,站在使用者的角度來看就好像是前一條指令執行完之後下一條指令才開始執行,是一個完完全全的序列過程。實際上,現代處理器利用了指令級並行技術,同一時刻存在著多條指令同時被執行,並且處理器執行指令的順序無需和彙編程式碼給出的指令順序完全一致,編譯器和處理器只需要保證最終結果一致即可,這類處理器稱為“亂序執行處理器”。而嚴格按照順序一次執行一條指令,只有前一條執行完才開始執行後一條指令的處理器,稱為“按序處理器”。而即使是在按序執行處理器上,編譯器也可以對原始碼進行類似的優化,以提高程式效能。對於一個特定的流水線來說,現代亂序執行處理器只保證指令執行階段可以亂序,而其他階段通常還是順序的。目前主流的CPU和GPU,甚至DSP,無論是在伺服器端,還是在移動端基本上都已經是亂序執行處理器了。

今天大多數處理器都是哈佛架構的變體,其根本特徵是在程式執行時把指令和資料分開儲存,程式設計師通常可以忽略指令儲存,實際上異構平行計算更關注的是:計算和資料訪問。

計算和訪存

以作者正在使用的處理器E5-2680v3來說,其主頻為2.6GHz,支援FMA指令集,其單核單精度浮點計算能力為2.6*2*8*2=83.2 GFlops;而單通道記憶體的頻寬大約為20GB/s。主流處理器的處理速度遠快於記憶體讀寫速度,為了減小訪問資料時的延遲,現代主流處理器主要採用了兩種方式:

  • 利用程式訪問資料的區域性性特點:採用了一系列小而快的快取儲存正在訪問和將要被訪問的資料,如果資料會被多次訪問且資料能夠被快取容納,則能夠以近似於記憶體的價格獲得近似於快取的速度;
  • 利用程式的並行性:在一個控制流由於高延遲的操作而阻塞時,執行另一個控制流,這樣能夠提高處理器核心的利用率,保證處理器核心一直在忙碌的狀態。

簡單來說,前一種方法是將經常訪問的資料儲存在低延遲的快取中,以減少訪問資料時的延遲,通過更快為處理器提供資料而提高效能,主要是目前主流的CPU採用。而後一種方法則儘量保證運算單元一直在忙碌工作,通過提高硬體的利用率以提高程式的吞吐量,這種方法目前主要為主流的GPU所採用。這兩種辦法沒有天然的壁壘,現代處理器(無論是CPU還是GPU)都採用了這兩種方法,區別只是更偏重於使用哪一種方法。

指令級並行

現代處理器具有許多和程式碼效能優化相關的特點,本節主要介紹以下部分:

  • 指令級並行技術:主要有流水線、多發射、VLIW、亂序執行、分支預測、超標量等技術;
    向量化:主要有SIMT和SIMD技術;
  • 軟體開發人員如果瞭解現代多核向量處理器的這些特性,就能寫出效能效率超過一般開發人員的程式碼。

多核

多核是指一個CPU模組裡包含多個核心,每個核心是一個獨立的計算整體,能夠執行執行緒。現代處理器都是多核處理器,並且為多核使用場景所優化。

多核的每個核心裡面具有獨立的一級快取,共享的或獨立的二級快取,有些機器還有獨立或共享的三級/四級快取,所有核心共享記憶體DRAM。通常第一級快取是多核處理器的一個核心獨享的,而最後一級快取(Last Level Cache, LLC)是多核處理器的所有核心共享的,大多數多核處理器的中間各層也是獨享的。如Intel Core i7處理器具有4~8個核,一些版本支援超執行緒,其中每個核心具有獨立的一級資料快取和指令快取、統一的二級快取,並且所有的核心共享統一的三級快取。

由於共享LLC,因此多執行緒或多程序程式在多核處理器上執行時,平均每個程序或執行緒佔用的LLC快取相比使用單執行緒時要小,這使得某些LLC或記憶體限制的應用的可擴充套件性看起來沒那麼好。

由於多核處理器的每個核心都有獨立的一級、有時還有獨立的二級快取,使用多執行緒/多程序程式時可利用這些每個核心獨享的快取,這是超線性加速(指在多核處理器上獲得的效能收益超過核數)的原因之一。

多路與NUMA

硬體生產商還將多個多核晶片封裝在一起,稱之為多路,多路之間以一種介於共享和獨享之間的方式訪問記憶體。由於多路之間缺乏快取,因此其通訊代價通常不比DRAM低。一些多核也將記憶體控制器封裝進多核之中,直接和記憶體相連,以提供更高的訪存頻寬。

多路上還有兩個和記憶體訪問相關的概念:UMA(均勻記憶體訪問)和NUMA(非均勻記憶體訪問)。UMA是指多個核心訪問記憶體中的任何一個位置的延遲是一樣的,NUMA和UMA相對,核心訪問離其近(指訪問時要經過的中間節點數量少)的記憶體其延遲要小。如果程式的區域性性很好,應當開啟硬體的NUMA支援。

硬體平臺

異構平行計算人員的能力最終需要通過執行在硬體上的程式來證明,這意味著異構平行計算程式設計人員對硬體的瞭解與其能力直接正相關。

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

X86

X86是Intel/AMD及相關廠商生產的一系列CPU處理器的統稱,也是大家日常所見。X86廣泛應用在桌面、伺服器和雲上。

SSE是 X86 向量多核處理器支援的向量指令,具有16個長度為128位(16個位元組)的向量暫存器,處理器能夠同時操作向量暫存器中的16個位元組,因此具有更高的頻寬和計算效能。AVX將SSE的向量長度延長為256位(32位元組),並支援浮點乘加。現在,Intel已將向量長度增加到512位。由於採用顯式的SIMD程式設計模型,SSE/AVX的使用比較困難,範圍比較有限,使用其程式設計是一件比較痛苦的事情。

MIC是Intel的眾核架構,它擁有大約60左右個X86核心,每個核心包括向量單元和標量單元。向量單元包括32個長度為512位(64位元組)的向量暫存器,支援16個32位或8個64位數同時運算。目前的MIC的核為按序的,因此其效能優化方法和基於亂序執行的X86處理器核心有很大不同。

為了減小使用SIMD指令的複雜度,Intel寄希望於其編譯器的優化能力,實際上Intel的編譯器向量化能力非常不錯,但是通常手工編寫的向量程式碼效能會更好。在MIC上程式設計時,軟體開發人員的工作部分由顯式使用向量指令轉化為改寫C程式碼和增加編譯製導語句以讓編譯器產生更好的向量指令。

另外,現代64位X86 CPU還利用SSE/AVX指令執行標量浮點運算。

ARM

目前高階的智慧手機、平板使用多個ARM核心和多個GPU核心。在人工智慧時代,執行在移動裝置上的應用對計算效能需求越來越大,而由於電池容量和功耗的原因,移動端不可能使用桌面或伺服器高效能處理器,因此其對效能優化具有很高需求。

目前市場上的高效能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個位元組,因此使用向量指令可獲得更高的效能和頻寬。ARM A72 MP是一個多核向量處理器,其最多具有4個核心,每個核心獨享32KB的一級資料快取,四個核心最高可共享4MB統一的二級快取。ARM 64支援的向量指令集稱為asimd,指令功能基本上相容neon,但是暫存器和入棧規則具有明顯的不同,這意味著用neon寫的彙編程式碼不能相容asimd。

GPU

GPGPU是一種利用處理圖形任務的GPU來完成原本由CPU處理(與圖形處理無關的)的通用計算任務。由於現代GPU強大的並行處理能力和可程式設計流水線,令其可以處理非圖形資料。特別在面對單指令流多資料流(SIMD),且資料處理的運算量遠大於資料排程和傳輸的需要時,GPGPU在效能上大大超越了傳統的CPU應用程式。

GPU是為了渲染大量畫素而設計的,並不關心某個畫素的處理時間,而關注單位時間內能夠處理的畫素數量,因此頻寬比延遲更重要。考慮到渲染的大量畫素之間通常並不相關,因此GPU將大量的電晶體用於平行計算,故在同樣數目的電晶體上,具有比CPU更高的計算能力。

CPU和GPU的硬體架構設計思路有很多不同,因此其程式設計方法很不相同,很多使用CUDA的開發人員有機會重新回顧學習組合語言的痛苦經歷。GPU的程式設計能力還不夠強,因此必須要對GPU特點有詳細瞭解,知道哪些能做,哪些不能做,才不會出現專案開發途中發覺有一個功能無法實現或實現後效能很差而導致專案中止的情況。

由於GPU將更大比例的電晶體用於計算,相對來說用於快取的比例就比CPU小,因此通常區域性性滿足CPU要求而不滿足GPU要求的應用不適合GPU。由於GPU通過大量執行緒的並行來隱藏訪存延遲,一些資料區域性性非常差的應用反而能夠在GPU上獲得很好的收益。另外一些計算訪存比低的應用在GPU上很難獲得非常高的效能收益,但是這並不意味著在GPU實現會比在CPU上實現差。CPU+GPU異構計算需要在GPU和CPU之間傳輸資料,而這個頻寬比記憶體的訪問頻寬還要小,因此那種需要在GPU和CPU之間進行大量、頻繁資料互動的解決方案可能不適合在GPU上實現。

FPGA

FPGA是現場可程式設計門陣列的縮寫,隨著人工智慧的流行,FPGA越來越得到產業界和學術界的重視。FPGA的主要特點在於其可被使用者或設計者重新進行配置,FPGA的配置可以通過硬體描述語言進行,常見的硬體描述語言有VHDL和verilog。

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

傳統上,FPGA用於通訊,現在FPGA也用於計算和做硬體電路設計驗證。目前主流的兩家FPGA廠商是Altera和Xilinx,Intel在2014年收購了Altera,估計在2018年,Intel X86+FPGA的異構產品會出現在市場。

程式設計環境

本節將詳細介紹目前主流的並行程式設計環境,既包括常見的指令級並行程式設計技術,也包括執行緒級並行程式設計技術和程序級技術。

Intel AVX/AVX512 Intrinsic

SSE/AVX是Intel推出的用以挖掘SIMD能力的彙編指令。由於彙編程式設計太難,後來Intel又給出了其內建函式版本(intrinsic)。

SSE/AVX指令支援資料並行,一個指令可以同時對多個數據進行操作,同時操作的資料個數由向量暫存器的長度和資料型別共同決定。如SSE4向量暫存器(xmm)長度為128位,即16個位元組。如果操作float或int型資料,可同時操作4個,如果操作char型資料,可同時操作16個,而AVX向量暫存器(ymm)長度為256位,即32位元組。

雖然SSE4/AVX指令向量暫存器的長度為128/256 位,但是同樣支援更小長度的向量操作。在64位程式下,SSE4/AVX 向量暫存器的個數是16個。

SSE指令要求對齊,主要是為了減少記憶體或快取操作的次數。SSE4指令要求16位元組對齊,而AVX指令要求32位元組對齊。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的簡稱,是一個基於共享儲存器的並行環境。OpenMP支援C/C++/Fortran繫結,也被實現為庫。目前常用的GCC、ICC和Visual Studio都支援OpenMP。

OpenMP API包括以下幾個部分:一套編譯器偽指令,一套執行時函式,一些環境變數。OpenMP已經被大多數計算機硬體和軟體廠商所接受,成為事實上的標準。

OpenMP提供了對並行演算法的高層的抽象描述,程式設計師通過在原始碼中插入各種pragma偽指令來指明自己的意圖,編譯器據此可以自動將程式並行化,並在必要之處加入同步互斥等通訊。當選擇告訴編譯器忽略這些pragma或者編譯器不支援OpenMP時,程式又可退化為序列程式,程式碼仍然可以正常運作,只是不能利用多執行緒來加速程式執行。OpenMP提供的這種對於並行描述的高層抽象降低了並行程式設計的難度和複雜度,這樣程式設計師可以把更多的精力投入到並行演算法本身,而非其具體實現細節。對基於資料並行的多執行緒程式設計,OpenMP是一個很好的選擇。同時,使用OpenMP也提供了更強的靈活性,可以適應不同的並行系統配置。執行緒粒度和負載均衡等是傳統並行程式設計中的難題,但在OpenMP中,OpenMP庫從程式設計師手中接管了這兩方面的部分工作。

OpenMP的設計目標為:標準、簡潔實用、使用方便、可移植。作為高層抽象,OpenMP並不適合需要複雜的執行緒間同步、互斥及對執行緒做精密控制的場合。OpenMP的另一個缺點是不能很好地在非共享記憶體系統(如計算機叢集)上使用,在這樣的系統上,MPI更適合。

MPI

MPI(Message Passing Interface,訊息傳遞介面)是一種訊息傳遞程式設計環境。訊息傳遞指使用者必須通過顯式地傳送和接收訊息來實現處理器間的資料交換。MPI定義了一組通訊函式,以將資料從一個MPI程序傳送到另一個MPI程序。在訊息傳遞並行程式設計中,每個控制流均有自己獨立的地址空間,不同的控制流之間不能直接訪問彼此的地址空間,必須通過顯式的訊息傳遞來實現。這種程式設計方式是大規模並行處理機(MPP)和機群(Cluster)採用的主要程式設計方式。實踐表明MPI的擴充套件性非常好,無論是在幾個節點的小叢集上,還是在擁有成千上萬節點的大叢集上,都能夠很好地應用。

由於訊息傳遞程式設計要求使用者很好地分解問題,組織不同控制流間的資料交換,平行計算粒度大,特別適合於大規模可擴充套件並行演算法。MPI是基於程序的並行環境。程序擁有獨立的虛擬地址空間和處理器排程,並且執行相互獨立。MPI設計為支援通過網路連線的機群系統,且通過訊息傳遞來實現通訊,訊息傳遞是MPI的最基本特色。

MPI是一種標準或規範的代表,而非特指某一個對它的具體實現,MPI成為分散式儲存程式設計模型的代表和事實上的標準。迄今為止,所有的平行計算機制造商都提供對MPI的支援,可以在網上免費得到MPI在不同平行計算機上的實現,一個正確的MPI程式可以不加修改地在所有的並行機上執行。

MPI只規定了標準並沒有給出實現,目前主要的實現有OpenMPI、Mvapich和MPICH,MPICH相對比較穩定,而OpenMPI效能較好,Mvapich則主要是為了Infiniband 而設計。

MPI主要用於分散式儲存的並行機,包括所有主流平行計算機。但是MPI也可以用於共享儲存的並行機,如多核微處理器。程式設計實踐證明MPI的可擴充套件性非常好,其應用範圍從幾個機器的小叢集到工業應用的上萬節點的工業級叢集。MPI已在Windows上、所有主要的UNIX/Linux工作站上和所有主流的並行機上得到實現。使用MPI進行訊息傳遞的C或Fortran並行程式可不加改變地執行在使用這些作業系統的工作站,以及各種並行機上。

OpenCL

OpenCL(Open Computing Language,開放計算語言),先由Apple設計,後來交由Khronos Group維護,是異構平臺並行程式設計的開放的標準,也是一個程式設計框架。Khronos Group是一個非盈利性技術組織,維護著多個開放的工業標準,並且得到了工業界的廣泛支援。OpenCL的設計借鑑了CUDA的成功經驗,並儘可能的支援多核CPU、GPU或其他加速器。OpenCL不但支援資料並行,還支援任務並行。同時OpenCL內建了多GPU並行的支援。這使得OpenCL的應用範圍比CUDA廣,但是目前OpenCL的API引數比較多(因為不支援函式過載),因此函式相對難以熟記。

OpenCL覆蓋的領域不但包括GPU,還包括其他的多種處理器晶片。到現在為止,支援OpenCL的硬體主要侷限在CPU、GPU和FPGA上,目前提供OpenCL開發環境的主要有NVIDIA、AMD、ARM、Qualcomm、Altera和Intel,其中NVIDIA和AMD都提供了基於自家GPU的OpenCL實現,而AMD和Intel提供了基於各自CPU的OpenCL實現。目前它們的實現都不約而同地不支援自家產品以外的產品。由於硬體的不同,為了寫出效能優異的程式碼,可能會對可移植性造成影響。

OpenCL包含兩個部分:一是語言和API,二是架構。為了C程式設計師能夠方便、簡單地學習OpenCL,OpenCL只是給C99進行了非常小的擴充套件,以提供控制平行計算裝置的API以及一些宣告計算核心的能力。軟體開發人員可以利用OpenCL開發並行程式,並且可獲得比較好的在多種裝置上執行的可移植性。

OpenCL的目標是一次編寫,能夠在各種硬體條件下編譯的異構程式。由於各個平臺的軟硬體環境不同,高效能和平臺間相容性會產生矛盾。而OpenCL允許各平臺使用自己硬體的特性,這又增大了這一矛盾。但是如果不允許各平臺使用自己的特性,卻會阻礙硬體的改進。

CUDA

CUDA認為系統上可以用於計算的硬體包含兩個部分:一個是CPU(稱為主機),一個是GPU(稱為裝置),CPU控制/指揮GPU工作,GPU只是CPU的協處理器。目前CUDA只支援NVIDIA的GPU,而CPU由主機端程式設計環境負責。

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

CUDA以C/C++語法為基礎而設計,因此對熟悉C系列語言的程式設計師來說,CUDA的語法比較容易掌握。另外CUDA只對ANSI C進行了最小的擴充套件,以實現其關鍵特性:執行緒按照兩個層次進行組織、共享儲存器(shared memory)和柵欄(barrier)同步。

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

程式設計模式

和序列程式設計類似,並行程式設計也表現出模式的特徵,並行程式設計模式是對某一類相似並行演算法的解決方案的抽象。

和序列程式設計類似,並行程式設計對於不同應用場景也有不同的解決方法。由於並行的特殊性,序列的解決方法不能直接移植到並行環境上,因此需要重新思考、設計解決方法。並行程式設計模式大多數以資料和任務(過程化的操作)為中心來命名,也有一些是以程式設計方法來命名。

經過幾十年的發展,人們已經總結出一系列有效的並行模式,這些模型的適用場景各不相同。本節將簡要說明一些常用並行模式的特點、適用的場景和情況,具體的描述和實現則在後文詳細描述。

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

任務並行模式

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

由於和人類的思維方式比較類似,任務並行比較受歡迎,且又易於在原有的序列程式碼的基礎上實現。

資料並行模式

資料並行是指一條指令同時作用在多個數據上,那麼可以將一個或多個數據分配給一個控制流計算,這樣多個控制流就可以並行,這要求待處理的資料具有平等的特性,即幾乎沒有需要特殊處理的資料。如果對每個資料或每個小資料集的處理時間基本相同,那麼均勻分割資料即可;如果處理時間不同,就要考慮負載均衡問題。通常的做法是儘量使資料集的數目遠大於控制流數目,動態排程以基本達到負載均衡。

資料並行對控制的要求比較少,因此現代GPU利用這一特性,大量減少控制單元的比例,而將空出來的單元用於計算,這樣就能在同樣數量的電晶體上提供更多的原生計算能力。

基於程序的、基於執行緒的環境,甚至指令級並行環境都可以很好地應用在資料並行上。必要時可同時使用這三種程式設計環境,在程序中分配執行緒,線上程中使用指令級並行處理多個數據,這稱為混合計算。

異構平行計算領域現狀

在2005年之前,處理器通常提升頻率來提升計算效能,由於效能是可預測的,因此在硬體生產商、研究人員和軟體開發人員之間形成了一個良性迴圈。由於功耗的限制,處理器頻率不能接著提升,硬體生產商轉而使用向量化或多核技術。而以GPU計算為代表的異構平行計算的興起,加上人工智慧的加持,異構平行計算從學術界走向工業界,獲得了大眾的認可。今天幾乎所有主流的處理器硬體生產商都已經在支援OpenCL,未來異構平行計算必將無處不在。今天無論上技術上還是市場上,它都獲得了長足的發展,筆者可以預計在未來的十年,異構平行計算必將進一步深入發展,並且在更多的行業產生價值。

技術進展

由於工藝製程的影響,晶片的整合度提升會越來越難,現在14nm已經量產,未來7nm也將很快。隨著製程技術到達極限,某些廠商通過製程領先一代的優勢會消失,軟體公司會進一步重視異構平行計算人才的價值。而一些硬體廠商會進化成系統廠商,不再只是提供單純的硬體,進而會硬體和系統軟體一起提供,通過把軟體的成本轉嫁到硬體上來獲得利潤。

隨著異構平行計算影響力的提升,各個廠商和組織開發了一系列的技術,如WebCL、OpenVX、Vulkan等。這些技術進一步豐富和擴張了異構平行計算的領域,更促進了異構平行計算。今天基本上每家硬體和系統軟體公司都或多或少的涉及到了異構平行計算。

市場需求

隨著人工智慧的興起,市場對異構平行計算領域人員的需求已經從傳統的科學計算、影象處理轉到網際網路和新興企業,目前人員缺口已經很大了,從51job和智聯招聘上能夠查到許多招聘資訊。

由於目前還在行業的早期,異構平行計算開發人員的能力和老闆期望和支出之間存在明顯的認知差距,再加上異構平行計算開發人員的工作成果往往需要和產品間接反應,故在多個層面上存在博弈。對於異構平行計算領域的人員來說,這個博弈有點不公平,因為職業特點要求異構平行計算領域的從業人員要比演算法設計人員更瞭解演算法實現細節、要比演算法實現人員更瞭解演算法的應用場景,再加上程式設計上的難度和需要付出更多的時間。但是由於行業剛形成不久,老闆們並沒有意識到這一點,他們還只是把異構平行計算從業人員當成普通的開發者,矛盾就產生了。

隨著人工智慧的興起,市場對異構平行計算從業人員的認知逐漸變得理性。越來越多的企業認識到:異構平行計算是人工智慧企業最核心的競爭力之一。可以預見在不遠的將來,異構平行計算工程師會越來越吃香。

作者簡介:
劉文志,商湯科技高效能運算部門負責人,碩士畢業於中國科學院研究生院。曾於2011年至2014年間於英偉達擔任平行計算工程師。後就職百度深度學習研究院高階研發工程師,負責異構計算組日常工作。
責編:何永燦([email protected]
本文為《程式設計師》原創文章,未經允許不得轉載,更多精彩文章請訂閱《程式設計師》


訂閱程式設計師(含iOS、Android及印刷版)請訪問 http://dingyue.programmer.com.cn
這裡寫圖片描述

訂閱諮詢:

  • 線上諮詢(QQ):2251809102
  • 電話諮詢:010-64351436
  • 更多訊息,歡迎關注“程式設計師編輯部

隨著深度學習(人工智慧)的火熱,異構平行計算越來越受到業界的重視。從開始談深度學習必談GPU,到談深度學習必談計算力。計算力不但和具體的硬體有關,且和能夠發揮硬體能力的人所擁有的水平(即異構平行計算能力)高低有關。