OCaml 多核心 - 2020 年 1 月
歡迎來到多核心 OCaml 團隊 2020 年 1 月的新聞更新!我們將每月總結我們的活動,以突顯今年我們正在進行的工作。這次更新由 @shakthimaan 和 @kayceesrk 慷慨地彙整。
我們最常被問到的問題是如何為整體的 多核心 工作做出貢獻。正如我 去年指出的,我們現在正逐步將我們的努力向上游推送到主要的 OCaml。因此,到目前為止,最佳的貢獻方式是測試主要 OCaml 儲存庫中未完成的修補程式是否存在回歸或改進的機會。
第二個好處是審查 多核心儲存庫中的 PR,但是由於它們是目前在壓力測試時被發現的,因此外部評估往往更困難。一個負面的貢獻是提出關於正交特性或新專案管理機制的討論——這需要時間和精力來回覆,並且團隊現在在上游開始後已經非常忙碌了。我們當然不希望阻止這些討論發生,但如果它們被導向一般的 OCaml bugtracker 或本論壇上的另一個主題,我們將不勝感激。
我們將首先回顧 OCaml 的 PR 和問題,然後介紹多核心儲存庫和我們的 Sandmark 基準測試基礎架構。一個為多核心 OCaml 實施和測試新平行演算法的新計畫也在進行中。
OCaml
進行中
-
ocaml/ocaml#9082 Eventlog 追蹤系統
Eventlog 是 OCaml 執行時環境的新追蹤設施提案,提供指標和計數器,並使用二進制追蹤格式(CTF)。合併此功能的下一步是在單獨的執行時變體中孵化追蹤功能,以便可以在應用程式連結時選擇。
-
ocaml/ocaml#8984 朝向新的閉包表示法
已經提出了一種新的閉包佈局,用於垃圾收集器遍歷,而無需使用頁面表。這對於多核心 OCaml 和效能改進非常有用。PR 正在等待其他開發人員的審查,然後可以針對主幹重新基礎,以進行測試和合併。
-
ocaml-multicore/ocaml-multicore#187 更好的安全點
正在積極審查定期輪詢域間中斷的修補程式,以提供更好的安全點。這是為了確保執行時系統通知任何待處理的中斷。
-
正在進行的工作是改進上游 OCaml 中的編組(runtime/extern.c),以避免使用 GC 標記位來表示已訪問性,並使用雜湊表(addrmap)實現。
已完成
以下 PR 已合併到上游 OCaml 主幹
-
ocaml/ocaml#8713 將 C 全域變數移動到專用結構
此 PR 將 C 全域變數移動到「域狀態」表。每個域都需要其自己的域本地變數表,因此這是多核心執行時環境所必需的。
這揭示了 C 頭檔案的許多 相容性問題,這些問題都透過下一個項目包含在最近的 OCaml 4.10.0+beta2 版本中。
-
ocaml/ocaml#9253 將
caml_*
移回主題標頭已移動 runtime/caml/compatibility.h 中的
caml_*
定義,以為 OCaml 4.04 到 4.10 版本提供相容的 API。此更改對於具有自己狀態的多核心域也很有用。
多核心 OCaml
以下 PR 已合併到多核心 OCaml 樹
-
ocaml-multicore/ocaml-multicore#275 修復多核心的惰性行為
實作了一個
caml_obj_forward_lazy()
函式來處理多核心 Ocaml 中的惰性值。 -
ocaml-multicore/ocaml-multicore#269 從全域
pools_to_rescan
移動到域本地的在壓力測試期間,當池在重新掃描時,而一個域正在分配到其中時,發生了分段錯誤。現在重新掃描已移動到域本地,因此這種情況不會再次發生。
-
ocaml-multicore/ocaml-multicore#268 修復了一些空間洩漏
在此 PR 中修復了在執行壓力測試時,在域產生和終止期間發生的空間洩漏。
-
ocaml-multicore/ocaml-multicore#272 修復非分配外部呼叫的 DWARF CFI
caml_classify_float_unboxed
的入口點導致回溯損壞,並提供了一個明確指定 OCaml 和 C 之間邊界的修復程式。 -
正在積極研究和努力實作多核心 OCaml 的同步次要垃圾收集器。已針對多核心主幹執行工作共享平行停止世界分支的基準測試,以及清除技術債務、處理競爭條件和修復分段錯誤。C-API 還原更改已在多核心 OCaml 的停止世界次要 GC 分支中進行測試和合併。
基準測試
-
已改進 Sandmark 效能基準測試基礎架構,以回填資料、追蹤分支和命名基準測試。
-
已將數值平行基準測試新增到多核心編譯器。
-
已在 Sandmark 中包含 Irmin 巨集基準測試。正在使用不同的讀取和寫入速率測試測量 Irmin 與 Git 作為其檔案系統的合併能力的測試。
-
目前也正在努力實作為 N-body、reverse-complement、k-nucleotide、binary-trees、fasta、fannkuch-redux、regex-redux、生命遊戲、光線追蹤、Barnes Hut、Count Graphs、SSSP 和 MultiMLton 基準測試的平行演算法,以在多核心 OCaml 上進行測試。
文件
- 正在撰寫關於多核心 OCaml 中平行程式設計的章節,並且將向社群提供早期草稿以供他們回饋意見。它基於域,並提供範例來實作陣列總和、Pi 近似值和定積分的梯形規則。
縮寫
- API:應用程式介面
- CTF:通用追蹤格式
- CFI:呼叫框架資訊
- DWARF:使用屬性記錄格式進行除錯
- GC:垃圾收集器
- PR:提取請求
- SSSP:單源最短路徑