OCaml 多核 - 2021 年 7 月

欢迎来到 2021 年 7 月的 Multicore OCaml 月度报告!本月的更新以及 之前的更新 由我、@ctk21、@kayceesrk 和 @shakthimaan 共同编写。由于 8 月通常是欧洲的休假时间,下一次更新可能会在几个月后与 9 月份的更新合并(但考虑到我们现在地理位置的多样性,如果 8 月份有足够的进展,我将进行更新)。

多核工作的总体状况正朝着正确的方向发展:我们对下一个 OCaml 版本的贡献已 包含在 4.13.0~alpha2 中,我们的重点仍然是消除不兼容性并修复错误,以生成适合上游审查和发布的仅域并行补丁。作为一项低优先级活动,我们继续开发实验性的“基于效果”的 IO 堆栈,它将在 2021 年 8 月在 ICFP 上举行的虚拟 OCaml 研讨会上亮相。

4.12.0+domains 树木继续看到错误被稳定地修复。在上个月的电话会议之后,我们看到许多外部贡献者站出来提交修复,除了多核和核心 OCaml 团队之外。我们想感谢他们!

  • @emillon (Etienne Millon) 在 Jane Street 的 core v0.14 测试套件中运行了 4.12.0+domains 并分享了测试结果(并在其中发现了一个 多核 GC 边界情况错误)。
  • @Termina1 (Vyacheslav Shebanov) 测试了使用 Multicore OCaml 4.12.0+domains 编译 batteries 3.30。
  • @nbecker (Nils Becker) 报告了 parallel_mapparallel_scan 用于 domainslib。
  • Filip Koprivec 发现了一个内存泄漏,该内存泄漏发生在使用 4.12.0+domains 与 ocamlc 一起使用 flush_all 时。

所有这些修复,加上一些大型的兼容性更改(如下所示),使我越来越接近将 4.12.0+domains 作为我的日常 OCaml opam 切换选择。我鼓励您也尝试一下,并在 多核 OCaml 跟踪器 上报告(好的或坏的)结果。如果这些问题引起了您的注意,那么 Segfault Systems 正在印度招聘,与 @kayceesrk 和那里的团队一起从事多核 OCaml 工作。

对于基准测试,Sandmark 夜间基准测试运行的 Jupyter 笔记本已更新,我们继续测试 4.12+ 变体和 4.14.0+trunk 的 Sandmark 构建。已经取得进展,将 current-bench OCurrent 管道与 Sandmark 2.0 -alpha 分支更改集成,以重现当前的 Sandmark 功能,这将允许在合并之前系统地对 GitHub PR 进行基准测试。

与往常一样,Multicore OCaml 的正在进行和已完成的任务首先列出,然后是生态系统库的更新。然后提到 Sandmark 夜间构建工作、基准测试更新和相关的当前基准测试任务。最后,提供关于上游 OCaml 安全点的 PR 的更新,供您参考。

Multicore OCaml

正在进行

CI 兼容性

崩溃

包构建

  • ocaml-multicore/ocaml-multicore#609 lablgtk 的示例出现段错误

    正在进行一项努力,使用 OCaml 和 Multicore OCaml 编译 lablgtk。

  • ocaml-multicore/ocaml-multicore#624 core v0.14:测试在 GC 中触发段错误

    @emillon 报告称,使用 Multicore OCaml 4.12.0+domains 运行 core.v0.14 测试套件会导致段错误。

  • ocaml-multicore/ocaml-multicore#625 无法在 OCaml Multicore 4.12.0+domains 上编译 batteries

    Vyacheslav Shebanov (@Termina1) 正在努力使用 Multicore OCaml 4.12.0+domains 变体编译 batteries.3.30

上游

  • ocaml-multicore/ocaml-multicore#573 将 trunk 安全点 PR 反向移植到多核

    安全点实现正在被反向移植到 Multicore OCaml。在大型 Xen2 盒子上运行 Sandmark 的初始测试结果如下所示

OCaml-Multicore-PR-573-Time|458x500 OCaml-Multicore-PR-573-Speedup|458x500

杂项

已完成

增强

  • ocaml-multicore/ocaml-multicore#601 域更好的参与者

    已从域创建中的 0(n_running_domains) 和 STW 信号中的迭代 0(Max_domains) 中删除。

  • ocaml-multicore/ocaml-multicore#605 用于条件等待的 Eventog 事件

    已添加一个新事件,以指示域何时在 Condition.wait 上阻塞。这对调试 domainslib 中任务分配中的任何不平衡很有用。

OCaml-Multicore-PR-605-Illustration|536x500

上游

修复

  • ocaml-multicore/ocaml-multicore$604caml_scan_global_young_roots 中修复未经保护的 caml_skiplist_empty

    一个补丁,修复了在 Mac OS CI 上使用 parallel/join.ml 观察到的全局根锁定错误。

  • ocaml-multicore/ocaml-multicore#621 otherlibs:encode_terminal_status 不会设置所有字段

    一个小的修复程序,用于在 otherlibs 中从使用 caml_initialize_field 移动到使用 caml_initialize 时造成的错误。

  • ocaml-multicore/ocaml-multicore#628 在 link_channel 中,channel->prev 应设置为 NULL

    一个 PR,修复了 Filip Koprivec 报告的使用 flush_allocamlc 一起使用时的内存泄漏。

  • ocaml-multicore/ocaml-multicore#629 Backtrace last exn 是 val unit

    通过在 runtime/backtrace.c 中将 backtrace_last_exn 清除为 Val_unit 来修复运行核心测试套件时报告的崩溃。

生态系统

正在进行

  • ocaml-multicore/ocaml-uring#36 更新到 cstruct 6.0.1

    ocaml-uring 现在已更新为使用 Cstruct.shiftv,并升级到 cstruct.6.0.1。

  • ocaml-multicore/domainslib#37 parallel_map

    @nbecker 要求提供一个在数组上进行 parallel_map 操作的函数,其签名如下:

    val parallel_map : Domainslib.Task.pool -> ('a -> 'b) -> 'a array -> 'b array
    
  • ocaml-multicore/domainslib#38 parallel_scan 拒绝大小不超过池大小的数组

    @nbecker 报告称,对于大小不超过池大小的数组,Task.parallel_scan 会抛出“索引越界”异常。

已完成

  • ocaml-multicore/eventlog-tools#4 添加 domain/condition_wait 事件

    eventlog-tools 中的 lib/consts.ml 文件现在包含 domain/condition_wait 事件。

  • ocaml-multicore/domainslib#34 修复 parallel_for_reduce 中的初始值记账

    已修复 parallel_for_reduce 的初始值,使其不再被多次记账。

Eio

eio 库为 Multicore OCaml 提供了一个基于效果的并行 IO 堆栈。

正在进行
  • ocaml-multicore/eio#68 WIP:添加 eio_luv 后端

    正在进行一项工作,使用 luv,它为 eio 提供了 OCaml/Reason 绑定到 libuv,以作为跨平台后端。

已完成
  • ocaml-multicore/eio#62 更新到最新的 MDX 以修复异常报告

    Dune 已更新到 2.9,并进行了必要的更改以使用 MDX 进行异常报告。

  • ocaml-multicore/eio#63 更新 README

    更新文档,说明手动固定 `ppxlib` 和 `ocaml-migrate-parsetree` 的效果版本的步骤。

    opam switch create 4.12.0+domains+effects --repositories=multicore=git+https://github.com/ocaml-multicore/multicore-opam.git,default
    opam pin add -yn ppxlib 0.22.0+effect-syntax
    opam pin add -yn ocaml-migrate-parsetree 2.1.0+effect-syntax
    
  • ocaml-multicore/eio#64 改善 traceln

    增强 `traceln` 使其成为一个 Effect,并更改跟踪输出并添加测试。

  • ocaml-multicore/eio#65 为优化读取添加 Flow.read_methods

    在 `Flow` 模块中添加 `read_methods`,作为一种比写入缓冲区更快的读取方法。

  • ocaml-multicore/eio#66 允许取消等待信号量

    更新 `lib_eio/semaphore.ml` 以允许取消等待信号量。

  • ocaml-multicore/eio#67 添加更通用的异常

    包含通用异常以避免依赖于后端特定的异常。测试也已更新。

基准测试

Sandmark 夜间构建

正在进行

  • ocaml-bench/sandmark-nightly#4 为 Navajo 结果绘制并行笔记本暂停时间图形时出现错误

    用于暂停时间的并行 Jupyter 笔记本出现 `ValueError`,需要调查。

  • ocaml-bench/sandmark-nightly#5 禁用基准测试的状态

    需要使用最新版本的 Multicore OCaml 测试从 Jupyter 笔记本中禁用的 `alt-ergo`、`frama-c` 和 `js_of_ocaml` 基准测试结果。

  • ocaml-bench/sandmark-nightly#6 Navajo 上的并行可扩展性数字看起来很奇怪

    需要审查 Navajo 构建服务器上关于可扩展性的并行性能数字,并重复和验证实验。

  • ocaml-bench/sandmark-nightly#7 在并行笔记本中使用 `col_wrap` 为 3 而不是 5 来显示标准化结果

    为了提高可读性,建议在并行笔记本中使用 `col_wrap` 为 3 来显示标准化结果。

  • ocaml-bench/sandmark-nightly#8 在夜间笔记本中查看一组基准测试的结果

    一个功能请求,用于在使用 Jupyter 笔记本时按名称或标签过滤基准测试。

  • ocaml-bench/sandmark-nightly#9 最近结果的静态 HTML 页面

    最近的构建运行的基准测试结果应用于生成静态 HTML 报告,以便进行审查和分析。

已完成

Sandmark-nightly-PR-2-Fix|307x313

Sandmark

正在进行

  • ocaml-bench/sandmark#243 添加 irmin tree 基准测试

    一个请求,将 Irmin tree.ml 基准测试添加到 Sandmark,包括必要的依赖项和数据文件。

  • ocaml-bench/sandmark#245 添加 dune.2.9.0

    更新 dune.2.9.0,以便使用 Multicore OCaml 在 Sandmark 上构建 coq。

  • ocaml-bench/sandmark#247 Sandmark 在 OCaml 4.14.0+trunk 上崩溃

    我们需要解决 Sandmark 在 OCaml 4.14.0+trunk 上的构建问题,因为我们开始将更多 Multicore OCaml 更改上游。

  • ocaml-bench/sandmark#248 coq 构建失败

    使用 4.12.0+domains+effects 在 Navajo 服务器上的 Sandmark 上,`coq` 包构建失败。

已完成

  • ocaml-bench/sandmark#233 更新 pausetimes_multicore 以适应最新的 Multicore 更改

    Multicore 暂停时间现在已针对 4.12.0 上游和 4.12.0 分支更新,这些分支现在使用新的通用跟踪格式 (CTF)。

  • ocaml-bench/sandmark#235 更新选定的基准测试作为基准基准测试的集合

    您现在可以选择只从用户选择的变体中过滤 Jupyter 笔记本。

Sandmark-PR-235-Fix|690x77

  • ocaml-bench/sandmark#237 在更大机器上运行 sandmark_nightly

    Sandmark 夜间构建现在在一台 64 核以上的机器上运行,以从 Domainslib 的改进中受益。

  • ocaml-bench/sandmark#240 添加 Navajo 特定的并行 config.json 文件

    在 Sandmark 中添加了一个 Navajo 服务器特定的 run_config.json 文件,用于运行 Multicore 并行基准测试。

  • ocaml-bench/sandmark#242 添加关于 grammatrix 的评论

    关于 grammatrix 基准测试的文档更新,其中介绍了通过通道进行自定义任务分配以及 `parallel_for` 的使用。

  • ocaml-bench/sandmark#244 将 chrt 添加到 pausetimes_multicore 扩展程序

    在 paramwrapper 中使用 `chrt -r 1` 是必需的,因为 `pausetimes_multicore` 需要使用 taskset 参数。

  • ocaml-bench/sandmark#246 将 trunk 构建添加到 CI

    .drone.yml 文件现在已更新,包括 CI 的 4.14.0+stock trunk 构建。

current-bench

正在进行

  • ocurrent/current-bench#117 从 Docker 容器中读取 stderr

    我们现在能够使用 current-bench 运行 Sandmark-2.0 -alpha 分支,并且在使用 Docker 容器运行时查看错误输出非常有用。

  • ocurrent/current-bench#146 复制 ocaml-bench-server 设置

    一个请求,动态地将 Sandmark 基准测试目标命令传递给 current-bench,以便创建管道。

OCaml

已完成

  • ocaml/ocaml#10039 安全点

    该 PR 已在 4.13 上 cherry-pick,并最终与上游 OCaml 合并。

我们要感谢社区中所有 OCaml 用户、开发人员和贡献者对该项目宝贵的时间和支持。如果您身处北半球,祝您夏季安全愉快!

首字母缩略词

  • AFL: American Fuzzy Lop
  • CI: 持续集成
  • CTF: 通用跟踪格式
  • GC: 垃圾收集器
  • GCC: GNU 编译器集合
  • GTK: GIMP 工具箱
  • HTML: 超文本标记语言
  • IO: 输入/输出
  • OPAM: OCaml 包管理器
  • OS: 操作系统
  • PR: 拉取请求
  • STW: 停止世界