多目标静态库 - 崩溃

时间:2017-02-08 10:02:38

标签: halide

我正在提前尝试使用多目标功能 - 静态库选项。我编写了一个生成器,能够为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

这些是我尝试过的目标的顺序。

  1. 不起作用

    • SSE41,AVX,AVX2
    • SSE41,AVX2,AVX
    • AVX2,SSE41,AVX
    • AVX,SSE41,AVX2
  2. 作品

    • AVX2,AVX,SSE41
    • AVX,AVX2,SSE41

2 个答案:

答案 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)

你正在做的事情(理论上)应该正常工作而不是崩溃(尽管如上所述,你指定的顺序会产生不理想的性能)。

第一个有趣的问题是看看崩溃的本质是什么 - 非法指令?别的什么?捕获这些信息会非常有用。