« 並列スワップ | メイン | 行列の転置 »

2008年02月23日

x86 SIMD Technique:: クリッピング

    

SIMD の比較を使えばクリッピングも並列に出来る。
以下の SSE を使ったコードでは、クリッピング以外に X 値がクリッピングされた分、UV 座標値を移動する処理も同時に行っている。

// if( x1 < 0 ) x1 = 0;
__m128 mx1_mask = _mm_cmplt_ps( x1, zero );// x1 < 0.0
__m128 minus_x1 = _mm_sub_ps( zero, x1 );  // -x1
u1 = _mm_add_ps( u1, _mm_and_ps( _mm_mul_ps( du, minus_x1 ), mx1_mask ) ); // u1 += du * -x1;
v1 = _mm_add_ps( v1, _mm_and_ps( _mm_mul_ps( dv, minus_x1 ), mx1_mask ) ); // v1 += dv * -x1;
x1 = _mm_andnot_ps( mx1_mask, x1 ); // x1 < 0.0 のものを0に、~a0 & b0
// if( x2 > dest_w ) x2 = dest_w;
__m128 mw_mask = _mm_cmpgt_ps( x2, dest_width );
x2 = _mm_add_ps( _mm_andnot_ps( mw_mask, x2 ), _mm_and_ps( dest_width, mw_mask ) ); // if( x2 > dest_w ) x2 = dest_w;

普通。

追記:
x2 側は、以下のように min を使うことで実現できる。
同様に x1 側も x1 だけであれば、max を使うことで実現できる。
ただ、上の例では、uv もその判定結果を使っているので、x1 は max ではなく比較を使った方が良い。

x2 = _mm_min_ps( x2, dest_width ); // dest_width 以下にする



投稿者 Takenori : 2008年02月23日 20:54




comments powered by Disqus
Total : Today : Yesterday : なかのひと