在 Godbolt 上,执行效果很好:
volatile __m512i v = _mm512_set_epi64(1, 0, 0, 0, 0, 0, 0, 0);
但全零则不然:
volatile __m512i v = _mm512_set_epi64(0, 0, 0, 0, 0, 0, 0, 0);
它产生信号SIGILL。非法指令?
这是为什么呢?
我正在使用带有标志 -std=c++23 -O0 -mavx512vl 的 clang 18.1。
事实上,如果我改变优化级别,效果似乎会反转。所以我只想知道为什么设置不同的输入会导致这些问题?
您获得的 AWS 实例不支持 AVX-512。
有时您会获得 Zen 3 (
-march=znver3
)。每次运行都会有所不同,我不知道有什么方法可以请求特定的实例类型。您可以使用
-march=native
,#ifdef __AVX512F__
因此如果不支持,您的测试将被省略。我记得过去见过的实例类型是 Cascade Lake、Ice Lake 和 Zen 3。现在可能有更新的英特尔和更新的 AMD 加入其中。
这两个向量常量都不需要512 位指令来实现寄存器(但在禁用优化的情况下可能还是需要)。但两者都将使用单个 512 位存储来初始化,
volatile
因此两个版本都应该使用 AVX-512 指令来制作 asm。正如您在 Godbolt 上使用 ZMM 寄存器的 asm 中看到的那样。