运行基本 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 代码时获得非法指令的主要内容,如果未能解决你的问题,请参考以下文章

使用 Intel Core i7 的 AVX 上的非法指令

非法指令(核心转储) HElib

FAISS 搜索失败并出现模糊错误:“非法指令”或内核崩溃

如何解决 vfmadd213ps 的“非法指令”?

动态确定恶意 AVX-512 指令的执行位置

使用 -mfma 编译时的非法指令