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 更新首先列出,其中包含上游工作、改進、修復、測試套件和文件變更。接著是 EioTezosDomainslib 的生態系統更新。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#795Minor_heap_maxMax_domains 作為 OCAMLRUNPARAM 選項

    Minor_heap_max 定義為 2GB,而 Max_domainsruntime/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_tagCont_tag 都需要更新。

  • ocaml-multicore/ocaml-multicore#772 並非所有暫存器都需要為 caml_call_realloc_stack 儲存

    C 被呼叫方儲存的暫存器由 caml_try_realloc_stack 儲存,而且它們不會調用 GC。caml_call_realloc_stack 中不需要儲存所有暫存器。

  • ocaml-multicore/ocaml-multicore#775gc_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-PR-793-Chrome|690x149

  • ocaml-multicore/ocaml-multicore#794 稽核 OCAMLRUNPARAM 選項

    可以移除許多 OCAMLRUNPARAM 選項,例如 init_heap_wszinit_heap_chunk_sz,因為它們未使用。

  • ocaml-multicore/ocaml-multicore#796 網域的 Caml_state 不應使用 mmap

    Caml_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#669 設定網域的執行緒名稱

    實作多核心 OCaml 執行緒命名,並提供介面以不同方式命名網域和執行緒的修補程式現在已合併。

  • ocaml-multicore/ocaml-multicore#701 挑選變更:合併來自 ocaml-multicore/really_flush 的提取請求 #701

    當預先定義的格式器平行使用時,PR 會更新 stlib/format.ml 以刷新輸出。

  • ocaml-multicore/ocaml-multicore#735minor_gc.c 中新增 caml_young_alloc_startcaml_young_alloc_end

    caml_young_alloc_startcaml_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_hookThread.exitcaml_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#767minor_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_actionscaml_process_pending_actions

    屬於 C API 一部分的 caml_check_pending_actionscaml_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.hsys.hui.hweak.hgc_ctrl.cgc.mliruntime/Makefile 中的差異雜訊。它也移除了 ocamldococamltest 建置中不必要的包含。

  • 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-PR-10831-Speedup|674x500

改進

  • ocaml-multicore/ocaml-multicore#779 重新命名/隱藏一些全域變數

    已將外部 globalpool_freelistatoms 的使用分別替換為外部 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.cruntime/caml/callback.h 中的程式碼。

修正

  • ocaml-multicore/ocaml-multicore#725 修正阻擋訊號無限迴圈

    已新增單調的 recorded_signals_counter,以修正在沒有域可以處理阻擋訊號時 caml_enter_blocking_section 中可能發生的迴圈。現在的共識是從計算訊號轉為合併訊號,因此這需要重寫程式碼。

  • ocaml-multicore/ocaml-multicore#749 Forward_tag 短路可能存在錯誤?

    在次要 GC 中,已對類型為 Forward_tagLazy_tagDouble_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 的 selectgen effects_of

    此 PR 將 Cdls_geteffects_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#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.mliruntime/caml/domain_state.tbl 中的註解,以提供有關全域的 GC 統計資料以及每個網域的 GC 統計資料的資訊。

  • ocaml-multicore/ocaml-multicore#802 針對網域的更多註解

    此 PR 在 domain.cdomain.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-buffernew-cstructchunk-as-cstruct 進行基準測試和最佳化的公開討論。複製 1GB 檔案的結果顯示在圖表中。

    Eio-PR-116-Copy-screenshot|357x499

  • ocaml-multicore/eio#120 新增 Fibre.fork_on_acceptNet.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

    關於使用開放物件作為每個函數的第一個參數,以及使用完整單字和表達式而不是 networkfile_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.runDomain_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#109eio_linux 工具中使用無鎖定執行佇列

    已更新 lib_eio_linux/eio_linux.ml 檔案以使用無鎖定執行佇列。單核心基準測試的結果如下所示

    $ dune exec -- ./bench/bench_yield.exe`
    

    Eio-PR-109-Before-After|690x429

  • 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 中說明 PromisesStreams

    已更新 README,其中分別包含關於 PromisesStreams 的章節,並且已簡化 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 時,呼叫者會被排程在執行佇列的開頭,因為這種新的排程順序更自然、更具彈性,並且對快取更好。

  • ocaml-multicore/eio#119 改善取消

    已新增 Fibre.check 函數,以檢查目前的內容是否已取消,並且已更新關於取消的文件。

  • ocaml-multicore/eio#121 為生命週期結束和動態分派新增基本原理

    關於 doc/rationale.md 中的 指示檔案結尾動態分派 的文件更新。

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+trunk4.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 顯示多值資料點的最小值和最大值。

    Current-bench-241-Min-Max|690x388

  • ocurrent/current-bench#242 工作者:每個 CPU 執行一個基準測試

    您現在可以平行執行多個基準測試,每個基準測試都使用自己的 CPU,在 .env 檔案中設定如下:

    OCAML_BENCH_DOCKER_CPU=4,5,6
    
  • ocurrent/current-bench#252 更明確地指定 Debian 版本

    已更新 pipeline/Dockerfilepipeline/Dockerfile.env 檔案,明確指定要使用的 Debian 映像檔 ocaml/opam:debian-11-ocaml-4.13

  • ocurrent/current-bench#254 允許為指標設定描述

    current-bench 前端現在可以顯示指標的描述,如下圖所示

    Current-bench-254-Metrics-Description|690x216

  • 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)