繁体   English   中英

从缓存或 memory 在 CPU 微架构中获取数据时端口是否被阻塞?

[英]Is port blocked when data is fetching from cache or memory in CPU microarchitecture?

Intel Skylake 内核有两个相同的 memory 读端口(端口 2 和 3)和一个写端口(端口 4)。 假设有两条加载指令并行发给端口2和端口3:

  1. 当两个数据都可以从 L1 缓存中获取时(大约 ~10ns),端口 2 和 3 是否会被阻塞,直到数据被获取并且加载指令退出?

  2. 如果数据在缓存中不可用,必须从 memory 访问怎么办? 载入口会不会长时间堵塞?

  3. 另一种猜测,当数据正在从缓存或 memory 中获取时,数据请求将缓存在 MOB 的加载缓存中,并释放端口以供下一次加载。 这意味着当数据在从缓存/内存到核心的路径上时,一个端口可以同时服务于多个负载?

如果有一些支持材料可能会好得多。 我用谷歌搜索但没有找到答案。

加载执行单元是完全流水线化的,在高速缓存命中时每个时钟维持 2 次加载。 请参阅https://agner.org/optimize/https://uops.info/ ,并注意验证持续 2/clock 执行负载 uops 的实验测试结果。

在 static 可执行文件中使用这样的循环自己尝试,并在perf stat./a.out下运行它,请注意它以每次迭代 1 个周期(2 次加载)运行循环。

 mov rdi, rsp
 mov edx, 1000000000
.loop
  mov eax, [rdi]
  mov ecx, [rdi+4]
  dec edx
  jnz .loop

 mov eax, 231
 syscall           ; Linux _exit(edi)

另请参阅 Intel 的优化手册,您可以在其中看到 Skylake 的持续 L1d 带宽超过每个周期 80 字节(32 字节向量的 2 次加载和 1 次存储)。 显然,有时某些东西会阻止每个时钟维持完整的 2 个加载 + 1 个存储,至少对于那么宽的向量,但它绝对不会停止。

L1d 缓存未命中也不会停止; load uops 可以继续执行,直到你运行 LFBs 并停止。 但即使 LFB 都在等待传入的缓存行,命中 L1d 缓存的加载仍然可以执行。 此外,从与另一个未完成加载相同的缓存行加载的加载可以堆积到相同的 LFB。 (或者您也可能用完加载缓冲区,这将阻止分配/重命名阶段向后端发出更多加载微指令。)

此外,L1d 缓存命中延迟在现代 Intel 上为 5 个周期; 那只是超过 1 纳秒,而不是 10 纳秒! https://www.7-cpu.com/cpu/Skylake.html

另请参阅https://www.realworldtech.com/haswell-cpu/

还有https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/ 回复:缓存未命中最终停滞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM