Caching Nehalem二级缓存中的银行数量

Caching Nehalem二级缓存中的银行数量,caching,memory-management,cpu-cache,nehalem,Caching,Memory Management,Cpu Cache,Nehalem,我正在研究不同缓存配置的访问时间,突然在cacti接口中偶然发现了一个术语“银行数量” “组数”是缓存中交错模块的数量,它增加了缓存的带宽和并行访问的数量 在这种情况下,我想找到Nehalem体系结构缓存中的银行数量。我在谷歌上搜索这个东西,但没有找到任何有用的东西 我的理由是: 一级数据和指令缓存必须具有单个存储组。访问粒度在这里是一个词 二级缓存支持一级数据和指令缓存的未命中。因此,它必须支持2家银行 L3缓存通常跨系统中的所有核心共享,因此它必须有大量(32)个存储组 我的直觉正确吗??此

我正在研究不同缓存配置的访问时间,突然在cacti接口中偶然发现了一个术语“银行数量”

“组数”是缓存中交错模块的数量,它增加了缓存的带宽和并行访问的数量

在这种情况下,我想找到Nehalem体系结构缓存中的银行数量。我在谷歌上搜索这个东西,但没有找到任何有用的东西

我的理由是:

  • 一级数据和指令缓存必须具有单个存储组。访问粒度在这里是一个词
  • 二级缓存支持一级数据和指令缓存的未命中。因此,它必须支持2家银行
  • L3缓存通常跨系统中的所有核心共享,因此它必须有大量(32)个存储组
  • 我的直觉正确吗??此外,银行的数量是否会改变数据/程序的结构化方式(理想情况下不应该,但仍然…)

    的描述了Nehalem(第一个被称为“Core i7”的cpu),每个核心有256 KB的二级缓存


    我不明白你说的“银行”是什么意思。Nehalem的缓存是8路关联的,每个缓存线64位(8字节)

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

    确定内存地址与该地址中的信息可存储在缓存中的位置之间的关系。术语“8路关联性”是指存储在特定内存地址的数据可以保存在8条不同的缓存线中。缓存有一个地址比较机制来选择一条路径内的匹配条目,还有一些用来决定使用哪条x路径,可能会排除以前的有效值

    您使用的术语“bank”可能指的是这种8向关联性的一个“集合”。因此,你的问题的答案可能是“8”。同样,每个核心有一个二级缓存,每个都有这样的结构

    您关于同时访问的假设也是有效的。它是 然而,是否以及如何独立访问这些缓存集或缓存组是任何人的猜测。Wikipedia图显示了一级数据缓存和二级缓存之间的256位总线。这可能意味着可以独立地访问4种方式(4*64=256),但更可能的是,在任何给定的时间,实际上只传输一个内存加载/存储,较慢的二级缓存只同时向较快的一级缓存提供4条缓存线,这可以称为突发

    这一假设得到以下事实的支持:在第2.2.6章中,可以在上找到的列出了后来的Sandy Bridge改进,强调“两个负载的内部带宽和每个周期一个存储”。因此,Sandy Bridge之前的CPU应具有较少数量的并发负载/存储

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

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

  • 超线程和多线程通常允许cpu每个周期执行一个以上的语句。(Nehalem,第2.2.5章:“提供两个硬件线程 (逻辑处理器)每个核心。利用4宽执行引擎”。因此,支持一级缓存的多个并发加载/存储是有意义的
  • 二级缓存同时提供一级数据和一级指令缓存-这一点您是正确的。由于(1)中的原因,支持两个以上的同时操作可能是有意义的
  • 一般来说,你可以为三级缓存放大这个数字,但实际上这是没有意义的。我不知道你从哪里得到的数字32,也许这只是一个猜测。对于任何额外的接入点(“银行”在你的术语中),你必须有地址解码器,标签阵列(用于处理与缓存线、替换策略和任何缓存数据标志(脏位等)的地址比较)。因此,每个访问端口都需要晶体管的一些开销,从而需要硅上的面积和电源。存在的每个端口也会减慢缓存访问速度,即使它不在使用中。(详细信息不在本回答的范围内)因此,这是一个微妙的设计决策,32通常是高的。通常对于cpu内的任何类型的内存,数字范围从1到6-8个读取端口和1到2-4个写入端口。当然,可能会有例外
  • 关于软件优化的观点:如果你是一名低级别的硬件/固件开发人员,请担心。否则,请遵循高级别的想法:如果可以,请将最内部的密集操作循环保持在较小的范围内,以使其适合三级缓存。不要启动比核心更多的本地数据密集计算线程。如果确实启动了要担心这样的速度影响,请开始使用匹配的cpu开关编译/优化代码,并控制机器上的其他任务(甚至是基础设施服务)

    总之:

    • Nehalem的二级缓存是8路关联的
    • 它支持少于2个同时加载和1个存储操作,可能是