OCaml 多核心 - 2021 年 7 月

歡迎來到 2021 年 7 月的 多核心 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) 使用 4.12.0+domains 執行 Jane Street core v0.14 測試套件並分享測試結果(並在此過程中發現一個 多核心 GC 邊緣案例錯誤)。
  • 感謝 @Termina1 (Vyacheslav Shebanov) 使用多核心 OCaml 4.12.0+domains 測試 batteries 3.30 的編譯。
  • 感謝 @nbecker (Nils Becker) 報告 domainslib 的 parallel_mapparallel_scan
  • 感謝 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 進行基準測試。

與往常一樣,多核心 OCaml 的正在進行和已完成的任務會先列出,然後是來自生態系統函式庫的更新。接著提及 Sandmark 夜間建置工作、基準測試更新和相關的 current-bench 任務。最後,提供有關上游 OCaml 安全點 PR 的更新供您參考。

多核心 OCaml

正在進行

CI 相容性

崩潰

套件建置

  • ocaml-multicore/ocaml-multicore#609 lablgtk 的範例發生分段錯誤

    正在進行使用 OCaml 和多核心 OCaml 編譯 lablgtk 的工作。

  • ocaml-multicore/ocaml-multicore#624 core v0.14:測試觸發 GC 中的分段錯誤

    @emillon 回報使用多核心 OCaml 4.12.0+domains 執行 core.v0.14 測試套件導致的分段錯誤。

  • ocaml-multicore/ocaml-multicore#625 無法在 OCaml 多核心 4.12.0+domains 上編譯 batteries

    Vyacheslav Shebanov (@Termina1) 嘗試使用多核心 OCaml 4.12.0+domains 變體編譯 batteries.3.30

上游

  • ocaml-multicore/ocaml-multicore#573 將 trunk 安全點 PR 反向移植到多核心

    安全點實作正在反向移植到多核心 OCaml。下面顯示了在大型 Xen2 機箱上執行 Sandmark 的初始測試結果

OCaml-Multicore-PR-573-Time|458x500 OCaml-Multicore-PR-573-Speedup|458x500

雜項

已完成

增強功能

  • ocaml-multicore/ocaml-multicore#601 網域更好的參與者

    已移除網域建立中的 0(n_running_domains) 和 STW 信號中的迭代 0(Max_domains)

  • ocaml-multicore/ocaml-multicore#605 條件等待的 Eventog 事件

    已新增一個新事件,以指示網域何時在 Condition.wait 處被封鎖。這對於偵錯 domainslib 中工作分配的任何不平衡很有用。

OCaml-Multicore-PR-605-Illustration|536x500

上游

修復

  • 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 回報當使用 ocamlc 時使用 flush_all 的記憶體洩漏。

  • ocaml-multicore/ocaml-multicore#629 回溯最後一個 exn 是 val unit

    修復了在執行 core 的測試套件時回報的崩潰,方法是在 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 工作中:新增 eio_luv 後端

    正在開發中使用 luv,它提供 OCaml/Reason 綁定到 libuv,作為 eio 的跨平台後端。

已完成
  • ocaml-multicore/eio#62 更新至最新 MDX 以修復例外報告

    Dune 已更新至 2.9 版本,並進行了必要的變更以使用 MDX 進行例外報告。

  • ocaml-multicore/eio#63 更新 README

    文件更新,明確指定手動釘選 ppxlibocaml-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-ergoframa-cjs_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 報告,以供審閱和分析。

已完成

Sandmark-nightly-PR-2-Fix|307x313

Sandmark

進行中

  • ocaml-bench/sandmark#243 新增 irmin tree 基準測試

    一個將 Irmin tree.ml 基準測試新增到 Sandmark 的請求,包括必要的依賴項和資料檔案。

  • ocaml-bench/sandmark#245 新增 dune.2.9.0

    更新到 dune.2.9.0,以便在 Sandmark 上使用 Multicore OCaml 建置 coq。

  • ocaml-bench/sandmark#247 Sandmark 在 OCaml 4.14.0+trunk 上中斷

    由於我們開始向上游推送更多 Multicore OCaml 變更,因此需要解決 OCaml 4.14.0+trunk 的 Sandmark 建置問題。

  • ocaml-bench/sandmark#248 coq 無法建置

    coq 套件無法在 navajo 伺服器上使用 Sandmark 使用 4.12.0+domains+effects 建置。

已完成

  • ocaml-bench/sandmark#233 更新 pausetimes_multicore 以符合最新的 Multicore 變更

    Multicore 暫停時間現已針對 4.12.0 上游和 4.12.0 分支更新,它們現在使用新的通用追蹤格式 (CTF)。

  • ocaml-bench/sandmark#235 更新選定的基準測試作為基準基準測試的集合

    您現在可以選擇僅從 Jupyter 筆記本中使用者選擇的變體進行篩選。

Sandmark-PR-235-Fix|690x77

  • ocaml-bench/sandmark#237 在更大的機器上執行 sandmark_nightly

    Sandmark 夜間建置現在在 64 個以上核心的機器上執行,以從 Domainslib 的改進中獲益。

  • ocaml-bench/sandmark#240 新增 navajo 特定平行 config.json 檔案

    已將 navajo 伺服器特定的 run_config.json 檔案新增到 Sandmark,以執行 Multicore 並行基準測試。

  • ocaml-bench/sandmark#242 新增 grammatrix 的註解

    關於 grammatrix 基準測試的文件更新,內容是關於通過通道自訂任務分配和使用 parallel_for

  • ocaml-bench/sandmark#244 將 chrt 新增到 pausetimes_multicore 包裝器

    pausetimes_multicore 在 paramwrapper 中需要使用 chrt -r 1 才能使用 taskset 引數。

  • ocaml-bench/sandmark#246 將 trunk 建置新增到 CI

    已更新 .drone.yml 檔案,以將 4.14.0+stock trunk 建置包含在 CI 中。

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

已完成

  • ocaml/ocaml#10039 安全點

    PR 已在 4.13 上挑選,並最終與上游 OCaml 合併。

我們要感謝社群中所有 OCaml 使用者、開發人員和貢獻者對專案的寶貴時間和支持。如果您在北半球,請注意安全,並祝您有個美好的夏天!

縮寫

  • AFL:美國模糊測試器 (American Fuzzy Lop)
  • CI:持續整合 (Continuous Integration)
  • CTF:通用追蹤格式 (Common Trace Format)
  • GC:垃圾收集器 (Garbage Collector)
  • GCC:GNU 編譯器集合 (GNU Compiler Collection)
  • GTK:GIMP 工具組 (GIMP ToolKit)
  • HTML:超文字標記語言 (HyperText Markup Language)
  • IO:輸入/輸出 (Input/Output)
  • OPAM:OCaml 套件管理器 (OCaml Package Manager)
  • OS:作業系統 (Operating System)
  • PR:提取請求 (Pull Request)
  • STW:停止世界 (Stop The World)