【发布时间】:2013-12-14 02:40:47
【问题描述】:
我正在考虑更改一些当前需要 16 字节对齐数组并使用_mm_load_ps 来放松对齐约束并使用_mm_loadu_ps 的高性能代码。关于 SSE 指令的内存对齐对性能的影响有很多神话,所以我做了一个小的测试用例应该是一个内存带宽绑定循环。使用对齐或未对齐的负载内在函数,它通过一个大数组运行 100 次迭代,将元素与 SSE 内在函数相加。源代码
在这儿。 https://gist.github.com/rmcgibbo/7689820
在配备 Sandy Bridge Core i5 的 64 位 Macbook Pro 上的结果如下。较低的数字表示更快的性能。当我阅读结果时,我发现在未对齐的内存上使用 _mm_loadu_ps 基本上没有性能损失。
我觉得这很令人惊讶。这是一个公平的测试/合理的结论吗?在哪些硬件平台上有区别?
$ gcc -O3 -msse aligned_vs_unaligned_load.c && ./a.out 200000000
Array Size: 762.939 MB
Trial 1
_mm_load_ps with aligned memory: 0.175311
_mm_loadu_ps with aligned memory: 0.169709
_mm_loadu_ps with unaligned memory: 0.169904
Trial 2
_mm_load_ps with aligned memory: 0.169025
_mm_loadu_ps with aligned memory: 0.191656
_mm_loadu_ps with unaligned memory: 0.177688
Trial 3
_mm_load_ps with aligned memory: 0.182507
_mm_loadu_ps with aligned memory: 0.175914
_mm_loadu_ps with unaligned memory: 0.173419
Trial 4
_mm_load_ps with aligned memory: 0.181997
_mm_loadu_ps with aligned memory: 0.172688
_mm_loadu_ps with unaligned memory: 0.179133
Trial 5
_mm_load_ps with aligned memory: 0.180817
_mm_loadu_ps with aligned memory: 0.172168
_mm_loadu_ps with unaligned memory: 0.181852
【问题讨论】:
-
您是否认真地在 Python 中运行高性能代码? Python 比 C/C++ 慢 2 个数量级。至于未对齐的负载,由于 uArch 的更改,在使用较新的硬件 (Haswell) 时它们比以前更快。未对齐读/写的最大问题是它可能跨越缓存线边界甚至页面边界(当然不太常见)。
-
在 python 中使用 scipy.weave 似乎是在不同机器上测试 C 的 sn-p 并发布到 stackoverflow 的最简单方法。我正在考虑更改的实际代码是一个包含在 python 中的 C 库。所有的计算都发生在 C 层。
-
这些都不是在 Haswell 上。我在 Westmere 和 Sandy Bridge 上看到了 _mm_loadu_ps 与 _mm_load_ps 的轻微性能优势。
-
现在,您正在根据对齐的参数测试 MOVUPS。看看当它实际用于未对齐移动时会发生什么。
-
关于“问题文本变得相当长”,我建议暂时放弃所有 Python 内容,并将 Q 仅基于 C 代码。
标签: c performance sse