OpenCL代码编译成Vulkan代码(SPIR)的工具

栏目: 后端 · 发布时间: 5年前

内容简介:最近接到个任务,就是把根据官方文档,官方提供了一个名为

最近接到个任务,就是把 OpenCL.cl 代码编译成 Vulkan 程序。

根据官方文档, Vulkan 1.0 支持 OpenCL 1.0/2.1 的代码直接编译成 Vulkan 程序。

官方提供了一个名为 KhronosGroup/SPIR 的开源项目,支持 OpenCL 编译成 SPIR-V 代码的功能( Vulkan 使用 SPIR-V )。

这个 工具 使用的 LLVM 的版本非常古老,编译的时候问题多多。

这个工具在 macOS Mojave(10.14.2) 系统上使用 gcc 8.2.0 的编译流程如下:

$ git clone http://llvm.org/git/llvm.git llvm
 
$ cd llvm
 
$ git checkout --track -b release_32 remotes/origin/release_32
 
$ cd llvm/tools
 
$ git clone https://github.com/KhronosGroup/SPIR clang
 
$ cd clang
 
# 官方要求检出 spir_12 分支,但是貌似执行完成 clone 之后,就已经在这个分支上了
# git checkout --track -b spir_12 remotes/origin/spir_12
 
$ cd ../..
 
$ mkdir build
 
$ cd build
 
# 只能使用GCC编译,不能使用自带的LLVM编译
$ brew install gcc
 
$ brew unlink gcc
 
$ brew cleanup
 
$ brew link gcc
 
# 指定路径
$ export PATH=$(brew --prefix)/bin:$PATH
 
# 重定向编译工具到我们安装的GCC版本,版本号从brew的命令行中查询得到,如果安装了多个版本,请手工指定这个参数
$ export BREW_GCC_VER=$(brew list --versions | grep gcc | sed 's/\([0-9]\).*/\1/g' | tr -cd "[0-9]")
 
$ export CC="$(brew --prefix)/bin/gcc-$BREW_GCC_VER"
 
$ export CXX="$(brew --prefix)/bin/g++-$BREW_GCC_VER"
 
# 链接库目录
$ export CMAKE_LIBRARY_PATH=$(brew --prefix)/lib
 
$ export CMAKE_INCLUDE_PATH=$(brew --prefix)/include
 
# 不能使用 GCC 引入的 ar,ranlib 这两个程序,这两个程序处理的库不能被ld正常链接,我们需要使用macOS官方提供的 ar,ranlib
# 出现这个问题的原因在于macOS上的GCC并没有提供ld,其实即使提供ld也不能正常执行,原因在于macOS与GNU格式不兼容,无法正常链接
# 因此只能使用系统自带的链接工具,链接工具只认识系统自带的 ar,ranlib 转换后文件的格式
$ mv /usr/local/bin/ranlib /usr/local/bin/ranlib2
 
$ ln -s /usr/bin/ranlib /usr/local/bin/ranlib
 
$ mv /usr/local/bin/ar /usr/local/bin/ar2
 
$ ln -s /usr/bin/ar /usr/local/bin/ar
 
# 不能编译成动态库,原因在于这个版本的代码存在循环依赖的问题,动态库无法成功编译,只能编译成静态库
$ cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES=x86_64  -DCMAKE_CXX_FLAGS="-march=native"
 
$ make

如果使用 Xcode Version 10.1 (10B61) 编译会报告如下错误:

[ 14%] Building CXX object lib/Analysis/CMakeFiles/LLVMAnalysis.dir/LazyValueInfo.cpp.o
/Users/xx/llvm/lib/Analysis/LazyValueInfo.cpp:998:14: error: no matching member function for call to
      'insert'
    worklist.insert(worklist.end(), succ_begin(ToUpdate), succ_end(ToUpdate));
    ~~~~~~~~~^~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:713:14: note: 
      candidate function not viable: no known conversion from 'llvm::succ_iterator' (aka
      'SuccIterator<llvm::TerminatorInst *, llvm::BasicBlock>') to 'std::__1::vector<llvm::BasicBlock *,
      std::__1::allocator<llvm::BasicBlock *> >::size_type' (aka 'unsigned long') for 2nd argument
    iterator insert(const_iterator __position, size_type __n, const_reference __x);
             ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:724:9: note: 
      candidate template ignored: requirement '!__is_forward_iterator<SuccIterator<TerminatorInst *, BasicBlock>
      >::value' was not satisfied [with _InputIterator = llvm::SuccIterator<llvm::TerminatorInst *,
      llvm::BasicBlock>]
        insert(const_iterator __position, _InputIterator __first, _InputIterator __last);
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:734:9: note: 
      candidate template ignored: requirement 'is_constructible<value_type, typename
      iterator_traits<SuccIterator<TerminatorInst *, BasicBlock> >::reference>::value' was not satisfied [with
      _ForwardIterator = llvm::SuccIterator<llvm::TerminatorInst *, llvm::BasicBlock>]
        insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last);
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:705:14: note: 
      candidate function not viable: requires 2 arguments, but 3 were provided
    iterator insert(const_iterator __position, const_reference __x);
             ^
1 error generated.
make[2]: *** [lib/Analysis/CMakeFiles/LLVMAnalysis.dir/LazyValueInfo.cpp.o] Error 1
make[1]: *** [lib/Analysis/CMakeFiles/LLVMAnalysis.dir/all] Error 2
make: *** [all] Error 2

如果编译的时候出现如下错误信息:

ld: warning: ignoring file ../../lib/libLLVMTableGen.a, file was built for archive which is not the architecture being linked (x86_64): ../../lib/libLLVMTableGen.a
ld: warning: ignoring file ../../lib/libLLVMSupport.a, file was built for archive which is not the architecture being linked (x86_64): ../../lib/libLLVMSupport.a
 
...................................
 
ld: symbol(s) not found for architecture x86_64
 
...................................

则说明编译的时候,没有指定使用 macOS 官方提供的 ar , ranlib ,链接这两个程序到 Xcode 提供的即可。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浅薄

浅薄

[美]尼古拉斯·卡尔 / 刘纯毅 / 中信出版社 / 2015-11 / 49.00 元

互联网时代的飞速发展带来了各行各业效率的提升和生活的便利,但卡尔指出,当我们每天在翻看手机上的社交平台,阅读那些看似有趣和有深度的文章时,在我们尽情享受互联网慷慨施舍的过程中,我们正在渐渐丧失深度阅读和深度思考的能力。 互联网鼓励我们蜻蜓点水般地从多种信息来源中广泛采集碎片化的信息,其伦理规范就是工业主义,这是一套速度至上、效率至上的伦理,也是一套产量最优化、消费最优化的伦理——如此说来,互......一起来看看 《浅薄》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具