[英]C++ error: intrinsic function was not declared in scope
我想编译使用内部函数_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*)
aliasing-safe movd
(我认为英特尔与 AVX-512 几乎同时推出),所以这已经晚了很多年。 (直到 GCC12 / 11.3 让 GCC 正确实现它,错误 99754 ,并且仍然不是_mm_load_ss(float*)
的别名安全(错误 84508 )。
但幸运的是_mm256_undefined_si256
,所有主流编译器的非古代版本都支持它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.