OCaml 多核處理 - 2021 年 10 月
歡迎來到 2021 年 10 月的 Multicore OCaml 月度報告!先前的更新和本次更新由 @ctk21、@kayceesrk 和 @shakthimaan 共同編寫。
正如 @octachron 上個月宣布的那樣,核心團隊已承諾明年發佈 OCaml 5.0,其中包含多核處理和 effects 執行期。本月,我們的多核處理分支為了準備一個對上游友好的版本進行了大量活動,並進行了一些變更,使程式碼準備好用於 ocaml/ocaml
並減少差異的大小。回想一下,自OCaml 4.09 開始,我們就一直在穩定地引入與多核處理相關的變更,因此現在我們正在處理真正重要的部分。因此,OCaml 主線程式碼現在正持續合併到我們的 5.00 暫存分支中,並且測試覆蓋率也相應增加。
在標準函式庫中,我們繼續努力並預設改進執行緒安全性。由於效果處理程式也確認將進入 5.0,因此它們現在在 stdlib 中也有自己的模組。多核函式庫生態系統也隨著支援 OCaml 5.00 的變更而不斷發展,特別是,隨著更多使用案例的建立,Domainslib 已經進行了重大的更新和改進。Sandmark 效能工具與 current-bench 的整合也在積極進行中。
我們要感謝以下人員的貢獻
- Török Edwin 能夠重現
Task.pool
管理中的錯誤 Domainslib#43,並且也提供了 PR 來修復該問題。 - Sid Kshatriya 建立了 PR#83,讓
Eio
使用效果處理程式模組。
我們在 11 月的重點將繼續放在無情地建立 5.0 暫存分支,並且我們正準備與 OCaml 核心團隊進行一系列工作組(佔用整整一週的時間),以對整個修補程式集進行初步程式碼審查。請繼續關注 12 月初的進展!
與往常一樣,多核 OCaml 更新首先列出,其中包含上游工作、與 trunk 的合併、測試案例的更新、錯誤修復和文件改進。接下來是關於 Domainslib、Tezos
和 Eio
的生態系統更新。Sandmark 和 current-bench 任務最後列出供您參考。
多核 OCaml
進行中
上游
-
ocaml-multicore/ocaml-multicore#637
caml_page_table_lookup
在 ocaml-multicore 中不可用移除分頁表功能的殘餘 PR 現在應該可以解決此問題。
-
ocaml-multicore/ocaml-multicore#707 將
Domain.DLS
移至 ThreadLocal 模組,並使其在 systhreads 下運作Domain.DLS
實作將移至ThreadLocal
模組,並且應啟用使用執行緒局部儲存裝置來支援 systhreads。 -
ocaml-multicore/ocaml-multicore#719 優化
minor_gc
ephemeron 處理針對單一網域使用 trunk 演算法收集次要 GC 中的 ephemeron 的最佳化請求,並且在多網域環境中沒有 ephemeron 時,不要使用屏障。
-
ocaml-multicore/ocaml-multicore#727 更新版本號碼
需要更新
ocaml-variants.opam
檔案,以使用ocaml-variants.4.14.0+domains
。 -
ocaml-multicore/ocaml-multicore#728 為 5.00 分支更新
base-domains
套件base-domains
套件需要包含4.14.0+domains
,因為在本地 opam 切換上進行釘選會導致相依性解析失敗。
測試套件
-
ocaml-multicore/ocaml-multicore#656
Core
測試套件工作流程實作工作流程以每天執行一次 Core 的測試套件的草案 PR。
-
ocaml-multicore/ocaml-multicore#720 改善 ephemeron 與測試套件的相容性
PR 導入上游修復,使 ephemeron 可以使用中綴物件,並為
weaktest.ml
提供修復。 -
ocaml-multicore/ocaml-multicore#722 測試套件:重新啟用
signals_alloc
測試案例已啟用
signals_alloc
測試案例,並且 PR 也嘗試確保位元組碼直譯器輪詢訊號。 -
ocaml-multicore/ocaml-multicore#723 GitHub Action MacOS 執行器上的
beat.ml
失敗針對 CI 執行執行的測試套件中
beat.ml
測試失敗的調查。
雜項
-
ocaml-multicore/ocaml-multicore#669 為網域設定執行緒名稱
為多核處理 OCaml 實作執行緒命名的修補程式。它提供一個介面來不同地命名網域和執行緒。
-
ocaml-multicore/ocaml-multicore#698 將空閒集區返回給作業系統
pool_release
位於 shared_heap 中,並且不會將記憶體返回給作業系統。正在討論要保留多少記憶體,以及如何透過空間開銷設定來回收記憶體。 -
ocaml-multicore/ocaml-multicore#703 當沒有網域可以處理封鎖訊號時,
caml_enter_blocking_section
中可能存在迴圈當存在封鎖特定訊號集的網域時,可能會觸發一種情況,其中沒有其他網域可以處理訊號,並且可能是由於
caml_enter_blocking_section
中的迴圈所導致。 -
ocaml-multicore/ocaml-multicore#725 封鎖訊號無限迴圈修復
引入了單調的
recorded_signals_counter
來修復當沒有網域可以處理封鎖訊號時,caml_enter_blocking_section
中可能存在的迴圈。 -
ocaml-multicore/ocaml-multicore#726 並行修改物件的編組不安全
必須正確處理在不同網域上修改的物件編組,並且應該是安全的。不應導致區段錯誤或崩潰。
已完成
上游
建置
-
ocaml-multicore/ocaml-multicore#662 停用 5.0 上的變更檢查
已更新
.github/workflows/hygiene.yml
,以停用 5.00 上的檢查,以避免變更條目產生雜訊。 -
ocaml-multicore/ocaml-multicore#676 修復 5.00 安裝
已移除
caml/byte_domain_state.tbl
,並且已將README.adoc
重新命名為README.stock.adoc
,以便使用 OCaml 5.00 分支進行乾淨的建置。
變更
-
ocaml-multicore/ocaml-multicore#675 將
Bytes.unsafe_of_string / Bytes.unsafe_to_string
與 OCaml trunk 對齊bytecomp/bytegen.ml
中使用的Pbytes_to_string / Pbytes_of_string
現在與上游 OCaml 對齊。 -
ocaml-multicore/ocaml-multicore#677 移除偵錯 nop
上游不需要偵錯 nop 基本型別,因此已清除。PR 也修正了
emit.mlp
中的拼寫檢查空白,以符合該 trunk。 -
ocaml-multicore/ocaml-multicore#679 移除
caml_read_field
已移除
caml_read_field
的使用,因為現有的Field
提供所有必要的資訊,使其更接近上游 OCaml。 -
ocaml-multicore/ocaml-multicore#681 還原為 otherlibs/unix 的 ocaml/trunk 版本
已更新
unixsupport.c
、cstringv.c
和otherlibs/unix
中的檔案,使其與ocaml/ocaml
類似。 -
ocaml-multicore/ocaml-multicore#684 移除
lambda/matching
中的歷史for_handler
和Reperform_noloc
不需要將
lambda/matching.ml{,i}
中的for_handler
函式和Reperform_noloc
上傳,因此已將其移除。 -
ocaml-multicore/ocaml-multicore#685 從 interp.c 中移除
Init_field
已更新
interp.c
檔案,使其更接近ocaml/ocaml
。已修正拼寫檢查錯誤,並已清除Init_field
巨集。 -
ocaml-multicore/ocaml-multicore#704 從網域中移除 Sync.poll 和奈秒
已更新網域模組,使其僅包含上傳所需的變更。已移除
Domain.Sync.poll
和Domain.nanosecond
。已將Domain.Sync.cpu_relax
重新命名為Domain.cpu_relax
。已更新platform.h
,其中包含拼寫檢查的修復。 -
ocaml-multicore/ocaml-multicore#706 將
otherlibs/win32unix
還原為 ocaml/trunk已更新
otherlibs/win32unix/*
檔案,使其更接近ocaml/ocaml
。 -
ocaml-multicore/ocaml-multicore#708 移除可能存在的統計資料
現在已移除輸出統計資料的
caml_maybe_print_stats
基本型別,以及OCAMLRUNPARAM
的s
選項。 -
ocaml-multicore/ocaml-multicore#724 執行期:從
io.h
中移除未使用的欄位從
runtime/caml/io.h
中移除revealed
和old_revealed
,因為它們也已從ocaml/ocaml
中移除。
差異
-
ocaml-multicore/ocaml-multicore#663 移除
typing/
上與上游的差異中的雜訊PR 會壓縮
typing/
中與上游 OCaml 的不必要差異。 -
ocaml-multicore/ocaml-multicore#664 移除
parsing/
中與上游的不必要差異PR 移除了
parsing/
中與上游 OCaml 的不必要空白差異。 -
ocaml-multicore/ocaml-multicore#694 改善啟動程式碼差異的第一個步驟
PR 嘗試改善 trunk 和多核處理 OCaml 啟動程式碼中的差異。
-
ocaml-multicore/ocaml-multicore#695 改善 systhread 與 trunk 的差異
這個合併的 PR 改善了 systhread 與 trunk 的差異。
合併
-
ocaml-multicore/ocaml#2 將 trunk 更新為最新的上游 trunk
PR 嘗試協助輸出 OCaml 5.0 的差異。經過變更後,您可以成功執行
make && make tests
。結果摘要如下Summary: 2918 tests passed 40 tests skipped 0 tests failed 105 tests not started (parent test skipped or failed) 0 unexpected errors 3063 tests considered
-
ocaml-multicore/ocaml#3 最新的 5.00 提交
來自 trunk 的最新提交現在已合併到 ocaml-multicore 5.00 分支。
-
ocaml-multicore/ocaml-multicore#718 從網域中棄用 Sync 和
timer_ticks
此修補程式將
4.12.0+domains+effects
的變更與主線 5.00 分支同步。
執行緒安全
-
ocaml-multicore/ocaml-multicore#632
Str
模組多域安全性PR#635 使
lib-str
具備網域安全性,可與 Multicore OCaml 並行運作。 -
ocaml-multicore/ocaml-multicore#672 Codefrag 執行緒安全性
此 PR 引入無鎖定跳躍列表,使 codefrag 具備執行緒安全性。程式碼片段在移除後無法立即釋放,而是會新增至清單,並在稍後的停止世界暫停期間清除。
修正
-
ocaml-multicore/ocaml-multicore#655 Systhreads:將
thread_next_id
初始化為 0thread_next_id
未初始化,導致 Core 的測試套件出現問題。現在已將其初始化為零。 -
ocaml-multicore/ocaml-multicore#657 Libstr:使用網域本機值儲存
last_search_result_key
last_search_result_key
現在儲存在網域本機儲存空間中,修正了最近的 CI 失敗。 -
ocaml-multicore/ocaml-multicore#673 修正在 #671 中回報的 C++ 命名空間汙染問題
此修補程式修正了 C++ 命名空間汙染和 check-typo 問題。
-
ocaml-multicore/ocaml-multicore#702 Otherlibs:將 PR10478 修復程式加回 systhreads
st_thread_set_id
呼叫已新增至otherlibs/systhreads/st_stubs.c
,這會恢復 systhreads 中 ocaml/ocaml#10478 的修復程式。 -
ocaml-multicore/ocaml-multicore#721 修復
make install
執行
make install
時出現的caml/byte_domain_state.tbl: No such file or directory
錯誤已透過此 PR 修正。
測試套件
-
ocaml-multicore/ocaml-multicore#654 啟用效果測試
由於語法支援已新增至 Multicore OCaml,因此現在已重新加入效果處理常式測試。
-
ocaml-multicore/ocaml-multicore#658 啟用最後一個 dynlink 測試
現在已啟用
lib-dynlink-private
測試,以便在 CI 中執行。 -
ocaml-multicore/ocaml-multicore#659 重新匯入 threadsigmask 測試並移除 systhread-todo 測試目錄
已在 CI 中重新啟用 systhreads 中訊號處理和 tick 執行緒遺失的
lib-systhreads-todo
測試。 -
ocaml-multicore/ocaml-multicore#660 針對
testsuite/disabled
檔案進行修正和整理已修正 80 字元行的
check-typo
問題,以及testsuite/disabled
中不必要的test/promotion
。 -
ocaml-multicore/ocaml-multicore#661 測試套件:重新啟用 pr9971
已重新啟用
pr9971
測試,以便在 CI 中執行。 -
ocaml-multicore/ocaml-multicore#688 改善 systhreads 中的訊號處理
改善 systhreads 中的訊號處理,修正 CI 中的
threadsigmask
測試案例失敗。 -
ocaml-multicore/ocaml-multicore#712 Otherlibs:Unix.kill 應檢查擱置訊號
已重新啟用
unix_kill
測試案例,以確保Unix.kill
會在返回時檢查擱置訊號。
文件
-
ocaml-multicore/ocaml-multicore#672 修正
major_gc
的 check-typo 錯誤,以便 #672 中的變更不會被破壞一個修正
runtime/major_gc.c
中 check-typo 問題的修補程式。 -
ocaml-multicore/ocaml-multicore#696 Stdlib:修正
effectHandlers.mli
中的錯字已修正
stdlib/effectHandlers.mli
中的一些錯字。 -
ocaml-multicore/ocaml-multicore#697 移除無用程式碼並清除 minor gc 中的註解
一個非功能性的變更,可清除 minor 和 major GC 檔案中的註解。
-
ocaml-multicore/ocaml-multicore#699 清理 fiber 實作並新增文件
已移除
amd64.S
中未使用的程式碼,並已修正格式。不再需要在堆疊頂端為外部呼叫新增 24 個位元組,並且已移除。 -
ocaml-multicore/ocaml-multicore#713 澄清 Lazy wrt. RacyLazy 和 Undefined 例外的文件。
已更新
stdlib/lazy.mli
中的文件,以澄清try_force
的行為和執行緒安全性。 -
ocaml-multicore/ocaml-multicore#717 收緊
minor_gc.c
中的程式碼註解此 PR 解釋了暫存鍵的升級,以避免引入屏障,並使用
/* ... */
樣式的註解。 -
一個 OCaml 5.00 的文件儲存庫,其中包含設計和建議的向上游計畫。
效果處理常式
-
ocaml-multicore/ocaml-multicore#653 捨棄
drop_continuation
此 PR 已被適用於 4.12.0+domains+effects 的 Add EffectHandlers 模組 PR 取代。
-
ocaml-multicore/ocaml-multicore#682 將效果處理常式移至 Stdlib 中的自有模組
現在已將
Obj
中的EffectHandlers
功能移至 Stdlib 中的自有模組。 -
ocaml-multicore/ocaml-multicore#687 將效果處理常式移至 Stdlib 中的自有模組
這是 PR#682 適用於
4.12+domains
的回溯移植。 -
ocaml-multicore/ocaml-multicore#689 新增 EffectHandlers 模組
此 PR 將效果處理常式函式新增至
4.12.0+domains+effects
,並允許具有效果處理常式函式的domainslib
與4.12.0+domains+effects
開關搭配使用。
雜項
-
ocaml-multicore/ocaml-multicore#678 使網域狀態在位元組碼和原生模式中相同
現在使
struct domain_state
結構在位元組碼和原生程式碼中都相同。 -
ocaml-multicore/ocaml-multicore#691 新增可使用回溯中止的能力
回溯對於建模 async/wait 非常有用,特別是當等待的任務引發例外時,回溯會包含來自等待和被等待任務的框架。
-
ocaml-multicore/ocaml-multicore#693 新增可使用回溯中止的能力
將 ocaml-multicore/ocaml-multicore#691 回溯移植至
4.12.0+domains+effects
。 -
ocaml-multicore/ocaml-multicore#701 當平行使用預先定義的格式器時,真正刷新輸出
刷新過去只會在網域終止時發生,但是,透過此 PR,輸出會立即刷新。
-
ocaml-multicore/ocaml-multicore#705 Otherlibs:從 systhreads 移除
caml_channel_mutex_io
勾點現在已移除 systhreads 中的
caml_channel_mutex_io
勾點。 -
ocaml-multicore/ocaml-multicore#716 runtime:
extern_free_position_table
應在extern_flags & NO_SHARING
時返回extern_free_position_table
應在extern_flags & NO_SHARING
時立即返回,與extern_alloc_position_table
對稱。
生態系統
進行中
Domainslib
-
ocaml-multicore/domainslib#43
Task.pool
管理中可能存在的錯誤Török Edwin 已使用 4.12.0+domains 和 domainslib 0.3.1 在 AMD Ryzen 3900X CPU 上重現分段錯誤,並已提供包含修正程式的草稿 PR!
-
ocaml-multicore/domainslib#46 提供一種方式來反覆運算所有集區
一項能夠反覆運算 domainslib 中建立的所有集區的要求。一個使用案例是拆除所有集區。可以使用弱雜湊集合來儲存集區的弱指標。
-
ocaml-multicore/domainslib#47
Task.await
死結(任務已完成,但 await 永遠不會返回)一個關於在
Task.async
內巢狀Task.await
,以及在Task.async
內巢狀Task.async
的查詢。也提供了範例程式碼片段、堆疊追蹤和平台資訊,以重現死結情境。 -
ocaml-multicore/domainslib#48 將
ws_deque
移至 lockfree一個將 domainslib 中的工作竊取 deque 移至
ocaml-multicore/lockfree
的請求,並使domainslib
依賴於此新的lockfree
實作。 -
ocaml-multicore/domainslib#49 我們應該從程式庫公開多通道嗎?
一個關於 Multicore OCaml 使用者是否會發現非 FIFO 多通道實作有用的查詢。Domainslib 已提供 FIFO 通道。
-
ocaml-multicore/domainslib#50 Multi_channel:允許每個程式有多個具有不同組態的執行個體
Török Edwin 在
lib/multi_channel.ml
和lib/task.ml
中貢獻的草稿 PR,用於移除每個通道金鑰的全域金鑰使用。 -
ocaml-multicore/domainslib#51 利用效果處理常式
現在使用效果處理常式建立任務,而新的
test_deadlock.ml
會測試相同的內容。此變更僅適用於4.12+domains
和5.00
。以下顯示來自圖靈機 (Intel Xeon Gold 5120 CPU @ 2.20 GHz,28 個隔離核心) 的效能結果
雜項
-
ocaml-multicore/tezos#8 ci.Dockerfile 擲回警告
Ubuntu 20.10 上的
ci.Dockerfile
會在 GCC 10.3.0 上擲回_Atomic
的 C99 警告。 -
ocaml-multicore/tezos#10 修復 make build-deps,修復 NixOS 支援
不再需要上游的
conf-perl
,並且已從tezos-opam-repository
移除。此修補程式也會修復make build-deps/build-dev-deps
。 -
ocaml-multicore/ocaml-uring#39 NixOS 上的測試失敗
ocaml-uring
主分支在 NixOS 上使用dune runtest
顯示測試失敗。 -
ocaml-multicore/eio#85 是否有任何支援
js_of_ocaml
的計畫?Konstantin A. Olkhovskiy (
Lupus
) 的查詢,詢問假設js_of_ocaml
獲得效果支援,EIO 是否可以編譯為 JavaScript 後端。
已完成
Domainslib
-
ocaml-multicore/domainslib#45 新增具名集區
現在新增一個可選引數,以便在設定期間命名集區。此名稱可用於稍後擷取集區。
-
ocaml-multicore/domainslib#52 使用隨機數作為快取前置詞,以在 CI 中停用快取
現在
cache-prefix
在.github/workflows/main.yml
中使用隨機數,以在 CI 中停用快取。 -
ocaml-multicore/domainslib#53 使 domainslib 在 PR#704 之後使用 OCaml 5.00 建置/執行
現在已更新 CI,以便使用 OCaml 5.00 分支建置和執行。
-
ocaml-multicore/domainslib#54 使用最後一個 4.12+domains+effects 雜湊作為快取金鑰
現在快取金鑰使用 OCaml Multicore 的最後一個 commit 雜湊,以便使 CI 中的快取失效。
雜項
-
ocaml-multicore/tezos-opam-repository#3 新增 domainslib
domainslib.0.3.1
版本現在已作為套件包含在 Tezos OPAM 儲存庫中。 -
ocaml-multicore/retro-httpaf-bench#17 改善圖表
現在已將標記新增至從 Jupyter 筆記本產生的圖表,以便輕鬆區分顏色線條。
-
ocaml-multicore/multicore-opam#59 在 ocaml-multicore/ocaml-multicore#514 之後修復 batteries
batteries-included
的batteries.3.3.0+multicore
opam 檔案已使用正確的 src URL 更新。 -
ocaml-multicore/eio#82 遷移至 4.12.0+domains 效果實作(無語法效果版本)
此 PR 更新
eio
以支援 OCaml 5.0 版本的效應實作。 -
ocaml-multicore/eio#83 效果處理器現在有自己的模組
Sid Kshatriya 貢獻了一個修補程式,將
Obj.Effect_handlers
重新命名為EffectHandlers
,因為效果處理器在 Stdlib 中有自己的模組。 -
Jane Street 的標準函式庫覆蓋層
core
現在已新增至ocaml-multicore
GitHub 專案儲存庫。
效能基準測試
Sandmark
進行中
-
ocaml-bench/sandmark#248 Coq 無法建置
新的 Coq tarball,coq-multicore-2021-09-24,可以使用 Multicore OCaml 4.12.0+domains 建置,但是,由於已報告的 dune 問題,
stdio.v0.14.0
無法使用 4.14.0+trunk 清理建置。 -
ocaml-bench/sandmark#260 新增 5.00 分支以進行循序執行。修正筆記本。
新的 5.00 OCaml 變體分支已新增至 Sandmark,以追蹤 CI 中的循序效能基準執行。
已完成
-
ocaml-bench/sandmark#256 移除舊的變體
較舊的變體,
4.05.*
、4.06.*
、4.07.*
、4.08.*
、4.10.0.*
現在已從 Sandmark 中移除。 -
ocaml-bench/sandmark#258
在 README 中記錄 Makefile 變數README 現在包含有關在 Sandmark 中建置和執行效能基準期間使用的各種 Makefile 變數的文件。
current-bench
進行中
-
ocurrent/current-bench#117 從 Docker 容器讀取 stderr
我們希望看到 Docker 容器內效能基準執行中的任何建置失敗,以用於除錯目的。
-
ocurrent/current-bench#146 複製 ocaml-bench-server 設定
需要從 Sandmark Makefile 將 TAG 和 OCaml 變體抽象化到 current-bench,以便能夠為不同的編譯器版本和開發人員分支執行效能基準。
已完成
-
ocurrent/current-bench#105 從
pipeline/lib/pipeline.ml
抽象出 Docker 映像名稱到環境現在支援自訂 Dockerfile,因此您可以在 Dockerfile 中提取任何 opam 映像。
-
ocurrent/current-bench#119
OCAML_BENCH_DOCKER_CPU
不支援平行執行的一系列 CPUDocker CPU 設定現在使用字串表示法,而不是整數,來指定平行執行的 CPU 清單。
-
ocurrent/current-bench#151 Docker 與原生效能
在停用超執行緒的情況下,使用 current-bench 的 Docker,以及原生的循序和平行效能基準執行,沒有顯示明顯差異。下面提供 Gödel 伺服器組態和 Sandmark-nightly 筆記本圖表結果以供參考
- CPU:Intel(R) Xeon® Gold 5120 CPU @ 2.20 GHz
- OS:Ubuntu 20.04.3 LTS (Focal Fossa)
- Sandmark 2.0-beta 分支:https://github.com/ocaml-bench/sandmark/tree/2.0-beta
- 已停用超執行緒
$ cat /sys/devices/system/cpu/smt/active 0
- 記憶體 (62 GB),磁碟 (1.8 TB)。
- OCaml 變體:4.12.0+domains
- Sandmark-nightly 筆記本:https://github.com/ocaml-bench/sandmark-nightly/tree/main/notebooks
- 每個效能基準的五次迭代平均值
- 用於循序的
run_in_ci
- 用於平行的
macro_bench
- 用於循序的
時間
標準化
最高堆積字
標準化
MaxRSS (KB)
標準化
主要集合
標準化
平行效能基準
(請參閱 PR 的完整內容,以取得完整的圖表集,包括主要字組和耗費時間)
我們特別感謝社群中所有 OCaml 使用者、開發人員和貢獻者,感謝他們寶貴的時間和對專案的持續支持。保持安全!
縮寫
- AMD:超微半導體
- CI:持續整合
- CPU:中央處理器
- DLS:網域本機儲存
- FIFO:先進先出
- GB:吉位元組
- GC:垃圾收集器
- GCC:GNU 編譯器集合
- IO:輸入/輸出
- OPAM:OCaml 套件管理器
- OS:作業系統
- PR:提取請求
- TB:兆位元組
- URL:統一資源定位器