Nvidia、RubinアーキテクチャとPTX 9.4の分析プレビューを公開
本文の状態
日本語全文を表示中
詳細モードで約25分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
zartbot
Nvidia は Rubin 架构を発表し、I/O Die の独立化により SM 数を 224 に増やし、Tensor Core の K 次元処理能力を倍増させることで、Agentic AI エラのための計算性能を大幅に向上させた。
AI深層分析を開く2026年8月1日 02:17
AI深層分析
キーポイント
チップレイアウトの抜本的変更
PCIe/NVLink/NVLinkC2C を独立した I/O Die として分離し、NV-HBI で統合することで主計算 Die の面積を確保し、SM 数を 160 から 224 へ 50% 増加させた。
Tensor Core の処理能力倍増
Tensor Core が K 次元で処理可能なデータ量を倍増させる設計変更により、単一 SM あたりのスループットが向上し、dense NVFP4 で約 2.33 倍の性能を発揮する。
Blackwell の課題解消
Blackwell 時代の SFU(特殊機能ユニット)のボトルネックや Epilogue 処理の遅延といった問題に対し、Rubin では SFU 性能の強化と新しい Thread Block Level Dependency Launch により対応した。
メモリ帯域の大幅拡張
HBM バンド幅が Blackwell の 8 TB/s から Rubin では 22 TB/s に引き上げられ、大規模モデルや Agentic AI ワークロードへの対応力を高めた。
Rubin 架构性能提升推定
SM 数量と周波数の上昇により、NVFP4 と FP8 の TensorCore 性能がそれぞれ約 1.66 倍と 2.5 倍向上し、BF16 性能は B300 から 1.78 倍に達すると推測される。
重要な引用
Rubin 将 Tensor Core 在 K 维度上可处理的数据量翻倍,使每个时钟周期的 Tensor Core 吞吐量翻倍
I/O Die の移出估计能够提供额外 20% 左右的芯片面积用于放置 SM
「SFU の性能は、MoE の Expert SwiGLU 活性化計算時などにおいて Epilogue が GEMM と十分にオーバーラップしないボトルネックとなるため、削減できない」という考えに基づき、Rubin でさらに倍増した。
「Attention 計算では Dense 方式で中間スコアを生成し、それを TMEM から構造化された 2:4 スパース形式として読み込むことで、書き戻しコストとストレージ要件を削減する。」
編集コメントを表示
編集コメント
Rubin 架构は Blackwell の反省点を踏まえた設計であり、特に I/O Die の分離による SM 数の増加と Tensor Core の K 次元処理能力向上が注目される。これは Agentic AI という新たなワークロードに対応するための明確な技術的転換点と言える。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。
Nvidia Rubin アーキテクチャ分析のプレビュー
要約
Nvidia は最近、Rubin アーキテクチャに関する資料『Inside NVIDIA Rubin GPU Architecture: Powering the Era of Agentic AI』[1] と、対応する PTX 9.4 命令セットのプレビュー版『PTX 9.4』[2] を公開しました。これらを踏まえて簡単な分析を行います。
マイクロアーキテクチャの番号を見ると、Rubin は Blackwell の SM100 ファミリーの特徴をほぼ踏襲しています。例えば Tensor Core も引き続き tcgen05 アーキテクチャです。しかし、多くの細部設計において大幅な改善が図られています。
昨年の記事『Inside Nvidia GPU: 谈谈 Blackwell の不足并预测一下 Rubin の微架构』では、Blackwell アーキテクチャへの批判を展開しました。その内容は黄仁勳氏(ジェンソン・フアン)自身も社内で共有したものです。Rubin が発表されたことで、これらの指摘に対する細部での改善がほぼ完了しています。具体的には SFU の性能向上や、新しい Thread Block Level Dependency Launch 機能などが挙げられます。これらについて詳しく分析していきましょう。
海外の読者にも読みやすいよう、英語版を GitHub にアップロードしました:https://github.com/zartbot/blog/issues/11。今回は罵倒ではなく称賛です。黄仁勳氏、この度は転送してくださるでしょうか?
- チップアーキテクチャの概要
1.1 SM 数の変化
Blackwell シリーズでは、チップあたり 80 個の SM(Streaming Multiprocessor)を搭載し、合計で 160 個となっています。しかし B200 の時代には、SFU(Scalar Function Unit)のボトルネックが顕在化しました。これにより、Attention や MoE(Mixture of Experts)の活性化計算における Epilogue プロセスが極端に遅延する問題が発生したのです。
そこで B300 では、一部の高精度な演算能力を削ぎ落とすことで SFU の性能を 2 倍に引き上げました。それでもなお、MoE 内の活性化関数計算などでは SFU の処理能力が不足するケースが残っていました。
Blackwell のチップレイアウトを振り返ると、すでにスペースの余裕は限られていたことがわかります。B300 では機能の一部を削ぐことで演算能力を確保せざるを得ませんでした。
一方、Rubin の時代には SM 数が 50%増加し、160 から 224 へと拡大されました。この拡張はどのように実現されたのでしょうか?また、どのような取舍(トレードオフ)が行われたのかを解説します。
最も顕著な変化の一つは、PCIe/NVLink/NVLinkC2C を独立した I/O Die として構成し、NV-HBI で統合封止した点です。これにより、メインの計算用 Die に SM(ストリームプロセッサ)をより多く配置するための面積が確保されます。I/O Die を外部に分離することで、SM の設置に約 20% の追加チップ面積を提供できると推定されています。
ただし、SFU(特殊機能ユニット)数の増加を考慮すると、他にも面積に関するトレードオフが存在する可能性があります。例えば、個々の SM 内部の実装変更や L2 キャッシュサイズの調整などが考えられますが、これらは Rubin を実際に動作させてテストを行ってみなければ分かりません。
1.2 Tensor Core の性能
全体の性能比較は以下の通りです。
| プロジェクト | sm_103 Blackwell Ultra | sm_107 Rubin |
|---|---|---|
| SM | 160 | 224 |
| Tensor Core | 640 | 896 |
| 1 SM あたりの Tensor Core | 4 | 4 |
| dense NVFP4 | 15 PFLOPS | 35 PFLOPS |
| dense FP8 | 5 PFLOPS | 17.5 PFLOPS |
| HBM バンド幅 | 8 TB/s | 22 TB/s |
前節の紹介から分かる通り、Rubin は Tensor Core の数だけで見れば 896/640 = 1.4 倍の性能向上を示しています。しかし、公式発表によると、整卡(カード全体)としての dense NVFP4 ピーク性能は約 35/15 = 2.33 倍、dense FP8 では約 17.5/5 = 3.5 倍となっています。
これは、Rubin が Tensor Core の K 次元で処理可能なデータ量を倍増させることで、1 クロックあたりの Tensor Core スループットを倍にした結果です。
image
image
SM(Streaming Multiprocessor)の数を 1.4 倍に増やす効果を除いて計算すると、TensorCore の性能向上は NVFP4 で約 1.66 倍(2.33/1.4)、FP8 では約 2.5 倍(3.5/1.4)となります。さらに K 次元の 2 倍という要因も除外すれば、チップ全体のクロック周波数が約 25% 向上したと推測できます。これを裏付けるのが BF16 の性能です。K 次元は変化せず、B300 の 2.25 PFLOPs から Rubin では 4 PFLOPs に向上しています。SM 数の増加(1.4 倍)を考慮して計算すると、クロック周波数は 4/2.25/1.4 ≒ 1.27 倍、つまり約 25% の向上であることがほぼ確定します。
ただし、NVFP4 の性能向上幅が相対的に小さい点には注意が必要です。B300 の SM_103 ではすでに密集(dense)な K=96 が採用されていましたが、Rubin ではこれが K=128 に引き上げられています。K 次元の増加は約 1.3 倍であり、これに SM 数の増加とクロック周波数の向上を合わせると、データは整合性が取れます。
では、実際のカーネル処理でどれほどの性能向上が得られるのでしょうか?
実運用におけるパフォーマンス向上を見積もる際は、他のサブシステムの制約も考慮する必要があります。例えば、GEMM(行列乗算)が HBM 帯域、通信、あるいはエピローグ処理にボトルネックとなっている場合や、TMA/共有メモリのパイプラインから十分なデータ供給が得られない場合、K が非常に小さいケースなどが挙げられます。
具体的には K_total=160 の場合、K=64 では 192 をカバーする必要があり利用率は 83.3% ですが、K=128 では 256 をカバーする必要が生じ、利用率は 62.5% に低下します。
SFU 性能の 1.3 倍向上
昨年の Blackwell 架构分析ドキュメントでは、SFU(特殊機能ユニット)の性能がボトルネックとなるケースについて言及しました。B300 シリーズでも SFU の性能は 2 倍に強化されていましたが、MoE(Mixture of Experts)における Expert の SwiGLU 活性化計算など、特定のシナリオでは依然としてボトルネックが発生し、エピローグ処理が GEMM と十分にオーバーラップできない状況が生じていました。
Rubin ではさらに SFU の性能を倍増させています。
根本原因在于,在文章《大模型时代的数学基础 (9)- SDPA 和最优传输、强化学习及信息几何的联系》中曾论述过:从最优传输(Optimal Transport)的视角来看,SDPA(Scaled Dot-Product Attention)的计算是最优的。因此,Softmax 运算在很大程度上是不可避免的。相比之下,MoE 架构中的 Expert SwiGLU 激活函数倒是有替代方案。正因如此,去年在与 NVIDIA 的交流中,我的立场一直是:SFU(Streaming Multiprocessor Feature Unit)的功能绝不能削减。
在 Rubin 这一代架构中,SFU 的性能再次实现翻倍,正好与 TensorCore 的算力提升相匹配。不过,预计在实际运行中,Epilogue(后处理)阶段仍会出现一定的性能空泡。
1.4 Attention Sparse 处理
由于 SFU 存在某些瓶颈,NVIDIA 在官方博客中提出了一种新的解决方案。尽管稀疏 GEMM(General Matrix Multiplication)的概念在过去几年里一直被提及,但实际效果一直有限。这一次,Rubin 架构通过将激活稀疏化(activation sparsity)、自适应压缩以及改进的 Softmax 吞吐量相结合,实现了注意力机制的加速。
根据 Rubin 官方文章的描述,其 Attention 处理路径非常具体:在计算阶段,仍以稠密(Dense)方式执行,生成中间的注意力分数。随后,Rubin 可以将这些中间数据从 Tensor Memory(TMEM)加载为结构化的 2:4 稀疏压缩形式,同时生成非零值及其高效利用所需的元数据。这一机制有效降低了分数写回的成本与存储需求。这使得后续的注意力阶段可以在更少的数据上进行运算,同时保持模型其余部分所期望的稠密输出格式。
结合新的 PTX 9.4 指令集文档,我们来详细拆解这一过程:
第一段 GEMM(QK)仍以稠密方式执行,Accumulator(累加器)在 TMEM 中保持为稠密的 Score 矩阵。随后,使用 tcgen05.ld.red.spcompress 指令对全部稠密分数进行稀疏加载的逻辑检查与压缩。
这种方式直接减少了以下三方面的开销:
- 从 TMEM 加载到普通寄存器的数据量;
- 后续保留值的指数运算(exponent)和归一化(normalization)工作量;
- 完成预存储(staging)后的稀疏 P x V 乘加数量。
那么,tcgen05.ld.red.spcompress 指令具体做了什么?
この命令は f32 を固定処理し、b2 メタデータを使用します。また、2:4 スパース選択をサポートし、ベクトル幅は .x4 から .x128 まで対応可能です。通常のバージョンでは cdata と mdata を出力しますが、red バージョンには redval も追加されます。
この仕組みにより、レジスタにロードされる nonzero の数は半分になりますが、レジスタのフットプリントが厳密に 50% になるわけではありません。短いベクトルではメタデータのオーバーヘッドが目立ちますが、長いベクトルではレジスタのピーク値とライブレンジが増加します。そのため、.x128 が常に .x32 より優れているとは限りません。
さらに注目すべき点は、.red 命令が単一の TMEM ロードで局所的な最小値または最大値を返せることです。Softmax の場合、最も自然な組み合わせは「rowop::max」です。これは 4 つの logits から数値が大きい上位 2 つを残しつつ、フラグメントごとの局所最大值を生成する処理です。
ただし、これだけでは完全な Softmax 指令にはなりません。ソフトウェア側で以下の処理も実行する必要があります。
- フラグメント、ワープ、または CTA を跨いで row max を統合する。
- 残された値に対して
ex2.approx((x - max) * log2(e))を計算する。 - row sum とその逆数(reciprocal)を算出する。
- オンライン Softmax で、タイルを跨ぐランニング最大値とランニング和を維持する。
- 確率値を変換し、スパース MMA が消費できる形式に再配置する。
しかし、別の重要な問題もあります。ld.spcompress は f32 の cdata と b2 の mdata を通常のレジスタに格納しますが、tcgen05.mma.sp ではスパース A 演算子が shared-memory デスクリプタまたは TMEM から来る必要があり、メタデータ演算子も TMEM アドレスを要求します。このため、無視できない中間のステージングギャップが存在します。
f32 logits → スパース Softmax 確率 → データ型変換 → MMA A レイアウト再パック → メタデータレイアウト再パック → shared/TMEM へのストア → 完了待ち → tcgen05.mma.sp
指数の削減、正規化、スパース PV に要する時間が、変換とステージングのコストを上回る場合のみ、エンドツーエンドでの加速が実現します。一方で、logits が非常に鋭い(尖っている)場合、上位 2 つの値ですでに確率質量の大部分をカバーしている可能性があります。逆に logits が平坦な場合、50% の要素を削除すると分布が大きく変化してしまいます。そのため、性能テストでは必ず Attention モデルへの精度影響についても報告する必要があります。
結論として、「このアルゴリズムを使えば Attention の性能が 2 倍になる」と単純に言うことはできません。Sparse 処理は CUDA Core 内でも追加の計算量を生みますが、SFU(特殊機能ユニット)のボトルネックを大幅に軽減しています。最終的な効果の大きさは、Attention の精度への影響次第です。その有用性については、現時点では懐疑的であるべきでしょう。
- ソフトウェア機能
PTX 9.3 と PTX 9.4 を比較し、Rubin の SM_107 で追加された機能について分析しました。
新指令与复合变体如下表所示:
既有指令的新类型、限定词与目标覆盖范围:
2.1 Kernel 调度
去年在分析 Blackwell 架构时,我就指出了其调度机制存在诸多问题:GPU 需要高效地在不同 kernel(内核)之间切换。这一点在推理过程中尤为关键,因为激活值往往位于生成的关键路径上——一个 kernel 负责生成激活数据并写入显存,紧接着的下一个 kernel 则需消费这些数据以继续生成下一个 token。
传统的生产者 - 消费者执行模式会在 GPU 的时间线上造成“气泡”(空闲等待)。生产者 kernel 可能提前完成了部分 tile 或线程块的任务,但消费者往往要等到更大范围的依赖关系解除后才能开始有效工作。Blackwell 引入的可编程依赖启动(Programmatic Dependent Launch, PDL)通过允许消费者 kernel 更早推进来改善这一状况,但在所需激活数据就绪之前,依赖任务仍可能陷入停滞。
因此,我在去年的文章中曾建议需要更细粒度的调度能力,而 Rubin 架构正是实现了基于 Thread Block(线程块)级别的数据依赖调度:
这一改进很好地解决了我对 Blackwell 架构缺陷的担忧。实际上,采用这种依赖调度机制后,我们或许无需再专门构建 MegaKernel(超大内核)框架,直接利用原生依赖即可满足需求。
具体软件实现
PTX 9.4 のドキュメントを確認しましたが、Grid Scheduling や Tile publication に関する命令は見つかりませんでした。つまり、Nvidia はこの機能の実装において、データ依存関係のみを公開し、完全なスケジューラーの内部実装は非公開のままにしている可能性があります。
私の個人的な推測では、後続のコンシューマー Kernel がスケジューラーレベルで同時に起動可能になるものの、SM 内でのレジスタや ICache の使用量は最小限に抑えられるでしょう。一方、プロデューサー側の Kernel では、ThreadBlock 間で SMEM または GMEM に共有フラグやバリアを設け、ある ThreadBlock が完了した時点で st.release セマンティクスを使ってそのバリアを解放します。
コンシューマー Kernel の ThreadBlock は事前に ICache に短いポーリングループコードを読み込んでおき、ld.acquire でフラグまたはバリアを確認します。準備が整っていない場合は単純に nanosleep を実行し、完了したら分岐してループを抜けます。
これは純粋なソフトウェアによる実装であり、Blackwell アーキテクチャでも可能でしょう。理想的にはハードウェアのスケジューラー側で処理を行い、mbarrier のハードウェア機能を再利用することで、コンシューマー側の ThreadBlock がポーリングを行う必要をなくせるはずです。
2.2 MoE 関連の最適化
2.2.1 TMA
公式ブログでは、TMA を使用して複数のエクスパート重み間でデータをロードするケースが紹介されています。image
実際に対応する命令セットは、TMA copy における override::global_address や .override_attribute です。MoE のエクスパートテンソルでは、レイアウトが共通でベースアドレスのみが異なるケースが多いためです。
従来のアプローチでは、各エクスパートごとに記述子(descriptor)を維持するか、ソフトウェア側で頻繁に記述子をパッチ適用する必要がありました。一方、Rubin アーキテクチャでは、共有テンソルマップを 1 つ保持し、TMA 命令実行時に以下の項目を上書きします。
- グローバルベースアドレス
- グローバル次元情報
- グローバルストライド
ルーティング側は現在のエクスパートに対応するランタイムフィールドのみを提供すればよく、TMA がテンソルのアドレッシング、コピー、mbarrier 完了の管理を担います。これにより得られるメリットは以下の通りです。
- 記述子の保存領域削減
- パッチ適用やプロキシフェンスの減少
- メタデータ転送量の低減
- Persistent Kernel における動的エクスパートスケジューリングへの適応性向上
2.2.2 Applypriority
キャッシュライフサイクル管理の活用方法として、MoE(Mixture of Experts)のエキスパートパラメータのように、複数のトークンで繰り返し読み込まれるホットデータに対しては、「evict_last」というキャッシュヒントを設定し、複数の計算段階で再利用することでキャッシュヒット率を向上させることができます。処理が完了したら「applypriority」を呼び出してキャッシュヒント戦略を「evict_normal」に変更します。Rubin アーキテクチャではこの機能が追加されています。
image 大まかな動作は以下の通りです。
image 例えば、ルーティング処理でエキスパート 3 が選択され処理が行われる際、エキスパート 3 の重みに対して「evict_last」戦略を適用します。これにより、複数のトークンを同時に処理できます。その後、ルーティングがエキスパート 7 に切り替わり、かつエキスパート 3 の Last-use(最終使用)が完了した時点で、「applypriority(Expert 3 range)」を呼び出して設定を「evict_normal」に変更し、エキスパート 7 がより多くの有効な L2 キャパシティを獲得できるようにします。
この戦略は MoE のエキスパート重みだけでなく、マルチステージの GEMM や Fused Kernel、さらには Sliding-window Attention や KV キャッシュのライフサイクル管理においても非常に有用です。一般的な実装パターンとして、「applypriority.async.bulk.tensor」を用いて tensorMap とテンソル座標から全体のテンソルタイルのフットプリントを計算する手法があります。典型的な組み合わせは以下の通りです。
- 共有される tensorMap の設定
- TMA ランタイムのオーバーライドで現在のエキスパートベースを選択
- TMA によるエキスパートタイルのロード
- Tensor Core での再利用
- 同じフットプリントを持つデータに対して「applypriority」を適用し、設定を normal2.3 に復元
推理処理を単一の GPU から全体のアレイシステムへ拡張する際、通信が性能のボトルネックとなる重要な経路となります。通信機能を GPU カーネル内部に直接統合すれば、カーネルは計算を中断して CPU に制御権を返す必要がありません。計算が進行している最中に、NVLink を介して他の GPU へ直接データを書き込んだり、集約処理を実行したりできます。
従来の GPU 間通信では、有効なペイロードデータの転送に加え、協調と同期のための追加ステップが必要でした。これらの手順は遅延を増加させ、特に分散型推論負荷で通信が頻繁に発生する状況では、相互接続帯域を圧迫します。
Rubin アーキテクチャでは、デバイス起動型の NVLink 通信に「カウント書き込み (counted writes)」機能を導入しました。これにより、受信側 GPU は転送完了状況をより効率的に追跡でき、GPU 間でのデータ転送同期が簡素化されます。
image通信方式の比較図:Blackwell ではメモリバリア、アウェアネス(確認)、原子フラグを使用しますが、Rubin は受信 GPU がデータをロードする前にカウンター更新を採用しています。
カウント書き込みをサポートした NVLink 融合通信は、GPU 間でのデータ転送を調整するための低遅延メカニズムを提供し、計算が同期操作の完了を待たずに継続して進捗できるよう支援します。
実際、スケールアウトネットワークにおいては、2023 年頃にはすでに同様の機能を実装していました。受信側でカウンターを更新することで、往復時間 (RTT) を 1 つ節約できる仕組みです。技術的に難しいものではなく、再び NVIDIA よりも 3 年先を行く結果となりました。具体的な実装では、PTX インストラクションの fabric.try_put.async.counted::bytes や fabric.try_red.async.counted::bytes を採用しました。
PTX の fabric インストラクションは、GPU カーネルから跨 GPU での PUT 操作やリダクション処理を直接開始できます。カウント形式 (counted form) を用いると、リモート側のカウンターが「宛先でアクセスされたバイト数」に応じて自動的に累積されます。受信側はこのカウンターをポーリングして、対象データのアクセスが期待通りのバイト数に達したことを確認した後、データを消費します。これにより、独立したメモリバリア、アウェアネス(確認)、および原子フラグによる調整処理を削減できます。
もう一つの重要な事実として、カウント形式の fabric 構文はすでに PTX 9.3 で利用可能であり、最低ターゲットは sm_100+ です。つまり Blackwell アーキテクチャでもサポートされるはずです。実際にテストできるカードがいつ入手できるかは不明ですが、理論的には可能です。
2.4 Tcgen05 LUT
低ビット数のインデックスを Tensor Core の B 演算子 (B operand) に変換する機能
「tcgen05.mma.decompress::lut::b」という名前は誤解を招きやすいものです。これは任意の関数を照会できる汎用的な LUT(ルックアップテーブル)ではなく、非常に特定の「ローカルコードブック圧縮解除」を行う機能です。
B 演算子は 3 ビットのインデックスを保持します。各ローカルグループには 8 つの E4M3 形式の候補値が用意されており、MMA(マルチメディアアクセラレータ)は内部でこのインデックスを使って候補値を選択し、B の値を復元します。また、B コレクター機能により、復元された B タイルを複数の MMA 演算間で共有・再利用することが可能です。
- その他の課題
3.1 ピーク電力の管理
AI 負荷中は電力需要が激しく変動し、瞬時のスパイクが発生します。これにより利用可能な容量が遊んでしまい、ファクトリー全体のスループットが低下する恐れがあります。Vera Rubin の電源システムは、荷電状態(SoC)に基づくインテリジェントな電力平滑化技術を採用しています。この新技術により、前世代の平滑化手法と比較して平均消費電力を約 10% 削減し、50 ミリ秒以内のピーク電力を約 20% 抑制できます。より滑らかな電力カーブを実現することで、システムは継続的な最大電力需要を下げることができ、これにより周辺供电インフラやグリッドへの負担を軽減しつつ、同じ AI ファクトリーの消費電力予算内でさらに多くの計算リソースを搭載できるようになります。
AI ファクトリーレベルでは、NVIDIA DSX MaxLPS がこの手法を GPU 間やラック間、45°C の液冷システム、そして多様な負荷にまで拡張しています。一方、DSX OS はスケジューリング、ライフサイクル管理、健康状態の自動化といった運用層を提供します。これら 2 つは協調して設計されており、遊んでいる電力を回収し、固定されたメガワット規模の範囲内で有効な計算能力を増やすことを目指しています。DSX MaxLPS を導入することで、運用者は負荷性能への影響を最小限に抑えつつ、同じ消費電力予算で最大 40% の追加 GPU を高効率な動作点で展開することが可能になります。
具体的な実装については、実は私が少年時代に父親と共に高低圧配電設備の製作に関わっていた経験があります。その手法は概ねシンプルです。
- ラック内のコンデンサがサブ秒レベルの電力スパイクを吸収します。
- Rack power steering(ラック電源ステアリング)により、CPU、GPU、NVLink スイッチの間で動的に電力予算を移動させます。
- DSX MaxLPS はワークロード、テレメトリデータ、冷却状況、そしてファクトリー全体の電力上限に基づいて、GPU の電力制限とタスクリソースを再配分します。
一言付け加えるなら、Blackwell の電力制御は実際には非常に不十分でした。先日 B 系列 GPU の逆アセンブリ解析を行った際、特に MegaMoE のようなハードウェアを極限まで駆使する演算子に対してテストを実施した結果がそれを物語っています。
8 枚の B300 を EP8 モードで接続し、V4-Pro 構成(エクスパート数 384、トップ 6、隠れ層サイズ 7168、中間層サイズ 3072)とした場合の降頻分析は以下の表の通りです。
さらに、いくつかの消費電力に関するアボレーション実験(単一変数の影響を調べる実験)を行いました。結果、単一のサブシステムだけでは DVFS(動的電圧・周波数調整)がトリガーされないことが分かりました。例えば、cuBLAS の GEMM 演算のみでピーク時の 1072W に達しても TDP の 97% を超えるわけではなく、降頻は起こりません。
しかし、MegaMoE は TC(Tensor Core)、HBM、NVLink の三者が同時に飽和状態に陥ることで閾値を超え、結果として降頻が発生します。
Rubin においても同様の降頻現象が見られるかどうかは不明ですが、Nvidia のこの部分の対応については、あまり良くない印象を受けます。
3.2 NV-HBI を介したクロスダイ間のネットワーク問題
Blackwell においては、過去に多くの記事で「Cross-Die(ダイ間)へのメモリアクセスにおける遅延の不一致」が指摘されてきました。しかし、これらの記述は実際のテスト結果とは乖離しているように思えます。
Hopper アーキテクチャにおいて Cross L2 Partition の間に大きな遅延差があることは事実ですが、Blackwell では各ダイに 2 つの L2 パーティションがあり、チップ全体で 2 つのダイを持つため、遅延テストでは最大で 4 つのピークが現れるはずです。しかし実際にはそのような現象は見られませんでした。
実は NV-HBI の遅延は、多くの人が考えているほど数百サイクルも異なるような大きな差ではなく、むしろ非常に低い値です。
一方、Rubin では HBM バンド幅が 22TB/s に達します。L2 キャッシュの容量や NV-HBI の帯域を考慮すると、何らかのアフィニティ(親和性)処理を行わない場合、全体として HBM バンド幅を最大限に活用できず、ピーク性能の 60〜70% 程度しか発揮できない可能性が高いと考えられます。
4. まとめ
総じて Rubin アーキテクチャは、Blackwell をベースにしつつもごく僅かな変更を加えた製品と言えます。I/O 機能を専用の I/O ダイへ移設したことは、優れたトレードオフの選択でした。これによりメインダイの面積をより多くの SM(ストリーミングマルチプロセッサ)に充てることが可能になりました。
さらに K 次元の拡大、周波数の向上、そして HBM バンド幅の増強が相まって、性能は大幅に向上しました。ランタイムレベルでも多数の微細な最適化が施され、SM のアイドル状態(空泡)を低減することに成功しています。特に ThreadBlock レベルでの依存関係管理の改善により、比較的低遅延な Megakernel を構築しやすくなっています。
しかし、消費電力や放熱の制約を考慮すると、チップ全体を最大限に駆動した際の電力制限(パワーウォール)が実際に存在するかどうかについては、まだ懐疑的な見方をしています。また、アテンション機構においてスパースなGEMM演算が活用できるかについても、同様に疑問が残ります。
より詳細な分析については、もしスポンサーの方からRカードを提供していただければ、エージェントを用いて約1週間以内に完全な逆エンジニアリング解析を完了させることができるでしょう。 :)
参考資料
[1] Inside NVIDIA Rubin GPU Architecture: Powering the Era of Agentic AI: https://developer.nvidia.com/blog/inside-nvidia-rubin-gpu-architecture-powering-the-era-of-agentic-ai/
[2] PTX 9.4: https://docs.nvidia.com/cuda/developer-preview/13.4/pdf/ptx_isa_9.4.pdf
微信で開くにはこちらへ
原文を表示
原创 渣B 2026-07-23 08:20 浙江
image
TL;DR
Nvidia最近公布了一些Rubin架构相关的资料《Inside NVIDIA Rubin GPU Architecture: Powering the Era of Agentic AI》[1] 然后对应的PTX 9.4指令集也有一个Preview的文档《PTX 9.4》[2]. 因此做一些简单的分析. 从微架构编号来看, Rubin基本上延续了blackwell SM100 family的特征, 例如TensorCore依旧是tcgen05的架构. 但是在很多细节设计的地方做了很多提升.
回到去年的一篇文章《Inside Nvidia GPU: 谈谈Blackwell的不足并预测一下Rubin的微架构》, 这是一篇对Blackwell架构的批评的文章, 老黄还在公司内部转发过. 在Rubin发布后, 基本上一些细节上的不足都做了很好的补充. 例如SFU的性能, 新的Thread Block Level Dependecy Launch等,我将详细的进行一些分析.
为了方便外国人阅读, 弄了一个英文版: https://github.com/zartbot/blog/issues/11, 老黄这次你转不转? 这次没骂人在夸赞NV...
- 芯片架构Overview
1.1 SM数量变化
Blackwell系列每颗芯片有80个SM, 累计为160个SM. 但是在B200时代, 因为SFU的瓶颈问题带来Attention/MoE Activation的计算过程中Epilogue过慢引起, 因此在B300的时代, 通过砍掉一些高精度的算力增加了2xSFU性能. 但是还有一些情况下SFU的算力还是不足的, 例如MoE中的Activation函数计算....
我们回顾一下Blackwell的芯片layout, 可以看到实际上空间已经很紧张了, 在B300上只能通过砍掉一些功能增加算力.
image而在Rubin时代, SM数量增加了50%, 它是怎么进一步从160个SM扩展到224个的呢? 做了哪些取舍呢?
image很明显的一个变化就是, 将PCIe/NVLink/NVLinkC2C构成了一些独立的I/O Die 通过NV-HBI合封, 使得主计算Die有了更大的面积用于放置更多的SM, I/O Die的移出估计能够提供额外20%左右的芯片面积用于放置SM.
image但是考虑到SFU的数量增长, 个人怀疑是不是还有一些其它的面积上的Trade-off, 例如单个SM内部的一些实现变化, L2Cache Size调整, 这个要等我玩上Rubin的机器实际测试以后才能知道.
1.2 TensorCore性能
整体性能对比如下:
项目
sm_103 Blackwell Ultra
sm_107 Rubin
SM
160
224
Tensor Core
640
896
每 SM Tensor Core
4
4
dense NVFP4
15 PFLOPS
35 PFLOPS
dense FP8
5 PFLOPS
17.5 PFLOPS
HBM 带宽
8 TB/s
22 TB/s
前一节的介绍可知, Rubin 仅靠 Tensor Core 数量就有 896/640 = 1.4×. 但是官方整卡 dense NVFP4 峰值约为 35/15 = 2.33×, dense FP8 约为 17.5/5 = 3.5×. 我们注意到官方的blog显示, Rubin通过将Tensor Core 在 K 维度上可处理的数据量翻倍, 使每个时钟周期的 Tensor Core 吞吐量翻倍.
image
image排除1.4x的SM数量带来的算力提升, 我们可以看到单个TensorCore的性能提升为NVFP4 2.33/1.4 = 1.66x, FP8 3.5/1.4 = 2.5x. 那么再进一步排除K维度2x, 可以推测出整个芯片的频率似乎提升了25%, 另一个佐证是BF16的K维度没变, 性能从B300的2.25PFLOPs 提升到了Rubin 4PFLOPs. 折算1.4x SM数量提升4/2.25/1.4 = 1.27x, 基本可以确定频率提升25%左右.
但是值得注意的是NVFP4的提升相对较少主要是B300 SM_103已经有dense K=96, 在Rubin上增加到128, K维度相对提升1.3x, 再加上SM数量和频率提升, 数据是能对齐的.
实际 kernel 能提升多少?
实际任务中的性能提升, 我们可能还需要考虑到其它子系统相关的约束, 例如 GEMM 已经是 HBM、通信或 epilogue bound, TMA/shared-memory pipeline 供数不足, 或者 K 很小的一些情况... 例如 K_total=160:K=64 需要覆盖到 192, 利用率 83.3%, K=128 需要覆盖到 256, 利用率只有 62.5%.
1.3 SFU性能
在去年的关于Blackwell架构分析文档中阐述了SFU性能的瓶颈, 即便是在B300系列中2x的SFU性能, 实际上还是在一些场景中会出现瓶颈, 例如MoE中Expert的SwiGLU激活计算时, 导致Epilogue无法很好的overlap GEMM的情况. 在Rubin中进一步翻倍了SFU的性能:
image实质原因是, 在文章《大模型时代的数学基础(9)- SDPA和最优传输, 强化学习及信息几何的联系》 中讲过Attention的计算在Optimal Transport的视角下SDPA是最优的, 因此很大程度上Softmax的运算是无法避免的, MoE的Expert SwiGLU Activation倒是有办法做一些替代, 因此去年在和NV的一些交流中我的态度就是SFU一定不能砍. 而在Rubin这一代中, SFU的性能继续翻倍正好也匹配了TensorCore的性能, 但估计实际上还是会在Epilogue阶段有一些空泡出现.
1.4 Attention Sparse处理
因为SFU的一些瓶颈, Nvidia在blog中给出了一个新的做法. 虽然Sparse的GEMM过去几年一直在提, 但是基本上没啥用处... 这一次 Rubin 通过将激活稀疏 (activation sparsity) 与自适应压缩和改进的 softmax 吞吐相结合来加速注意力. Rubin 官方文章给出的 attention 路径非常具体, 简单来说, 就是在Attention计算中 还是以Dense方式执行计算, 生成中间注意力分数. 随后 Rubin 可以将这些中间数据从 Tensor Memory 加载为结构化 2:4 稀疏压缩形式, 同时生成非零值与高效利用这些值所需的元数据, 从而降低分数的写回成本与存储需求. 这使得后续注意力阶段可以在更少的数据上运算, 同时保持模型其余部分所期望的稠密输出格式.
image结合新的PTX 9.4指令集的文档, 我们来详细展开这个过程:
第一段GEMM QK 还是以 Dense 方式执行, 然后在 TMEM 中 Accumulator 保持 Dense 的 Score 矩阵. 然后使用tcgen05.ld.red.spcompress指令, 压缩逻辑检查全部 dense score 进行稀疏加载. 这种方式直接减少的是:
TMEM load 输出到普通寄存器的数据量.
后续保留值的 exponent 和 normalization 工作量.
完成 staging 后的 sparse P x V 乘加数量.
tcgen05.ld.red.spcompress 到底做了什么
该指令固定处理 f32,使用 b2 metadata,执行 2:4 选择,并支持 .x4 到 .x128.普通版本输出 cdata 和 mdata;.red 版本额外输出 redval.
这样来看 nonzero 加载到寄存器的数量会减半, 但寄存器 footprint 不是严格 50%. 短 vector 中 metadata 摊销更明显,长 vector 又会增加寄存器峰值和 live range..x128 不一定优于 .x32.
然后我们注意到.red 能在同一次 TMEM load 中返回局部 min 或 max. 对 softmax, 最自然的组合是 rowop::max:每 4 个 logits 保留数值最大的 2 个, 同时生成 fragment 的局部最大值.
但需要注意它仍然不是一条完整 softmax 指令.软件还必须完成:
跨 fragment,warp 或 CTA 合并 row max.
对保留值执行 ex2.approx((x - max) * log2(e)).
求 row sum 和 reciprocal.
在 online softmax 中维护跨 tile running max 和 running sum.
把 probability 转换并重排为 sparse MMA 可以消费的格式.
但是另一个问题值得我们注意, ld.spcompress 把 f32 cdata 和 b2 mdata 放进普通寄存器.而 tcgen05.mma.sp 要求 sparse A 来自 shared-memory descriptor 或 TMEM, metadata operand 也是 TMEM 地址.因此中间存在一个不能忽略的 staging gap:
f32 logits
-> sparse softmax probability
-> dtype conversion
-> MMA A-layout repack
-> metadata layout repack
-> shared/TMEM store
-> completion wait
-> tcgen05.mma.sp只有减少的 exponent,normalization 和 sparse PV 时间大于 conversion/staging 成本时, 端到端才会加速. 另一方面, 我们需要注意, 当 logits 很尖锐时,每组 top-2 可能已经覆盖绝大部分概率质量.当 logits 很平坦时,删掉 50% 元素会显著改变分布.因此性能测试必须同时报告Attention的精度影响.
结论
其实这里我们不能简单的说, 用了这种算法就能提高2x的Attention的性能, 可以看到Sparse在CUDA Core内也增加了一些运算量, 但很大程度上降低了SFU的瓶颈. 但最终收益有多大, 还需要取决于Attention的精度影响, 是否可用我觉得还是持怀疑态度的.
- 软件功能
对比分析了一下PTX 9.3 和 PTX 9.4中关于Rubin SM_107增加的部分.
全新指令和新复合 variant如下表所示:image既有指令的新类型,qualifier 与目标覆盖
image2.1 Kernel调度
在去年的文章中其实也分析到了Blackwell的调度会有很多问题, GPU 需要高效地从一个 kernel 过渡到下一个 kernel. 在推理中这一点尤为重要, 因为激活往往位于关键路径上: 一个 kernel 产生激活数据、写入内存, 下一个 kernel 消费这些数据以继续生成下一个 token.
传统的生产者-消费者执行模式会在 GPU 时间线上产生气泡. 生产者 kernel 可能提前完成部分 tile 或线程块的工作, 但消费者可能要等到更大范围的依赖关系解除后才能开始有效工作. Blackwell 的可编程依赖启动(programmatic dependent launch,PDL) 通过允许消费者 kernel 更早推进改善了这一点, 但依赖工作仍可能因等待所需激活数据就绪而停滞.
因此我在去年的文章中也建议需要更细粒度的调度能力, 在Rubin上实现了ThreadBlock Level的数据依赖调度.image
这一点很好的解决了我对Blackwell架构缺陷的烦恼, 实际上可能这种方式会使得我们不需要再去特别的实现一些MegaKernel的框架了, 直接使用这种依赖即可.
具体软件实现
从PTX 9.4的文档中, 我并没有找到关于Grid Scheduling 或者 Tile publication相关的指令, 因此Nvidia可能这个功能的实现还是以暴露数据依赖, 而不暴露完整的调度器实现的. 因此我个人的一些猜测是后面一个做为Consumer的Kernel在调度器层面允许它同时Launch, 但仅在SM内占用少量的寄存器和ICache资源. 然后在Producer的那个Kernel有一个ThreadBlock的跨Kernel在SMEM内或者GMEM内共享的flag/barrier. 当前一个Thread Block完成时, 使用st.release语义释放这个barrier. 然后对于Consumer Kernel中的ThreadBlock可以先加载一小段Poll循环代码在ICache内, 就是一个很简单的polling, 通过ld.acquire读取这个flag/barrier, 如果没有ready那么就很简单的做一个nanosleep. 直到完成后, 一个分支跳转出Poll这个循环.
这是一个纯软件的实现方式, 应该在Blackwell上也可以做. 当然比较理想的情况是在硬件调度器上做这件事, 可以复用一些mbarrier的硬件能力, 避免Consumer这个ThreadBlock的polling
2.2 MoE相关的优化
2.2.1 TMA
官方的Blog中讲到一个case, TMA有一个MoE Descriptor统一的在多个专家权重之间加载数据.image
实际上对应的指令集应该是TMA copy中的override::global_address,.override_attribute指令, 这是因为MoE expert tensor 常有相同 layout,不同 base address.传统路径为每个 expert 维护一份 descriptor,或者在软件侧频繁 patch descriptor.Rubin 可以保留一份共享 tensorMap,在 TMA 指令运行时覆盖:
global base address.
global dimensions.
global strides.
router 只需给出当前 expert 的运行时字段,TMA 仍负责 tensor addressing,copy 和 mbarrier completion. 收益包括更少 descriptor storage, 更少 patch/proxy fence,更低 metadata 流量,以及更适合 persistent kernel 的动态专家调度.
2.2.2 Applypriority
这是一个关于Cache生命周期管理的用法, 通常对于MoE Expert参数这类需要多个token反复读取的热点数据, 我们可以将其Cache Hint设置为evict_last, 然后在多个计算阶段中反复使用增加Cache命中率. 当结束时, 调用applypriority将其Cache Hint策略改为evict_normal. 在Rubin中增加了这个功能
image大致的作用如下:
image例如route先选择了Expert-3进行处理, 此时我们将Expert 3的权重使用evict_last策略, 它将同时处理多个token. 当路由切换到Expert 7的时候, 我们且Expert 3完成 Last-use, 此时我们可以设置applypriority(Expert 3 range)将其改为evict_normal然后让 Expert 7 获得更多有效 L2 capacity.
其实这种策略不光对于MoE Expert Weight, 对于多阶段的GEMM 或者 Fused Kernel, 甚至是Sliding-winddow Attention 或者 KV 的生命周期管理都是非常有用的. 一个常见的用法是 applypriority.async.bulk.tensor 使用 tensorMap 和 tensor coordinates 计算整个 tensor tile footprint. 典型组合是:
一份共享 tensorMap
-> TMA runtime override 选择当前 expert base
-> TMA 加载 expert tile
-> Tensor Core 重复使用
-> tensor applypriority 将相同 footprint 恢复为 normal2.3 ScaleUP通信
当推理从单 GPU 扩展到整机架系统时, 通信成为关键性能路径的一部分. 当通信被直接融合进 GPU kernel 内部时, kernel 无需停下并把控制权交还 CPU; 它可以在计算仍在进行时, 直接通过 NVLink 向另一块 GPU 写数据或执行归约. 传统的 GPU 间通信除了搬运有效载荷数据外, 还需要协调与同步工作. 这些步骤会增加延迟并消耗互连带宽, 尤其是在分布式推理负载中通信频繁发生的情况下.
Rubin 为设备发起的 NVLink 通信引入了计数写入 (counted writes). 该能力让接收方 GPU 能更高效地跟踪传输完成情况, 从而简化 GPU 间数据传输的同步.
image通信对比图: Blackwell 使用内存屏障, 确认与原子标志, Rubin 在接收 GPU 加载数据前使用计数器更新采用计数写入的 NVLink 融合通信为协调 GPU 间数据搬运提供了更低延迟的机制, 帮助计算持续推进, 而不是等待同步操作完成.
实际上在ScaleOut网络上, 我们大概在2023年就实现了这样的功能, 通过接收端更新counter来节省一个RTT. 也不是啥很难的技术, 又一次领先NVidia 3年, 然后具体的实现就是采用PTX指令fabric.try_put.async.counted::bytes ... 和fabric.try_red.async.counted::bytes .... PTX 的 fabric 指令可以由 GPU kernel 发起跨 GPU put 或 reduction.其中 counted form 让 remote counter 按 destination-accessed bytes 累加. receiver 可以轮询 counter,确认目标数据访问已经达到预期字节数,再消费数据.这能减少独立 memory barrier,acknowledgment 和 atomic flag 的协调.
另一个重要事实是:counted fabric syntax 在 PTX 9.3 已经存在,最低 target 是 sm_100+, 也就是说Blackwell也应该能够支持, 不知道啥时候能有卡去测试一下.
2.4 Tcgen05 LUT
把低比特索引变成 Tensor Core 的 B operand
imagetcgen05.mma.decompress::lut::b 很容易被名字误导.它不是可以查询任意函数的通用 LUT, 它做的是一种非常具体的 local codebook decompression:
B operand 保存 3-bit index.
每个局部 group 有 8 个 E4M3 候选值.
MMA 在内部用 index 选择候选值并恢复 B value.
B collector 可以让解码后的 B tile 在多次 MMA 中复用.
- 其它问题
3.1 峰值功耗管理
AI 负载期间的功率需求可能剧烈波动, 产生的瞬态尖峰会闲置可用容量并降低工厂级吞吐. Vera Rubin 电源采用荷电状态 (SoC) 智能功率平滑技术来吸收这些波动: 相比上一代功率平滑技术, 平均功耗降低约 10%, 50 毫秒峰值功率降低约 20%. 通过提供更平稳的功率曲线, 系统可以降低持续最大功率需求, 惠及配套供电基础设施与电网, 并在相同 AI 工厂功耗预算内容纳更多算力.
在 AI 工厂层面, NVIDIA DSX MaxLPS 将这一方法扩展到跨 GPU, 跨机架, 45°C 液冷与各类负载, 而 DSX OS 则提供调度, 生命周期管理与健康自动化的运营层. 二者协同设计, 旨在回收闲置功率, 并在固定兆瓦包络内增加有效算力. DSX MaxLPS 可让运营方在相同功耗预算内, 以高能效工作点部署多达 40% 的额外 GPU, 且对负载性能影响极小.
image具体实现上, 其实我在少年时期就跟着父亲做各种高低压配电设备. 大致的方法很简单:
机架电容吸收亚秒级功率尖峰.
Rack power steering 在 CPU,GPU 和 NVLink switch 之间动态移动功率预算.
DSX MaxLPS 根据 workload,telemetry,冷却和全厂功率上限重新分配 GPU power limits 和任务资源.
这里需要再说一句, 其实Blackwell的功率控制做的非常差, 前段时间做B卡逆向分析的时候专门测试过, 例如对MegaMoE这种极致使用硬件的算子, 针对8卡B300, EP8, V4-Pro config: 384 experts, top-6, hidden=7168, intermediate=3072的配置下, 降频分析如下表所示:
image然后做了一些消融的功耗实验, 单个子系统都不足以触发 DVFS(例如纯 cuBLAS GEMM 峰值 1072W / 97% TDP 也不降频),但 MegaMoE 因为 TC + HBM + NVLink 三者同时饱和而越过阈值。
image不知道Rubin是否还有降频的现象, 总觉得这块Nvidia做的并不是很好.
3.2 NV-HBI Cross Die片上网络的问题
其实在Blackwell上, 过去有很多文章都在写Cross-Die的访问内存延迟不一致的问题. 但是这些文章似乎和具体的测试结果有差异. 很简单的一个反例是在Hopper上Cross L2 Partition也有很大的延迟差异, 那么Blackwell上考虑到每个Die有两个L2 Partition, 整个芯片两个Die, 那么是否延迟测试中会出现4个峰值呢? 然而并没有. 其实NV-HBI的延迟远不是你们所认为的那样差异大到几百个cycles, 相反它的延迟是很低的.
但是在Rubin上, HBM带宽达到了22TB/s, 实际上L2的容量以及NV-HBI的带宽, 我觉得如果不做一些亲和性的处理可能会导致整体来看HBM带宽打不满, 大概率只能发挥到60~70%的峰值HBM带宽.
- 总结
总体来看, Rubin架构是一个在Blackwell基础上进行了很小改动的产品, 将I/O移除到专用的I/O Die上是一个很好的Trade-off, 这样Main Die的面积用于放置了更多的SM.然后伴随着 K 维度的增加和提升频率和加大HBM的带宽, 使得性能大幅度的提高. 在具体的runtime中也进行了多项精细的优化, 使得整个SM空泡降低. 特别是ThreadBlock Level的dependancy使得构建一些相对低延迟的Megakernel变得更加容易.
但是在功耗和散热约束下, 我对极致的打满整个芯片时的功耗墙是否存在还是持怀疑的态度, 对于Sparse的GEMM在Attention中是否能够使用也持怀疑态度.
更详细的分析, 不知道哪个金主爸爸给我一个 R 卡, 大概一周内可以用Agent 完成所有的逆向工程分析:)
参考资料
[1] Inside NVIDIA Rubin GPU Architecture: Powering the Era of Agentic AI: https://developer.nvidia.com/blog/inside-nvidia-rubin-gpu-architecture-powering-the-era-of-agentic-ai/
[2] PTX 9.4: https://docs.nvidia.com/cuda/developer-preview/13.4/pdf/ptx_isa_9.4.pdf
跳转微信打开
関連記事
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み