1. 程式人生 > >OpenCL與異構平行計算

OpenCL與異構平行計算

由於人工智慧、深度學習和大資料處理隨著移動互聯的興起,特別是對於圖片、視訊、語音等非結構化資料的挖掘、識別等以智慧演算法為核心的應用的興起,“異構平臺”成為各大網際網路廠商追逐資料探勘平臺先進性的標誌之一。與CUDA只能執行在NVIDIA GPU上相比,OpenCL由Khronos國際標準組織釋出與維護,是一種針對通用平行計算的開放行業標準和跨廠商解決方案,可以實現“一次編寫,多環境執行”,大大提高開發效率。OpenCL正在成為異構處理器的效能調優利器和開發語言。

異構平行計算包含兩個子概念:異構和並行。

(1)異構是指異構平行計算需要同時處理多個不同架構的計算平臺的問 題,比如目前主流的異構平行計算平臺X86+GPU、X86+FPGA,以及目前正在研發中的ARM/Power+ GPU。

(2)並行是指異構平行計算主要採用並行的程式設計方式,無論是X86處理器,還是ARM和GPU處理器以及DSP,這所有的處理器都是多核向量處理器,要發揮多種處理器混合平臺的效能也必須要採用並行的程式設計方式。

異構平行計算的出現緩解了處理器發展面臨的兩個主要問題:效能問題和功耗問題。

(1)由於不同的硬體適合處理不同的計算問題。合理地將不同型別的計算分發到異構平臺的不同硬體上能夠獲得更好的計算效能,比如將需要短時間執行的序列計算分發給X86,而將需要長時間執行的平行計算部分分發給GPU。

(2)由於採用為特定應用優化的處理器。處理器設計可以依據應用的具體 特點來優化,故功耗方面也會獲得更好的結果。

在效能和功耗都比較重要的情況下,如何衡量處理器的效能就變得複雜起來,對於計算效能至上的應用來說,效能更為重要。而對於功耗有特殊要求的應用來說,效能功耗比(每瓦功耗能夠支撐的處理器計算能力)可能更為合適。

OpenCL全稱為Open Computing Language(開放計算語言),先由Apple設計,後來交由Khronos Group維護,是異構平臺並行程式設計的開放的標準,也是一個程式設計框架。KhronosGroup是一個非盈利性技術組織,維護著多個開放的工業標準,並且得到了業界的廣泛支援。OpenCL 的設計借鑑了CUDA 的成功經驗,並儘可能地支援多核 CPU、GPU或其他加速器。OpenCL 不但支援資料並行,還支援任務並行。同時 OpenCL 內建了多 GPU 並行的支援。這使得 OpenCL 的應用範圍比 CUDA 廣。為了能適用於一些更低端的嵌入式裝置(比如DSP+微控制器這種環境),OpenCLAPI基於純C語言進行編寫,所以OpenCL API的函式名比較長,引數也比較多(因為不支援函式過載),因此函式名相對難以熟記。不過,藉助像Xcode、VisualStudio等現代化的整合開發環境,利用程式碼智慧感知自動補全,其實開發人員也不需要刻意去死背OpenCL的API。

OpenCL覆蓋的領域不但包括GPU,還包括其他的多種處理器晶片。到現在為止,支援OpenCL的硬體主要侷限在CPU、GPU、DSP和FPGA上,目前在桌面端和伺服器端提供OpenCL開發環境的主要有Apple、NVIDIA、AMD、ARM和Intel,其中Apple提供了一個獨立的OpenCL框架並與自家的OSX系統完整地融合在一起;NVIDIA和AMD都提供了基於自家GPU的OpenCL在Windows和Linux上的實現,而AMD和Intel提供了基於各自CPU在Windows和Linux上的OpenCL實現。目前除了OSX系統上,NVDIA、AMD與Intel提供的OpenCL實現都不約而同地不支援自家產品以外的產品。由於硬體的不同,為了寫出效能優異的程式碼,可能需要為不同的平臺做相應的優化,這會對可移植性造成影響,這個需要權衡。

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

為了使得OpenCL程式能夠在各種硬體平臺上執行,OpenCL提供了一個硬體平臺層。同時各種不同裝置上的儲存器並不相同,相應地,OpenCL提供了一個儲存器抽象模型。與CUDA相似,OpenCL還提供了執行模型和程式設計模型。

OpenCL不但包括一門程式語言,還包括一個完整的並行程式設計框架,通過程式語言、 API 以及執行時系統來支援軟體在整個平臺上的執行。總的來說,OpenCL具有以下特點:

❑ 高效能:OpenCL是一個底層的API,它能夠很好的對映到更底層的硬體上,充分發揮硬體中各個層次的並行性,故能夠獲得很好的效能。

❑ 適用性強:OpenCL是一個抽象的API,它抽象了當前主流的異構平行計算硬體的不同架構的共性,同時又兼顧了不同的硬體的特點,因此具有廣泛的適用性。

❑ 開放:OpenCL是由開放組織開發、維護的標準,不會被一家廠商所控制,故能夠獲得最廣泛的硬體支援,比如AMD、Intel、NVIDIA、ARM、Qualcomm和聯發科等都已經或正在其硬體上支援OpenCL。另外,還有像Altera等FPGA廠商也提供了OpenCL的SDK,並且能支援到當前比較新的OpenCL2.0標準。

❑ 無替代選項:無論是NVIDIA的CUDA,還是微軟的C++ AMP和Google的RenderScript,都沒有獲得大量廠商的支援,只有OpenCL得到了幾乎所有相關的主流硬體廠商的支援。

由於具有高效能、適用性強、開放和沒有替代方案,OpenCL在未來必將在異構平行計算領域佔有不可動搖的地位,甚至一統異構平行計算領域。

近十年來,異構平行計算平臺、標準如雨後春筍般的出現,發展也是一日千里。從私有的CUDA、C++ AMP、Direct3D、Metal API,到開放的OpenCL、OpenACC、Vulkan。而老牌共享儲存器程式設計環境OpenMP和分散式程式設計環境MPI也增加了對異構計算的支援,這些無一不顯示著這個領域現在的輝煌,這是一個異構計算正在百花齊放的時代,在短期內這個領域依舊會呈現百花齊放的形態,甚至還會有新的平臺、新的標準出現。而長期來說,最有可能笑到最後的,必定是OpenCL。

今天異構平行計算已經得到充分的發展並且還在進一步快速發展中,OpenCL和其他的異構平行計算工具已經應用到許多影象處理、視訊處理及科學計算專案上,而這些工具自身也在快速進化中。近兩年,許多科學計算以外的行業和領域(如網際網路行業)正在應用異構平行計算來加快研究和產品化的步伐。計算的未來是異構並行的,異構並行的概念、應用在計算機及相關領域會越來越廣。