SSE 整数与浮点数练习

Posted

技术标签:

【中文标题】SSE 整数与浮点数练习【英文标题】:SSE ints vs. floats practice 【发布时间】:2012-02-24 20:52:41 【问题描述】:

在 SSE (AVX) 中同时处理整数和浮点数时,将所有整数转换为浮点数并仅使用浮点数是否是一种好习惯? 因为在那之后我们只需要几条 SIMD 指令,而我们只需要使用加法和比较指令 (<, <=, ==),我希望这种转换应该完全保留。

【问题讨论】:

理想情况下,最好摆脱浮点数而不是整数。整数更快、更好、更强:) 你需要展示一个你想要做什么的例子。 int != float。而且 AVX 还不支持 256 位宽的整数运算。 (AVX2 会)所以我明白你为什么要这样做。是否会更快将在很大程度上取决于您要执行的操作。 int 和 float 不同,不可互换。使用最能代表您的数据的类型。 目前,整数 SSE 比 FP-AVX 具有更高的吞吐量和更低的延迟。所以如果你只做加法和比较,我会坚持使用整数 SSE 而不是 FP-AVX。当它出现时,您还将获得 AVX2 的好处。受益于使用浮点数进行整数运算的应用程序子集相当小众。 (但它们确实存在) @Mysticial:所以,您可以将我们的算法分为两部分:int-input-version 与__m128i 一起使用,float-input-version 与__m256 一起使用,对吧? 【参考方案1】:

将我的 cmets 扩展为答案。

基本上你权衡以下权衡:

坚持整数:

整数 SSE 具有低延迟、高吞吐量。 (桑迪桥双期) 限制为 128 位 SIMD 宽度。

转换为浮点数:

受益于 256 位 AVX。 更高的延迟,并且只有单一问题的加法/减法(在 Sandy Bridge 上) 产生初始转换开销。 将输入限制为适合 float 的输入,而不会损失精度。

我会说现在坚持使用整数。如果您不想使用 float 版本复制代码,那您就可以了。

我见过用浮点数模拟整数变得更快的唯一情况是当你必须进行除法时。


请注意,我没有提到可读性,因为深入研究手动矢量化可能意味着性能更重要。

【讨论】:

AVX 浮点不是 Sandy Bridge 上的单一问题。确切的特征很难简明扼要地说明,但 Sandy Bridge 可以在每个周期执行 FP 加法和乘法(以及加载、存储和置换的某种组合)。有关详细信息,请参阅英特尔优化手册的 2.1.4。 (公平地说,提问者似乎没有做任何乘法运算,所以你并没有完全偏离目标) 我完全了解 add + mul 问题(以及某种洗牌)。但是,是的,我指的是 FP-add 是单一问题。 (虽然我承认我可以更清楚一点。)

以上是关于SSE 整数与浮点数练习的主要内容,如果未能解决你的问题,请参考以下文章

1定点数与浮点数

计算机中的定点数与浮点数 浮点数用 正负位 幕数 数字部分来表示

python数据运算

整型数与浮点数在内存中的表示

SSE 内在函数:将 32 位浮点数转换为 UNSIGNED 8 位整数

定点数与浮点数