xref: /aosp_15_r20/external/OpenCL-ICD-Loader/README.md (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
1*1cddb830SAndroid Build Coastguard Worker# OpenCL<sup>TM</sup> ICD Loader
2*1cddb830SAndroid Build Coastguard Worker
3*1cddb830SAndroid Build Coastguard WorkerThis repo contains the source code and tests for the Khronos official OpenCL ICD Loader.
4*1cddb830SAndroid Build Coastguard Worker
5*1cddb830SAndroid Build Coastguard Worker## CI Build Status
6*1cddb830SAndroid Build Coastguard Worker
7*1cddb830SAndroid Build Coastguard Worker[![Windows Build Status](https://github.com/KhronosGroup/OpenCL-ICD-Loader/workflows/Windows/badge.svg)](https://github.com/KhronosGroup/OpenCL-ICD-Loader/actions?query=workflow%3AWindows)
8*1cddb830SAndroid Build Coastguard Worker[![Linux Build Status](https://github.com/KhronosGroup/OpenCL-ICD-Loader/workflows/Linux/badge.svg)](https://github.com/KhronosGroup/OpenCL-ICD-Loader/actions?query=workflow%3ALinux)
9*1cddb830SAndroid Build Coastguard Worker[![MacOS Build Status](https://github.com/KhronosGroup/OpenCL-ICD-Loader/workflows/MacOS/badge.svg)](https://github.com/KhronosGroup/OpenCL-ICD-Loader/actions?query=workflow%3AMacOS)
10*1cddb830SAndroid Build Coastguard Worker
11*1cddb830SAndroid Build Coastguard Worker## Introduction
12*1cddb830SAndroid Build Coastguard Worker
13*1cddb830SAndroid Build Coastguard WorkerOpenCL defines an *Installable Client Driver* (ICD) mechanism to allow developers to build applications against an *Installable Client Driver* loader (ICD loader) rather than linking their applications against a specific OpenCL implementation.
14*1cddb830SAndroid Build Coastguard WorkerThe ICD Loader is responsible for:
15*1cddb830SAndroid Build Coastguard Worker
16*1cddb830SAndroid Build Coastguard Worker* Exporting OpenCL API entry points
17*1cddb830SAndroid Build Coastguard Worker* Enumerating OpenCL implementations
18*1cddb830SAndroid Build Coastguard Worker* Forwarding OpenCL API calls to the correct implementation
19*1cddb830SAndroid Build Coastguard Worker
20*1cddb830SAndroid Build Coastguard WorkerThis repo contains the source code and tests for the Khronos official OpenCL ICD Loader.
21*1cddb830SAndroid Build Coastguard Worker
22*1cddb830SAndroid Build Coastguard WorkerNote that this repo does not contain an OpenCL implementation (ICD).
23*1cddb830SAndroid Build Coastguard WorkerYou will need to obtain and install an OpenCL implementation for your OpenCL device that supports the OpenCL ICD extension `cl_khr_icd` to run an application using the OpenCL ICD Loader.
24*1cddb830SAndroid Build Coastguard Worker
25*1cddb830SAndroid Build Coastguard WorkerThe OpenCL *Installable Client Driver* extension (`cl_khr_icd`) is described in the OpenCL extensions specification, which may be found on the [Khronos OpenCL Registry](https://www.khronos.org/registry/OpenCL/).
26*1cddb830SAndroid Build Coastguard Worker
27*1cddb830SAndroid Build Coastguard Worker## Build Instructions
28*1cddb830SAndroid Build Coastguard Worker
29*1cddb830SAndroid Build Coastguard Worker> While the ICD Loader can be built and installed in isolation, it is part of the [OpenCL SDK](https://github.com/KhronosGroup/OpenCL-SDK). If looking for streamlined build experience and a complete development package, refer to the SDK build instructions instead of the following guide.
30*1cddb830SAndroid Build Coastguard Worker
31*1cddb830SAndroid Build Coastguard Worker### Dependencies
32*1cddb830SAndroid Build Coastguard Worker
33*1cddb830SAndroid Build Coastguard WorkerThe OpenCL ICD Loader requires:
34*1cddb830SAndroid Build Coastguard Worker- the [OpenCL Headers](https://github.com/KhronosGroup/OpenCL-Headers/).
35*1cddb830SAndroid Build Coastguard Worker  - It is recommended to install the headers via CMake, however a convenience shorthand is provided. Providing `OPENCL_ICD_LOADER_HEADERS_DIR` to CMake, one may specify the location of OpenCL Headers. By default, the OpenCL ICD Loader will look for OpenCL Headers in the inc directory.
36*1cddb830SAndroid Build Coastguard Worker- The OpenCL ICD Loader uses CMake for its build system.
37*1cddb830SAndroid Build Coastguard WorkerIf CMake is not provided by your build system or OS package manager, please consult the [CMake website](https://cmake.org).
38*1cddb830SAndroid Build Coastguard Worker
39*1cddb830SAndroid Build Coastguard Worker### Example Build
40*1cddb830SAndroid Build Coastguard Worker
41*1cddb830SAndroid Build Coastguard WorkerFor most Windows and Linux usages, the following steps are sufficient to build the OpenCL ICD Loader:
42*1cddb830SAndroid Build Coastguard Worker
43*1cddb830SAndroid Build Coastguard Worker1. Clone this repo and the OpenCL Headers:
44*1cddb830SAndroid Build Coastguard Worker
45*1cddb830SAndroid Build Coastguard Worker        git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader
46*1cddb830SAndroid Build Coastguard Worker        git clone https://github.com/KhronosGroup/OpenCL-Headers
47*1cddb830SAndroid Build Coastguard Worker
48*1cddb830SAndroid Build Coastguard Worker1. Install OpenCL Headers CMake package
49*1cddb830SAndroid Build Coastguard Worker
50*1cddb830SAndroid Build Coastguard Worker        cmake -D CMAKE_INSTALL_PREFIX=./OpenCL-Headers/install -S ./OpenCL-Headers -B ./OpenCL-Headers/build
51*1cddb830SAndroid Build Coastguard Worker        cmake --build ./OpenCL-Headers/build --target install
52*1cddb830SAndroid Build Coastguard Worker
53*1cddb830SAndroid Build Coastguard Worker1. Build and install OpenCL ICD Loader CMake package. _(Note that `CMAKE_PREFIX_PATH` need to be an absolute path. Update as needed.)_
54*1cddb830SAndroid Build Coastguard Worker
55*1cddb830SAndroid Build Coastguard Worker        cmake -D CMAKE_PREFIX_PATH=/absolute/path/to/OpenCL-Headers/install -D CMAKE_INSTALL_PREFIX=./OpenCL-ICD-Loader/install -S ./OpenCL-ICD-Loader -B ./OpenCL-ICD-Loader/build
56*1cddb830SAndroid Build Coastguard Worker        cmake --build ./OpenCL-ICD-Loader/build --target install
57*1cddb830SAndroid Build Coastguard Worker
58*1cddb830SAndroid Build Coastguard WorkerNotes:
59*1cddb830SAndroid Build Coastguard Worker
60*1cddb830SAndroid Build Coastguard Worker* For x64 Windows builds, you need to instruct the default Visual Studio generator by adding `-A x64` to all your command-lines.
61*1cddb830SAndroid Build Coastguard Worker
62*1cddb830SAndroid Build Coastguard Worker* Some users may prefer to use a CMake GUI frontend, such as `cmake-gui` or `ccmake`, vs. the command-line CMake.
63*1cddb830SAndroid Build Coastguard Worker
64*1cddb830SAndroid Build Coastguard Worker### Example Use
65*1cddb830SAndroid Build Coastguard Worker
66*1cddb830SAndroid Build Coastguard WorkerExample CMake invocation
67*1cddb830SAndroid Build Coastguard Worker
68*1cddb830SAndroid Build Coastguard Worker```bash
69*1cddb830SAndroid Build Coastguard Workercmake -D CMAKE_PREFIX_PATH="/chosen/install/prefix/of/headers;/chosen/install/prefix/of/loader" /path/to/opencl/app
70*1cddb830SAndroid Build Coastguard Worker```
71*1cddb830SAndroid Build Coastguard Worker
72*1cddb830SAndroid Build Coastguard Workerand sample `CMakeLists.txt`
73*1cddb830SAndroid Build Coastguard Worker
74*1cddb830SAndroid Build Coastguard Worker```cmake
75*1cddb830SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.0)
76*1cddb830SAndroid Build Coastguard Workercmake_policy(VERSION 3.0...3.18.4)
77*1cddb830SAndroid Build Coastguard Workerproject(proj)
78*1cddb830SAndroid Build Coastguard Workeradd_executable(app main.cpp)
79*1cddb830SAndroid Build Coastguard Workerfind_package(OpenCLHeaders REQUIRED)
80*1cddb830SAndroid Build Coastguard Workerfind_package(OpenCLICDLoader REQUIRED)
81*1cddb830SAndroid Build Coastguard Workertarget_link_libraries(app PRIVATE OpenCL::Headers OpenCL::OpenCL)
82*1cddb830SAndroid Build Coastguard Worker```
83*1cddb830SAndroid Build Coastguard Worker
84*1cddb830SAndroid Build Coastguard Worker## OpenCL ICD Loader Tests
85*1cddb830SAndroid Build Coastguard Worker
86*1cddb830SAndroid Build Coastguard WorkerOpenCL ICD Loader Tests can be run using `ctest` from the `build` directory. CTest which is a companion to CMake. The OpenCL ICD Loader Tests can also be run directly by executing `icd_loader_test[.exe]` executable from the bin folder.
87*1cddb830SAndroid Build Coastguard Worker
88*1cddb830SAndroid Build Coastguard Worker_(Note that running the tests manually requires setting up it's env manually, by setting `OCL_ICD_FILENAMES` to the full path of `libOpenCLDriverStub.so`/`OpenCLDriverStub.dll`, something otherwise done by CTest.)_
89*1cddb830SAndroid Build Coastguard Worker
90*1cddb830SAndroid Build Coastguard Worker## Registering ICDs
91*1cddb830SAndroid Build Coastguard Worker
92*1cddb830SAndroid Build Coastguard WorkerThe method to installing an ICD is operating system dependent.
93*1cddb830SAndroid Build Coastguard Worker
94*1cddb830SAndroid Build Coastguard Worker### Registering an ICD on Linux
95*1cddb830SAndroid Build Coastguard Worker
96*1cddb830SAndroid Build Coastguard WorkerInstall your ICD by creating a file with the full path to the library of your implementation in `/etc/OpenCL/vendors` for eg.:
97*1cddb830SAndroid Build Coastguard Worker
98*1cddb830SAndroid Build Coastguard Worker    echo full/path/to/libOpenCLDriverStub.so > /etc/OpenCL/vendors/test.icd
99*1cddb830SAndroid Build Coastguard Worker
100*1cddb830SAndroid Build Coastguard Worker### Registering an ICD on Windows
101*1cddb830SAndroid Build Coastguard Worker
102*1cddb830SAndroid Build Coastguard WorkerInstall your ICD by adding a `REG_DWORD` value to the registry keys:
103*1cddb830SAndroid Build Coastguard Worker
104*1cddb830SAndroid Build Coastguard Worker    // For 32-bit operating systems, or 64-bit tests on a 64-bit operating system:
105*1cddb830SAndroid Build Coastguard Worker    HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors
106*1cddb830SAndroid Build Coastguard Worker
107*1cddb830SAndroid Build Coastguard Worker    // For 32-bit tests on a 64-bit operating system:
108*1cddb830SAndroid Build Coastguard Worker    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Khronos\OpenCL\Vendors
109*1cddb830SAndroid Build Coastguard Worker
110*1cddb830SAndroid Build Coastguard Worker    // The name of the REG_DWORD value should be the full path to the library of your implementation, for eg.
111*1cddb830SAndroid Build Coastguard Worker    // OpenCLDriverStub.dll, and the data for this value should be 0.
112*1cddb830SAndroid Build Coastguard Worker
113*1cddb830SAndroid Build Coastguard Worker## About Layers
114*1cddb830SAndroid Build Coastguard Worker
115*1cddb830SAndroid Build Coastguard WorkerLayers have been added as an experimental feature in the OpenCL ICD Loader. We do not
116*1cddb830SAndroid Build Coastguard Workerexpect the API or ABI to change significantly, but the OpenCL Working Group reserves
117*1cddb830SAndroid Build Coastguard Workerthe right to do so. The layer support can also be completely deactivated during
118*1cddb830SAndroid Build Coastguard Workerconfiguration by using the `ENABLE_OPENCL_LAYERS` (`ON` by default) cmake variable:
119*1cddb830SAndroid Build Coastguard Worker
120*1cddb830SAndroid Build Coastguard Worker```bash
121*1cddb830SAndroid Build Coastguard Workercmake -DENABLE_OPENCL_LAYERS=OFF
122*1cddb830SAndroid Build Coastguard Worker```
123*1cddb830SAndroid Build Coastguard Worker
124*1cddb830SAndroid Build Coastguard WorkerFor now, runtime configuration of layers is done using the `OPENCL_LAYERS` environment
125*1cddb830SAndroid Build Coastguard Workervariable. A colon (Linux) or semicolon (Windows) list of layers to use can be provided
126*1cddb830SAndroid Build Coastguard Workerthrough this environment variable.
127*1cddb830SAndroid Build Coastguard Worker
128*1cddb830SAndroid Build Coastguard WorkerWe are looking for feedback.
129*1cddb830SAndroid Build Coastguard Worker
130*1cddb830SAndroid Build Coastguard Worker## Support
131*1cddb830SAndroid Build Coastguard Worker
132*1cddb830SAndroid Build Coastguard WorkerPlease create a GitHub issue to report an issue or ask questions.
133*1cddb830SAndroid Build Coastguard Worker
134*1cddb830SAndroid Build Coastguard Worker## Contributing
135*1cddb830SAndroid Build Coastguard Worker
136*1cddb830SAndroid Build Coastguard WorkerContributions to the OpenCL ICD Loader are welcomed and encouraged.
137*1cddb830SAndroid Build Coastguard WorkerYou will be prompted with a one-time "click-through" CLA dialog as part of submitting your pull request or other contribution to GitHub.
138*1cddb830SAndroid Build Coastguard Worker
139*1cddb830SAndroid Build Coastguard Worker## Table of Debug Environment Variables
140*1cddb830SAndroid Build Coastguard Worker
141*1cddb830SAndroid Build Coastguard WorkerThe following debug environment variables are available for use with the OpenCL ICD loader:
142*1cddb830SAndroid Build Coastguard Worker
143*1cddb830SAndroid Build Coastguard Worker| Environment Variable              | Behavior            |  Example Format      |
144*1cddb830SAndroid Build Coastguard Worker|:---------------------------------:|---------------------|----------------------|
145*1cddb830SAndroid Build Coastguard Worker| OCL_ICD_FILENAMES                 | Specifies a list of additional ICDs to load.  The ICDs will be enumerated first, before any ICDs discovered via default mechanisms. | `export OCL_ICD_FILENAMES=libVendorA.so:libVendorB.so`<br/><br/>`set OCL_ICD_FILENAMES=vendor_a.dll;vendor_b.dll` |
146*1cddb830SAndroid Build Coastguard Worker| OCL_ICD_VENDORS                   | On Linux and Android, specifies a directory to scan for ICDs to enumerate in place of the default `/etc/OpenCL/vendors'. |  `export OCL_ICD_VENDORS=/my/local/icd/search/path` |
147*1cddb830SAndroid Build Coastguard Worker| OPENCL_LAYERS                     | Specifies a list of layers to load. |  `export OPENCL_LAYERS=libLayerA.so:libLayerB.so`<br/><br/>`set OPENCL_LAYERS=libLayerA.dll;libLayerB.dll` |
148*1cddb830SAndroid Build Coastguard Worker| OPENCL_LAYER_PATH                 | On Linux and Android, specifies a directory to scan for layers to enumerate in place of the default `/etc/OpenCL/layers'. | `export OPENCL_LAYER_PATH=/my/local/layers/search/path` |
149*1cddb830SAndroid Build Coastguard Worker| OCL_ICD_ENABLE_TRACE              | Enable the trace mechanism          |  `export OCL_ICD_ENABLE_TRACE=True`<br/><br/>`set OCL_ICD_ENABLE_TRACE=True`<br/>`true, T, 1 can also be used here.`  |
150