OpenCL is a general purpose computing api that is designed to be hardware accelerated with a supporting gpu and driver. On Linux this api is supported by all major gpu vendors including nvidia, intel and amd.
In this quick tutorial we take a look at how to check if your system support opencl api (with hardware acceleration). You should be having a gpu (discrete or integrated) along with the correct drivers installed for opencl to work.
clinfo command
On this system we have a Nvidia RTX 3060 Mobile GPU with Nvidia drivers v.525 installed. OpenCL support can be verified using the clinfo
command.
The -l option lists out all devices supporting OpenCL.
$ clinfo -l Platform #0: NVIDIA CUDA `-- Device #0: NVIDIA GeForce RTX 3060 Laptop GPU silver@ubuntussd:~$
For more detailed information use the following command with grep filtering.
clinfo -a | grep -i 'name\|vendor\|version\|profile'
Output
silver@ubuntussd:~$ clinfo -a | grep -i 'name\|vendor\|version\|profile' Platform Name NVIDIA CUDA Platform Vendor NVIDIA Corporation Platform Version OpenCL 3.0 CUDA 12.0.151 Platform Profile FULL_PROFILE Platform Extensions with Version cl_khr_global_int32_base_atomics 0x400000 (1.0.0) Platform Numeric Version 0xc00000 (3.0.0) Platform Name NVIDIA CUDA Device Name NVIDIA GeForce RTX 3060 Laptop GPU Device Vendor NVIDIA Corporation Device Vendor ID 0x10de Device Version OpenCL 3.0 CUDA Device Numeric Version 0xc00000 (3.0.0) Driver Version 525.105.17 Device OpenCL C Version OpenCL C 1.2 Device OpenCL C all versions OpenCL C 0x400000 (1.0.0) Device Profile FULL_PROFILE IL version (n/a) ILs with version (n/a) Built-in kernels with version (n/a) Device Extensions with Version cl_khr_global_int32_base_atomics 0x400000 (1.0.0) clGetPlatformInfo(NULL, CL_PLATFORM_NAME, ...) NVIDIA CUDA ICD loader Name OpenCL ICD Loader ICD loader Vendor OCL Icd free software ICD loader Version 2.3.1 ICD loader Profile OpenCL 3.0 silver@ubuntussd:~$
No Support: The clinfo command would simply show 0 platforms, when there are no OpenCL supporting gpu or gpu drivers available.
$ clinfo Number of platforms 0 $
Intel Integrated Graphics
Intel igpus can provide OpenCL support via the Neo drivers. The drivers can be installed with the following package:
sudo apt install intel-opencl-icd
$ clinfo -l Platform #0: Intel(R) OpenCL HD Graphics `-- Device #0: Intel(R) HD Graphics 630 [0x5912] enlightened@enlightened:~$
Earlier intel igpus could support opencl via the Beignet library, but it is no longer under active development and not available in the repositories.
AMD GPUs
AMD Gpus do not provide opencl support via the amdgpu driver installed by default. AMD has released the latest drivers with opencl support which can be downloaded from this url:
https://www.amd.com/en/support/linux-driversHowever the .deb packages have installation problems with broken dependencies on Ubuntu 23.04
wget http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb sudo dpkg -i libffi7_3.3-6_amd64.deb wget http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3-6_i386.deb sudo dpkg -i libffi7_3.3-6_i386.deb wget https://repo.radeon.com/amdgpu-install/22.40.5/ubuntu/jammy/amdgpu-install_5.4.50405-1_all.deb sudo gdebi amdgpu-install_5.4.50405-1_all.deb
$ sudo amdgpu-install [sudo] password for silver: Hit:1 http://archive.ubuntu.com/ubuntu lunar InRelease Hit:2 https://ppa.launchpadcontent.net/obsproject/obs-studio/ubuntu lunar InRelease Get:3 http://archive.ubuntu.com/ubuntu lunar-updates InRelease [109 kB] Get:4 http://archive.ubuntu.com/ubuntu lunar-backports InRelease [99.8 kB] Hit:5 https://repo.radeon.com/amdgpu/5.4.5/ubuntu focal InRelease Hit:6 https://repo.radeon.com/rocm/apt/5.4.5 focal InRelease Get:7 http://archive.ubuntu.com/ubuntu lunar-security InRelease [109 kB] Get:8 http://archive.ubuntu.com/ubuntu lunar-updates/main amd64 Packages [103 kB] Get:9 http://archive.ubuntu.com/ubuntu lunar-updates/main i386 Packages [79.4 kB] Get:10 http://archive.ubuntu.com/ubuntu lunar-updates/universe i386 Packages [35.4 kB] Get:11 http://archive.ubuntu.com/ubuntu lunar-updates/universe amd64 Packages [53.6 kB] Fetched 589 kB in 3s (191 kB/s) Reading package lists... Done Reading package lists... Done Building dependency tree... Done Reading state information... Done linux-headers-6.2.0-20-generic is already the newest version (6.2.0-20.20). linux-headers-6.2.0-20-generic set to manually installed. Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: xserver-xorg-amdgpu-video-amdgpu : Depends: xorg-video-abi-24 but it is not installable E: Unable to correct problems, you have held broken packages. silver@ubuntussd:~/Downloads$
The package depends on xorg-video-abi-24 which is not installable.
Testing and Benchmarks
To benchmark the OpenCL performance there is a tool called IndigoBench that runs rendering tests using the OpenCL api and provides a cumulative score as a relative indicator of the performance.
We ran the tests on our gaming laptop with Nvidia RTX 3060 gpu
Check this article:
How to Benchmark GPU Performance with IndigoBench on Ubuntu / LinuxIf the system has no gpu, then indigobench with use cpu based rendering with software emulation of opencl, which will be far slower than gpu accelerated computations.
When forcing the --gpuonly option on a system where there is no gpu support available, indigobench will simply be not able to start
acerlight@acerlight-laptop:~/IndigoBenchmark_v4.4.15$ ./indigo_benchmark --gpuonly libpng warning: iCCP: known incorrect sRGB profile libpng warning: iCCP: known incorrect sRGB profile Error initialising OpenCL: clGetPlatformIDs failed: CL_PLATFORM_NOT_FOUND_KHR
ICD - Installable Client Driver
The details of the icd drivers are stored in the directory: /etc/OpenCL/vendors
. To learn more about OpenCL implementation on Linux check out this guide on github here.
The directory contains files ending in ".icd" extension and they contain driver file location. The opencl icd loader will load the appropriate one to provide hardware accelerated opencl support.
1. Desktop system with only Intel integrated graphics:
$ ls -la /etc/OpenCL/vendors total 16 drwxr-xr-x 2 root root 4096 May 25 19:48 . drwxr-xr-x 3 root root 4096 Aug 29 2020 .. -rw-r--r-- 1 root root 52 Jan 10 20:19 intel.icd -rw-r--r-- 1 root root 22 May 3 2020 nvidia.icd $
$ cat /etc/OpenCL/vendors/intel.icd /usr/lib/x86_64-linux-gnu/intel-opencl/libigdrcl.so $
The above libigdrcl.so file is the actual driver that provides opencl support for intel igpus. Every gpu has its own separate driver file.
2. Laptop: Dedicated Nvidia RTX 3060 + AMD Radeon Vega iGPU
Lets take a look at another system with discrete nvidia gpu and integrated amd gpu.
silver@ubuntussd:~$ ls -l /etc/OpenCL/vendors/ total 4 -rw-r--r-- 1 root root 22 Mar 27 23:37 nvidia.icd silver@ubuntussd:~$
silver@ubuntussd:~$ cat /etc/OpenCL/vendors/nvidia.icd libnvidia-opencl.so.1 $
The nvidia opencl drivers come from the following packages:
$ apt-file search libnvidia-opencl.so.1 libnvidia-compute-390: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-450-server: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-470: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-470-server: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-510: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-515: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-515-server: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-525: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-compute-525-server: /usr/lib/x86_64-linux-gnu/libnvidia-opencl.so.1 $
On this system we have the libnvidia-compute-525 package installed.
3. Laptop with Intel Iris Xe (Integrated GPU on i5-1135G7)
This is another system with integrated intel gpu and running ubuntu 22.10. Intel Opencl support is enabled by installing the driver package:
sudo apt install intel-opencl-icd
$ clinfo -l Platform #0: Intel(R) OpenCL HD Graphics `-- Device #0: Intel(R) Iris(R) Xe Graphics [0x9a49] acerlight@acerlight-laptop:~$
The icd files look like this:
$ ls -la /etc/OpenCL/vendors/ total 12 drwxr-xr-x 2 root root 4096 May 26 15:00 . drwxr-xr-x 3 root root 4096 May 26 15:00 .. -rw-r--r-- 1 root root 52 Oct 4 2022 intel.icd acerlight@acerlight-laptop:~$
$ cat /etc/OpenCL/vendors/intel.icd /usr/lib/x86_64-linux-gnu/intel-opencl/libigdrcl.so acerlight@acerlight-laptop:~$
Possible Errors
If you have multiple icd loaders installed you might get the following error:
Error initialising OpenCL: clGetDeviceIDs failed
I got this error, after installing mesa-opencl-icd package and then running indigobench. It seems to be a cpu only platform that cannot detect gpus at all.
silver@ubuntussd:~/IndigoBenchmark_v4.4.15$ ./indigo_benchmark libpng warning: iCCP: known incorrect sRGB profile libpng warning: iCCP: known incorrect sRGB profile Error initialising OpenCL: clGetDeviceIDs failed silver@ubuntussd:~/IndigoBenchmark_v4.4.15$
The solution is to remove the package
sudo apt remove mesa-opencl-icd
PyOpenCL Python Code Example
Here is a simple piece of python code that uses pyopencl module to check for opencl supporting devices and lists them out.
# get this package with command: sudo apt install python3-pyopencl import pyopencl as cl # get platforms plat = cl.get_platforms() list_cl_devices = plat[0].get_devices() print ("Available OpenCL Devices:") #print (list_cl_devices) for device in list_cl_devices: print ('---') print('Vendor=' + device.get_info(cl.device_info.VENDOR)) print('Name=' + device.get_info(cl.device_info.NAME)) print('Driver Version=' + device.get_info(cl.device_info.DRIVER_VERSION)) #print('Platform=' + device.get_info(cl.device_info.PLATFORM)) print ('---')
$ python3 pyopencl_test.py Available OpenCL Devices: --- Vendor=NVIDIA Corporation Name=NVIDIA GeForce RTX 3060 Laptop GPU Driver Version=525.105.17 --- $
$ python3 pyopencl_test.py Available OpenCL Devices: --- Vendor=Intel(R) Corporation Name=Intel(R) Iris(R) Xe Graphics [0x9a49] Driver Version=1.0.0 --- $