OCaml 多核心 - 2021 年 7 月
歡迎來到 2021 年 7 月的 多核心 OCaml 月度報告!本月的更新以及先前的更新由我 @ctk21、@kayceesrk 和 @shakthimaan 編纂。由於 8 月通常是歐洲的休息時間,下一次更新可能會在幾個月後與 9 月的更新合併(但考慮到我們現在地理位置分散,如果 8 月有足夠的進展,我會進行更新)。
多核心工作的整體狀態進展順利:我們對下一個 OCaml 版本的貢獻已經整合到 4.13.0~alpha2 中,而我們的重點仍然是消除不相容性和錯誤,以產生適合上游審查和發布的僅限域的平行處理補丁。作為優先級較低的活動,我們將繼續開發實驗性的「基於效果」的 IO 堆疊,該堆疊將在 2021 年 8 月舉行的即將到來的 ICFP 虛擬 OCaml 工作坊中亮相。
4.12.0+domains
分支繼續看到一連串的錯誤被穩定地修復。繼上個月的呼籲之後,除了多核心和核心 OCaml 團隊之外,我們還看到許多外部貢獻者挺身而出提交修復。我們想感謝他們!
- 感謝 @emillon (Etienne Millon) 使用 4.12.0+domains 執行 Jane Street
core
v0.14 測試套件並分享測試結果(並在此過程中發現一個 多核心 GC 邊緣案例錯誤)。 - 感謝 @Termina1 (Vyacheslav Shebanov) 使用多核心 OCaml 4.12.0+domains 測試
batteries
3.30 的編譯。 - 感謝 @nbecker (Nils Becker) 報告 domainslib 的
parallel_map
和parallel_scan
。 - 感謝 Filip Koprivec 指出當使用 4.12.0+domains 的
ocamlc
時使用flush_all
會導致記憶體洩漏。
所有這些修復,加上一些重要的相容性變更(如下所列),讓我很接近將 4.12.0+domains 作為我每天選擇的 OCaml opam 切換。我鼓勵您也試試看,並在 多核心 OCaml 追蹤器上報告(好的或壞的)結果。如果這些問題引起您的注意,那麼 Segfault Systems 正在印度招聘,與 @kayceesrk 和那裡的團隊一起開發多核心 OCaml。
在基準測試方面,Sandmark 夜間基準測試執行的 Jupyter 筆記本已更新,我們將繼續測試 4.12+ 變體和 4.14.0+trunk 的 Sandmark 建置。目前已整合 current-bench
OCurrent 管線與 Sandmark 2.0 -alpha 分支變更,以重現目前的 Sandmark 功能,這將允許在合併之前系統地對 GitHub PR 進行基準測試。
與往常一樣,多核心 OCaml 的正在進行和已完成的任務會先列出,然後是來自生態系統函式庫的更新。接著提及 Sandmark 夜間建置工作、基準測試更新和相關的 current-bench 任務。最後,提供有關上游 OCaml 安全點 PR 的更新供您參考。
多核心 OCaml
正在進行
CI 相容性
-
ocaml-multicore/ocaml-multicore#602 包含大部分 OCaml 標頭會導致需要 pthread
包含多個巢狀標頭檔需要
pthread
,而且decompress
測試套件會失敗。 -
ocaml-multicore/ocaml-multicore#607
caml_young_end
不再是value *
在 CI 中觀察到一個不一致之處,
caml_young_end
現在是char *
而不是value *
。
崩潰
-
ocaml-multicore/ocaml-multicore#608 Parmap 測試套件崩潰
當
Parmap
的測試套件針對多核心 OCaml 執行時,會導致分段錯誤。 -
ocaml-multicore/ocaml-multicore#611 在 AFL 下執行多核心二進制檔案時崩潰
bun
套件在多核心 OCaml 4.12+domains 上崩潰,但在 4.12 上建置正常。
套件建置
-
ocaml-multicore/ocaml-multicore#609 lablgtk 的範例發生分段錯誤
正在進行使用 OCaml 和多核心 OCaml 編譯 lablgtk 的工作。
-
ocaml-multicore/ocaml-multicore#624 core v0.14:測試觸發 GC 中的分段錯誤
@emillon 回報使用多核心 OCaml 4.12.0+domains 執行
core.v0.14
測試套件導致的分段錯誤。 -
ocaml-multicore/ocaml-multicore#625 無法在 OCaml 多核心 4.12.0+domains 上編譯 batteries
Vyacheslav Shebanov (@Termina1) 嘗試使用多核心 OCaml 4.12.0+domains 變體編譯
batteries.3.30
。
上游
-
ocaml-multicore/ocaml-multicore#573 將 trunk 安全點 PR 反向移植到多核心
安全點實作正在反向移植到多核心 OCaml。下面顯示了在大型 Xen2 機箱上執行 Sandmark 的初始測試結果
-
ocaml-multicore/ocaml-multicore#617 部分相容性巨集未與上游 OCaml 放在相同的標頭中
GC 統計的相容性層導入需要與 trunk 一致。
-
ocaml-multicore/ocaml-multicore#618 檢查 io.c 的執行緒安全性並新增平行測試
io.c 中的執行緒安全性修復需要審查,並且需要為其新增額外的測試。
-
ocaml-multicore/ocaml-multicore#623 公開
caml_channel_mutex_*
掛鉤支援從 trunk 到多核心 OCaml 的
caml_channel_mutex_*
介面的 PR 草稿。
雜項
-
ocaml-multicore/ocaml-multicore#610 新增標準 gnu11 通用 cflags
已更新 configure.ac 檔案,以便在 GCC 和 Clang 的
common_cflags
中使用-std=gnu11
。 -
ocaml-multicore/ocaml-multicore#614 在 fork 後銷毀通道互斥鎖
關於在執行時間 fork 後重設和重新初始化互斥鎖的討論。
-
ocaml-multicore/ocaml-multicore#616 公開使用效果進行程式設計的函式
允許程式設計師編寫使用效果的程式而無需顯式使用效果語法的 PR 草稿。
-
ocaml-multicore/ocaml-multicore#619 設定資源限制
查詢在多核心 OCaml 中使用
setrlimit
,類似於 Jane Street 的 core 函式庫中的Core.Unix.RLimit.set
。
已完成
增強功能
-
ocaml-multicore/ocaml-multicore#601 網域更好的參與者
已移除網域建立中的
0(n_running_domains)
和 STW 信號中的迭代0(Max_domains)
。 -
ocaml-multicore/ocaml-multicore#605 條件等待的 Eventog 事件
已新增一個新事件,以指示網域何時在
Condition.wait
處被封鎖。這對於偵錯 domainslib 中工作分配的任何不平衡很有用。
-
ocaml-multicore/ocaml-multicore#615 make depend
已更新
stdlib/.depend
以涵蓋 stdlib 中的最新開發。 -
ocaml-multicore/ocaml-multicore#626 新增 Obj.drop_continuation
已將
caml_drop_continuation
原始方法新增至runtime/fiber.c
,以防止剩餘連續發生洩漏。
上游
-
ocaml-multicore/ocaml-multicore#584 使訊號處理現代化
多核心 OCaml 訊號實作現在更接近上游 OCaml 的實作。
-
ocaml-multicore/ocaml-multicore#600 在標頭中公開更多 GC 變數
caml_young_start
、caml_young_limit
和caml_minor_heap_wsz
變數現在已在執行時間中定義。 -
ocaml-multicore/ocaml-multicore#612 使 intern 和 extern 可與多核心搭配使用
intern 和 extern 的上游變更現在已整合,可與多核心 OCaml 執行時間搭配使用。
修復
-
ocaml-multicore/ocaml-multicore$604 修復
caml_scan_global_young_roots
中未受保護的caml_skiplist_empty
一個修復了在 Mac OS CI 上使用
parallel/join.ml
時觀察到的全域根鎖定錯誤的補丁。 -
ocaml-multicore/ocaml-multicore#621 otherlibs:
encode_terminal_status
未設定所有欄位一個次要修復,用於修復在 otherlibs 中從使用
caml_initialize_field
移至caml_initialize
時引起的錯誤。 -
ocaml-multicore/ocaml-multicore#628 在 link_channel 中,channel->prev 應該設定為 NULL
一個 PR 用於修復 Filip Koprivec 回報當使用
ocamlc
時使用flush_all
的記憶體洩漏。 -
ocaml-multicore/ocaml-multicore#629 回溯最後一個 exn 是 val unit
修復了在執行 core 的測試套件時回報的崩潰,方法是在
runtime/backtrace.c
中將backtrace_last_exn
清除為Val_unit
。
生態系統
正在進行
-
ocaml-multicore/ocaml-uring#36 更新至 cstruct 6.0.1
ocaml-uring 現在已更新為使用
Cstruct.shiftv
,並升級至 cstruct.6.0.1。 -
ocaml-multicore/domainslib#37 parallel_map
@nbecker 請求提供具有以下簽名的陣列上的
parallel_map
函式val parallel_map : Domainslib.Task.pool -> ('a -> 'b) -> 'a array -> 'b array
-
ocaml-multicore/domainslib#38 parallel_scan 拒絕不大於集區大小的陣列
對於不大於 @nbecker 回報的集區大小的陣列,
Task.parallel_scan
會擲回「索引超出範圍」例外。
已完成
-
ocaml-multicore/eventlog-tools#4 新增
domain/condition_wait
事件eventlog-tools 中的
lib/consts.ml
檔案現在包含domain/condition_wait
事件。 -
ocaml-multicore/domainslib#34 修復
parallel_for_reduce
中的初始值計算parallel_for_reduce
的初始值已修正,不會被重複計算多次。
Eio
eio
函式庫為 Multicore OCaml 提供了一個基於效果的並行 IO 堆疊。
進行中
-
ocaml-multicore/eio#68 工作中:新增 eio_luv 後端
正在開發中使用
luv
,它提供 OCaml/Reason 綁定到 libuv,作為 eio 的跨平台後端。
已完成
-
ocaml-multicore/eio#62 更新至最新 MDX 以修復例外報告
Dune 已更新至 2.9 版本,並進行了必要的變更以使用 MDX 進行例外報告。
-
ocaml-multicore/eio#63 更新 README
文件更新,明確指定手動釘選
ppxlib
和ocaml-migrate-parsetree
的效果版本所需的步驟。opam switch create 4.12.0+domains+effects --repositories=multicore=git+https://github.com/ocaml-multicore/multicore-opam.git,default opam pin add -yn ppxlib 0.22.0+effect-syntax opam pin add -yn ocaml-migrate-parsetree 2.1.0+effect-syntax
-
ocaml-multicore/eio#64 改善 traceln
增強了
traceln
,使其成為一個 Effect,並變更了追蹤輸出以及新增測試。 -
ocaml-multicore/eio#65 新增 Flow.read_methods 以進行最佳化讀取
在
Flow
模組中新增了read_methods
,作為更快地讀取到緩衝區的替代方案。 -
ocaml-multicore/eio#66 允許取消等待號誌
更新
lib_eio/semaphore.ml
以允許取消等待號誌。 -
ocaml-multicore/eio#67 新增更通用的例外
加入了通用的例外,以避免依賴於後端特定的例外。測試也已更新。
效能評測
Sandmark 夜間建置
進行中
-
ocaml-bench/sandmark-nightly#4 navajo 結果的平行筆記本暫停時間圖表拋出錯誤
用於暫停時間的平行 Jupyter 筆記本拋出一個需要調查的 ValueError。
-
ocaml-bench/sandmark-nightly#5 已停用基準測試的狀態
必須使用最新版本的 Multicore OCaml 測試從 Jupyter 筆記本中停用的
alt-ergo
、frama-c
和js_of_ocaml
基準測試結果。 -
ocaml-bench/sandmark-nightly#6 navajo 上的平行可擴展性數字看起來很奇怪
需要檢查 navajo 建置伺服器上並行效能數字的可擴展性,並且需要重複驗證實驗。
-
ocaml-bench/sandmark-nightly#7 在平行筆記本中,正規化結果使用
col_wrap
為 3 而不是 5為了提高可讀性,建議在平行筆記本中的正規化結果中使用 col_wrap 為 3。
-
ocaml-bench/sandmark-nightly#8 在夜間筆記本中檢視一組基準測試的結果
一個功能請求,在使用 Jupyter 筆記本時,依名稱或標籤篩選基準測試。
-
ocaml-bench/sandmark-nightly#9 最近結果的靜態 HTML 頁面
應該使用最近建置執行中的基準測試結果來產生靜態 HTML 報告,以供審閱和分析。
已完成
-
ocaml-bench/sandmark-nightly#2 時間戳記在 parallel_nightly 筆記本中未排序
下拉選項中的時間戳記列表現在已排序。
Sandmark
進行中
-
ocaml-bench/sandmark#243 新增 irmin tree 基準測試
一個將 Irmin tree.ml 基準測試新增到 Sandmark 的請求,包括必要的依賴項和資料檔案。
-
ocaml-bench/sandmark#245 新增 dune.2.9.0
更新到 dune.2.9.0,以便在 Sandmark 上使用 Multicore OCaml 建置 coq。
-
ocaml-bench/sandmark#247 Sandmark 在 OCaml 4.14.0+trunk 上中斷
由於我們開始向上游推送更多 Multicore OCaml 變更,因此需要解決 OCaml 4.14.0+trunk 的 Sandmark 建置問題。
-
ocaml-bench/sandmark#248 coq 無法建置
coq
套件無法在 navajo 伺服器上使用 Sandmark 使用 4.12.0+domains+effects 建置。
已完成
-
ocaml-bench/sandmark#233 更新 pausetimes_multicore 以符合最新的 Multicore 變更
Multicore 暫停時間現已針對 4.12.0 上游和 4.12.0 分支更新,它們現在使用新的通用追蹤格式 (CTF)。
-
ocaml-bench/sandmark#235 更新選定的基準測試作為基準基準測試的集合
您現在可以選擇僅從 Jupyter 筆記本中使用者選擇的變體進行篩選。
-
ocaml-bench/sandmark#237 在更大的機器上執行 sandmark_nightly
Sandmark 夜間建置現在在 64 個以上核心的機器上執行,以從 Domainslib 的改進中獲益。
-
ocaml-bench/sandmark#240 新增 navajo 特定平行 config.json 檔案
已將 navajo 伺服器特定的 run_config.json 檔案新增到 Sandmark,以執行 Multicore 並行基準測試。
-
ocaml-bench/sandmark#242 新增 grammatrix 的註解
關於 grammatrix 基準測試的文件更新,內容是關於通過通道自訂任務分配和使用
parallel_for
。 -
ocaml-bench/sandmark#244 將 chrt 新增到 pausetimes_multicore 包裝器
pausetimes_multicore
在 paramwrapper 中需要使用chrt -r 1
才能使用 taskset 引數。 -
ocaml-bench/sandmark#246 將 trunk 建置新增到 CI
已更新 .drone.yml 檔案,以將 4.14.0+stock trunk 建置包含在 CI 中。
current-bench
進行中
-
ocurrent/current-bench#117 從 Docker 容器讀取 stderr
我們現在可以使用 current-bench 執行 Sandmark-2.0-alpha 分支,並且在與 Docker 容器一起執行時,檢視錯誤輸出會很有用。
-
ocurrent/current-bench#146 複製 ocaml-bench-server 設定
一個將 Sandmark 基準測試目標命令動態傳遞給 current-bench 以建立管線的請求。
OCaml
已完成
-
PR 已在 4.13 上挑選,並最終與上游 OCaml 合併。
我們要感謝社群中所有 OCaml 使用者、開發人員和貢獻者對專案的寶貴時間和支持。如果您在北半球,請注意安全,並祝您有個美好的夏天!
縮寫
- AFL:美國模糊測試器 (American Fuzzy Lop)
- CI:持續整合 (Continuous Integration)
- CTF:通用追蹤格式 (Common Trace Format)
- GC:垃圾收集器 (Garbage Collector)
- GCC:GNU 編譯器集合 (GNU Compiler Collection)
- GTK:GIMP 工具組 (GIMP ToolKit)
- HTML:超文字標記語言 (HyperText Markup Language)
- IO:輸入/輸出 (Input/Output)
- OPAM:OCaml 套件管理器 (OCaml Package Manager)
- OS:作業系統 (Operating System)
- PR:提取請求 (Pull Request)
- STW:停止世界 (Stop The World)