31

如果这是问这个问题的错误地方,我很抱歉,但我已经搜索过并且总是找到不同的答案。我的问题是:

哪个更快?缓存还是 CPU 寄存器?

根据我的说法,寄存器是直接加载数据以执行它,而缓存只是靠近或在 CPU 内部的存储位置。

以下是我发现让我感到困惑的来源:

2 用于缓存 | 1 用于寄存器

http://in.answers.yahoo.com/question/index?qid=20110503030537AAzmDGp

缓存更快。

http://wiki.answers.com/Q/Is_cache_memory_faster_than_CPU_registers

那么到底是哪一个呢?

4

2 回答 2

50

CPU 寄存器总是比 L1 缓存快。它是最接近的。差异大约是 3 倍。

试图使其尽可能直观,而不会迷失在问题背后的物理学中:电子学中的速度和距离之间存在简单的相关性。信号传播得越远,就越难将该信号传输到电线的另一端而不会损坏信号。这就是电子设计的“没有免费的午餐”原则。

推论是越大越慢。因为如果你把东西做得更大,那么距离不可避免地会变得更大。有一段时间是自动的,缩小芯片上的特征尺寸会自动产生更快的处理器。

处理器中的寄存器文件很小,并且在物理上靠近执行引擎。离处理器最远的是 RAM。您可以打开外壳并实际看到两者之间的电线。中间是缓存,旨在弥合这两个对立面的速度之间的巨大差距。每个处理器都有一个 L1 缓存,相对较小(通常为 32 KB)并且位于最靠近内核的位置。再往下是 L2 缓存,相对较大(通常为 4 MB)并且离核心更远。更昂贵的处理器也有一个 L3 缓存,更大更远。

于 2013-01-24T16:36:59.430 回答
23

特别是在 x86 架构上:

  • 从寄存器读取有 0 或 1 个周期延迟。
  • 写入寄存器的周期延迟为 0。
  • 读/写 L1 缓存有 3 到 5 个周期的延迟(因架构年龄而异)
  • 由于回写缓冲区和存储转发功能,实际加载/存储请求可能在 0 或 1 个周期内执行(详情如下)

由于其设计,从寄存器读取在 Intel Core 2 CPU(和更早的型号)上可能有 1 个周期的延迟:如果从不同的寄存器读取足够多的同时执行指令,CPU 的寄存器组将无法在一个单循环。自 2010 年以来投放消费市场的任何 x86 芯片均不存在此设计限制(但存在于 2010/11 年发布的某些 Xeon 芯片中)。

L1 缓存延迟在每个模型中是固定的,但随着您及时回到旧模型,它往往会变慢。但是,请记住三件事:

  1. 现在的 x86 芯片有一个 0 周期延迟的回写缓存。当您将一个值存储到内存中时,它会落入该缓存中,并且该指令能够在一个周期内退出。只有当您发出足够多的连续写入来填充回写式缓存时,内存延迟才会变得可见。自 2001 年左右以来,写回缓存在台式机芯片设计中一直很突出,但直到最近才出现在基于 ARM 的移动芯片市场中。

  2. 如今的x86 芯片具有来自回写式缓存的存储转发。如果您将一个地址存储到 WB 缓存中,然后在几条指令后读回相同的地址,CPU 将从 WB 缓存中获取该值,而不是为其访问 L1 内存。这将看似L1 请求的可见延迟减少到 1 个周期。但实际上,在这种情况下根本没有引用 L1。存储转发还有一些其他规则使其正常工作,这些规则在当今市场上可用的各种 CPU 之间也有很大差异(通常需要 128 位地址对齐和匹配的操作数大小)。

  3. 存储转发功能可能会产生误报,其中 CPU 根据快速部分位检查(通常为 10-14 位,具体取决于芯片)认为地址位于回写缓冲区中。它使用一个额外的循环来通过完整检查进行验证。如果失败,则 CPU 必须重新路由作为常规内存请求。此未命中可能会为合格的 L1 缓存访问增加额外的 1-2 个周期延迟。例如,在我的测量中,在 AMD 的 Bulldozer 上经常发生存储转发未命中的情况;足以使其 L1 缓存延迟时间比其记录的 3 周期高约 10-15%。这几乎是英特尔酷睿系列的一个非因素。

主要参考:http ://www.agner.org/optimize/ 特别是http://www.agner.org/optimize/microarchitecture.pdf

然后使用维基百科上各种 CPU 列表页面中的架构、模型和发布日期表格手动绘制信息。

于 2013-01-24T15:57:16.947 回答