一句话:提出 Multicore OCaml 库 OBatcher,用隐式批处理与转换函子简化批量并行并发数据结构的设计、实现和使用。
论文关注线程安全并发数据结构在实现复杂性与吞吐量之间的两难:基于锁的结构易实现且易证明线程安全,但在多线程负载下吞吐差;无锁结构吞吐高却难以正确实现和验证。作者借助批量并行思想,提出 Multicore OCaml 库 OBatcher:一方面设计轻量级隐式批处理,基于通用异步编程机制让用户无需显式分组操作;另一方面总结将常见顺序结构转换为高效批量并行结构的一系列策略,并以函子形式提供。评估使用多种基准和大规模异步工作负载,结果表明这些实现持续优于对应的粗粒度锁实现,且吞吐量能随处理器数量合理扩展。
Design of an efficient thread-safe concurrent data structure is a balancing act between its implementation complexity and performance. Lock-based concurrent data structures, which are relatively easy to derive from their sequential counterparts and to prove thread-safe, suffer from poor throughput under even light multi-threaded workload. At the same time, lock-free concurrent structures allow for high throughput, but are notoriously difficult to get right and require careful reasoning to formally establish their correctness. In this work, we explore a solution to this conundrum based on a relatively old idea of batch parallelism —an approach for designing high-throughput concurrent data structures via a simple insight: efficiently processing a batch of a priori known operations in parallel is easier than optimising performance for a stream of arbitrary asynchronous requests. Alas, batch-parallel structures have not seen wide practical adoption due to (i ) the inconvenience of having to structure multi-threaded programs to explicitly group operations and (ii) the lack of a systematic methodology to implement batch-parallel structures as simply as lock-based ones. We present OB atcher —a Multicore OCaml library that streamlines the design, implementation, and usage of batch-parallel structures. It solves the first challenge (how to use) by suggesting a new lightweight implicit batching design that is built on top of generic asynchronous programming mechanisms. The second challenge (how to implement) is addressed by identifying a family of strategies for converting common sequential structures into efficient batch-parallel ones, and by providing functors that embody those strategies. We showcase OBatcher with a diverse set of benchmarks. Our evaluation of all the implementations on large asynchronous workloads shows that (a) they consistently outperform the corresponding coarse-grained lock-based implementations and that (b) their throughput scales reasonably with the number of processors.
DOI 原文 · arXiv · PDF(开放获取) · DBLP
@article{abs-2408-13779,
title = {Concurrent Data Structures Made Easy},
author = {Callista Le and Kiran Gopinathan and Koon Wen Lee and Seth Gilbert and Ilya Sergey},
journal = {Proceedings of the ACM on Programming Languages},
volume = {8},
number = {OOPSLA2},
year = {2024},
doi = {10.1145/3689775}
}