Caching 处理器如何获取缓存线?

Caching 处理器如何获取缓存线?,caching,optimization,assembly,processor,Caching,Optimization,Assembly,Processor,当处理器预取数据缓存线时,它是从该地址预取到字节数,还是从该地址预取到缓存线的一半,然后返回到缓存线的一半 例如,假设缓存线为4字节,并从地址0x06预取。它将在0x06 0x07 0x08 0x09处提取字节,还是从地址0x04 0x05 0x06 0x07处预提取字节 我需要为我正在编写并需要优化的程序提供这些信息。根据(这自然是特定于英特尔的) “缓存线大小为32字节或256位。 在处理器的64位数据总线上,缓存线由四次读取组成。” 这意味着8个字节从主内存并行获取,在这8个字节中没有第一

当处理器预取数据缓存线时,它是从该地址预取到字节数,还是从该地址预取到缓存线的一半,然后返回到缓存线的一半

例如,假设缓存线为4字节,并从地址0x06预取。它将在0x06 0x07 0x08 0x09处提取字节,还是从地址0x04 0x05 0x06 0x07处预提取字节

我需要为我正在编写并需要优化的程序提供这些信息。

根据(这自然是特定于英特尔的)

“缓存线大小为32字节或256位。 在处理器的64位数据总线上,缓存线由四次读取组成。”

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

由于需要4次读取来填充缓存线,Intel似乎没有指定这4次读取的顺序-这意味着您还有一些选择,例如

  • 假设没有特定的顺序
  • 假设地址是从最低到最高提取的,反之亦然

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

缓存线必须对齐,因此如果您的第一次读取或第一次事务未命中导致缓存线提取,在缓存行的中间,它将返回并读取整个高速缓存行(所以在地址之前的部分和之后的部分)。 通常,缓存使用地址的一部分来确定命中/未命中。因此,如果说缓存线是256字节,那么用于确定命中/命中的地址位将从位8开始,并根据缓存的大小(深度和方式)确定要查看的位数。因此,使用我的示例,如果地址0x123处的访问导致未命中,那么将读取0x100-0x1FF中的缓存线


如果是另一种方式,则会产生更多的逻辑、工作和混乱,如果可以在任何字节上启动缓存线,则更难确定命中/未命中,和/或您将/可能有重叠的缓存线(某些数据项位于多个位置),这将不得不进行总体管理,从而降低缓存速度

我绝对认为这是高度依赖于实现的。也许添加细节会有所帮助…缓存线大约是64字节,它从地址开始,最低的六位都是零。通过屏蔽地址的最低六位,可以找到地址的缓存线。(或者你的缓存线有两倍的能力。)@KerrekSB请回答这个问题。@KerrekSB你的评论刚刚回答了我的问题。好的,就像我给出的例子一样,假设缓存线是4个字节,我在地址0x06处获取,我在缓存中得到的是0x04、0x05、0x06和0x07处的字节。下一个缓存线将位于0x08。假设我想得到0x0A处的字节,那么我将把0x08、0x09、0x0A、0x0B预取到缓存中!用于查找实际大小。看起来旧版本是32字节,现代版本是64字节。