更新日: 2026-02-24
- 入力を独立チャンクへ分割する
- CPU と GPU がそれぞれ Deflate を独立実行する
- 完了したチャンクを元の順序で連結して最終出力を作る
- 圧縮率よりも並列スループットを優先する
採用プロファイル: Chunk-Member Profile (CMP)
host_chunk単位で完全独立- 各チャンクは「独立した Deflate member」として圧縮
- メンバー間で辞書共有しない(チャンク跨ぎ参照禁止)
- コンテナ側(CZDF)でチャンク境界とオフセットを保持
この方式では圧縮率が低下しうるが、CPU/GPU並列化は単純で堅牢になる。
ChunkJob { index, input_offset, input_len, bytes }indexが最終連結順序を決める
ChunkMember { index, backend(cpu|gpu), raw_len, cmp_len, payload, crc32 }payloadはチャンク単体で解凍可能な Deflate データ
FrameHeaderChunkTable[](index順)ChunkPayload[]
ChunkTable には最低限以下を入れる:
indexbackendraw_lencmp_offsetcmp_len
ChunkPlanner: 入力をhost_chunkに分割Scheduler: 共通キューへ全チャンク投入- CPUワーカー:
cpu_deflate(job) - GPUワーカー:
gpu_deflate(job)(失敗時はCPUフォールバック) Assembler:index順にChunkMemberを連結してフレーム化
- CPUとGPUは同じ
ready_queueを取り合う - ただし
gpu_fractionに基づくGPU予約を許可 - 予約し過ぎてGPU待ちが出る場合はCPU横取りを許可(タイムアウト付き)
gpu_deflate(job) の中身:
match_find(GPU): LZ候補探索token_count(GPU): 出力サイズ算出prefix_sum(GPU): 出力オフセット確定token_emit(GPU): LZトークン出力huffman + bitpack:
- Phase-1: CPU
- Phase-2: GPU化
FrameParserがChunkTableを読む- CPU/GPU が
ChunkMemberを独立解凍 index順に展開データを連結- 最終バッファを返す
decompress も完全にチャンク独立なので、CPU/GPU の同時実行が容易。
host_chunk_size: 1〜8MiB (初期 2MiB)gpu_subchunk_size: 64〜256KiB (初期 128KiB)- 小入力(例 1MiB未満)は CPU 優先
- 圧縮率低下
- 原因: チャンク独立化で参照範囲縮小
- 対策:
host_chunk_sizeを大きめにする
- GPU転送/同期コスト
- 原因: 小チャンク過多
- 対策: 大きめ
host_chunk+ バッチ転送
- 片側ボトルネック
- 原因: 静的配分
- 対策: 動的キュー + EWMA重み更新
- F1:
ChunkMember形式をcozip_deflateへ固定 - F2: GPU
match_find/token_count/prefix_sum/token_emitを圧縮経路へ導入 - F3: GPU解凍(固定Huffman先行)を追加
- F4: GPU bitpack 追加
- F5: ZIP統合時のCMPメタデータマッピング