協働ベクトルの概要

2026/04/10 22:16

協働ベクトルの概要

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

核心となる進歩は、2021 年にニューラルネットワークの調査を開始したレンダリングフレームワークの進化であり、オフライン推論 전용のソリューションからグラフィックスアプリケーション内部でのリアルタイムトレーニングパイプラインをサポートする状態へ移行しました。当初、開発者は NVIDIA Tensor Cores や Intel Xe Matrix Extensions などのベンダー固有のハードウェアアクセラレータに依存しており、統一されたクロスプラットフォームシェーダインタフェースが欠けていました。これを解決するために、フレームワークは特別なベクトルおよび行列拡張——具体的には Cooperative Vector (NVIDIA) と Linear Algebra (DirectX)——を標準的な Cooperative Matrix 操作と並んで導入しました。これにより、コンピュートシェーダは単純なモデルから Neural Radiance Caching などの複雑なタスクまでを効率的に処理できるようになります。特に、新しい長ベクトルレイアウトはスレッドがブランチングを通じて独自のデータを処理できるようにし、最適化された行列レイアウトは推論乗算とトレーニング累積の区別を行いつつ、複数のディスパッチを必要としません。DirectX は関連機能を「Linear Algebra」の下で名前を変えていますが、Vulkan では Cooperative Matrix を標準拡張として維持し、Cooperative Vector を専用拡張として保持しています。この拡張されたフレームワークは現在、開発者がリアルタイム環境内で完全なトレーニングパイプラインを実行することを可能にし、以前はオフライン 전용のソリューションに限定されていた高度なマテリアル評価を促進しています。

本文

協同ベクトル:導入と簡易的歴史

2021 年、レンダリングエンジンにおけるニューラルネットワーク(NN)の活用事例を調査する取り組みを開始しました。当時は、まず「ニューラルマテリアル(NM)」というプロジェクトが成功に繋がりました。この NM は、当社が開発しているハイブリッドレンダラー内で実装され、UBO2014 由来のデータを用いて訓練されました。当初は推論(インференス)時のサポートだけであれば良かったため、NM の訓練は PyTorch を用いてオフラインで行われていました。当時の状況において、ハードウェア加速による推論をサポートするには、Vulkan 上の先行するベンダー固有のエクスパンション機能である「Cooperative Matrix」が必要でありました。そのため、当社はすべてのターゲットプラットフォームとバックエンドで展開できるよう、これらの拡張機能なしに Compute Shader(HLSL)のみを使用した独自の推論インフラストラクチャを構築しました。

時が経って 1 年が過ぎた頃、ニューラルレディアンスキャシング(NRC)から得られた印象的な成果を目にし、これには Runtime での訓練(主に幅 16, 32, または 64 の小さな)NN が必要となりました。その結果、当社のフレームワークは推論と訓練の両方のパイプラインをサポートするよう拡張されました。

Evolve Scene における NRC のキャプチャ

GPU は NN 推算を加速するための専用ハードウェアを搭載していましたが、シェーダーからこれら機能へのアクセス手段、特にクロスプラットフォームでのアクセス方法は存在しませんでした。例えば、デスクトップハードウェアにおいて各ベンダーごとの選択肢は以下の通りでした:

  • NVIDIA Tensor Cores: 当時は CUDA を通じてのみアクセス可能でした。
  • Intel Xe Matrix Extensions (XMX): ベンダー固有の機能でした。
  • AMD: 「通常の」シェーダーコアを使用する Wave Matrix Multiply Accumulate(WMMA)命令を持っていました。

上記に言及した通り、

(tiled) マトリックスに対するマトリックス演算
へのアクセスが可能である場合、ハードウェア加速を利用するための抽象化として
SPV_NV_cooperative_matrix
という Cooperative Matrix エクステンション(現在は KHR に昇格)が導入されました。このエクステンションは、バッファを行列として解釈し、それらを乗算する新しいシェーダー命令を追加しました。同様に、DirectX 側でもシャドウモデル(SM)6.8 を対象として当初計画されていた非常に類似の機能である「WaveMatrix」が提案されましたが、これはプレビュー版として公開されるものの公式リリースには至りませんでした。

NVIDIA によるニューラルマテリアルおよびニューラルテクスチャ圧縮(NTC)に関する研究の結果、Optix および Vulkan エクステンション

VK_NV_cooperative_vector
(協同ベクトル)としての機能実装が発表されました。NTC パーペラで提案されている解決策では、マテリアルの一連のテクスチャ(アルベド、法線、粗さ、金属性など)をニューラルネットワークおよび学習されたテクスチャのような表現に圧縮しています。

分岐データの課題

両者はいずれも興味深い課題を提示しました。つまり、各マテリアルが独自のネットワークを持つため、画面の隣接するピクセルが異なるテクスチャをサンプリングする状況となり、結果として異なるネットワークの評価、ひいては異なるセットの重みの評価が必要になります。これは、非分岐ワーク用に設計された Cooperative Matrix では現在まだ不可能です。

  • 事例: NM における分岐評価において、3 つのマテリアルを描画するために 3 つのネットワークが必要です。
  • 類似課題: NM でも同じ問題があり、異なるピクセルが異なる重みのセットを必要とする場合があります。

解決策:協同ベクトル

当初の実装においては、マテリアルへのクエリをバケット化し、各マテリアルごとに複数のディスパッチを実行する手法を採用しました。この解決策は理想的ではありませんが、実用上は機能します。これは手間のかかる複雑な手順ですが、理想としてはシェーダー内での単なるブランチ(分岐)として実現できるはずです。

協同ベクトルはこの課題を解決するため、Cooperative Matrix のような行列対行列(Matrix-Matrix)インタフェースから、ベクトル対行列(Vector-Matrix)操作へとインタフェースをシフトさせます。

NRC は図に示されている通り、より単純な状況でありながら、協同ベクトルからの恩恵を受けます。

  • NRC の場合、各ピクセルには異なる入力パラメータ(法線 N、視線方向 V、粗さ R、アルベド A、スペキュラー f0 S など)が含まれます。
  • NM と異なり、入力は同じネットワークに供給されるため、異なる重みや行列が不要です。
  • このシナリオは、入力行列を入力ベクトルによって構成する点において、行列対行列乗算と同様にスケジュールされるため、パフォーマンス面における協同ベクトルのベストケース(最良の状況)となります。

(画像例: 各「ピクセル」に対して異なる入力ベクトルが提供されますが、これらは単一のネットワークに供給される NRC の様子)

リーダーボードであなたのポジションを主張しましょう!


協同ベクトルとは何か?

まず用語について整理しておきます:

  • ロングベクトル(Long Vector): Dx/HLSL において、協同ベクトルまたはロングベクトルはデータ構造そのものを指します。混乱を防ぐため、今後は「ロングベクトル」という用語をデータ構造を指す際に使用します。
  • 協同ベクトル: この用語は、ロングベクトルと動作する操作およびハードウェア加速機構全般を指して用います。

「協同(Cooperative)」という名称の由来は、ハードウェア加速の実装詳細にあります。波(Wave)内のスレッドが個別に提出するベクトル対行列乗算リクエストが、波全体で共同加速される行列対行列演算として統合されます。この名前は HLSL コード自体には現れず、あくまで「ベクトル型の定義」や「ベクトル対行列乗算」といった操作のみが使用されます(以下の例に示す通り)。

それ究竟是什么なのでしょうか?

HLSL におけるロングベクトルは、ただ単にシェーダーで慣れ親しんできた usual な 4 エレメントよりもはるかに長いベクトルデータ構造なのです。それ以上のことはありません。これらは透過的なデータ構造であり、ユーザーは以下のように扱うことができます:

  • インデックスを用いて個別のエレメントを読み書きする。
  • ベクトルに対して加算、乗算、最大値演算(ReLU など)などの操作を行う。

見た目からは、これらのベクトルのレジスタは VGPR(ベクトル汎用レジスタ)として直接格納され、ハードウェア加速が利用可能であっても特殊なレジスタには格納されていないことがわかります。単一のレーン(スレッド)の観点からすると、フルサイズのロングベクトルは VGPR に格納されます。


スレッド/実行モデル

協同ベクトルとは何かが理解できましたが、これらはどこで利用可能でしょうか?

  • 現時点では、Vulkan および DirectX の両方で、すべてのシェーダーステージでアクセス可能ですが、主に Compute Shader で使用しています。
  • 分岐データをサポートするための手段を提供するという観点から、ピクセルおよび Compute Shader では、各ピクセルまたはスレッドが独自のロングベクトルを保持します。

実装上の最も一般的な方法であり、実用的に見つかった最も効率的な方法は、各スレッドに独自のロングベクトルを持たせることです。また、ロングベクトルを共有メモリアrea に格納することも可能です。

重要な注意点:

  • ロングベクトルは宣言されたインボケーション(スレッド)に属するか、共有メモリに格納されます。
  • 機能性を確保するために一意的な制御フローや完全occupied なウェーブを必要としません。
  • 反面、ユニフォームパスを使用することで、ドライバによる高速パスが利用可能となり、パフォーマンスが向上します。また、シェーダー実行順序変更(SER)などの機能がそれをサポートします。

マトリックス

マトリックスには 2 つの種類があります:

プレインレイアウト

  • Row Major(行優先)
  • Column Major(列優先)

オプティマルレイアウト

  • MulOptimal (推論向け)
  • OuterProductOptimal (訓練・蓄積向け)

シェーダー内でのアクセシビリティ

Vulkan および DirectX の両方から、バッファなどのメモリアドレスを指し示すことができるインタフェースが提供されており、これをマトリックスとして利用できます。

  1. プレインレイアウト: プレインレイアウト(行優先/列優先)の場合、データ型、マトリックスサイズ、レイアウトが既知であればエレメントにアクセス可能です。
  2. オプティマルレイアウト: しかし、オプティマルレイアウトの場合、メモリアドレスは完全に不透明です:
    • レイアウトはドライバによって定義されるため、特定のエレメントへの読み書きを行うことができません。
    • 最後に、オプティマルレイアウトではストライド(stride)をゼロにしなければなりません。これにより、ユーザーがインデキシングで各エレメントにアクセスすることは防止されます。このアプローチは、テクスチャタiling と類似した最適化手法です。

主要な違い

  • プレインレイアウトのロングベクトルおよびマトリックスは 透過的(Transparent) です。
  • オプティマルレイアウトのマトリックスは 不透明(Opaque) です。

考え方は、ユーザーがシェーダー内で自身のロングベクトルを手動で埋めるという点にあります。例えば、ウェーブ内では各スレッドが異なる UV 座標、視線方向、法線などを備えた独自のロングベクトルを保持します。これらのロングベクトルは、そのシェーダー内で直接修改してはいけません固定されたマトリックスと乗算されます。


エンタープライズオファリングについてご興味を持たれていますか? ハードウェアベンダー、スマートフォンメーカー、OEM、ボードパートナーなどに対して、最適なパフォーマンスの実現をご支援しています! お問い合わせ


評議員会メンバーシップとアート・ソースコードアクセス

ネットワークの推論と訓練

最も単純なニューラルネットワークの一つである多層パーセプトロン(MLP)は、線形レイヤーと活性化関数のシーケンスとして構築されます。各レイヤーの計算は、単一の行列対行列またはベクトル対行列演算、バイアスの加算、そして ReLU などの活性化関数の適用によって実行できます。

推論

1 レイヤーの実行:$x$ は入力ベクトル、$\theta$ は重み行列、$b$ はバイアス、$h$ は活性化後の結果を表します。推論では、重み行列に対して行優先/列優先レイアウトまたは MulOptimal(推論オプティマル)のいずれかを使用できます。当然ながら、過半数のケースではマルチプライ最適レイアウトの方が高速であるため推奨されます。実験では、小型マトリックスであっても有意な違いが確認されました。

MulOptimal マトリックスの埋め方: MulOptimal マトリックスに正しいデータを埋めるためには、まずデータを行優先/列優先レイアウトに書き込み、その後行列変換によってオプティマルレイアウトに変換する必要があります。ここで注意すべきは、

ID3D12Device::GetLinearAlgebraMatrixConversionDestinationInfo
を使用してオプティマルレイアウトのマトリックスを割り当てる前に、CPU 側で宛先のサイズをクエリしなければならない点です。これは、サイズが実装依存(ベンダー、ドライバなど)であり、予想より多くのメモリを必要とする可能性があるためです。このクエリと割り当てが行われれば、
ID3D12GraphicsCommandList::ConvertLinearAlgebraMatrix
を用いて変換を実行できます。

  • 注: この変換は本質的に、データをハードウェアが好むフォーマットに並べ替えるコピー操作です。

推論は MatMul(または MatrixVectorMul)、あるいは MatMulAdd によって行われます。後者はバイアスとして別のロングベクトル(Dx 側)またはマトリックス(Vulkan 側)を受け入れます。

訓練

ネットワーク最適化のための勾配計算。単一レイヤーの訓練には、入力に関する勾配 ($\nabla x$)、重みに関する勾配 ($\nabla \theta$)、およびバイアスに関する勾配(オプション:$\nabla b$)の 3 つを計算する必要があります。レイヤー出力 $h$ に関する損失関数の勾配 $\nabla h$ を計算した後、これを後方伝播させ、協同ベクトルを用いて以下の勾配を計算できます:

  1. 入力に関する勾配 ($\nabla x$):

    • これには、 incoming グラデーション $\nabla h$ を転置した重み行列 $\theta^T$ で乗算する処理が必要です。
    • 幸运的是、MatMul 演算は MulOptimal(推論オプティマル)レイアウトに対して転置フラグをサポートしているため、重みの別個の転置コピーを保持する必要はありません。
  2. 重みに関する勾配 ($\nabla \theta$):

    • これは $\nabla h$ と入力 $x$ の外積(outer product)として計算できます。
    • ここで
      OuterProductAccumulate
      が用いられ、バッチ全体にわたって勾配を蓄積します。ここでいう各バッチ行は協同ベクトルです。
    • これを行列乗算でも計算可能ですが(一部のシナリオではより効率的である可能性もある)、今回は協同ベクトルが提供するすべての機能を活用することに焦点を当てています。
  3. バイアスに関する勾配 ($\nabla b$):

    • バイアスが存在する場合、その勾配はサンプル全体にわたって蓄積された $\nabla h$ に等しくなります。
    • これには
      VectorAccumulate
      を用いた協同ベクトルを使用でき、これは単純な原子性加算操作です。

OuterProductOptimal レイアウト: もう一つのオプティマルレイアウトである OuterProductOptimal(訓練または外積オプティマル)は、本来行優先/列優先からオプティマルへの明示的な変換を必要としません。これは通常、重みの勾配を格納するために使用されるためです。一方、このレイアウトを使用する場合、最終的に OuterProductOptimal から読みやすいいわゆる行優先/列優先レイアウトに勾配を変換する必要があるでしょう。

OuterProductOptimal
OuterProductAccumulate
関数(Vulkan 版は
coopVecOuterProductAccumulateNV
)と併用されます。これは 2 つのベクトルを受け取り、外積を計算してマトリックスを生成します。このマトリックスは、ターゲットマトリックスに蓄積され、このターゲットマトリックスは OuterProductOptimal レイアウトでなければならない のです。

  • この操作は本質的に原子性加算/蓄積であり、各エレメントがターゲットマトリックスの対応するエレメントに対して原子性地追加されます。
  • 訓練データセット内のすべてのバッチについてこれを完了した後、OuterProductOptimal から読みやすいレイアウト(行優先/列優先など)への変換操作を行ってデータをコピーして移動することができます。

マトリックスレイアウト変換パイプライン

残された課題は、学習率を掛け合わせた勾配を加算し、前の重み(行優先/列優先)を更新することです。注意すべきは、この行列対行列演算は現時点では協同ベクトル内部機能では不可能であるということです:

  • 行列対行列操作へのサポートは、DirectX の将来のリリースで計画されています。
  • Vulkan 側にはこれに似た Cooperative Matrix という機能が存在しますが(現時点ではオプティマルレイアウトや協同/ロングベクトルと互換性がなかったようです)。

現在は、これを CPU でまたは通常のシェーダーコードで処理する必要があります。これが行優先/列優先レイアウトに移られた後、推論時に使用できるように再度 MulOptimal への変換を行うことができます。


API 変更に関する注記

  • DirectX: Cooperative Vector プロポーザルを撤退し、代わりに異なる名称「Linear Algebra」の下にこれらの機能を統合して実装する方針に変更されました。「Linear Algebra」は協同ベクトルと協同行列を組み合わせたものです。この記事で議論された内容自体は、Linear Algebra 導入後も基本的に有効ですが、API や名称がやや異なっている点にご注意ください。
  • Vulkan: Cooperative Matrix が KHR に昇格しましたが、Cooperative Vector は引き続き NVIDIA 独自エクステンションです。

アドバンストベンチマッキング

同じ日のほかのニュース

一覧に戻る →

2026/04/13 4:44

怠惰と失われた危機の罠

## Japanese Translation: テキストは、ラリー・ウォールのプログラミングにおける「怠け」、不満、そして大それた振る舞いの美徳が依然として不可欠であると論じつつ、特に未来の利用に最適化された単純かつ強力な抽象化を駆使する「怠け」においてはその重要性が高いと指摘しています。これに対して、大規模言語モデル(LLM)は危険に「徳ある怠け」を、「 Hustle Porn」と呼ばれる偽の勤勉で置き換えてしまいました。人間とは異なり、LLM は作業に対してコストを負担せず、時間制約も無視するため、自慢のためのメトリクスによってではなくエンジニアリングの厳密さによってではない、不要なコードの層を蓄積します。この転換は、「Camel Book」という歴史的智慧において、即時の出力量よりも使いやすさを重視する方針と対照付けられます。具体例として、LLM を用いて 1 日 37,000 行ものコードを書き上げたというブロプログラマの Garry Tan の自慢に対し、Gregorein の分析によって多数のテストハネスとゼロバイトのロゴが示されており、これは無制約な AI が肥大化したシステムを生成する様子を明らかにしています。もし無制約のままにされれば、LLM は「ゴミ」の層を積み重ねることで単純な設計ではなく技術的負債の形で未来の世代を脅かすことになります。しかし、業界の行方はエンジニアがこれらの AI モデルを徳ある怠けの方へ導けるかに依存しています。制約と Oxide ガイドラインに導かれ、LLM が複雑性を削減し、厳密な設計を促進して将来に向けてより単純かつ強力なソフトウェア抽象化をもたらすことを保証することが可能です。 ## Text to translate: The text argues that while Larry Wall's programming virtues of laziness, impatience, and hubris remain essential—especially laziness, which drives simple, powerful abstractions optimized for future use—Large Language Models (LLMs) have dangerously displaced "virtuous laziness" with a form of false industry called "hustle porn." Unlike humans, LLMs incur no cost for work and ignore time constraints, causing them to accumulate unnecessary code layers driven by vanity metrics rather than engineering rigor. The summary contrasts this shift with historical wisdom found in the "Camel Book," which prioritizes ease of use over immediate output volume. Examples include broprogrammer Garry Tan bragging about writing thirty-seven thousand lines of code per day with LLMs, while Gregorein's analysis revealed multiple test harnesses and a zero-byte logo, illustrating how unchecked AI generates bloated systems. If left unconstrained, LLMs will threaten future generations with technical debt by building up "garbage" layers rather than simpler designs. However, the industry's trajectory depends on whether engineers can steer these AI models back toward serving virtuous laziness; guided by constraints and Oxide guidelines, we can ensure LLMs reduce complexity and promote rigorous design to yield simpler and more powerful software abstractions for the future.

2026/04/12 21:21

慣用表現に基づくデザインを取り戻そう

## Japanese Translation: 現代の Web アプリケーションは、デスクトップ時代の統一的なインターフェース標準を捨てて、基本的なタスクを第一原理から再発明し、リアルタイムコラボレーションなどの機能に優先順位を置いている。この変化により、ユーザーはチェックボックスによるログイン永続化や標準的なクレジットカード入力フィールドといった馴染み深い「デザイン慣習」に頼るのではなく、新たな相互作用パターンを絶えず学ぶことを余儀なくされている。Figma や Linear などのツールは設計が良くても、共有アイコンやキーボードショートカットの欠如により断片的な体験をもたらしており、OS によって強制されたライブラリによる予測可能な動作を保証した Windows 時代の均質なインターフェースとは対照的である。この増大するユーザー摩擦に対処するためには、HTML と CSS で定義されるコアなブラウザ慣習に回帰すべきであり、開発者はあいまいなアイコンよりも一貫したアクション、信頼できるデフォルト値、明瞭なテキストラベルを優先することで、予測可能性を取り戻し、ユーザーの学習時間を短縮し、UI 標準の全面的な再発明なしにも Web エコシステムへの信頼を再構築できる。

2026/04/13 1:38

# DIY ソフトドリンクの作り方 「DIY ソフトドリンク」というタイトルは適切ですが、コンテンツをさらに充実させるための構成案をご提案します。 ご自身の手に入れた素材や好みの味に合わせて自由にアレンジしてみてください。 --- ## 【必要なもの】 * 炭酸水(またはレモンサワーベースのシロップ) * シュガーシロップ(または蜂蜜、アガベシロップなど) * お好みの果実(レモン、ライム、オレンジなど) * 氷 * ガラス瓶またはペットボトル(中性洗剤で十分に洗浄したものですこと) ## 【基本レシピ】 1. **シロップの調製** 砂糖と水(甘さを抑えたい場合は 2:1 の割合、通常は 1:1)を鍋に入れて、弱火で溶かします。 お好みの果実を加えて香りを出したら、冷まします。 2. **果汁の絞り方** 新鮮な果実をよく洗い、果汁を搾ります。 必要であれば、果肉も一緒に漉すなどして、澄んだ液体に仕上げてください。 3. **混ぜ合わせ** シロップと果汁をお好みの比率で混合します(例:シロップ 2 :果汁 1)。 グラスや容器に移し替えて、冷蔵庫で保存してください。 4. **炭酸水とのミックス** 氷を入れたグラスに、少量の自家製果汁シロップを入れてから、炭酸水を注ぎます。 スパチュラなどで軽く混ぜ合わせれば完成です。 ## 【ポイント】 * 甘さは控えめが基本ですが、お好みで砂糖の量を調整してください。 * 新鮮な果実を使うことで、より自然な香りを堪能できます。 * 保存期間は冷蔵庫に置いても 2〜3 日が目安です。

## Japanese Translation: 本稿は、糖分・カフェインフリーで正確な自家製コーラレシピを開発する革新的なプロジェクトを記録しています。2020 年以降、著者は Open Cola や Cube Cola などのブランドに着想を得て、オレンジ、ライム、レモン、ナツメグ、シナモン(クサヤ)、コリアンダー、ラベンダーといったエッセンシャルオイルとアラビアゴム(天然の乳化剤)を主成分とする配合を開発しました。計測には 1 ml のインシュリンペン用シリンジを用い、科学的手法で精細な定量を実現しました。安全性も重視し、刺激性のあるエッセンシャルオイルを扱う際にはラテックス手袋を着用するなどの対策講行了されました。レシピは個人のかぶれやすさや感度に合わせて調整され、カフェインが省略され、クエン酸と人工甘味料(当初はナトリウムシклаマートとサッカリンで 1:8 の希釈比、後に「Syntez-Cola」バージョンではスクラロースとバニリン)を使用しています。一部のロットでは若干の苦みが残る事例もありました。さらに、血橙、ライム、アーモンド油によるアルモンド風味のドリンク(マザパンのようなニュアンスを持つものも)などの追加作品も作成されました。実用的な課題として、ハンドミキサー由来のプラスチックのカスを濾し取ることや、ガラス製または金属製の容器の利用が検討されました。著者は自家製コーラをデカフェ Coca-Cola より優れていると評価しており、「味が薄い」と述べています。レシピバージョンは記録されており(例:blinry orange 0.1.1、blinry almond 0.1.1 など)、2026 年には Open Soda のウェブサイトが閉鎖された後、プロジェクトは新ブログと Git リポジトリを通じた詳細な変更ログやバージョニングされた配合を公開する透明性の高いデジタルリソースへと進化しました。このイニシアチブは、趣味家のための再現性のあるレシピや、ダイエットに意識的な消費者のための高度な炭酸飲料(スーパーマーケットの標準品にはない独自の風味プロファイルを備えたもの)を提供します。