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[](https://github.com/KhronosGroup/OpenCL-ICD-Loader/actions?query=workflow%3AWindows) 8*1cddb830SAndroid Build Coastguard Worker[](https://github.com/KhronosGroup/OpenCL-ICD-Loader/actions?query=workflow%3ALinux) 9*1cddb830SAndroid Build Coastguard Worker[](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