Halide 多目标静态库-崩溃

Halide 多目标静态库-崩溃,halide,Halide,我正在试验提前代码生成的多目标特性-静态库选项。我编写了一个生成器,能够为多个目标功能生成静态库和头文件,如target=x86-64-windows-sse41、x86-64-windows-avx、x86-64-windows-avx2 但是,在链接到我的应用程序后,应用程序崩溃。当我只指定target=x86-64-windows-sse41时,应用程序运行正常。是,我的系统支持SSE4.1 我的理解是,在为多个目标编译时,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的符号。它还具有外部卤化物可以使用目标功能

看来我错过了一些步骤。有关于如何使用此功能的指示吗

谢谢

更新

以下是我的处理器支持的内容-从实用程序中提取

IntelR XeonR CPU E5-2697 v2@2.70GHz Intel64系列6型号37第1步,GenuineIntel 微码签名:00000428 FPU*实现i387浮点指令 MMX*支持MMX指令集 MMXEXT-实现AMD MMX扩展 3DNOW-支持3DNOW!说明书 3DNOWEXT-支持3DNow!扩展指令 SSE*支持数据流单指令多数据扩展指令集 SSE2*支持第二代数据流单指令多数据扩展指令集 SSE3*支持第三代数据流单指令多数据扩展指令集 SSSE3*支持补充单指令多数据扩展指令集3 SSE4a-支持流式SIMDR扩展4a SSE4.1*支持数据流单指令多数据扩展指令集4.1 SSE4.2*支持数据流单指令多数据扩展指令集4.2 AES*支持AES扩展 AVX-支持AVX指令扩展 FMA-支持使用YMM状态的FMA扩展 MSR*实现RDMSR/WRMSR指令 MTRR*支持内存类型范围寄存器 XSAVE-支持XSAVE/XRSTOR指令 OSXSAVE-支持XSETBV/XGETBV指令 RDRAND-支持RDRAND指令 RDSEED-支持RDSEED指令

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

不起作用

SSE41,AVX,AVX2 SSE41,AVX2,AVX AVX2,SSE41,AVX AVX,SSE41,AVX2 工作

AVX2,AVX,SSE41 AVX,AVX2,SSE41
多目标功能旨在完成您正试图完成的任务。有一个包装函数,它调用halide_can_use_target_特性,并且仅在返回true时调用使用这些特性编译的例程

崩溃是基于AVX还是AVX2指令?除了SSE 4.1之外,如果只添加了AVX或AVX2,它是否有效


通过调用halide\u set\u custom\u can\u use\u target\u功能,可以覆盖halide\u can\u use\u target\u功能。这应该允许您跟踪调用,并隔离该例程的逻辑中是否存在错误。

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


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

根据compile\u to\u multitarget\u static\u库的评论,每个生成的函数都将按顺序考虑。因此,您应该从高到低对它们进行排序,即avx2、avx、sse41。Khouri的排序是正确的,但这不会导致崩溃或正确性失败,只会导致次优性能。对于上面的示例,将永远不会选择avx和avx2目标,因为所有这类机器也都有sse41,并且将首先选择sse41目标。@KhouriGiordano您的建议阻止了崩溃!好的,看了代码之后,我知道发生了什么;可以说这不是一个bug,但我们仍然可以做得更好。现在的情况是,最终目标被认为是最安全的目标;我们使用它来编译一些由所有目标共享的公共运行时代码。由于您通常更喜欢最具体的,而不是最不具体的,例如avx2-avx-sse41、avx-sse41、sse41、plain-old-x86,这意味着常见的东西只使用plain-old-x86。这就是说,Halide可以更具弹性,并确保运行时只使用属于所有目标的功能发出。这应该由修复,但您也应该修复请求的目标的顺序。还请记住,您正在生成的代码根本不会在SSE41之前的机器上运行,这些机器现在只占一小部分,但您仍然应该意识到&预计会出现故障。崩溃是由非法指令信号处理程序捕获的。