我正在尝试学习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;
}
答案 0 :(得分:6)
可能您的CPU根本不支持AVX512。到目前为止,几乎只有服务器芯片支持它(例如skylake-server,Cascade Lake和Xeon Phi)。还有英特尔放弃的限量发行的Cannon Lake laptop chip; Ice Lake计划成为第一个支持AVX512的客户端CPU。另请参阅Wikipedia的CPUs with AVX-512表。
使用g++ -O3 -march=native
启用CPU支持的所有功能。
如果遇到编译错误(如未声明的函数_mm512_loadu_ps
),则您的CPU 不不支持AVX512,因此g ++并未启用它,因此immintrin.h
不会定义内在的。
(或另一个可能的错误是错误“内联”目标选项不允许的内置函数。)
如果要为其他CPU(而不只是要编译的计算机)制作二进制文件,请仅使用单独的-mavx512f
和-mtune=
选项。