OCaml 多核心 - 2021 年 12 月與重大 PR
歡迎來到 2021 年 12 月的 Multicore OCaml 每月報告!先前的更新以及本次更新由我 @ctk21、@kayceesrk 和 @shakthimaan 共同編寫。
好的,它終於來了!@kayceesrk 在主要的 OCaml 開發儲存庫中開啟了 Multicore OCaml PR#10831,這代表了我們在 11 月核心團隊審查中決定的多核心 OCaml 的「最小可行」實作。這個分支的提交次數約為 4000 次,已經逼近 GitHub 的渲染極限。
PR 在聖誕節前開啟後,剩下的工作是讓許多開發人員仔細檢查 diff,並尋找在多核心開發期間發生的任何意外變更。自從 PR 開啟以來,大量程式碼變更、改進和修復已合併到 ocaml-multicore 樹中,以促進此上游流程。我們預計將在 1 月合併 PR,然後將繼續處理上個月描述的「MVP 後」任務,但從現在起將直接從 ocaml/ocaml 進行。因此,我們仍按計畫於 2022 年發布 OCaml 5.00。
在多核心生態系統中,進展也持續進行
Eio
仍持續改進,作為與 Multicore OCaml 一起使用的建議的基於效果的直接風格 IO 函式庫。- 發布了較新的
domainslib.0.4.0
,其中包含錯誤修正和 API 變更。 - Sandmark 和 current-bench 之間具有進一步整合強化的持續基準測試管道正在取得進展。
我們想感謝以下外部貢獻者:
- Danny Willems (@dannywillems) 對 Pippenger 基準測試的 OCaml 實作,並回報了一個未定義的行為。
- Matt Pallissard (@mattpallissard) 回報了
Eio
與供應商的 uring 的安裝問題。 - Edwin Torok (@edwintorok) 貢獻了一個 PR 給
domainslib
,以允許使用每個通道的金鑰。
與往常一樣,多核心 OCaml 更新首先列出,其中包含上游工作、改進、修復、測試套件和文件變更。接著是 Eio
、Tezos
和 Domainslib
的生態系統更新。Sandmark、sandmark-nightly 和 current-bench 任務最後列出供您參考。
多核心 OCaml
進行中
上游
-
ocaml-multicore/ocaml-multicore#742 非同步審查中的次要任務
提供來自非同步審查的次要任務清單,以用於 OCaml 5.00 版本。主要任務將有各自的 GitHub 問題。
-
ocaml-multicore/ocaml-multicore#750 討論多核心下 Lazy 的設計
正在進行關於多核心 OCaml 下 Lazy 設計的討論,其中涉及循序 Lazy、並行問題、重複計算和記憶體安全。
-
ocaml-multicore/ocaml-multicore#756 RFC:將
Domain.DLS
介面通用化,以便為子網域分割 PRNG 狀態正在審查「正確」的 PRNG+網域語意的實作,其中產生網域會「分割」PRNG 狀態。
-
ocaml-multicore/ocaml-multicore#791 缺少
caml_process_pending_actions_exn
caml_process_pending_actions_exn
會將例外狀況作為 OCaml 值傳回,而不是引發它們,而且 C API 呼叫在多核心 OCaml 上遺失。 -
ocaml-multicore/ocaml-multicore#795 將
Minor_heap_max
和Max_domains
作為OCAMLRUNPARAM
選項Minor_heap_max
定義為 2GB,而Max_domains
在runtime/caml/config.h
中定義為 128,而且在執行 AFL 和 Valgrind 等工具時,多核心 OCaml 上出現記憶體不足的問題。建議將這些參數設為OCAMLRUNPARAM
選項。 -
ocaml-multicore/ocaml-multicore#799 使 CI 中的
runner.sh
與主幹保持一致ocaml-multicore/ocaml-multicore
中的runner.sh
指令碼已變更且與主幹不同。需要更新以與ocaml/ocaml
同步。 -
ocaml-multicore/ocaml-multicore#806 統一 GC 中斷和訊號觸發機制
訊號和 GC 中斷之間的互動需要重新設計,因為它們以兩個獨立的機制存在。
-
ocaml-multicore/ocaml-multicore#811 透過
ocaml/ocaml
仔細檢查 rebase正在進行多核心 OCaml 訊號處理變更對 x86、ARM、PPC 和 s390x 架構的移植的審查。
-
已從
ocaml/ocaml
建立新的 ocaml-multicore/ocaml 專案儲存庫,以使其與主幹同步。
改進
-
ocaml-multicore/ocaml-multicore#765
tools/gdb_ocamlrun.py
需要更新tools/gdb_ocamlrun.py
具有硬式編碼值,而且Forcing_tag
和Cont_tag
都需要更新。 -
ocaml-multicore/ocaml-multicore#772 並非所有暫存器都需要為
caml_call_realloc_stack
儲存C 被呼叫方儲存的暫存器由
caml_try_realloc_stack
儲存,而且它們不會調用 GC。caml_call_realloc_stack
中不需要儲存所有暫存器。 -
ocaml-multicore/ocaml-multicore#775 在
gc_regs_bucket
中使用明確的下一個指標在
amd64.S
中,gc_regs_bucket
的最後一個字包含rax
的已儲存值或指向先前結構的指標。建議為這兩個實體使用不同的成員。 -
ocaml-multicore/ocaml-multicore#793 基於環形緩衝區的執行階段追蹤 (
eventring
)Eventring
是一個低負擔執行階段追蹤系統,用於持續監控 OCaml 應用程式。它是執行階段中現有 eventlog 系統的替代方案,並使用每個網域的記憶體對應環形緩衝區。Chrome 追蹤檢視器上的OCAML_EVENTRING_START=1 _build/default/src/traceevents_lib.exe
的 JSON 輸出如下所示 -
ocaml-multicore/ocaml-multicore#794 稽核
OCAMLRUNPARAM
選項可以移除許多
OCAMLRUNPARAM
選項,例如init_heap_wsz
和init_heap_chunk_sz
,因為它們未使用。 -
ocaml-multicore/ocaml-multicore#796 網域的
Caml_state
不應使用 mmapCaml_state
不再位於次要堆積區域旁邊,該區域的分配是使用 mmap 完成的。目前,使用專用暫存器 (amd64 上的r14
) 指向Caml_state
。在建立網域時使用malloc
足以簡化和管理Caml_state
。 -
ocaml-multicore/ocaml-multicore#805 改進
stack_size_bucket
/alloc_stack_noexc
當
stack_size_bucket
/alloc_stack_noexc
不是 2 的冪時,目前的堆疊快取配置將不會使用快取。新的堆疊從caml_fiber_wsz
開始,並以 2 的倍數遞增。這個程式碼有重構和改進的空間。
雜項
-
ocaml-multicore/ocaml-multicore#797 對
bigarray
的原子存取實作
bigarray
原子存取的功能要求。 -
ocaml-multicore/ocaml-multicore#801 在
Sys.command
中呼叫fork
在與
Sys.command
一起使用時,是否要保護fork
呼叫的查詢。 -
ocaml-multicore/ocaml-multicore#810 使用帶有自訂區塊的多核心時發生分段錯誤/未定義行為
@dannywillems (Danny Willems) 回報了在 OCaml 中實作 Pippenger 基準測試的分段錯誤和未定義行為。
-
ocaml-multicore/ocaml-multicore#816 篩選樹以標準化提交者的電子郵件地址
多核心 OCaml 中提交者之間不一致的名稱和電子郵件地址需要使用篩選樹修正和合併。
已完成
上游
-
ocaml-multicore/ocaml-multicore#669 設定網域的執行緒名稱
實作多核心 OCaml 執行緒命名,並提供介面以不同方式命名網域和執行緒的修補程式現在已合併。
-
ocaml-multicore/ocaml-multicore#701 挑選變更:合併來自
ocaml-multicore/really_flush
的提取請求 #701當預先定義的格式器平行使用時,PR 會更新
stlib/format.ml
以刷新輸出。 -
ocaml-multicore/ocaml-multicore#735 在
minor_gc.c
中新增caml_young_alloc_start
和caml_young_alloc_end
caml_young_alloc_start
和caml_young_alloc_end
不在多核心 OCaml 中,而且現在已作為相容性巨集包含。 -
ocaml-multicore/ocaml-multicore#737 將新的 ephemeron API 移植到 5.00
不可變的 ephemeron API 已在主幹中合併,而且各自的變更已移植到 5.00。
-
ocaml-multicore/ocaml-multicore#740 Systhread 生命週期
已合併
caml_thread_domain_stop_hook
、Thread.exit
和caml_c_thread_unregister
中的修正。PR 也解決了多核心 OCaml 中的 systhread 生命週期。 -
ocaml-multicore/ocaml-multicore#745 Systhreads WG3 意見
PR 更新了提交名稱以使其自我描述,使用非原子變數,並在無法配置執行緒描述元時引發 OOM。
-
ocaml-multicore/ocaml-multicore#748 WG3 移動
gen_sizeclasses
runtime/gen_sizeclasses.ml
已移至tools/gen_sizeclasses.ml
,而且已修正並合併拼寫檢查問題。 -
ocaml-multicore/ocaml-multicore#762 移除裸指標檢查器
PR 會移除裸指標檢查器,因為多核心 OCaml 中不支援它。
-
ocaml-multicore/ocaml-multicore#763 移動
Assert
->CAMLassert
Assert
已替換為CAMLassert
,而且已合併拼寫檢查變更以修正授權檔案和行長度。 -
ocaml-multicore/ocaml-multicore#764 解決
shared_heap.c
審查 (WG1)已更新
runtime/shared_heap.c
程式碼,以使用 NULL 而非 0 初始化變數。 -
ocaml-multicore/ocaml-multicore#766 同步審查和 WG3 中的訊號變更
訊號會在產生域 (domain) 之前被阻擋,之後在安全時解除阻擋。
total_signals_pending
已被移除,現在我們依訊號編號合併訊號。 -
ocaml-multicore/ocaml-multicore#767 將
minor_gc
標頭讀取中的relaxed
改為acquire
在
runtime/minor_gc.c
中,針對 5.00 版本,memory_order_relaxed
現在已替換為memory_order_acquire
。 -
ocaml-multicore/ocaml-multicore#768 使
intern
不再觸發垃圾回收 (GC)此 PR 使
intern
的實作更接近主幹 OCaml,並且intern
不再觸發 GC。下方表格顯示在簡單二元樹基準測試上的效能結果。N OCaml trunk This PR Slowdown 2 1.20E-07 1.20E-07 0.00% 4 3.10E-07 3.20E-07 3.23% 8 9.10E-06 1.40E-05 53.85% 16 2.60E-03 3.90E-03 50.00% 20 4.60E-02 6.40E-02 39.13% 22 2.20E-01 2.70E-01 22.73% 24 1.10E+00 1.20E+00 9.09% 25 1.90E+00 2.10E+00 10.53%
-
ocaml-multicore/ocaml-multicore#770 PR770 的回溯移植
已格式化
otherlibs/systhreads/st_stubs.c
檔案以清除衛生檢查,並且對backtrace_last_exn
進行了修改,使其更接近主幹。 -
ocaml-multicore/ocaml-multicore#771 使 systhreads 中
backtrace_last_exn
的根管理更接近主幹已更新 systhreads 中
backtrace_last_exn
的根管理,使其更接近ocaml/ocaml
。 -
ocaml-multicore/ocaml-multicore#773 基於非同步審查的改進
外部狀態的配置現在會在它被使用之前完成,並且已實作了對
amd64.S
的改進。 -
ocaml-multicore/ocaml-multicore#781 適用於 4.12 域的 PR771
這是針對
4.12+domains
分支的 PR#771 的回溯移植。 -
ocaml-multicore/ocaml-multicore#789 審查改進
主幹的文字區段命名樣式已更新為
runtime/amd64.S
,並對runtime/fiber.c
進行了改進。此外,已移除runtime/interp.c
中不必要的重置。 -
ocaml-multicore/ocaml-multicore#790 新增
ocaml_check_pending_actions
、caml_process_pending_actions
屬於 C API 一部分的
caml_check_pending_actions
和caml_process_pending_actions
已新增至 OCaml Multicore。 -
ocaml-multicore/ocaml-multicore#813 回復 arm64 變更和 ocaml-variant.opam 檔案
已更新
asmcomp/arm64/*
檔案和ocaml-variants.opam
檔案,使其更接近主幹。 -
ocaml-multicore/ocaml-multicore#815 各種調整
此 PR 減少了
major_gc.h
、sys.h
、ui.h
、weak.h
、gc_ctrl.c
、gc.mli
和runtime/Makefile
中的差異雜訊。它也移除了ocamldoc
和ocamltest
建置中不必要的包含。 -
ocaml-multicore/ocaml-multicore#818 來自審查的小錯誤修正
此 PR 更新了
otherlibs/systhreads/st_stubs.c
中的註解,在runtime/caml/sync.h
中使用了memcpy
而不是memmove
,以及asmcomp
原始碼中的小錯誤修正。 -
ocaml-multicore/ocaml-multicore#819 不要在
caml_alloc_shr
中初始化已更新
array.c
原始碼,以使用非初始化配置,以符合主幹。 -
ocaml/ocaml#10831 Multicore OCaml
此 PR 將 Multicore OCaml 合併到
ocaml/ocaml
,並透過域支援共享記憶體並行,以及透過 effect handler 支援並發。它在語言功能、C API 和單執行緒程式碼效能方面具有向後相容性。以下顯示在雙處理器、具有 64 個核心的 AMD EPYC 7551 伺服器上,來自 Sandmark 的並行基準測試之可擴展性結果。
改進
-
ocaml-multicore/ocaml-multicore#779 重新命名/隱藏一些全域變數
已將外部
global
、pool_freelist
和atoms
的使用分別替換為外部caml_heap_global_state
、靜態static_pool_freelist
和靜態atoms
。 -
ocaml-multicore/ocaml-multicore#785 取消匯出一些沒有前綴的全域名稱
現在,未以
caml_
作為前綴的全域變數已設為靜態。下方顯示變更之前和之後的輸出。之前
$ readelf -s ./runtime/libcamlrun_shared.so | grep GLOBAL | egrep -v ' UND | caml_' 198: 00000000000562a0 40 OBJECT GLOBAL DEFAULT 26 signal_install_mutex 549: 0000000000000038 8 TLS GLOBAL DEFAULT 18 Caml_state 559: 0000000000056680 8 OBJECT GLOBAL DEFAULT 26 marshal_flags 622: 000000000001bf10 178 FUNC GLOBAL DEFAULT 12 ephe_sweep 642: 00000000000707e0 8 OBJECT GLOBAL DEFAULT 26 garbage_head 665: 000000000001bb80 729 FUNC GLOBAL DEFAULT 12 ephe_mark 783: 000000000001dfe0 229 FUNC GLOBAL DEFAULT 12 reset_minor_tables 1003: 0000000000052b20 24 OBJECT GLOBAL DEFAULT 26 ephe_cycle_info 1025: 00000000000165d0 19 FUNC GLOBAL DEFAULT 12 main 1042: 00000000000383e0 87 FUNC GLOBAL DEFAULT 12 verify_push 323: 0000000000051000 0 OBJECT LOCAL DEFAULT 24 _GLOBAL_OFFSET_TABLE_ 454: 0000000000052b20 24 OBJECT GLOBAL DEFAULT 26 ephe_cycle_info 564: 00000000000383e0 87 FUNC GLOBAL DEFAULT 12 verify_push 577: 00000000000562a0 40 OBJECT GLOBAL DEFAULT 26 signal_install_mutex 637: 00000000000707e0 8 OBJECT GLOBAL DEFAULT 26 garbage_head 831: 0000000000000038 8 TLS GLOBAL DEFAULT 18 Caml_state 910: 0000000000056680 8 OBJECT GLOBAL DEFAULT 26 marshal_flags 1092: 00000000000165d0 19 FUNC GLOBAL DEFAULT 12 main 1338: 000000000001bf10 178 FUNC GLOBAL DEFAULT 12 ephe_sweep 1424: 000000000001bb80 729 FUNC GLOBAL DEFAULT 12 ephe_mark 1437: 000000000001dfe0 229 FUNC GLOBAL DEFAULT 12 reset_minor_tables
之後
$ readelf -s ./runtime/libcamlrun_shared.so | grep GLOBAL | egrep -v ' UND | caml_' 548: 0000000000000038 8 TLS GLOBAL DEFAULT 18 Caml_state 1018: 00000000000165a0 19 FUNC GLOBAL DEFAULT 12 main 329: 0000000000051000 0 OBJECT LOCAL DEFAULT 24 _GLOBAL_OFFSET_TABLE_ 833: 0000000000000038 8 TLS GLOBAL DEFAULT 18 Caml_state 1093: 00000000000165a0 19 FUNC GLOBAL DEFAULT 12 main
-
ocaml-multicore/ocaml-multicore#792 Stdlib:簡化
is_main_domain
在
stdlib/domain.ml
中,is_main_domain
的實作已變得更簡單,並且此 PR 也移除了caml_ml_domain_is_main_domain
原語。 -
ocaml-multicore/ocaml-multicore#803 移除使用除錯執行時間調整堆疊大小的差異
已移除標準和除錯執行時間之間堆疊大小調整的差異,以便使用除錯執行時間中相同的堆疊大小調整來幫助重現標準執行時間中遇到的任何錯誤。
-
ocaml-multicore/ocaml-multicore#804 移除多餘的 open
已移除
testsuite/tests/weak-ephe-final/ephetest_par.ml
中多餘的open
呼叫。 -
ocaml-multicore/ocaml-multicore#820 小幅改進
在
runtime/sys.c
中,memmove
的使用已替換為memcpy
,並且已清理runtime/callback.c
和runtime/caml/callback.h
中的程式碼。
修正
-
ocaml-multicore/ocaml-multicore#725 修正阻擋訊號無限迴圈
已新增單調的
recorded_signals_counter
,以修正在沒有域可以處理阻擋訊號時caml_enter_blocking_section
中可能發生的迴圈。現在的共識是從計算訊號轉為合併訊號,因此這需要重寫程式碼。 -
ocaml-multicore/ocaml-multicore#749
Forward_tag
短路可能存在錯誤?在次要 GC 中,已對類型為
Forward_tag
、Lazy_tag
和Double_tag
的值停用短路,並且已修正當在類型為Obj.forcing_tag
的值上短路Forward_tag
時發生的錯誤。 -
ocaml-multicore/ocaml-multicore#760 簡化惰性語義
已移除
RacyLazy
例外。也已移除domain-local
id 和try_force
。任何並行使用惰性值都可能會引發未定義的例外。 -
ocaml-multicore/ocaml-multicore#761
amd64.S
中的錯誤修正和一般清理已將
runtime/amd64.S
中的jl
(如果帶符號小於則跳轉) 變更為jb
(如果無符號小於則跳轉),並且已清理asmcomp/amd64/emit.mlp
中的程式碼。 -
ocaml-multicore/ocaml-multicore#769 移動框架描述項標頭並修正拼字錯誤
已將
runtime
中的框架描述項標頭移動到runtime/caml
以及具有CAML_INTERNALS
的 ifdef。如果程式碼是在沒有-g
的情況下編譯的,則已新增額外的 NULL 檢查。 -
ocaml-multicore/ocaml-multicore#788 修正
Cdls_Get
的 selectgeneffects_of
此 PR 將
Cdls_get
的effects_of
移動到asmcomp/selectgen.ml
中的EC.coeffect_only Coeffect.Read_mutable
。 -
ocaml-multicore/ocaml-multicore#809 完成存放庫上的
tools/check-typo
已移除
runtime/caml/stack.h
中的Callback_link
,並且此 PR 清理了tools/check-typo
報告的修正。
測試
-
ocaml-multicore/ocaml-multicore#774 跳過不支援和不相容的測試
ocamltest
的skip
內建動作可用於跳過不支援和不相容的測試。 -
ocaml-multicore/ocaml-multicore#784 回復
testsuite/summarize.awk
已更新
testsuite/summarize.awk
,使其更接近其ocaml/ocaml
版本。 -
ocaml-multicore/ocaml-multicore#786 重新實作類似 OCaml 4.x 中的
caml_alloc_small
已透過此 PR 重新引入 OCaml 4.x 的
caml_alloc_small
實作,因為當sz
大於Max_young_wosize
時,它會進行判斷提示。 -
ocaml-multicore/ocaml-multicore#798 將
asmgen
測試套件和 ocamltest 回復到主幹已更新
asmgen
和ocamltest
測試,以與ocaml/ocaml
順利建置。 -
ocaml-multicore/ocaml-multicore#808
signal_alloc
測試案例修正已將
signal_alloc
測試案例新增回測試套件。 -
ocaml-multicore/ocaml-multicore#814 小幅改進
已移除
asmcomp/reg.ml
中未使用的函式,並重新加入一些已停用的測試。測試套件中的compare_programs
現在符合主幹。
文件
-
ocaml-multicore/ocaml-multicore#752 記錄目前 Multicore 測試套件的情況
Multicore 測試套件現在的執行方式與
ocaml/ocaml
相同,因此已關閉此問題。 -
ocaml-multicore/ocaml-multicore#759 重新命名類型變數以求清晰
已合併此 PR,以更新
stdlib/fiber.ml
中的類型變數,以求一致性和清晰度。 -
ocaml-multicore/ocaml-multicore#778 註解
caml_domain_spawn
也會在install_backup_thread
中呼叫有一則註解提及網域 0 何時首次產生網域,以及備份執行緒何時未啟用,以及何時隨後啟動。
-
ocaml-multicore/ocaml-multicore#787 處理來自非同步審查的 GC 回饋
已在
runtime/finalise.c
中針對coaml_final_merge_finalisable
新增註解,說明為何來源的 young 會新增至目標的 old。計算出的 cap 工作限制設為 0.3,因為在一個切片中,您無法執行超過 1/3 的 GC 週期。 -
ocaml-multicore/ocaml-multicore#800 記錄哪些 GC 統計資料是全域的,哪些是每個網域的
已更新
stdlib/gc.mli
和runtime/caml/domain_state.tbl
中的註解,以提供有關全域的 GC 統計資料以及每個網域的 GC 統計資料的資訊。 -
ocaml-multicore/ocaml-multicore#802 針對網域的更多註解
此 PR 在
domain.c
和domain.ml
中新增了註解,說明停止整個世界區段的高階設計、備份執行緒的狀態機器、具有Domain.join
互斥鎖的訊號處理,以及停止整個世界參與者集的鎖定機制。
雜項
-
ocaml-multicore/ocaml-multicore#776 僅允許在網域 0 上使用 Dynlink
僅允許在主要網域上使用 Dynlink,並且公用函式的進入點需要檢查相同情況。
-
ocaml-multicore/ocaml-multicore#807 確保在
create_domain
期間未明確初始化的變數已初始化此 PR 在
create_domain
期間或針對任何已利用的子函式,將初始化新增至runtime/domain.c
中的變數。 -
ocaml-multicore/ocaml-multicore#817 同步 opam 檔案以使用
ocaml-options
套件已更新
ocaml-variants.opam
檔案,以使用ocaml-options
套件與 opam 存放庫的變體以及目前 Multicore 存放庫中的配置同步。
生態系統
進行中
-
ocaml-multicore/multicore-opam#61 移除
omake
caml_modify_field
在主幹中不存在。此 PR 移除了 omake,因為它僅在 +effects 時需要。 -
ocaml-multicore/multicore-opam#62 移除
domainslib
Domainslib.0.3.0
已被上游合併至 opam-repository,因此已從此儲存庫中移除。 -
ocaml-multicore/eio#116 為各種複製系統進行基準測試
針對將資料複製到緩衝區的三種技術:
fixed-buffer
、new-cstruct
和chunk-as-cstruct
進行基準測試和最佳化的公開討論。複製 1GB 檔案的結果顯示在圖表中。 -
ocaml-multicore/eio#120 新增
Fibre.fork_on_accept
和Net.accept
此 PR 中,
fork_on_accept
現在在新 switch 中使用 accept 函數,並將成功結果傳遞給新纖程中的處理函數。Net.accept
函數處理可以接受單一連線的情況。
已完成
Eio
-
ocaml-multicore/eio#87 Eio 因供應商衝突而安裝失敗
將 uring 標記為 vendored 會破壞安裝 的修復解決了此問題。此問題由 Matt Pallissard (@mattpallissard) 回報。
-
ocaml-multicore/eio#91 [討論] 物件功能/API
關於使用開放物件作為每個函數的第一個參數,以及使用完整單字和表達式而不是
network
、file_systems
等的討論現在已結束,並已更新至 eio#90。 -
ocaml-multicore/eio#101 使 luv 後端具備執行緒安全性
對
lib_eio_luv/eio_luv.ml
的更新,使 luv 後端具備執行緒安全性,並防止基準測試執行時發生死鎖。 -
ocaml-multicore/eio#102 為 luv 後端使用無鎖定執行佇列
此 PR 移除了佇列周圍的互斥鎖,並且在單域基準測試中有了微小的改進。
之前
$ make bench EIO_BACKEND=luv dune exec -- ./bench/bench_yield.exe n_fibers, ns/iter, promoted/iter 1, 95.00, 0.0026 2, 151.19, 12.8926 3, 151.80, 12.8930 4, 147.99, 12.8934 5, 148.09, 12.8938 10, 147.75, 12.8960 20, 149.30, 12.9003 30, 151.43, 12.9047 40, 153.97, 12.9088 50, 155.53, 12.9131 100, 158.35, 12.9344 500, 173.89, 13.0800 1000, 182.50, 13.1779 10000, 168.52, 13.7133
之後
$ make bench EIO_BACKEND=luv dune exec -- ./bench/bench_yield.exe n_fibers, ns/iter, promoted/iter 1, 93.94, 4.9996 2, 93.13, 5.0021 3, 92.17, 5.0046 4, 92.21, 5.0071 5, 91.45, 5.0090 10, 114.29, 5.0194 20, 96.17, 5.0468 30, 97.83, 5.0677 40, 98.82, 5.0959 50, 99.70, 5.1197 100, 107.31, 5.2409 500, 132.94, 6.1383 1000, 142.85, 6.6771 10000, 114.80, 5.9410
-
ocaml-multicore/eio#103 新增
Domain_manager.run
以啟動具有事件迴圈的域lib_eio/eio.ml
程式碼已新增Domain_manager.run
和Domain_manager.run_raw
函數。Domain_manager.run
函數只能存取呼叫域中具執行緒安全性的值。 -
ocaml-multicore/eio#104 分割出
Ctf_unix
模組已從
Eio
模組中移除對Unix
的依賴,並為了方便起見新增了Ctf_unix.with_tracing
函數。 -
ocaml-multicore/eio#106 避免在
Eio_linux.run
中使用Fun.protect
已從
lib_eio_linux/eio_linux.ml
中移除Fun.protect
的使用,因為它會拋出例外,當排程器崩潰時,此例外並無幫助。 -
ocaml-multicore/eio#107 使取消具備執行緒安全性
取消內容現在具有纖程列表,當纖程被 fork 時,它會被新增到列表中。一旦纖程完成,就會從列表中移除。此列表只能從纖程自己的域存取,並且每個纖程都持有一個單一的、可選的原子取消函數。
-
ocaml-multicore/eio#108 清理 Waiters API
許多使用者不需要結果類型,因此已將其移除。相關文件也已更新。
-
ocaml-multicore/eio#109 在
eio_linux
工具中使用無鎖定執行佇列已更新
lib_eio_linux/eio_linux.ml
檔案以使用無鎖定執行佇列。單核心基準測試的結果如下所示$ dune exec -- ./bench/bench_yield.exe`
-
ocaml-multicore/eio#110 使
Waiters.wake_one
在取消時安全由於
wake_one
是在取消等待者之後呼叫的,因此在使用多個域時,我們無法喚醒任何內容。此 PR 在lib_eio/waiters.ml
中修正了此問題,並進行了壓力測試。 -
ocaml-multicore/eio#111 還原域測試
由於 Multicore OCaml 的修正已回溯到 4.12+domains,因此現在已啟用
tests/tests_domains.md
檔案。這些測試現在也在 CI 中執行。 -
ocaml-multicore/eio#112 新增
Stream.take_nonblocking
已更新
lib_eio/stream.ml
檔案以包含Stream.take_nonblocking
函數以及一些測試。 -
ocaml-multicore/eio#113 在 README 中說明
Promises
和Streams
已更新 README,其中分別包含關於
Promises
和Streams
的章節,並且已簡化Fibre.fork
程式碼和測試。 -
ocaml-multicore/eio#114 允許取消
Domain_mgr.run
已更新
lib_eio/eio.ml
中的 run() 函數,以將取消例外注入到產生的域中。已將取消另一個域以及在已取消時產生的測試新增至tests/test_domains.md
。 -
ocaml-multicore/eio#115 在 fork 前建立纖程內容
建立纖程時不會立即啟動,這在排程方面提供了更大的彈性並減少了內容數量。
-
ocaml-multicore/eio#117 允許設定
SO_REUSEPORT
選項此 PR 新增了對為
linux_uring
後端設定SO_REUSEPORT
通訊端設定的支援。 -
ocaml-multicore/eio#118 改善 forks 的排程
舊的
Fork
效果已與Fork_ignore
類似地實作,並且Fork_ignore
已重新命名為Fork
。舊的Fiber.fork
現在是Fibre.fork_promise
。當 fork 時,呼叫者會被排程在執行佇列的開頭,因為這種新的排程順序更自然、更具彈性,並且對快取更好。 -
已新增
Fibre.check
函數,以檢查目前的內容是否已取消,並且已更新關於取消的文件。 -
ocaml-multicore/eio#121 為生命週期結束和動態分派新增基本原理
關於
doc/rationale.md
中的指示檔案結尾
和動態分派
的文件更新。
Tezos
-
ocaml-multicore/tezos-opam-repository#7 更新
來自上游的合併,其中包括對依賴套件的更新以及將新套件新增至儲存庫。
-
ocaml-multicore/tezos-opam-repository#8 新增
domainslib.0.4.0
&lwt_domain.0.1.0
將
domainslib.0.4.0
和lwt_domain.0.1.0
新增至 tezos-opam-repository。 -
已從 Tezos 儲存庫提取最新的上游建置、程式碼和文件變更。
Domainslib
-
ocaml-multicore/domainslib#50 Multi_channel:允許每個程式有多個具有不同組態的執行個體
Multi_channel
中存在以dls_new_key
形式存在的共用全域狀態,這會導致超出範圍的陣列索引。此 PR(由 Edwin Torok (@edwintorok) 貢獻)移除了全域金鑰,並使用每個通道的金鑰。 -
ocaml-multicore/domainslib#60 修正
parallel_scan
中的錯誤對於
~num_additional_domains:1
的情況,以及對於拒絕小於集區大小的輸入陣列大小的情況,陣列結果中的最後一個項目不正確。 -
已發布新的 domainslib.0.4.0,其中包括重大變更。我們現在需要使用效果處理常式來建立任務,並且所有計算都需要封閉在
Task.run
函數中。
基準測試
Sandmark 和 Sandmark-nightly
進行中
-
ocaml-bench/sandmark-nightly#23 Sandmark nightly 問題
在 Navajo 和 Turing 機器的結果中觀察到的
sandmark.ocamllabs.io
服務問題清單。 -
ocaml-bench/sandmark-nightly#24 使用來自 ocurrent-deployer 的 git clone
更新 Dockerfile 以使用來自
ocurrent-deployer
的 git clone,而不是ocaml-bench/sandmark-nightly
。 -
ocaml-bench/sandmark#266 為 OCaml 5.00.0+trun 和 4.14.0+domains 進行檢測 pausetimes
在主幹凍結後,需要更新 Sandmark 中的 pausetimes 變體,以便為
5.00.0+trunk
和4.14.0+domains
新增檢測的 pausetimes。 -
ocaml-bench/sandmark#268 將 README CI 建置狀態更新至主要分支
Sandmark 中
main
分支的 CI建置狀態
需要指向主要分支,而不是 master 分支。
已完成
-
ocaml-bench/sandmark#264 清理 4.12
已從 Sandmark 中移除
4.12.*
變體,並且已更新指令碼和文件以反映相同的變更。 -
ocaml-bench/sandmark#265 新增套件移除功能和 5.00 的建置
main
分支現在支援 OCaml 變體的package remove
選項,您可以在其中動態取消選擇您不希望建置的依賴套件。例如,在ocaml-versions/5.00.0+trunk.json
中,您可以指定以下內容{ "url" : "https://github.com/ocaml/ocaml/archive/trunk.tar.gz", "package_remove": [ "index", "integers", "irmin", "irmin-layers", "irmin-pack", "js_of_ocaml-compiler", "ppx_derivers", "ppx_deriving", "ppx_deriving_yojson", "ppx_irmin", "ppx_repr", "stdio" ] }
此 PR 也從 Sandmark master 分支中提取最新的變更,並成功為 .drone.yml CI 建置 5.00.0+trunk。
-
ocaml-bench/sandmark#267 新增對 bench.Dockerfile 的支援
Sandmark 中已包含
bench.Dockerfile
,以使用current-bench
專案建置和執行基準測試。
current-bench
進行中
-
ocaml-multicore-ci#15 在 README 中新增依賴安裝步驟
需要先執行以下命令,才能為本機儲存庫安裝和執行
ocaml-multicore-ci
$ opam update $ opam install -t .
-
ocurrent/ocluster#151 公開
Ocluster_worker
程式庫此 PR 公開了 current-bench 和 Sandmark 的內部程式庫
Ocluster_worker
,因為我們需要具有自訂設定的特定工作程式,以確保基準測試穩定。 -
ocurrent/ocluster#154 使用
opam update
、移除--verbose
和--connect
選項更新 README 文件,其中包含可使用 ocluster 的最新指示和選項。
-
ocurrent/current-bench#226 僅建置 CI 中依賴項建置良好的基準測試
可以整合和擴展 CI/CB 管線,以允許在 CI 中針對各種 OCaml 變體,建置已知可以乾淨建置的基準測試中的依賴項。
-
ocurrent/ocaml-ci#399 在 README 中新增依賴項安裝步驟
ocaml-ci
專案可以在本機專案目錄中執行,並且已將更新和安裝所需相依性的opam
命令新增至 README。
已完成
-
ocurrent/current-bench#216 新增一個自訂的 OCluster 工作者來建置並執行基準測試
此 PR 提供了一個 OCluster 工作者,讓我們能夠從主管道建置並執行基準測試,並修正了 Multicore 儲存庫設定。
-
ocurrent/current-bench#241 顯示多值資料點時顯示最小值和最大值
現在,圖表中會針對一系列 commit 顯示多值資料點的最小值和最大值。
-
ocurrent/current-bench#242 工作者:每個 CPU 執行一個基準測試
您現在可以平行執行多個基準測試,每個基準測試都使用自己的 CPU,在
.env
檔案中設定如下:OCAML_BENCH_DOCKER_CPU=4,5,6
-
ocurrent/current-bench#252 更明確地指定 Debian 版本
已更新
pipeline/Dockerfile
和pipeline/Dockerfile.env
檔案,明確指定要使用的 Debian 映像檔ocaml/opam:debian-11-ocaml-4.13
。 -
ocurrent/current-bench#254 允許為指標設定描述
current-bench 前端現在可以顯示指標的描述,如下圖所示
-
ocurrent/current-bench#257 設定儲存庫以使用特定的工作者和 OCaml 版本執行
可以為 current-bench 提供靜態設定,指定要與基準測試一起使用的工作者和 OCaml 版本。這對於為已啟用 Multicore 的 Sandmark 工作者取得確定性結果非常有用。例如
[ { "name": "author/repo", "worker": "autumn", "image": "ocaml/opam" }, { "name": "local/local", "image": "ocaml/opam:debian-ocaml-4.11" } ]
我們特別感謝社群中所有 OCaml 使用者、開發人員和貢獻者,感謝他們寶貴的時間和對專案的持續支持。祝大家平安,新年快樂!
縮寫
- AFL: 美國模糊測試器 (American Fuzzy Lop)
- AMD: 超微半導體 (Advanced Micro Devices)
- API: 應用程式介面 (Application Programming Interface)
- ARM: 進階精簡指令集機器 (Advanced RISC Machines)
- CI: 持續整合 (Continuous Integration)
- CPU: 中央處理器 (Central Processing Unit)
- DLS: 網域本地儲存 (Domain Local Storage)
- EPYC: 極致效能運算 (Extreme Performance Yield Computing)
- GC: 垃圾回收 (Garbage Collector)
- GDB: GNU 除錯器 (GNU Project Debugger)
- IO: 輸入/輸出 (Input/Output)
- JSON: JavaScript 物件表示法 (JavaScript Object Notation)
- MD: Markdown
- MLP: ML 檔案預處理 (ML-File Preprocessed)
- OOM: 記憶體不足 (Out of Memory)
- OPAM: OCaml 套件管理器 (OCaml Package Manager)
- PPC: 採用增強精簡指令集的效能最佳化 - 高效能運算 (Performance Optimization with Enhanced RISC - Performance Computing) (PowerPC)
- PR: 提取請求 (Pull Request)
- PRNG: 偽隨機數產生器 (Pseudo-Random Number Generator)
- RFC: 請求評論 (Request For Comments)
- STW: 停止世界 (Stop The World)
- WG: 工作群組 (Working Group)