2016年8月29日 星期一

安裝 OpenCL 程式框架 (六):Intel GPU 和 CPU 並用

當系統中有不只一種支援 OpenCL 程式框架的運算裝置時,使用者可以依需求選擇用何種運算裝置運算。目前的筆記型電腦,除了晶片組提供的顯示晶片外,多配有獨立顯示晶片,也都有支援 OpenCL。如:NVIDIA GPU + Intel GPU。
  現在的 CPU 也多是多核心,運算時脈也很快,動輒 3 ~ 4 GHz。用多核心的 CPU 來當 OpenCL 的運算裝置,效果應該也不錯。最近嘗試將電腦三個支援 OpenCL 的運算裝置
NVIDIA GPU  +  Intel GPU  +  Intel CPU
全部裝起來,剛開始不是很順利,Intel  GPU 和 CPU 的 OpenCL 框架不能同時安裝,它們的一些設定、目錄會衝突,或被覆蓋,經過一些波折才成功。
  首先,先來看一下只安裝一種 OpenCL 程式框架時狀況,如下方之步驟一、二之內容:

一、安裝 Intel GPU 的 OpenCL 程式框架

先記錄只安裝 Intel GPU 的 OpenCL 框架的狀態,在目錄 /opt/intel/ 下的內容為
[SiB@Core-i7 ~]$ ll /opt/intel/
總計 4
drwxr-xr-x.2rootroot40968月2819:45opencl
而在目錄 /etc/OpenCL/vendors/ 下的內容為
[SiB@Core-i7 ~]$ ll /etc/OpenCL/vendors/
總計 8
-rw-rw-r--.1rootroot361月12016intel.icd
-r--r--r--.1rootroot227月3010:27nvidia
其中 intel.icd 的內容為
[SiB@Core-i7 ~]# cat /etc/OpenCL/vendors/intel.icd
/opt/intel/opencl/libIntelOpenCL.so
接著,再看看另一個情形。

二、安裝 Intel CPU 的 OpenCL 程式框架

只安裝 Intel CPU 的 OpenCL 框架的狀態,在目錄 /opt/intel/ 下內容為
[SiB@Core-i7 ~]$ ls -Gg /opt/intel/
總計 8
drwxr-xr-x.340968月2812:19ism
lrwxrwxrwx.1388月2812:19opencl -> /etc/alternatives/opencl-intel-runtime
drwxr-xr-x.640968月2812:19opencl-1.2-6.4.0.25
在目錄 /etc/alternatives/ 下,以 opencl- 為首的檔案為 (:已省略 ls 命令的部分結果)
[SiB@Core-i7 ~]$ cd /etc/alternatives
[SiB@Core-i7 alternatives]$ ll opencl-*
. . . opencl-intel-runtime -> /opt/intel/opencl-1.2-6.4.0.25
. . . opencl-intel-runtime-icd -> /opt/intel/opencl-1.2-6.4.0.25/etc/intel64.icd
. . . opencl-libOpenCL.so -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so
. . . opencl-libOpenCL.so.1 -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so.1
. . . opencl-libOpenCL.so.2.0 -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so.2.0
而在目錄 /etc/OpenCL/vendors/ 下的內容為 (:已省略 ls 命令的部分結果)
[SiB@Core-i7 ~]$ ll /etc/OpenCL/vendors/
總計 4
. . . intel64.icd -> /etc/alternatives/opencl-intel-runtime-icd
. . . nvidia.icd
其中 intel64.icd 的內容為
[SiB@Core-i7 ~]# cat /etc/OpenCL/vendors/intel64.icd
/opt/intel/opencl-1.2-6.4.0.25/lib64/libintelocl.so
有了上面這兩個紀錄,可以繼續下一個安裝步驟。

三、 Intel GPU 的框架已裝妥後,再安裝 CPU 的框架

最後,在已安裝 Intel GPU 的 OpenCL 框架的狀況下,再安裝 Intel CPU 的 OpenCL 框架。比較有哪些不同?
在目錄 /opt/intel/ 下的內容為
[SiB@Core-i7 ~]$ ls -Gg /opt/intel/
總計 4
drwxr-xr-x.3168月2820:47ism
lrwxrwxr-x.240968月2819:45opencl
drwxr-xr-x.61028月2820:47opencl-1.2-6.4.0.25
在目錄 /etc/alternatives/ 下,以 opencl- 為首的檔案名稱 (:已省略 ls 命令的部分結果)
[SiB@Core-i7 ~]$ cd /etc/alternatives
[SiB@Core-i7 alternatives]$ ll opencl-*
. . . opencl-libOpenCL.so -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so
. . . opencl-libOpenCL.so.1 -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so.1
. . . opencl-libOpenCL.so.2.0 -> /opt/intel/opencl-1.2-6.4.0.25/lib64/libOpenCL.so.2.0
而在目錄 /etc/OpenCL/vendors/ 下的內容為
[SiB@Core-i7 ~]$ ll /etc/OpenCL/vendors/
總計 8
-rw-rw-r--.1rootroot361月12016intel.icd
-r--r--r--.1rootroot227月3010:27nvidia.icd
其中 intel.icd 的內容為
[SiB@Core-i7 ~]# cat /etc/OpenCL/vendors/intel.icd
/opt/intel/opencl/libIntelOpenCL.so
由上面的結果可以看出,原先在目錄 /etc/OpenCL/vendors/ 下,intel64.icd 這個鏈結不見了。這是指向一個 ICD 設定,供 OpenCL 程式框架查詢『動態鏈結函式庫』之用,把它補回去就可以了。
[root@Core-i7 ~]# echo "/opt/intel/opencl-1.2-6.4.0.25/lib64/libintelocl.so" > /etc/OpenCL/vendors/intel-cpu.icd
現在,在目錄 /etc/OpenCL/vendors 下的內容就變成
[SiB@Core-i7 ~]$ ll /etc/OpenCL/vendors/
總計 12
-rw-r--r--.1rootroot528月2821:23intel-cpu.icd
-rw-rw-r--.1rootroot361月12016intel.icd
-r--r--r--.1rootroot227月3010:27nvidia.icd
接下來進行測試,看剛才的修改是否成功?

四、測試

用 CLinfo 測試當然是最方便的,結果如下
[SiB@Core-i7 ~]# clinfo
Number of platforms3
 Platform NameNVIDIA CUDA
Platform VendorNVIDIA Corporation
Platform VersionOpenCL 1.2 CUDA 8.0.0
Platform ProfileFULL_PROFILE
Platform Extensionsl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_fp64 cl_khr_byte_addressable_store cl_khr_icd cl_khr_gl_sharing cl_nv_compiler_options cl_nv_device_attribute_query cl_nv_pragma_unroll cl_nv_copy_opts
Platform Extensions function suffixNV

 Platform NameIntel(R) OpenCL
Platform VendorIntel(R) Corporation
Platform VersionOpenCL 1.2
Platform ProfileFULL_PROFILE
Platform Extensionscl_intel_accelerator cl_intel_advanced_motion_estimation cl_intel_motion_estimation cl_intel_subgroups cl_intel_va_api_media_sharing cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_icd cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_spir
Platform Extensions function suffixINTEL

 Platform NameIntel(R) OpenCL
Platform VendorIntel(R) Corporation
Platform VersionOpenCL 1.2 Linux
Platform ProfileFULL_PROFILE
Platform Extensionscl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_depth_images cl_khr_3d_image_writes cl_intel_exec_by_local_thread cl_khr_spir cl_khr_fp64
Platform Extensions function suffixINTEL
 . . . . .
用另一個筆者自己寫的測試程式,結果為
[SiB@Core-i7 ~]$ ./Hello_All_OpenCL
There are 3 platforms in this system.
1. NVIDIA CUDA, OpenCL 1.2 CUDA 8.0.0, 1 device.
1-1[GPU]GeForce GTX 950M, 367.44, 5 Compute Units,
OpenCL 1.2 CUDA, OpenCL C 1.2 , 64-bit Little-Endian
Computed '1000000/1000000' correct values! ( 0.130320 us)
2. Intel(R) OpenCL, OpenCL 1.2 , 1 device.
2-1[GPU]Intel(R) HD Graphics, 1.0.47971, 20 Compute Units,
OpenCL 1.2 , OpenCL C 1.2 , 64-bit Little-Endian
Computed '1000000/1000000' correct values! ( 0.013670 us)
3. Intel(R) OpenCL, OpenCL 1.2 LINUX, 1 device.
3-1[CPU]Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz, 1.2.0.25, 8 Compute Units,
OpenCL 1.2 (Build 25), OpenCL C 1.2 , 64-bit Little-Endian
Computed '1000000/1000000' correct values! ( 0.029708 us)
上例的結果顯示,有三種 OpenCL 平台,每個皆各有一個裝置,各裝置的運算單元數分別為 5, 20 和 8。最後,各執行 1,000,000 次相同亂數陣列的浮點平方運算,並與 C 的算術運算結果相比較。

後記:


已測試版本:

  • Fedora 24
  • OpenCL :NVIDIA-Linux-x86_64-367.44
    intel-opencl-1.2-1.0-47971
    opencl_runtime_16.1.1_x64_rh_6.4.0.25
  • NVIDIA GPU : GeForce GTX 950M
  • Intel GPU : Intel(R) HD Graphics
  • Intel CPU : Intel(R) Core(TM) i7-4720HQ

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)