获取非法指令,同时运行的基本Avx512码(Getting Illegal Instruction

2019-09-28 22:14发布

我努力学习AVX指令,并同时运行的基本代码,我收到

非法指令(核心转储)

下面的代码中提到,我使用它编译

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

Answer 1:

也许你的CPU不支持AVX512的。 大多只有服务器芯片到目前为止支持(如SKYLAKE微架构的服务器,瀑布湖和至强融核)。 也非常有限释放炮湖的笔记本电脑芯片 ,英特尔放弃; 冰湖计划是支持AVX512第一客户端CPU。 另请参见维基百科的使用AVX-512的CPU表。


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

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

(或其他可能的错误是错误的“内联”为目标的选项不允许内置。)

只有使用独立的-mavx512f-mtune=如果你想为其它CPU的二进制,不只是你正在编译机器选项。


相关阅读: 如何测试AVX-512的指令W / O支持的硬件?

  • 编码硬件不足
  • 英特尔AVX内部函数:任何兼容性库吗? (在编译时,而不是运行时间模拟)。


文章来源: Getting Illegal Instruction while running a basic Avx512 code
标签: c++ c avx avx2 avx512