OCaml 多核 - 2021年8月

多核 OCaml:2021年8月

欢迎阅读 2021年8月的多核 OCaml月度报告!以下更新以及之前的更新由我、@ctk21、@kayceesrk 和 @shakthimaan 共同整理。本月的更新相对平静一些,因为8月也是欧洲的淡季(我们印度的团队也休了一段应得的假期),但我们都参加了在线 OCaml 研讨会,今年该研讨会以虚拟方式举行,因此有很多视频可以观看!

多核工作正有条不紊地进行,预计将于明年初集成到 OCaml 5.0 中,核心团队目前正在组织未来几个月的上游代码审查策略。同时,OCaml 研讨会还有一些博文和视频,提供了关于域并行和效应的更详细的更新。

  • 为多核 OCaml 适配 OCaml 生态系统
    • 本次演讲介绍了我们的社区如何适应即将推出的具有并行功能的 OCaml 5.0。
    • 博文 1博文 2
    • 视频
  • 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álezdebugnik)在安装 4.12.0+domains no-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() 进行优化。

    retro-httpaf-bench-go-optimise|411x266

  • 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 核虚拟机上的结果。

    retro-httpaf-bench-100-connections-5-seconds|411x262

    下图来自具有 1000 个连接和 60 秒运行时间的虚拟机。

    retro-httpaf-bench-1000-connections-60-seconds|401x262

    使用 GOMAXPROCS=3 针对三个 OCaml 域的结果如下所示。

    retro-httpaf-bench-three-domains-15|411x262

  • 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:虚拟机