OCaml 多核處理 - 2021 年 10 月

歡迎來到 2021 年 10 月的 Multicore OCaml 月度報告!先前的更新和本次更新由 @ctk21、@kayceesrk 和 @shakthimaan 共同編寫。

正如 @octachron 上個月宣布的那樣,核心團隊已承諾明年發佈 OCaml 5.0,其中包含多核處理和 effects 執行期。本月,我們的多核處理分支為了準備一個對上游友好的版本進行了大量活動,並進行了一些變更,使程式碼準備好用於 ocaml/ocaml 並減少差異的大小。回想一下,自OCaml 4.09 開始,我們就一直在穩定地引入與多核處理相關的變更,因此現在我們正在處理真正重要的部分。因此,OCaml 主線程式碼現在正持續合併到我們的 5.00 暫存分支中,並且測試覆蓋率也相應增加。

在標準函式庫中,我們繼續努力並預設改進執行緒安全性。由於效果處理程式也確認將進入 5.0,因此它們現在在 stdlib 中也有自己的模組。多核函式庫生態系統也隨著支援 OCaml 5.00 的變更而不斷發展,特別是,隨著更多使用案例的建立,Domainslib 已經進行了重大的更新和改進。Sandmark 效能工具與 current-bench 的整合也在積極進行中。

我們要感謝以下人員的貢獻

  • Török Edwin 能夠重現 Task.pool 管理中的錯誤 Domainslib#43,並且也提供了 PR 來修復該問題。
  • Sid Kshatriya 建立了 PR#83,讓 Eio 使用效果處理程式模組。

我們在 11 月的重點將繼續放在無情地建立 5.0 暫存分支,並且我們正準備與 OCaml 核心團隊進行一系列工作組(佔用整整一週的時間),以對整個修補程式集進行初步程式碼審查。請繼續關注 12 月初的進展!

與往常一樣,多核 OCaml 更新首先列出,其中包含上游工作、與 trunk 的合併、測試案例的更新、錯誤修復和文件改進。接下來是關於 Domainslib、TezosEio 的生態系統更新。Sandmark 和 current-bench 任務最後列出供您參考。

多核 OCaml

進行中

上游

測試套件

雜項

  • ocaml-multicore/ocaml-multicore#669 為網域設定執行緒名稱

    為多核處理 OCaml 實作執行緒命名的修補程式。它提供一個介面來不同地命名網域和執行緒。

  • ocaml-multicore/ocaml-multicore#698 將空閒集區返回給作業系統

    pool_release 位於 shared_heap 中,並且不會將記憶體返回給作業系統。正在討論要保留多少記憶體,以及如何透過空間開銷設定來回收記憶體。

  • ocaml-multicore/ocaml-multicore#703 當沒有網域可以處理封鎖訊號時,caml_enter_blocking_section 中可能存在迴圈

    當存在封鎖特定訊號集的網域時,可能會觸發一種情況,其中沒有其他網域可以處理訊號,並且可能是由於 caml_enter_blocking_section 中的迴圈所導致。

  • ocaml-multicore/ocaml-multicore#725 封鎖訊號無限迴圈修復

    引入了單調的 recorded_signals_counter 來修復當沒有網域可以處理封鎖訊號時,caml_enter_blocking_section 中可能存在的迴圈。

  • ocaml-multicore/ocaml-multicore#726 並行修改物件的編組不安全

    必須正確處理在不同網域上修改的物件編組,並且應該是安全的。不應導致區段錯誤或崩潰。

已完成

上游

建置
  • ocaml-multicore/ocaml-multicore#662 停用 5.0 上的變更檢查

    已更新 .github/workflows/hygiene.yml,以停用 5.00 上的檢查,以避免變更條目產生雜訊。

  • ocaml-multicore/ocaml-multicore#676 修復 5.00 安裝

    已移除 caml/byte_domain_state.tbl,並且已將 README.adoc 重新命名為 README.stock.adoc,以便使用 OCaml 5.00 分支進行乾淨的建置。

變更
  • ocaml-multicore/ocaml-multicore#675Bytes.unsafe_of_string / Bytes.unsafe_to_string 與 OCaml trunk 對齊

    bytecomp/bytegen.ml 中使用的 Pbytes_to_string / Pbytes_of_string 現在與上游 OCaml 對齊。

  • ocaml-multicore/ocaml-multicore#677 移除偵錯 nop

    上游不需要偵錯 nop 基本型別,因此已清除。PR 也修正了 emit.mlp 中的拼寫檢查空白,以符合該 trunk。

  • ocaml-multicore/ocaml-multicore#679 移除 caml_read_field

    已移除 caml_read_field 的使用,因為現有的 Field 提供所有必要的資訊,使其更接近上游 OCaml。

  • ocaml-multicore/ocaml-multicore#681 還原為 otherlibs/unix 的 ocaml/trunk 版本

    已更新 unixsupport.ccstringv.cotherlibs/unix 中的檔案,使其與 ocaml/ocaml 類似。

  • ocaml-multicore/ocaml-multicore#684 移除 lambda/matching 中的歷史 for_handlerReperform_noloc

    不需要將 lambda/matching.ml{,i} 中的 for_handler 函式和 Reperform_noloc 上傳,因此已將其移除。

  • ocaml-multicore/ocaml-multicore#685 從 interp.c 中移除 Init_field

    已更新 interp.c 檔案,使其更接近 ocaml/ocaml。已修正拼寫檢查錯誤,並已清除 Init_field 巨集。

  • ocaml-multicore/ocaml-multicore#704 從網域中移除 Sync.poll 和奈秒

    已更新網域模組,使其僅包含上傳所需的變更。已移除 Domain.Sync.pollDomain.nanosecond。已將 Domain.Sync.cpu_relax 重新命名為 Domain.cpu_relax。已更新 platform.h,其中包含拼寫檢查的修復。

  • ocaml-multicore/ocaml-multicore#706otherlibs/win32unix 還原為 ocaml/trunk

    已更新 otherlibs/win32unix/* 檔案,使其更接近 ocaml/ocaml

  • ocaml-multicore/ocaml-multicore#708 移除可能存在的統計資料

    現在已移除輸出統計資料的 caml_maybe_print_stats 基本型別,以及 OCAMLRUNPARAMs 選項。

  • ocaml-multicore/ocaml-multicore#724 執行期:從 io.h 中移除未使用的欄位

    runtime/caml/io.h 中移除 revealedold_revealed,因為它們也已從 ocaml/ocaml 中移除。

差異
合併
  • ocaml-multicore/ocaml#2 將 trunk 更新為最新的上游 trunk

    PR 嘗試協助輸出 OCaml 5.0 的差異。經過變更後,您可以成功執行 make && make tests。結果摘要如下

    Summary:
    2918 tests passed
     40 tests skipped
      0 tests failed
    105 tests not started (parent test skipped or failed)
      0 unexpected errors
    3063 tests considered
    
    
  • ocaml-multicore/ocaml#3 最新的 5.00 提交

    來自 trunk 的最新提交現在已合併到 ocaml-multicore 5.00 分支。

  • ocaml-multicore/ocaml-multicore#718 從網域中棄用 Sync 和 timer_ticks

    此修補程式將 4.12.0+domains+effects 的變更與主線 5.00 分支同步。

執行緒安全

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

    PR#635 使 lib-str 具備網域安全性,可與 Multicore OCaml 並行運作。

  • ocaml-multicore/ocaml-multicore#672 Codefrag 執行緒安全性

    此 PR 引入無鎖定跳躍列表,使 codefrag 具備執行緒安全性。程式碼片段在移除後無法立即釋放,而是會新增至清單,並在稍後的停止世界暫停期間清除。

修正

測試套件

文件

  • ocaml-multicore/ocaml-multicore#672 修正 major_gc 的 check-typo 錯誤,以便 #672 中的變更不會被破壞

    一個修正 runtime/major_gc.c 中 check-typo 問題的修補程式。

  • ocaml-multicore/ocaml-multicore#696 Stdlib:修正 effectHandlers.mli 中的錯字

    已修正 stdlib/effectHandlers.mli 中的一些錯字。

  • ocaml-multicore/ocaml-multicore#697 移除無用程式碼並清除 minor gc 中的註解

    一個非功能性的變更,可清除 minor 和 major GC 檔案中的註解。

  • ocaml-multicore/ocaml-multicore#699 清理 fiber 實作並新增文件

    已移除 amd64.S 中未使用的程式碼,並已修正格式。不再需要在堆疊頂端為外部呼叫新增 24 個位元組,並且已移除。

  • ocaml-multicore/ocaml-multicore#713 澄清 Lazy wrt. RacyLazy 和 Undefined 例外的文件。

    已更新 stdlib/lazy.mli 中的文件,以澄清 try_force 的行為和執行緒安全性。

  • ocaml-multicore/ocaml-multicore#717 收緊 minor_gc.c 中的程式碼註解

    此 PR 解釋了暫存鍵的升級,以避免引入屏障,並使用 /* ... */ 樣式的註解。

  • ocaml-multicore#docs 文件

    一個 OCaml 5.00 的文件儲存庫,其中包含設計和建議的向上游計畫。

效果處理常式

雜項

生態系統

進行中
Domainslib
  • ocaml-multicore/domainslib#43 Task.pool 管理中可能存在的錯誤

    Török Edwin 已使用 4.12.0+domains 和 domainslib 0.3.1 在 AMD Ryzen 3900X CPU 上重現分段錯誤,並已提供包含修正程式的草稿 PR!

  • ocaml-multicore/domainslib#46 提供一種方式來反覆運算所有集區

    一項能夠反覆運算 domainslib 中建立的所有集區的要求。一個使用案例是拆除所有集區。可以使用弱雜湊集合來儲存集區的弱指標。

  • ocaml-multicore/domainslib#47 Task.await 死結(任務已完成,但 await 永遠不會返回)

    一個關於在 Task.async 內巢狀 Task.await,以及在 Task.async 內巢狀 Task.async 的查詢。也提供了範例程式碼片段、堆疊追蹤和平台資訊,以重現死結情境。

  • ocaml-multicore/domainslib#48ws_deque 移至 lockfree

    一個將 domainslib 中的工作竊取 deque 移至 ocaml-multicore/lockfree 的請求,並使 domainslib 依賴於此新的 lockfree 實作。

  • ocaml-multicore/domainslib#49 我們應該從程式庫公開多通道嗎?

    一個關於 Multicore OCaml 使用者是否會發現非 FIFO 多通道實作有用的查詢。Domainslib 已提供 FIFO 通道。

  • ocaml-multicore/domainslib#50 Multi_channel:允許每個程式有多個具有不同組態的執行個體

    Török Edwin 在 lib/multi_channel.mllib/task.ml 中貢獻的草稿 PR,用於移除每個通道金鑰的全域金鑰使用。

  • ocaml-multicore/domainslib#51 利用效果處理常式

    現在使用效果處理常式建立任務,而新的 test_deadlock.ml 會測試相同的內容。此變更僅適用於 4.12+domains5.00。以下顯示來自圖靈機 (Intel Xeon Gold 5120 CPU @ 2.20 GHz,28 個隔離核心) 的效能結果

    Domainslib-PR-51-performance

雜項
  • ocaml-multicore/tezos#8 ci.Dockerfile 擲回警告

    Ubuntu 20.10 上的 ci.Dockerfile 會在 GCC 10.3.0 上擲回 _Atomic 的 C99 警告。

  • ocaml-multicore/tezos#10 修復 make build-deps,修復 NixOS 支援

    不再需要上游的 conf-perl,並且已從 tezos-opam-repository 移除。此修補程式也會修復 make build-deps/build-dev-deps

  • ocaml-multicore/ocaml-uring#39 NixOS 上的測試失敗

    ocaml-uring 主分支在 NixOS 上使用 dune runtest 顯示測試失敗。

  • ocaml-multicore/eio#85 是否有任何支援 js_of_ocaml 的計畫?

    Konstantin A. Olkhovskiy (Lupus) 的查詢,詢問假設 js_of_ocaml 獲得效果支援,EIO 是否可以編譯為 JavaScript 後端。

已完成
Domainslib
  • ocaml-multicore/domainslib#45 新增具名集區

    現在新增一個可選引數,以便在設定期間命名集區。此名稱可用於稍後擷取集區。

  • ocaml-multicore/domainslib#52 使用隨機數作為快取前置詞,以在 CI 中停用快取

    現在 cache-prefix.github/workflows/main.yml 中使用隨機數,以在 CI 中停用快取。

  • ocaml-multicore/domainslib#53 使 domainslib 在 PR#704 之後使用 OCaml 5.00 建置/執行

    現在已更新 CI,以便使用 OCaml 5.00 分支建置和執行。

  • ocaml-multicore/domainslib#54 使用最後一個 4.12+domains+effects 雜湊作為快取金鑰

    現在快取金鑰使用 OCaml Multicore 的最後一個 commit 雜湊,以便使 CI 中的快取失效。

雜項
  • ocaml-multicore/tezos-opam-repository#3 新增 domainslib

    domainslib.0.3.1 版本現在已作為套件包含在 Tezos OPAM 儲存庫中。

  • ocaml-multicore/tezos-opam-repository#5 上游更新

    Tezos OPAM 儲存庫 已使用 PR#1PR#5 更新了上游變更。

  • ocaml-multicore/retro-httpaf-bench#17 改善圖表

    現在已將標記新增至從 Jupyter 筆記本產生的圖表,以便輕鬆區分顏色線條。

    retro-httpaf-bench-17-graph|690x409

  • ocaml-multicore/multicore-opam#59 在 ocaml-multicore/ocaml-multicore#514 之後修復 batteries

    batteries-includedbatteries.3.3.0+multicore opam 檔案已使用正確的 src URL 更新。

  • ocaml-multicore/eio#82 遷移至 4.12.0+domains 效果實作(無語法效果版本)

    此 PR 更新 eio 以支援 OCaml 5.0 版本的效應實作。

  • ocaml-multicore/eio#83 效果處理器現在有自己的模組

    Sid Kshatriya 貢獻了一個修補程式,將 Obj.Effect_handlers 重新命名為 EffectHandlers,因為效果處理器在 Stdlib 中有自己的模組。

  • ocaml-multicore/core

    Jane Street 的標準函式庫覆蓋層 core 現在已新增至 ocaml-multicore GitHub 專案儲存庫。

效能基準測試

Sandmark

進行中

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

    新的 Coq tarball,coq-multicore-2021-09-24,可以使用 Multicore OCaml 4.12.0+domains 建置,但是,由於已報告的 dune 問題stdio.v0.14.0 無法使用 4.14.0+trunk 清理建置。

  • ocaml-bench/sandmark#260 新增 5.00 分支以進行循序執行。修正筆記本。

    新的 5.00 OCaml 變體分支已新增至 Sandmark,以追蹤 CI 中的循序效能基準執行。

已完成

  • ocaml-bench/sandmark#256 移除舊的變體

    較舊的變體,4.05.*4.06.*4.07.*4.08.*4.10.0.* 現在已從 Sandmark 中移除。

  • ocaml-bench/sandmark#258
    在 README 中記錄 Makefile 變數

    README 現在包含有關在 Sandmark 中建置和執行效能基準期間使用的各種 Makefile 變數的文件。

current-bench

進行中

  • ocurrent/current-bench#117 從 Docker 容器讀取 stderr

    我們希望看到 Docker 容器內效能基準執行中的任何建置失敗,以用於除錯目的。

  • ocurrent/current-bench#146 複製 ocaml-bench-server 設定

    需要從 Sandmark Makefile 將 TAG 和 OCaml 變體抽象化到 current-bench,以便能夠為不同的編譯器版本和開發人員分支執行效能基準。

已完成

  • ocurrent/current-bench#105pipeline/lib/pipeline.ml 抽象出 Docker 映像名稱到環境

    現在支援自訂 Dockerfile,因此您可以在 Dockerfile 中提取任何 opam 映像。

  • ocurrent/current-bench#119 OCAML_BENCH_DOCKER_CPU 不支援平行執行的一系列 CPU

    Docker CPU 設定現在使用字串表示法,而不是整數,來指定平行執行的 CPU 清單。

  • ocurrent/current-bench#151 Docker 與原生效能

    在停用超執行緒的情況下,使用 current-bench 的 Docker,以及原生的循序和平行效能基準執行,沒有顯示明顯差異。下面提供 Gödel 伺服器組態和 Sandmark-nightly 筆記本圖表結果以供參考

    • CPU:Intel(R) Xeon® Gold 5120 CPU @ 2.20 GHz
    • OS:Ubuntu 20.04.3 LTS (Focal Fossa)
    • Sandmark 2.0-beta 分支:https://github.com/ocaml-bench/sandmark/tree/2.0-beta
    • 已停用超執行緒
      $ cat /sys/devices/system/cpu/smt/active
      0
      
    • 記憶體 (62 GB),磁碟 (1.8 TB)。
    • OCaml 變體:4.12.0+domains
    • Sandmark-nightly 筆記本:https://github.com/ocaml-bench/sandmark-nightly/tree/main/notebooks
    • 每個效能基準的五次迭代平均值
      • 用於循序的 run_in_ci
      • 用於平行的 macro_bench

    時間 Current-bench-151-Time|690x236 標準化 Current-bench-151-Time-Normalised|690x315 最高堆積字 Current-bench-151-Top-heap-words|690x236 標準化 Current-bench-151-Top-heap-words-Normalised|690x323

    MaxRSS (KB) Current-bench-151-MaxRSS|690x237 標準化 Current-bench-151-MaxRSS-Normalised|690x325

    主要集合 Current-bench-151-Major-collections|690x236 標準化 Current-bench-151-Minor-collections-Normalised|690x320

    平行效能基準 Current-bench-151-Parallel-benchmarks-I|486x500 Current-bench-151-Parallel-benchmarks-II|237x500

(請參閱 PR 的完整內容,以取得完整的圖表集,包括主要字組和耗費時間)

我們特別感謝社群中所有 OCaml 使用者、開發人員和貢獻者,感謝他們寶貴的時間和對專案的持續支持。保持安全!

縮寫

  • AMD:超微半導體
  • CI:持續整合
  • CPU:中央處理器
  • DLS:網域本機儲存
  • FIFO:先進先出
  • GB:吉位元組
  • GC:垃圾收集器
  • GCC:GNU 編譯器集合
  • IO:輸入/輸出
  • OPAM:OCaml 套件管理器
  • OS:作業系統
  • PR:提取請求
  • TB:兆位元組
  • URL:統一資源定位器