带SSE的整数值/浮点值

Integer/Floating points values with SSE

本文关键字:整数 SSE      更新时间:2023-10-16

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

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

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

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

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

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

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

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