0

我们已经使用 Halide 语言实现了一些算法,这些算法使用arctan三角函数。但出于检测目的,我们希望强制 Halide 不生成向量指令。

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

有没有办法从 Halide 语言方面以某种方式强制执行此操作,或者以任何方式拦截数学库调用,在那里我们可以要求 Halide 使用arctan我们编写的函数,这些函数未针对使用向量指令进行优化。

4

2 回答 2

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。

于 2017-01-05T19:15:30.593 回答
1

您应该能够将其设置为targethost-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。

于 2017-01-05T18:55:04.590 回答