【发布时间】:2019-05-30 01:17:26
【问题描述】:
我如何像这些函数一样将 __m128 浮点数向上/向下或最接近的整数舍入?
- Round -
roundf() -
Ceil -
ceilf()或 SSE4.1_mm_ceil_ps。 -
Floor -
floorf()或 SSE4.1_mm_floor_ps。
我需要这样做没有 SSE4.1 roundps (_mm_floor_ps / _mm_ceil_ps / _mm_round_ps(x, _MM_FROUND_TO_NEAREST_INT |_MM_FROUND_NO_EXC). roundps 也可以截断为零,但我不需要对于这个应用程序。
我可以使用 SSE3 及更早版本。 (无 SSSE3 或 SSE4)
所以函数声明应该是这样的:
__m128 RoundSse( __m128 x )、__m128 CeilSse( __m128 x ) 和 __m128 FloorSse( __m128 x )。
【问题讨论】:
-
起点是reddit.com/r/programming/comments/1p2yys/…。虽然它使用按引用而不是按值。那里的代码也会产生 VS 2017 的问题。
-
你确定你真的需要
round,而 IEEE 默认的舍入模式不适合你吗?rintf或nearbyintf给你,而round使用 x86 在硬件中没有的特殊舍入模式。 round() for float in C++。 (如果您有 SSE4.1,可以在roundps之上使用一些指令来模拟它,因此如果您可以将roundps模拟到最近,您仍然可以模拟round(),但它可能会更慢。) -
Google for "sse_mathfun" - 这是一个有用的库,包含上述函数和许多其他函数。
-
@PaulR ,我宁愿在这里有一个实现,这样我才能理解它是如何工作的。对于其他搜索它的人也将是很好的参考。
-
见DirectXMath,具体是this source file中
XMVectorRound、XMVectorFloor、XMVectorCeil的实现
标签: c optimization vectorization sse simd