0

VisualStudioでSSE論理命令を使用する方法についてサポートが必要です。MSDN Webサイトに基づいて、

__m128 _mm_and_ps(__m128 a , __m128 b );
ANDPS

オペランドaおよびbで論理積を実行するために使用できます。しかし、結果を取り戻すために必要な正確な手順(メモリのロードと初期化、設定、保存など)を理解できませんでした。

具体的には、次の方法を知りたいです。

  1. 操作を実行し、
  2. 結果を取り戻す、そして
  3. 結果のサイズ(有効ビット数)を取得します。

誰かがこれをどのように行うことができるか例で私に見せてもらえますか?

ありがとう!

4

1 に答える 1

5

次に例を示します。XORを使用してfloatベクトルのすべての要素の符号を反転します。

__m128 v1 = _mm_set_ps(0.0f, 1.0f, -1.0f, -2.0f);
                                       //   v1 =  0.0f,  1.0f, -1.0f, -2.0f
__m128 sign = _mm_set1_ps(-0.0f);      // sign = -0.0f, -0.0f, -0.0f, -0.0f
__m128 v2 = _mm_xor_ps(v1, sign);      //   v2 = -0.0f, -1.0f,  1.0f,  2.0f

したがって、配列内のすべての値を否定したい場合は、次のように一度に4つの要素を実行できます。

const int N = 1024;
float a[N];
const __m128 sign = _mm_set1_ps(-0.0f);// sign = -0.0f, -0.0f, -0.0f, -0.0f
for (int i = 0; i < N; i += 4)
{
    v = _mm_loadu_ps(&a[i]);           // load 4 elements (unaligned) from a[]
    v = _mm_xor_ps(v1, sign);          // invert sign bit (i.e. negate)
    _mm_storeu_ps(&a[i], v);           // store 4 elements (unaligned) back to a[]
}
于 2012-05-28T20:15:39.047 に答える