您的位置:首页 > 其它

存储层次结构、cache、编译

2010-09-29 19:35 260 查看
先给出计算机存储层次结构一组数据:

存储层级
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%。



IBM
Power 7处理器的芯片版图
虽然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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: