天天看點

《OpenCL實戰》一1.6 架構和SDK

本節書摘來異步社群《opencl實戰》一書中的第1章,第1.6節,作者: 【美】matthew scarpino 譯者: 陳睿 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

盡管檔案matvec.c和 檔案matvec.cl中的代碼讓人眼前一亮,但如果沒有經過編譯、運作,這些代碼就更像花拳繡腿,沒有任何實際的作用。而為了能夠編譯、運作,你就必須要有一套相容opencl的開發工具。正如opencl标準所述,架構包含如下三個部分。

平台層——通過它來通路裝置,設定上下文

運作時——讓主機應用程式将核心和指令隊列發送到上下文中的裝置上

編譯器——建構含有可執行核心的程式

opencl工作組并沒有提供自己的設計架構。這就要求每個opencl相容裝置的生産商需要将opencl開發架構作為自己所釋出的sdk的一部分。由nvidia和amd分别釋出的opencl sdk是現在比較受歡迎的開發工具,兩款sdk都免費,并且包含用于建構opencl應用程式所需的庫函數檔案和工具。不管是面向nvidia或是amd的裝置進行開發設計,安裝sdk的過程都很簡單。附錄a給出了整個安裝的過程,并讨論了如何用這些sdk來建構應用程式。

opencl是一套針對高性能處理晶片建構并行程式的強大工具集。有了opencl,你不必費心學習針對裝置的程式設計語言,一次編寫程式,便可完成在所有的opencl相容硬體上的運作。

除了可移植性,opencl的優勢還在于向量處理和并行程式設計。在高性能計算中,向量是一種包含多個相同資料類型的資料結構。但是和其他的資料類型不同,當在向量上發生操作時,對向量中各個分量都是并行處理完成的。并行程式設計意味着,主機應用程式可以控制多個裝置上的資料處理。opencl可以将不同的任務發送到不同的裝置上,這種處理方式也被稱為任務并行程式設計。如果能夠得到有效利用,向量運算和任務并行程式設計能夠提供較之于标量、單處理器系統在運算性能上的巨大提升。

opencl代碼包含兩個部分:在主機上運作的代碼以及在一個或多個裝置上運作的代碼。主機代碼可以用一般的c或c++來編寫,用來建立管理“主機-裝置”通信的資料結構。主機選擇相應的函數(被稱為核心),放到指令隊列之中,然後發送到裝置上。與主機代碼不同,核心代碼使用的是opencl标準中所定義的高性能功能。

在這些新的資料結構和函數操作的閃耀之下,opencl會顯得親和力不夠。但當你自己動手開始編寫程式之後,就會發現它和一般的c和c++程式編寫并沒有多大不同。一旦能夠熟練掌握基于向量的并行程式設計,寫出自己的應用程式,你就再也不會留戀單核程式設計的日子了。

下一章,我們将開始opencl程式設計的探索之旅,介紹編寫主機應用程式所需的主要資料結構。

[1] 譯者注:也就是gpu-gpu或者cpu-gpu,這種協同完成任務的計算架構。

[2] 譯者注:對這句話以及後文的“一次編寫,各裝置上運作的了解”的比較,其實想讨論的是language-neutral(語言無關), platform-neutral(平台無關)的問題。因為opencl程式比較的底層,是以隻是language-neutral層面上的。拿opencl和jvm做對比是有意義的,兩者所起的作用都是隔開進階語言和彙編語言的直接對話。

[3] 譯者注:isa(指令集體系架構)是計算機體系架構設計的有機組成,二者之間的緊密關系決定,即使是完成的功能相同,但指令集可能沒有共同之處。

[4] 譯者注:作者并沒有在concurrency(并發)和parallelism(并行)兩個概念之間的差別上做過多的解釋,而兩者之間的差別也看起來比較隐晦,歸結起來,并發就是兩個任務交替執行,但不一定是同一時間點上同時執行(例如單核機器上的多任務處理),而并行就是多任務同時進行(例如多核處理器上的多任務處理),前者是作業系統層面上的,而後者是體系結構層面上的。