/VC4C

Compiler for the VC4CL OpenCL implementation

Primary LanguageCMIT LicenseMIT

Status

CircleCI

VC4C

Compiler for the VC4CL OpenCL-implementation. This compiler supports OpenCL C (via LLVM or SPIRV-LLVM), LLVM-IR and SPIR-V code, depending on the build configuration.

Required software

  • A C++14 capable compiler (Raspbian stretch ships with GCC 6.x, which is supported. GCC 4.9 used by Raspbian jessie is no longer supported! The clang from the Raspbian repository is also okay and can double as OpenCL compiler, see below)
  • CMake in version >= 3.13
  • A suitable OpenCL 1.2 compiler. Supported versions are the "original" LLVM/CLang (version 3.9 and up, using this one is recommended), which can be found in the Raspbian repositories, the Khronos SPIRV-LLVM Translator built on top of the "original" LLVM/CLang or the deprecated Khronos SPIRV-LLVM with the Khronos SPIR-V compiler front-end (only the tools clang and llvm-spirv need to be built).
  • The source-code for VC4CLStdLib for the GPU-side standard-library

Build

The following configuration variables can be set in CMake:

  • BUILD_TESTING toggles building of test program
  • CMAKE_BUILD_TYPE set to Debug, Release, asan, tsan or usbsan to build for the given debug/release mode or with sanitizers enabled
  • MULTI_THREADED toggles building with multi-threaded support
  • VERIFY_OUTPUT toggles the usage of vc4asm to validate the generated machine code
  • VC4CL_STDLIB_DIR specifies an optional folder where the development headers for the GPU-side VC4CLStdLib are located, by default looks in ../VC4CLStdLib/include/
  • CROSS_COMPILE toggles whether to cross-compile for the Raspberry Pi. NOTE: The Raspberry Pi cross-compiler is no longer supported, since it is based on an ancient GCC 4.9
  • CROSS_COMPILER_PATH sets the root path to the cross compiler to use
  • SPIRV_FRONTEND toggles building of the SPIR-V front-end, requires SPIRV-LLVM
  • SPIRV_COMPILER_ROOT sets the root-path to binaries of the SPIRV-LLVM compiler, defaults to /opt/SPIRV-LLVM/build/bin/
  • SPIRV_TRANSLATOR_ROOT sets the root path to the binaries of the SPIRV-LLVM Translator compiler, defaults to /opt/SPIRV-LLVM-Translator/build/tools/llvm-spirv/. This takes precedence over SPIRV_COMPILER_ROOT
  • LLVMLIB_FRONTEND enables the LLVM library front-end which uses the LLVM library to parse the LLVM IR module generated by the pre-compilation (recommended!)

Package

Run cpack -G DEB to create a debian package.

NOTE: Any compilation error when packaging can be ignored!

Environment Variables

  • VC4C_OPT can add compilation options, which is passed to Clang opt. Mainly for performance experiments.

Known Issues

If the VC4CLStdLib is updated, the LLVM pre-compiled header (PCH) needs to be rebuilt. For this to happen, simply delete the file VC4CLStdLib.h.pch (located in the source/installation directory of the VC4CLStdLib project, depending on whether it was installed) and rebuild the VC4C compiler (or just the vc4cl-stdlib target).

When BUILD_TESTING is on, some of the files (TestConversionFunctions.cpp.o) have to be compiled in one thread (make -j 1).