質問
ショートパンツに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とのより良い性能を与えるだろう。
所属していません StackOverflow