This project is a prototype implementation of OpenCL 1.2 on top of Vulkan using clspv as the compiler.
host_ptr
clvk depends on the following external projects:
clvk also (obviously) depends on a Vulkan implementation. The build system supports a number of options there (see Building section).
To fetch all the dependencies needed to build and run clvk, please run:
git submodule update --init --recursive ./external/clspv/utils/fetch_sources.py --deps llvm
clvk uses CMake for its build system.
To build with the default configuration options, just use following:
mkdir -p build cd build cmake ../ make -j$(nproc)
The build system allows a number of things to be configured.
You can select the Vulkan implementation that clvk will target with the CLVK_VULKAN_IMPLEMENTATION
build system option. Two options are currently supported:
-DCLVK_VULKAN_IMPLEMENTATION=system
instructs the build system to use the Vulkan implementation provided by your system as detected by CMake. This is the default.
-DCLVK_VULKAN_IMPLEMENTATION=talvos
instructs the build system to use Talvos. Talvos emulates the Vulkan API and provides an interpreter for SPIR-V modules. You don‘t need Vulkan-compatible hardware and drivers to run clvk using Talvos. The path to Talvos’s sources must be provided by the user using CLVK_TALVOS_DIR
.
-DCLVK_VULKAN_IMPLEMENTATION=loader
enables building against a copy of the Vulkan Loader sources provided by the user using CLVK_VULKAN_LOADER_DIR
. The configuration of the loader to target Vulkan ICDs is left to the user.
-DCLVK_VULKAN_IMPLEMENTATION=custom
instructs the build system to use the values provided by the user manually using -DVulkan_INCLUDE_DIRS
and -DVulkan_LIBRARIES
.
It is possible to disable the build of the tests by passing -DCLVK_BUILD_TESTS=OFF
.
Passing -DCLVK_BUILD_CONFORMANCE_TESTS=ON
will instruct CMake to build the OpenCL conformance tests. This is not expected to work out-of-the box at the moment.
You can select the compilation style that clvk will use with Clspv via the CLVK_CLSPV_ONLINE_COMPILER
option. By default, Clspv is run in a separate process.
-DCLVK_CLSPV_ONLINE_COMPILER=1
will cause clvk to compile kernels in the same process via the Clspv C++ API.You can build clvk using an external Clspv source tree by setting -DCLSPV_SOURCE_DIR=/path/to/clspv/source/
.
clvk can be built for Android using the Android NDK toolchain.
/path/to/ndk
)-DCMAKE_TOOLCHAIN_FILE=/path/to/ndk/build/cmake/android.toolchain.cmake
-DANDROID_ABI=<ABI_FOR_THE_TARGET_DEVICE>
, most likely arm64-v8a
-DCLVK_VULKAN_IMPLEMENTATION=loader
-DCLVK_VULKAN_LOADER_DIR=/path/to/Vulkan-Loader
(see above)clvk supports the cl_khr_icd
OpenCL extension that makes it possible to use the OpenCL ICD Loader.
To use clvk to run an OpenCL application, you just need to make sure that the clvk shared library is picked up by the dynamic linker.
When clspv is not built into the shared library (which is currently the default), you also need to make sure that clvk has access to the clspv
binary. If you wish to move the built library and clspv
binary out of the build tree, you will need to make sure that you provide clvk with a path to the clspv
binary via the CLVK_CLSPV_BIN
environment variable (see Environment variables).
The following ought to work on Unix-like systems:
$ LD_LIBRARY_PATH=/path/to/build /path/to/application # Running the included simple test $ LD_LIBRARY_PATH=./build ./build/simple_test
Copy OpenCL.dll
into a system location or alongside the application executable you want to run with clvk.
The behaviour of a few things in clvk can be controlled by environment variables. Here's a quick guide:
CLVK_LOG
controls the level of logging
CLVK_LOG_COLOUR
controls colour logging
CLVK_LOG_DEST
controls where the logging output goes
stderr
: logging goes to the standard error (default)stdout
: logging goes to the standard outputfile:<fname>
: logging goes to <fname>
. The file will be created if it does not exist and will be truncated.CLVK_CLSPV_BIN
to provide a path to the clspv binary to use
CLVK_LLVMSPIRV_BIN
to provide a path to the llvm-spirv binary to use
CLVK_VALIDATION_LAYERS
allows to enable Vulkan validation layers
CLVK_CLSPV_OPTIONS
to provide additional options to pass to clspv
CLVK_QUEUE_PROFILING_USE_TIMESTAMP_QUERIES
to use timestamp queries to measure the CL_PROFILING_COMMAND_{START,END}
profiling infos on devices that do not support VK_EXT_calibrated_timestamps
.
WARNING: the values will not use the same time base as that used for CL_PROFILING_COMMAND_{QUEUED,SUBMIT}
but this allows to get closer-to-the-execution timestamps.
CLVK_SPIRV_VALIDATION
controls SPIR-V validation behaviour.
CLVK_SKIP_SPIRV_CAPABILITY_CHECK
to avoid checking whether the Vulkan device supports all of the SPIR-V capabilities declared by each SPIR-V module.
CLVK_MAX_BATCH_SIZE
to control the maximum number of commands that can be recorded in a single command buffer.
CLVK_KEEP_TEMPORARIES
to keep temporary files created during program build, compilation and link operations.
CLVK_CACHE_DIR
specifies a directory used for caching compiled program data between applications runs. The user is responsible for ensuring that this directory is not used concurrently by more than one application.