C++ error: intrinsic function was not declared in scope

C++ error: intrinsic function was not declared in scope

我想编译使用内部函数 _mm256_undefined_si256()(returns 8 个压缩双字整数的向量)的代码。这是头文件中受影响函数的缩减片段:

// test.hpp
#include "immintrin.h"

namespace {
    inline __m256i foo(__m256i a, __m256i b) {
        __m256i res = _mm256_undefined_si256();
        // some inline asm stuff
        // __asm__(...);
        return res;
    }
}

通过 gcc -march=native -mavx2 -O3 -std=c++11 test.cpp -o app 编译会抛出以下错误 >>_mm256_undefined_si256<< was not declared in this scope.

我无法解释为什么没有定义这个内在函数,因为头文件中使用了其他可以正常工作的内在函数。

您的代码适用于 GCC4.9 和更新版本 (https://godbolt.org/z/bajMsKvK9)。 GCC4.9 于 2014 年 4 月发布,将近十年前,最新的 GCC4.8.5 发布于 2015 年 6 月。所以是时候升级您的编译器了!

GCC4.8 缺少那个内在的,甚至不知道 -march=sandybridge(更不用说具有 AVX2 的 Haswell 的调整选项),尽管它确实知道意义不大的 -march=corei7-avx .


GCC 确实错过了英特尔添加的一些更晦涩的内在函数以及对新指令集的支持,因此对 _mm256_add_epi32 的支持并不总是意味着 _mm256_undefined_si256()

例如直到 GCC11 他们才添加 _mm_load_si32(void*) unaligned aliasing-safe movd (我认为英特尔与 AVX-512 大约同时推出),所以已经晚了很多年。 (直到 GCC12 / 11.3 才能正确实现它,Bug 99754, and still not aliasing-safe for _mm_load_ss(float*) (Bug 84508)。

但幸运的是 _mm256_undefined_si256,所有主流编译器的 non-ancient 版本都支持它。