当处理器预取数据的缓存行时,它是从该地址预取最多字节数,还是从该地址预取最多缓存行的一半并向后最多缓存一半线?
例如假设高速缓存行是 4 个字节并且从地址 0x06 预取。它会在 0x06 0x07 0x08 0x09 处获取字节还是从地址 0x04 0x05 0x06 0x07 中预取。
我需要此信息用于我正在编写并需要优化的程序。
当处理器预取数据的缓存行时,它是从该地址预取最多字节数,还是从该地址预取最多缓存行的一半并向后最多缓存一半线?
例如假设高速缓存行是 4 个字节并且从地址 0x06 预取。它会在 0x06 0x07 0x08 0x09 处获取字节还是从地址 0x04 0x05 0x06 0x07 中预取。
我需要此信息用于我正在编写并需要优化的程序。
据此(这自然是英特尔特有的)
“高速缓存线大小为 32 字节或 256 位。高速缓存线由处理器 64 位数据总线上的四次读取突发填充。”
这意味着从主存储器并行获取 8 个字节,在这 8 个字节中没有第一个或最后一个,它们同时到达,因为这些字节是通过 64 位宽的总线获取的。
由于需要 4 次读取来填充高速缓存行,英特尔似乎没有指定这 4 次读取的顺序 - 这意味着您还有一些选择,例如
第一个假设当然是最安全的——因为我能找到的订单是无证的(所以它可能取决于模型或其他因素)
缓存行必须对齐,因此如果您的第一个读取或第一个事务有未命中导致缓存行获取,它位于缓存行的中间,它将返回并读取整个缓存行(所以部分在您的地址之前和之后的部分)。
通常,高速缓存使用地址的一部分来确定命中/未命中。因此,如果说高速缓存行是 256 字节,那么用于确定命中/迷雾的地址位将从第 8 位开始,并且取决于高速缓存的大小(深度和方式)将确定要查看多少位。因此,使用我的示例,如果地址 0x123 的访问产生未命中,则将读取 0x100-0x1FF 的缓存行。
如果是另一种方式会产生更多的逻辑、工作和混乱,如果您可以在任何字节上启动缓存行,则更难确定命中/未命中,和/或您将/可能有重叠的缓存行(某些数据项位于多个位置),必须对其进行整体管理,从而使缓存变慢。