先给出计算机存储层次结构一组数据:
| 存储层级 | 1 | 2 | 3 | 4 |
| 名称 | 寄存器 | 高速缓存(cache) | 主存 | 硬盘 |
| 一般容量 | <1KB | <16M | <512GB | >1TB |
| 实现技术 | CMOS, | CMOS/SRAM | CMOS/DRAM | 磁盘 |
| 访问时间(ns) | 0.25-0.5 | 5-25 | 50-250 | 5000000 |
| 带宽 | 50000-500000 | 5000-20000 | 2500-10000 | 50-500 |
| 控制方式 | 编译器 | 硬件 | 操作系统 | 操作系统 |
| 备份方式 | 高速缓存 | 主存 | 硬盘 | 光盘/磁带 |
计算机使用TLB,L1 cache,L2 cache,虚存把虚拟地址空间映射为物理地址空间。接下来,我们看看计算机是如何做到的:
首先,把64位的虚拟地址逻辑上分成虚拟页号和页內偏移量。前者发送到TLB,转换为物理地址;后者的高几位送到L1 cache中,作为查询索引。如果TLB命中,物理页号会发送到L1 cache中作为标签来检测是否和cache中标签匹配。如果匹配,L1 cache命中。然后页內偏移量的后几位作为cache中的偏移量,选择cache中对应的内容,返回给处理器。
如果L1 cache缺失,内存地址会继续用来查找L2 cache,查找L2 cache使用虚拟页号的后几位和页內偏移量组成的地址。该地址会被分成L2 cache标签、L2 cache索引和L2 cache偏移量三部分,如果L2 cache标签,L2 cache索引在L2 cache中存在,就使用L2 cache偏移量直接取对应内容返回给处理器。
如果L1和L2 cache都没有命中,则接着访问内存。因为实际CPU中,访存的延时比cache访问延时大很多,而cache的命中率一般都很高。在90%-95%左右。所以在访存之前,加点cache不算什么。
现在的通用微处理,和cache有关的部分已经占据了芯片面积的50%左右,Cache功耗的也几乎占据了整个CPU功耗的一半。多核的微处理器,甚至增加了L3 cache。下图就是IBM的Power7处理器的版图.L1,L2,L3 cache的面积几乎占了芯片面积的60%。
虽然cache在X86系列处理器中出现的初衷是减小访存延时,对程序员不可见。但若程序的局部性不好,cache 缺失率高,那性能的下降将会非常明显。所以高性能的编译器开发者都会和cache做一翻斗争。诸多的循环优化,结构体优化几乎都是为了增加访存局部性。
《See MIPS Run Linux》上对cache和X86有些不同,X86的cache为了保持兼容性,所以推崇在对程序员屏蔽的情况下提高性能。而MIPS的商用处理器中,没有cache就不能称之为RISC。而cache的设计初衷是为了提高访存速度而非帮助系统程序员,所以没必要非得不可见。所以MIPS的cache可以作为SPM,一种可控的cache,你可以把一部分内容锁定到cache中,强制它不会被替换出去。比如当程序中有数组时,当然这是极端的优化方法。
参考:
- Computer Architecture: a quantitative approach 4ed. John L. Hennessy, David A. Patterson.
- See MIPS Run Linux 2ed. Dominic Sweetman
PS:上图来自张晓东教授在中国科大龙星课程的ppt。


感觉cpu 的cache虽然是越来越重要了,但是对于程序员来说,可以操控的地方不多…
cache就是抱着透明的原则添加到CPU中的,好处就是性能大幅提升,坏处就是牵一发动全身。想改改体系结构,如果影响了cache肯定会影响性能,这就造成可能随便改改,调整不好cache的预测和替换策略,性能反而大幅下降。不过幸好,在嵌入式领域还有一些mips芯片中,已经支持程序员控制cache,譬如把一部分cache锁定,不允许其中的内容被替换出去。你可以搜索SPM 详细了解之。
找了半天没找到SPM的相关信息,能给个相关的链接吗?谢谢。
抱歉给的信息不全,SPM的全称是 Scratch-Pad
Memory),维基百科上的解释如下:http://en.wikipedia.org/wiki/Scratchpad_RAM
按下面这篇文章来看,在intel的几款cpu,L1 cache和寄存器的存取时间基本是一样的,都是一个cycles就可以取得到的:
http://software.intel.com/en-us/articles/recap-virtual-memory-and-cache/#Cache_hierarchy
L1 cache机制简单,命中的话,存取基本是一到两拍。
说的很对,Intel的CISC架构是站在程序员的角度来设计的,复杂指令集,硬件复杂,程序员方便多了,干什么活都有相关的指令,,,MIPS的RISC架构是站在处理器设计的角度上,怎样让处理器的性能发挥到最好。