处理器如何获取缓存行?

时间:2013-09-11 10:45:12

标签: caching optimization assembly processor

当处理器预取一个缓存行数据时,它是否从该地址预取多达字节数,或者从该地址预取多达一半的缓存行,然后返回到缓存行的一半?

例如,假设高速缓存行是4个字节并从地址0x06预取。它会在0x06 0x07 0x08 0x09处获取字节还是从地址0x04 0x05 0x06 0x07预取。

我需要这个信息用于我正在编写并需要优化的程序。

2 个答案:

答案 0 :(得分:2)

根据this(当然是英特尔特有的)

“缓存行大小为32字节,或256位。 高速缓存行由处理器的64位数据总线上的四次读取突发填充。“

这意味着从主存储器并行获取8个字节,在这8个字节中没有第一个或最后一个,它们同时到达,因为字节是通过64位宽总线获取的。

由于需要4次读取来填充缓存行,因此英特尔似乎没有指定这4次读取的顺序 - 这意味着您有一些选择,例如。

  • 假设没有特定的订单
  • 假设地址从最低到最高,反之亦然。

第一个假设当然是最安全的 - 因为订单是我无法找到的(所以它可能取决于模型或其他因素)

答案 1 :(得分:1)

缓存行必须具有对齐方式,因此如果您的第一个读取或第一个导致缓存行获取的未命中事务位于缓存行的中间,它将返回并读取整个缓存行(所以你的地址之前的部分和之后的部分。)

通常,缓存使用地址的一部分来确定命中/未命中。因此,如果说缓存行是256字节,则用于确定命中/错误的地址位将从第8位开始,具体取决于缓存的大小(深度和方式)将决定要查看的位数。因此,如果在地址0x123处的访问产生未命中,则使用我的示例,则将读取来自0x100-0x1FF的高速缓存行。

如果是另一种方式,那将是更多的逻辑和工作和混乱,如果你可以在任何字节上启动缓存行,那么确定命中/未命中和/或你会/可能会更难重叠缓存行(某些数据项位于多个位置),必须进行整体管理,使缓存速度变慢。