0

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

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

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

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

4

2 回答 2

1

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

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

于 2015-04-21T16:19:08.610 回答
0

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

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

于 2015-04-21T18:03:07.783 回答