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では推奨されていません。-msse3また、オプションを追加するか、(より適切に)オプションを使用して、コンパイルでSSE3命令セットをターゲットにするようにしてください-march=

于 2012-10-03T15:45:09.397 に答える
3

Mysticialが指摘したように正しいヘッダーを含めることに加えて、SSE3命令を有効にするために、のコマンドライン引数に-msse3フラグを追加する必要がある場合もあります。g++これにより、コードジェネレーターはSSE3命令を発行できるようになり、__SSE3__プリプロセッサーマクロが定義されます。これにより、での宣言が有効になります<pmmintrin.h>

于 2012-10-03T15:05:51.397 に答える