当我在支持 avx2 的机器上编译而 运行 二进制文件在另一台仅支持 avx 的机器上编译时会发生什么?

What happens when I compile on machine that supports avx2 and run the binary on another machine that only supports avx?

我在支持 avx2 (Intel E5-2643 V3) 的机器上编译了我的 c++ 程序。它编译并且 运行 很好。我确认使用了 avx2 指令,因为在我分解二进制文件后,我看到了 avx2 指令,例如 vpbroadcastd.

然后我 运行 在另一台只有 avx 指令集的机器(Intel E5-2643 V2)上运行这个二进制文件。它 运行 也很好。二进制 运行s 是否在向后兼容的 avx 指令上?这是什么指令?您看到任何潜在问题了吗?

如果 AVX2 指令实际执行,它会引发 #UD,因此 OS 将 SIGILL(非法指令)传递给您的进程,或 Windows 等效指令。

在某些情况下,像 lzcnt 这样的指令解码为 rep bsr,在没有 BMI1 的 CPU 上以 bsr 运行。 (给出不同的答案)。但是 VEX 编码的 AVX2 指令只是在 lder CPUs.

上出错

如果程序从不运行包含 AVX2 指令的函数,那么它可能会使用其他输入,或者它可能会执行运行时 CPU 检测。