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