2013-07-14 4 views
5

__m128変数が4つのSP値を保持していて、最小値が必要な場合、組み込み関数があるかどうか、値間の単純な線形比較以外の値があるとしますか?__m128のSP値が最小値

右私の解決策は、(入力__m128変数がxであると仮定)は、次のことを知っている:かなり恐ろしいですが、それが働いている

x = _mm_min_ps(x, (__m128)_mm_srli_si128((__m128i)x, 4)); 
min = _mm_min_ss(x, (__m128)_mm_srli_si128((__m128i)x, 8))[0]; 

は(ところで、_mm_srli_si128のようなものの__m128タイプのために何がありますか?)

答えて

5

そこには、単一の命令/固有のものであるが、次の2つのシャッフルと2分でそれを行うことができます。

__m128 _mm_hmin_ps(__m128 v) 
{ 
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 1, 0, 3))); 
    v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 0, 3, 2))); 
    return v; 
} 

出力ベクトルには入力ベクトル内のすべての要素の最小値が含まれ、出力ベクトル全体に複製されます。

+0

これが正しいとお考えですか?この入力ベクトル( 'v [0]'から 'v [3]') '0.109375 0.096875 0.093750 0.096875'でテストしたところ、出力は' 0.096875 0.096875 0.093750 0.093750'です。あなたは複製によって何を意味しますか? –

+0

申し訳ありません - 私は定数を使いこなしました。出力ベクトルは、入力ベクトルの最小要素に等しい4つの要素すべてを有する。 –