如何通过提前编译在Halide中生成位置无关的代码

时间:2019-03-19 06:07:54

标签: halide

我正在尝试halide,并希望在其之上构建一个小型共享库。但是Halide的AOT编译生成的代码似乎与位置无关。如何将Halide生成的对象链接到共享库中?

[更新]从我的代码中提取了一个小例子。

具体地说,我在c ++中使用了生成器:

class SimpleAddition : public Halide::Generator<SimpleAddition> {
 public:
  SimpleAddition() : vars(4) {}

  Input<Halide::Buffer<>> lhs{"lhs"};
  Input<Halide::Buffer<>> rhs{"rhs"};
  Output<Halide::Buffer<>> out{"out"};

  std::vector<Var> vars;
  void generate() {
    out(vars) = lhs(vars) + rhs(vars);
  }
};

HALIDE_REGISTER_GENERATOR(SimpleAddition, simple_addition)

在CMake的帮助下:

halide_library(ops SRCS ${CMAKE_CURRENT_LIST_DIR}/src/simple_addition.cc
  GENERATOR_NAME simple_addition
  GENERATOR_ARGS lhs.type=float32 lhs.dim=4 rhs.type=float32 rhs.dim=4 out.type=float32)

,并出现以下错误:

/usr/bin/ld: ./genfiles/halide_rt_host/halide_rt_host.a(halide_rt_host.a.o): relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status

我还尝试通过使用-e o,h自己运行生成器(没有CMake包装器)来生成对象,类似地,使用llvm位代码后跟llc -relocation-model=pic,也运行Func::compile_to_object。当我尝试将生成的对象链接回共享库时,发生了类似的错误:

/usr/bin/ld: halide_runtime_x86.o: relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status

我正在Ubuntu 18.10上运行它。 Halide和我的代码都是使用gcc-8.2.0编译的。 LLVM / Clang-7是其存储库中随附的一种。卤化物是用简单的cmake ../ && make && make install构建的。
对于我的测试代码的编译器标志,在CMake中使用的命令是add_libarary(mylib SHARED ...)。非CMake构建带有-fPIC -shared之类的标志,因为我还在学习中,所以没什么特别的。

1 个答案:

答案 0 :(得分:0)

默认情况下,卤化物应生成PIC(请参见Codegen_Internal.cpp,make_target_machine())。您的目标是什么架构?您正在使用什么编译器/链接器,以及哪些选项等?