我正在研究不同缓存配置的访问时间,当时我偶然发现了cacti界面中的一个术语"银行数量"。
bank的数量是缓存中交错模块的数量,它增加了缓存的带宽和对它的并行访问次数。
在这种情况下,我想找到Nehalem架构缓存中的银行数量。我用Google搜索了这个东西,但没有找到任何有用的东西。
我的理由是:
我的直觉是否正确?另外,银行数量是否会改变结构化数据/程序的方式(理想情况下它不应该但仍然......)?
答案 0 :(得分:2)
overview graphics的Wikipedia 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之前的一个架构)无法做到。
你的直觉在某些方面是不正确的:
关于软件优化的观点:如果您是低级硬件/固件开发人员,请担心。否则只需遵循高层次的想法:如果可以的话,保持最内层的强烈操作循环,使其适合L3缓存。与本地数据相比,不要使用强大的计算启动更多线程。如果您开始担心速度影响,请使用匹配的cpu开关编译/优化代码,并控制机器上的其他任务(甚至是基础架构服务)。
总结: