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