sse simd 中的天花板/地板
Posted
技术标签:
【中文标题】sse simd 中的天花板/地板【英文标题】:ceil/floor in sse simd 【发布时间】:2011-03-11 01:33:29 【问题描述】:谁能建议一种使用 SSE4.1 之前的 SIMD 快速计算 float
floor/ceil 的方法?我需要正确处理所有极端情况,例如当我有一个 float
值时,它不能用 32 位 int 表示。
目前我正在使用类似于以下代码(我使用 C 内部函数,为清楚起见转换为 asm):
;make many copies of the data
movaps xmm0, [float_value]
movaps xmm1, xmm0
movaps xmm2, xmm0
;check if the value is not too large in magnitude
andps xmm1, [exp_mask]
pcmpgtd xmm1, [max_exp]
;calculate the floor()
cvttps2dq xmm3, xmm2
psrld xmm2, 31
psubd xmm3, xmm2
cvtsq2ps xmm2, xmm3
;combine the results
andps xmm0, xmm1
andnps xmm1, xmm2
orps xmm0, xmm1
有没有更有效的方法来检查浮点值是否对于 32 位 int 来说不是太大?
【问题讨论】:
【参考方案1】:这里有一些单个元素的伪代码,应该可以直接转换成向量指令:
float f;
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */
if (i == 0x80000000)
return f;
else
return (float)i;
您将使用舍入模式在第二行中转换为int
。您还可以测试MXCSR
中的IE
标志以检测超出范围的值。
【讨论】:
以上是关于sse simd 中的天花板/地板的主要内容,如果未能解决你的问题,请参考以下文章