當系統中有不只一種支援 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. | 2 | root | root | 4096 | 8月 | 28 | 19:45 | opencl |
而在目錄 /etc/OpenCL/vendors/ 下的內容為
[SiB@Core-i7 ~]$ ll /etc/OpenCL/vendors/ |
總計 8 |
-rw-rw-r--. | 1 | root | root | 36 | 1月 | 1 | 2016 | intel.icd |
-r--r--r--. | 1 | root | root | 22 | 7月 | 30 | 10:27 | nvidia |
其中 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. | 3 | 4096 | 8月 | 28 | 12:19 | ism |
lrwxrwxrwx. | 1 | 38 | 8月 | 28 | 12:19 | opencl -> /etc/alternatives/opencl-intel-runtime |
drwxr-xr-x. | 6 | 4096 | 8月 | 28 | 12:19 | opencl-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. | 3 | 16 | 8月 | 28 | 20:47 | ism |
lrwxrwxr-x. | 2 | 4096 | 8月 | 28 | 19:45 | opencl |
drwxr-xr-x. | 6 | 102 | 8月 | 28 | 20:47 | opencl-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--. | 1 | root | root | 36 | 1月 | 1 | 2016 | intel.icd |
-r--r--r--. | 1 | root | root | 22 | 7月 | 30 | 10:27 | nvidia.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--. | 1 | root | root | 52 | 8月 | 28 | 21:23 | intel-cpu.icd |
-rw-rw-r--. | 1 | root | root | 36 | 1月 | 1 | 2016 | intel.icd |
-r--r--r--. | 1 | root | root | 22 | 7月 | 30 | 10:27 | nvidia.icd |
接下來進行測試,看剛才的修改是否成功?
四、測試
用 CLinfo 測試當然是最方便的,結果如下
[SiB@Core-i7 ~]# clinfo |
Number of platforms | 3 |
| Platform Name | NVIDIA CUDA |
| Platform Vendor | NVIDIA Corporation |
| Platform Version | OpenCL 1.2 CUDA 8.0.0 |
| Platform Profile | FULL_PROFILE |
| Platform Extensions | l_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 suffix | NV |
|
| |
| Platform Name | Intel(R) OpenCL |
| Platform Vendor | Intel(R) Corporation |
| Platform Version | OpenCL 1.2 |
| Platform Profile | FULL_PROFILE |
| Platform Extensions | cl_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 suffix | INTEL |
|
| |
| Platform Name | Intel(R) OpenCL |
| Platform Vendor | Intel(R) Corporation |
| Platform Version | OpenCL 1.2 Linux |
| Platform Profile | FULL_PROFILE |
| Platform Extensions | cl_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 suffix | INTEL |
| . . . . . |
用另一個筆者自己寫的測試程式,結果為
[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.)