OCaml 多核心 - 2020 年 8 月

歡迎來到 2020 年 8 月的多核心 OCaml 報告(由於 8 月的進度放緩,晚了幾週)。此更新與先前的更新由 @shakthimaan、@kayceesrk 和我共同編寫。

有一些關於多核心 OCaml 的演講現在可以在線上免費觀看

多核心 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 測試了使用 CoreAsync 的程式碼大小度量實作,以及程式碼審查變更。

如上所述的貢獻,像是使用我們的基準測試套件來調整您的專案,總是受到熱烈歡迎。與先前的更新一樣,我們先從多核心 OCaml 的更新開始,然後是 Sandmark 基準測試專案的增強功能和錯誤修復。最後提到上游 OCaml 的正在進行和已完成的任務,供您參考。

多核心 OCaml

進行中

  • ocaml-multicore/ocaml-multicore#381 使用 pthreads 重新實作系統執行緒

    此 PR 在 domain API 的新增、與備份執行緒的互動變更以及錯誤修復方面取得了巨大的進展。我們現在可以使用此 PR 為多核心 OCaml 構建 dune.2.6.1utop,並且它已準備好進行審查!

  • 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-Domainslib-16-Illustration|465x500

  • 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 的進度,如事件日誌中觀察到的那樣。 OCaml-Multicore-PR-379-Illustration-Before|539x500

    有了此修補程式,我們可以觀察到 domain 二和四中的主要工作在下圖中取得了進展: OCaml-Multicore-PR-379-Illustration-After|655x500

  • 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-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-configm4 新增到 Ubuntu 相依性中。

已完成

基準測試

  • ocaml-bench/sandmark#107 新增 Coq 基準測試

    來自程式的形式化推理fraplib 程式庫已經 dunified 並包含在 Sandmark 中,用於 Coq 基準測試。

  • ocaml-bench/sandmark#151 進化演算法平行基準測試

    現在將進化演算法平行基準測試新增到 Sandmark 中。

  • ocaml-bench/sandmark#152 LU 分解:平行隨機數初始化

    LU 分解基準測試的隨機數初始化現在具有使用 Domain.DLSRandom.State 的平行處理。

  • ocaml-bench/sandmark#153 新增計算密集型的 Coq 基準測試

    BasicSyntaxAbstractInterpretation Coq 檔案執行大量的小 GC 和分配,並且已作為基準測試新增到 Sandmark 中。

  • ocaml-bench/sandmark#155 進化演算法的循序版本

    演算法的循序版本用於與各自的平行實作進行比較。現在已將 Evolutionary Algorithm 的循序實作包含在 Sandmark 中。

  • ocaml-bench/sandmark#157 Minilight 多核心:移植到 Task API 和用於隨機狀態的 DLS

    Minilight 基準測試已移植為使用 Task API 以及用於隨機狀態的 Domain Local Storage。加速效果顯示在下圖中

    PR 157 Image

  • 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 指定 prefixlibdir。初始討論內容請參閱 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:提取請求