LabHub

ブログ

シストリックアレイとデータフローアーキテクチャ — TPUの心臓原理

한국어English日本語

はじめに

今日の巨大な言語モデルを学習し推論する作業は、結局のところ膨大な量の行列積(matrix multiplication)に帰着します。Transformerのアテンションも、MLP層も、畳み込み(convolution)も、内部的には積和(multiply-accumulate, MAC)演算の巨大な山です。

ところがこのMAC演算そのものは、実はそれほど高価ではありません。本当に高価なのは、データをメモリから演算器へ運ぶ作業です。一回の乗算に要するエネルギーよりも、その乗算に必要な数値をDRAMから読み出すエネルギーが数百倍大きいことも珍しくありません。これがいわゆるメモリウォール(memory wall)問題です。

シストリックアレイは、まさにこの問題に正面から挑むために考案された構造です。データを一度読み込んだら、そのデータがチップ内部の演算器の格子(grid)に沿って流れながら何度も再利用されるようにします。GoogleのTPU(Tensor Processing Unit)がこの原理の最も有名な実装であり、NVIDIA GPUのテンソルコアも似た発想を共有しています。

本記事では、シストリックアレイとは何でどう動くのか、weight-stationaryやoutput-stationaryといったデータフロー戦略が何を決めるのか、そしてコンパイラが大きな行列をどのように小さな格子へマッピングするのかを、段階的に見ていきます。

なぜ行列積がAIの中核演算なのか

まず基準点を定めましょう。サイズがM×Kの行列Aと、K×Nの行列Bを掛けてM×Nの行列Cを得る演算を考えます。

C[m][n] = sum over k of  A[m][k] * B[k][n]

この一行に必要な積和の回数はM×N×Kです。たとえば1024×1024の行列を二つ掛けると、約10億(10^9)に近いMAC演算が起こります。巨大モデルでは、こうした行列積が毎秒数千回繰り返されます。

核心的な洞察は次の通りです。同じデータが何度も使われるという点です。

素朴に毎回メモリから読み直すと、データ移動量が爆発します。だから一度読んだデータをチップ内に留め、できる限り再利用しなければなりません。シストリックアレイは、この再利用をハードウェア構造そのものに刻み込んだ設計です。

シストリックアレイとは何か

この名前は、1978年にH. T. KungとCharles Leisersonが提案した概念に由来します。systolicは、心臓が規則的に拍動して血液を押し出す(systole)様子から取った言葉です。データがクロックごとに一マスずつ、まるで心拍のように規則的に格子を流れていくからです。

構造は単純です。小さな演算器(processing element, PE)を二次元の格子に密に配置します。各PEは次のことだけを行います。

  1. 上(または左)から入ってきた値を受け取る。
  2. 自分が持つ値と掛ける。
  3. アキュムレータに足す。
  4. 受け取った値を下(または右)の隣のPEへそのまま渡す。

PEは外部メモリに直接アクセスしません。隣のPEとだけ会話します。データは格子の縁から入り、一マスずつ前進して内部のすべてのPEを通ります。一度入ったデータが格子全体を横切る間に、無数のMACで再利用されるのです。

        B の重みが上から下へ流れる
        b00   b01   b02
         |     |     |
   a0 → [PE]→[PE]→[PE]→   (A の入力が左から右へ流れる)
         |     |     |
   a1 → [PE]→[PE]→[PE]→
         |     |     |
   a2 → [PE]→[PE]→[PE]→
         |     |     |
        部分和が下へ累積して抜けていく

各PE内部を擬似コードで表すと次の通りです。

PEがクロックサイクルごとに行うこと:
  in_left    = 左の隣から受け取った活性値
  in_top     = 上の隣から受け取った部分和
  product    = in_left * weight_held_here
  out_bottom = in_top + product
  out_right  = in_left          (活性値を右へそのまま伝える)

ここで決定的なのは、weight_held_here がPEの中に留まっているという点です。重みを一度ロードしておけば、流れ込むすべての活性値に対して同じ重みが再利用されます。これが次節で扱うweight-stationary戦略です。

データが流れながら掛けられる — 動作の追跡

概念を手で追ってみましょう。2×2の行列を二つ掛けます。

A = | a00  a01 |      B = | b00  b01 |
    | a10  a11 |          | b10  b11 |

求める結果:
C[0][0] = a00*b00 + a01*b10
C[0][1] = a00*b01 + a01*b11
C[1][0] = a10*b00 + a11*b10
C[1][1] = a10*b01 + a11*b11

2×2のPE格子を使い、Bの重みを各PEに固定ロードします。

PE位置ごとにロードされた重み:
  [PE00=b00] [PE01=b01]
  [PE10=b10] [PE11=b11]

ここでAの行を左の縁から流し込みます。重要なのは、データを斜め(skewed)に入れる点です。行ごとに一クロックずつ遅延させると累積のタイミングが合います。

時間 →
入力ストリーム (左の縁):
  行 0 (PE00, PE01 へ):  a00, a01
  行 1 (PE10, PE11 へ):  a10, a11  (一サイクル遅れて進入)

PE00をクロックごとに追うと次の通りです。

サイクル 1: a00 到着 → 累積 = a00*b00
サイクル 2: a01 到着 → 累積 = a00*b00 + a01*b10  ← C[0][0] 完成

PE00の上を流れていた部分和が下方向へ合わさり、片側の縁から抜け出すとき、私たちが求めたCの各要素が完成します。核心は、a00やa01といった値をメモリから一度だけ読み、b00やb10といった重みは一切読み直さずPE内に常駐させた点です。

この小さな例を256×256の格子へ拡張すると、一度に256×256 = 65,536個のMACをクロックごとに同時に実行します。TPUが行列積で圧倒的なスループットを出す理由がまさにこれです。

TPUのシストリック設計

Googleが2016年の論文で公開した第1世代TPUの心臓は、256×256のシストリック行列積ユニット(Matrix Multiply Unit, MXU)でした。65,536個の8ビット整数MACユニットが格子をなし、単一命令で巨大な行列タイルを処理しました。

TPU設計の核心的特徴を整理すると次の通りです。

世代を経てTPUは進化しました。2026年現在、Googleは第6世代Trillium(TPU v6)を前世代比でピーク性能約4.7倍まで引き上げ、推論に特化した第7世代Ironwoodと併用しています。しかし、格子状のシストリック演算ユニットにデータを流して再利用するという根本原理は、第1世代から変わっていません。

Weight-Stationary と Output-Stationary

シストリックアレイを設計する際に最も重要な決定は、何をPE内に固定(stationary)するかです。三つのデータ(重み、活性値、部分和)のうち何を留めるかで、データフロー戦略の名前が分かれます。

Weight-Stationary(重み固定)

重みをPEにロードし、活性値を流し込み、部分和を格子の外へ出します。

PE 内に留まる:   重み (W)
流れ込む:        活性値 (A)
流れ出る:        部分和 (psum)

Output-Stationary(出力固定)

各PEが出力要素一つのアキュムレータを最後まで保持します。重みと活性値の両方が流れ込みます。

PE 内に留まる:   部分和 (psum) — 出力要素
流れ込む:        重み (W) と活性値 (A)
流れ出る:        完成した出力 (最後に一度)

Input-Stationary(入力固定)

活性値をPEに固定し、重みを流します。同じ入力が複数の出力チャネルに再利用される畳み込みパターンなどで有用です。

三つの戦略を一覧で比較すると次の通りです。

戦略固定データ流れるデータ強み弱い状況
Weight-stationary重み活性値, 部分和重み再利用を最大化, 推論向き部分和移動のエネルギーが発生
Output-stationary部分和重み, 活性値累積精度, psum移動が最小重みを毎回流し直す必要
Input-stationary活性値重み, 部分和入力再利用の大きい畳み込みに有利出力チャネルが多いと負担

実際のアクセラレータは、ワークロードに応じてこれらの戦略を選択的に、あるいは混在させて使います。どの戦略もすべての場合に最善ではなく、行列の形(M, N, Kの比率)とバッチサイズが最適な選択を左右します。

データ再利用とエネルギー

なぜデータフロー戦略がこれほど重要なのでしょうか。答えはエネルギーにあります。さまざまな測定で共通して現れる大まかな傾向は、一回の演算より一回のデータ移動のほうがはるかに高価だということです。

おおよそのエネルギーコスト比較 (相対値, 傾向):
  レジスタ/PE内部アクセス      : 1倍
  オンチップSRAMアクセス       : 数〜数十倍
  チップ外DRAMアクセス         : 数百〜数千倍

正確な数値はプロセスや設計で異なりますが、方向は一貫しています。DRAMまで往復するコストが圧倒的に大きいのです。したがってアクセラレータ設計の目標は、単に乗算器をたくさん積むことではなく、一度読んだデータでできるだけ多くのMACを行うことです。

この効率を定量化する概念が算術強度(arithmetic intensity)です。

算術強度 = 実行した演算数 / 移動したバイト数  (単位: FLOP/byte)

算術強度が高いほどメモリ帯域に縛られにくく、演算器の利用率が上がります。シストリックアレイが狙うのはまさにこの指標の最大化です。重みを一つ読んで格子内にロードした後、数百個の活性値と掛ければ、その重みの算術強度は数百FLOP/byteまで跳ね上がります。

データフローアーキテクチャ一般論

シストリックアレイは、より大きな概念であるデータフローアーキテクチャの一例です。伝統的なフォン・ノイマン(von Neumann)構造は、命令がデータを引き寄せる制御主導(control-driven)方式です。一方データフローは、データが準備できると演算が発火(fire)するデータ主導方式です。

フォン・ノイマン:  PCが命令を指す → データを取得 → 実行 → 結果を保存
データフロー    :  オペランドが到着 → 即座に発火 → 結果を次のノードへ伝える

データフローの魅力は次の通りです。

現代のAIアクセラレータは、程度の差はあれこのデータフローの哲学を共有します。計算グラフ(computation graph)をチップ上に空間的に展開し、テンソルをその上に流すのが核心的な発想です。

GPUのテンソルコアとの比較

NVIDIA GPUは伝統的に、数千個の小さなコアがSIMT方式で動作する構造でした。ところが2017年のVolta世代から、テンソルコア(Tensor Core)という専用の行列積ユニットが追加されました。テンソルコアは、小さな行列タイル(たとえば4×4や16×16)を一命令で積和するハードウェアです。

シストリックアレイとテンソルコアを比較すると次の通りです。

側面TPU シストリックアレイGPU テンソルコア
格子規模一つの巨大な格子(例: 256×256)小さなタイルユニット多数をコアに分散
制御方式コンパイル時の決定論的スケジュール実行時のスレッド/ワープスケジューリング
柔軟性行列積に高度に特化汎用GPU演算と共存, 柔軟
データ再利用格子の流れでハードウェアが強制レジスタ/共有メモリの活用に依存

大まかにまとめると、TPUは行列積という一つの仕事のためにチップ全体を一塊として設計したのに対し、GPUは汎用性を保ちながら行列積の加速ユニットを差し込んだ形です。2026年現在、NVIDIA Blackwell世代と次世代Vera Rubinは第2世代Transformer Engineとより大きなテンソルコアを搭載し、低精度演算とメモリ帯域で大きな進展を見せています。

どちらが優れているというより、ワークロードと運用環境によってトレードオフが異なります。大規模な学習/推論のためのデータセンター環境では、両方のアプローチが生き残り競争しています。

利用率とタイリング

シストリックアレイが理論上クロックごとに65,536個のMACを実行できるからといって、実際に常にそれだけ働くわけではありません。実際の利用率(utilization)はしばしばそれより低くなります。理由は、行列の形が格子サイズにきれいに割り切れないからです。

たとえば256×256の格子に9×9の行列を流し込むと、格子のごく一部だけが働き、残りは遊びます。また格子を満たすには、データが流れ込み流れ出るパイプラインの充填/排出(fill/drain)区間があり、この区間の間は一部のPEがアイドル状態になります。

この問題に対処する技法がタイリング(tiling)です。大きな行列を格子サイズに合う小さなタイルに分け、順に流し込みます。

大きな行列 C (1024 x 1024) を
格子サイズ 256 x 256 のタイルに分割:

  +------+------+------+------+
  | T00  | T01  | T02  | T03  |
  +------+------+------+------+
  | T10  | T11  | T12  | T13  |
  +------+------+------+------+
  |  ... 4 x 4 = 16個のタイル ... |
  +------+------+------+------+

各タイルは格子を満たすので利用率が高い。

タイルサイズを格子に揃え、パイプラインが十分深く満たされるよう十分多くのタイルを連続して流し込むことが、利用率を引き上げる鍵です。行列の次元が格子サイズの倍数のとき、利用率が最も良くなります。

コンパイラのマッピング

開発者が直接PE一つひとつにデータを流し込むわけではありません。それはコンパイラが行います。TPUの場合はXLA、GPUの場合はcuBLAS/cuDNNやTritonといったツールが、高水準のテンソル演算をハードウェアの格子にマッピングします。

コンパイラの核心的な作業は次の通りです。

1. 計算グラフから行列積ノードを見つける。
2. 行列の次元(M, N, K)を格子サイズに合うタイルに分割する。
3. データフロー戦略(weight-stationary など)を選ぶ。
4. タイルを流し込む順序をスケジューリングする。
5. データロードと演算が重なるようパイプラインを構成する。

この過程の品質が最終的な性能を左右します。同じハードウェアでも、コンパイラがタイルサイズと流れをどれだけうまく決めるかで利用率が大きく変わります。だからアクセラレータ企業は、ハードウェアと同じくらいコンパイラスタックに莫大な投資をします。

開発者にとっての実用的な示唆は、行列の次元をなるべくハードウェアに優しい値(たとえば8の倍数、128の倍数)に揃えると、コンパイラがより良いマッピングを見つけやすいということです。

長所と短所

シストリックアレイのアプローチの長所と短所を整理します。

長所:

短所:

このトレードオフのため、シストリックアレイは万能の解ではなく、行列積が圧倒的に支配的なディープラーニングのワークロードに特化したツールとして理解するのが正確です。

開発者への示唆

ハードウェアを直接設計しない開発者にとっても、この原理は実務的に有用です。

要するに「乗算は安く、データ移動は高い」という原則を頭に置けば、モデル構造とサービング設定をハードウェアに優しく整える直感が育ちます。

低精度とシストリックアレイの出会い

2026年のアクセラレータを理解するには、低精度演算を欠かせません。シストリックアレイのスループットは格子のPE数に比例し、同じシリコン面積により小さなビット幅のMACユニットをより多く詰め込めれば、スループットが倍増します。だから精度を下げることは、単なるメモリ節約ではなく、演算密度そのものを引き上げる戦略です。

同じ面積に入るMACユニットのおおよその傾向:
  FP32 MAC 1個分の場所に
  FP16 MAC 約2~4個
  FP8  MAC 約4~8個
  FP4  MAC 約8~16個  (おおよその傾向, 設計ごとに異なる)

  → ビット幅が半分なら同じ面積に約2倍以上の演算器

ここでの核心は算術強度との相互作用です。低精度は運ぶバイト数を減らして算術強度を高めると同時に、格子が一クロックでより多くのMACを行えるようにします。二つの効果が重なり、weight-stationaryの格子で同じ重みをより安く、より多く再利用できます。

ただしシストリックアレイで低精度を使うときの注意点があります。乗算は低精度で行っても、累積はより高い精度で集めないと誤差が暴走します。そのため実際のMXUは、入力はFP8またはFP4で受けつつ、格子内部のアキュムレータはFP16やFP32に保つ混合精度の構造をよく使います。

混合精度の累積 (概念):
  in_left, weight : 低精度 (例: FP8/FP4)
  product         : 低精度の乗算
  accumulator     : 高精度 (例: FP16/FP32) で累積
  → 乗算は安く, 累積は安全に

この低精度経路の効率こそ、NVIDIA Blackwell世代の第2世代Transformer Engineと次世代Vera Rubinが強調するものです。TPU v6 Trilliumと推論特化のIronwoodも同様に、推論で低精度フォーマットを積極的に活用し、同じ格子でより多くのトークンを処理します。

格子サイズとワークロードの相性

シストリックアレイの格子サイズは固定された設計選択です。この選択がワークロード効率を大きく左右します。大きな格子は一度により多くのMACを行いますが、行列が小さいか細いと利用率がより簡単に下がります。

大きな格子 (例: 256 x 256):
  + 大きな行列で圧倒的なスループット
  - 小さな行列で利用率が急減, fill/drain オーバーヘッドが大きい

小さな格子を多数 (例: 128 x 128 を複数):
  + 小さい/細い行列に柔軟
  + 複数の行列を並列に処理
  - 制御オーバーヘッド増加, 面積効率が少し損

このため2026年の一部のアクセラレータは、一つの巨大な格子の代わりに、中サイズの格子を複数置き、ワークロードに応じて束ねたり分けたりする方向を取ることもあります。学習は大きなバッチで大きな格子を満たしやすいですが、推論はバッチが小さく遅延が重要で、細い行列が頻繁に現れるからです。格子構成は結局「どのワークロードを主に回すか」という問いへのハードウェアの答えです。

次の表は代表的なワークロードと格子設計の相性を整理したものです。

ワークロード行列の特性大きな単一格子小さな格子を多数
大規模学習大きく厚い行列非常に有利無難
バッチ推論中サイズ有利有利
低遅延の単件推論小さく細い行列利用率が低い有利
MoEルーティング不規則/スパース不利相対的に良い

2026年のアクセラレータを一望して比較

シストリックアレイの原理が実際の製品でどう実装されるか、2026年時点の代表的なアクセラレータを大まかに比較してみます。正確な数値は世代と構成によって異なるので、設計思想の違いを見る用途として読んでください。

アクセラレータ系列演算構造強み主な用途
NVIDIA Blackwell / Vera Rubinテンソルコア多数 + 第2世代Transformer Engine汎用性, エコシステム, 低精度学習と推論の両方
Google TPU v6 Trillium巨大な systolic MXU決定論的スループット, 電力あたり性能大規模学習
Google Ironwood推論特化の systolic推論効率, 低精度大規模推論
Cerebras WSE-3ウェハスケール, 90万コア通信ボトルネック回避巨大モデルの一括処理
推論ASIC (クラウド自社)推論特化の格子コスト制御, ワークロード最適化自社の推論サービング

この表で読むべきは、どの製品が速いかではなく、同じ systolic/dataflow の原理を異なるトレードオフで実装したという点です。Cerebrasはチップを分けず通信ボトルネックを消し、TPUは巨大な単一格子でスループットを最大化し、GPUは柔軟性とエコシステムを守りました。

よくある誤解と落とし穴

シストリックアレイに初めて触れるとき陥りやすい誤解をいくつか整理します。

これらの落とし穴は結局一つの教訓に収束します。カタログの最大スループット(peak)と実際に達成されるスループット(achieved)の間には常に隔たりがあり、その隔たりを決めるのが利用率だという点です。

よくある質問

Q. シストリックアレイとテンソルコアは結局同じものですか?

原理は同じ根(空間的なデータ再利用)から出ていますが、実装が異なります。TPUのシストリックアレイは一つの巨大な格子にデータを流し、コンパイル時に決定論的にスケジュールします。GPUのテンソルコアは小さな行列タイルユニットを多数のコアに分散し、実行時にスレッド/ワープでスケジュールします。

Q. なぜ入力を斜め(skewed)に入れる必要があるのですか?

各PEで乗算と累積のタイミングが合わねばならないからです。データが格子を横切るのにサイクルがかかるので、行ごとに一クロックずつ遅延させて入れると、同じ出力要素に寄与する積が正しい瞬間に出会います。

Q. 推論でバッチを大きくすると本当に効率が良くなりますか?

weight-stationaryの格子ではそうです。重みを一度ロードすればバッチ内のすべての入力が同じ重みを再利用するので、バッチが大きいほど重みロードのコストがより多くの演算に分散されます。ただしバッチを大きくすると遅延が増えるので、低遅延が重要なサービスではトレードオフを検討する必要があります。

Q. 自分のモデルをハードウェアに優しくするには何から見ればよいですか?

行列の次元を8または128の倍数に揃えることから始めると良いです。次に低精度(FP8/FP4)の適用可能性を点検し、サービングではバッチ戦略を調整します。この三つだけでも、コンパイラが格子を満たすタイルを作るのがはるかに容易になります。

おわりに

シストリックアレイは、単純な発想を最後まで押し進めた結果物です。データを一度読んだら最大限再利用せよという原則を、演算器を格子に配置しデータをその上に流す構造へそのまま刻み込みました。心臓が拍動するようにクロックごとにデータが一マスずつ前進して掛けられ累積される、この優雅な流れが、TPUの圧倒的な行列積性能を支える心臓原理です。

データフロー戦略の選択、タイリングと利用率、コンパイラのマッピングという三つの軸を理解すれば、なぜ特定のアクセラレータが特定のワークロードで輝くのか、そして自分のモデルをどうハードウェアに優しく整えるかについて、確かな直感を得られます。AIハードウェアの発展は結局メモリウォールとの終わりなき戦いであり、シストリックアレイはその戦いで最も長く検証されてきた武器の一つです。

参考資料

コメント

まだコメントはありません。

ログインするとコメントできます