wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh <version e.g. 17>sudo apt install build-essential libzstd1 libzstd-dev libncurses5-dev libzstd-dev zlib1g-dev cmake
sudo apt-get install ocl-icd-libopencl1 sudo apt install llvm-17 llvm-17-dev libclang-17-dev
git clone git@github.com:CHIP-SPV/SPIRV-LLVM-Translator.git
cd SPIRV-LLVM-Translator
git checkout -t origin/chipStar-llvm-17
mkdir build && cd build
cmake ../ # Optionally provide -DCMAKE_INSTALL_PREFIX= if you want to install in non-default dir
make -j
sudo make install # sudo not required if you installed in non-default local pathThis was found to be an issue on Ubuntu where libstdc++-11 and libstdc++-11-dev packages were installed but libstdc++-12 was also present so clang would pick 12 and then not find the necessary dependencies
clang-17 --verbose
Ubuntu clang version 17.0.6 (++20231209124227+6009708b4367-1~exp1~20231209124336.77)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Found CUDA installation: /usr/local/cuda, version 12.1Here we see that clang chose GCC-12 so make sure that dev packages are installed
sudo apt install libstdc++-12-devPython is used for unit testing
sudo apt install python3
python3 -m pip install PyYAMLEasiest way to check that installation is working and run a simple example would be to use an OpenCL CPU runtime. Two supported options for this are Intel (works on AMD cpus as well) and PoCL (works on a wide range of hardware)
First you need to install an ICD Loader which provides [libOpenCL.so](http://libOpenCL.so) and the clinfo tool for checking the properties of a given OpenCL installation
sudo apt install ocl-icd-libopencl1 clinfoThen, install a runtime which provides and .icd file which is then used by the loader. For example, PoCL which runs on a large number of different systems.
sudo apt install pocl-opencl-icdclinfo | grep "ICD Loader"
ICD loader Name OpenCL ICD LoaderIf you don’t see this, and clinfo just exits, it’s likely that some other libOpenCL.so got picked up such as one from the CUDA installation.
You can which which libOpenCL.so is being used by clinfo
ldd `which clinfo`
linux-vdso.so.1 (0x00007ffefffe8000)
libOpenCL.so.1 => /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 (0x00007f0264ec4000)
libdl.so.2 => /usr/lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0264ebf000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f0264c00000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0264f10000)And find all [libOpenCL.so](http://libOpenCL.so) on your system by:
sudo find / -name "libOpenCL.so*"
/snap/firefox/3972/usr/lib/x86_64-linux-gnu/libOpenCL.so.1
/snap/firefox/3972/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0
/snap/firefox/4033/usr/lib/x86_64-linux-gnu/libOpenCL.so.1
/snap/firefox/4033/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0
/usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0
/usr/lib/x86_64-linux-gnu/libOpenCL.so.1
/usr/share/man/man7/libOpenCL.so.7.gz
/usr/local/cuda-12.1/targets/x86_64-linux/lib/libOpenCL.so.1.0
/usr/local/cuda-12.1/targets/x86_64-linux/lib/libOpenCL.so.1.0.0
/usr/local/cuda-12.1/targets/x86_64-linux/lib/libOpenCL.so
/usr/local/cuda-12.1/targets/x86_64-linux/lib/libOpenCL.so.1Then use LD_PRELOAD to LD_LIBRARY_PATH to use the one you want
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libOpenCL.so.1 clinfo -l
Platform #0: NVIDIA CUDA
`-- Device #0: NVIDIA GeForce RTX 3070
Platform #1: Portable Computing Language
`-- Device #0: pthread-AMD Ryzen 7 5700G with Radeon GraphicsNotice above that we have multiple platforms available - one from CUDA and one from PoCL we just installed. Without changing anything and just running a sample:
/home/pvelesko/chipStar/build/samples/0_MatrixMultiply/MatrixMultiply
CHIP critical [TID 446954] [1712210555.487863702] : Selected OpenCL device 0 is out of rangeThis happens because by default we select platform #0 and device #0 and expect a GPU
# Defaults
CHIP_PLATFORM=0
CHIP_DEVICE=0
CHIP_DEVICE_TYPE=gpuSo we can select to run on the PoCL platform and cpu device as follows:
CHIP_PLATFORM=1 CHIP_DEVICE_TYPE=cpu /home/pvelesko/chipStar/build/samples/0_MatrixMultiply/MatrixMultiply
CHIP warning [TID 447571] [1712210779.229144953] : The device might not support subgroup size 32, warp-size sensitive kernels might not work correctly.
Device name pthread-AMD Ryzen 7 5700G with Radeon Graphics
CHIP error [TID 447571] [1712210779.371289725] : hipErrorNotInitialized (CL_INVALID_VALUE ) in /home/pvelesko/chipStar/src/backend/OpenCL/CHIPBackendOpenCL.cc:776:compileIL
CHIP error [TID 447571] [1712210779.371373743] : Caught Error: hipErrorNotInitialized
HIP API errorThe issue here is that we used PoCL from apt which is not compiled with SPIR-V support. Solution: build and install PoCL from source: https://github.com/pocl/pocl
Since multiple OpenCL platforms can be available at any given time it’s best to select only a single .icd to simplify device selection.
First, find all the .icd files in your system:
sudo find / -name "*.icd"
/etc/OpenCL/vendors/intel.icd
/etc/OpenCL/vendors/nvidia.icd
/etc/OpenCL/vendors/pocl.icd
/usr/local/etc/OpenCL/vendors/pocl.icd
/home/pvelesko/pocl/build/pocl.icd
/home/pvelesko/pocl/build/ocl-vendors/pocl-tests.icdAnd use PoCL version we just installed
OCL_ICD_VENDORS=/usr/local/etc/OpenCL/vendors/pocl.icd clinfo