HSA

Note: pocl’s HSA support is currently in experimental stage.

The experimental HSA driver works only with an AMD Kaveri or Carrizo APUs using the HSAIL-supported LLVM and Clang. Other than that, you will need a recent linux (4.0+) and some software.

Installing prerequisite software

1) Install the HSA AMD runtime library

Pre-built binaries can be found here:

https://github.com/HSAFoundation/HSA-Runtime-AMD

This usually installs into /opt/hsa. Make sure to read Q&A in README.md, it lists some common issues (like /dev/kfd permissions) and run sample/vector_copy to verify you have a working runtime.

2) Build & install the LLVM with HSAIL support

Fetch the HSAIL branch of LLVM 3.7:

git clone https://github.com/HSAFoundation/HLC-HSAIL-Development-LLVM/ -b hsail-stable-3.7

Patch it a bit with:

patch -p1 PATHTO/pocl/tools/patches/llvm-3.7-hsail-branch.patch

Fetch the upstream Clang’s 3.7 branch:

cd tools; svn co http://llvm.org/svn/llvm-project/cfe/branches/release_37 clang

Patch it also:

cd clang; patch -p0 pocl/tools/patches/clang-3.7-hsail-branch.patch

An LLVM cmake configuration command like this worked for me:

cd ../../ ; mkdir build; cd build; cmake .. -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=HSAIL -DBUILD_SHARED_LIBS=off -DCMAKE_INSTALL_PREFIX=INSTALL_DIR -DLLVM_ENABLE_RTTI=on -DLLVM_BUILD_LLVM_DYLIB=on -DLLVM_ENABLE_EH=ON -DHSAIL_USE_LIBHSAIL=OFF

HSAIL_USE_LIBHSAIL=OFF is only for safety. If you accidentally build clang with libHSAIL, it will cause mysterious link errors later when building pocl.

Change INSTALL_DIR to your target prefix of choice. Note that these are required :

-DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=HSAIL

Also, if you don’t want to build all the default targets, you’ll need AMDGPU.

Then build and install the Clang/LLVM:

make -j4 && make install

3) Build HSAIL-Tools

git clone https://github.com/HSAFoundation/HSAIL-Tools

Build it (check CMAKE_INSTALL_PREFIX):

`mkdir -p build/lnx64
cd build/lnx64 cmake ../.. -DCMAKE_INSTALL_PREFIX=$HOME/bin make -j`

You might need to add

-DCMAKE_CXX_FLAGS=-I$HOME/llvm-3.7-hsa/include or similar to the cmake command line if it doesn’t find your LLVM headers.

In particular HSAILasm executable will be required by pocl.

4) Build pocl.

Using autotools:

./configure –with-hsa-runtime-dir=</opt/hsa> LLVM_CONFIG=<hsail-built-llvm-dir>/bin/llvm-config HSAILASM=<path/to/HSAILasm>
Or using cmake:
cmake -DENABLE_HSA=ON -DWITH_HSA_RUNTIME_DIR=</opt/hsa> -DWITH_HSAILASM_PATH=<path/to/HSAILasm>

Both should result in “hsa” appearing in pocl’s targets to build (“OCL_TARGETS” in cmake output, “Enabled device drivers:” in autoconf output)

5) Run tests & play around

After building pocl, you can smoke test the HSA driver by executing the HSA tests of the pocl testsuite:

make check TESTSUITEFLAGS=”-k hsa”

HSA Support notes

Note that the support is still experimental and very much unfinished. You’re welcome to try it out and report any issues, though.

What’s implemented:
  • global/local/private memory
  • atomics, barriers
  • most of the OpenCL kernel library builtins
What’s missing
  • printf() is not implemented
  • several builtins are not implemented yet (erf(c), lgamma, tgamma, logb, remainder, nextafter) and some are suboptimal or may give incorrect results with under/overflows (e.g. hypot, length, distance). We’re working on this, if you find any problem please let us know)
  • image support is not implemented
  • OpenCL 2.0 features (SVM) are unimplemented
  • Performance is suboptimal in many cases