7. ハードウェア仕様
MN-Core 2 のハードウェア仕様のうち、MLSDK のユーザーに有用な項目について説明します。より詳細に知りたい場合、以下のソフトウェア開発者マニュアルを参照してください。
7.1. 階層構造
図 7.1 複数の Layer Block からなる MN-Core 2 の階層構造
注: これは概略図であり、チップの物理的なフロアプランを反映していません。
図 7.1 で表現されるような、MN-Core 2 の特徴である、ツリー状に階層化されたメモリ・演算器の構造について説明します。設計思想として、ツリーの葉に相当する位置に演算器を配置し、その側に大容量ローカルメモリを搭載することで、空間的局所性の高い演算を効率良く処理できます。また、ツリーの中間部分にあたる階層のメモリは、ローカルメモリと比べると非常に小さく、キャッシュメモリとは異なった発想で設計されています。
7.1.1. 各階層の概要
ツリーの根にあたる部分は Top Level と呼ばれ、そこから Group, L2B (Level 2 Block) と枝分かれしていきます。
- Top Level
4つの Group を子として持ちます。
1ボード(1チップと周辺回路)にただ1つ存在します。
4つの Group を仮想的にまとめたものであり、物理的な実体は持ちません。
- Group
2つの L2B を子として持ち、1つの DRAM および1つの PDM を含みます。
ここでの DRAM は、複数のモジュールをあわせて1つのメモリ空間を提供しているため 1 DRAM と数えます。
Top Level における L2B、DRAM 及び PDM 間でのデータ転送は、 各 Group 内の Data Engine の協調動作によって実現されています。
PDM の役割については後述します。
- L2B (Level 2 Block)
8つの L1B を子として持ちます。
- L1B (Level 1 Block)
16個の MAB を子として持ちます
- MAB (Matrix Arithmetic Block)
4つの PE を子として持ちます。
- PE (Processing Element)
複数の PE メモリを子として持ちます。
合計すると、PE はボードあたり合計で4096個存在します。また、Top Level 及び Group については役割が重複するため、8 L2B が直接 Top Level に存在するような表記をすることもあります。
7.1.2. 各階層の演算器
- MAU (Matrix Arithmetic Unit)
各 MAB に含まれる行列演算器
- ALU (Arithmetic Logic Unit)
各 PE に含まれる整数演算器
- 階層間の縮約演算器
下位層から上位層へのデータを縮約する経路で用いられる演算器
7.1.3. 各階層のメモリタイプ
容量の単位に LW: 64-bit word を用います。詳細は次節の Memory Word を参照してください。
- DRAM
チップ外の大容量メモリで、Top Level を介してアクセスします。
各 Group 毎にメモリ空間を持ち、4 Group 合わせて 16 GiB の総容量を持ちます。
Group あたりの容量は 4 GiB です。
- PDM (PIU Data Memory, PIU: PCIe Interface Unit)
DMA 通信用のメモリですが、一時メモリとしても利用可能です。
各 Group 毎にメモリ空間を持ち、Group あたりの容量は 4 MiB (= 512 Ki LW) です。
Group 0 の PDM のみがホストと PCIe インターフェースを介して物理的に接続されており、全てのホストーデバイス間通信がその経路を通ります。
- L2BM
各 L2B が1つ持つメモリで、容量は 32 Ki LW です。
- L1BM
各 L1B が1つ持つメモリで、容量は 8 Ki LW です。
- PE Memory
PE が含むメモリの総称です。
LM (Local Memory): LM0/LM1 の2面があり、それぞれの容量は 2 Ki LW です。
GRF (General Register File): GRF0/GRF1 の2面があり、それぞれの容量は 256 LW です。
注釈
このドキュメントでは、説明の一貫性を保つために意図的に PE Memory から T-Register の記述を省いています。詳細な情報を知りたい場合は、ソフトウェア開発者マニュアルを参照してください。
注釈
MLSDK においては、 Location として選択可能なメモリを DRAM と LM0/LM1 に限定しており、その他のメモリはスクラッチパッドとして扱うか、データ移動におけるバッファとして用いるのが基本的な用途になります。
7.2. Memory Word
MN-Core 2 のオンチップメモリについて、メモリ要素の単位には以下の3種があります。
LW (Long Word, 長語): 64-bit word
SW (Single Word, 単語): 32-bit word
HW (Half Word, 半語): 16-bit word
この内、SW は PE メモリ (GRF0, GRF1, LM0, LM1) のアドレスの最小単位に相当し、アセンブリにおけるアドレス表記も SW 単位で行います。ただし、アライメント制約からデータ移動などの操作は LW かそれ以上の単位で行う必要があり、そのため要素数の表記としては LW を主に使います。HW に関しては、基本的に演算器内部で用いる単位であるため、アセンブリにおいては2つか4つ毎にまとめて取り扱います。
MN-Core 2 内部の各メモリ要素 (カッコ内はアセンブリのオペランド) で用いるアドレス単位をまとめると、以下のようになります。
- LW 単位
DRAM (
$d), PDM ($p), L2BM ($lc), L1BM ($lb)- SW 単位
LM0 (
$m), LM1 ($n), GRF0 ($r), GRF1 ($s)- HW 単位
(なし)
注釈
オペランドへのアクセス語長指定 (長語 $l, 2長語 $ll) はアドレス単位とは直接関係はありません。例えば、指定の異なる $m8, $lm8, $llm8 について、読み出し開始地点は同一になります。その代わりに、アドレスインクリメント幅をそれぞれ1,2,4と設定することで、連続領域を重複なくアクセスできます。
注釈
Layout と関連して、Layout 表記における語長との対応をまとめます。Layout におけるアドレスは LW 単位で表記されており、1 LW に含まれる要素数を _W で示します。
例えば、 shape=(12,) である12要素からなるテンソルに対して、その dtype を倍精度 (LW)、単精度 (SW)、半精度 (HW) としたときの Layout は以下のようになります。
LW:
(12,)/((12:1); B@[W,...])(注1_WはB@[W]として表記)SW:
(12,)/((6:1, 2_W:1); B@[...])HW:
(12,)/((3:1, 4_W:1); B@[...])
同じ要素数であっても、より低い精度で持つとメモリ消費が少なくなることが、アドレスサイズが小さくなることで表現されています。
7.3. 浮動小数点数フォーマット
MN-Core 2 における浮動小数点数フォーマットは以下の通りです。
精度 |
符号ビット |
指数部ビット |
仮数部ビット |
|---|---|---|---|
半精度 (HW) |
1 bit |
6 bit |
9 bit |
単精度 (SW) |
1 bit |
8 bit |
23 bit |
倍精度 (LW) |
1 bit |
11 bit |
52 bit |
代表値 |
半精度 (1-6-9) |
単精度 (1-8-23) |
倍精度 (1-11-52) |
|---|---|---|---|
+0.0 |
0x0000 |
0x00000000 |
0x0000000000000000 |
-0.0 |
0x8000 |
0x80000000 |
0x8000000000000000 |
+1.0 |
0x3E00 |
0x3F800000 |
0x3FF0000000000000 |
正の最大の正規化数 |
0x7DFF |
0x7F7FFFFF |
0x7FEFFFFFFFFFFFFF |
正の最大の正規化数 (実数値) |
4.29077e+09 |
3.40282e+38 |
1.79769e+308 |
正の最小の正規化数 |
0x0200 |
0x00800000 |
0x0010000000000000 |
正の最小の正規化数 (実数値) |
9.31323e-10 |
1.17549e-38 |
2.22507e-308 |
正の無限大 |
0x7E00 |
0x7F800000 |
0x7FF0000000000000 |
表現可能な値は、非正規化数、正負のゼロ、正負の無限大のみであり、非正規化数と NaN は表現できません。そのため、仮数部の値に関わらず指数部が all 0 のときは正または負の 0 を表現し、all 1 の時は正または負の無限大を表現します。それ以外の値はすべて正規化数であり、その範囲では IEEE 754 形式に従って解釈されます。
Dtype における、 Half, Float (Float32), Double はそれぞれ上記の半精度、単精度、倍精度に対応しています。
注釈
主に行列ベクトル積和演算の際に用いられるフォーマットに、ブロックフロート形式と疑似単精度があります。これらの詳細についてはソフトウェア開発マニュアルを参照してください。演算結果は元の上記フォーマットに変換されるため、 Dtype とは基本的に対応しません。