2

double値をshorts(16ビット符号付き)にキャストする高速な方法はありますか?現在、私は次のようなことをしています:

double  dval = <sum junk>
int16_t sval;
if (val > int16_max) { 
   sval = int16_max;
} else if (val < int16_min) {
   sval = int16_min;
} else 
   sval = (int16_t)val;

SSEを使用してこれを行うには、はるかに効率的な高速な方法があると思います。

4

1 に答える 1

4

minsd、maxsd、および cvtsd2si を調べるか、2 つを並行して実行する場合は、minpd、maxpd、および cvtpd2dq を使用します。

最初の方法を使用する唯一の本当のボーナスは、ブランチを保存することです。とにかく、生成された SSE2 コードは、SSE2 にコンパイルされたコードを使用して、ほぼ 2 倍の速さになります。

編集: Visual Studio 組み込み関数を使用して実行したい場合、コードは次のようになると思います。

 __m128d sseDbl = _mm_set_sd( dbl );
 sseDbl         = _mm_min_sd( dbl, _mm_set_sd( 32767.0 ) );
 sseDbl         = _mm_max_sd( dbl, _mm_set_sd( -32768.0 ) );
 short shrtVal  = (short)_mm_cvtsd_si32( sseDbl );

そして、仕事は終わりました。アセンブラーを使用してそれを行うこともかなり似ていますが、上記の方法を使用すると、Visual Studio でのパフォーマンスが確実に向上します。

于 2010-06-08T21:29:25.377 に答える