运行基本的Avx512代码时获取非法指令

pra*_*jha 1 c c++ avx avx2 avx512

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

非法指令(核心已转储)

该代码在下面提到,我正在使用它进行编译

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;
}

Run Code Online (Sandbox Code Playgroud)

Pet*_*des 6

您的CPU可能根本不支持AVX512。 到目前为止,通常只有服务器芯片支持它(例如skylake-server,Cascade Lake和Xeon Phi)。也是英特尔放弃的限量发行的Cannon Lake笔记本电脑芯片。Ice Lake计划成为第一个支持AVX512的客户端CPU。另请参阅带有AVX-512的维基百科的CPU表。


使用g++ -O3 -march=native让您的一切CPU支持。

如果你得到的编译错误(如未经宣布的功能_mm512_loadu_ps),你的CPU并没有支持AVX512所以G ++没有启用,所以immintrin.h不会定义内在。

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

仅当要为其他CPU(而不仅仅是要编译的计算机)制作二进制文件时,才使用单独的-mavx512f-mtune=选项。


相关:如何在不支持硬件的情况下测试AVX-512指令?