运行基本 Avx512 代码时获得非法指令
Posted
技术标签:
【中文标题】运行基本 Avx512 代码时获得非法指令【英文标题】:Getting Illegal Instruction while running a basic Avx512 code 【发布时间】:2019-06-16 19:04:30 【问题描述】:我正在尝试学习 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;
【问题讨论】:
欢迎来到Stack Overflow。如果我们不能完全编译它,就很难帮助你调试你的代码。您应该添加足够的代码minimal reproducible example,这样其他人就不必创建其他位来测试它。就目前而言,不值得花时间测试您的代码。在这种情况下,您是否还可以确保您的 CPU 支持 AVX2 和 AVX512。 :) 可能你的 CPU 不支持 AVX512。使用g++ -march=native
启用您的 CPU 支持的所有功能。如果您遇到编译错误,则您的 CPU 不支持 AVX512。
什么让你认为你可以在你的 CPU 上使用这条指令?
@PeterCordes 我得到了编译错误。所以,我的 CPU 不支持 AVX512。谢谢!
【参考方案1】:
可能您的 CPU 根本不支持 AVX512。仅限这些和更新一代的 CPU support AVX-512:
服务器/工作站:Skylake-SP(“至强可扩展性能”)及更高版本,Skylake-X 高端台式机/工作站。 客户端:Ice Lake 及更高版本,例如i5-1035G4 和Rocket Lake 桌面,例如i5-11600. (也是非常有限的发行版Cannon Lake laptop chip) 这些 Celeron / Pentium 版本有 AVX2,但没有 AVX-5121。 至强融核计算卡,第二代及更高版本 (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?
Coding on insufficient hardware Intel AVX intrinsics: any compatibility library out?(在编译时而非运行时模拟)。MSVC 和 ICC do 允许您在不告诉编译器目标支持它们的情况下使用内部函数,因此这种针对 CPU 检查代码的方法不适用于这些编译器。他们会很乐意让您编译不会在当前 CPU 上运行的代码。 (因为 MSVC 假设您要进行运行时 CPU 检测和调度,而不是分发源代码让每个人都针对自己的机器进行优化。)
关于没有 AVX-512 的 CPU 的更多信息
英特尔processor name/number meanings
AMD 还没有发布任何 AVX-512 CPU(传闻指向 Zen4),老款 Intel 也没有。 Skylake-client没有有 AVX-512,只有 Skylake-server。 Intel 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 表,看看哪个 CPU 有什么。 AVX-512F 是“基础”,AVX-512VL 允许在 128 位和 256 位向量上使用很酷的新指令。
脚注 1:旧 Intel CPU 的 Pentium/Celeron 版本甚至没有 AVX,只有 SSE4.2。 (也缺少 BMI1/2,因为它们禁用了 VEX 前缀的解码)。
【讨论】:
以上是关于运行基本 Avx512 代码时获得非法指令的主要内容,如果未能解决你的问题,请参考以下文章