SSE 的整数/浮点值

Posted

技术标签:

【中文标题】SSE 的整数/浮点值【英文标题】:Integer/Floating points values with SSE 【发布时间】:2015-04-21 16:09:14 【问题描述】:

我必须将一个整数向量与另一个整数向量相乘,然后将结果(即整数向量)与浮点值向量相加。

我应该将 MMX 或 SSE4 用于整数,还是仅将 SSE 与所有这些值一起使用(即使有整数?)将整数放入 __m128 寄存器中?

确实,我经常在 __m128 寄存器中使用整数,我不知道我是在浪费时间(隐式转换值)还是同样的事情。

我正在使用 -O3 选项进行编译。

【问题讨论】:

向我们展示你想用一些代码做什么。按照 Paul R 的建议,显示您想要执行的操作的标量代码。 【参考方案1】:

您可能应该对所有事情都使用 SSE(MMX 只是 SSE 的一个非常过时的前身)。如果您打算主要针对较新的 CPU,那么您甚至可以考虑使用 AVX/AVX2。

首先在标量代码中干净、稳健地实现所有内容,然后对其进行基准测试。标量实现可能足够快,您不需要做任何其他事情。此外,gcc 和其他编译器(例如 clang、ICC 甚至 Visual Studio)在自动矢量化方面变得相当出色,因此您可以“免费”获得满足您性能需求的 SIMD 矢量化代码。但是,如果此时您仍然需要更好的性能,那么您可以开始将标量代码转换为 SSE。保留原始标量实现以进行验证和基准测试 - 在优化代码时很容易引入错误,并且知道优化后的代码比基线代码快多少很有用(您可能正在寻找 2x 和 4x 之间的某个地方SSE 与标量代码相比更快)。

【讨论】:

【参考方案2】:

虽然之前的答案是合理的,但有一个显着的区别 - 数据组织。对于直接 SSE 使用的数据,最好将其组织为数组结构 (SoA)。通常,您的标量代码可能具有围绕结构数组 (AoS) 布局生成的数据。如果是这样的话,从标量到向量的转换会很困难

更多阅读https://software.intel.com/en-us/articles/creating-a-particle-system-with-streaming-simd-extensions

【讨论】:

我认为在他向我们展示一些代码之前,很难说 OP 应该做什么。

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

numpy ufunc/算术性能 - 整数不使用 SSE?

可以使用 movss 指令替换整数数据吗?

基于带有循环的“编码”整数应用浮点值

如何检查浮点值是不是为整数

SSE/AVX 向量类型的差异

需要将浮点值转换为php中条件以下的整数格式