我有一个函数可以将 float 组转换为无符号字符数组。这使用 asm 代码来做到这一点。代码是很多年前写的。现在我正在尝试在 x64 位中构建解决方案。我了解 X64 不支持 _asm。
去除 asm 依赖性的最佳方法是什么?
如果我写 C 代码,最新的 MS VC 编译器会优化吗?有谁知道 boost 或 intrinsic functions 中是否有任何东西可以实现这一点?
谢谢 --哈里
我用下面的代码解决了,这比 asm 快
inline static void floatTOuchar(float * pInbuf, unsigned char * pOutbuf, long len)
{
std::copy(pInbuf, pInbuf + len, pOutbuf);
return ;
}
最佳答案
使用 SSE2,您可以使用内在函数从 float
压缩到 unsigned char
,饱和到 unsigned 0..255 范围。
将四个浮点 vector 转换为整数 vector ,使用CVTPS2DQ
(_mm_cvtps_epi32
) 舍入到最接近的值,或使用截断转换 (_mm_cvttps_epi32
) 如果你想要默认的 C floor
行为。
然后将这些 vector 打包在一起,首先使用两个 PACKSSDW
(_mm_packs_epi32
) 将两个有符号 16 位整数 vector 打包,然后使用 将一个无符号 8 位整数 vector 打包PACKUSWB
(_mm_packus_epi16
)。请注意,PACKUSWB 采用带符号的输入,因此使用 SSE4.1 PACKUSDW
作为第一步只会让事情变得更加困难(额外的屏蔽步骤)。 int16_t
可以表示uint8_t
所有可能的值,所以没有问题。
存储 uint8_t
的结果 vector 并为接下来的四个浮点 vector 重复。
没有手动矢量化,normal compiler output is good对于类似的代码。
int ftoi_truncate(float f) { return f; }
cvttss2si eax, xmm0
ret
int dtoi(double d) { return nearbyint(d); }
cvtsd2si eax, xmm0 # only with -ffast-math, though. Without, you get a function call :(
ret
关于c++ - 将 float 组转换为整数的最佳方法。 [为 x64 替换我的 asm 代码],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28469730/