如果预取在加载之前没有完成,那么预取就没用了吗?

Ell*_*sky 5 optimization performance intel cpu-architecture micro-architecture

假设我们有这个伪代码,但它ptr不在任何 CPU 缓存中:

prefetch_to_L1 ptr
/* 20 cycles */
load ptr
Run Code Online (Sandbox Code Playgroud)

由于ptr在主存中,预取操作的延迟(从预取指令解码到ptr在L1高速缓存中可用)远大于20个周期。正在进行的预取是否会减少负载的延迟?或者预取除非在加载之前完成,否则就没用吗?

天真地(对内存系统如何工作没有太多了解)我可以看到它以两种方式工作:

  • 当 CPU 执行加载时,它会以某种方式识别出同一地址正在进行预取,并等待预取完成后再从 L1 加载。
  • CPU 发现该地址当前不在高速缓存中,并转到主内存,忽略并行执行的预取操作。

其中之一是正确的吗?还有我没有想到的第三种选择吗?我对 Skylake 特别感兴趣,但也只是想建立一些一般的直觉。