OCaml 多核心 - 2020 年 4 月

歡迎來到多核心 OCaml 團隊在 2020 年 4 月的更新,我們的團隊遍布英國、印度、法國和瑞士!雖然我們大多數人都處於封鎖狀態,但我們仍持續向前邁進。如同先前的更新,感謝 @shakthimaan 和 @kayceesrk 協助彙整所有資訊。

預印本:將平行化改造至 OCaml

我們已發布一篇名為 「將平行化改造至 OCaml」 的論文預印本,我們將非常感謝您的回饋。這篇論文闡述了 OCaml 多核心擴展的問題空間,並介紹了並行垃圾收集器 (GC) 的設計選擇、實作和評估。

請注意,這並非最終論文,因為它目前正在同行審查中,因此現在提供的任何回饋仍然可以納入。請使用 pdf 論文 中的電子郵件聯絡資訊聯絡 @kayceesrk 和我,以便我們可以彙總(並感謝!)任何此類意見。

重新基於新版本的進度

多核心 OCaml 從 4.06.1 重新基於新版本的進度已獲得動能。我們已成功將並行次要 GC 全部重新基於 4.09 OCaml 樹狀結構。當我們在接下來的幾週內獲得最近分支的 4.11 時,我們將發布更新的 opam 套件。

由於中間衝突和引導啟動的數量,重新基於像這樣的複雜功能是一個「緩慢而穩定的」過程,因此我們不會為每個中間版本發布 opam 套件,而是 4.11 樹狀結構將構成任何 PR 的新「穩定基礎」。

更高等級的 Domainslib API

上個月的更新 中,關於建構平行光線追蹤器的討論串促使 domainslib 函式庫在提供 async/await 樣式的任務支援方面取得一些有用的進展。請參閱下方的更新以了解更多詳細資訊。

還有一個關於如何對您自己的小型程式進行效能分析和最佳化的有趣討論,請參閱 ocaml-multicore/ocaml-multicore#324。在此時使用具有不同排程屬性的平行演算法進行更多實驗將最有幫助。

4.11 中的上游功能

4.11 版本最近已分支,其中包含以下與多核心相關的變更

  • 並行安全編組實作(最初在 ocaml#9293 中,然後在 ocaml#9353 中再次實作)。這將對編組繁重的程式造成輕微的速度影響,因此,如果能在您的專案中使用 4.11 嘗試此操作,將會對上游 OCaml 問題追蹤器有所幫助。

  • 使用 CTF 格式的執行階段事件日誌追蹤系統即將在 4.11 中合併,請參閱 ocaml#9082。對於那些需要循序程式效能分析的人,這也會很有幫助,而且它是我們開發多核心 GC 所需基礎架構的一般化。如果有人有興趣協助在 CTF 支援的 OCaml 端進行駭客攻擊以建構用戶端,請與我或 @kayceesrk 聯繫。

除了上述重點之外,我們還不斷改進和新增 Sandmark 基準測試基礎架構。以下提供各種正在進行和已完成的任務以供您參考。

多核心 OCaml

進行中

  • ocaml-multicore/ocaml-multicore 將多核心 OCaml 升級到 trunk

    多核心 OCaml 從 4.06 到 4.10 的重新基於新版本正在進行中,而我們現在的版本為 4.09!我們預計在幾週內完成重新基於最新 trunk 版本的作業。

  • ocaml-multicore/eventlog-tools:OCaml 事件日誌工具

    已建立一個專案,為 OCaml 4.11.0 及更高版本提供一組用於執行階段追蹤的工具。其中包括事件日誌追蹤的簡單 OCaml 解碼器和內建 Chrome 轉換器工具。

  • ocaml-multicore/domainslib#5 將 parallel_scan 新增至 domainslib

    現在已將使用任務 API 和 prefix_sum 和 summed_area_table 的 parallel_scan 實作新增至多核心 OCaml (domainslib) 函式庫的網域層級平行程式設計函式庫。

已完成

以下 PR 已合併至多核心 OCaml 及其生態系統專案

  • ocaml-multicore/ocaml-multicore#328 具有 Flambda 的多核心編譯器

    對 Flambda 的支援已合併至多核心 OCaml 專案儲存庫。現在在 cmmgen 而非 lambda 執行轉換,以進行 clambda 轉換。

  • ocaml-multicore/ocaml-multicore#324 最佳化多核心程式

    以下文件提供關於如何為多核心程式進行效能偵錯以提升執行階段效能的詳細範例。

  • ocaml-multicore/ocaml-multicore#325 已新增 eventlog_to_latencies.py 指令碼

    現在 ocaml-multicore 儲存庫中已包含一個從事件日誌產生延遲報告的指令碼。

  • ocaml-multicore/domainslib#4 新增對 task_pools 的支援

    domainslib 函式庫現在支援使用 async/await 平行處理的工作竊取任務集區。建議您嘗試範例

基準測試

許多新的基準測試正在移植到 Sandmark 效能基準測試套件。

  • ocaml-bench/sandmark#104 已新增 python pip3 依賴性

    現在已在 Makefile 中定義 check_dependency 函式,以及 Ubuntu 的依賴性和 pip 套件清單。您現在可以在建構基準測試套件之前執行 make depend,以確保您擁有所需的軟體。python3-pip 套件已新增至依賴性清單。

  • ocaml-bench/sandmark#96 Sandmark 分析筆記本

    bench2.ocamllabs.io 上開發人員分支的設定、建構和執行指令碼已移轉至 winter.ocamllabs.io。

    正在開發一個用於分析循序基準測試結果的 UI 和自動指令碼驅動的筆記本。

  • ocaml-bench/sandmark#108 使用任務集區 API 函式庫移植合併排序和矩陣乘法

    這是使用 parallel_for 實作合併排序和 matrix_multiplication 的持續進行的 PR。

  • cubicle

    Cubicle 是一個模型檢查器和自動 SMT 定理證明器。目前,它正在移植到多核心 OCaml,而這項工作正在進行中。

  • raytracers

    Raytracers 是一個包含不同平行函數式程式設計語言的光線追蹤器實作的儲存庫。OCaml 實作現在已更新為使用新的 Domainslib.Task API。

    此外,還對多核心光線追蹤器的 flambda 參數進行了一些實驗,這些實驗可以將速度提升約 25%,但它尚未移除浮點數的裝箱。這些實驗將使用與 4.11 上 wip flambda2 樹狀結構的合併來重複進行,而該樹狀結構可移除浮點數裝箱。

OCaml

進行中

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

    基於審查和回饋,已將大量提交加入此 PR。其中包括 configure 指令碼的更新、處理警告和例外、新增 Windows 的建構支援、移除未使用的程式碼和程式碼樣式變更。此修補程式將被 cherry-pick 至 4.11 版本。

已完成

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

    此 PR 實作了多核心 OCaml 所需的雜湊表和位元向量,現已合併至 4.11。

一如既往,我們感謝社群中所有 OCaml 開發人員和用戶的持續支援,以及對專案的貢獻!

縮寫

  • API:應用程式程式設計介面
  • GC:垃圾收集器
  • PIP:Pip 安裝 Python
  • PR:提取請求
  • SMT:可滿足性模理論
  • UI:使用者介面