0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HLSL Shader Model 6.10の新機能 D3D12 Linear Algebra (LinAlg) APIの翻訳をざっくばらんに

0
Last updated at Posted at 2026-04-28

何これ?

従来の行列演算とは違って、機械学習を使ったニューラルレンダリング関連のアルゴリズム実装をやりやすくなる。

たしかに、
たとえば深層学習アルゴリズムを使ってテクスチャのデノイズに、アップスケーリングとフレームレートの向上に成功した云々の論文があるしねぇ・・・

https://gpuopen.com/download/I3D25_Joint_Denoising_Upscaling_Multi-branch_Multi-scale_Feature%20Network.pdf
Joint Denoising and Upscaling via Multi-branch and Multi-scale Feature Network

https://gpuopen.com/learn/publications/
他にも近年の3Dリアルタイムレンダリングはこうしたニューラルレンダリングの話題で持ちきりであり、
こうしたアルゴリズムの最適化の為に、その演算のコアになる行列演算にメスが入るのは
当然なのかもしれない

背景

先述した通り、
 ・従来のHLSLにおける行列演算より、linalg::Matrixはニューラルレンダリングの効果を向上させるため

また、 
 ・実装のレイヤーを従来より上げることでコードの書きやすさを向上させる

さらに、
 ・行列演算の用途をより汎用化させる

そういった意図が盛り込んである

どういうことが起きるの?

実装自体は抽象度合いこそあげたものの・・・

メモリマッピングの最適化に、現行のGPUハードウェアアーキテクチャに対応した演算処理をより洗練させて、無駄をより少なくさせる余地が生まれる可能性がある

つまり・・・

・より抽象度と自由度を上げたコーディング

・ハードウェアに対してはより最適化された命令とメモリレイアウトの配置を実現

の余地が生まれた

MatrixScope::Thread

WaveスコープやThreadGroupスコープがコンピュートシェーダー(Compute Shaders)専用であり、均一な制御フローを要求するのに対し、Threadスコープはすべてのシェーダーステージで利用可能

従来のレンダリングパイプラインにそのまま組み込みやすく、既存のシェーダーを1つだけ置き換えてライティングの推論を行うといった用途に最適

ニューラルレンダリング用途のアルゴリズムの実装ハードルを下げることができる

ただし、このThreadでは計算規模がでかくなりすぎるのを防ぐため、行列同士の演算ができない。ただし、
行列とベクトルの演算linalg::Multiply
乗算と加算 linalg::MultiplyAdd)
2つのベクトルから新たな行列を生成する外積(linalg::OuterProduct)

に特化

スカラー要素の次元(K次元)の制限は4〜128の範囲に制限される

制約

データの読み込み(Load)は ByteAddressBuffer からのみ許可

groupshared メモリは使用不可
通常の Store(書き込み)操作はサポートされていない
メモリへ計算結果を反映させるには RWByteAddressBuffer に対する InterlockedAccumulate(アトミックな加算)を使用

レイアウトは
 ・ロード時には RowMajor や ColMajor に加えて Optimal レイアウトや転置(Transpose)レイアウトを指定可能。

ただし、

・InterlockedAccumulate を実行する際はマトリックスが OuterProductOptimal レイアウト でなければならない

MatrixScope::Wave

最新GPUの高帯域幅な専用行列乗算ハードウェアへのアクセスを解放するための動作モード ずるいぞっ!
 
行列の値がウェーブ全体で均一

ハードウェア(ドライバ)側は、ウェーブ内のすべてのスレッドが同一の行列インスタンスを共有していると想定して最適化
そのためこの状態を維持できる制御フローからWaveを呼び出す必要がある
バラバラの状態で呼び出せばハードウェアはおかしな動き(未定義の動作)をやらかす

どんな事に使うの?

機械学習・画像処理での、小さい行列や、手動で分割(タイリング)された行列同士の演算に使う。
大規模LLMでの行列演算では手動分割が必須になる
この手間を省くために後述するThreadGroupが使用される

MatrixScope::ThreadGroup

大規模LLMで必要になるWaveの分割処理をグラフィックドライバーに任せる役割を持つ
スコープ内のすべてのスレッド間で実行が暗黙的に同期

ほとんどの同期処理が自動的に処理

 バリア同期をしなければいけないケースは
たとえば
・行列が他のスレッドに使用される前に複数のスレッドが共同で行列を構築・変更する
場合となる

ThreadGroupの制約

ただし、別のThreadとWaveスコープと違って、このThreadGroupはコンピュートシェーダーでしか使えない

このスコープの操作は**スレッドグループ全体で均一な制御フロー(ThreadGroup-uniform control flow)**から呼び出さないといけない
呼び出さないと未定義の動作を起こしておかしな処理を行ってしまう

出典

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?