Setting up and running PoCL on MacOS¶
Note about the kernel compiler¶
Clang/LLVM is included with Xcode, but at least the default installation lacks development headers/libraries and llvm-config. As a result, this version cannot be used as a kernel compiler for PoCL.
The simplest way to install llvm is through Homebrew:
brew install llvm
export PATH=/opt/homebrew/opt/llvm/bin:$PATH
Then, ensure that LLVM is correctly set up for PoCL:
which clang
/opt/homebrew/opt/llvm/bin/clang
llvm-config --version
19.1.7
Alternatively, you can compile LLVM from source (Example is for an ARM Mac):
git clone https://github.com/llvm/llvm-project
cd llvm-project
mkdir build && cd build
cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_PROJECTS="clang;llvm"
-DCMAKE_INSTALL_PREFIX=<path-to-installation-directory> -DLLVM_TARGETS_TO_BUILD="AArch64" ../llvm
ninja install
Installing PoCL on MacOS using pre-built binaries¶
Homebrew
PoCL with the CPU driver supports Intel and Apple Silicon chips can be found on homebrew and can be installed with:
brew install pocl
Note that this installs an ICD loader from KhronoGroup and the built-in OpenCL implementation will be invisible when your application is linked to this loader.
Conda
PoCL with the CPU driver supports Intel and Apple Silicon chips can be found on conda-forge distribution and can be installed with:
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"
bash Mambaforge-$(uname)-$(uname -m).sh
To install the CPU driver:
mamba install pocl
Note that this installs an ICD loader from KhronosGroup and the builtin OpenCL implementation will be invisible when your application is linked to this loader. To make both pocl and the builtin OpenCL implementaiton visible, do:
mamba install pocl ocl_icd_wrapper_apple
Building PoCL from source on MacOS¶
Ensure that all required dependencies are installed. Clang/LLVM must be properly set up (see above).
Get the sources:
git clone git@github.com:pocl/pocl.git
cd pocl
mkdir build && cd build
For a standard build without the ICD loader¶
cmake .. -G Ninja -DENABLE_ICD=OFF -DCMAKE_INSTALL_PREFIX=<path-to-installation-directory> ninja installThis will install
libOpenCL.dylibto:<path-to-installation-directory>/libUsage:
To override the MacOS OpenCL framework:
export LIBRARY_PATH=<path-to-installation-directory>/lib:$LIBRARY_PATH export DYLD_LIBRARY_PATH=<path-to-installation-directory>/lib:$DYLD_LIBRARY_PATH clang <program-source>.c -lOpenCL // Use PoCL's debugging functionality to ensure it runs through PoCL. POCL_DEBUG=all ./a.out
For a build with the ICD loader¶
// If not installed: brew install ocl-icd brew install opencl-headers // These should enable PoCL to automatically detect the ICD loader. export PKG_CONFIG_PATH="/opt/homebrew/opt/opencl-headers/share/pkgconfig":$PKG_CONFIG_PATH export PKG_CONFIG_PATH="/opt/homebrew/opt/ocl-icd/lib/pkgconfig":$PKG_CONFIG_PATH export CPATH=/opt/homebrew/opt/ocl-icd/include:$CPATH cmake .. -G Ninja -DCMAKE_INSTALL_PREFIX=<path-to-installation-directory> ninja installThis will install
libpocl.dylibto:<path-to-installation-directory>/libMake it visible to the ICD loader by setting:
export OCL_ICD_VENDORS=<path-to-installation-directory>/etc/OpenCL/vendorsUsage:
To override the MacOS OpenCL framework:
export LIBRARY_PATH=/opt/homebrew/opt/ocl-icd/lib:$LIBRARY_PATH clang <program-source>.c -lOpenCL // Use PoCL's debugging functionality to ensure it runs through PoCL. POCL_DEBUG=all ./a.out