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

Posted

技术标签:

【中文标题】如何解决 vfmadd213ps 的“非法指令”?【英文标题】:How to solve "illegal instruction" for vfmadd213ps? 【发布时间】:2019-07-23 01:31:02 【问题描述】:

我已经尝试过 AVX 内在函数。但它导致“test.exe 中 0x00E01555 处未处理的异常:0xC000001D:非法指令。”

我用的是Visual Studio 2015。异常错误是在“vfmadd213ps ymm2,ymm1,ymm0”指令引起的。 我尝试设置“/arch:AVX”和“/arch:AVX2”,但仍然导致错误。 下面是我的代码。

    #include <immintrin.h>

    int main(int argc, char *argv[])
    
    float a[8] =  0 ;
    float b[8] =  0 ;
    float c[8] =  0 ;
    __m256 _a = _mm256_loadu_ps(a);
    __m256 _b = _mm256_loadu_ps(b);
    __m256 _c = _mm256_loadu_ps(c);
    __m256 result = _mm256_fmadd_ps(_a, _b, _c);
    _mm256_storeu_ps(c, result);
    return 0;
    

"__m256 result = _mm256_fmadd_ps(_a, _b, _c);" is disassembly

    vmovups     ymm0,ymmword ptr [_c]  
    vmovups     ymm1,ymmword ptr [_b]  
    vmovups     ymm2,ymmword ptr [_a]  
    vfmadd213ps ymm2,ymm1,ymm0  
    vmovups     ymmword ptr [ebp-160h],ymm2  
    vmovups     ymm0,ymmword ptr [ebp-160h]  
    vmovups     ymmword ptr [result],ymm0  

以及在“vfmadd213ps ymm2,ymm1,ymm0”引起的错误。

那么我做错了什么?操作系统是 win 7 64 位,CPU 是 Intel(R) Core(TM) i7-3520M CPU @ 2.90Ghz(4 个 CPU),~2.9Ghz。

【问题讨论】:

MSVC 不会阻止您使用您尚未通过 /arch: 启用的 ISA 扩展中的内部。如果您使用gcc -march=native-march=ivybridge-mavx 编译它,它将拒绝_mm256_fmadd_ps,因为该CPU 没有FMA3,并且AVX 并不暗示FMA3。 【参考方案1】:

因为您的处理器不支持该指令。

FVMADD213PS 是 FMA3 指令集扩展的一部分。英特尔在 Haswell(“第四代核心”)英特尔微架构中增加了对这一指令集扩展的支持;您笔记本电脑中的处理器是 Ivy Bridge(“第三代核心”)部件,所以它太旧了,无法支持此功能。

【讨论】:

谢谢。那么在我的情况下,_mm256_fmadd_ps 的替代品是什么? 我找到了。使用 __m256 结果 = _mm256_add_ps(_mm256_mul_ps(_a, _b), _c) 代替 __m256 结果 = _mm256_fmadd_ps(_a, _b, _c)。还是谢谢。

以上是关于如何解决 vfmadd213ps 的“非法指令”?的主要内容,如果未能解决你的问题,请参考以下文章

exe_common.inl 中的非法指令

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

运行DPDK程序报错:非法指令 核心已转储

Linux下系统命令提示Illegal instruction

import tensorflow是出现非法指令(核心已转储)

非法指令(核心转储) HElib