虽然您通常在 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
较低的延迟和互惠吞吐量更好。从这些表中我们可以得出结论
_mm_mul_epi32
的延迟小于 _mm_mul_ps
, _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/