我正在提前尝试使用多目标功能 - 静态库选项。我编写了一个生成器,能够为target=x86-64-windows-sse41,x86-64-windows-avx,x86-64-windows-avx2
等多个目标功能生成静态库和头文件
但是在链接到我的应用程序后,应用程序崩溃了。当我仅指定target=x86-64-windows-sse41
时,应用程序运行正常。是的,我的系统支持SSE4.1。
我的理解是,在为多个目标进行编译时,Halide会在运行时检查功能支持,并调用适当的规范。
我做了dumpbin /All mylib.lib /out:mylib.txt
并找到了sse41,avx和avx2的符号。它还有External | halide_can_use_target_features
看起来我错过了一些步骤。有关如何使用此功能的任何指示?
由于
更新
以下是我的处理器支持的内容 - 从Coreinfo实用程序中提取
Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz
Intel64 Family 6 Model 37 Stepping 1, GenuineIntel
Microcode signature: 00000428
FPU * Implements i387 floating point instructions
MMX * Supports MMX instruction set
MMXEXT - Implements AMD MMX extensions
3DNOW - Supports 3DNow! instructions
3DNOWEXT - Supports 3DNow! extension instructions
SSE * Supports Streaming SIMD Extensions
SSE2 * Supports Streaming SIMD Extensions 2
SSE3 * Supports Streaming SIMD Extensions 3
SSSE3 * Supports Supplemental SIMD Extensions 3
SSE4a - Supports Streaming SIMDR Extensions 4a
SSE4.1 * Supports Streaming SIMD Extensions 4.1
SSE4.2 * Supports Streaming SIMD Extensions 4.2
AES * Supports AES extensions
AVX - Supports AVX intruction extensions
FMA - Supports FMA extensions using YMM state
MSR * Implements RDMSR/WRMSR instructions
MTRR * Supports Memory Type Range Registers
XSAVE - Supports XSAVE/XRSTOR instructions
OSXSAVE - Supports XSETBV/XGETBV instructions
RDRAND - Supports RDRAND instruction
RDSEED - Supports RDSEED instruction
这些是我尝试过的目标的顺序。
不起作用
作品
答案 0 :(得分:1)
多目标功能旨在完成您要执行的操作。有一个包装器函数调用halide_can_use_target_features,并且如果它返回true,则只调用用这些特性编译的例程。
AVX或AVX2指令崩溃了吗?如果除SSE 4.1之外只添加AVX或仅添加AVX2,它是否有效?
您可以通过调用halide_set_custom_can_use_target_features来覆盖halide_can_use_target_features。这应该允许您跟踪调用并隔离该错误是否在该例程的逻辑中。
答案 1 :(得分:0)
你正在做的事情(理论上)应该正常工作而不是崩溃(尽管如上所述,你指定的顺序会产生不理想的性能)。
第一个有趣的问题是看看崩溃的本质是什么 - 非法指令?别的什么?捕获这些信息会非常有用。