☕️ 并行化地址翻译

【ASPLOS‘20】弹性布谷哈希页表 论文阅读笔记

Elastic Cuckoo Page Tables: Rethinking Virtual Memory Translation for Parallelism

https://dl.acm.org/doi/pdf/10...


🔑 简介

📝 基本思想

将传统多层基数页表的顺序指针追踪,转化为完全并行查找,第一次实现了内存级并行的地址翻译。

📝 背景

  • 地址转换是存取的性能瓶颈
  • 传统多层基数页表的顺序指针追踪,没有充分利用内存级并行,理应被取代。
  • 哈希页表局限:空间局部性的缺失;每个页表项都需要哈希标签,消耗更多空间;哈希冲突需要多次存取操作。(前两项可通过精心设计页表[73]来解决,页表项聚集和压缩)
  • 开放地址、链地址需高昂存取开销。为避免哈希冲突,哈希页表需动态调整大小,开销大。
  • 单一全局哈希页表的缺点:在不增加额外地址翻译层下,不支持进程间页表共享、多种页表大小;结束进程时,需线性扫描整个页表,删除相关项。
  • 可调整大小的哈希页表:超过占用阈值,需分配新的大哈希表,需重新哈希、迁移到新哈希表,非常耗时。
  • 渐进式可调整大小的哈希页表:维护新、旧哈希表约需两倍内存开销;需查找新、旧页表,两倍cache存取时间。
  • 布谷哈希:多个哈希函数,踢出法。

📝 弹性布谷页表

  • 地址翻译时使用完全并行查找,降低指针追踪开销。
  • 使用弹性布谷哈希,这种哈希有效支持页表大小动态调整。
  • 这种页表可有效解决哈希冲突,提供进程私有页表,支持多种页表大小,支持进程间共享页表,以及按需动态调整页表大小。
  • 实验:8核处理器全系统模拟,包括图分析、生物信息学、HPC、系统负载实验。与传统基数页表相比,在地址转换上有41%提升,在应用程序执行上有3-18%的加速。

🔑 弹性布谷哈希

$d$-路布谷哈希。

image

从旧$d$-表路中随机选取一路 $T_i$,用哈希函数$ H_i$,若哈希值落在live区,直接插入;否则,使用新的$d$-路表的同一路$T_i'$的哈希函数$H_i'$,被踢出的元素插入$T_i'$。

查找元素只需$d$次探查:使用旧的$d$-表的所有$H_D$函数,对每一路,若哈希值落在live区,则探查到,否则使用$T_i'$。

从两方面改进布谷哈希的渐进式扩展:$d$次探查(存取),而非$2d$次;不必从旧表的迁移区取条目到cache中。

📝 Rehash

image

📝 Look-up

image

可以并行化。

例子:

image

case1:探查$T_1[H_1(x)],T_2[H_2(x)]$

case2:探查$T_1'[H_1'(x)],T_2'[H_2'(x)]$

case3:探查$T_1'[H_1'(x)],T_2[H_2(x)]$

case4:探查$T_1[H_1(x)],T_2'[H_2'(x)]$

📝 Delete

查找到后,清除条目。耗时与Look-up相同。

📝 Insert

  • $d$ 组中随机选取一组$i$
  • 若$H_i(x) \ge P_i $,元素插入$T_i[H_i(x)]$位置;否则,插入$T_i'[H_i'(x)]$ 位置
  • 若原来的位置有元素$y$,则$y$被踢出。从剩下的路中随机选一组,对$y$进行同样的插入操作。

⊥表示空值

image

📝 Hash Table Resize

  • 参数:再哈希阈值 $r_t$ ,乘法因子 $k$。 一个哈希表的占有率达到 $r_t$ 时,分配一个新的哈希表,其大小为原来的 $k$ 倍。
  • 选$ r_t $ ,使得有较小的插入冲突和微小的插入失败。$d$ = 3 时,较好的 $r_t$ 为0.6或更小。
  • 选$k$, 使得不占用过多连续内存,且不造成过多页表大小调整。
  • $ k > (r_t + 1) / r_t $ (附录A)
  • 若在调整大小之外发生插入失败,则触发调整大小;若在调整大小期间发生插入失败,则将多个元素散列到其他地方,再重新插入。 实验证明,选取合适的 $r_t$,可完全避免插入失败。
  • downsize参数:downsize阈值 $d_t$, downsize 因子 $g$。

🔑 弹性布谷哈希页表

📝 构造

image

多级独立页表,可支持任意大小的页面。(基数页表只能支持固定几种大小的)

两层并行:(与基数页表不同)

  • 并行查找独立的页表(有cache加速)
  • 并行查找不同的组

页表项:8个PTE项和1个tag放在一个cache line里。

Cuckoo Walk

image

📝 Cuckoo Walk Tables

image

  • 有PUD-CWT, PMD-CWT, PTE-CWT:渐进保存更细粒度的信息,按顺序访问。
  • 为减少延迟,将它们缓存到MMU的Cuckoo walk caches (CWCs)。只缓存前两个。缓存PTE-CWT提供的局部性太少(类似于基数页表不缓存PTE项)
  • OS线程使用锁更新PUD-CWT和PMD-CWT。

CMT项:包含一个VPN标签、多个连续的Section头,一个项占一个缓存行。Section是虚拟内存地址范围。每个section头保存由页表中一个条目映射的虚拟内存段的信息(指定该section中页面的大小、页表哪一组保存着这个section对应的翻译)。

如图。2MB位:该section是否映射到一或多个2MB页面;4KB位:该section是否映射到一或多个4KB页面。仅当2MB位为1时,最后的way bits才有意义(哪一组)。

image

含义:

image

分配2MB和4KB页面时,2MB bit和4KB bit第一次更新。当4KB页面分配或rehash时,way bits不必更新。

PUD-CWT 类似于PMD-CWT。每个section头有5bit:1GB位、2MB位、4KB位、2 way bits(记录1GB页面映射到哪一路)。

📝 Cuckoo Walk Caches

  • CWCs缓存页大小、路信息(传统的基数页表游走缓存存页表项),CWC项非常小、命中率高。
  • CWC 和 CWT 可独立访问

🔑 地址翻译过程

(这里假设没有1GB的页)

image

TLB缺失后,页表游走硬件检查PUD-CWC。得到翻译结果,写回TLB。

  • PUD-CWC命中,3种情况:仅4KB,⑤得到翻译结果或页缺失;后两种,访PMD-CWC。
  • PMD-CWC命中,3种情况。
  • PMD-CWC缺失,使用PUD-CWC的信息进一步探查,2种情况。
  • PUD-CWC缺失,访问PWD-CWC。
  • 若考虑1GB的页,PUD-CWC缺失和PMD-CWC命中,需要取出PUD-CWT项。

🔑 并发控制

  • 页缺失时,仍可查找。类似于Linux下基数页表的并发处理。OS更新弹性布谷页表或CWT时,使用锁。读线程暂时读到旧的数据。
  • 使用同步和原子指令执行:插入、移动(way间、resize时不同页表间)、更新重哈希指针、更新CWT。
  • 若使用CWC的内容去找地址映射而失败了,再次执行游走:只访问目标页表的剩余路(若出现resize,则访问两个页表的剩余way)。这就会发现条目移动到另一路。这样CWC的旧条目就得到更新。

🔑 实验

baseline 4 KB, Cuckoo 4KB; baseline THP, Cuckoo THP. (THP:透明大页面)

  • 图应用:2个社交图分析算法(BC, DC);2个图遍历算法;单源点最短路径(SSSP);连通分支(CC);三角计数(TC);PageRank
  • 生物信息:BioBench suite的MUMmer。
  • HPC:GUPS,度量整数随机内存更新。
  • 系统:SysBench suite的内存基准测试。

🔑 其他

📝 后续工作

作者的后续工作:将弹性布谷哈希页表用于虚拟环境。

📝 相关TLB优化策略

减少TLB缺失的方法:clustering, coalescing, contiguity, prefetching, speculative TLBs, large part-of-memory TLBs

增加TLB reach的方法:OS层改进的大页面支持,去虚拟化内存,应用程序管理虚拟内存。

📝 体会

现有的优化地址翻译的方法着眼于制造translation contiguity,即大的连续虚拟空间映射到大的物理连续空间,从而简化地址翻译,降低TLB缺失率。减少多步页面游走的时间。但这破坏了本该有的地址映射灵活性。

该论文则另辟蹊径,在维护映射灵活性的前提下,设计一种新的页表,结构精简,缓存优化,地址翻译过程多处并行,大大降低了page walk的开销,且汇聚了其他多种优点。

论文引用详实,感觉积淀深厚。实验看起来做得很充分,多学学。

📝未懂

  • 乘法因子选取的论证(附录A)

瓮彀
4 声望1 粉丝

计算机体系结构/系统结构/数据库存储 论文阅读杂记