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 中的天花板/地板的主要内容,如果未能解决你的问题,请参考以下文章

在解决重复问题时,地板和天花板何时重要?

在二叉搜索树中查找地板和天花板

使用 Revit API 移动天花板或地板图案

java 中常用的类

Math类中的取整方法

网络监控系统综合布线施工有哪些标准?