0

我在代码生成之前尝试了多目标功能 - 静态库选项。我写了一个生成器,并且能够为多个目标功能生成静态库和头文件,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
4

2 回答 2

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。这应该允许您跟踪调用并隔离错误是否在该例程的逻辑中。

于 2017-02-08T16:58:54.257 回答
0

您正在做的事情(理论上)应该可以正常工作并且不会崩溃(尽管如上所述,您指定的顺序将产生次优性能)。

第一个有趣的问题是看看崩溃的本质是什么——非法指令?别的东西?捕获这些信息将非常有帮助。

于 2017-02-08T21:43:16.787 回答