➤ 超线程(有时又叫对称多线程,SMT)是一种比较特殊的情况,每个线程并不能真正并发地运行。它们共享着除寄存器外的绝大多数处理资源。过到目前为止,Intel 的 CPU 最多只有两个线程。CPU 负责对各线程进行时分复用,CPU 可以在当前运行的超线程发生延迟时,调度另一个线程。这种延迟一般由内存访问引起。
随着 CPU 的核心频率大幅上升,缓存与核心的速度差越拉越大,CPU 的处理开始管线化。也就是说,指令的执行分成若干阶段。首先,对指令进行解码,随后,准备参数,最后,执行它。这样的管线可以很长(例如,Intel 的 Netburst 架构超过了20个阶段)。在管线很长的情况下,一旦发生延误(即指令流中断),需要很长时间才能恢复速度。管线延误发生在这样的情况下: 下一条指令未能正确预测,或者装载下一条指令耗时过长(例如,需要从内存读取时)
内存以比 cache line 还小的块从主存储器向缓存传送。如今64位可一次性传送,cache line 的大小为64或128比特。这意味着每个 cache line 需要8或16次传送。内存控制器可以按不同顺序去请求 cache line 中的字。当处理器告诉它,程序需要缓存中具体某个字,即「关键字(critical word)」时,内存控制器就会先请求这个字。一旦请求的字抵达,虽然 cache line 的剩余部分还在传输中,缓存的状态还没有达成一致,但程序已经可以继续运行。这种技术叫做关键字优先及较早重启(Critical Word First & Early Restart)
➤ 指令缓存
随着 CPU 的核心频率大幅上升,缓存与核心的速度差越拉越大,CPU 的处理开始管线化。也就是说,指令的执行分成若干阶段。首先,对指令进行解码,随后准备参数,最后执行它。这样的管线可以很长(例如,Intel 的 Netburst 架构超过了20个阶段)。在管线很长的情况下,一旦发生延误(即指令流中断),需要很长时间才能恢复速度。
管线延误发生在这样的情况下: 下一条指令未能正确预测,或者装载下一条指令耗时过长(例如,需要从内存读取时)。
为了解决这个问题,CPU 的设计人员们在分支预测上投入大量时间和芯片资产(chip real estate),以降低管线延误的出现频率。
在 CISC 处理器上,指令的解码阶段也需要一些时间。x86及 x86-64处理器尤为严重。
近年来,这些处理器不再将指令的原始字节序列存入 L1i
,而是缓存解码后的版本。这样的 L1i
被叫做“追踪缓存(trace cache)”。追踪缓存可以在命中的情况下让处理器跳过管线最初的几个阶段,在管线发生延时时尤其有用。L2
以上的缓存是统一缓存,既保存代码,也保存数据。这里保存的代码是原始字节序列,而不是解码后的形式。
每个程序员都应该了解的内存知识-1 : https://lrita.github.io/2018/06/30/programmer-should-know-about-memory-1/#334-%E5%A4%9A%E5%A4%84%E7%90%86%E5%99%A8%E6%94%AF%E6%8C%81
➤ 高速缓存
-> 01.CPU_Cache