我了解处理器通过缓存行将数据带入缓存,例如,在我的Atom处理器上,每次带入大约64个字节的数据,无论实际读取的数据大小如何。
我的问题是:
如果您需要从内存中读取一个字节,那么哪些64个字节会被带入缓存?
我能看到的两种可能性是:64个字节从距离要读取字节最近的64个字节边界开始,或者64个字节以某种预定的方式分布在要读取的字节周围(例如,一半在下面,一半在上面,或全部在上面)。
它是哪一种情况?
我了解处理器通过缓存行将数据带入缓存,例如,在我的Atom处理器上,每次带入大约64个字节的数据,无论实际读取的数据大小如何。
我的问题是:
如果您需要从内存中读取一个字节,那么哪些64个字节会被带入缓存?
我能看到的两种可能性是:64个字节从距离要读取字节最近的64个字节边界开始,或者64个字节以某种预定的方式分布在要读取的字节周围(例如,一半在下面,一半在上面,或全部在上面)。
它是哪一种情况?
更多阅读:Ulrich Drepper的程序员应该了解的有关内存的一切。软件预取建议有点过时:现代硬件预取器更加智能,而超线程比P4时期要好得多(因此预取线程通常是浪费)。此外,x86标签的维基页面中有许多有关该架构性能的链接。
#define CACHE_BLOCK_BITS 6
#define CACHE_BLOCK_SIZE (1U << CACHE_BLOCK_BITS) /* 64 */
#define CACHE_BLOCK_MASK (CACHE_BLOCK_SIZE - 1) /* 63, 0x3F */
/* Which byte offset in its cache block does this address reference? */
#define CACHE_BLOCK_OFFSET(ADDR) ((ADDR) & CACHE_BLOCK_MASK)
/* Address of 64 byte block brought into the cache when ADDR accessed */
#define CACHE_BLOCK_ALIGNED_ADDR(ADDR) ((ADDR) & ~CACHE_BLOCK_MASK)
0b1000000
,注意到最后6位是零,所以即使你有一些数字中有这6个中的任意一个被设置(代表数字%64),清除它们将会给你最接近的64字节对齐内存地址。 - legends2k我不能确定每个硬件都是如此,但通常情况下,“64字节从最接近的64字节边界开始”是一种对于CPU来说非常快速简单的操作。