MicrosoftはDirectX 12向けにShader Model 6.10とAgilitySDK 1.720を発表し、シェーダーに行列計算を導入しました。新しい線形代数APIはAIを活用したグラフィックス処理を高速化し、32KBの共有メモリ制限を解除し、GPU向けの非同期バッチコマンドを追加しました。
今回のアップデートの核となる要素は、シェーダー実行環境で直接線形代数演算を実装するLinAlg機能セットです。開発者は、中間バッファリングを介さずに、コンピュートシェーダーやCPUを経由せずに行列乗算、転置、その他のベクトル行列変換を実行できるようになりました。これにより、インテリジェントアンチエイリアシング、動的リソース割り当て、学習ベースのジオメトリ生成などのタスクにおいて、軽量なニューラルネットワークモデルをレンダリングパイプラインに統合する可能性が開かれます。
グループ内のスレッド分散モデルも大幅に変更されました。Shader Model 6.10は、より柔軟な同期とスケジューリングのセマンティクスを導入し、NVIDIA CUDA、AMD RDNA、Intel Xeのアーキテクチャ上の特徴に合わせた手動でのウェーブまたはワープの調整にかかるオーバーヘッドを削減します。開発者は、ベンダー固有の拡張機能を使用せずに、スレッドとコンピューティングユニットのアフィニティを指定する標準化された方法を手に入れます。
Microsoftは、スレッドの共有メモリの容量に関する厳格な制限(従来は通常シェーダーで32KB、メッシュシェーダーで28KB)を撤廃しました。新しいシェーダーは、ターゲットGPUの実際の制限に対応する容量を要求できます。これは、複雑なシーンのソフトウェアラスタライズ、圧縮テクスチャブロックの処理、大規模な中間結果を用いた行列演算の実行にとって非常に重要です。
バッチ非同期コマンドにより、Direct3D 12キューは、独立した操作グループ(コピー、クリア、リソース状態の遷移)をGPUの異なるエンジンに送信できるようになります。以前は、競合しないコマンドであっても順次処理することで誤った依存関係が生じていました。現在では、複数のコピーリングとコンピューティングリングを備えたビデオカードが、そのようなバッチを並列に実行し、アイドル時間を削減できます。
ハードウェアレイトレーシングについては、TriangleObjectPositions(オブジェクト空間での頂点の元の位置へのアクセス)とClusterID(マイクロメッシュの識別)の各関数が追加されました。これによりDXR 1.1が拡張され、頂点バッファを再サンプリングすることなく、加速構造のトポロジを解析するシェーダーを作成できます。
Shader Model 6.10は、中間表現のための新しい命令セットを定義し、それはドライバーによってGPUのマシンコードにコンパイルされます。AgilitySDK 1.720は、システムバージョンのDirectXとは独立して、コールをユーザーモードにリダイレクトすることでこれらの命令を実装します。LinAlg演算はテンソルコアまたはWMMA命令にマッピングされ、それらが存在しない場合は通常のALUにマッピングされます。バッチ非同期処理はD3D12_COMMAND_QUEUE_FLAGSのフラグを使用し、依存関係マスクを指定してExecuteCommandListsを通じて管理されます。共有メモリ制限の解除は、ドライバーでの新しいリソースバインディングステージを通じて機能し、要求された容量がGPUの静的制限に対してチェックされ、スクラッチ領域に動的に割り当てられます。
実際上、Microsoftは、グラフィックスパイプラインの各段階でのニューラルネットワーク推論のトレンドに向けて、シェーダープログラミングモデルを統一しつつあります。しかし、32KBを超える共有メモリを要求した場合にGPUごとのシェーダー動作のばらつきが増大するリスクがあります。ドライバーは、パフォーマンスを犠牲にしてローカルメモリでエミュレートするか、シェーダーを拒否する可能性があります。開発者は、ID3D12Device::CheckFeatureSupportを介してサポートされている制限を動的に確認する、フォールバック戦略を必要とします。