c++ - 将 float 组转换为整数的最佳方法。 [为 x64 替换我的 asm 代码]

标签 c++ visual-c++ assembly floating-point 64-bit

我有一个函数可以将 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/

相关文章:

c++ - 打印无符号字符指针内的值

c++ - 如何查找 Winsock.h 包含在 Visual Studio 中的位置

c++ - 无法引用变量...为什么?

visual-studio - 获取 vc++ 2010 代码以在 ubuntu 上编译

assembly - addq 与 64 位立即数?

c++ - std::vector 需要有 dll 接口(interface)供类 'X<T> 警告的客户端使用

c++ - 我如何将数字存储在一个循环中

c++ - 无法使用 wininet 将 ZIP 文件发布到服务器

java - Java 中的代码注入(inject)/程序集内联?

assembly - 汇编零和等于之间的区别