我有一些线程化的 C 代码,需要对已处理的数据结构进行 64 字节对齐。这种对齐将如何与 gcc __builtin_prefetch 等预取指令交互?预取的效果是否与使用非对齐数组相同?
请注意,我使用 memalign 来获取对齐的数组。
谢谢。
我有一些线程化的 C 代码,需要对已处理的数据结构进行 64 字节对齐。这种对齐将如何与 gcc __builtin_prefetch 等预取指令交互?预取的效果是否与使用非对齐数组相同?
请注意,我使用 memalign 来获取对齐的数组。
谢谢。
这个问题的答案是高度依赖于实现的。
但是,在 x86 和 x86_64 上,GCC 实现__builtin_prefetch
为单个PREFETCH
汇编指令。
根据英特尔的文档(搜索“PREFETCH”):
从内存中获取包含源操作数指定的字节的数据行到缓存层次结构中由位置提示指定的位置:
我 99% 确定 AMD 版本的行为方式相同,但我太忙了,无法检查...
因此,如果内存操作数未对齐,它将有效地向下舍入为 64 字节的倍数,并且将预取该高速缓存行。(嗯,在我所知道的所有当前 CPU 上都是 64 字节。指令集引用只保证“至少 32 字节”。不知道他们为什么要这么说;在任何使用这个小工具有意义的情况下,您必须已经对特定的 CPU 做出了很多假设。)