OpenCL與異構平行計算

2021-07-27 13:34:36 字數 2754 閱讀 5346

原文:

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

(1)異構是指異構平行計算需要同時處理多個不同架構的計算平台的問 題,比如目前主流的異構平行計算平台x86+gpu、x86+fpga,以及目前正在研發中的arm/power+ gpu。

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

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

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

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

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

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程式設計的步驟。 首先給出實現流程,然後給出實現影象旋轉的c迴圈實現和opencl c kernel實現。

4.2.1 影象旋轉原理

影象旋轉是指把定義的影象繞某一點以逆時針或順時針方向旋轉一定的角度, 通常是指繞影象的中心以逆時針方向旋轉。假設影象的左上角為(l, t), 右下角為(r, b),則影象上任意點(x, y) 繞其中心(xcenter, ycenter)逆時針旋轉θ角度後, 新的座標位置(x',y')的計算公式為:

x′ = (x - xcenter) cosθ - (y - ycenter) sinθ + xcenter,

y′ = (x - xcenter) sinθ + (y - ycenter) cosθ + ycenter.

c**:

void rotate(

unsigned

char* inbuf,

unsigned

char* outbuf,

int w, int h,

float sintheta,

float costheta)

旋轉45度

上面的**在intel的opencl平台上進行了測試,處理器為雙核處理器,影象大小 為4288*3216,如果用迴圈的方式執行時間穩定在0.256s左右,而如果用opencl c kernel並行的方式,執行時間穩定在0.132秒左右。gpu的測試在nvidia的geforce g105m顯示卡 上進行,執行時間穩定在0.0810s左右。從迴圈的方式,雙核cpu並行以及gpu平行計算 已經可以看出,opencl程式設計的確能大大提高執行效率。

OpenCL與異構平行計算

異構平行計算包含兩個子概念 異構和並行。1 異構是指異構平行計算需要同時處理多個不同架構的計算平台的問 題,比如目前主流的異構平行計算平台x86 gpu x86 fpga,以及目前正在研發中的arm power gpu。2 並行是指異構平行計算主要採用並行的程式設計方式,無論是x86處理器,還是ar...

python平行計算 python平行計算

0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...

R與平行計算

本文在creative commons許可證下發布 什麼是平行計算?平行計算,準確地說應該包括高效能計算機和並行軟體兩個方面。不過,近年來隨著個人pc機,廉價機群,以及各種加速卡 nvidia gpu,intel xeon phi,fpga 的快速發展,現在個人電腦已經完全可以和過去的高效能計算機相...