CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
129 lines
4.0 KiB
Markdown
129 lines
4.0 KiB
Markdown
# libclc
|
|
|
|
libclc is an open source implementation of the library
|
|
requirements of the OpenCL C programming language, as specified by the
|
|
OpenCL 1.1 Specification. The following sections of the specification
|
|
impose library requirements:
|
|
|
|
* 6.1: Supported Data Types
|
|
* 6.2.3: Explicit Conversions
|
|
* 6.2.4.2: Reinterpreting Types Using as_type() and as_typen()
|
|
* 6.9: Preprocessor Directives and Macros
|
|
* 6.11: Built-in Functions
|
|
* 9.3: Double Precision Floating-Point
|
|
* 9.4: 64-bit Atomics
|
|
* 9.5: Writing to 3D image memory objects
|
|
* 9.6: Half Precision Floating-Point
|
|
|
|
libclc is intended to be used with the Clang compiler's OpenCL frontend.
|
|
|
|
libclc is designed to be portable and extensible. To this end, it provides
|
|
generic implementations of most library requirements, allowing the target
|
|
to override the generic implementation at the granularity of individual
|
|
functions.
|
|
|
|
libclc currently supports PTX, AMDGPU, SPIRV and CLSPV targets, but support for
|
|
more targets is welcome.
|
|
|
|
## Configure, build, and install
|
|
|
|
libclc is built as part of an LLVM runtimes build.
|
|
|
|
Select the targets to build with `LLVM_RUNTIME_TARGETS`, and enable libclc for
|
|
each selected target with the matching
|
|
`RUNTIMES_<target-triple>_LLVM_ENABLE_RUNTIMES` cache entry.
|
|
|
|
#### Configure for the AMDGPU target
|
|
```
|
|
cd llvm-project
|
|
mkdir build
|
|
cd build
|
|
cmake ../llvm -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release \
|
|
-DRUNTIMES_amdgcn-amd-amdhsa-llvm_LLVM_ENABLE_RUNTIMES=libclc \
|
|
-DLLVM_RUNTIME_TARGETS="amdgcn-amd-amdhsa-llvm"
|
|
```
|
|
|
|
#### Configure for the NVPTX64 target
|
|
```
|
|
cmake ../llvm -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release \
|
|
-DRUNTIMES_nvptx64-nvidia-cuda_LLVM_ENABLE_RUNTIMES=libclc \
|
|
-DLLVM_RUNTIME_TARGETS="nvptx64-nvidia-cuda"
|
|
```
|
|
|
|
#### Configure for Vulkan (clspv) targets
|
|
```
|
|
cmake ../llvm -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release \
|
|
-DRUNTIMES_spirv64-unknown-vulkan_LLVM_ENABLE_RUNTIMES=libclc \
|
|
-DLLVM_RUNTIME_TARGETS="spirv64-unknown-vulkan"
|
|
```
|
|
|
|
#### Configure for SPIR-V targets
|
|
```
|
|
cmake ../llvm -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release \
|
|
-DRUNTIMES_spirv32-unknown-unknown_LLVM_ENABLE_RUNTIMES=libclc \
|
|
-DRUNTIMES_spirv64-unknown-unknown_LLVM_ENABLE_RUNTIMES=libclc \
|
|
-DLLVM_RUNTIME_TARGETS="spirv32-unknown-unknown;spirv64-unknown-unknown"
|
|
```
|
|
|
|
To build multiple targets, pass them as a semicolon-separated list in
|
|
`LLVM_RUNTIME_TARGETS` and provide a matching
|
|
`RUNTIMES_<target-triple>_LLVM_ENABLE_RUNTIMES=libclc` entry for each target.
|
|
|
|
#### Build
|
|
```
|
|
ninja
|
|
```
|
|
|
|
#### Install
|
|
```
|
|
ninja install
|
|
```
|
|
|
|
Note you can use the `DESTDIR` Makefile variable to do staged installs.
|
|
```
|
|
DESTDIR=/path/for/staged/install ninja install
|
|
```
|
|
|
|
## Testing
|
|
libclc utilizes the LLVM testing infrastructure.
|
|
#### Run all tests
|
|
To execute all per-target tests for libclc.
|
|
```
|
|
ninja check-libclc
|
|
```
|
|
`check-libclc` is a top-level target that aggregates all per-target tests.
|
|
|
|
#### Run target-specific tests
|
|
If you are working on a specific target, you can run tests for just that target triple:
|
|
```
|
|
ninja check-libclc-<target-triple>
|
|
```
|
|
Alternatively, you can run target-specific tests via the runtimes build by
|
|
pointing to the target-specific build directory:
|
|
```
|
|
ninja -C runtimes/runtimes-<target-triple>-bins check-libclc
|
|
```
|
|
|
|
## Out-of-tree build
|
|
|
|
To build out of tree, or in other words, against an existing LLVM build or install:
|
|
```
|
|
CC=$(<path-to>/llvm-config --bindir)/clang cmake \
|
|
<path-to>/llvm-project/libclc/CMakeLists.txt -DCMAKE_BUILD_TYPE=Release \
|
|
-G Ninja -DLLVM_DIR=$(<path-to>/llvm-config --cmakedir) \
|
|
-DLLVM_RUNTIMES_TARGET=<target-triple>
|
|
$ ninja
|
|
```
|
|
Then install as before.
|
|
|
|
In both cases, the LLVM used must include the targets you want libclc support for
|
|
(`AMDGPU` and `NVPTX` are enabled in LLVM by default). Apart from `SPIRV` where you do
|
|
not need an LLVM target but you do need the
|
|
[llvm-spirv tool](https://github.com/KhronosGroup/SPIRV-LLVM-Translator) available.
|
|
Either build this in-tree, or place it in the directory pointed to by
|
|
`LLVM_TOOLS_BINARY_DIR`.
|
|
|
|
## Website
|
|
|
|
https://libclc.llvm.org/
|