OCaml 多核 - 2020 年 9 月

多核 OCaml:2020 年 9 月

歡迎來到 2020 年 9 月的多核 OCaml 報告!此更新與先前的每月更新由 @shakthimaan、@kayceesrk 和 @avsm 編譯而成。

本月的大新聞是systhreads 相容性支援 PR 已合併,這意味著 Dune(和其他使用 Thread 模組的使用者)可以開箱即用進行編譯。您現在可以使用新的 opam compiler 外掛程式(請參閱公告)方便地編譯多核 OCaml 分支。

opam update
opam compiler create "ocaml-multicore/ocaml-multicore:no-effect-syntax"
eval $(opam env)

這會選擇省略實驗性 effect 語法的多核 OCaml 分支,因此可與現有的 ppx 生態系統搭配使用。看到生態系統套件開箱即用,並能順利運作,真是太有趣了。執行緒相容性支援仍然有一些粗糙的地方(主要在 C 相容性層,例如使用 GC 註冊外部 C 執行緒),但這些將在未來幾週內解決。我們希望聽到您在使用此功能時在 opam 世界中遇到的任何建置失敗:請在 https://github.com/ocaml-multicore/ocaml-multicore/issues 上回報這些問題。

9 月也完成了一些針對多核 OCaml GC 和 Sandmark 基準測試專案的效能改進。

  • 我們現在已將 Graph500 基準測試中的Kronecker 實作納入 Sandmark。
  • 一個n-queen 基準測試新增作業正在進行中。
  • 基準測試執行現在會提供 OCaml 符號的計數作為程式碼大小指標。
  • 使用多核 OCaml 建置 Tezos 的工作,以及與 Sandmark 基準測試套件的整合也已開始。

我們也開始努力移植 Lwt 以透過 Lwt_preemptive 利用平行處理。程式碼範例和測試執行已執行,Sudha 撰寫了一篇關於她早期結果的介紹性部落格文章。請注意,此工作不會變更 Lwt 的核心行為(一個協同式 futures 框架,在 bind 呼叫之間沒有內容切換),但允許透過明確呼叫背景搶佔式執行緒來實現平行處理。

在向上游 OCaml 推進的工作上,4.12 版本將在 10 月比平常更早凍結,因此我們完成了最後一個垃圾收集器顏色變更的提交,並致力於將有關可靠安全點的工作納入 OCaml 4.13。4.12 已包含許多執行階段變更,因此當 4.12 的候選版本發佈時,我們將發出測試呼籲。

接下來是 PR 的詳細資訊。與先前的更新一樣,多核 OCaml 更新會先列出,然後是 Sandmark 基準測試專案的增強功能。最後會提及正在進行和已完成的上游 OCaml 更新,以供您參考。

多核 OCaml

進行中

  • ocaml-multicore/domainslib#17 使用 Mutex 和條件變數實作通道

    已更新 lib/chan.ml 原始碼,以使用 Mutex 和條件變數實作通道,並為其新增了 LU_decomposition_multicore.exe 測試。

  • ocaml-multicore/ocaml-multicore#381 使用 pthreads 重新實作 systhreads

    此 PR 正在積極審閱在多核 OCaml 中使用 pthreads 的情況。它引入了域執行內容 (DEC),允許在域上執行多個執行緒。

  • ocaml-multicore/ocaml-multicore#394 變更輪詢放置位置

    輪詢放置在函數的開頭和迴圈的後緣,而不是使用 Feely 的演算法。這是一項進行中的工作。

  • ocaml-multicore/ocaml-multicore#401 不要以遞迴方式處理中斷

    引入了域局部變數以防止以遞迴方式處理中斷。

  • ocaml-multicore/ocaml-multicore#402 將 handle_gc_interrupt 分割為處理遠端和輪詢部分

    引入了 caml_poll_gc_work,其中包含先前在 caml_handle_gc_interrupt 中完成的 GC 工作資訊。這有助於 stw_handler 呼叫輪詢,而不是處理服務中斷,因為這可能會導致不必要的遞迴。

  • ocaml-multicore/ocaml-multicore#403 使用無效果語法在多核 4.10.0 上建置 Tezos 時發生分段錯誤

    這項工作正在持續調查為什麼 Tezos 中的套件 tezos-embedded-protocol-packer 在使用多核 OCaml 建置時會導致分段錯誤。

已完成

Domainslib

  • ocaml-multicore/domainslib#19 使用互斥條件變數為通道提供更細微的訊號

    使用針對 Mutex 和條件變數的細微鎖定有助於提高較大核心的效能,而不是針對所有訊號使用單一互斥鎖。

多核 OPAM

  • ocaml-multicore/multicore-opam#31 為多核 OCaml 修補 dune.2.7.1

    感謝 Chaitanya Koparkar,已新增 dune.2.7.1 的 opam 檔案以及 bootstrap.ml 的修補程式,使其可在多核 OCaml 中運作。

  • ocaml-multicore/multicore-opam#32 將 ocamlfind-secondary 依存性新增至 dune

    安裝 dune 需要將 ocamlfind-secondary 作為 dune.2.7.1 的依存性,並且已將其新增至 OPAM 檔案。

多核 OCaml

  • ocaml-multicore/ocaml-multicore#395 將所有旋轉和 usleep 中的旋轉移至 SPIN_WAIT

    此 PR 為所有忙碌的旋轉等待迴圈提供 SPIN_WAIT 巨集,並在忙碌等待時使用 caml_plat_spin_wait。這可確保在程式碼的不同位置使用相同的旋轉策略。

  • ocaml-multicore/ocaml-multicore#397 放寬備份執行緒訊號

    已修改從變異器執行緒在離開封鎖區段時向備份執行緒發出的訊號。這減少了重新進入 OCaml 時可能發生的作業系統排程。

  • ocaml-multicore/ocaml-multicore#400 為備份執行緒解多工 eventlog

    備份執行緒中的事件與主要執行緒發出相同的程序 ID,此 PR 將它們分開。

PR 400|690x246

在上述圖例中,當主要執行緒正在等待條件變數時,備份執行緒會處於作用中狀態。

基準測試

進行中

  • ocaml-bench/sandmark#159 實作更好的方式來描述 tasklet cpulist

    當我們獲得多個域時,我們需要一種更簡潔的方式來取得基準測試執行的核心 taskset 清單。我們應該能夠指定要使用的超執行緒核心、NUMA 區域,以及用於平行基準測試的特定核心。

  • ocaml-bench/sandmark#173 將 nqueens 基準測試新增至 multicore-numerical

    經典的 n queens 基準測試草稿版本已新增至 Sandmark 以供審閱。這包括單核和多核實作。

已完成

  • ocaml-bench/ocaml_bench_scripts#11 新增對 configure 選項和 OCAMLRUNPARAM 的支援

    已更新 ocaml_bench_scripts,以支援在 Sandmark 中建置和執行基準測試時傳遞 configure 選項和 OCAMLRUNPARAM。

  • ocaml-bench/sandmark#122 測量程式碼大小

    從基準測試產生的輸出 .bench JSON 檔案現在包含 CAML 符號數量的程式碼大小指標。下面顯示了範例基準測試輸出

    {"name":"knucleotide.", ... ,"codesize":276859.0, ...}
    

    下面列出了一些基準測試的程式碼大小計數

    | Benchmark  |   Count   |
    |------------|-----------|
    | alt-ergo   | 2_822_040 |
    | coqc       | 5_869_305 |
    | cpdf       | 1_131_376 |
    | nbody.exe  |   276_710 |
    | stress.exe |    84_061 |
    | fft.exe    |    38_914 |
    
  • ocaml-bench/sandmark#170 Graph500 SEQ

    具有 Kronecker 圖形產生器的 Graph500 基準測試現在已新增至 Sandmark。產生器會為圖形建構、廣度優先搜尋和單源最短路徑建置三個核心。

  • ocaml-bench/sandmark#172 移除 trunk 的 BaseStdio 或 run 依存性

    已更新 Sandmark 中的 orun 原始碼,以移除對 BaseStdio 的依存性。它們已替換為來自 StdlibListStringStr 的函數。

  • ocaml-bench/sandmark#174 清理我們對 chrt 使用 sudo 的情況

    已從 Makefile 中移除 sudo 的使用,以執行平行基準測試,以避免建立需要 root 權限才能存取的輸出檔案和目錄。使用 RUN_BENCH_TARGET=run_orunchrt 會使用 chrt -r 1 執行基準測試。使用者可以使用以下方式授予 chrt 二進位檔案的權限

    $ sudo setcap cap_sys_nice=ep /usr/bin/chrt
    

OCaml

進行中

  • ocaml/ocaml#9876 不要在處理器暫存器中快取 young_limit

    此 PR 移除了在 ARM64、PowerPC 和 RISC-V 連接埠中快取暫存器中的 young_limit,因為它在多核 OCaml 中輪詢訊號和網域間通訊時會產生問題。

已完成

  • ocaml/ocaml#9756 垃圾收集器顏色變更

    已移除垃圾收集器中的灰色配色方案,以利與多核 OCaml 收集器合併。下面說明了在 Sandmark 套件中確實溢出標記堆疊的現有基準測試,並且此變更對其影響不大。

PR-9756|690x495

一如既往,我們要感謝社群中所有 OCaml 開發者和使用者,感謝他們持續支持並為這個專案做出貢獻。祝您一切順利!

縮寫

  • ARM:進階精簡指令集機器 (Advanced RISC Machine)
  • BFS:廣度優先搜尋 (Breadth First Search)
  • DEC:域執行環境 (Domain Execution Context)
  • GC:垃圾回收器 (Garbage Collector)
  • JSON:JavaScript 物件表示法 (JavaScript Object Notation)
  • NUMA:非均勻記憶體存取 (Non-Uniform Memory Access)
  • OPAM:OCaml 套件管理器 (OCaml Package Manager)
  • OS:作業系統 (Operating System)
  • PR:提取請求 (Pull Request)
  • RISC-V:精簡指令集計算 - V (Reduced Instruction Set Computing - V)
  • SSSP:單源最短路徑 (Single Source Shortest Path)