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.04、4.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.opam
和configure.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-obj
和asmcomp/is_static
測試,並且已更新 Multicore NO_NAKED_POINTERS 的設定。 -
ocaml-multicore/ocaml-multicore#506 將
Op_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#501 安全點延遲修正
延遲實作需要知道安全點,並且我們需要區分遞迴強制延遲值與平行強制。這些修正是來自 ocaml-multicore#492 和 ocaml-multicore#493。
-
ocaml-multicore/ocaml-multicore#505 新增唯一網域權杖,以區分延遲強制失敗
已新增
caml_ml_domain_unique_token
以處理多個變更器競速存取的問題。這修正了使用 domain id (int) 來識別惰性區塊強制 domain 的問題。
修正
-
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+effects
和4.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-multicore/ocaml-multicore#502 更新 README 以介紹 4.12+domains+effects 和 4.12+domains
我們已使用目前活動分支的列表和歷史變體的名稱更新了 README 檔案。
-
ocaml-multicore/ocaml-multicore#520 澄清關於 RacyLazy 的註解
stdlib/lazy.mli
中的文件更新,闡明了何時引發RacyLazy
和Undefined
。
雜項
-
ocaml-multicore/ocaml-multicore#486 將 no-effects-syntax 同步到 parallel_minor_gc 分支
ocaml-multicore:no-effects-syntax
分支現在與parallel_minor_gc
分支的變更同步。 -
ocaml-multicore/ocaml-multicore#489 移除 promote_to
promote_to
函數在並行次要 GC 中使用。它不再需要,因此已被移除。 -
ocaml-multicore/ocaml-multicore#500 將 caml_modify_field 取代為 caml_modify
不再需要
caml_modify_field
,並已將其取代為caml_modify
。
基準測試
進行中
-
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+trunk
、4.12.0+domains
和4.12.0+domains+effects
分支。
OCaml
進行中
-
正在對安全點 PR 進行審查。特別感謝 Damien Doligez 對於安全點和插入輪詢的程式碼建議。仍有許多最佳化工作需要完成。
非常感謝社群中所有 OCaml 使用者、開發人員和貢獻者對專案的支持。注意安全!
縮寫
- API:應用程式開發介面
- CI:持續整合
- CTF:通用追蹤格式
- DLAB:Domain 本機配置緩衝區
- GC:垃圾收集器
- OPAM:OCaml 套件管理員
- PR:提取請求
- STW:停止所有執行緒
- TLS:執行緒本機儲存