OCaml 多核 - 2020 年 6 月

歡迎來到 2020 年 6 月的 Multicore OCaml 報告!如同先前的更新,非常感謝 @shakthimaan 和 @kayceesrk 整理 2020 年 6 月的更新。這是一次增量更新;新讀者可能會發現先瀏覽先前的文章會有所幫助。

本月,上游 OCaml 專案為了準備多核整合,出現了大量的活動,@xavierleroy 和核心團隊推動了許多計畫,為 OCaml 專案準備完整的多核功能集。為了反映這一點,從下個月開始,我們將在 ocaml-multicore wiki 上設立一個狀態頁面,顯示我們多核分支和上游 OCaml 專案本身的目前狀態。

為什麼不是從這個月開始?嗯,有好消息也有壞消息。上個月,我觀察到我們距離大多數 opam 生態系統與多核分支協同運作只差一個 PR。好消息是,我們仍然只差一個 PR 就能使其運作,但它是另一個 PR :-) Threads 函式庫的改造帶來了一些設計上的複雜性,因此,我們沒有採用「創可貼」式的修復方式,而是整合了一個全面的解決方案,可以與系統執行緒、網域和(最終)纖程一起運作。這項工作花了一些時間才完成,我希望能在幾週內向大家更新一個對 opam 友好的 OCaml 4.10.0+multicore。

除此之外,還有許多其他的改進被納入多核分支:mingw Windows 支援呼叫堆疊改進修復 Unix 模組等等。完整列表在本次更新的詳細報告中。

Sandmark 基準測試

本月的一個重要里程碑是升級到最新的 dune.2.6.0,以便為 Sandmark 基準測試專案建置 Multicore OCaml 4.10.0。已經新增了許多新的 OPAM 套件,並且現有的套件已經升級到其最新版本。Multicore OCaml 程式碼庫已經出現持續的效能改進和增強,可以從報告中提到的各種 PR 中觀察到。

我們要感謝

  • @xavierleroy 為使原始 OCaml 為 Multicore OCaml 做好準備,而從事許多多核先決條件 PR 的工作。
  • @camlspotter 審查並接受了 camlimages 的變更,並發布了 Sandmark 所需的 camlimages.5.0.3。
  • @dinosaure 更新了 Sandmark 的解壓縮測試基準,使其能夠使用 dune.2.6.0 為 Multicore OCaml 4.10.0 建置和執行。

正在撰寫關於 Multicore OCaml 平行程式設計的章節,其中包含任務池、通道部分、使用程式碼範例進行分析等主題。我們將向社群提供該文件的早期草稿版本,以徵求您寶貴的回饋意見。

論文

我們的「將平行處理改造到 OCaml」論文已在 ICFP 2020 上正式獲准發表,該會議將在 2020 年 8 月 23 日至 28 日之間以虛擬方式舉行。該論文的預印本已於早先發布,並將在幾天內更新為 ICFP 的最終版本。當然,即使論文發表後,也請隨時發送評論和問題。

令人興奮的是,另一篇關於 Cosmo: A Concurrent Separation Logic for Multicore OCaml 的多核相關論文也將在同一個會議上發表。

Multicore OCaml 的更新首先列在我們的報告中,接著是 Sandmark 基準測試專案的改進。最後,提到了對上游 OCaml 所做的變更,其中包括正在進行和已完成的任務,供您參考。

Multicore OCaml

正在進行

  • ocaml-multicore/ocaml-multicore#339 網域本機儲存的提案

    在 Multicore OCaml 中實作網域本機儲存的 RFC 提案。請審查該想法並分享您的回饋!

  • ocaml-multicore/ocaml-multicore#342 使用網域實作執行緒函式庫

    重新設定 @jhwoodyatt 網域執行緒函式庫實作的努力。

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

    探索使用 pthreads 實作系統執行緒的可能性,同時仍保持與現有解決方案的相容性。

  • ocaml/dune#3548 Dune 無法擷取次要編譯器

    ocaml-secondary-compiler 無法使用 dune.2.6.0 安裝。這是必要的,因為 Multicore OCaml 無法在沒有系統執行緒支援的情況下建置最新的 dune。

已完成

  • ocaml-multicore/multicore-opam#22 將 dune 更新至 2.6.0

    Multicore OPAM 儲存庫中的 dune 版本現在已更新為使用最新的 2.6.0。

  • ocaml-multicore/ocaml-multicore#338 引入 Lazy.try_force 和 Lazy.try_force_val

    實作 Lazy.try_forceLazy.try_force_val 函式以實作並行惰性抽象。

  • ocaml-multicore/ocaml-multicore#340 修復 concurrent_minor_gc 中的 Atomic.exchange

    一個修補程式,透過 Atomic.get 引入 Atomic.exchange,為 memory.c 中的 caml_atomic_exchange 提供適當的讀取屏障,以實現正確的交換語義。

  • ocaml-multicore/ocaml-multicore#343 修復 extcall noalloc DWARF

    extcall noalloc 發出的 DWARF 資訊有損壞的回溯,此 PR 修復了這個問題。

  • ocaml-multicore/ocaml-multicore#345 絕對例外堆疊

    例外堆疊的表示方式從相對尋址變更為絕對尋址,結果令人鼓舞。變更後的 Sandmark 序列基準測試結果如下圖所示

Absolute addressing improvements |690x218

基準測試

正在進行

  • ocaml-bench/sandmark#8 在 Sandmark 中執行編譯器變體的能力

    在建置編譯器變體(例如 flambda)時指定組態選項的功能對於開發和測試非常有用。目前正在開發此功能。

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

    我們正持續為 Multicore OCaml 向 Sandmark 新增更多基準測試,並研究將 Coq 基準測試新增到我們的程式庫中!

  • ocaml-bench/sandmark#124 使用者可組態的 paramwrapper 新增至 Makefile

    可以透過指定用於平行基準測試執行的 --cpu-list 來傳遞 PARAMWRAPPER 環境變數作為引數。

  • ocaml-bench/sandmark#131 更新解壓縮基準測試

    感謝 @dinosaure 更新解壓縮基準測試,以便使用 dune.2.6.0 為 Multicore OCaml 4.10.0 執行它們。

  • ocaml-bench/sandmark#132 更新依賴套件以使用 dune.2.6.0 和 Multicore OCaml 4.10.0

    Sandmark 一直使用 dune.1.11.4 執行,我們需要移至最新的 dune.2.6.0,以便使用 Multicore OCaml 4.10.0 及更高版本,如 將 dune 升級到 > 2.0 中所述。此 PR 更新了 30 多個依賴套件,並成功建置了序列和平行基準測試!

已完成

  • camlspotter/camlimages#1 為 camlimages 使用 dune-configurator 而不是 configurator

    在接受 camlimages.opam 的變更以使用 dune.2.6.0 建置後,@camlspotter 發布了新的 camlimages.5.0.3 版本。

  • ocaml-bench/sandmark#115 任務 API 連接埠:LU 分解、Floyd Warshall、Mandelbrot、Nbody

    已合併為列出的基準測試使用 Domainslib.Task API 的變更。

  • ocaml-bench/sandmark#121 提及 run_all_parallel.sh 指令碼的 sudo 存取權

    README.md 檔案已使用必要的 sudo 組態步驟更新,以執行夜間建置的 run_all_parallel.sh 指令碼。

  • ocaml-bench/sandmark#125 新增立體基準測試

    German PFSSzymanski 的互斥演算法 立體基準測試已包含在 Sandmark 中。

  • ocaml-bench/sandmark#126 更新 ocaml-versions README 以反映 4.10.0+multicore

    README 現在已更新,以反映最新的 4.10.0 Multicore OCaml 編譯器及其變體。

  • ocaml-bench/sandmark#129 在 CI 中新增執行平行基準測試的目標

    CI 使用的 .drone.yml 檔案已更新,以執行序列和並行基準測試。

  • ocaml-bench/sandmark#130 在 multicore-numerical 中新增遺失的相依性

    domainslib 函式庫已新增到 multicore-numerical 基準測試的 dune 檔案中。

OCaml

進行中

已完成

  • ocaml/ocaml#9619 函式閉包的自我描述表示法

    此 PR 提供了一種方法,可以記錄每個函式閉包進入點的環境位置。

  • ocaml/ocaml#9649 新閉包表示法的封送處理

    output_value 封送器已更新為使用新的閉包表示法。input_value 解封送器不需要任何變更。

  • ocaml/ocaml#9655 引入類型 Obj.raw_data 和函式 Obj.raw_field、Obj.set_raw_field 來操作堆外指標

    此 PR 引入類型 Obj.bits 和函式 Obj.field_bitsObj.set_field_bits 來讀取和寫入區塊欄位的位元表示法,以支援無裸指標操作。

  • ocaml/ocaml#9678 使用雜湊表重新實作 Obj.reachable_word 以偵測共享

    caml_obj_reachable_words 現在使用雜湊表,而不是修改區塊標頭的標記位元來偵測共享。這是與 Multicore OCaml 相容的必要條件。

  • ocaml/ocaml#9680 裸指標和位元組碼直譯器

    已更新位元組碼直譯器的實作,以支援 Multicore OCaml 所需的無裸指標模式操作。

  • ocaml/ocaml#9682 在沒有頁表的情況下,在原生程式碼中進行訊號處理

    此修補程式使用程式碼片段表,而不是頁表查找,讓訊號處理常式知道訊號是否來自 ocamlopt 產生的程式碼。

  • ocaml/ocaml#9683 globroots.c:調整為無裸指標模式

    此修補程式在無裸指標模式下,將堆外指標視為主要堆指標,以進行全域根管理。

  • ocaml/ocaml#9689 新閉包表示法的泛型雜湊

    雜湊函式已更新為使用 ocaml/ocaml#9619 中最新的閉包表示法,用於無裸指標模式。

  • ocaml/ocaml#9698 頁表即將結束

    當以無裸指標模式建置時,此 PR 消除了執行階段系統中頁表的某些使用。

感謝社群中所有 OCaml 開發人員和使用者對專案的持續支援和貢獻。請保重!

縮寫

  • API:應用程式介面
  • CFI:呼叫框架資訊
  • CI:持續整合
  • DWARF:使用屬性記錄格式進行偵錯
  • GC:垃圾收集器
  • ICFP:國際函數程式設計會議
  • OPAM:OCaml 套件管理員
  • PR:提取請求
  • RFC:徵求意見稿