Giter VIP home page Giter VIP logo

opencl-icd-loader's Introduction

OpenCLTM ICD Loader

This repo contains the source code and tests for the Khronos official OpenCL ICD Loader.

CI Build Status

Windows Build Status Linux Build Status MacOS Build Status

Introduction

OpenCL 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. The ICD Loader is responsible for:

  • Exporting OpenCL API entry points
  • Enumerating OpenCL implementations
  • Forwarding OpenCL API calls to the correct implementation

This repo contains the source code and tests for the Khronos official OpenCL ICD Loader.

Note that this repo does not contain an OpenCL implementation (ICD). You 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.

The OpenCL Installable Client Driver extension (cl_khr_icd) is described in the OpenCL extensions specification, which may be found on the Khronos OpenCL Registry.

Build Instructions

While the ICD Loader can be built and installed in isolation, it is part of the OpenCL SDK. If looking for streamlined build experience and a complete development package, refer to the SDK build instructions instead of the following guide.

Dependencies

The OpenCL ICD Loader requires:

  • the OpenCL Headers.
    • 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.
  • The OpenCL ICD Loader uses CMake for its build system. If CMake is not provided by your build system or OS package manager, please consult the CMake website.

Example Build

For most Windows and Linux usages, the following steps are sufficient to build the OpenCL ICD Loader:

  1. Clone this repo and the OpenCL Headers:

     git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader
     git clone https://github.com/KhronosGroup/OpenCL-Headers
    
  2. Install OpenCL Headers CMake package

     cmake -D CMAKE_INSTALL_PREFIX=./OpenCL-Headers/install -S ./OpenCL-Headers -B ./OpenCL-Headers/build 
     cmake --build ./OpenCL-Headers/build --target install
    
  3. Build and install OpenCL ICD Loader CMake package. (Note that CMAKE_PREFIX_PATH need to be an absolute path. Update as needed.)

     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 
     cmake --build ./OpenCL-ICD-Loader/build --target install
    

Notes:

  • For x64 Windows builds, you need to instruct the default Visual Studio generator by adding -A x64 to all your command-lines.

  • Some users may prefer to use a CMake GUI frontend, such as cmake-gui or ccmake, vs. the command-line CMake.

Example Use

Example CMake invocation

cmake -D CMAKE_PREFIX_PATH="/chosen/install/prefix/of/headers;/chosen/install/prefix/of/loader" /path/to/opencl/app

and sample CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
cmake_policy(VERSION 3.0...3.18.4)
project(proj)
add_executable(app main.cpp)
find_package(OpenCLHeaders REQUIRED)
find_package(OpenCLICDLoader REQUIRED)
target_link_libraries(app PRIVATE OpenCL::Headers OpenCL::OpenCL)

OpenCL ICD Loader Tests

OpenCL 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.

(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.)

Registering ICDs

The method to installing an ICD is operating system dependent.

Registering an ICD on Linux

Install your ICD by creating a file with the full path to the library of your implementation in /etc/OpenCL/vendors for eg.:

echo full/path/to/libOpenCLDriverStub.so > /etc/OpenCL/vendors/test.icd

Registering an ICD on Windows

Install your ICD by adding a REG_DWORD value to the registry keys:

// For 32-bit operating systems, or 64-bit tests on a 64-bit operating system:
HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors

// For 32-bit tests on a 64-bit operating system:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Khronos\OpenCL\Vendors

// The name of the REG_DWORD value should be the full path to the library of your implementation, for eg.
// OpenCLDriverStub.dll, and the data for this value should be 0.

About Layers

Layers have been added as an experimental feature in the OpenCL ICD Loader. We do not expect the API or ABI to change significantly, but the OpenCL Working Group reserves the right to do so. The layer support can also be completely deactivated during configuration by using the ENABLE_OPENCL_LAYERS (ON by default) cmake variable:

cmake -DENABLE_OPENCL_LAYERS=OFF

For now, runtime configuration of layers is done using the OPENCL_LAYERS environment variable. A colon (Linux) or semicolon (Windows) list of layers to use can be provided through this environment variable.

We are looking for feedback.

Support

Please create a GitHub issue to report an issue or ask questions.

Contributing

Contributions to the OpenCL ICD Loader are welcomed and encouraged. You will be prompted with a one-time "click-through" CLA dialog as part of submitting your pull request or other contribution to GitHub.

Table of Debug Environment Variables

The following debug environment variables are available for use with the OpenCL ICD loader:

Environment Variable Behavior Example Format
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

set OCL_ICD_FILENAMES=vendor_a.dll;vendor_b.dll
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
OPENCL_LAYERS Specifies a list of layers to load. export OPENCL_LAYERS=libLayerA.so:libLayerB.so

set OPENCL_LAYERS=libLayerA.dll;libLayerB.dll
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
OCL_ICD_ENABLE_TRACE Enable the trace mechanism export OCL_ICD_ENABLE_TRACE=True

set OCL_ICD_ENABLE_TRACE=True
true, T, 1 can also be used here.

opencl-icd-loader's People

Contributors

alycm avatar arturharasimiuk avatar bashbaug avatar cdai2 avatar cos-public avatar gmeeker avatar guoyejun avatar gwawiork avatar isilence avatar jenatali avatar jfpoole avatar johngladp avatar johnkesapidesarm avatar johnplate avatar jrprice avatar kbenzie avatar kepatil avatar kerilk avatar keryell avatar kpet avatar leonbrands avatar lmoriche avatar ltowarek avatar mathiasmagnus avatar nikhiljnv avatar ofirc avatar ormshaw avatar silvercamel avatar tpboudreau avatar yeah-its-gloria avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.