gpt4 book ai didi

c++ - AVX/SSE 回合向下 float 并返回整数 vector ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:08 25 4
gpt4 key购买 nike

有没有办法使用 AVX/SSE 获取浮点 vector 、向下舍入并生成整数 vector ?所有的 floor 内部方法似乎都产生了一个浮点的最终 vector ,这很奇怪,因为四舍五入产生了一个整数!

最佳答案

SSE 可以从 FP 转换为整数,您可以选择截断(向零)或当前舍入模式(通常是 IEEE 默认模式,最接近平局舍入为偶数。像 nearbyint(),与 round() 不同,其中 tiebreak 是远离 0。如果您需要 x86 上的舍入模式,you have to emulate it, perhaps with truncate as a building block。)

相关说明为CVTPS2DQCVTTPS2DQ将压缩单精度 float 转换为有符号双字整数。助记符中带有额外 T 的版本执行截断,而不是当前的舍入模式。

; xmm0 is assumed to be packed float input vector
cvttps2dq xmm0, xmm0
; xmm0 now contains the (rounded) packed integer vector

或者使用内在函数,__m128i _mm_cvt[t]ps_epi32(__m128 a)


对于 x86 在硬件中提供的其他两种舍入模式,floor(朝向 -Inf)和 ceil(朝向 +Inf),一种简单的方法是使用此 SSE4.1/AVX ROUNDPS转换为整数之前的指令。

代码看起来像这样:

roundps  xmm0, xmm0, 1    ; nearest=0, floor=1,  ceil=2, trunc=3
cvtps2dq xmm0, xmm0 ; or cvttps2dq, doesn't matter
; xmm0 now contains the floored packed integer vector

对于 AVX ymm vector ,在指令前加上“V”并将 xmm 更改为 ymm。


ROUNDPS 是这样工作的

Round packed single precision floating-point values in xmm2/m128 and place the result in xmm1. The rounding mode is determined by imm8.

舍入模式(立即数/第三个操作数)可以具有以下值(取自当前英特尔文档的表 4-15 - 舍入模式和舍入控制 (RC) 字段的编码 ):

Rounding Mode               RC Field Setting   Description
----------------------------------------------------------
Round to nearest (even) 00B Rounded result is the closest to the infinitely precise result. If two values are equally close, the result is nearest (even) the even value (i.e., the integer value with the least-significant bit of zero).
Round down (toward −∞) 01B Rounded result is closest to but no greater than the infinitely precise result.
Round up (toward +∞) 10B Rounded result is closest to but no less than the infinitely precise result.
Round toward 0 (truncate) 11B Rounded result is closest to but no greater in absolute value than the infinitely precise result.

舍入操作的返回 vector 是 float 而不是 int 的可能原因可能是这样,进一步的操作总是浮点操作(在舍入值)和到 int 的转换将是微不足道的,如图所示。

相应的内在函数可在引用文档中找到。将上述代码转换为内在函数(取决于 Rounding Control (RC) Field)的示例是:

__m128 dst = _mm_cvtps_epi32( _mm_floor_ps(__m128 src) );

关于c++ - AVX/SSE 回合向下 float 并返回整数 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37091422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com