質問

ショートパンツにdouble型の値をキャストするための高速な方法は、(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を行うための高速な方法があります疑います。

役に立ちましたか?

解決

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とのより良い性能を与えるだろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top