存储层次结构、cache、编译

先给出计算机存储层次结构一组数据:

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

相关文章:

This entry was posted in 后端优化与处理器, 编译技术 and tagged , , , , , , . Bookmark the permalink.

7 Responses to 存储层次结构、cache、编译

  1. baozii says:

    感觉cpu 的cache虽然是越来越重要了,但是对于程序员来说,可以操控的地方不多…

    • erlv says:

      cache就是抱着透明的原则添加到CPU中的,好处就是性能大幅提升,坏处就是牵一发动全身。想改改体系结构,如果影响了cache肯定会影响性能,这就造成可能随便改改,调整不好cache的预测和替换策略,性能反而大幅下降。不过幸好,在嵌入式领域还有一些mips芯片中,已经支持程序员控制cache,譬如把一部分cache锁定,不允许其中的内容被替换出去。你可以搜索SPM 详细了解之。

  2. Simon liu says:

    按下面这篇文章来看,在intel的几款cpu,L1 cache和寄存器的存取时间基本是一样的,都是一个cycles就可以取得到的:
    http://software.intel.com/en-us/articles/recap-virtual-memory-and-cache/#Cache_hierarchy

  3. Daniel says:

    说的很对,Intel的CISC架构是站在程序员的角度来设计的,复杂指令集,硬件复杂,程序员方便多了,干什么活都有相关的指令,,,MIPS的RISC架构是站在处理器设计的角度上,怎样让处理器的性能发挥到最好。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>