OCaml 多核心 - 2021 年 3 月

歡迎來到 2021 年 3 月份的 Multicore OCaml 月度報告! 以下更新和先前的報告由我 @kayceesrk 和 @shakthimaan 共同編纂。 我們大致上仍按計劃將多核心的最後先決條件整合到下一個 (4.13) 版本中,並為 OCaml 5.0 提出僅限網域的並行處理。

上游 OCaml 4.13 開發

複雜的安全點 PR (#10039) 持續進展中,隨著更多精進,目的是減少因引入更多輪詢點而導致的二進位檔大小增加。 特別感謝 @damiendoligez 透過 PR-to-the-PR 積極參與,專注於可行的演算法!

Multicore OCaml 樹狀結構

如果有一件事我們不會想念的,那就是 Git 的變基。多核心之旅在很久以前就以 OCaml 4.02 開始,然後是 4.044.06 和目前的 4.10。 我們很高興宣布,多核心 OCaml 樹狀結構到 OCaml 4.12.0 的最後一次變基(希望如此)現在已可使用。 現在還有一個更簡單的命名方案,以更密切地反映我們的上游策略

  • OCaml 4.12.0+domains 是將為 OCaml 5.0 提交的僅限網域的並行處理
  • OCaml 4.12.0+domains+effects 是具有網域並行處理和基於效果的並行處理的版本。

您可以在 multicore-opam 儲存庫中找到這些的 opam 安裝說明。甚至還有一個 ocaml-lsp-server 可用,因此您最愛的 IDE 應該可以正常運作!

僅限網域的並行處理樹狀結構

本月的主要工作是整合和除錯「網域本機配置緩衝區 (DLAB)」,以及追蹤壓力測試和 opam 大量建置中的邊角案例失敗。詳情請參閱下一節中的 PR 長清單。

我們也正在清理歷史遺留問題,以減少與 OCaml 主幹的差異,以便為產生用於上游整合的 OCaml 5.0 PR 清除路徑。

並行處理和效果樹狀結構

關於 將效果處理常式改造到 OCaml 的 PLDI 2021 最終論文現在已在 arXiv 上提供。 論文中描述的程式碼可透過 4.12.0+domains+effects opam 開關使用。 請隨時向 @kayceesrk 和我提供任何意見。

我們也一直在研究多核心 IO 堆疊,並且剛開始將並行處理(透過效果)和並行性(透過網域)結合到 Linux io_uring、macOS 的 Grand Central Dispatch 和 Windows iocp 中。我們將在未來幾個月內報告更多關於這方面的訊息,但 Linux 上的早期基準測試數字很有希望。

CI 和基準測試

我們正持續擴展專案的不同 CI 設定的測試。關於 Sandmark 基準測試,我們正在新增 Irmin layers.ml 基準測試。還有一個端對端管線,使用 OCurrent current-bench 架構,為我們提供 PR 的基準測試結果,可以與先前的執行進行比較。

與往常一樣,我們從 Multicore OCaml 更新開始,然後是 Sandmark 基準測試專案的持續和已完成任務。最後,列出上游 OCaml 工作供您參考。

詳細更新

Multicore OCaml

進行中

DLAB

  • ocaml-multicore/ocaml-multicore#484 執行緒配置緩衝區

    此 PR 提供執行緒本機配置緩衝區或 網域本機配置緩衝區的實作。程式碼審查和變更測試正在進行中。

  • ocaml-multicore/ocaml-multicore#508 網域本機配置緩衝區

    這是對 執行緒配置緩衝區 PR 的擴充,其中包含初始化、全域次要堆積大小的延遲調整大小以及變基到 4.12 分支。

測試

  • ocaml-multicore/ocaml-multicore#522 使用 -O0 而不是 -O2 建置執行階段會導致測試套件失敗

    當使用 -O0 而不是 -O2 時,執行階段測試會失敗,這需要進一步調查。

  • ocaml-multicore/ocaml-multicore#526 weak-ephe-final issue468 在次要堆積非常小時可能會失敗

    次要堆積很小 (4096 字) 的 weak-ephe-final 測試會導致 issue468 測試失敗。

  • ocaml-multicore/ocaml-multicore#528 擴展 CI 執行

    擴展我們現有 CI 執行範圍和執行的需求清單,以進行全面測試。

雜項

  • ocaml-multicore/ocaml-multicore#514 更新 ocaml-variants.opam 中的說明

    ocaml-variants.opamconfigure.ac 檔案已更新為使用 Multicore OCaml 儲存庫,並使用本機開關而非全域開關。目前的 Multicore OCaml 位於 4.12 分支。

  • ocaml-multicore/ocaml-multicore#523 Systhreads Mutex 引發 Sys_error

    Systhreads Mutex 的錯誤檢查應與主幹一致,而不是由 Multicore OCaml 報告的嚴重錯誤。

  • ocaml-multicore/ocaml-multicore#527 將 eventlog 連接到 CTF

    必須將 eventlog 實作連接到通用追蹤格式。記錄輸出應與 parallel_minor_gc 輸出一致,並且需要執行壓力測試。

已完成

上游

  • ocaml-multicore/ocaml-multicore#490 從位元組碼移除 getmutablefield

    透過移除 getmutablefield 操作碼,已更新位元組碼編譯器和解譯器。

  • ocaml-multicore/ocaml-multicore#496 將 caml_initialize_field 取代為 caml_initialize

    用於取代 caml_initialize_field 的修補程式,先前與並行次要收集器一起使用,現在已取代為 caml_initialize

  • ocaml-multicore/ocaml-multicore#503 重新啟用 lib-obj 和 asmcomp/is_static 測試

    已重新啟用 lib-objasmcomp/is_static 測試,並且已更新 Multicore NO_NAKED_POINTERS 的設定。

  • ocaml-multicore/ocaml-multicore#506Op_val 取代為 Field

    Op_val (x)[i] 的使用已取代為 Field (x, i),以與主幹實作保持一致。

  • ocaml-multicore/ocaml-multicore#507 變更解譯器以使用裸程式碼指標

    已進行變更,以在解譯器堆疊中識別裸指標,以便與主幹相容。

  • ocaml-multicore/ocaml-multicore#516 移除 caml_root API

    caml_root 變數已變更為 value 類型,並作為世代全域根管理。因此,現在已移除 caml_root API。

DLAB

  • ocaml-multicore/ocaml-multicore#511 在主要堆積上配置唯一根權杖,而不是次要堆積

    現在在主要堆積配置上完成唯一根權杖配置,不會引發任何例外狀況,並且在網域建立失敗時會順利結束。

  • ocaml-multicore/ocaml-multicore#513 在偵錯執行階段的收集結束時清除次要堆積

    偵錯值會寫入次要堆積的每個元素,以用於偵錯失敗。我們現在在次要收集結束時清除次要堆積。

  • ocaml-multicore/ocaml-multicore#519 使時間測試更強大

    已更新 timing.ml 測試,以便在使用 DLAB 進行測試時更具彈性。

增強功能

  • ocaml-multicore/ocaml-multicore#477 將 TLS 區域移至專用記憶體空間

    為了支援網域本機配置緩衝區,我們現在將 TLS 區域移至其自己的記憶體配置空間,從而變更我們配置個別網域 TLS 的方式。

  • ocaml-multicore/ocaml-multicore#480 從 STW API 移除 leave_when_done 和相關項目

    透過清除 stw_request.leave_when_done 實作,從 caml_try_run_on_all_domains*stw_request 中移除屏障。

  • ocaml-multicore/ocaml-multicore#481 請勿在 gc-roots 測試中在網域之間共用陣列

    每個網域都應有自己的陣列,並且平行全域根測試已更新此變更。

  • ocaml-multicore/ocaml-multicore#494 unix_fork 上更嚴格的不變量

    我們現在會強制執行更嚴格的不變量,例如對於 unix_fork,沒有其他網域可以與網域 0 (caml_domain_alone) 一起執行。

  • ocaml-multicore/ocaml-multicore#515 將 memprof 存根新增到建置和 stdlib

    已將所需的 memprof 函式新增到建置 stdlib,以及建置執行階段的 memprof。

延遲更新

修正

  • ocaml-multicore/ocaml-multicore#487 systhreads: 在執行緒啟動時將 gc_regs_buckets 及其相關變數設定為 NULL

    systhreads/st_stubs.c 中,指標已被初始化為 NULL,這解決了執行 Layers 基準測試時觀察到的分段錯誤

  • ocaml-multicore/ocaml-multicore#491 在 fork 後重新初始化子鎖

    執行階段需要在 fork 後正常運作,此修補程式通過正確重置 domain 鎖來解決此問題。

  • ocaml-multicore/ocaml-multicore#495 修正最終化器孤立問題

    針對如何合併孤立最終化器工作的最終化表格進行了修復。PR 中也新增了一個測試案例。

  • ocaml-multicore/ocaml-multicore#499 修正回溯展開

    在回呼中展開堆疊的過程沒有正確執行,並且 caml_next_frame_descriptior 中的差異現已解決。

  • ocaml-multicore/ocaml-multicore#509 修正位元組碼中 Continuation_already_taken 例外設定錯誤的問題

    此修補程式修正了位元組碼執行中未按需設定的 Continuation_already_taken 例外。

  • ocaml-multicore/ocaml-multicore#510 更新 principality-and-gadts.ml 中的測試案例

    principality-and-gadts.ml 中的變更,以記錄與 ocaml/ocaml 中 4.12 分支相比的正確輸出。

生態系統

  • ocaml-multicore/multicore-opam#46 與多核心相容的 ocaml-migrate-parsetree.2.1.0

    ocaml-migrate-parsetree 套件使用 effect 語法,現在可以使用 Multicore OCaml 的 parallel_minor_gc 分支進行建置。

  • ocaml-multicore/multicore-opam#47 與多核心相容的 ppxlib

    effect 語法已新增至 ppxlib,現在也與 Multicore OCaml 相容。

  • ocaml-multicore/multicore-opam#49 4.12 多核心設定

    已新增設定以安裝 4.12.0+domains+effects4.12.0+domains OCaml 變體。

  • ocaml-multicore/ocaml-multicore#473 在 musl 上建置需要動態連結的 execinfo

    已將 opam 檔案新增至儲存庫,以允許在基於 musl 的環境中安裝 Multicore OCaml。

  • ocaml-multicore/ocaml-multicore#482 檢查 -lexecinfo 以便在 musl/alpine 上建置

    已新增一個 configure 腳本,用於檢查 -lexecinfo,以便支援在 musl/alpine 上建置 Multicore OCaml。

文件

雜項

基準測試

進行中

  • ocaml-bench/sandmark#204 將 layers.ml 作為基準測試新增至 Sandmark

    包含 Irmin layers.ml 基準測試以及對其所有依賴要求的更新。

  • ocaml-bench/sandmark#209 使用規則目標 kronecker.txt 並從 macro_bench 中移除

    已完成對 graph500seq kernel1.ml 實作的回顧,並提出了程式碼變更。macro_bench 標籤將保留用於 graph500 基準測試。

  • ocaml-bench/sandmark#212 增加某些基準測試中的主要堆積配置

    正在進行的工作,以新增更多涉及主要堆積配置的長時間基準測試。某些參數已更新為較高的值,並且也新增了更多迴圈。

  • 我們現在已將 Sandmark 2.0 的建置與 current-bench 整合以進行 CI。基準測試執行的結果現在已如以下所示推送至 PostgreSQL 資料庫

    docker=# select * from benchmarks;
    -[ RECORD 1 ]--+-------------------------------------------------------
    run_at         | 2021-03-26 11:21:20.64
    repo_id        | local/local
    commit         | 55c6fb6416548737b715d6d8fde6c0f690526e42
    branch         | 2.0.0-alpha+001
    pull_number    | 
    benchmark_name | 
    test_name      | coq.BasicSyntax.v
    metrics        | {"maxrss_kB": 678096, "time_secs": 101.99969387054443}
    duration       | 00:37:52.776357
    -[ RECORD 2 ]--+-------------------------------------------------------
    run_at         | 2021-03-26 11:21:20.64
    repo_id        | local/local
    commit         | 55c6fb6416548737b715d6d8fde6c0f690526e42
    branch         | 2.0.0-alpha+001
    pull_number    | 
    benchmark_name | 
    test_name      | thread_ring_lwt_mvar.20_000
    metrics        | {"maxrss_kB": 8096, "time_secs": 2.6146790981292725}
    duration       | 00:37:52.776357
    ...
    

    我們將繼續努力為 current-bench 新增更多工作流程和功能,以支援 Sandmark 建置。

已完成

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

    已在 Makefile 中新增 benchclean 目標,以在保留 _opam 資料夾的同時移除產生的基準測試及其結果。

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

    Sandmark 現在支援使用 ITER 變數,您可以執行基準測試的多個迭代。例如,使用 ITER=2,會建立兩個摘要 .bench 檔案,其中包含基準測試結果,如下所示

    $ TAG='"run_in_ci"' make run_config_filtered.json
    $ ITER=2 RUN_CONFIG_JSON=run_config_filtered.json make ocaml-versions/4.10.0+multicore.bench 
    
    $ ls _results/
    4.10.0+multicore_1.orun.summary.bench  4.10.0+multicore_2.orun.summary.bench
    
  • ocaml-bench/sandmark#208 修正 simple-tests/capi 的參數

    run_config.json 中的一個小修正,以正確地將引數傳遞至 simple-tests/capi 基準測試執行。您可以使用以下命令驗證相同內容

    $ TAG='"lt_1s"' make run_config_filtered.json
    $ RUN_CONFIG_JSON=run_config_filtered.json make ocaml-versions/4.10.0+multicore.bench
    
  • ocaml-bench/sandmark#210 不在全域根並行基準測試中共用陣列

    一個修補程式,用於不在並行基準測試的全域根實作中共用陣列。

  • ocaml-bench/sandmark#213 解決 4.12.1+trunk、4.12.0+domains 和 4.12.0+domains+effects 的依賴

    dependencies/packages 現在已更新,以便能夠使用 Sandmark 建置 4.12.1+trunk4.12.0+domains4.12.0+domains+effects 分支。

OCaml

進行中

  • ocaml/ocaml#10039 安全點

    正在對安全點 PR 進行審查。特別感謝 Damien Doligez 對於安全點和插入輪詢的程式碼建議。仍有許多最佳化工作需要完成。

非常感謝社群中所有 OCaml 使用者、開發人員和貢獻者對專案的支持。注意安全!

縮寫

  • API:應用程式開發介面
  • CI:持續整合
  • CTF:通用追蹤格式
  • DLAB:Domain 本機配置緩衝區
  • GC:垃圾收集器
  • OPAM:OCaml 套件管理員
  • PR:提取請求
  • STW:停止所有執行緒
  • TLS:執行緒本機儲存