'_mm_hadd_ps'未在此范围内声明

'_mm_hadd_ps' was not declared in this scope

本文关键字:范围内 声明 hadd mm ps      更新时间:2023-10-16

我正在优化我的矩阵乘法代码。

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> 中的声明。