OCaml 多核心 - 2020 年 8 月
歡迎來到 2020 年 8 月的多核心 OCaml 報告(由於 8 月的進度放緩,晚了幾週)。此更新與先前的更新由 @shakthimaan、@kayceesrk 和我共同編寫。
有一些關於多核心 OCaml 的演講現在可以在線上免費觀看
- 在 OCaml 工作坊中,@sadiq 發表了「如何使用多核心 OCaml 平行化你的程式碼」
- 在 ICFP 上,@kayceesrk 發表了「將平行處理改裝到 OCaml 上」,該演講也獲得了傑出論文獎。
- 在 ICFP 上,Glenn Mével 發表了「Cosmo:多核心 OCaml 的並行分離邏輯」。
- 在 WebAssembly 社群組會議上,@kayceesrk 發表了關於多核心 OCaml 中的效果處理器的演講。這與我們確保 OCaml 對 WebAssembly 有一個有效率的編譯策略的長期努力有關。
多核心 OCaml 專案在 2020 年 8 月進行了一些最佳化和效能改進
- 關於使用 pthreads 實作系統執行緒的 PR 仍在進行審查和改進。合併後,這開啟了使用多核心 OCaml 安裝 dune 和其他套件的可能性。
- 互斥鎖和條件變數的實作現在也正在審查中,用於
Domain
模組。 - 已經開始實作GC 安全點,以確保可以進行可靠、低延遲的垃圾收集。
我們特別感謝這些外部貢獻者
- Albin Coquereau 和 Guillaume Bury 對於在沙箱環境中使用 dune.2.6.0 和多核心 OCaml 4.10.0 構建 Alt-Ergo.2.3.2 的評論和建議。
- @Leonidas 測試了使用
Core
和Async
的程式碼大小度量實作,以及程式碼審查變更。
如上所述的貢獻,像是使用我們的基準測試套件來調整您的專案,總是受到熱烈歡迎。與先前的更新一樣,我們先從多核心 OCaml 的更新開始,然後是 Sandmark 基準測試專案的增強功能和錯誤修復。最後提到上游 OCaml 的正在進行和已完成的任務,供您參考。
多核心 OCaml
進行中
-
ocaml-multicore/ocaml-multicore#381 使用 pthreads 重新實作系統執行緒
此 PR 在 domain API 的新增、與備份執行緒的互動變更以及錯誤修復方面取得了巨大的進展。我們現在可以使用此 PR 為多核心 OCaml 構建
dune.2.6.1
和utop
,並且它已準備好進行審查! -
ocaml-multicore/ocaml-multicore#384 新增一個插入 nop 指令的原語
引入
nop
原語來識別指令序列的開始和結束,以幫助偵錯低階程式碼。 -
ocaml-multicore/ocaml-multicore#390 互斥鎖和條件變數的初始實作
一個草案提案,為多核心運行時新增對互斥變數和條件操作的支援。
已完成
最佳化
-
ocaml-multicore/domainslib#16 改進 parallel_for 實作
引入分而治之的方案來分配
parallel_for
中的工作,並將chunk_size
設為參數,以改進在超過 8-16 個核心時的擴展。下圖中的藍線顯示了在 Sandmark 中使用預設chunk_size
以及此 PR 的一些基準測試的改進: -
ocaml-multicore/multicore-opam 使用
-j%{jobs}%
進行多核心變體建置在多核心變體的建置步驟中使用
-j%{jobs}%
將加快 opam 的安裝速度。 -
ocaml-multicore/ocaml-multicore#374 在小垃圾收集時強制進行主垃圾收集片段
如果一個被封鎖的執行緒在透過
handle_interrupt
為小垃圾收集器提供服務時,可能無法推進主 GC,則小垃圾收集將需要排程主垃圾收集。 -
ocaml-multicore/ocaml-multicore#378 如果在分配時掃描到空閒池,則保留空閒池
一種最佳化,透過在
pool_sweep
函式中使用release_to_global_pool
旗標來改進暫停時間並減少鎖的數量,該函式會繼續保留空閒池。 -
ocaml-multicore/ocaml-multicore#379 可中斷的標記和清除
現在標記和清除工作可以中斷,以便即使有一個 domain 在執行大型任務,domain 也可以進入停止世界的小垃圾收集。例如,對於具有四個 domain 的二元樹基準測試,觀察到 domain 三中的主要工作(粉紅色)會阻礙其他 domain 的進度,如事件日誌中觀察到的那樣。
有了此修補程式,我們可以觀察到 domain 二和四中的主要工作在下圖中取得了進展:
-
ocaml-multicore/ocaml-multicore#380 使對
caml_domain_dls_get
的 DLS 呼叫為@@noalloc
caml_dls_get
被標記為@@noalloc
,以減少 C 呼叫開銷。 -
ocaml-multicore/ocaml-multicore#382 最佳化
caml_continuation_use_function
一些最佳化,透過使用
caml_domain_alone
和在DEBUG
模式下使用caml_gc_log
,使產生器範例的效能提高了 25%。 -
ocaml-multicore/ocaml-multicore#389 使用備份執行緒時避免持有 domain_lock
透過在沒有為
BT_IN_BLOCKING_SECTION
持有domain_lock
的情況下更改備份執行緒邏輯,減少了主要 OCaml 執行緒的等待時間。
雜項
-
ocaml-multicore/ocaml-multicore#391 將
Word_val
用於具有Patomic_load
的指標一個錯誤修復,可以正確處理載入指標的
Patomic_load
。 -
ocaml-multicore/ocaml-multicore#392 在葉函式測試中包含 Ipoll
現在將
Ipoll
操作作為外部呼叫新增到asmcomp/amd64/emit.mlp
中。
基準測試
進行中
-
ocaml-bench/sandmark#122 程式碼大小的測量
基準測試的程式碼大小是
flambda
分支所需的一種測量。已建立一個PR,該 PR 現在會發出基準測試結果輸出中 CAML 符號的計數,如下所示{"name":"knucleotide.", ... ,"codesize":276859.0, ...}
-
ocaml-bench/sandmark#169 在 Makefile 中新增 .json 和 pkg-config、m4 的 check_url
已在 Makefile 中定義
check_url
目標,以確保ocaml-versions/*.json
檔案具有 URL 參數。該修補程式還將pkg-config
和m4
新增到 Ubuntu 相依性中。
已完成
基準測試
-
ocaml-bench/sandmark#107 新增 Coq 基準測試
來自程式的形式化推理的
fraplib
程式庫已經 dunified 並包含在 Sandmark 中,用於 Coq 基準測試。 -
ocaml-bench/sandmark#151 進化演算法平行基準測試
現在將進化演算法平行基準測試新增到 Sandmark 中。
-
ocaml-bench/sandmark#152 LU 分解:平行隨機數初始化
LU 分解基準測試的隨機數初始化現在具有使用
Domain.DLS
和Random.State
的平行處理。 -
ocaml-bench/sandmark#153 新增計算密集型的 Coq 基準測試
BasicSyntax
和AbstractInterpretation
Coq 檔案執行大量的小 GC 和分配,並且已作為基準測試新增到 Sandmark 中。 -
ocaml-bench/sandmark#155 進化演算法的循序版本
演算法的循序版本用於與各自的平行實作進行比較。現在已將
Evolutionary Algorithm
的循序實作包含在 Sandmark 中。 -
ocaml-bench/sandmark#157 Minilight 多核心:移植到 Task API 和用於隨機狀態的 DLS
Minilight 基準測試已移植為使用 Task API 以及用於隨機狀態的 Domain Local Storage。加速效果顯示在下圖中
-
ocaml-bench/sandmark#164 對 multicore-numerical/game_of_life 的調整
生命遊戲數值基準測試的
board_size
現在可以配置,並且可以作為引數提供。
錯誤修復
-
ocaml-bench/sandmark#156 修復 Nbody 多核心的計算
對
Nbody
實作中物體相互作用的計算進行了細微的修復,並使用本機 ref 變數來減少寫入和快取流量。 -
ocaml-bench/sandmark#158 修復 Jupyter 筆記本 Grammatrix 的金鑰錯誤
notebooks/parallel/parallel.ipynb
中的Key Error
問題已解決,方法是在multicore_parallel_run_config.json
檔案中將數值傳遞給 params。
雜項
-
ocaml-bench/sandmark#154 還原 PARAMWRAPPER 變更
還原 Makefile 中並行基準測試執行的
PARAMWRAPPER
設定,因為循序執行不需要此設定。 -
ocaml-bench/sandmark#160 為 alt-ergo 沙箱建置指定前綴 (prefix) 和 libdir
alt-ergo
函式庫和剖析器需要在沙箱環境中建置時,使用configure
指定prefix
和libdir
。初始討論內容請參閱 OCamlPro/alt-ergo#351。 -
ocaml-bench/sandmark#162 避免安裝 Multicore 執行中未使用的套件
Makefile 中的
PACKAGES
變數已簡化,僅包含建置 Sandmark 所需的相依性套件。 -
ocaml-bench/sandmark#163 更新至 domainslib 0.2.2 並使用預設的 chunk_size
domainslib
相依性套件已更新為使用 0.2.2 發佈的版本,而各種基準測試的chunk_size
預設使用num_tasks/num_domains
。
OCaml
進行中
-
ocaml/ocaml#9756 垃圾收集器顏色變更
此 PR 用於 Multicore OCaml 主要收集器,方法是移除垃圾收集器 (GC) 配色方案中對灰色 (gray) 的需求。
已完成
-
ocaml/ocaml#9722 再次基於 EINTR 的訊號
此修補程式提供新的實作方式,以解決鎖定、訊號處理和錯誤檢查等一系列問題。
感謝社群中所有 OCaml 開發人員和使用者對專案的支持和貢獻。祝您平安!
縮寫
- API:應用程式介面
- DLS:網域本機儲存
- GC:垃圾收集器
- OPAM:OCaml 套件管理器
- LU:下三角-上三角 (分解)
- PR:提取請求