OCaml 多核心 - 2020 年 3 月

多核心 OCaml:2020 年 3 月

歡迎來到多核心 OCaml 團隊 2020 年 3 月的新聞更新!這次的更新與 @shakthimaan 和 @kayceesrk 一起整理,如同二月一月的更新一樣。

我們這個月的工作主要集中在改進多核心 OCaml 編譯器和執行時的效能,作為全面評估的一部分。我們繼續在 Sandmark 測試套件中添加額外的基準測試。事件日誌追蹤系統和上游 OCaml 中用於封送處理的雜湊表的使用正在進行中,並且還有更多的 PR 正在排隊等待 OCaml 4.11.0-dev。

對於嘗試該分支的使用者來說,最大的可觀察變化是,新的 GC(「並行次要 GC」)已合併,優先於先前的 GC(「並行次要 GC」)。我們稍後將提供更詳細的資訊,但要旨是並行次要 GC 不再需要讀取屏障或更改 C API。它在非常高的核心數下可能具有稍微差的可擴展性,但在我們的評估中,最多 24 個核心時大致相等。考慮到不必移植現有的 C FFI 使用所帶來的巨大可用性改進,我們已決定將並行次要 GC 作為我們第一個上游執行時修補程式的預設 GC。當我們將測試擴展到 64 核心以上的機器時,並行次要 GC 將在稍後階段進行。 多核心 opam remote 已更新以反映這些變更,供希望在家中嘗試的人使用。

我們現在正處於將更大的應用程式移植到多核心的階段。感謝

  • @UnixJunkie 協助我們在 https://github.com/ocaml-bench/sandmark/issues/99 中整合 Gram Matrix 基準測試
  • @jhw 在 https://github.com/ocaml-multicore/ocaml-multicore/pull/240 中為支援 Systhreads 做了大量工作。Systhreads 目前在多核心中被禁用,導致某些流行的套件無法編譯。
  • @antron 一直在為我們提供關於如何將 Lwt_preemptiveLwt_unix 模組移植到多核心的最佳方法的建議,為我們提供一個廣泛使用的 IO 堆疊來測試更多應用程式。

如果您對您認為可能提供有用基準測試的應用程式有其他建議,請與我或 @kayceesrk 聯絡。

接下來是詳細資訊!首先列出多核心 OCaml 的各種正在進行和已完成的任務,然後是 Sandmark 基準測試基礎架構的變更以及上游 OCaml 的持續 PR。

多核心 OCaml

正在進行

  • ocaml-multicore/ocaml-multicore#240 根據 Domain 和 Atomic 提出的執行緒實作

    已提出 Threads 函式庫的新實作(用於多核心 OCaml 中的新 DomainAtomic 模組)。這會建構 Dune 2.4.0,這反過來使其可用於建構其他套件。此 PR 已開放審閱。

  • ocaml-multicore/safepoints-cmm-mach 適用於 OCaml 的更佳安全點

    正在此分支中開發一種在 Cmm 層級插入安全點的較新實作。

已完成

以下 PR 已合併到多核心 OCaml 中

  • ocaml-multicore/ocaml-multicore#303 正確計算增量標記預算

    該修補程式正確測量增量標記預算值,並改進了 menhir.ocamly 基準測試的最大延遲。

  • ocaml-multicore/ocaml-multicore#307 將階段變更事件放入實際的階段變更程式碼中。該 PR 在適當的內容中包含 major_gc/phase_change 事件。

  • ocaml-multicore/ocaml-multicore#309 不要一次取走所有完整池。

    程式碼變更選擇其中一個 global_full_pools 以稍後嘗試掃描,而不是採用所有完整的池。

  • ocaml-multicore/ocaml-multicore#310 目前網域的統計資料比其他網域更新

    目前網域的統計資料 (minor_wordspromoted_wordsmajor_wordsminor_collections) 較新,並在正確的內容中使用。

  • ocaml-multicore/ocaml-multicore#315 caml_blit_fields 中的寫入應始終使用 caml_modify_field 來記錄 young_to_young 指標

    該 PR 強制始終使用 caml_modify_field() 來儲存 young_to_young 指標。

  • ocaml-multicore/ocaml-multicore#316 修正 Weak.blit 的錯誤。

    ephemeron 會分配為已標記,但是,索引鍵或資料可以取消標記。blit 作業會將弱參考從一個 ephemeron 複製到另一個 ephemeron,而不會標記它們。該修補程式會標記被 blit 的索引鍵,以便讓無法存取的索引鍵在另一個主要週期中保持活動。

  • ocaml-multicore/ocaml-multicore#317 針對長度為 0 的 blit 提早返回

    如果 byterun/weak.c 中的 blit 長度為零,則該 PR 強制執行 CAMLreturn() 呼叫。

  • ocaml-multicore/ocaml-multicore#320 移動 num_domains_running 遞減

    caml_domain_alone() 叫用需要用於共用堆疊關閉,因此 num_domains_running 遞減會移動為至少 shared_heap 無鎖定快速路徑的最後一個作業。

基準測試

Sandmark 效能基準測試套件已新增較新的基準測試,並且正在進行加強其功能的工作。

  • ocaml-bench/sandmark#88 新增 PingPong 多核心基準測試

    使用生產者和消費者佇列的 PingPong 基準測試現已包含在 Sandmark 中。

  • ocaml-bench/sandmark#98 新增 Irmin 讀/寫基準測試

    已將 Irmin 的基本讀/寫檔案效能基準測試新增到 Sandmark 中。您可以變更以下輸入參數:分支數、索引鍵數、讀取和寫入的百分比、迭代次數以及寫入作業數。

  • ocaml-bench/sandmark#100 新增 Gram Matrix 基準測試

    建立了一個請求 ocaml-bench/sandmark#99,要求納入 Gram Matrix 初始化數值基準測試。這對於機器學習應用程式很有用,現在可以在 Sandmark 效能基準測試套件中使用。多核心 (並行次要收集器)、Parmap 和 Parany 的加速 (循序時間/多執行緒時間) 與核心數量的關係非常顯著,並在圖表中說明

Gram matrix speedup benchmark

  • ocaml-bench/sandmark#103 在 Makefile 中新增 depend 目標

    Sandmark 現在在 Makefile 中包含一個定義的 depend 目標,以檢查 libgmp-devlibdw-dev 套件是否已安裝並在 Ubuntu 上可用。

  • ocaml-bench/sandmark#90 更多並行基準測試

    已建立一個問題以新增更多並行基準測試。我們將使用此問題來追蹤請求。請隨時新增您的基準測試願望清單!

OCaml

正在進行

  • ocaml/ocaml#9082 事件日誌追蹤系統

    configure 腳本現在已更新,以便可以在 Windows 上建構。除了此重大變更外,還針對建構和健全性檢查進行了許多次要提交。此 PR 目前正在審閱中。

  • ocaml/ocaml#9353 使用雜湊表重新實作 output_value 以偵測共用。

    在 @xavierleroy 的幫助下,使用雜湊表和位元向量重新實作了 ocaml/ocaml#9293「使用 addrmap 雜湊表進行封送處理」PR。這是使用並行垃圾收集器的多核心 OCaml 的先決條件。

一如既往,我們感謝社群中的 OCaml 開發人員和使用者對專案的程式碼審閱、支援和貢獻。來自 OCaml Labs,祝您在外平安健康!