基於ubuntu平臺 介紹和配置OpenCL
Reference Resources:https://blog.csdn.net/wd1603926823/article/details/79139172#commentBox
(Intel核顯--OpenCL環境--Linux)
https://blog.csdn.net/chifredhong/article/details/73931017( OpenCL淺析(1)-GPU和FPGA平臺搭建)
https://blog.csdn.net/greenlight_74110/article/details/78461464 ('clinfo'找不到Intel GPU(Intel HD graphics))
OpenCL簡介
OpenCL是由非盈利性組織Khronos Group組織釋出的針對異構裝置進行並行化計算的一套開源的API以及程式語言。
它提供兩種並行化的模式,包括任務並行以及資料並行,目前針對GPU的引用,主要是以資料並行為主。OpenCL API是按照 C API定義的,由C和C++封裝而成。使用OpenCL C語言編寫的程式碼可以在支援OpenCL的裝置上執行。OpenCL C是C99語言的子集,並適當地擴充套件到眾多異構裝置上執行資料並行程式碼的能力。
所謂異構裝置,就是指底層硬體架構有較大不同的裝置,比如CPU與GPU,FPGA(可程式設計門陣列),CPU中負責分支預測及跳轉的控制單元和cache佔據較大的面積,而ALU(算術邏輯單元)佔據的比重遠遠小於GPU中的ALU面積比重,換句話說,CPU強於控制,弱於計算,而GPU強於計算,弱於控制。
上圖中,綠色部分是邏輯計算單元,紅色的儲存單元,橙黃色的是控制單元。
安裝OpenCL前的準備
OpenCL是一系列庫和標頭檔案,需要根據硬體安裝對應的SDK,也就是說,如果希望使用Intel CPU作為並行裝置,則必須安裝Intel SDK,如果使用NVIDIA GPU作為並行裝置,則必須安裝NVIDIA SDK。這裡給出在Intel CPU和NVIDIA GPU執行OpenCL的配置方法,可以根據自己的硬體情況選擇,注意,虛擬機器無法使用NVIDIA裝置。新手推薦使用Intel SDK,安裝方便,把系統搞崩潰的可能性較小。
clinfo是一個顯示OpenCL平臺和裝置的軟體,安裝後,在命令列輸入clinfo即可驗證。
sudo apt-get install clinfo
OpenCL平臺和OpenCL裝置
一個opencl平臺通常對應一個供應商。它負責為其裝置提供opencl實現。例如,具有i7-4790 intel cpu的機器將會有一個opencl平臺,大概命名為“intel opencl”,該平臺將包括兩個opencl裝置:一個是intel cpu本身,另一個是intel hd graphics 4600 GPU。這個“intel opencl”平臺正在為這兩個裝置提供opencl實現,並負責管理它們。
讓我們再來一個例子,但這次是從Windows生態系統外面。執行os x的macbook和intel iris pro gpu和專用的geforce卡都將顯示一個名為“apple”的opencl平臺。兩個gpus和cpu將顯示為屬於此平臺的裝置。這是因為“蘋果”平臺是為所有三種裝置提供opencl實現的平臺
但請記住:
1、opencl平臺可以有一個或多個裝置。
2、相同的裝置可以具有來自不同供應商的一個或多個opencl實現。換句話說,opencl裝置不僅可以屬於一個平臺。
3、該平臺的opencl版本不一定與裝置的opencl版本相同。
ICD和ICD loader
1、icd(可安裝的客戶端驅動程式),它是針對某個特定裝置的專門的opencl實現,也就是opencl執行時。可以在amdocl.so/dll或intelopencl.so/dll這樣的檔案中找到它。它是指允許多個opencl平臺共存的模型。它並不是核心功能,而是opencl的擴充套件。
2、icd loader(在opencl.dll / libopencl.so中):OpenCL Installable Client Driver (ICD) Loader是實現OpenCL應用程式與各硬體廠商提供的OpenCL驅動(platform)之間隔離的中間庫。它用於管理同一系統中的多個icds
它與opencl應用程式相關聯,並作為icd的佔位符。
應用程式呼叫icd載入程式庫匯出的函式。然而,icd載入器根據所選的opencl平臺決定要重定向到哪個icd。
icd載入機制是必需的,因為供應商的opencl實現通常只支援該供應商的硬體,但您可能希望在同一個opencl應用程式中使用來自不同供應商的多個裝置。
icd只是一個可選的opencl擴充套件,識別符號是cl_khr_icd。當你安裝了某個廠商的SDK,就會在作業系統的登錄檔上新增相應的登錄檔項。opencl icd loader允許應用程式呼叫clIcdGetPlatformIDsKHR函式獲取所有已經安裝的平臺的列表,從中選擇一個平臺,並將opencl api呼叫傳送到底層實現。 khronos登錄檔中提供了icd載入程式庫的原始碼https://github.com/KhronosGroup/OpenCL-ICD-Loader。
注意,一臺機器可以有幾個opencl平臺,每個平臺都有自己的驅動程式和opencl版本,總是隻有一個icd載入程式。 icd載入器充當所有安裝的opencl平臺的主管,併為所有opencl呼叫提供了唯一的入口點。基於平臺ID,它將opencl主機呼叫分配到正確的驅動程式。
這樣你就可以編譯icd(windows上的opencl.dll或者linux上的libopencl.so),而不是直接給所有可能的驅動程式編譯。在執行時,opencl應用程式將搜尋icd並載入它。 icd依次在登錄檔(Windows)或特殊目錄(linux)中查詢註冊的opencl驅動程式。您的軟體的每個opencl呼叫將由icd解決,這將進一步排程請求到所選的opencl平臺。
ICD loader在Windows上如何列舉Vendors?
在Windows上,和廠商想關的庫檔案是設定在登錄檔中的。ICD loader會掃描登錄檔項HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors的值,當DWORD中的每個值都為0時,ICD loader開啟由名稱指定的動態連結庫,使用LoadLibraryA的值。例如,如果登錄檔[HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors]包含下列值"c:\\vendor a\\vndra_ocl.dll"=dword:00000000,那麼ICD loader將開啟"c:\vendor a\vndra_ocl.dll"庫檔案
新增Vendors
在成功載入了一個廠商ICD庫後,ICD loader會從庫檔案中查詢下列函式clIcdGetPlatformIDsKHR, clGetPlatformInfo, 和clGetExtensionFunctionAddress.如果其中任意一個函式不存在,則ICD loader會關閉並且忽略這個廠商的ICD庫。
接下來,ICD loader查詢可用的ICD-enable 平臺,這個過程使用庫中的clIcdGetPlatformIDsKHR函式。 對於每一種平臺上,ICD載入器查詢 平臺的擴充套件字串來驗證cl_khr_icd的 支援,然後使用clGetPlatformInfo函式查詢平臺的廠商ICD擴充套件字尾 ,函式使用CL_PLATFORM_ICD_SUFFIX_KHR引數, 如果其中任何一個步驟失敗,ICD loader將忽略 廠商ICD並繼續到下一個。
正式安裝
機器配置
本子型號:HP 15-ay179TX,cpu雙核,主頻2.5GHZ。
cpu採用Kaby Lake(GT2)架構,集成核顯 intel HD Graphics 620。
核顯和整合顯示卡類似,一個整合在CPU內,一個焊接在主機板上,均無法更換,佔用主機記憶體。
獨立顯示卡可以更換,且有獨立視訊記憶體。
本機獨顯型號: AMD R5 M430 視訊記憶體2G
安裝之前的clinfo 如下:
從反饋資訊中可以看到 只有一個平臺 intel Gen OCL Driver, 但是 平臺下面並沒有裝置。
按照:https://software.intel.com/en-us/articles/sdk-for-opencl-gsg 來安裝。
一、安裝Intel OpenCL driver
官網給出了指令碼直接安裝:https://software.intel.com/sites/default/files/managed/f6/77/install_OCL_driver.sh_.txt 我之前都是自己新建一個txt將這段指令碼複製過去,結果安裝時總是出錯,不能複製!要直接下載。
不會下載的來這找:https://download.csdn.net/download/bluenapa/10898959
下載命令:
-c 表示支援斷點下載
wget -c xxxxxxxxxxxx
然後按照官網執行
mv xxx xxxxx 類似於重新命名
sudo su 升級到超級使用者?
$ mv install_OCL_driver.sh_.txt install_OCL_driver.sh
$ chmod 755 install_OCL_driver.sh
$ sudo su
$ ./install_OCL_driver.sh install
始終報錯,重新執行下載安裝也沒有用。安裝失敗。
二、安裝 opencl sdk
沒有找到指令碼(install_SDK_prereq_ubuntu.sh_.txt)去安裝,決定手動下載SDK然後安裝。
sdk 下載地址(需要註冊登入 intel 賬號):https://signin.intel.com/Email?TARGET=https%3A%2F%2Fregistrationcenter.intel.com%2Fen%2Fforms%2F%3Fproductid%3D2863
安裝中的幾張圖:
最後的結果如下:
出現兩個platfrom:一個是 Experimental OpenCL 2.1 CPU Only Platfrom,這個平臺上有一個裝置,是 i5-7200U CPU。
另一個平臺是 Intel Gen OCL Driver ,下邊沒有裝置。
目測這樣的結果是有問題的。。。。。。。。。
果然,在執行kinect_briage的時候結果如下: