シストリックアレイの原理 ─ データフローと行列積アクセラレータ
なぜTPUは行列積をあれほど効率よく回せるのか。PE格子にデータを波状に流すシストリックアレイの再利用原理と、重み定置などのデータフローを押さえれば利用率の勘所が掴めます。
- 1.シストリックアレイはMAC器(PE)を格子状に並べ、データを毎サイクル隣のPEへ波状に流すことで、1つの値を多数のPEで再利用しメモリ往復を激減させる。
- 2.重み定置・出力定置・入力定置の3方式は、PE内に何を留め置き何を流すかの選択で、再利用するデータと配線・累算の負担が変わる。
- 3.充填と排出の遅延があるため、長く流し続けて初めてピークに近づく。小さい行列やタイル端数ではPEが遊び、利用率が落ちる。
シストリックアレイとは何か
シストリックアレイは、PE(処理要素、各PEは1個の積和器=MAC器)を格子状に並べ、データをポンプのように規則正しく隣のPEへ送り続ける演算アーキテクチャです。名前は心臓の収縮(systole)に由来し、心臓が血液を全身へ送るように、メモリから一度読んだデータをアレイ内で循環させて使い回します。Tensorコアと行列演算アクセラレータの土台にあるのがこの方式で、GoogleのTPUがこれを大規模化した代表例です。
狙いは データ供給のボトルネック解消 にあります。汎用演算器で行列積を回すと、MAC 1回ごとにレジスタやキャッシュへの読み書きが発生し、演算器よりメモリ帯域が先に枯渇します。シストリックアレイは、外周から入れたデータをPE間でバケツリレー伝播させ、1回の読み出しを多数のPEに行き渡らせることで、この往復を桁で減らします。
N × N の行列積は演算量が N の3乗のオーダー、入力データ量は N の2乗のオーダーです。つまり1要素を読むほど何度も使い回せる演算密度の高い処理で、演算器を敷き詰めるほど報われます。再利用の少ない処理にアレイを当てても、供給が追いつかず器が遊ぶだけです。
データを波状に流す ─ 基本動作
最も基本的な C = A × B の構成では、PEを格子に並べ、行列 A を左から、行列 B を上から流し込みます。各PEは毎サイクル次の3つだけを行います。
各PEの1サイクルの仕事
1. 流れてきた a と b を掛けて、自分の累算器に足す(acc += a * b)
2. a を右隣のPEへ渡す
3. b を下隣のPEへ渡す
シストリックアレイ(積和の格子)
B(上から下へ)
↓ ↓ ↓
A → ┌───┬───┬───┐
→ │PE │PE │PE │ 各PEで acc += a*b
→ ├───┼───┼───┤ a は右へ、b は下へ伝播
│PE │PE │PE │
└───┴───┴───┘
ここで肝心なのは データを斜めにずらして投入する 点です。A の各行と B の各列が正しいPEで正しいタイミングに出会うよう、行・列ごとに1サイクルずつ遅らせて流します。こうすると、左上のPEから順に演算が始まり、データの「波」がアレイを右下へ伝わっていきます。制御はほぼ「毎サイクル隣へ送る」だけで、命令フェッチもデコードもないため、面積と電力の大半を乗算器に回せます。
3つのデータフロー ─ 何を留め、何を流すか
PEの中に何を固定し、何を流すかで設計が分かれます。これが データフロー(dataflow) で、再利用するデータと配線の重さが変わります。
| 方式 | PEに留め置く値 | 流す値 | 再利用が大きいデータ |
|---|---|---|---|
| 重み定置 (Weight Stationary) | 重み(行列の係数) | 入力と部分和 | 重み(各PEに1回ロードし長く使う) |
| 出力定置 (Output Stationary) | 累算中の出力要素 | 入力と重み | 部分和(累算器が動かない) |
| 入力定置 (Input Stationary) | 入力(活性) | 重みと部分和 | 入力データ |
重み定置 はTPUなど推論アクセラレータの定番です。各PEに重みを1回ロードしたら、その重みを動かさず、入力を次々流し込んで部分和を下流へ送ります。同じ重みで多数の入力を処理するバッチ推論や畳み込みで、重みの再ロードが消えるのが利点です。
出力定置 は累算器をPEに固定し、出力1要素分の積和を最後まで同じ場所で足し上げます。部分和がPE間を移動しないため、部分和の精度落ちや配線が減るのが強みで、累算回数が多い深い内積で有利です。
入力定置 は逆に入力を留め、重み側を流します。同じ入力に多数の重み(多数の出力チャネル)を当てる場面で入力の再利用を最大化します。どれが最適かは、重み・入力・出力のどれが一番大きく再利用できるか、つまり層の形状(バッチサイズ、チャネル数)で決まります。
出力定置以外では「途中まで足した部分和」をPE間で受け渡します。部分和は最終的にビット幅の広い累算値なので、流すデータが太くなり配線負担が増えます。逆に出力定置は部分和を動かさない代わり、入力と重みの両方を流すための供給帯域が要ります。万能の方式はなく、対象とする層の形状に対する再利用とのトレードオフです。
TPUの設計思想
GoogleのTPUは、この重み定置シストリックアレイを大きな2次元格子(初代で 256 × 256 = 65,536 個のMAC器)として実装し、1サイクルあたり数万回のMACを、ごく単純な制御で叩き出します。設計思想は明快で、汎用GPUが備える分岐予測・アウトオブオーダー実行・大きなキャッシュといった「1スレッドを速くする」機構を削り、その面積をひたすらMAC器と、それを途切れなく養うオンチップSRAM(重みFIFOと累算バッファ)に振り向ける点にあります。
行列積はアクセスパターンが完全に予測可能なので、投機実行もキャッシュの賢いリプレースも要りません。決め打ちのスケジュールでデータを流し込めばよく、制御を捨てたぶんを演算密度に変換できます。これは演算をメモリの近く・内部で行うという発想で、インメモリ・近メモリ演算とも問題意識を共有します。
充填・排出と利用率
シストリックアレイの泣きどころが パイプラインの充填(fill)と排出(drain) です。データの波が左上から右下へ伝わるため、投入を始めてから全PEが同時に働き始めるまでには遅延があり、流し終えてからも末端のPEが結果を吐き終えるまで時間がかかります。
N × N アレイのざっくりした時間構成
充填: 先頭データが端のPEに届くまで(おおよそ 2N-1 サイクル)
定常: 全PEがフル稼働してMACを稼ぐ区間 ← ここで効率を稼ぐ
排出: 最後のデータが末端を抜けるまで
つまり 長い行列を流し続けて初めてピーク利用率に近づき、短い処理では充填・排出のオーバーヘッドが相対的に大きくなって器が遊びます。
もう1つの利用率低下要因が タイル端数 です。大きな行列は固定サイズのアレイに合わせてタイル(小ブロック)分割しますが、行列の寸法がアレイの寸法で割り切れないと、端のタイルでPEの一部が空回りします。極端な例として、16 × 16 の小さい行列を 256 × 256 のアレイに載せると、大半のPEが何もしません。
重み定置では「同じ重みで何件の入力を流すか」が定常区間の長さを決めます。バッチサイズが小さい(例えば対話のリアルタイム推論で1件ずつ処理する)と、充填・排出のたびに重みを入れ替える割合が増え、ピーク性能から大きく外れます。アレイのサイズと層の形状・バッチが噛み合って初めて高い利用率が出ます。
「シストリックアレイはPE(MAC器)格子にデータを波状に流し1値を多数PEで再利用する」「重み定置・出力定置・入力定置はPEに留める値で再利用対象が変わる」「TPUは制御機構を削りMAC器とSRAMに面積を振った重み定置アレイ」「充填・排出の遅延ゆえ長く流すほどピークに近づき、タイル端数や小バッチで利用率が落ちる」の4点を押さえましょう。
まとめ
- シストリックアレイは MAC器(PE)を格子に並べ、データを毎サイクル隣へ波状に流すことで、1回読んだ値を多数のPEで再利用し、メモリ帯域の枯渇を回避する。
- 重み定置/出力定置/入力定置 は、PEに何を留め何を流すかの選択であり、再利用するデータと部分和・配線の負担が変わる。層の形状で最適が決まる。
- TPU は分岐予測やキャッシュといった汎用機構を削り、面積をMAC器と供給SRAMに集中させた重み定置アレイで、単純な制御のまま高い演算密度を得る。
- 充填・排出の遅延ゆえ長く流すほどピーク利用率に近づき、タイル端数や小バッチではPEが遊んで実効性能が落ちる。
シストリックアレイは「読んだデータを格子内で使い倒し、制御を捨てて演算密度に変える」設計です。上に乗る命令形の行列積はTensorコアと行列演算アクセラレータ、供給を支えるメモリ階層はキャッシュメモリの原理も合わせてどうぞ。
CPU/メモリ/ディスク Article
シストリックアレイの原理 ─ データフローと行列積アクセラレータを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
シストリックアレイ
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
重み定置・出力定置・入力定置の3方式は、PE内に何を留め置き何を流すかの選択で、再利用するデータと配線・累算の負担が変わる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「シストリックアレイ / TPU」に近いか確認する。
- 強みである「シストリックアレイはMAC器(PE)を格子状に並べ、データを毎サイクル隣のPEへ波状に流すことで、1つの値を多数のPEで再利用しメモリ往復を激減させる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。