OCaml Multicore - 2021 年 2 月
歡迎來到 2021 年 2 月的 Multicore OCaml 月報。此更新連同先前的更新,由我、@kayceesrk 和 @shakthimaan 彙編。二月份,我們將重點放在多核心樹的穩定性上,因為解鎖生態系統的建置和執行大量 CI 已經為我們提供了大量問題來幫助追蹤邊角案例問題。將下一批變更上游至 OCaml 4.13 的工作也取得了重大進展。
總體而言,我們仍然按計畫在下一個 OCaml 版本 (4.13.0) 之後推出具有平行處理能力的多核心執行時期 (版本 5.0),儘管確切的發布細節尚未在核心 OCaml 開發人員會議中批准。令人興奮的是,我們在並行處理方面也取得了重大進展,以下詳細介紹了關於該主題的新論文。
4.12.0:發布了與多核心相關的變更
OCaml 4.12.0 已發布,其中包含大量內部變更,這些變更是多核心 OCaml 所需的,例如 GC 顏色處理、移除頁面表以及對堆積表示法的修改。
從開發人員的角度來看,現在有一個新的組態選項稱為 nnpchecker
,它可以動態檢測執行時期,以幫助您找出繫結中未裝箱 C 指標的使用。這在先前針對 4.10 的描述中已提及,但它現在也已在opam 儲存庫 CI 中啟用。從現在開始,如果您的 opam 套件測試套件中偵測到裸指標,新的 opam 套件提交將會發出失敗測試的警示。請嘗試在您的 opam 套件中加入測試,以獲得此功能的優點!
下方的螢幕擷取畫面顯示它在 LLVM 套件 (目前已知有裸指標) 上的運作情況。
4.13~dev:上游進度
我們 4.13 版本的 PR 佇列主要集中在整合「安全點」,這提供了更強的保證,即使應用程式邏輯沒有定期配置,OCaml 變異器也會定期輪詢垃圾收集器。這項工作在多核心 OCaml 樹中幾乎在三年前就開始了,現在正在上游 OCaml 中進行程式碼審查 -- 請在該 PR 上加入任何效能或程式碼大小測試。
除此之外,團隊還在開發各種其他先決條件,例如多核心安全 Lazy、實作記憶體模型 (在本PLDI 18 論文中說明) 以及調整 ephemeron API 以使其更適合並行處理。目前尚不清楚其中哪些會納入 4.13,哪些會直接放入 5.0 樹中。
OCaml 5.0 之後:並行處理和纖程
我們很高興分享一篇關於「將效果處理程式回溯到 OCaml 上」的新預印本,該預印本繼續我們的「回溯」系列,以涵蓋在 OCaml 程式碼中表達交錯所需的並行處理元素。這已被有條件接受 (以虛擬方式) 在 PLDI 2021 上發表,我們目前正在製作可供攝影機拍攝的版本。任何意見回饋都非常歡迎寄給 @kayceesrk 或我。摘要如下
效果處理程式已作為一種使用使用者定義的效果進行模組化程式設計的機制而受到關注。效果處理程式允許以可組合的方式表達非本機控制流程機制,例如產生器、async/await、輕量型執行緒和協程。我們提出了一個設計,並評估了 OCaml (一種工業級的多範例程式設計語言) 的功能完善且有效率的效果處理程式實作。我們的實作力求維持現有 OCaml 程式碼的向後相容性和效能設定檔。將效果處理程式回溯到 OCaml 上具有挑戰性,因為 OCaml 目前除了例外之外,沒有任何非本機控制流程機制。我們針對 OCaml 的效果處理程式實作:(i) 對未使用效果處理程式的程式碼施加可忽略的額外負荷;(ii) 與檢視堆疊的程式分析工具保持相容;以及 (iii) 對使用效果處理程式的新程式碼而言是有效率的。
我們非常重視確保 OCaml 原生程式碼實作的現有良好屬性 (尤其是偵錯和回溯) 在我們提出的並行處理擴充功能中得到維護。與 OCaml 的任何重大變更一樣,在未來的核心 OCaml 開發人員會議批准之前,本論文的內容應被視為研究級。但是,請務必嘗試使用纖程和效果,並給我們意見回饋!我們目前正在開發高效能的直接樣式 IO 堆疊,該堆疊具有非常有前景的早期效能數字。
如果您想進一步了解效果,@kayceesrk 在 Lambda Days 2021 上發表了關於 有效程式設計
的演講 (簡報投影片)。
使用 Sandmark 進行效能測量
@shakthimaan 在社群演講中介紹了 Sandmark 2.0 的即將推出的功能及其未來藍圖。投影片組已發佈在網路上,如果您對效能基準測試有任何意見回饋或疑問,請將其傳送給他。Sandmark 2.0 -alpha 分支的各種目標和建置標籤的完整回歸測試已完成,我們將繼續開發 2.0 版本的更多新功能。現在來說明詳細資訊!首先列出多核心 OCaml 更新,然後列出 Sandmark 基準測試專案的各種進行中和已完成的工作。最後,列出正在進行的上游 OCaml 工作,供您參考。
多核心 OCaml
進行中
生態系統
-
ocaml-multicore/multicore-opam#46 與多核心相容的 ocaml-migrate-parsetree.2.1.0
一個修補程式,用於使
ocaml-migrate-parsetree
來源使用效果語法。現在它可以使用 Multicore OCamlparallel_minor_gc
正常建置。 -
ocaml-multicore/multicore-opam#47 與多核心相容的 ppxlib
效果語法現在已新增至
ppxlib
,並且現在與 Multicore OCaml 相容。
改進
-
ocaml-multicore/ocaml-multicore#474 修正重新標記以確保平行網域的安全性
一個草案提案,用於修正重新標記另一個網域擁有的集區的問題。該解決方案旨在將重新標記集區移至擁有該集區的網域。
-
ocaml-multicore/ocaml-multicore#477 將 TLS 區域移至專用記憶體空間
PR 會變更我們配置個別網域 TLS 的方式。目前的實作對於網域本機配置緩衝區來說並非最佳,因此修補程式會將 TLS 區域移至其配置的專用記憶體空間。
-
ocaml-multicore/ocaml-multicore#480 從 STW API 移除 leave_when_done 和相關項目
透過從
caml_try_run_on_all_domains*
和stw_request
移除障礙,清理stw_request.leave_when_done
。
雜項
-
ocaml-multicore/ocaml-multicore#466 修正當重新標記另一個網域中的集區,且該網域進行配置時發生的損毀
針對
parallel/domain_parallel_spawn_burn
的位元組碼測試失敗進行的調查。建議每個網域都有一個重新標記佇列,以及一個全域重新標記佇列,以保留任何孤立集區的工作或無法排入網域佇列的工作。 -
ocaml-multicore/ocaml-multicore#468 Finaliser 導致多個網域出現區段錯誤
已提交一個測試案例,其中 Finaliser 會導致多個網域出現區段錯誤。
-
ocaml-multicore/ocaml-multicore#471 Unix.fork 因「unlock: Operation not permitted」而失敗
fork 實作中的非封鎖區段在解鎖時因「operation not permitted」訊息而導致嚴重錯誤。這已由 opam-ci 回報。
-
ocaml-multicore/ocaml-multicore#473 建置 musl 需要動態連結 execinfo
Haz 嘗試使用 musl 建置 Multicore OCaml。它因為需要與外部 libexecinfo 連結而失敗。
-
ocaml-multicore/ocaml-multicore#475 請勿重複使用位元組碼指令的作業碼
Hugo Heuzard 提出一個問題,即在 Multicore OCaml 中擴充現有作業碼並附加指令,而不是重複使用作業碼並移動它們。
-
ocaml-multicore/ocaml-multicore#479 Continuation_already_taken 當機頂層
回報了 x86-64 上 4.10.0+multicore 的迭代器到產生器練習中已取得接續的區段錯誤當機。
已完成
全域根目錄
-
ocaml-multicore/ocaml-multicore#472 主要 GC:從一個網域掃描全域根目錄
作為並行處理全域根目錄掃描的第一步,提供了一個修補程式,該修補程式在主要循環中僅從一個網域掃描全域根目錄。修補程式的平行基準測試結果如下圖所示
-
ocaml-multicore/ocaml-multicore#476 全域根目錄平行測試
現在新增了
globroots_parallel_single.ml
和globroots_parallel_multiple.ml
測試,以檢查全域根目錄與網域生命週期的互動。
CI
-
ocaml-multicore/ocaml-multicore#478 移除 .travis.yml
我們現在已移除 Travis 作為 CI 的使用,因為我們現在使用 GitHub Actions。
-
我們現在引入了標籤,您可以在為 Multicore OCaml 提交錯誤報告時使用。目前的標籤列表位於 https://github.com/ocaml-multicore/ocaml-multicore/labels。
雜項
-
ocaml-multicore/ocaml-multicore#464 將 Field_imm 替換為 Field
Field_imm 已被並行次要收集器中的 Field 取代。
-
ocaml-multicore/ocaml-multicore#470 Systhreads:Current_thread->next 值應儲存
修復了備份執行緒重複使用
Current_thread
插槽時導致的區段錯誤。
基準測試
進行中
修復
-
ocaml-bench/sandmark#208 修復 simple-tests/capi 的參數
現在可以正確傳遞
simple-tests/capi
基準測試的參數,並且它們可以正常建置和執行。可以使用以下命令驗證相同的內容$ TAG='"lt_1s"' make run_config_filtered.json $ RUN_CONFIG_JSON=run_config_filtered.json make ocaml-versions/4.10.0+multicore.bench
-
ocaml-bench/sandmark#209 使用規則目標 kronecker.txt 並從 macro_bench 中移除
graph500seq 基準測試已更新為使用目標規則,以在執行
kernel2
和kernel3
之前建置 kronecker.txt。這些基準測試已從macro_bench
標籤中移除。
雜項
-
ocaml-bench/sandmark#205 [RFC] 依基準測試分類和分組
一份草案提案,將 Sandmark 基準測試根據其用途和應用程式分類為一系列演算法。建議的清單包括
library
、formal
、numerical
、graph
等。 -
ocaml/opam-repository#18203 [新版本] orun (0.0.1)
在 opam.ocaml.org 中發佈
orun
套件的工作正在進行中。也已建立新的conf-libdw
套件來處理相依性。 -
Sandmark 2.0 -alpha 分支現在包含目前 Sandmark master 分支中的所有基準測試目標,並且我們一直在針對各種標籤執行回歸建置。所需的相依性套件也已新增至各自的目標基準測試。
已完成
-
ocaml/opam-repository#18176 [新版本] rungen (0.0.1)
rungen
套件已從 Sandmark 2.0 中移除,現在可在 opam.ocaml.org 中取得。
OCaml
進行中
-
安全點 PR 實作了序言省略演算法,現在已重新基於 trunk。省略最佳化和葉函數最佳化的效果減少了輪詢次數,如下所示
感謝社群中所有 OCaml 使用者和開發人員對專案的貢獻和支持!
縮寫
- API:應用程式介面
- CI:持續整合
- DLAB:網域本地配置緩衝區
- GC:垃圾收集器
- OPAM:OCaml 套件管理器
- PLDI:程式語言設計與實作
- PR:提取請求
- RFC:徵求意見稿
- STW:停止世界
- TLS:執行緒本地儲存