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' 未在此范围内声明*”。为什么会这样,我可以使用其他 SSE 功能,例如_mm_add_ps...

4

3 回答 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
于 2012-10-03T14:56:20.923 回答
7

使用#include <x86intrin.h>,它将包括目标处理器支持的所有内在函数。pmmintrin.h在最新版本的 GCC 中,不推荐使用包含等,也不推荐使用。还要确保在编译中以 SSE3 指令集为目标,或者通过添加-msse3选项,或者(更好)通过使用-march=选项。

于 2012-10-03T15:45:09.397 回答
3

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

于 2012-10-03T15:05:51.397 回答