Nehalem l2缓存中的银行数量

时间:2012-06-05 07:19:15

标签: caching memory-management cpu-cache nehalem

我正在研究不同缓存配置的访问时间,当时我偶然发现了cacti界面中的一个术语"银行数量"。

bank的数量是缓存中交错模块的数量,它增加了缓存的带宽和对它的并行访问次数。

在这种情况下,我想找到Nehalem架构缓存中的银行数量。我用Google搜索了这个东西,但没有找到任何有用的东西。

我的理由是:

  1. L1数据和指令缓存必须具有单个存储区。访问粒度是这里的一个词。
  2. L2缓存支持L1数据和指令缓存的丢失。因此它必须支持2家银行。
  3. L3缓存通常在系统中的所有核心之间共享,因此它必须拥有大量(32)个银行。
  4. 我的直觉是否正确?另外,银行数量是否会改变结构化数据/程序的方式(理想情况下它不应该但仍然......)?

1 个答案:

答案 0 :(得分:2)

overview graphicsWikipedia article描绘了Nehalem(第一个cpu标记为" Core i7"),每个核心拥有256 KB的L2缓存。

我不明白你的意思" bank"这里。 Nehalem的缓存是8路关联的,每个缓存行有64位(8字节)。

这意味着对于高速缓存的每个读/写访问,传输8个字节的数据,这很好地对应于64位架构,其中所有虚拟地址具有8个字节。因此,每次必须从内存中检索或存储地址时,必须传输8个字节,因此以这种方式设计缓存中的单个条目是很自然的。 (其他高速缓存大小也有意义,具体取决于应用程序:例如,矢量处理单元的数据高速缓存的大小更大)。

x-way Associativity确定内存地址与该地址中的信息可以存储在缓存中的位置之间的关系。术语" 8种方式关联性"指的是存储在某个存储器地址的数据可以保存在8个不同的高速缓存行中。缓存有一个地址比较机制,用于在一种方式中选择匹配的条目,以及一些replacement strategy来决定使用哪种x方式 - 可能会驱逐先前的有效值。

您使用的术语" bank"可能是指一个这样的" set"这种8向相关性。因此,你的问题的答案可能是" 8"。而且,每个核心都有一个二级缓存,每个都有这种结构。

您对同步访问的假设也是有效的。这是documented e.g. for ARM's Cortax A15 但是,任何人都可以猜测,如果可以独立访问缓存的这些集合或存储区。维基百科图显示L1数据高速缓存和L2高速缓存之间的256位总线。这可能意味着可以独立访问4种方式(4 * 64 = 256,但更可能的是在任何给定时间实际上只传输一个内存加载/存储,而较慢的L2缓存只是同时提供4个缓存行可以称之为突发的更快的L1缓存。

这一假设得到以下事实的支持:System Architecture Manual可以在intel's page上找到,在第2.2.6章中列出了后来的Sandy Bridge改进,强调了"两个负载的内部带宽每个周期都有一个商店。"。因此,SandyBridge之前的CPU应该具有较少数量的并发加载/存储。

请注意,飞行中的差异是""加载/存储和传输的实际数据。 "在飞行中"是那些当前正在执行的操作。如果负载可能需要在所有缓存报告未命中后等待内存产生数据。因此,您可以并行进行多次加载,但您仍然可以在任何给定时间仅使用一次的任何两个高速缓存之间使用数据总线。上面的SandyBridge改进实际上将数据总线扩展到两个负载,一个实际上同时传输数据的商店Nehalem(一个" tock"或Sandy Bridge之前的一个架构)无法做到。

你的直觉在某些方面是不正确的:

  1. 超线程和多线程通常允许cpu在每个周期执行多个语句。 (Nehalem,第2.2.5章:"提供两个硬件线程 每个核心(逻辑处理器)。利用4宽执行引擎"。因此,支持多个并发加载/存储到L1缓存是有意义的。
  2. L2缓存同时提供L1数据和L1指令缓存 - 您可以在该部分上进行更正。由于(1)中的原因,支持2个以上的同时操作可能是有意义的。
  3. 通常你可以为L3缓存扩展这个数字,但实际上这没有意义。我不知道你从哪里得到32号,也许只是猜测。对于任何其他访问点(" bank"在您的术语中),您必须具有地址解码器,标记数组(用于处理与缓存行的地址比较,替换策略以及任何缓存数据标志(脏位等)) )。因此,每个接入端口都需要晶体管的一些开销,因此需要硅上的面积和功率。存在的每个端口也会降低缓存访问速度,即使它未被使用。 (详情超出了这个答案的范围)。所以这是一个微妙的设计决定,32通常是高的。通常对于CPU内部的任何类型的内存,数字范围为1到6-8个读取端口和1到2-4个写入端口。当然可能有例外。
  4. 关于软件优化的观点:如果您是低级硬件/固件开发人员,请担心。否则只需遵循高层次的想法:如果可以的话,保持最内层的强烈操作循环,使其适合L3缓存。与本地数据相比,不要使用强大的计算启动更多线程。如果您开始担心速度影响,请使用匹配的cpu开关编译/优化代码,并控制机器上的其他任务(甚至是基础架构服务)。

    总结:

    • Nehalem的L2缓存是8路关联
    • 它支持少于2个同时加载和1个存储操作,可能只有一个。但是每个加载/存储一次最多可以向L1数据缓存发送256位。
    • 由于物理设计限制(时序/面积/功率),L3缓存的同时加载/存储操作数不会扩展到32个
    • 您通常不应该在应用程序中过多地担心这些细节 - 除非您确定必须(例如在高性能计算中)