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



我想要编译使用内部函数_mm256_undefined_si256()(返回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*)未对齐的混叠安全movd(我认为英特尔大约是在AVX-512的同时推出的),所以这已经晚了好几年了。(直到GCC12/11.3,GCC才能正确实现它,Bug99754,并且对于_mm_load_ss(float*)仍然不安全混叠(Bug84508)。

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

最新更新