Skip to content

p 個の部分バッファを逐次合算する reduction (tridiag, matvec_colmajor, 疎×疎, compact-WY upgrade) の高並列スケーリング #93

Open

Description

@shinaoka

問題

p 個の部分和/部分バッファを作り、呼び出しスレッドが逐次に合算する箇所があります。合算は O(p · size)、メモリも O(p · size) で、p = 32〜64 では Amdahl 項として効きます。構造は upstream にもともとありますが、fork がゲートを置き換えたため、どこから並列に入るかが変わっています。

場所 部分バッファ 逐次の合算 / 初期化 由来 危険度
evd/tridiag.rs:390, 454-461 (tridiagonal 化の symv 部) n × p (z2) 1 step あたり p · rem を合算、並列部は rem²/(2p) 構造は upstream (0ecd846 も同じ)。fork は入口を rem ≈ 313 → 260 (outside) / 165 (in-pool) に下げ、見積もりに合算項がない 高
matmul/mod.rs:1000-1056 (matvec_colmajor) m × p を毎回 MemBuffer::new で確保 p · m を合算 upstream 構造。fork はゲートのみ 中
sparse/linalg/matmul.rs:107 (疎×疎の数値積) m × par.degree() を temp_mat_zeroed 呼び出しスレッドが m · p を memset。Seq と判定しても p 列確保 upstream 構造。fork はゲート (116) を足したが幅は直していない 中〜高 (m が大きい場合)
householder.rs:279-317 (upgrade_householder_factor の deep 分岐) n × n × p (vec! を毎回確保) p · n²/2 fork 固有 (PATCHSET "Row-split reduction in the compact-WY factor's deep half")。rows ≥ 4·threads があるので合算 ≤ 仕事の約 1/8 低

tridiag の損益分岐 (推測、要素単位の粗い見積もり) は、p · rem と rem²/(2p) が等しくなる p* ≈ √(rem/2) です。n = 1024 では p* ≈ 22、n = 4096 では約 45 になり、p = 64 では n ≲ 4096 の eigh が p = 16〜32 より遅くなりえます。合算は p コアのキャッシュから読むので、CCD をまたぐコストも加わります。

OpenBLAS (記憶による、コードは未確認): dsytrd は flop の半分を dsyr2k (level 3) で処理し、dsymv の thread 化にも per-thread バッファの reduce があります。dgemv_n は行を分割するので reduce はありません。

確認済み / 推測

  • 確認済み (コード): 上表の確保サイズ、逐次ループ、sparse の Seq 時の p 列確保、tridiag の入口が upstream と比べて下がったこと。
  • 推測: 損益分岐の値、実際の逆転が起きる n。

計測計画 (faer#90 の計測が終わってから)

  • tridiag_in_place / eigh 値のみ、f64/c64、n = 512, 1024, 2048, 4096、1/8/16/32/64T。perf で tridiag.rs:458 の合算ループの比率を確認します。p に対して単調に減らなければ確定です。
  • matvec_colmajor: n×n (n = 512, 2048, 8192) と 100000×256、f64/c64。
  • 疎×疎: n = 1e4/1e5/1e6、1 列あたり nnz 4〜16。

推奨

  • sparse: 修正。workspace 幅を実際のスレッド数 (Seq なら 1) にし、各スレッドが自分の列をゼロにする。
  • tridiag、matvec_colmajor: 計測で確認してから修正。案は 3 つあります。
    • 部分バッファ数を min(p, c·√rem) で cap する
    • 合算を行スライスで並列 reduce する
    • matvec は m が十分なら行分割にする
  • upgrade_householder_factor: 問題なし (監視のみ)。

親: #95

🤖 Generated with Claude Code

Activity

  1. self-assigned this
    on Oct 28, 2026
  2. shinaoka commented on Oct 30, 2026

    @shinaoka
    MemberAuthor

    Folded into the umbrella #168 (parallel structure of the factorizations). This issue is re-scoped or closed against its items.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions