2010-06-08 21 views
2

有一个快速的方法来投双值短裤(16位有符号),目前我在做这样的事情:通过使用SSE进行钳位的快​​速双转换>

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

查找minsd,maxsd和cvtsd2si,或者如果您想并行执行2,则使用minpd,maxpd和cvtpd2dq。

使用第一种方法的唯一真正好处是您可以保存分支。生成的SSE2代码几乎和使用编译为SSE2的代码一样快2倍......真正的胜利来自于同时执行其中的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中有更好的性能。

+0

谷歌搜索出现了这个主题:http://www.gamedev.net/community/forums/topic.asp?topic_id=256880 – zdav 2010-06-08 21:30:10

+0

更新使用VS Intrinsics。 – Goz 2010-06-08 21:37:45

+0

非常好,谢谢! – 2010-06-08 21:39:29