OCaml 多核 - 2021 年 4 月
多核 OCaml:2021 年 4 月
歡迎來到 2021 年 4 月的 多核 OCaml 每月報告!我在印度的專案朋友們和同事們正在經歷可怕的第二波新冠疫情,但仍然持續努力從多核 OCaml 專案交付所有更新。這個月的更新以及先前的更新是由我本人、@kayceesrk 和 @shakthimaan 編寫的。
上游 OCaml 4.13 開發
GC 安全點仍然是多核 OCaml 4.13 版本開發的重點。雖然看起來很安靜,只有 一個 PR 正在進行中,您也可以查看 編譯器分支,其中一個勇敢的編譯器後端駭客團隊一直在改進設計。您也可以在第一份核心編譯器開發電子報中找到更多關於正在進行的上游工作的詳細資訊。引用 @xavierleroy 的話,「這是一個重要的變更,涉及新的靜態分析以及每個程式碼發射器中的一些調整,但事情看起來正在好轉。」。
多核 OCaml 樹
切換到使用 OCaml 4.12 的作業現已完成,所有開發 PR 現在都針對該版本進行。我們非常關注確定是否應將網域本地配置緩衝區 (ocaml-multicore#508) 納入初始 5.0 修補程式中。
什麼是 DLAB?在較大的核心數(高達 128 個)上測試多核時,我們觀察到從次要 GC(每個網域)中大量早期提升值。引入 DLAB 是為了鼓勵網域擁有更多保持堆積本地的值,而這應該可以提高我們的可擴展性。但是電腦就是電腦,我們注意到相反的效果 - 雖然啟用 DLAB 後早期提升的數量下降了,但整體效能不是持平就是甚至更低!我們仍在努力進行效能分析以找出根本原因 - 現代架構具有複雜的非均勻和階層式記憶體和快取拓撲,它們以意想不到的方式相互作用。請繼續關注下個月關於此決策的月報,或直接追蹤 ocaml-multicore#508!
多核生態系統
除此之外,多核 OCaml 專案的測試套件涵蓋範圍已顯著提高,並且我們持續為該專案新增越來越多的測試。請繼續貢獻您的並行基準測試。關於基準測試,我們已經能夠使用 current-bench 持續基準測試架構建構 Sandmark-2.0 基準測試,它提供 GitHub 前端和 PostgreSQL 資料庫來儲存結果。Dune 等其他專案也開始使用 current-bench,這很令人高興 - 一旦它更成熟一點,最好在核心 OCaml 專案上建立它。
我們也在推出一個多核專用的 CI,它可以針對 opam 套件進行差異測試(例如,協助隔離某個問題是否為多核專用失敗或上游 OCaml 上的一般編譯錯誤)。我們目前正在將其發布上線,這表示我們現在可以開始接受可能受益於多核的專案。如果您在 opam 上有任何專案可以從使用多核 OCaml 進行測試中受益,並且如果它可以在 4.12 上編譯,請與我們聯繫。我們最初會納入我們熟悉的程式碼庫,但我們需要多樣化的來源才能獲得良好的涵蓋範圍。我們唯一需要的是專案中可以與我們合作進行整合的回應聯絡人。如果我們對這個呼籲得到良好的回應,我們將開始報告專案狀態。
與往常一樣,我們從多核 OCaml 正在進行和已完成的任務開始。接下來是 Sandmark 基準測試專案更新和 current-bench 專案中相關的多核 OCaml 功能要求。最後,為了方便您參考,將提到上游 OCaml 的工作。
多核 OCaml
正在進行
測試
-
ocaml-multicore/domainslib#23 執行測試:從
run_test
目標中的手動命令移至dune runtest
目前,測試是使用 Makefile 中的明確 exec 命令執行的,目標是改為使用
dune runtest
命令。 -
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 執行
PR 實作了並行的 "callback" "gc-roots" "effects" "lib-threads" "lib-systhreads" 測試,使用
taskset -c 0
選項,並使用小型次要堆積。需要加強 CI 涵蓋範圍以新增更多變體和最佳化旗標。 -
ocaml-multicore/ocaml-multicore#542 新增 ephemeron 惰性測試
新增測試以涵蓋使用 GC 的 ephemeron、惰性值和網域生命週期。
-
ocaml-multicore/ocaml-multicore#545 ephetest6 在更多網域數量時失敗
當產生更多網域時,測試
ephetest6.ml
會失敗,有時也會發生死鎖。 -
ocaml-multicore/ocaml-multicore#547 調查 weaktest.ml 失敗
weaktest.ml
在測試套件中停用且失敗。這需要進一步調查。 -
ocaml-multicore/ocaml-multicore#549 zmq-lwt 測試失敗
一個 opam-ci 錯誤報告了
zmq-lwt
測試中的失敗。它會擲出 Zmq.ZMQ_exception,並顯示Context was terminated
錯誤訊息。
雜項
-
ocaml-multicore/ocaml-multicore#508 網域本地配置緩衝區
正在積極進行網域本地配置緩衝區實作的程式碼審查和相關變更。
-
ocaml-multicore/ocaml-multicore#514 更新 ocaml-variants.opam 中的指示
ocaml-variants.opam
和configure.ac
已更新,現在使用多核 OCaml 儲存庫。我們希望分支的+domains
和+domains+effects
有不同的版本字串。 -
ocaml-multicore/ocaml-multicore#527 將 eventlog 連接埠到 CTF
將
eventlog
實作連接埠到通用追蹤格式的程式碼審查正在進行中。已進行相關的程式碼變更,並且測試通過。 -
ocaml-multicore/ocaml-multicore#529 光纖大小控制和統計資料
設定光纖最大堆疊大小的功能要求,以及取得其記憶體統計資料。
已完成
上游
-
ocaml-multicore/ocaml-multicore#533 Systhreads 同步使用 pthread 函式
現在直接使用
pthread_*
函式,而不是caml_plat_*
函式,以與 OCaml 主幹一致。現在會擲出Sys_error
,而不是Fatal error
。 -
ocaml-multicore/ocaml-multicore#535 移除多核統計資料收集
現在已從多核 OCaml 中移除可設定的統計資料收集功能。這大大減少了與主幹的差異,並使其易於上游化。
-
ocaml-multicore/ocaml-multicore#536 移除 emit_block_header_for_closure
不再使用
emit_block_header_for_closure
,因此已從 asmcomp 來源中移除。 -
ocaml-multicore/ocaml-multicore#537 連接埠 @stedolan 「在 amd64 上微最佳化配置以節省暫存器」
在 amd64 上微最佳化配置以節省暫存器的上游作業現已連接埠到多核 OCaml。這大大減少了 amd64 的 emit.mlp 上的差異。
增強功能
-
ocaml-multicore/ocaml-multicore#531 使原生堆疊大小限制可設定(並修正 Gc.set)
現在可透過
Gc.set
介面設定原生光纖的堆疊大小限制。 -
ocaml-multicore/ocaml-multicore#534 將配置大小資訊移至框架描述符
現在使用框架描述符傳播配置大小資訊,以便 statmemprof 可以追蹤它們。
-
ocaml-multicore/ocaml-multicore#548 Mutex、Condition 和 Semaphore 的多核實作
Mutex
、Condition
和Semaphore
模組現在完全相容於 stdlib 功能,並且可以與Domain
搭配使用。
測試
-
ocaml-multicore/ocaml-multicore#532 新增在主要週期中使用最終化回呼的測試
更新
test_finaliser_gc.ml
程式碼,新增一個測試,其中最終化程式在暫存器中以根執行。 -
ocaml-multicore/ocaml-multicore#541 新增並行 tak 測試案例
現在已將並行測試案例新增至儲存庫,以壓力測試次要堆積,並在未呼叫
Gc
函式或網域終止的情況下有機地進入次要 GC。 -
ocaml-multicore/ocaml-multicore#543 weaklifetime 測試的並行版本
現在已將
weaklifetime.ml
測試的並行實作新增至測試套件,其中多個網域存取 Weak 結構。 -
ocaml-multicore/ocaml-multicore#546 domain_dls 和 ephetest_par 測試中網域生命週期的涵蓋範圍
改進
domain_dls.ml
和ephetest_par.ml
以便更好地涵蓋網域生命週期測試。
修正
-
ocaml-multicore/ocaml-multicore#530 修正 gc_regs bucket 的差一錯誤
現在已修正掃描堆疊以尋找先前
gc_regs
bucket 位置時的差一錯誤。 -
ocaml-multicore/ocaml-multicore#540 修正小型分配重試
當 GC 函數沒有返回足夠大小的小堆積時,
Alloc_small
巨集無法處理這種情況,此 PR 除了程式碼清理外,也修正了這個問題。
生態系統
-
ocaml-multicore/retro-httpaf-bench#3 將 cohttp-lwt-unix 加入基準測試
現在,
cohttp-lwt-unix
基準測試已加入retro-httpaf-bench
套件,同時更新了 Dockerfile。 -
ocaml-multicore/domainslib#22 將 CI 遷移到 4.12 Multicore 和 Github Actions
CI 已切換為使用 GitHub Actions 而非 Travis。CI 中使用的 Multicore OCaml 版本現在是 4.12+domains+effects。
-
ocaml-multicore/mulicore-opam#51 更新 4.12 變體的 merlin 和 ocaml-lsp 安裝說明
README.md 已更新,包含針對
4.12+domains
和4.12+domains+effects
分支使用 merlin 和 ocaml-lisp 的說明。 -
dwarf_validator DWARF 驗證工具
現在已在公開儲存庫中提供
eh_frame_check.py
中的 DWARF 驗證工具。它會單步執行二進位檔的執行過程,並使用 DWARF 指令展開堆疊。
雜項
-
ocaml-multicore/ocaml-multicore#523 Systhreads Mutex 引發 Sys_error
Systhreads Mutex 錯誤檢查現在與 OCaml 一致,如 在 threads 函式庫中使用「錯誤檢查」互斥鎖 中所述。
-
ocaml-multicore/ocaml-multicore#525 為已停用的訊號處理測試新增 issue URL
已更新
testsuite/disabled
,加入 issue URL ocaml-multicore#517 以便未來追蹤。 -
ocaml-multicore/ocaml-multicore#539 強制標籤傳遞無效參數給 Gc.finalise
當計算被強制執行時,會為標籤延遲值新增
Forcing_tag
。加入此項是為了讓Gc.finalise
在以Forcing_tag
區塊作為引數時,可以引發無效引數例外。
基準測試
進行中
Sandmark
- 現在,前端會顯示使用 current-bench 針對 CI 的 Sandmark 2.0 建置的圖表結果。圖表的原始輸出如下所示
Sandmark 2.0 基準測試正改為使用 current-bench
工具。您現在可以使用 multicore
標籤,在 current-bench
專案中為 Multicore OCaml 專案建立必要的 issue 和 PR。
-
ocaml-bench/sandmark#209 使用規則目標 kronecker.txt 並從 macro_bench 中移除
目前正在根據程式碼審查建議,重寫 graph500seq
kernel1.ml
實作。 -
ocaml-bench/sandmark#215 從 treiber_stack.ml 中移除 Gc.promote_to
我們正在更新 Sandmark 以使用 4.12+domains 和 4.12+domains+effects 執行,而此修補程式會從執行階段中移除 Gc.promote_to。
current-bench
-
ocurrent/current-bench#87 為舊的提交執行基準測試
我們希望能夠重新執行專案中較舊提交的基準測試,以進行分析和比較。
-
ocurrent/current-bench#103 可以在 UI 上設定從 0 開始的刻度
為了更好地進行比較,圖表中繪製的原始結果需要在 y 軸上從
[0, y_max+delta]
開始。針對此問題的 PR 已可用,修正後的輸出顯示在下圖中
-
ocurrent/current-bench#105 從
pipeline/lib/pipeline.ml
中提取 Docker 映像名稱Multicore OCaml 使用
ocaml/opam:ubuntu-20.10-ocaml-4.10
映像,而pipeline/lib/pipeline.ml
使用ocaml/opam
,因此為此使用環境變數將會很有用。 -
ocurrent/current-bench#106 將
--privileged
與 Docker run_args 用於 Multicore OCamlSandmark 環境對 Multicore OCaml 基準測試建置使用
bwrap
,因此我們需要使用--privileged
選項執行 Docker 容器。否則,建置會以Operation not permitted
錯誤結束。 -
ocurrent/current-bench#107 能夠只啟動並執行 PostgreSQL 和前端
對於 Multicore OCaml,我們會針對各種實驗使用不同的組態設定來配置硬體,而使用 ETL 工具僅將結果載入 PostgreSQL 資料庫並在前端中視覺化將會很有用。
-
ocurrent/current-bench#108 支援裸機的原生建置
為了避免使用 Docker 帶來的任何額外負擔,我們需要一種方法可以在裸機上執行 Multicore OCaml 基準測試。
已完成
文件
-
ocurrent/current-bench#75 修正生產環境部署;新增說明
現在已更新 HACKING.md,其中包含 current-bench 生產環境部署的文件。
-
ocurrent/current-bench#90 新增使用者可能會遇到的錯誤的一些解決方案
根據我們使用 Sandmark-2.0 對 current-bench 進行的測試,我們現在已更新 HACKING.md 檔案中的常見問題。
雜項
-
ocurrent/current-bench#96 移除前端的硬式編碼 URL
現在已從程式碼中提取前端 URL,以便我們可以在任何新的乾淨伺服器上部署 current-bench 執行個體。
-
ocaml-bench/sandmark#204 將 layers.ml 作為基準測試新增至 Sandmark
現在,Irmin layers.ml 基準測試已新增至 Sandmark 及其相依性。這會標記為
gt_100s
。
OCaml
進行中
-
此 PR 仍在進行中。感謝 Mark Shinwell 和 Damien Doligez 以及 Xavier Leroy 提供寶貴的意見和程式碼建議。
特別感謝社群中所有 OCaml 使用者和開發人員對專案的持續支持和貢獻。請注意安全!
縮寫
- AMD:超微半導體
- CI:持續整合
- CTF:通用追蹤格式
- DLAB:網域本地分配緩衝區
- DWARF:使用屬性記錄格式進行除錯
- ETL:擷取、轉換、載入
- GC:垃圾收集器
- OPAM:OCaml 套件管理器
- PR:提取請求
- UI:使用者介面
- URL:統一資源定位符
- ZMQ:ZeroMQ