gpt4 book ai didi

c++ - 运行基本 Avx512 代码时获取非法指令

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:23 25 4
gpt4 key购买 nike

我正在尝试学习 AVX 指令,并在运行我收到的基本代码时

Illegal instruction (core dumped)

下面提到了代码,我正在使用

编译它

g++ -mavx512f 1.cpp

问题到底是什么以及如何克服它?谢谢!

#include <immintrin.h>
#include<iostream>
using namespace std;

void add(const float a[], const float b[], float res[], int n)
{
int i = 0;

for(; i < (n&(~0x31)) ; i+=32 )
{
__m512 x = _mm512_loadu_ps( &a[i] );
__m512 y = _mm512_loadu_ps( &b[i] );

__m512 z = _mm512_add_ps(x,y);
_mm512_stream_ps(&res[i],z);
}

for(; i<n; i++) res[i] = a[i] + b[i];
}

int main()
{
int n = 100000;
float a[n], b[n], res[n];
for(int i = 0;i < n; i++)
{
a[i] = i;
b[i] = i+10;
}
add(a,b,res,n);
for(int i=0;i<n;i++) cout<<res[i]<<" ";
cout<<endl;
return 0;
}

最佳答案

可能您的 CPU 根本不支持 AVX512。
只有这些和更新世代的 CPU support AVX-512 :

  • Zen 4(大概以后)。

  • 服务器/工作站:Skylake-SP (“至强可扩展性能”)及更高版本,
    Skylake-X高端台式机/工作站。

  • 客户:Ice Lake后来例如i5-1035G4 和 Rocket Lake桌面,例如i5-11600.
    (还有非常有限的版本 Cannon Lake laptop chip )
    这些的赛扬/奔腾版本有 AVX2 但没有 AVX-5121

    不是奥尔德湖(第 12 代);英特尔倒退了他们的 AVX-512 支持,并积极阻止人们在芯片中使用 AVX-512 支持,该芯片最初可在禁用 E 核的情况下使用。

  • Xeon Phi 计算卡,第 2 代及更高版本 ( Knight's Landing )。


编译器选项

使用 clang 或 g++ -O3 -march=native 启用您的 CPU 支持的所有内容。

如果你遇到编译错误(比如未声明的函数 _mm512_loadu_ps),你的 CPU 支持 AVX512 所以 g++ 没有启用它,所以 immintrin.h 不会定义那个内在的。

(或者另一个可能的错误是“内联”目标选项不允许的内置错误。)

如果您想为其他 CPU 制作二进制文件,而不仅仅是您正在编译的机器,请仅使用单独的 -mavx512f-mtune= 选项。

相关:How to test AVX-512 instructions w/o supported hardware?

MSVC 和 ICC 确实允许您在不告诉编译器目标支持它们的情况下使用内部函数,因此这种根据 CPU 检查代码的方法不适用于这些编译器。他们很乐意让您编译不能在当前 CPU 上运行的代码。 (因为 MSVC 假定您将进行运行时 CPU 检测和调度,而不是为每个人分发源代码以针对他们自己的机器进行优化。)


更多关于不带 AVX-512 的 CPU

英特尔 processor name/number meanings

AMD 尚未发布任何 AVX-512 CPU(谣言指向 Zen4),而较旧的 Intel 也没有。
Skylake 客户端没有有 AVX-512,只有 Skylake 服务器。
英特尔 Alder Lake混合 (big.LITTLE) CPU won't have AVX-512 ,甚至在大核上也只有 AVX2。
Silvermont/Tremont 等低功耗 CPU 甚至没有 AVX1。

另请注意,AVX-512 有多个扩展,例如 AVX-512VPOPCNTDQ,它引入了 SIMD 指令来计算每个 SIMD 元素中的设置位。查看维基百科的CPUs with AVX-512 table 查看哪个 CPU 有什么。 AVX-512F 是“基础”,AVX-512VL 允许在 128 位和 256 位 vector 上使用很酷的新指令。

脚注 1:旧版 Intel CPU 的奔腾/赛扬版本甚至没有 AVX,只有 SSE4.2。 (也缺少 BMI1/2,因为它们禁用了 VEX 前缀的解码)。

关于c++ - 运行基本 Avx512 代码时获取非法指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com