中文

结构良好的 Future 与缓存局部性

分布式、并行与集群计算 2017-04-11 v3

摘要

在 fork-join 并行模式中,顺序程序被分割为由有向依赖边连接的任务有向无环图,任务按照与其依赖关系一致的顺序执行(可能并行)。扩展 fork-join 并行的一种流行且有效的方法是允许线程创建 future。线程创建 future 以保存计算结果,该结果可能并行执行也可能不并行执行。当某个线程访问该 future 时返回结果,如有必要则阻塞直到结果就绪。最近的研究表明,虽然 future 当然可以以结构化方式增强并行性,但它们可能对缓存局部性产生有害影响。在最坏情况下,future 可能导致 Ω(PT+tT)\Omega(P T_\infty + t T_\infty) 次偏离,这意味着 Ω(CPT+CtT)\Omega(C P T_\infty + C t T_\infty) 次额外的缓存未命中,其中 CC 是缓存行数,PP 是处理器数量,tt 是访问次数,TT_\infty 是\emph{计算跨度}。由于缓存局部性对现代多核软件性能有重大影响,这一结果令人担忧。然而,在本文中我们表明,如果以简单、规范的方式使用 future,情况会好得多:如果每个 future 仅被访问一次,要么由创建它的线程访问,要么由从创建线程接收该 future 的线程访问,那么带有工作窃取(work stealing)的并行执行最多只会产生 O(CPT2)O(C P T^2_\infty) 次额外的缓存未命中,这是一个显著的改进。这种结构化的 future 使用方式是许多(但非全部)并行应用的特征。

关键词

引用

@article{arxiv.1309.5301,
  title  = {Well-Structured Futures and Cache Locality},
  author = {Maurice Herlihy and Zhiyu Liu},
  journal= {arXiv preprint arXiv:1309.5301},
  year   = {2017}
}