OCaml 多核 - 2020 年 4 月
欢迎来到来自英国、印度、法国和瑞士的多核 OCaml 团队的 2020 年 4 月更新!虽然我们大多数人都处于封锁状态,但我们仍在继续前进。与 之前的更新 一样,感谢 @shakthimaan 和 @kayceesrk 帮助我们完成了所有这些工作。
预印本:将并行性移植到 OCaml
我们已经发布了一篇名为 "将并行性移植到 OCaml" 的论文的预印本,我们很乐意收到您的反馈。本文阐述了 OCaml 多核扩展的问题空间,并介绍了并发垃圾收集器 (GC) 的设计选择、实现和评估。
请注意,这不是一篇最终论文,因为它目前正在接受同行评审,因此现在提供的任何反馈都可以被纳入。请使用 pdf 论文 中的 @kayceesrk 和我自己的电子邮件联系方式,以便我们汇总(并承认!)任何此类评论。
重新基准进度
从 4.06.1 开始的 Multicore OCaml 重新基准已取得进展。我们已成功将并行次要 GC 重新基准到 4.09 OCaml 树 上。在接下来的几周内,我们将发布最新分支的 4.11 版本时,我们将发布更新的 opam 包。
由于中间冲突和引导的次数众多,因此像这样的复杂功能重新基准是一个“缓慢而稳定”的过程,因此我们不会为每个中间版本发布 opam 包 - 相反,4.11 树将成为任何 PR 的新“稳定基础”。
更高级别的 Domainslib API
来自 上个月更新 的关于构建并行光线追踪器的主题导致了 domainslib 库中的一些有用进展,以提供 async/await 风格的任务支持。请参阅下面的更新以获取更多详细信息。
在 ocaml-multicore/ocaml-multicore#324 中还有一个有趣的讨论,讨论了如何对自己的小型程序进行分析和优化。现在,使用不同调度属性的并行算法进行更多实验将非常有用。
4.11 中的上游功能
4.11 版本最近已分支,其中包含以下与多核相关的更改
-
一个并发安全的序列化实现(最初在 ocaml#9293 中,然后在 ocaml#9353 中再次实现)。这将对序列化密集型程序造成轻微的性能下降,因此在使用 4.11 的项目中尝试此功能的反馈将得到赞赏,以便向 OCaml 上游问题跟踪器提供反馈。
-
使用 CTF 格式的运行时事件日志跟踪系统即将在 4.11 中合并到 ocaml#9082 中。这对于那些需要顺序程序分析的人来说也很有意义,并且是对我们开发多核 GC 所必不可少的基础设施的推广。如果有人有兴趣帮助在 CTF 支持的 OCaml 方面进行黑客攻击以构建客户端,请与我或 @kayceesrk 联系。
除了上述亮点之外,我们还一直在对 Sandmark 基准测试基础设施进行持续改进和添加。下面提供了各种正在进行和已完成的任务供您参考。
多核 OCaml
正在进行
-
ocaml-multicore/ocaml-multicore 将 Multicore OCaml 提升到主干
Multicore OCaml 从 4.06 到 4.10 的重新基准工作正在进行,我们现在已经到了 4.09!我们预计在几周内完成对最新主干版本的重新基准。
-
ocaml-multicore/eventlog-tools:OCaml 事件日志工具
已经创建了一个项目,该项目为 OCaml 4.11.0 及更高版本提供了一组运行时跟踪工具。这包括一个简单的 OCaml 解码器,用于事件日志的跟踪和一个内置的 chrome 转换工具。
-
ocaml-multicore/domainslib#5 将 parallel_scan 添加到 domainslib
一个使用 Task API 结合前缀和和累积面积表的 parallel_scan 实现现在已添加到 Multicore OCaml 的域级并行编程库(domainslib)库中。
已完成
以下 PR 已合并到 Multicore OCaml 及其生态系统项目中
-
ocaml-multicore/ocaml-multicore#328 带有 Flambda 的多核编译器
对 Flambda 的支持已合并到 Multicore OCaml 项目存储库中。现在在 cmmgen 而不是 lambda 中执行转换,以进行 clambda 转换。
-
ocaml-multicore/ocaml-multicore#324 优化多核程序
以下 文档 提供了一个详细的示例,说明如何对多核程序进行性能调试以提高运行时性能。
-
ocaml-multicore/ocaml-multicore#325 添加了 eventlog_to_latencies.py 脚本
一个从事件日志生成延迟报告的脚本现在已包含在 ocaml-multicore 存储库中。
-
ocaml-multicore/domainslib#4 添加对 task_pools 的支持
domainslib 库现在支持使用 async/await 并行的工作窃取任务池。鼓励您尝试 示例。
基准测试
许多新的基准正在移植到 Sandmark 性能基准测试套件中。
-
ocaml-bench/sandmark#104 添加了 python pip3 依赖项
现在已在 Makefile 中定义了一个 check_dependency 函数,以及 Ubuntu 的依赖项和 pip 包列表。您现在可以在构建基准测试套件之前运行
make depend
,以确保您拥有所需的软件。python3-pip
包已添加到依赖项列表中。 -
ocaml-bench/sandmark#96 Sandmark 分析笔记本
bench2.ocamllabs.io 上的开发分支的设置、构建和执行脚本已迁移到 winter.ocamllabs.io。
正在开发一个用于分析顺序基准结果的 UI 和自动化脚本驱动的笔记本。
-
ocaml-bench/sandmark#108 移植使用 Task Pool API 库的归并排序和矩阵乘法
这是一个正在进行的 PR,用于使用
parallel_for
实现归并排序和矩阵乘法。 -
Cubicle
是一个模型检查器和一个自动 SMT 定理证明器。目前,它正在移植到 Multicore OCaml,这是一个正在进行的工作。 -
光线追踪器是一个存储库,其中包含针对不同并行函数式编程语言的光线追踪器实现。OCaml 实现现已更新为使用新的
Domainslib.Task
API。此外,针对 Multicore 光线追踪器的 flambda 参数进行了一些 实验,这些实验可以提高大约 25% 的速度,但它尚未删除浮点数的装箱。这些实验将在 4.11 上的 wip flambda2 树上合并后重复进行,该树将删除浮点数装箱。
OCaml
正在进行
-
ocaml/ocaml#9082 事件日志跟踪系统
基于评论和反馈,这个 PR 中进行了大量的提交。这些包括对配置脚本的更新、处理警告和异常、添加对 Windows 的构建支持、删除未使用的代码和编码风格更改。此补丁将被 cherry-picked 用于 4.11 版本。
已完成
-
ocaml/ocaml#9353 使用哈希表重新实现
output_value
以检测共享这个 PR 为 Multicore OCaml 实现了一个哈希表和位向量,它已被合并到 4.11 中。
我们一如既往地感谢社区中所有 OCaml 开发者和用户对该项目的持续支持和贡献!
缩写
- API:应用程序编程接口
- GC:垃圾收集器
- PIP:Pip 安装 Python
- PR:拉取请求
- SMT:可满足性模理论
- UI:用户界面