1. 程式人生 > >基於ubuntu平臺 介紹和配置OpenCL

基於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強於計算,弱於控制。


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 loader

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的時候結果如下: