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_force
和Lazy.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 序列基準測試結果如下圖所示
-
ocaml-multicore/ocaml-multicore#347 預設開啟 -Werror
新增一個
--enable-warn-error
選項到configure
,將 C 編譯器警告視為錯誤。 -
ocaml-multicore/ocaml-multicore#353 在 cpu_relax 中輪詢中斷,不使用鎖定
首先使用
Caml_check_gc_interrupt
輪詢中斷,不使用鎖定,然後繼續使用鎖定來處理中斷。 -
ocaml-multicore/ocaml-multicore#354 將 Caml_state_field 新增至 domain_state.h
domain_state.h 中的
Caml_state_field
巨集定義是讓 base-v0.14.0 能夠使用 dune.2.6.0 為 Multicore OCaml 4.10.0 建置所必需的。 -
ocaml-multicore/ocaml-multicore#355 再新增一個位置輪詢中斷,不使用鎖定
另一個首先使用
Caml_check_gc_interrupt
輪詢中斷的用法,不使用鎖定,與 ocaml-multicore/ocaml-multicore#353 類似。 -
ocaml-multicore/ocaml-multicore#356 網域的備份執行緒
引入
backup threads
以執行 GC 並在網域被核心封鎖時處理服務中斷。 -
ocaml-multicore/ocaml-multicore#358 修復 amd64.S 中錯誤的 CFI 資訊
為
caml_call_poll
和caml_allocN
新增runtime/amd64.S
中遺失的CFI_ADJUST
指令。 -
ocaml-multicore/ocaml-multicore#359 行內 caml_domain_alone
此 PR 使
caml_domain_alone
成為行內函式,以提高memory.c
中caml_atomic_cas_field
和其他原子操作的效能。 -
ocaml-multicore/ocaml-multicore#360 平行次要 GC 行內遮罩重做
到
parallel_minor_gc
分支的升級路徑的行內遮罩重做,為test_decompress
sandmark 基準測試帶來了 3-5% 的效能提升,並減少了所有其他基準測試的執行指令。 -
ocaml-multicore/ocaml-multicore#361 標記堆疊推送工作信用
此 PR 改進了 Multicore 標記工作記帳,使其與原始 OCaml 一致。
-
ocaml-multicore/ocaml-multicore#362 當我們沒有讀取屏障時,Iloadmut 不會破壞 rax 和 rdx
當使用
Iloadmut
時,清除rax
和rdx
暫存器以供 OCaml 程式碼使用的程式碼清理。
基準測試
正在進行
-
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 PFS
和Szymanski 的互斥演算法
立體基準測試已包含在 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#9541 為儀器化執行期新增手冊頁
儀器化執行期 已合併到 OCaml 4.11.0。已為其建立手冊,目前正在審核中。
已完成
-
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_bits
和Obj.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:徵求意見稿