“_mm_hadd_ps”在此作用域中未声明。

3

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

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' was not declared in this scope*”。为什么会这样,我可以使用其他SSE函数比如_mm_add_ps


1
你是否已经 #include <pmmintrin.h> - Mysticial
3个回答

8
水平加法指令(例如_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

哦,我正在使用 <xmmintrin.h> 这个头文件,这只适用于 SSE 吗? - Jiew Meng
2
没错,xmm 是 SSE。emm 是 SSE2。pmm 是 SSE3。还有其他我记不住的。 - Mysticial

7

使用#include <x86intrin.h>,它将包含目标处理器支持的所有内嵌函数。在最近的GCC版本中,包括pmmintrin.h等已被弃用并不推荐使用。此外,请确保在编译时针对SSE3指令集进行目标设置,可以通过添加-msse3选项或(更好地)使用-march=选项来实现。


+1,但唯一的小问题是MSVC没有那个头文件。 - Mysticial

3

除了像Mysticial指出的那样包含正确的头文件外,您可能还需要将-msse3标志添加到 g++ 的命令行参数中,以启用SSE3指令。这将允许代码生成器发出SSE3指令,并定义__SSE3__预处理器宏,然后启用<pmmintrin.h>中的声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接