Skip to content

模型Model

缓存无关模型

施工中 · 内容逐步修订

Cache-oblivious model

算法代码不使用缓存参数,但在理想缓存中对所有块尺度分析 miss。

形式陈述 ​

理想缓存 ​

它沿用外存模型的缓存 M 与块 B,再假设全相联和最优替换;算法代码不知道 M,B,分析仍以二者计 cache misses。Tall-cache 如 M=Ω(B2) 是某些证明的额外条件。

递归矩阵转置提供一种典型构造:代码不断把矩形切半,分析则寻找子问题能装入缓存的尺度,并计算该尺度以下的块复用。算法不读取缓存参数,复杂度证明仍明确使用它们。

直觉

缓存无关算法让递归在许多尺度上同时产生局部块。分析者事后针对任意实际 B,M,在递归树中找到刚好装入缓存的子问题层;代码无需知道这一层在哪里,连续访问仍能把同一块中的数据充分复用。

同一递归布局适配未知缓存尺度
例子与边界

递归转置的状态演化 ​

设输入是按行存储的 m×n 矩阵 A,输出写入另一块按行存储的 n×m 矩阵 D。算法沿输入子矩形的较长维切半,同时切分对应的输出区域;递归到单个元素时执行 D[j,i]←A[i,j]。整个过程完成 Θ(mn) 次元素处理。

在满足 tall-cache 条件 M=Ω(B2) 的理想缓存中,递归会到达源、目标子矩形连同边界块都能装入缓存的尺度。之后的局部访问复用这些块。对子矩形的行边界开销与递归层数一起计数,可得 O(1+mn/B) 次缓存缺失,与读写全部元素的块数量同阶。

相比之下,朴素逐列读取行主序矩阵时,相邻访问相隔一整行;矩阵足够大时,每次读取都可能落到已经被逐出的块。两种方法的 CPU 工作量同为 Θ(mn),数据传输量却可以相差一个块因子。

与显式分块的区别 ​

Cache-aware 分块会根据 M,B 选择块尺寸,例如把方形 tile 的边长取为适当常数倍的 M,使输入、输出和临时空间一起装入缓存。Cache-oblivious 递归则隐式产生多个尺度的块,同一份代码可以针对不同缓存参数分别分析。两种策略都依赖数据布局与访问顺序之间的配合。

模型与硬件 ​

全相联允许块放入任意缓存位置,最优替换则按整个访问序列选择最有利的淘汰策略;这是分析成本的模型假设。实际硬件的组相联会把块限制在特定组内,可能产生冲突缺失;实际缺失分类需要声明对照缓存和替换策略。TLB、预取、脏块写回、递归基础阈值和并行伪共享也会影响运行时间。理想缓存界刻画数据传输的结构,具体性能还取决于这些实现因素。

对满足相应正则条件的缓存无关算法,两级传输界可以推广到多级存储分析。每一级代入自己的容量和块大小,便可比较同一访问程序在不同层级的代价。

推论与应用

该模型允许用同一份递归布局或访问程序同时分析 L1、末级缓存和外存层级。缓存无关搜索树、van Emde Boas 布局与递归矩阵算法由此共享“代码无参数、界仍含参数”的接口,相应复杂度界使用各自证明中的容量、布局与替换假设。

参考资料
  • Matteo Frigo, Charles E. Leiserson, Harald Prokop, and Sridhar Ramachandran, “Cache-Oblivious Algorithms”, ACM Transactions on Algorithms 8(1), 2012,§3 的矩阵转置与 §6 的多级模型分析;初版发表于 FOCS 1999。
  • Harald Prokop, Cache-Oblivious Algorithms, MIT thesis, 1999.
关系图谱8 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组