跳转至

编译

https://portablecl.org/docs/html/install.html#install-requirements 安装manual

1. 在llvm中增加对SPIRV的编译支持

增加对spirv-tools工具和libSPIRV-Tools-shared.so的编译(LLVM17已经集成了该项目,否则需要到官网下载单独进行编译)

增加对SPIRV-Tools工具和libSPIRV-Tools-shared.so的编译,由spirv-tools项目编译而来

Bash
ken@llvm-gw001m1aftf:~/workspace/SPIRV-Tools/install$ ls bin/
spirv-as  spirv-cfg  spirv-dis  spirv-lesspipe.sh  spirv-link  spirv-lint  spirv-opt  spirv-reduce  spirv-val
ken@llvm-gw001m1aftf:~/workspace/SPIRV-Tools/install$ ls lib/
cmake  libSPIRV-Tools.a  libSPIRV-Tools-diff.a  libSPIRV-Tools-link.a  libSPIRV-Tools-lint.a  libSPIRV-Tools-opt.a  libSPIRV-Tools-reduce.a  libSPIRV-Tools-shared.so  pkgconfig
ken@llvm-gw001m1aftf:~/workspace/SPIRV-Tools/install$ ls include/
spirv-tools
Diff
diff --git a/llvm/tools/CMakeLists.txt b/llvm/tools/CMakeLists.txt
index c6116ac81d12..d2046eaae1a7 100644
--- a/llvm/tools/CMakeLists.txt
+++ b/llvm/tools/CMakeLists.txt
@@ -35,6 +35,8 @@ add_llvm_tool_subdirectory(llvm-config)
 add_llvm_tool_subdirectory(llvm-lto)
 add_llvm_tool_subdirectory(llvm-profdata)

+add_llvm_tool_subdirectory(spirv-tools)  # 编译spirv-as spirv-dis等工具
+
 # Projects supported via LLVM_EXTERNAL_*_SOURCE_DIR need to be explicitly
 # specified.
 add_llvm_external_project(clang)

编译LLVM时需要打开SPIRV编译,这样llc可以直接吐出spv二进制

llvm/lib/target/spirv,可以使得从clang直接编译到spv,但不能反向从spv到ll,这一点,SPIRV-LLVM-Translator可以办到。

CMake
mkdir build
mkdir install

cmake  ../llvm -DCMAKE_INSTALL_PREFIX=../install -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_BUILD_TYPE=RELEASE -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra"  -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="SPIRV" -DLLVM_INCLUDE_SPIRV_TOOLS_TESTS=ON | tee cmake.log


make -j16 --trace VERBOSE=2 | tee make.log
make install | tee install.log

2. 对SPIRV-LLVM-Translator进行编译(编译llvm-spirv)

编译llvm-spirv和libLLVMSPIRVLib.a 该库提供OpenCL_Compiler/demo中所使用的!::llvm::writeSpirv(mod.get(), os, ErrMsg)函数

这里将该项目做为一个单独的项目进行编译,也可以将其放入llvm/tools中一起进行编译,参考官网的README文件。

Bash
which clang, 提前设置好clang的安装
mkdir build
mkdir install
cd build
如果无法下载依赖,使用外部头文件
cmake -DCMAKE_INSTALL_PREFIX=../install ..

以下为使用外部头文件,提前SPIRV-Headers下载好,放到某个位置如/home/ken/workspace/SPIRV-LLVM-Translator
cmake -DCMAKE_INSTALL_PREFIX=/home/ken/workspace/SPIRV-LLVM-Translator/install .. -DLLVM_EXTERNAL_PROJECTS="SPIRV-Headers" -DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=/home/ken/workspace/SPIRV-LLVM-Translator/SPIRV-Headers
make --trace | tee make.log
make install --trace
Text Only
$ tree install 
install
├── bin
│   └── llvm-spirv
├── include
│   └── LLVMSPIRVLib
│       ├── LLVMSPIRVExtensions.inc
│       ├── LLVMSPIRVLib.h
│       └── LLVMSPIRVOpts.h
└── lib
    ├── libLLVMSPIRVLib.a
    └── pkgconfig
        └── LLVMSPIRVLib.pc

5 directories, 6 files

3. 对pocl进行编译

参考pocl源代码中的INSTALL

Bash
mkdir build
cd build
# 编译llvmm默认是编译出.a,使用STATIC_LLVM=ON
# DENABLE_ICD=OFF 会在pocl中编译出libOpenCL库,而不是使用系统中可能存在的库
cmake -DSTATIC_LLVM=ON -DENABLE_ICD=OFF -DCMAKE_INSTALL_PREFIX=/home/ken/workspace/pocl/install .. | tee cmake.log 
# 在cmake.log中搜索llvm-spirv看是否被识别到。
make --trace VERBOSE=2 | tee build.log 
make install --trace


如果出现错误的话,可能是测试导致的,禁用测试

mkdir build

cd /home/ken/workspace/pocl/build

# 重新配置,禁用测试
cmake .. \
  -DCMAKE_INSTALL_PREFIX=/home/ken/workspace/pocl/install \
  -DSTATIC_LLVM=ON \
  -DENABLE_ICD=OFF \
  -DENABLE_TESTS=OFF \
  -DENABLE_EXAMPLES=OFF

# 编译
make -j$(nproc)

# 安装
cmake --install .

cmake install .只安装编译成功的组件、

Bash
set -x

mkdir build
mkdir install
cd build
# 编译llvmm默认是编译出.a,使用STATIC_LLVM=ON
# DENABLE_ICD=OFF 会在pocl中编译出libOpenCL库,而不是使用系统中可能存在的库
cmake -DSTATIC_LLVM=ON -DENABLE_ICD=OFF -DCMAKE_INSTALL_PREFIX=/home/ken/workspace/pocl/install .. | tee cmake.log
# 在cmake.log中搜索llvm-spirv看是否被识别到。
make -j8 VERBOSE=2 | tee build.log
cmake install . --trace
Python
$ tree install
install
├── bin
   └── poclcc
├── include
   └── CL
       ├── cl2.hpp
       ├── cl_d3d10.h
       ├── cl_d3d11.h
       ├── cl_dx9_media_sharing.h
       ├── cl_dx9_media_sharing_intel.h
       ├── cl_egl.h
       ├── cl_ext.h
       ├── cl_ext_intel.h
       ├── cl_ext_pocl.h
       ├── cl_gl_ext.h
       ├── cl_gl.h
       ├── cl.h
       ├── cl_half.h
       ├── cl_icd.h
       ├── cl_platform.h
       ├── cl_va_api_media_sharing_intel.h
       ├── cl_version.h
       ├── opencl.h
       └── opencl.hpp
├── lib
   ├── libOpenCL.so -> libOpenCL.so.2
   ├── libOpenCL.so.2 -> libOpenCL.so.2.12.0
   ├── libOpenCL.so.2.12.0
   ├── pkgconfig
      └── pocl.pc
   └── pocl
       ├── libpocl-devices-basic.so
       └── libpocl-devices-pthread.so
└── share
    └── pocl
        ├── include
           ├── _builtin_renames.h
           ├── _clang_opencl.h
           ├── _enable_all_exts.h
           ├── _kernel_c.h
           ├── _kernel_constants.h
           ├── _kernel.h
           ├── _libclang_versions_checks.h
           ├── opencl-c-base.h
           ├── opencl-c.h
           ├── pocl_device.h
           ├── pocl.h
           ├── pocl_image_types.h
           ├── pocl_spir.h
           └── pocl_types.h
        └── kernel-x86_64-unknown-linux-gnu-alderlake.bc

9 directories, 41 files

4. 编译clinfo

下载clinfo项目,并进行编译

Bash
https://github.com/Oblomov/clinfo
make --trace VERBOSE=1

ldd clinfo 检测所使用的库是否是编译出来的,如果不是的话,添加-L选项,指明库路径。
可能需要修改Makefile文件中的OpenCL-Headers
39 #CPPFLAGS += -I../OpenCL-Headers
   40 CPPFLAGS += -I/home/ken/workspace/pocl/include

5. 设置环境

Bash
export SPIRV_LLVM_TRANSLATE=/home/ken/workspace/SPIRV-LLVM-Translator
export LLVM_HOME=/home/ken/workspace/llvm-project
export SPIRV_TOOLS=$LLVM_HOME/build/tools/spirv-tools/SPIRVTools-bin/tools
export PATH=$LLVM_HOME/install/bin:$SPIRV_TOOLS:$SPIRV_LLVM_TRANSLATE/install/bin:$PATH
export LD_LIBRARY_PATH=/home/ken/workspace/pocl/install/lib:$LD_LIBRARY_PATH