3

SSE組み込み関数を使用してifステートメントに相当するものを書き込もうとしています。

私は__m128 _mm_cmplt_ps(__m128 a, __m128 b)比較a<bを行うために使用していますが、これは、または比較がそれぞれtrueまたはfalseの場合に返さ0xffffffff0x0ます。これらの値を1と0に変換したいと思います。これを行うには、論理「and」を実装するのが正しいですか。__m128 _mm_and_ps(__m128 c , __m128 d)ここcで、は変換の結果でありd、たとえば0xffffffff

ご清聴ありがとうございました。

4

1 に答える 1

17

1aまたはaを取得するために比較してから0、別の数値を掛けます。それは本質的にこれです:

c = (a < b) * d;

これはこれと同じです:

c = 0;
if (a < b)
    c = d;

これは、条件付き移動とも呼ばれます。

0それが必要な場合は、またはは必要ありません1。乗算する数値と直接比較した結果をANDするだけです。

__m128 c = _mm_cmplt_ps(a,b);
c = _mm_and_ps(c,d);

これが機能するのは、比較によってすべて0の'またはすべての'が返されるため1です。したがって、それらを結果とAND演算すると、ゼロになるか、完全に保持されます。

それは意図的にそのように設計されました。掛け算は必要ありません。

于 2012-11-06T18:42:20.147 に答える