C++ 错误:未在作用域中声明内部函数

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

提问人:terdev 提问时间:5/28/2022 最后编辑:Peter Cordesterdev 更新时间:5/29/2022 访问量:454

问:

我想编译使用内部函数的代码(返回 8 个打包双字整数的向量)。以下是从头文件中截取的受影响函数的减少截图:_mm256_undefined_si256()

// 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.

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

C++ GCC 内部函数 AVX AVX2

评论

4赞 kotatsuyaki 5/28/2022
你真的在编译 C++ 代码吗? 应该改用。gccg++
1赞 kotatsuyaki 5/28/2022
@Elliott 当然,我当然知道默认情况下会启用一些额外的选项。但是,我没有看到问题中使用了这些标志,这可能会导致链接器错误,所以我怀疑这是否真的是用于编译代码的命令。g++gcc
0赞 terdev 5/29/2022
@kotatsuyaki我在 g++ 中遇到了同样的错误。
3赞 kotatsuyaki 5/29/2022
您的代码在 godbolt 上编译,因此它可能是特定于您的机器的东西。您可以发布完整的编译器输出消息吗?
0赞 chtz 5/29/2022
请阅读如何(以及为什么)提供最小的可重现示例

答:

2赞 Peter Cordes 5/29/2022 #1

您的代码适用于 GCC4.9 及更高版本 (https://godbolt.org/z/bajMsKvK9)。GCC4.9 于 2014 年 4 月发布,距今已近十年,GCC4.8.5 的最新版本是在 2015 年 6 月。因此,是时候升级您的编译器了!

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


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

例如,直到 GCC11 他们才添加了未对齐的混叠安全(我认为英特尔与 AVX-512 几乎同时推出),所以这晚了很多年。(直到 GCC12 / 11.3 让 GCC 正确实现它,错误 99754,并且仍然不具有混叠安全性(错误 84508)。_mm_load_si32(void*)movd_mm_load_ss(float*)

但幸运的是,它得到了所有主流编译器的非古代版本的支持。_mm256_undefined_si256