OCaml 多核 - 2020年1月

欢迎阅读来自多核 OCaml 团队的 2020 年 1 月新闻更新!我们将每月总结我们的活动,以突出我们今年的工作重点。此更新由 @shakthimaan 和 @kayceesrk 共同整理。

我们收到的最常见问题是如何为整体多核工作做出贡献。正如我去年提到的,我们目前正在稳步地将我们的工作上游到 OCaml 主线。因此,到目前为止,最好的贡献方式是测试主 OCaml 代码库中未解决的补丁是否存在回归或改进机会。

次要好处是审查多核代码库中的 PR,但由于目前这些 PR 都是通过压力测试发现的,因此外部评估起来比较困难。负面贡献将是引发关于正交特性或新项目管理机制的讨论——这需要花费时间和精力来回复,而且团队现在已经非常忙碌,因为上游工作已经开始。我们当然不希望阻止这些讨论的发生,但希望它们能够导向 OCaml 通用错误跟踪器或本论坛上的其他主题。

我们将首先回顾 OCaml 的 PR 和问题,然后介绍多核代码库和我们的 Sandmark 基准测试基础设施。一项实施和测试 OCaml 多核的新并行算法的计划也正在进行中。

OCaml

正在进行

  • ocaml/ocaml#9082 事件日志跟踪系统

    事件日志是针对 OCaml 运行时提出的一个新的跟踪机制,它提供指标和计数器,并使用二进制跟踪格式 (CTF)。下一步要将其合并,是在单独的运行时变体中孵化跟踪功能,以便可以在应用程序链接时选择它。

  • ocaml/ocaml#8984 迈向新的闭包表示

    已经针对垃圾收集器遍历而无需使用页表,提出了一种新的闭包布局。这对于 OCaml 多核和性能改进非常有用。PR 正在等待其他开发人员审查,然后可以重新基于主干进行测试和合并。

  • ocaml-multicore/ocaml-multicore#187 更好的安全点

    一个定期轮询域间中断以提供更好安全点的补丁正在积极审查中。这是为了确保运行时系统能够通知任何挂起的中断。

  • 正在努力改进上游 OCaml 中的编组 (runtime/extern.c),以避免使用 GC 标记位来表示已访问状态,并使用哈希表 (addrmap) 实现。

已完成

以下 PR 已合并到上游 OCaml 主干

  • ocaml/ocaml#8713 将 C 全局变量移动到专用结构

    此 PR 将 C 全局变量移动到“域状态”表中。每个域都需要自己的域本地变量表,因此这是多核运行时所必需的。

    这发现了一些与 C 头文件相关的兼容性问题,这些问题都包含在最近的 OCaml 4.10.0+beta2 版本中(通过下一项)。

  • ocaml/ocaml#9253caml_* 移回主题头文件

    来自 runtime/caml/compatibility.h 的 caml_* 定义已被移动,以提供 OCaml 4.04 到 4.10 版本的兼容 API。此更改对于拥有自身状态的多核域也很有用。

OCaml 多核

以下 PR 已合并到 OCaml 多核树中

  • ocaml-multicore/ocaml-multicore#275 修复 OCaml 多核的惰性行为

    实现了 caml_obj_forward_lazy() 函数来处理 OCaml 多核中的惰性值。

  • ocaml-multicore/ocaml-multicore#269 从全局 pools_to_rescan 移动到域本地

    在压力测试期间,当一个域正在分配到池中时,该池正在被重新扫描,这导致了段错误。重新扫描现在已移至域本地,因此这种情况将不再发生。

  • ocaml-multicore/ocaml-multicore#268 修复了一些空间泄漏

    此 PR 修复了在执行压力测试时,域生成和终止期间发生的空间泄漏。

  • ocaml-multicore/ocaml-multicore#272 修复非分配外部调用的 DWARF CFI

    进入 caml_classify_float_unboxed 导致了错误的回溯,并且提供了一个明确指定 OCaml 和 C 之间边界的修复。

  • 正在积极研究和实施 OCaml 多核的同步次要垃圾收集器。已经对工作共享并行停止世界分支与多核主干进行了基准测试,同时清除了技术债务、处理了竞争条件并修复了段错误。C-API 回退更改已测试并合并到 OCaml 多核的停止世界次要 GC 分支中。

基准测试

  • 已改进Sandmark 性能基准测试基础设施,以补充数据、跟踪分支和命名基准。

  • 数值并行基准已添加到多核编译器中。

  • 已在 Sandmark 中包含一个Irmin 宏基准。正在使用不同的读写速率测试一个用于测量 Irmin 与 Git 作为其文件系统的合并能力的测试。

  • 还正在努力为 N 体、反向互补、k 核苷酸、二叉树、fasta、fannkuch-redux、regex-redux、生命游戏、光线追踪、Barnes Hut、计数图、SSSP 以及来自 MultiMLton 基准的测试实现并行算法,以便在 OCaml 多核上进行测试。

文档

  • 正在撰写关于 OCaml 多核中并行编程的章节,并且将向社区提供早期草稿以征求反馈。它基于域,并包含用于实现数组求和、π 近似以及定积分的梯形规则的示例。

缩略词

  • API:应用程序编程接口
  • CTF:通用跟踪格式
  • CFI:调用帧信息
  • DWARF:带属性记录格式的调试
  • GC:垃圾收集器
  • PR:拉取请求
  • SSSP:单源最短路径