4

このようなもの:

_declspec(align(16)) float dens[4];

//Here the code comes. F32vec4 S_START, Pos, _Vector

*((__m128*)dens) = (S_START - Pos) *_Vector;

float steps = max(max(dens[3], dens[2]), max(dens[1], dens[0]));

SSEを使用して直接これを行うにはどうすればよいですか?

4

1 に答える 1

9

これを行う簡単な方法はありません。SSE は特に水平操作向けではありません。だからあなたはシャッフルする必要があります...

1 つのアプローチを次に示します。

__m128 a = _mm_set_ps(10,9,7,8);

__m128 b = _mm_shuffle_ps(a,a,78);  //  {a,b,c,d} -> {c,d,a,b}
a = _mm_max_ps(a,b);

b = _mm_shuffle_ps(a,a,177);        //  {a,b,c,d} -> {b,a,d,c}
a = _mm_max_ss(a,b);

float out;
_mm_store_ss(&out,a);

最後の店舗は実際には店舗ではないことに注意してください。float値をデータ型に入れるのは単なるハックです。

float型は同じ SSE レジスタに格納されるため、実際には命令は必要ありません。(上位 3 つの値が無視されるだけです。)

于 2012-06-22T23:30:48.453 に答える