我在支持 avx2 (Intel E5-2643 V3) 的机器上编译了我的 c++ 程序。它编译并运行得很好。我确认使用了 avx2 指令,因为在分解二进制文件后,我看到了 avx2 指令,例如vpbroadcastd.
然后我在另一台只有 avx 指令集(Intel E5-2643 V2)的机器上运行这个二进制文件。它运行也很好。二进制文件是否在向后兼容的 avx 指令上运行?这个指令是什么?您看到任何潜在的问题吗?
在二进制文件中包含 AVX2 指令并使用 CPU 检测来确保仅在支持它们的 CPU 上运行的情况并不罕见。(例如通过cpuid和设置函数指针)。
如果 AVX2 指令实际上在不支持 AVX2 的 CPU 上执行,则会引发#UD,因此操作系统会向您的进程或 Windows 等效项发送 SIGILL(非法指令)。
在某些情况下,类似指令lzcnt解码为rep bsr,它在没有 BMI1 的 CPU 上运行bsr。(给出不同的答案)。但 VEX 编码的 AVX2 指令在较旧的 CPU 上会出错。