Llvm 有没有办法强迫卤化物不生成使用矢量指令的代码?

Llvm 有没有办法强迫卤化物不生成使用矢量指令的代码?,llvm,halide,Llvm,Halide,我们已经使用Halide语言实现了一些算法,该语言使用了arctan类三角函数。但出于检测目的,我们希望强制卤化物不生成向量指令 我们在Visual Studio 2013工具链中使用Windows中的Visual C++和 Cl编译器。到目前为止,尝试使用/arch:IA32强制执行cl,但它仍然生成向量指令 有没有一种方法可以从Halide语言方面强制实现这一点,或者以任何方式拦截数学库调用,在那里我们可以要求Halide使用我们编写的未优化为使用向量指令的函数。您应该能够将目标设置为,主机

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

我们在Visual Studio 2013工具链中使用Windows中的Visual C++和 Cl</Cl>编译器。到目前为止,尝试使用

/arch:IA32
强制执行
cl
,但它仍然生成向量指令


有没有一种方法可以从Halide语言方面强制实现这一点,或者以任何方式拦截数学库调用,在那里我们可以要求Halide使用我们编写的未优化为使用向量指令的函数。

您应该能够将
目标设置为,主机-x86-64,应防止卤化物使用任何矢量化(即使用sse4/avx*指令)

如果将AOT用于生成器,请查看:my_first_generator_basic不应使用任何SIMD指令


不太熟悉JIT,但本例显示了如何在JIT时设置目标:您应该能够使用类似的方法将目标指定为x86-64。

您应该能够将
目标设置为主机-x86-64,这样可以防止卤化物使用任何矢量化(即使用sse4/avx*指令)

如果将AOT用于生成器,请查看:my_first_generator_basic不应使用任何SIMD指令


不太熟悉JIT,但本例展示了如何在JIT时设置目标:您应该能够使用类似的方法将目标指定为x86-64。

通常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中的内容,除非您在最终链接时采取措施


您还可以使用Halidextern声明对自己选择的例程的调用,并使用该例程而不是atan。

通常,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中的内容,除非您在最终链接时采取措施

您还可以使用Halidextern声明对自己选择的例程的调用,并使用该调用而不是atan。

我看了这个示例。。但是cl.exe编译的代码似乎找不到我在本例中看到的符号。。但是cl.exe编译的代码似乎找不到符号