JA EN
体系計算機アーキテクチャ
·★ 会員·論文·12分で読めます

シストリックアレイ — TPUの心臓部を1から

掛け算器を並べるだけでは速くならないのは、データを運ぶ手間が演算より重いからです。TPUの中心にある格子=シストリックアレイが、行列積の三重ループを縦・横・時間にどう割り当てているのかを、2×2の手計算からサイクル単位のコード、バッチと次元の実務まで前提知識ゼロで解きほぐします。

対象textタスクhardware

In-Datacenter Performance Analysis of a Tensor Processing Unit

一次資料 — この記事の根拠

この解説の公開 2026-08-25

In-Datacenter Performance Analysis of a Tensor Processing UnitarXiv:1704.04760論文ページ·PDF

井戸まで走るか、手渡しでつなぐか

100人に「井戸から水を汲んで畑に撒け」と命じたとします。各自がバケツを持って往復するより、井戸から畑まで一列に並んで手渡しするほうが速い。誰も走らず、各自は隣に渡すだけ。それでも水は途切れずに届きます。

計算機の中でも事情は同じです。掛け算器はシリコン上ではとても小さく、いくらでも並べられます。ところがその1個が1回の積和をするには、入力を2つ読み、結果を1つ書かなければならない。相手がレジスタファイルやSRAMだと、演算そのものより出し入れのほうが時間も電力も食います。演算器を1000個に増やしても、そのぶんのデータを毎サイクル運べなければ残りは手を止めて待つだけ。この「運ぶ側が足を引っ張る」構図はメモリの壁で扱った通りで、AIチップ設計の出発点になっています。

シストリックアレイ(systolic array)は、これにバケツリレーで答えた設計です。演算器を格子状に敷き詰め、各演算器は隣接する演算器としかデータをやり取りしない。一度チップに入ったデータはメモリへ戻ることなく格子を端から端まで流れ、通り道の全演算器に仕事をさせてから出ていきます。systolic とは心臓の収縮のこと。データが鼓動のように一拍ずつ格子を進む様子から、1970年代末にH.T. Kung と Charles Leiserson がこう名付けました。TPUは、この40年前のアイデアを行列積という一点に絞って復活させたチップです。

格子の1マスがやっていること

格子の1マス——PE(Processing Element、処理要素)——の中身は驚くほど単純です。掛け算器が1個、足し算器が1個、値を1拍だけ抱えておくレジスタが数個。それだけです。

入り口は3つあります。左の隣から流れてくる活性化 aa、上の隣から降りてくる部分和 pp、そして自分の中に置きっぱなしの重み ww。1サイクルごとに、PEは次の2つを同時に行います。

pout=pin+aw,aout=ainp_{\text{out}} = p_{\text{in}} + a \cdot w, \qquad a_{\text{out}} = a_{\text{in}}
(1)

つまり言い換えれば、「上から来た数に、左から来た数と自分の重みの積を足して下へ落とす。左から来た数はそのまま右へ受け流す」だけです。pinp_{\text{in}} は上のPEが出した途中経過、aa は左から届いた入力の値、ww は自分が抱えている重みを指します。

嬉しい点が3つあります。PEは隣としか配線されていないのでチップを横断する長い配線が要らず、高いクロックで回せる。重み ww は一度置いたら動かないので、重みの読み出しが消える。部分和が手渡しで降りていくので、途中経過をメモリへ書き戻さずに済む。バケツリレーで誰も井戸へ走らないのと同じ理屈です。

2つ目の「置いたら動かない」は文字通りの意味です。計算を始める前に重みを1回だけ格子へ流し込んでPEのレジスタに焼き付け、そのあとは入力を何千本流そうが重みには一切触れません。ニューラルネットの推論では同じ重みを大量の入力に当て続けるので、この前提が素直に成立します。逆に言えば、重みを置き替える頻度が高い使い方ではこの利点が消えます。

PEが毎拍刻んでいるこの「掛けて足す」は、内積の1項そのものです。

FIG 12本のベクトルを回すと内積が変わる。この「掛けて足す」の総和が、格子の縦一列を降りていく間に少しずつ組み上がっていく量の正体です

行列積を、格子と時間に割り当てる

本題です。行列積 XWXW をこの格子でどう計算するのか。XX は入力を縦に TT 本並べた T×NT \times N の行列、WWN×MN \times M の重み行列とします。

(XW)t,j=i=0N1Xt,iWi,j(XW)_{t,j} = \sum_{i=0}^{N-1} X_{t,i} \, W_{i,j}
(2)

つまり、出力の ttjj 列にある1個の数は、入力ベクトル1本と重み行列の1列を先頭から順に1組ずつ掛け、それを全部足し上げた合計だ、ということです。tt は何本目の入力ベクトルか、jj は出力の何番目の要素か、ii は足し合わせる中身の番号です。プログラムで書けば三重ループになります。

シストリックアレイの核心は、この三重ループの3本を「縦」「横」「時間」に割り振ったことにあります。ii(足し算の中身)を格子の縦へ、jj(出力の要素番号)を格子の横へ、tt(何本目の入力か)を時間へ。

つまり の格子を用意し、PE に重み を置きっぱなしにします。入力は左から行ごとに流し込み、部分和は上から下へ降ろす。列 を降りきった部分和が 、まさに求めたい出力です。ソフトウェアのループが、そのまま金属配線の形に置き換わったわけです。

この先にあるもの

§

ここから先は会員限定です

解説記事371本・教科書26章・学生モード48単元・論文精読6本が、月額¥490ですべて読み放題になります。新しい解説は毎日3本ずつ増えます。いつでも解約でき、解約後も期間の終わりまで読めます。

会員の方はログインすると続きが表示されます

参考文献

  1. In-Datacenter Performance Analysis of a Tensor Processing Unit. arXiv:1704.04760論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です