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_map
和parallel_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#602 包含大部分 OCaml 标头会导致需要 pthread
包含多个嵌套标头文件需要
pthread
,并且decompress
测试套件失败。 -
ocaml-multicore/ocaml-multicore#607
caml_young_end
不再是value *
在 CI 中观察到不一致,其中
caml_young_end
现在是char *
而不是value *
。
崩溃
-
ocaml-multicore/ocaml-multicore#608 Parmap 测试套件崩溃
当
Parmap
的测试套件针对 Multicore OCaml 运行时,它会导致段错误。 -
ocaml-multicore/ocaml-multicore#611 在 AFL 下运行 Multicore 二进制文件时崩溃
bun
包在 Multicore OCaml 4.12+domains 上崩溃,但可以在 4.12 上正常构建。
包构建
-
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/ocaml-multicore#617 一些兼容性宏没有放在与上游 OCaml 相同的标头中
为 GC 统计数据引入的兼容性层需要与 trunk 保持一致。
-
ocaml-multicore/ocaml-multicore#618 检查 io.c 的线程安全性并添加并行测试
io.c 中的线程安全修复需要审查,并且需要为其添加额外的测试。
-
ocaml-multicore/ocaml-multicore#623 公开
caml_channel_mutex_*
钩子一个草案 PR,从 trunk 到 Multicore OCaml 支持
caml_channel_mutex_*
接口。
杂项
-
ocaml-multicore/ocaml-multicore#610 添加 std gnu11 通用 cflags
configure.ac 文件已更新,以便在 GCC 和 Clang 中的
common_cflags
中使用-std=gnu11
。 -
ocaml-multicore/ocaml-multicore#614 在 fork 后销毁通道互斥锁
关于在运行时 fork 后重置和重新初始化互斥锁的讨论。
-
ocaml-multicore/ocaml-multicore#616 公开使用效果进行编程的函数
一个草案 PR,使程序员能够编写使用效果的程序,而无需显式使用效果语法。
-
ocaml-multicore/ocaml-multicore#619 设置资源限制
一个查询,在 Multicore OCaml 中使用
setrlimit
,类似于 Jane Street 的核心库中的Core.Unix.RLimit.set
。
已完成
增强
-
ocaml-multicore/ocaml-multicore#601 域更好的参与者
已从域创建中的
0(n_running_domains)
和 STW 信号中的迭代0(Max_domains)
中删除。 -
ocaml-multicore/ocaml-multicore#605 用于条件等待的 Eventog 事件
已添加一个新事件,以指示域何时在
Condition.wait
上阻塞。这对调试 domainslib 中任务分配中的任何不平衡很有用。
-
ocaml-multicore/ocaml-multicore#615 make depend
已更新
stdlib/.depend
以涵盖 stdlib 的最新发展。 -
ocaml-multicore/ocaml-multicore#626 添加 Obj.drop_continuation
已将
caml_drop_continuation
原语添加到runtime/fiber.c
中,以防止遗留延续导致泄漏。
上游
-
ocaml-multicore/ocaml-multicore#584 现代化信号处理
Multicore OCaml 信号实现现在更接近于上游 OCaml。
-
ocaml-multicore/ocaml-multicore#600 在标头中公开更多 GC 变量
caml_young_start
、caml_young_limit
和caml_minor_heap_wsz
变量现在已在运行时定义。 -
ocaml-multicore/ocaml-multicore#612 使 intern 和 extern 与 Multicore 一起工作
上游对 intern 和 extern 的更改现在已合并,以与 Multicore OCaml 运行时一起工作。
修复
-
ocaml-multicore/ocaml-multicore$604 在
caml_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_all
与ocamlc
一起使用时的内存泄漏。 -
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 报告,以便进行审查和分析。
已完成
-
ocaml-bench/sandmark-nightly#2 时间戳在 parallel_nightly 笔记本中未排序
下拉选项中的时间戳列表现在已排序。
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 笔记本。
-
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
已完成
-
该 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: 停止世界