2017-01-05 34 views
0

我们已经实现了几个使用Halide语言的算法,它使用了像三角函数那样的arctan。但为了仪器的目的,我们希望强制Halide不要生成矢量指令。有没有办法强制Halide不生成使用向量指令的代码?

我们在Visual Studio 2013工具链中使用windows中的visual C++和cl编译器。到目前为止,试图使用/arch:IA32强制cl,但它仍然生成向量指令。

有没有办法从卤化物语言侧或任何办法拦截数学库调用以某种方式迫使这有我们可以问卤化物使用由我们书面arctan功能未优化以充分利用向量指令。

回答

1

你应该能够设置target是,比如说,主机X86-64应防止卤化物使用任何量化(即使用SSE4/AVX指令*)。

如果您使用带发生器的AOT,请看:http://halide-lang.org/tutorials/tutorial_lesson_15_generators_usage.html my_first_generator_basic不应该使用任何SIMD指令。

与JIT不太相似,但此示例显示了如何在JITing时设置目标:https://github.com/halide/Halide/wiki/Minimal-GPU-example您应该能够使用类似的方法将目标指定为x86-64。

3

通常Halide不会为atan生成任何代码,并且实现将来自系统数学库(libm)。 (对于所有数学例程来说,这是不正确的,因为我们为某些例程提供了内部实现,但通常这是通过诸如fast_log,fast_exp等名称来明确的)。要覆盖这个,通常会提供自己的libm或atan(和atan2等),但Halide可能允许您定义atan_f32和atan_f64来执行覆盖。这可能是有利的,因为这些应该用弱连接来声明,尽管这可能不适用于Windows。您还可以在src/runtime/posix_math.ll中更改这些例程的定义以指向您自己的。

一般来说,如果计划表明Halide只会生成向量化的代码。但是,llvm具有可以生成向量指令的自动向量化过程。在x86_64上,SIMD指令通常将用于标量浮点计算。在32位x86上,如果您没有打开Target中的任何x86 SIMD标志(例如,没有SSE41,AVX等),那么我们应该设置llvm目标机器完全禁止SIMD指令。但是这不会影响libm中的东西,除非在最后的链接时间采取措施。

您也可以使用HalideExtern声明对您自己选择的例程的调用,并使用该例程代替atan。

+0

我看了这个例子.. https://github.com/halide/Halide/blob/master/test/correctness/c_function.cpp 但似乎cl.exe编译的代码找不到符号 –

相关问题