@
root111 总体原因是局域性。
即便只是核内的第一级缓存,cache 和执行访存的实现电路(比如 LSU )不是一个部件,要操作 cache 物理上必须发信号等待同步,确保满足 cache coherency 以保证之后 cache 的状态可预测。只要不是允许禁用缓存这个开销就无法避免,但后面几级缓存不确定性就大了,比如都 hit 就很快,反之要跟后一级缓存直至主存同步,相比就慢得多。
现在的级联 cache 设计的关联策略可以保证前级 cache 如果只操作同一个 cache line ,后级 cache 也可以在同一个 cache line (如果只是 load 都 hit 就可以不管后级 cache ),反过来难以保证。所以一旦跨 cache line ,脸不好就引发刷后级 cache 直至刷到 uncore 里的 LLC 甚至主存的最慢的路径,差距很大。另外,如果占用多个 cache line ,意味着其它数据能占用的 cache 就少了(也更容易刷出去),会全局地阻碍 cache 的加速作用。
跨 page 涉及到的东西就更多。page 是主存提供主要空间的地址空间里的结构,现代机器基本都是 MMU 实现的,里面有一些专用寄存器帮助实现 page table 、TLB 之类一大坨数据结构,具体补课体系结构和操作系统。跨 page 的访问基本上是得拆到两个 page 的,以反应不同 page 允许具有的不同状态。同一个 page 内硬件可能按历史访存请求以减少访问这些数据结构的开销,但跨 page 这些就大半失效了。
当然不管是不是跨都可能有物理内存没加载就绪的情况 page fault 了。基本如果要能用也是得操作系统一大坨软件代码分配空间,不能用也是不常见的慢速中断路径,要快就见鬼了。这里跨 page 可能一次性开销×2 。