Fadis
banner
fadis0.bsky.social
Fadis
@fadis0.bsky.social
どうやらMetaは割り込みに大きな時間を持って行かれてタスクの進みが悪いCPUの影響で関係ないタスクの完了が遅れるのを防ぐ為に、SCX-LAVDの方法でlatency criticalityと判断されたタスクを割り込みによる占有率が低いCPUに逃すという事をやっているらしい
December 26, 2025 at 1:57 PM
今回Linux Plumbers Conference in Tokyoで出てきたのは、Metaがこのゲームの為に作られたスケジューラを大規模なサーバに応用した、という話。
発表の大部分はSCX-LAVDを複数のCCXに沢山のCPUがぶら下がっている大規模なサーバで動かす際に生じたボトルネックとその対策についてで、そもそも何でそんなスケジューラを選んだのかについてはあまり触れられていないが、その答えが発表資料の補足スライドに書かれている
lpc.events/event/19/con...
lpc.events
December 26, 2025 at 1:57 PM
そこでSCX-LAVDはタスクの依存関係のグラフを構築し、タスクA->タスクB->タスクCの中間にあるタスクBの平均実行時間が短く、Cが実行されるのは大体Bが原因で、Bが実行されるのは大体Aが原因の時、Bをlatency criticalityの高いタスクとする。
latency criticalityの高いタスクは期限が短くなり、結果他のタスクより優先してCPUが与えられ、実行までのレイテンシが小さくなる。タスクBは実際には既にタスクAにCPUが与えられるまでの時間分待機しているので、これによってバケツリレーのタスクが過剰に待たされる問題が緩和される
December 26, 2025 at 1:57 PM
この累積的な遅延によって1フレーム内に完了させたい処理が1フレーム内に完了しなくなると、ゲーム画面は瞬間的に固まったり、フレームレートが落ちたりする。プレイヤーはこの時CPU不足と考えるが、実際にはバケツリレーの途中にあるタスクを待たせて後でも良いタスクが走っているだけだったりする。
ゲームのタスクにおけるバケツリレーの待つ側、待たせる側は毎フレームほぼ変化せず、その実行時間も安定している
December 26, 2025 at 1:57 PM
スケジューラはCPUが空いた時に沢山あるタスクの中から次にCPUに割り当てるタスクを決定する。デッドラインスケジューラではタスクの期限が最も近いタスクを優先的にCPUに割り当てる。I/Oを待っているタスクはI/Oが完了したとしても即座に実行されるわけではなく、スケジューラがCPUを与えるのを待つ。
従って沢山のタスクがデータをバケツリレーしている場合、最初のタスクにデータが与えられてから最後のタスクから結果が出てくるまでの間にこのタスクのセットは何度もスケジューラでCPUを与えられるのを待つ事になる
December 26, 2025 at 1:57 PM
その結果ビデオゲームのタスクはその多くが長時間生存する、数十の極めて頻繁にスケジュールされるタスクが殆どのCPU時間を使う、1回のタスクの実行時間は100usオーダーで安定して非常に短いがそれが周期的にスケジュールされる、殆どのタスクはI/Oやロックを待っている、といった傾向が見られた。
これは、沢山のタスクが他のタスクの出力を受け取って、それに対して何らかの軽い処理をして次のタスクに結果を渡すというバケツリレーをしている事、それが1フレームのレンダリングを行う度に繰り返し行われている事を示唆していた
December 26, 2025 at 1:57 PM
2024年のOpen Source Summit North AmericaでIgaliaの人が発表したのはSCX-LAVDと呼ばれる新しいLinuxのスケジューリングアルゴリズムだった。このスケジューラはSteamDeckで実行されるゲームのユーザ体験レベルでのパフォーマンスを改善する為に作られた。
www.phoronix.com/news/LAVD-Sc...
このDomain specificなスケジューラを開発する為にIgaliaは多くのビデオゲームに共通するワークロードの傾向を調べた
Rust-Written LAVD Kernel Scheduler Shows Promising Results For Linux Gaming
Changwoo Min with Igalia presented yesterday at Open-Source Summit North America on optimizing the kernel's scheduler for Linux gaming
www.phoronix.com
December 26, 2025 at 1:57 PM
ヘアカードを計算で生成する手法としては既にUnreal Engineによる実装が存在するが、実験ではUnreal Engineの実装より格段にStrand Basedに近いレンダリング結果が得られるヘアカードが生成されている。この実験結果はいい感じの比較動画が上がっている
www.youtube.com/watch?v=H6tn...
[Siggraph Asia 2025] Auto Hair Card Extraction for Smooth Hair with Differentiable Rendering
YouTube video by Kui Wu
www.youtube.com
December 18, 2025 at 1:58 PM
このレンダリング結果が元の髪をStrand Basedでレンダリングした結果に近くなるように微分可能レンダリングでパラメータの最適化を行う。最後に頂点に記録されたパラメータをカードに投影してテクスチャに焼く事でエイリアスの問題を回避する。
最後にほぼほぼそれっぽい状態になったヘアカードに対して、髪の毛が根本以外の部分で頭にめり込んでいるようなおかしな状態を修正する為にテクスチャの値とカードの位置、向き双方をパラメータとした微分可能レンダリングを行う
December 18, 2025 at 1:58 PM
髪の毛は細い為テクスチャのテクセルを1テクセル未満の幅でカバーする事になる。テクスチャの値を誤差逆伝播で修正しようとすると勾配にエイリアスに起因するノイズが乗って最適化が上手く機能しない。
そこでこの手法ではテクスチャに書く値を直接最適化の対象にするのではなく、Strand Basedの髪の毛を一旦カードの表面に投影し、テクスチャに書く予定の深度等のパラメータに基づいて投影した髪の毛を変化させた結果をStrand Basedでレンダリングする。パラメータは髪の毛の頂点に持たせる
December 18, 2025 at 1:58 PM
Bishop formulasは毛の根本での法線の向きを決めるとそこから毛先に向かって連続的に変化する法線を生成するので、根本での法線を決める必要がある。そこで束を構成する毛をヘアカードの表面に投影し、投影された毛と元の毛の差が最小になるような法線の向きを探す。
この過程は微分可能ではないが探索空間は小さいので力技で最適化を行う。ヘアカードの位置と向きが決まったらカードに貼り付けるテクスチャのパラメータを決める。これはStrand Basedのレンダリング結果とヘアカードのレンダリング結果が近くなるように微分可能レンダリングを使って求める
December 18, 2025 at 1:58 PM
次にグループ内の髪の座標の平均を通る曲面を作りヘアカードとする。曲線からは曲面の接線しか定まらない為法線が必要になる。そこでDiscrete elastic rodsのBishop formulasを使って法線を決める
dl.acm.org/doi/10.1145/...
Discrete elastic rods | ACM SIGGRAPH 2008 papers
dl.acm.org
December 18, 2025 at 1:58 PM
論文の手法ではまず沢山の髪の毛を通っている位置の類似度でグループ分けして複数の小さい髪の束に分ける。この分割には Example-based hair geometry synthesis の4章で提案されている手法が用いられる
dl.acm.org/doi/10.1145/...
Example-based hair geometry synthesis | ACM SIGGRAPH 2009 papers
You will be notified whenever a record that you have chosen has been cited.
dl.acm.org
December 18, 2025 at 1:58 PM
Strand Basedの代わりにビデオゲームで髪を描くのに人気があるのがヘアカードを用いる手法。この手法では髪の毛の束を表す板を数百枚程度のオーダーで頭に生やす。この板にテクスチャ座標を与え、テクスチャに板を通過しようとする光の振る舞いを決定する為のパラメータを記録する。
ヘアカードを使って描く髪がStrand Basedに近い見た目になるかどうかは、効果的な位置に効果的な向きでヘアカードを生やしているかにかかっていて、従来それは熟練の職人の手で行われていた。論文はこれを何とかして自動化しようぜ、という物
December 18, 2025 at 1:58 PM
コンピュータグラフィクスで人間の髪を描く最も直接的な方法は髪の毛を1本づつ曲線として描くという物だが、平均的な髪は10万本オーダーの毛で構成されている為、この方法で説得力のある髪を描くには膨大な数の曲線をレンダリングする必要がある。このような髪の描き方はStrand Basedと呼ばれる。
今日のハイエンドなGPUの性能をもってすればリアルタイムレンダリングでStrand Basedな髪の描き方はできないこともない、というくらいのコストになる。ただビデオゲームでは多くの場合沢山のキャラクターを描きたいのでこのようなGPUの性能の無駄遣いはあまり好まれない
December 18, 2025 at 1:58 PM
VK_KHR_dynamic_rendering_local_readを使うとタイルベースGPU向けのコードとそうでないGPU向けのコードの違いがより小さくなり、両対応のコードが書きやすくなる。Vulkanでは従来のRenderPassは既に非推奨になっている
docs.vulkan.org/guide/latest...
VK_EXT_custom_resolveはこのRenderPassからVK_KHR_dynamic_rendering_local_readへの移行の動きに合わせて、Dynamic Renderingでも同様の指定を行えるようになっている
Deprecated :: Vulkan Documentation Project
docs.vulkan.org
December 13, 2025 at 8:49 AM
Vulkan 1.4では従来のRenderPassを置き換える仕組みとしてVK_KHR_dynamic_rendering_local_read拡張が登場した。これはDynamic Renderingで実行されるRenderPass間の依存関係をVK_DEPENDENCY_BY_REGION_BIT相当にする手段を提供する
docs.vulkan.org/refpages/lat...
VK_KHR_dynamic_rendering_local_read(3) :: Vulkan Documentation Project
docs.vulkan.org
December 13, 2025 at 8:49 AM
その一方ドライバはVK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXTが付いたsubpassが吐いたフラグメントの色を、深度テストに通す事無く最終的な出力として直接メインメモリに書けるようになる。これによってシェーダによるresolveはハードウェアのresolveに肉薄する性能を出せるようになる
December 13, 2025 at 8:49 AM
これでタイルメモリ上の値でresolveを行えるようになる。次にVK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXTを付ける事で、subpassがresolveを目的とした物である事をドライバに伝えられるようになる。
VK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXTが付いたsubpassでは頂点シェーダはスクリーン全体を覆う四角以外のものを描いてはいけない、このsubpassはrenderpassの最後のsubpassでなければならないという制約が課せられる
December 13, 2025 at 8:49 AM