分叉联合:在 C++ 和 Rust 中超越 OpenMP ?

主要观点:

  • 多数 C++和 Rust 线程池库性能不佳,常比 OpenMP 慢 10 倍,作者起草了 300 行的 Fork Union 库,性能接近 OpenMP 且无其他依赖。
  • OpenMP 虽在粗粒度并行方面常用,但在细粒度并行、可移植性和元编程方面存在不足,作者寻找 C++和 Rust 的现成线程池后发现多数实现异步任务队列,引入性能问题。
  • 介绍了 Fork Union 的基准测试,与 OpenMP、Taskflow、Rayon 等比较,显示 Fork Union 性能较好,证明选择合适工具的重要性。
  • 阐述了性能的“四骑士”:锁和互斥体(可能导致系统调用和上下文切换)、内存分配(可能导致异常和性能不可预测)、原子操作和 CAS(代价高应避免)、对齐(避免伪共享)。
  • 比较了 Fork Union、Rayon、Taskflow 的 API,Fork Union 接口简单,Rayon 数据并行性好,Taskflow 常用于简单静态并行。
  • 结论是瘦的 300 行 fork-join 池可接近 OpenMP 性能,Rust 稳定工具链中存在缺失的分配器支持等问题,等待 Rust 特性以在 HPC/大数据环境中更好应用。

关键信息:

  • AWS Graviton 4 金属机上的测试结果,Fork Union 在 C++和 Rust 版本下的性能数据。
  • 性能“四骑士”的原理和影响。
  • Fork Union、Rayon、Taskflow 的 API 特点和示例代码。

重要细节:

  • 硬件为单 NUMA 节点的 96×Arm v9 核心,测试 workload 为“ParallelReductionsBenchmark”。
  • C++中 Fork Union 的 4 个核心接口及使用方法,Rust 中类似的方法和变体。
  • Rayon 的默认.par_iter()API 及在“Parallel Reductions Benchmark”中的使用方式。
  • Taskflow 的常见示例及在“Parallel Reductions Benchmark”中的包装方式。
  • 对 Rust 稳定工具链中缺失分配器支持等问题的讨论。
阅读 16
0 条评论