编译
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