虽然您通常在 CPU 上获得比浮点性能更好的整数算术性能,但有人可以澄清 SIMD 版本的情况。例如:

 __m128i _mm_mul_epi32(__m128i a, __m128i b);
//(multiplies 2 integer vectors)

相对:
__m128 _mm_mul_ps(__m128 a , __m128 b );
//(multiplies 2 float vectors)

哪个会产生更高的性能?(假设机器具有 SSE4 功能)。我这么说是因为我根据 SSE2 指令编写了自己的小数学库,我不知道我是否应该继续使用 __m128i。

最佳答案

让我展示我回答这些类型问题的第一个地方:Intel Intrinsic Guide 在线。你提供内在的,它告诉你它做什么,并通过 Haswell(很快就会有 Broadwell)处理器为 Nehalem 提供延迟和吞吐量。结果如下:

_mm_mul_ps

                Latency    Reciprocal throughput
Haswell         5          0.5
Ivy Bridge      5          1
Sandy Bridge    5          1
Westmere        4          1
Nehalem         4          1

_mm_mul_epi32
                Latency    Reciprocal throughput
Haswell         5          1
Ivy Bridge      3          1
Sandy Bridge    3          1
Westmere        3          1
Nehalem         3          1

较低的延迟和互惠吞吐量更好。从这些表中我们可以得出结论
  • 除了 Haswell _mm_mul_epi32 的延迟小于 _mm_mul_ps ,
  • Haswell 上的
  • 延迟相同,
  • 除了 Haswell 的吞吐量是一样的,
  • Haswell 上的
  • _mm_mul_ps 的吞吐量是 _mm_mul_epi32 的两倍。

  • Haswell 的吞吐量是唯一的主要惊喜。

    如果您想要 Nehalem 之前的处理器和/或 AMD 处理器的结果,请查看 Agner Fog 的 Instruction tables manual 或运行他用来测量延迟和吞吐量的 tests programs

    关于c++ - SSE4 和 SSE2 关于整数和浮点性能 - 哪个更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18422302/

    10-11 16:38