当我在支持avx2的机器上编译并在另一台只支持avx的机器上运行二进制文件时会发生什么? < >我在支持AVX2(英特尔E5-2643 V3)的机器上编译了我的C++程序。它编译和运行都很好。我确认使用了avx2指令,因为在我分解二进制文件后,我看到了avx2指令,如vpbroadcasted

当我在支持avx2的机器上编译并在另一台只支持avx的机器上运行二进制文件时会发生什么? < >我在支持AVX2(英特尔E5-2643 V3)的机器上编译了我的C++程序。它编译和运行都很好。我确认使用了avx2指令,因为在我分解二进制文件后,我看到了avx2指令,如vpbroadcasted,c++,avx,avx2,C++,Avx,Avx2,然后我在另一台只有avx指令集的机器(英特尔E5-2643 V2)上运行这个二进制文件。它运行也很好。二进制文件是否在向后兼容的avx指令上运行?这个说明是什么?您是否看到任何潜在问题?如果AVX2指令实际执行,它会引发#UD,因此操作系统会将SIGILL(非法指令)发送到您的进程或Windows等效程序 在一些情况下,像lzcnt这样的指令解码为rep bsr,在没有BMI1的CPU上作为bsr运行。(给出不同的答案)。但VEX编码的AVX2指令只是在lder CPU上出现故障 如果程序从未

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

如果AVX2指令实际执行,它会引发
#UD
,因此操作系统会将SIGILL(非法指令)发送到您的进程或Windows等效程序

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



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

奇怪的是,二进制文件在没有AVX2指令的CPU上运行良好。我们没有捕获任何异常,程序完成时没有错误。对于这个特殊指令
vpbroadcasted
,旧CPU是否可能将
vpbroadcasted
解释为AVX指令集中可用的
VBROADCASTSD
?@werk:不,这是不可能的,就像我说的,VEX编码指令不是旧操作码前面的新前缀。它们使用不同的操作码和VEX前缀中的不同位。唯一的解释是根本不执行
vpbroadcasted
。(顺便说一句,相当于广播4个字节,一个dword。)有趣的事实:即使是
vbroadcasts/sd
的reg-reg格式也需要AVX2。只有广播加载形式是AVX1。如果您不确定,请编辑二进制文件并将
vpbroadcasted
替换为
0F 0B
。或者使用
int3
(调试器断点)。或者更简单地说,在调试器下运行它,并在该指令上设置断点,注意它从未被命中。(在GDB中,
b*0x12345
在数字地址设置断点)。你是用英特尔的编译器编译的还是什么,运行时的CPU调度?你说的正是我想的。我刚仔细检查了一下。看起来我们使用的是用avx/avx2编译的。在本文中,它表示“启用各种SIMD指令集。您需要支持给定SIMD扩展的编译器,但FFTW将在运行时尝试检测CPU是否支持这些扩展。也就是说,您可以使用--Enable avx进行编译,代码仍将在不支持avx的CPU上运行。”@werk:库可以像可执行文件一样轻松地将运行时分派到不同版本的函数。像x264和x265这样的视频编码器也可以做到这一点。这是一种方法,但许多主要的图书馆都会推出自己的自定义发送。我不知道为什么这个问题会遭到否决。我搜索了一下,但找不到答案。我们在哪里可以找到否决投票的原因,以便我们在未来能够改进?