Memory Systems_ Cache, DRAM, Disk (2010)-学习笔记3-Locality Principles
Locality Principles
Locality Principles(局部性原理)是缓存系统设计的核心依据,指出程序通常会反复使用相同数据(时间局部性)或连续使用内存中相邻数据(空间局部性)。虽然不是绝对规律,但在绝大多数程序中都成立,因此现代处理器、操作系统和存储系统普遍利用它来提升访问效率。
程序在访问内存时,通常并不是随机的,而是表现出一种规律性(Locality of Reference),主要分为以下三种形式:
时间局部性(Temporal Locality)
- 定义:一个数据一旦被访问,很可能在短时间内再次被访问。
- 典型场景:变量在循环或函数中被反复引用。
- 缓存意义:将近期访问的数据保存在高速缓存中,后续访问可以命中缓存。
空间局部性(Spatial Locality)
- 定义:一个地址被访问后,它相邻的地址很可能也会被访问。
- 典型场景:遍历数组、顺序读取文件块。
- 缓存意义:每次将相邻多个字节的数据(即一个“块”)加载进缓存,提升命中率。
算法局部性(Algorithmic Locality)
- 新兴概念,不是传统的时间或空间局部性。
- 定义:数据访问虽然在时间和空间上都不“集中”,但仍然可预测、重复且结构化。
- 典型场景:
- 图形渲染:每帧都会以固定顺序遍历一个复杂的数据结构(如3D场景图)。
- 仿真程序、HDL模拟:每轮计算都重复访问同一批结构化数据。
- 缓存意义:虽然传统缓存难以捕捉这种模式,但仍可通过结构预取、智能缓存策略等进行优化
这些局部性只是经验观察,不是每个程序都必须遵守的规律。由于程序类型不断变化(如 AI、图形计算、仿真等),我们需要不断观察和适应新的行为模式。
Temporal Locality
Temporal locality(时间局部性)是指程序在执行过程中倾向于多次使用同一个数据项。这是缓存设计的基本原理,也为数据管理策略提供了明确的指导思想:
- 如果程序访问了某条指令或某个数据项,很有可能不久之后还会再次访问它。
- 因此,把该数据保留在“就近的地方”(如缓存中)是明智的做法。
常见的数据管理策略就是 “按需获取”,程序第一次“请求”(即访问)某个指令或数据时,缓存硬件或软件会将其从主存中取出并保存在缓存中。之后的访问会先从缓存中查找,若命中,就不必再访问主存。该策略很容易用硬件来实现(这也是现代 CPU 的常规做法)
缓存大小是限制时间局部性利用效果的主要因素,如果缓存足够大,理论上每个数据只需从主存中加载一次。后续所有访问都可以命中缓存,从而提高效率、降低延迟。
Spatial Locality
Spatial Locality(空间局部性)产生的原因在于:程序员和编译器倾向于将相关的数据对象集中存储在内存空间中的相邻位置。此外,程序通常以“处理一组相关数据”的方式运行,也就是说,短时间内的内存访问往往集中在一小段连续的地址空间中。
如何利用空间局部性?
Lookahead(预取),程序访问某个指令或数据 i 时,不只加载 i,还可以一并加载 i+1。最简单的方式是设定合适的访问粒度,比如使用大于一个数据项的缓存块(cache block)。
例:
如果程序的基本数据单位是 4 字节的 word
- 缓存块大小可以设置为 16 字节(包含 4 个 word),
- 或者 32 字节(包含 8 个 word)等。
Prefetching(预取机制)不是只预取一个 cache block,而是利用地址历史记录预测接下来可能访问哪些块;主动提前从内存中加载这些块,以减少未来访问的延迟
Spatial Locality的局限性
- 如果程序以顺序方式访问内存,简单预取机制就能带来很好的效果;
- 如果程序行为复杂但可预测,就需要更复杂的算法来适应;
- 如果程序行为不可预测,预取策略就会失效,甚至浪费资源。
Algorithmic Locality
Algorithmic Locality(算法局部性)就是程序反复访问分布在内存中相距较远的数据或代码块,这些访问模式是可预测的,但是不能用前面的时间局部性和空间局部性去捕捉这个规律。
举例:3D 图形算法中的 Z-buffer 算法,为每个屏幕像素记录一个最小的深度值(即最近的物体),只有当新的像素比当前深度更“浅”(更近)时,才会更新颜色和深度。
for each polygon P in scene {
// 遍历场景中的每一个多边形 P
for each pixel p in P {
// 遍历该多边形 P 所覆盖的每一个像素 p(即它在屏幕上投影后占据的像素点)
if (depth of p at i,j < image[i,j].depth) {
// 如果该像素 p 的深度值(即它距离观察者的远近)小于当前图像缓冲区 image 中该位置 [i][j] 处的深度
// 意味着该像素 p 位于当前图像像素前方(更靠近观察者),需要更新图像
image[i][j].color = p.color;
// 更新图像缓冲区中对应像素的颜色值为当前像素 p 的颜色
image[i][j].depth = depth of p at i,j;
// 同时更新图像缓冲区中该像素的深度值为当前像素 p 的深度值
}
}
}
遍历是很耗资源的,因为这些像素点不会顺序存储在一起,这个时候访问的数据不相邻,当某个多边形再次被访问时,已经过去了很长时间,但是他们的访问顺序是固定可预测的,所以处理的时候就需要按程序的访问顺序预取他的下一部分的数据。
| 类型 | 局部性的依据 | 主要影响数据访问的方式 | 示例 |
|---|---|---|---|
| 时间局部性 (Temporal locality) | 时间上的重复访问 | 最近用过的,很快还会用 | 一个变量被频繁地重复使用 |
| 空间局部性 (Spatial locality) | 物理内存地址相近的数据被连续访问 | 连续的数据项打包加载(如数组) | 遍历数组 arr[i] 到 arr[i+1] |
| 算法局部性 (Algorithmic locality) | 访问规律由算法逻辑决定,结构复杂 | 数据不临近、访问间隔大,但访问顺序可预测 | 遍历链表、图结构、3D 多边形等 |
设计者不断通过“分类+利用”策略,提升缓存的性能、功耗、响应时间和可预测性
Geographical Locality(地理局部性),Demographical Locality(人口局部性)
设计者不断通过“分类+利用”策略,提升缓存的性能、功耗、响应时间和可预测性,具体的思想就是别不同应用/算法或数据类型的特定行为模式,用这些可预测的行为来优化缓存机制
就比如,视频网站上会根据用户观看习惯调整缓存内容,
Geographical Locality:不同地区的人的兴趣偏好不一样,那么针对他们的偏好缓存对应的数据然后针对性的推给他们。
Demographical Locality:针对年轻用户群体和老年用户群体的兴趣差异,缓存不同风格的内容

浙公网安备 33010602011771号