1.3.5 cache
cache是位于处理器和主系统内存(RAM)之间的存储器。尽管cache不像寄存器那样快,但是仍要快于RAM。它的容量大于寄存器,但是小于主存。cache增加了有效的存储器传递速度,因此提高了处理器总体性能。cache用于保存处理器最近使用的数据或指令的副本。会从主存中获取小的内存块并保存到cache中,期望处理器会需要它们。程序具有时间局部性(temporal locality)和空间局部性(spatial locality)的倾向。
时间局部性是重用最近访问的指令或数据的倾向。
空间局部性是访问物理上接近于最近访问项的指令或数据的倾向。
cache的一项主要功能是利用程序的这种空间局部性和时间局部性的特性。cache通常会被分为两个级别,即level 1和level 2。
注意:
cache的完整讨论超出了本书的范围。若需要了解关于cache的详细讨论,可参考[Hennessy,Patterson,2007]。
1. level 1 cache
level 1 cache的规模较小,有时候只有16KB。L1 cache通常位于处理器内部,用于截获最近使用的指令或数据的字节。
2. level 2 cache
同L1 cache相比,level 2 cache要大一些,但速度要慢些。当前,它位于主板上(处理器外部),但是这一点正在逐渐变化。当前,L2 cache通常以MB为度量单位。L2 cache可以保存更大块的最近使用的指令、数据和邻近L1 cache保存内容的项。由于L1和L2快于通用RAM,因此对程序接下来要做的事情猜测得越正确,则总体系统性能越好,因为正确的数据块将位于L1 cache或L2 cache中。这样就可以避免对RAM或虚拟内存乃至最坏情况下对外部存储器的访问。
3. 用于cache的编译器开关
除非是在进行内核开发、编译器开发或其他类型的底层系统编程(www.cppentry.com),否则多数进行多核应用程序开发的人员不会关心手工管理cache。然而,在当前使用的多数主流编译器中,的确给出了编译器选项来提示可用的L1 cache或L2 cache的数量,或提示关于L1 cache或L2 cache的特性。例如,Sun C++(www.cppentry.com)编译器具有xcache开关。该开关的参考指南显示了它的语法和用途。
-xcache=c定义了优化器可以使用的cache属性。它并不保证使用任何特定cache属性。尽管这个选项可以单独使用,但它通常会是-xtarget选项的扩展部分,它的主要用途是用来覆盖-xtarget选项提供的一个值。
-xcache=16/32/4:1024/32/1指定了如下内容:
|
level 1 cache有:< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
level 2 cache有: |
|
16KB
32B通路大小
4路相联 |
1024KB
32B通路大小
直接映射 |
开发真正利用CMP的软件要求对目标处理器或处理器系列的指令集以及内存使用进行详细的考虑。这包括了解优化的机会,例如循环展开、高速向量处理、SIMD处理、MP编译器指示符和为某些值提供编译器提示,如L1 cache或L2 cache的大小。