在 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。
事实上,如果我改变优化级别,效果似乎会相反。所以我想知道为什么设置不同的输入会导致这些问题?
您可能有一个不支持 AVX-512 的 AWS 实例。 有时你会得到 Zen 3 (
-march=znver3
)。 它因运行而异,我不知道有什么方法可以请求特定的实例类型。 您可以使用 -march=native
和 #ifdef __AVX512F__
,这样如果不支持,您的测试就会被忽略。
我记得过去看到的实例类型是 Cascade Lake、Ice Lake 和 Zen 3。现在可能有更新的 Intel,也可能有更新的 AMD。
这些向量常量都不需要在寄存器中实现512位指令(但无论如何都可以禁用优化)。 但两者都将使用单个 512 位存储来初始化
volatile
,因此两个版本都应该制作使用 AVX-512 指令的 asm。 正如您从使用 ZMM 寄存器的 Godbolt 上的 asm 中看到的那样。