有没有办法强制Halide不生成使用向量指令的代码?

时间:2017-01-05 18:38:43

标签: llvm halide

我们使用Halide语言实现了很少的算法,使用cl像三角函数。但是出于仪器目的,我们希望强制Halide不生成向量指令。

我们在Windows中使用visual c ++,在Visual Studio 2013工具链中使用cl编译器。到目前为止,尝试使用/arch:IA32强制arctan,但它仍会生成向量指令。

有没有办法以某种方式从Halide语言方面或以任何方式强制拦截数学库调用,我们可以要求Halide使用我们编写的Helmet函数,这些函数未针对使用向量指令进行优化。 / p>

2 个答案:

答案 0 :(得分: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上,如果你没有打开目标中的任何x86 SIMD标志(例如,没有SSE41,AVX等),那么我们应该设置llvm目标机器完全禁止SIMD指令。但这不会影响libm中的内容,除非你在最后的链接时采取措施。

您也可以使用HalideExtern声明对您自己选择的例程的调用,并使用它而不是atan。

答案 1 :(得分:1)

你应该能够将target设置为host-x86-64,这应该阻止Halide使用任何矢量化(即使用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。