预取对齐内存

Posted

技术标签:

【中文标题】预取对齐内存【英文标题】:Prefetching aligned memory 【发布时间】:2011-06-24 21:08:34 【问题描述】:

我有一些线程化的 C 代码,需要对已处理的数据结构进行 64 字节对齐。这种对齐将如何与 gcc __builtin_prefetch 等预取指令交互?预取的效果会和使用非对齐数组一样吗?

请注意,我使用 memalign 来获取对齐的数组。

谢谢。

【问题讨论】:

什么语言? C? C++? C#?超频?强迫症? 我将它添加到标签中。你现在应该得到更多的意见。 :) 它的用处会比平常少。在高速缓存行(大多数主流 cpu 上为 64 字节)上对齐数据让每个人都开心而无需太多帮助。 【参考方案1】:

这个问题的答案高度依赖于实现。

但是,在 x86 和 x86_64 上,GCC 将 __builtin_prefetch 实现为单个 PREFETCH 汇编指令。

根据Intel's documentation(搜索“PREFETCH”):

从内存中获取包含源指定字节的数据行 位置提示指定的缓存层次结构中位置的操作数:

我 99% 确定 AMD 版本的行为方式相同,但我太忙没时间检查...

因此,如果内存操作数未对齐,它将有效地向下舍入为 64 字节的倍数,并且将预取该缓存行。 (嗯,在我所知道的所有当前 CPU 上都是 64 字节。指令集引用只保证“至少 32 字节”。不知道他们为什么要这么说;在任何使用这个小工具有意义的情况下,您必须已经对特定的 CPU 做出了很多假设。)

【讨论】:

以上是关于预取对齐内存的主要内容,如果未能解决你的问题,请参考以下文章

DPDK — 性能优化手段

读或写预取之间的区别

内存对齐以及如何关闭内存对齐

内存对齐问题

结构体内存对齐

内存对齐原理