OCaml 多核心 - 2021 年 1 月

歡迎來到雙倍份量的多核心月報,包含了 2020 年 12 月和 2021 年 1 月的內容 (團隊在年底假期集體休息,好好放鬆一下)。我們鼓勵您回顧由 @shakthimaan、@kayceesrk 和我編譯的 2020 年所有先前每月更新。

回顧 2020 年,我們在將多核心 OCaml 上游化的過程中實現了許多重大里程碑。主要的重點包括實作 eventlog 追蹤系統,使除錯複雜的平行化變得實際、從 OCaml 4.06 大規模重構到 4.11、撰寫關於平行程式設計的章節、在 ICFP 2020 上發表「將平行化改裝到 OCaml 上」、Sandmark 基準測試的產品使用,以及系統執行緒整合的實作。當所有這些都在多核心程式碼樹中進行時,上游化到主線 OCaml 的努力也全面展開,@xavierleroy 領導核心團隊的努力,以確保正確的部分被納入 OCaml 的各種版本中,並像其他功能一樣接受廣泛的程式碼審查。

2020 年底,生態系統函式庫進行了增強和更新,更多工具也開始可用。特別是,我們要感謝

  • @mattpallissard 讓 merlindot-merlin-reader 能夠在 Multicore OCaml 4.10 上運作。這使得使用 OCaml Platform 工具 (如 VSCode 外掛程式) 進行程式設計更加愉快。
  • @eduardorfs 使用 ReasonML 專案測試了 no-effect-syntax Multicore OCaml 分支。

@kayceesrk 也發表了幾場線上公開演講

我們非常感謝 OCaml 核心開發人員在 2020 年為這項工作投入了如此多的時間和精力!我們正在制定更廣泛的 2021 年令人興奮的多核心路線圖計畫,該計畫將在核心 OCaml 開發人員會議批准後,納入下個月的月報中。廣泛的策略保持一致:穩步將功能片段放入每個即將發布的 OCaml 版本中,以便在 OCaml 5.0 版本 (將包含網域平行化) 之前,每個版本都可以單獨審查和測試。

隨著 OCaml 4.12 的 beta 版本發布,我們的一月份主要用於處理 OCaml 4.13 所需的一些大型部分。特別是,安全點 PR 已進行了重大更新 (以及相應的效能改進),並且我們一直在研究網域本地分配緩衝區 (DLAB) 的設計和實作。我們也開始研究如何將超棒的循序最佳擬合分配器與我們的多核心主要 GC 合併,以便在 OCaml 5.0 中獲得兩者的優點。多核心 IO 堆疊也已重新啟動開發,重點是在重新改裝舊的忠實 epollkqueue 介面之前,先關注 Linux 的新 io_uring 核心介面。

在工具方面,多核心 Merlin 支援在 12 月開始,現在已合併,這要感謝 @mattpallissard 和 @eduardorfs。我們將繼續改進 Sandmark 2.0 基準測試套件,以便發布即將到來的 alpha 版本 - @shakthimaan 向多核心團隊做了一場關於這些改進的線上研討會,該研討會已錄製,並將在下個月提供給任何有興趣為我們的基準測試工作做出貢獻的人。

與之前的報告一樣,多核心 OCaml 更新首先列出 2020 年 12 月的內容,然後列出 2021 年 1 月的內容。最後,為了您的參考,提及了上游 OCaml 的持續工作,在多核心程式碼樹的特定部分之後。

2020 年 12 月

多核心 OCaml

進行中

生態系統

  • ocaml-multicore/lockfree#6 目前狀態和潛在改進

    一份 RFC,列出 lockfree 函式庫的目前狀態,以及 Kcas 相依性、測試套件和基準測試的可能效能改進。

  • ocaml-multicore/lockfree#7 設定 travis CI 建置

    需要為 CI 建置系統建立一個 .travis.yml 檔案,類似於 https://github.com/ocaml-multicore/domainslib/ 中的檔案。

  • ocaml-multicore/effects-examples#20 新增 WebServer 範例

    一個開放的任務,將基於 httpaf 的 Web 伺服器實作新增到 effects-examples 儲存庫。

  • ocaml-multicore/effects-examples#21 調查 CI 失敗

    CI 建置在 MacOS 上失敗並出現逾時,但在 Linux 上執行正常。正在進行調查。

  • ocaml-multicore/multicore-opam#39 多核心 Merlin

    感謝 @mattpallissard (Matt Pallissard) 和 @eduardorfs (Eduardo Rafael) 測試 merlindot-merlin-reader,並使其在 Multicore OCaml 4.10 上運作!這已使用 VSCode 和 Atom 進行測試,UI 的螢幕截圖如下所示。PR 39 多核心 Merlin 螢幕截圖|435x350

API

  • ocaml-multicore/ocaml-multicore#448 在 C API 中重新引入 caml_stat_accessors

    caml_stat_minor_wordscaml_stat_promoted_wordscaml_allocated_words caml_stat_minor_collections 欄位未在 Multicore OCaml 中公開。這是討論解決相同問題的可能方案。

  • ocaml-multicore/ocaml-multicore#459 以全域根取代 caml_root API

    正在進行中的工作,將 caml_root 類型的變數轉換為 value,並將它們註冊為全域根或世代全域根,以便完全移除 caml_root API。

雜項

  • ocaml-multicore/ocaml-multicore#450「惡意」系統執行緒和網域終止

    一個 RFC,討論非空執行緒鏈的網域終止的語義。在 Multicore OCaml 中,網域終止並不意味著程式結束,而插槽重用增加了實作的複雜性。

  • ocaml-multicore/ocaml-multicore#451 OCaml 5.0 注意事項:移除 compatibility.h

    OCaml Multicore 從 compatibility.h 中移除了 modifyinitialize,這是一個追蹤問題,要在 OCaml 5.0 中移除 compatibility.h。

  • ocaml-multicore/ocaml-multicore#458 no-effect-syntax:從 typedtree 中移除效果

    此 PR 從 typedtree.ml 中移除效果語法的使用,並啟用使用 AST 的外部應用程式與僅限網域的 Multicore OCaml 協同工作。

  • ocaml-multicore/ocaml-multicore#461 從 eventlog 中移除 stw/leader_collision 事件

    一個修補程式,透過移除 stw/leader_collision 記錄訊息來改善記錄的檢視和分析。

已完成

  • ocaml-multicore/effects-examples#23 遷移到 dune

    建置腳本過去使用 OCamlbuild,現在已移植為使用 dune。

  • ocaml-multicore/ocaml-multicore#402 將 handle_gc_interrupt 分割為處理遠端和輪詢部分

    此 PR 包含新增 caml_poll_gc_work,其中包含在 caml_handle_gc_interrupt 中完成的 GC 工作輪詢。這有助於遞迴處理中斷,而不會引入新狀態。

  • ocaml-multicore/ocaml-multicore#439 系統執行緒生命週期工作

    此改進修復了兩個網域正在初始化時 caml_thread_scan_roots 中的競爭條件,並且已完成重新設計,以改進一般資源處理和釋放描述符和堆疊。

  • ocaml-multicore/ocaml-multicore#446 在次要回收結束時收集 GC 統計資訊

    GC 統計資訊在次要回收結束時收集,並且已移除 GC 採樣統計資訊的雙緩衝。從以下圖示中觀察到,此變更不會對現有的基準測試執行產生影響,與標準 OCaml 相比。

    PR 446 Graph Image|690x317

  • ocaml-multicore/ocaml-multicore#454 在 amd64 中尊重 ASM_CFI_SUPPORTED 旗標

    amd64.S 中的 CFI 指令現在受 ASM_CFI_SUPPORTED 保護,因此使用 --disable-cfi 編譯現在將提供乾淨的建置。

  • ocaml-multicore/ocaml-multicore#455 不會在 fork 上封鎖區段

    一個修補程式,用於處理惡意執行緒嘗試接管執行緒 masterlock 的情況,並防止子執行緒移至無效狀態。Dune 現在可以安全地與 Multicore OCaml 一起使用。

基準測試

進行中

  • ocaml-bench/rungen#1 修復編譯器警告和錯誤,以便進行乾淨的建置

    此修補程式提供了一些小修復,以便使用 dune 乾淨地建置 rungen,以便與 Sandmark 2.0 一起使用。

  • ocaml-bench/orun#2 修復編譯器警告和錯誤,以便進行乾淨的建置

    已移除未使用的變數和函式,以移除使用 dune 建置 orun 時產生的所有警告和錯誤。

  • ocaml-bench/sandmark#198 Sandmark 中的雜訊

    一份 RFC,用於測量基準測試多次執行之間的雜訊,以便更好地了解各種硬體組態設定以及啟用和停用 ASLR 時的效能。

  • ocaml-bench/sandmark#200 全域根微基準測試

    此修補程式包含 globroots_seq.mlglobroots_sp.mlglobroots_mp.ml,這些檔案新增了微基準測試以測量全域根掃描的效率。

  • 我們正在繼續將現有的 Sandmark 基準測試套件與 Sandmark 2.0 原生 dune 建置環境整合,以便與 opam 編譯器切換環境一起使用。現有的基準測試已移植到相同的位置以使用它們各自的 dune 檔案。orunrungen 套件現在位於單獨的 GitHub 儲存庫中。

已完成

  • ocaml-bench/sandmark#196 根據標籤篩選基準測試

    現在可以使用 tags 來篩選基準測試,而不再是使用自訂的目標 .json 檔案。您現在可以使用以下命令來建置基準測試:

    $ TAG='"run_in_ci"' make run_config_filtered.json 
    $ RUN_CONFIG_JSON=run_config_filtered.json make ocaml-versions/4.10.0+multicore.bench
    
  • ocaml-bench/sandmark#201 修復 CI 中的編譯器版本

    .drone.yml 中的一個小更新,在 CI 中對 4.10.0+multicore+serial 使用 ocaml-versions/4.10.0+multicore.bench

OCaml

進行中

  • ocaml/ocaml#9876 不要在處理器暫存器中快取 young_limit

    這個 PR 用於移除 ARM64、PowerPC 和 RISC-V 埠硬體中暫存器中快取 young_limit 的操作,目前正在審查中。

2021 年 1 月

多核心 OCaml

進行中

  • ocaml-multicore/ocaml-multicore#464 將 Field_imm 替換為 Field

    這個修補程式將並行次要垃圾收集器中的 Field immediate 用法替換為 Field。

  • ocaml-multicore/ocaml-multicore#468 終結器在多個網域中導致程式碼區段錯誤

    一個進行中的測試案例,其中終結器在多個網域中導致區段錯誤。

  • 網域本地分配緩衝區 (DLAB) 的設計和實作正在進行中,相關的注意事項可在以下 DLAB Wiki 中找到。

已完成

生態系統

  • ocaml-bench/rungen#1 修復編譯器警告和錯誤,以便進行乾淨的建置

    使用 Dune 建置 rungen 的小修正,以便與 Sandmark 2.0 一起使用。

  • ocaml-bench/orun#2 修復編譯器警告和錯誤,以便進行乾淨的建置

    一個修補程式,用於移除使用 Dune 建置 orun 時,沒有任何警告和錯誤的未使用變數和函式。

  • ocaml-bench/rungen#2 為 dune-release lint 新增 meta 檔案

    現在,dune-release lint 檢查 rungen 時會通過,因為加入了 CHANGES、LICENSE 和對 rungen.opam 檔案的更新。

  • ocaml-bench/orun#3 為 dune-release lint 新增 meta 檔案

    已加入 CHANGES、LICENSE、README.md 和 orun.opam 檔案,為 opam.ocaml.org 發行版準備原始碼。

  • ocaml-multicore/multicore-opam#39 多核心 Merlin

    感謝 @mattpallissard (Matt Pallissard) 和 @eduardorfs (Eduardo Rafael) 測試 merlindot-merlin-reader,並使其與多核心 OCaml 4.10 一起運作!這些變更可以與 VSCode 和 Atom 正常運作。對應的 PR#40 現在已合併。

  • ocaml-multicore/ocaml-multicore#45 Merlin 和 OCaml-LSP 安裝說明

    已更新 README.md 檔案,以加入使用 Merlin 和 OCaml LSP 伺服器的安裝說明。

雜項

  • ocaml-multicore/ocaml-multicore#458 no-effect-syntax:從 typedtree 中移除效果

    這個 PR 使使用 AST 的外部應用程式可以與僅限網域的多核心 OCaml 一起運作,並移除 typedtree.ml 中的效果語法用法。

  • ocaml-multicore/ocaml-multicore#461 從 eventlog 中移除 stw/leader_collision 事件

    已清理 stw/leader_collision 記錄訊息,使其更容易檢視和分析記錄。

  • ocaml-multicore/ocaml-multicore#462 從 Travis 移至 GitHub Actions

    為了與上游 CI 類似,現在更新持續整合建置,以使用 GitHub Actions 而不是 Travis CI。

  • ocaml-multicore/ocaml-multicore#463 次要 GC:將全域根掃描限制為單一網域

    在次要垃圾收集期間,即時網域會掃描所有全域根,而修補程式將全域根掃描限制為僅單一網域。循序和並行巨型基準測試結果如下:

PR 463 OCaml Multicore Sequential |690x318

PR 463 OCaml Multicore Parallel |690x458

  • ocaml-multicore/ocaml-multicore#467 停用標記堆疊的修剪

    當在另一個網域重新標記集區,而該網域也在進行配置時,會發生並行錯誤,此 PR 用於停用標記堆疊溢位。

基準測試

進行中

  • ocaml-bench/sandmark#202 在 Makefile 中新增 bench clean 目標

    已將 benchclean 目標新增至 Makefile,以便僅移除 _build_results_opam 資料夾會保留已安裝的必要套件和相依性,以便可以快速重新建置和執行基準測試。

  • ocaml-bench/sandmark#203 實作 ITER 支援

    已正確實作 ITER 的使用,以建置基準測試的多個執行個體,並重複執行基準測試。這有助於從多個執行中的指標取得平均值。例如,使用 ITER=2 會產生兩個 .summary.bench 檔案,如下所示:

    $ ls _build/
      4.10.0+multicore_1  4.10.0+multicore_2  log
    
    $ ls _results/
      4.10.0+multicore_1.orun.summary.bench  4.10.0+multicore_2.orun.summary.bench
    
  • ocaml-bench/sandmark#204 將 layers.ml 作為基準測試新增至 Sandmark

    將 Irmin layers 基準測試及其相依性加入 Sandmark。這是一項進行中的工作。

  • 我們正在繼續增強 Sandmark 2.0,它使用原生 dune 來建置和執行基準測試,並使用目前的 Sandmark 組態檔進行移植和測試。orunrungen 套件已移至各自的儲存庫。已實作在 .summary.bench 檔案中使用 meta 標頭條目、ITER 支援和套件覆寫功能。

已完成

  • ocaml-bench/sandmark#200 全域根微基準測試

    已將 globroots_seq.mlglobroots_sp.mlglobroots_mp.ml 的實作加入至微型基準測試,以測量全域根掃描的效率。

OCaml

進行中

  • ocaml/ocaml#10039 安全點

    使用序言省略演算法的草稿安全點實作更新,現在已重新基礎至 trunk。sherwood (AMD EPYC 7702) 和 thunderx (Cavium ThunderX CN8890) 上的執行階段基準測試結果如下:

    PR 10039 OCaml Sherwood |690x391 PR 10039 OCaml ThunderX |690x389

已完成

  • ocaml/ocaml#9876 不要在處理器暫存器中快取 young_limit

    此 PR 移除 ARM64、PowerPC 和 RISC-V 埠硬體中暫存器中快取 young_limit 的操作。

感謝社群中所有 OCaml 使用者和開發人員對專案的持續支持和貢獻,我們期待在 2021 年與您合作!

縮寫

  • API:應用程式設計介面
  • ARM:進階 RISC 機器
  • ASLR:位址空間配置隨機化
  • AST:抽象語法樹
  • CFI:呼叫框架資訊
  • CI:持續整合
  • GC:垃圾收集器
  • ICFP:國際函數程式設計會議
  • JSON:JavaScript 物件表示法
  • OPAM:OCaml 套件管理器
  • PR:提取請求
  • RFC:徵求意見稿
  • RISC-V:精簡指令集運算 - V
  • UI:使用者介面