2017-01-05 35 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編譯的代碼找不到符號 –

相關問題