将 AVX512 矢量设置为零/非零会导致信号 SIGILL

问题描述 投票:0回答:1

在 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。

事实上,如果我改变优化级别,效果似乎会相反。所以我想知道为什么设置不同的输入会导致这些问题?

c++ intel avx512 compiler-explorer godbolt
1个回答
0
投票

您可能有一个不支持 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 中看到的那样。

© www.soinside.com 2019 - 2024. All rights reserved.