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 之上,它將基於 AFL 的灰盒模糊測試與 QuickCheck 相結合,並將其擴展到處理並行處理。
    • 影片
  • 效果的經驗
    • OCaml 的多核分支增加了對效果處理程式的支援。在本次演講中,我們將報告我們使用效果的經驗,包括轉換現有程式碼和編寫新程式碼。
    • 影片

一如既往,首先列出多核 OCaml 更新,然後是來自生態系統函式庫和 Sandmark 基準測試的更新。

多核 OCaml

  • ocaml-multicore/ocaml-multicore#632 Str 模組多域安全

    在 OCaml Str 模組中,關於標準函式庫安全的問題,它需要與多核 OCaml 同時運作。

  • ocaml-multicore/ocaml-multicore#633 在沒有平坦浮點陣列的情況下建置 4.12.0+domains 時發生錯誤

    當安裝 4.12.0+domains no-flat-float-arrays 時,Adrián Montesinos González (debugnik) 觀察到的連結器錯誤。

  • 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 在平行掃描中新增快速路徑

    當元素數量小於或等於集區大小,或當域數量為 1 時,執行循序掃描的修補程式。

  • 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 在用法範例的連結中使用主分支

    已更新 README.md 檔案,以指向使用新 num_additional_domains 引數標籤的主分支中的範例程式。

  • 名為 ParaFuzz 的多核 OCaml 並發錯誤偵測工具現在在 GitHub 上以自由/開放原始碼軟體形式提供。

  • Tezos 是一個旨在發展的權益證明分散式共識平台,以 OCaml 編寫。現在在多核 OCaml 上執行的 Tezos 精靈版本也以進行中的分支形式在 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:虛擬機器