OCaml 多核 - 2020年5月
多核 OCaml:2020年5月
欢迎阅读来自多核 OCaml 团队的 2020 年 5 月更新!与之前的更新一样,非常感谢 @shakthimaan 和 @kayceesrk 帮助整理了本月的综述。
2020年5月的一个重要里程碑是完成了将多核 OCaml 从 4.06 版本重构到 4.10 版本!执行停止世界并行次要垃圾回收的并行次要 GC 变体是编译器的默认分支,这意味着与 C 绑定的兼容性现在比旧的次要 GC 设计简单得多。
我收到了很多问题,询问这是否意味着多核 OCaml 现在可以“正常工作”于 opam 生态系统。还没有:我们估计现在距离实现这一点只剩一个 PR 了,这需要将现有的 Threads
模块移植回多核 OCaml,以支持现有 OCaml 支持的旧版(运行时非并行但并发)线程用法。这项工作在一年前由 @jhw 在#240中开始,现在由 @engil 在#342中进行了重构和审查。一旦合并并由我们在大量软件包和批量构建中进行测试,我们就可以开始使用 opam 与多核 OCaml 一起使用了。下个月敬请关注更多相关信息!
首先列出多核 OCaml 的正在进行和已完成的任务,然后是 Sandmark 基准测试项目的改进。最后,提及了对上游 OCaml 的贡献状态,以供参考。本月还召开了 OCaml 核心运行时开发人员会议,以分配重构后的任务(例如还移植 statmemprof、如何处理非 x86 架构、Windows 支持等),以确保对上游任务有更全面的了解。任务列表很长,但长度稳步减少。
至于目前如何贡献,现在已经开始了一项非常令人兴奋的工作,即关于在 OCaml 中支持并行算法的适当编程抽象。请参阅此主题以了解更多信息,并参阅Domainslib存储库以获取更多传统并行算法的低级示例。大约一个月后,我们预计多核切换也更适合与 opam 一起使用,但这不要阻止您今天将您最喜欢的并行基准测试移植到 Domainslib。
多核 OCaml
正在进行
-
ocaml-multicore/ocaml-multicore#339 域本地存储的提案
已创建了一个在多核 OCaml 中实现域本地存储的新提案。
-
ocaml-multicore/domainslib#8 如果域数量大于 8,则任务库速度变慢
这是一个正在进行的调查,探讨为什么当域数量大于 8 时,
domainslib
版本 0.2 的生命游戏基准测试速度会变慢。 -
ocaml-multicore/ocaml-multicore#340 修复 concurrent_minor_gc 中的 Atomic.exchange
使用
Atomic.get
和Atomic.compare_and_set
为Atomic.exchange
提供了一个实现,以获得正确的语义来处理 interp.c 中的断言失败。 -
ocaml-multicore/ocaml-multicore#338 引入 Lazy.try_force 和 Lazy.try_force_val
为并发惰性抽象实现了
Lazy.try_force
和Lazy.try_force_val
函数,以处理 RacyLazy 异常。 -
ocaml-multicore/ocaml-multicore#333 多核上的 Random 模块函数速度变慢
在多核上观察到
Random
模块速度变慢,并且正在详细分析该问题。 -
ocaml-multicore/ocaml-multicore#343 修复 extcall noalloc DWARF
该补丁为
extcall noalloc
发出的 DWARF 信息提供了修复。此 PR 目前正在审查中。
已完成
-
ocaml-multicore/ocaml-multicore#337 将 opam 文件更新到 4.10.0+multicore
将多核 OCaml 重构到 4.11 分支(
parallel_minor_gc_4_11
)点的操作现已完成!4.10.0+multicore 的opam 文件已在 multicore-opam 存储库中设置为默认值。 -
ocaml-multicore/ocaml-multicore#335 将 byte_domain_state.tbl 添加到安装文件
现在已在 runtime/Makefile 中包含了一个安装
byte_domain_state.tbl
和caml/*.h
文件的补丁,这是 parallel_minor_gc_4_10 分支所需的。 -
使用 SPIN 模型检查器对多核 OCaml 主 GC 实现进行的验证可在以下 GitHub 存储库中找到 ocaml-multicore/multicore-ocaml-verify。
基准测试
正在进行
-
ocaml-bench/sandmark#115 任务 API 移植:LU 分解、Floyd Warshall、Mandelbrot、N 体
以下程序的移植 - LU 分解、Floyd Warshall、Mandelbrot 和 N 体,以使用任务 API。
-
ocaml-bench/sandmark#37 使基准测试包装器用户可配置
目前正在评估动态指定输入命令及其相应参数到基准测试脚本的功能。
-
ocaml-bench/sandmark#106 提升 dune > 2.0
Sandmark 使用 dune 1.11.4,并且我们需要继续支持大于 2.0 的 dune。正在测试具有必要软件包构建的升级路径。
已完成
-
ocaml-bench/sandmark#109 添加了 sequential-interactive.ipynb
已包含一个用于运行和分析顺序基准测试的交互式笔记本。给定一个包含基准测试文件的工件目录,笔记本会在 GUI 中提示您选择不同的提交和编译器变体进行分析。下面显示了 UI 的示例屏幕截图
此 PR 添加了错误处理、用户输入验证,并且项目自述文件也已更新。
-
ocaml-bench/sandmark#111 将并行初始化和并行复制添加到 LU 分解基准测试
现在已将并行初始化添加到 LU 分解数值基准测试(benchmarks/multicore-numerical/LU_decomposition_multicore.ml)。
-
ocaml-bench/sandmark#113 在 Makefile 中使用 --format=columns 与 pip3 list
现在已在 Makefile 中添加了一个修复程序,用于修复使用
pip3 list
时出现的“弃用:默认格式将在将来切换到列”警告,并使用了--format=columns
选项。 -
ocaml-bench/sandmark#116 对并行基准测试构建使用 sudo
Makefile 已使用正确的
sudo
和 OPAM 环境变量组合进行了更新,以便我们现在可以在 Sandmark 中运行并行基准测试。chrt
命令专门需要 sudo 命令。我们现在可以对串行和并行基准测试执行夜间构建! -
ocaml-bench/sandmark#118 重构了自述文件并添加了 JupyterHub 信息
Sandmark 自述文件现已更新,其中包含有关配置、JupyterHub 用法、基准测试和快速入门指南的信息!
OCaml
正在进行
-
ocaml/ocaml#9541 为检测运行时添加手册页
已创建检测运行时事件日志跟踪的草稿手册。请随时查看文档并分享您的宝贵反馈。
-
ocaml/dune#3500 支持针对 OCaml 4.11 检测运行时构建可执行文件
OCaml 4.11.0 内置支持检测运行时,并且能够让 dune 生成检测目标将非常有用。
已完成
-
ocaml/ocaml#9082 事件日志跟踪系统
使用二进制跟踪格式 (CTF) 的 OCaml 运行时事件日志跟踪提案现已与上游 OCaml (4.11.0) 合并。
-
ocaml/ocaml#9534 [RFC] 裸指针的动态检查
一个关于在 4.10.0 编译器中添加动态识别裸指针功能的 RFC。
-
ocaml/ocaml#9573 在不使用 Unix.fork 的情况下重新实现 Unix.create_process 和相关函数
Unix 模块中进程创建函数的使用对于多核 OCaml 来说并不合适,无论是在行为上还是在效率上。该补丁提供了一个使用
posix_spawn
的实现。 -
ocaml/ocaml#9564 为堆外块标头添加宏
此 PR 添加了一个宏定义,用于在 runtime/caml/mlvalues.h 中构造堆外块标头。目标是将标头用于堆外对象。
一如既往,我们要感谢所有 OCaml 开发人员和用户对该项目的持续支持和贡献。请注意安全。
首字母缩略词
- API:应用程序编程接口
- CTF:通用跟踪格式
- DWARF:带属性记录格式的调试
- GC:垃圾回收器
- GUI:图形用户界面
- LU:下三角-上三角
- OPAM:OCaml 包管理器
- PIP:Pip 安装 Python
- PR:拉取请求
- RFC:征求意见稿
- UI:用户界面