2

有没有一种快速的方法可以将双精度值转换为短裤(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 回答