OCaml 多核 - 2021年8月
多核 OCaml:2021年8月
欢迎阅读 2021年8月的多核 OCaml月度报告!以下更新以及之前的更新由我、@ctk21、@kayceesrk 和 @shakthimaan 共同整理。本月的更新相对平静一些,因为8月也是欧洲的淡季(我们印度的团队也休了一段应得的假期),但我们都参加了在线 OCaml 研讨会,今年该研讨会以虚拟方式举行,因此有很多视频可以观看!
多核工作正有条不紊地进行,预计将于明年初集成到 OCaml 5.0 中,核心团队目前正在组织未来几个月的上游代码审查策略。同时,OCaml 研讨会还有一些博文和视频,提供了关于域并行和效应的更详细的更新。
- 为多核 OCaml 适配 OCaml 生态系统
- Parafuzz 覆盖引导的多核 OCaml 程序属性模糊测试
- 我们开发了 ParaFuzz,这是一种用于多核 OCaml 程序的输入和并发模糊测试工具。ParaFuzz 基于 Crowbar,Crowbar 将基于 AFL 的灰盒模糊测试与 QuickCheck 相结合,并将其扩展以处理并行性。
- 视频
- 效应使用体验
- OCaml 的多核分支添加了对效应处理程序的支持。在本演讲中,我们报告了我们使用效应的体验,包括转换现有代码和编写新代码。
- 视频
与往常一样,首先列出多核 OCaml 更新,然后是生态系统库和 Sandmark 基准测试的更新。
多核 OCaml
-
ocaml-multicore/ocaml-multicore#632 Str 模块多域安全性
关于 OCaml
Str
模块中 stdlib 安全性以与多核 OCaml 并发工作的问题。 -
ocaml-multicore/ocaml-multicore#633 使用 no-flat-float-arrays 构建 4.12.0+domains 失败
Adrián Montesinos González
(debugnik
)在安装 4.12.0+domainsno-flat-float-arrays
时观察到的链接器错误。 -
ocaml-multicore/ocaml-multicore#634 来自 merlin 的奇怪类型错误(此表达式的类型为 string/1)
使用多核 OCaml 编译器的效应版本时,merlin(4.3.1-412)报告的类型错误。
-
ocaml-multicore/ocaml-multicore#624 core v0.14:测试在 GC 中触发段错误
使用多核 OCaml 4.12.0+domains 运行
core.v0.14
测试套件时段错误的根本原因已确定。 -
ocaml-multicore/ocaml-multicore#573 将主干安全点 PR 反向移植到多核
这是将安全点实现反向移植到多核 OCaml 的一项持续工作。
生态系统
正在进行
-
ocaml-multicore/parallel-programming-in-multicore-ocaml#10 编辑以实现流程/语法/一致性
多核 OCaml 中的并行编程章节已更新以实现一致性、语法流程和语法。
-
ocaml-multicore/retro-httpaf-bench#15 优化 Go 代码
nethttp-go/httpserv.go
基准测试已通过使用Write
而不是fmt.Fprintf
以及移除 yield() 进行优化。 -
ocaml-multicore/ocaml-uring#37
poll_add
测试在 s390x 上挂起使用
poll_add
会导致在s390x
架构上挂起。提供了带有 GDB 的回溯以供参考。(gdb) bt #0 0x000003ffb63ec01e in __GI___libc_write (nbytes=<optimized out>, buf=<optimized out>, fd=<optimized out>) at ../sysdeps/unix/sysv/linux/write.c:26 #1 __GI___libc_write (fd=<optimized out>, buf=0x3ffffdee8e0, nbytes=1) at ../sysdeps/unix/sysv/linux/write.c:24 #2 0x000002aa0dbb0ca2 in unix_write (fd=<optimized out>, buf=<optimized out>, vofs=<optimized out>, vlen=<optimized out>) at write.c:44 #3 0x000002aa0dbd4d3a in caml_c_call ()
-
ocaml-multicore/domainslib#37 parallel_map
@UnixJunkie 提供了根据 parany 库建议的科学并行编程接口的简化版本。
val run: ?csize:int -> ~nprocs: int -> demux:(unit -> 'a) -> work:('a -> 'b) -> mux:('b -> unit) -> unit
-
ocaml-multicore/domainslib#39 在并行扫描中添加快速路径
当元素数量小于或等于池大小或域数量为一时执行顺序扫描的补丁。
-
ocaml-multicore/domainslib#40 并行映射
在 lib/task.ml 中实现
parallel_map
的 PR,其中包含可选的块大小参数。
已完成
-
ocaml-multicore/retro-httpaf-bench#13 更新 EIO 以提高性能,支持多个域
httpf-eio
在使用多个域运行时已增强了性能。下表显示了在具有 100 个连接和 5 秒运行时间的 8 核虚拟机上的结果。下图来自具有 1000 个连接和 60 秒运行时间的虚拟机。
使用
GOMAXPROCS=3
针对三个 OCaml 域的结果如下所示。 -
ocaml-multicore/ocaml-uring#36 更新到 cstruct 6.0.1
ocaml-uring
现在使用Cstruct.shiftv
,并已更新为使用 cstruct.6.0.1。 -
ocaml-multicore/domainslib#41 在指向使用示例的链接中使用 master 分支
README.md 文件已更新为指向 master 分支中使用新的
num_additional_domains
参数标签的示例程序。 -
名为ParaFuzz 的多核 OCaml 并发错误检测工具现已在 GitHub 上以自由/自由和开源软件的形式提供。
-
Tezos 是一个旨在不断发展的权益证明分布式共识平台,并使用 OCaml 编写。现在在多核 OCaml 上运行的Tezos守护程序版本也作为正在进行的 fork 在 GitHub 上提供。
Eio
eio
库为多核 OCaml 提供了一个基于效应的并行 IO 堆栈。
已完成
-
ocaml-multicore/eio#68 添加 eio_luv 后端
我们现在使用
luv
(它具有到 libuv 的 OCaml/Reason 绑定)来为 eio 提供跨平台的默认后端。 -
ocaml-multicore/eio#72 向抽象域套接字测试添加非确定性
包含
non-deterministic=command
以禁用针对失败的抽象域套接字测试的常规dune runtest
。 -
ocaml-multicore/eio#73 用于
io_uring
错误从终端读取的解决方法修复
IORING_OP_READ
的解决方法,该错误会导致io_uring_enter
在从终端读取时阻塞整个进程。 -
ocaml-multicore/eio#74 接收信号时不要崩溃
接收信号并在
lib_eio_linux/eio_linux.ml
中不崩溃的补丁。 -
ocaml-multicore/eio#75 添加 Eio.Stream
已将
Stream
模块添加到 Eio,该模块实现了具有取消功能的有界队列。 -
ocaml-multicore/eio#76 链接到一些 eio 示例
README.md 已更新为指向现有的 eio 示例项目源代码。
-
ocaml-multicore/eio#77 由于 dune 错误导致禁用 opam 文件生成
使用 dune.2.9.0 的 opam 文件生成已损坏,因为 dune 没有
subst --root
选项。因此,现在在 eio 构建步骤中已禁用此选项。 -
ocaml-multicore/eio#79 初始编辑以实现一致性、格式和清晰度
README.md 文件中的更改,以实现一致性、语法格式和清晰度。
基准测试
Sandmark
-
ocaml-bench/sandmark#251
更新依赖项以与 4.14.0+trunk 协同工作一系列更新 Sandmark 中依赖项的补丁,以便使用 dune.2.9.0 构建 4.14.0+trunk。
-
我们正在继续集成和测试使用 Sandmark-2.0 和
current-bench
构建 4.12.0 OCaml 变体,以进行顺序和并行基准测试。
感谢社区中所有 OCaml 用户、开发人员和贡献者为该项目投入的宝贵时间和支持。保持安全!
缩写
- GC:垃圾回收器
- GDB:GNU 项目调试器
- HTTP:超文本传输协议
- ICFP:国际函数式编程大会
- IO:输入/输出
- PR:拉取请求
- OPAM:OCaml 包管理器
- VM:虚拟机