Altifigence Academy

13 / 20 · 概念

タイリングと境界パディング

大きな行列を小さな格子へ割り当て、ゼロパディングと出力マスクを扱います。

まず出力空間をタイルに分ける

N×N格子は、大きなM×P結果をceil(M/N)×ceil(P/N)個の空間タイルで処理します。基本構成は各タイル内で縮約K全体を保持し、出力タイル間でクリアします。ラッパはタイル原点r0,c0を保存し、局所PE(i,j)は全体のC(r0+i,c0+j)に対応します。スキューは局所座標に依存します。

N=2、M=P=K=3とします。A=[[1,2,3],[4,5,6],[7,8,9]]、B=[[1,0,2],[0,1,0],[2,0,1]]の積は[[7,2,5],[16,5,14],[25,8,23]]です。4つのタイル原点は(0,0)、(0,2)、(2,0)、(2,2)です。

オペランドを埋め、格納をマスクする

範囲外のA行とB列には有効なゼロトークンを供給します。各PEはなおK項を消費し、簡単な完了契約を保ちます。パディング項を無効にすると、一部のcountが永久にK未満になることがあります。実行列の外に書かないよう、結果格納は別にマスクします。

最終タイルはA=[[7,8,9],[0,0,0]]、B=[[2,0],[0,0],[1,0]]です。局所結果は[[23,0],[0,0]]ですが、左上だけをC(2,2)へ書けます。数値がゼロでも範囲外アドレスが安全になるわけではありません。

各タイルは5回のadvanceを使い、4つを逐次処理すると20回です。クリア、ロード、出力転送は除外します。格子はパディングを含む48 MACを実行し、実際の3×3積に属するのは27だけです。

縮約のタイリングには和の保持が必要

Kの分割には同じ出力の部分和の結合が必要です。C(0,0)=1×1+2×0+3×2=7をK=2+1に分けると部分和は1と6です。縮約間で最終アキュムレータをクリアすると6だけが残ります。アキュムレータを保持するか、広い部分和を他で結合します。各部分を結合前に量子化すると、完全な和を1回量子化する場合と異なり得ます。

総合課題は空間タイリングと全Kから始めます。1要素の境界、Nで割り切れる寸法、実出力が1つの最終タイル、有効なパディングゼロ、出力マスクをテストします。参照スコアボードは全体座標をキーとし、タイル順序を変えても期待結果が変わらないようにします。

自分で考えてみましょう

3×3の例の(0,2)タイルについて、出力マスクと局所結果を示してください。Kを2+1に分けるとC(0,2)の部分和は何ですか。

解説を見る

局所結果は[[5,0],[14,0]]、マスクは[[1,0],[1,0]]です。C(0,2)=1×2+2×0+3×1の部分和は2と3で、合計5です。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。