预取对齐内存
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 做出了很多假设。)
【讨论】:
以上是关于预取对齐内存的主要内容,如果未能解决你的问题,请参考以下文章