'_mm_hadd_ps'未在此范围内声明
'_mm_hadd_ps' was not declared in this scope
我正在优化我的矩阵乘法代码。
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
float tmp = 0;
for (int k = 0; k < SIZE; k+=4) {
v1 = _mm_load_ps(&m1[i][k]);
v2 = _mm_load_ps(&m2[j][k]);
vMul = _mm_mul_ps(v1, v2);
vRes = _mm_add_ps(vRes, vMul);
}
vRes = _mm_hadd_ps(vRes, vRes);
vRes = _mm_hadd_ps(vRes, vRes);
_mm_store_ss(&result[i][j], vRes);
}
}
但g++
抱怨说"*'_mm_hadd_ps'没有在这个范围内声明*"。为什么会这样,我可以使用其他 SSE 函数,例如_mm_add_ps
......
水平添加指令(如_mm_hadd_ps
)是SSE3的一部分。您当前使用的所有其他都是 SSE。
您似乎只包含 SSE 或 SSE2 标头。
因此,您将需要 SSE3 标头:
#include <pmmintrin.h>
它将实现:
-
_mm_addsub_ps
-
_mm_addsub_pd
-
_mm_hadd_ps
-
_mm_hadd_pd
-
_mm_hsub_ps
-
_mm_hsub_pd
-
_mm_movehdup_ps
-
_mm_movehdup_pd
-
_mm_moveldup_ps
-
_mm_moveldup_pd
-
_mm_lddqu_si128
使用 #include <x86intrin.h>
,它将包括目标处理器支持的所有内部函数。在最新版本的 GCC 中不推荐包含 pmmintrin.h
和类似内容。还要确保在编译中以 SSE3 指令集为目标,方法是添加-msse3
选项,或者(更好)使用-march=
选项。
除了像Mysticial指出的那样包含正确的标头外,您可能还需要将-msse3
标志添加到g++
的命令行参数中,以便启用SSE3指令。这将允许代码生成器发出 SSE3 指令,并将定义__SSE3__
预处理器宏,然后启用 <pmmintrin.h>
中的声明。
相关文章:
- 错误:未在此范围内声明'reverse'
- 错误:"imread"未在此范围内声明
- 未在此范围内声明错误 'xy'
- Socklen_t未在此范围内声明
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- "Main"已在当前范围内声明
- c++ 变量在宏的扩展中没有在这个范围内声明
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 'num1'未在此范围内声明
- 如何找到在本地范围内声明的变量的地址?
- NT状态未在此范围内声明
- 变量未在此范围内声明 数组线性搜索
- 包含文件中的 Typdef "未在此范围内声明"
- 'ClassName'和'ClassInstance'未在此范围内声明
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 如何修复错误:"vreinterpretq_u32_f64"未在此范围内声明 - 在Android上使用Eigen构建
- 如何修复C++中的"arrStud未在此范围内声明"错误
- 错误:"SHGetKnownFolderPath"未在此范围内声明
- 错误:'Sprite'未在此范围内声明