2012-06-05 37 views
0

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

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

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

我的理由是:

  1. L1数据和指令缓存必须有单独的银行。访问粒度在这里是一个词。
  2. 二级高速缓存支持L1数据和指令高速缓存的遗漏。因此它必须支持2家银行。
  3. L3缓存通常在系统中的所有内核之间共享,因此它必须具有大量(32)个库。

我的直觉是否正确?此外,银行的数量是否改变了结构化数据/程序的方式(理想情况下它不应该但是......)?

回答

2

Wikipedia articleoverview graphics描述了Nehalem(第一个CPU标记为“Core i7”),每个内核具有256 KB的L2高速缓存。

我不明白“银行”这个词在这里的含义。 Nehalem的缓存与每个缓存行有64位(8字节)的8路结合。

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

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

您对“银行”一词的使用可能指的是这种8路关联性的“集合”。因此,你的问题的答案可能是“8”。而且,每个核心都有一个L2缓存,每个都有这种结构。

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

了这一假设的事实System Architecture Manual它可以在intel's page可以发现,章后来的Sandy Bridge的改进2.2.6名单,强调“两个负载和一个商店每个周期的内部带宽。”支持。因此,SandyBridge之前的CPU应该具有较小数量的并发加载/存储。

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

你的直觉是不正确的部分帐户:

  1. 超线程和多线程一般允许CPU执行每个周期多个语句。 (Nehalem,第2.2.5章:“每个内核提供两个硬件线程 (逻辑处理器),利用4宽度执行引擎”,因此支持多个并发加载/存储到L1高速缓存是有意义的。二级缓存既可以处理L1数据,也可以处理L1指令缓存 - 你在这一部分是正确的。(1)支持2个以上同时操作是有意义的。 L3缓存,但在实践中这是没有意义的,我不知道你从哪里得到32号,也许只是一个猜测,对于任何额外的接入点(术语中的“银行”),你必须有地址解码器,标签数组(用于处理与缓存行地址比较,替换策略以及任何缓存数据标志(脏位等))。端口需要一些晶体管的开销,因此需要硅片上的面积和功率。存在的每个端口也会降低缓存访问速度,即使它未被使用。 (细节超出了这个答案的范围)。所以这是一个微妙的设计决定,32通常是高的方法。通常用于任何类型的内存,数字范围从1到6-8个读取端口和1到2-4个写入端口。当然可能有例外。

关于您关于软件优化的观点:担心如果您是低级硬件/固件开发人员。否则,只需遵循高层次的想法:如果可以的话,保持最小的激烈操作循环以使其适合L3缓存。不要使用本地数据激烈计算的线程数多于核心数。如果您确实开始担心这种速度问题,请开始使用匹配的cpu开关编译/优化您的代码,并控制机器上的其他任务(甚至是基础设施服务)。

总结:

  • Nehalem的L2高速缓存是8路相联
  • 它支持小于2同时负载和1个存储操作,可能是唯一的一个。但是每个加载/存储可以一次向/从L1数据缓存发送多达256位。
  • 由于物理设计限制(时序/面积/功率),L3缓存同时加载/存储操作的数量不会扩展到32个
  • 您通常不应该在应用程序中担心这些细节太多 - 除非你确实知道你必须(例如在高性能计算中)
+0

Nehalem的缓存与每个缓存行(或缓存块)有64个BYTES(而不是位)的8路关联。缓存行包含若干单词以利用[空间局部性](http://en.wikipedia.org/wiki/Locality_of_reference)(在引用地址后,很可能也会引用近地址) – chus