ZeroLoom

MN-Core に関する調査ノート

October 7, 2024
3 min read
Table of Contents

MN-Core 独自の設計思想


  • メモリ空間が独立している
  • 演算器近傍の高速なメモリの活用(Near-memory Computing)
  • ハードウェアとしての制御機構を持っていない
  • ネットワーク制御、キャッシュコントローラ、命令スケジューラなどのハードウェア内部の挙動でブラックボックス化されていた部分をソフトウェアのレイヤーに任せることによって、レジスタと演算器の面積を拡張している

MN-Core のツリー構造


  • 以下の階層的な構造を持ったチップが 4 枚並んで 1 つのボードを構成している
名称個数
L2B16個
L1B8個
MAB16個
PE4個
  • PE には高速にアクセスできるローカルメモリ(LM)が搭載されている
  • MN-Core の場合、演算処理は DRAM に対して READ/WRITE するのではなく、LM 内で完結させることが重要
  • 一次元のアドレス空間を持つ DRAM に対して、MN-Core の LM は一次元のアドレス空間を持たない
  • ツリー状に分散された LM がそれぞれのアドレス空間を持っているため、多次元配列のメモリアウトを行う strided layout が使用できない
  • 多次元配列を展開するためには TensorLayout という新しいレイアウトの記法を使用する
  • LM 間の集団通信だけではなく、多数の行列ベクトル積専用回路付き演算ユニットでの浮動小数点演算を、VLIW 形式の命令により並列動作させる必要がある

PE

  • 実際に演算を担当するコア部分
  • ALU/GRF0/GRF0/LM0/LM1/T で構成されてている
  • ALU では整数演算を処理
  • 64 ビット SIMD
  • 多くの SRAM(LM)で構成されている
  • GRF/LM 領域にのみアクセスが限定されているため、DRAM へのアクセスはできない
  • 演算を行うためには DRAM -> L2B -> L1B -> PE というデータ転送を行う必要がある

MAB(Matrix Arithmetic Block)

  • 4 つの PE と 1 つの MAU(Matrix Arithmetic Unit) で構成されている
  • MAU は PE から入力データを受け取り、浮動小数点演算を行い、PE に戻す
  • MAU は行列演算用の行列レジスタを持っており、行列ベクトル積で使うための行列を保持する
  • 行列レジスタが 2 面で構成されているため、行列の double-buffering が可能
  • 積和演算、行列レジスタ書き込み、行列レジスタ転置読み出しが可能

ハードウェアとしての制御機構を持っていないとは


  • MN-Core は PE に命令発行ユニットおよび制御ユニット(プログラムカウンタとか)を持たない
  • ホスト側(CPU)で命令列を生成し、PCIe 経由で流し込む

MN-Core における命令の定義


  • PE 命令
  • MAU 命令
  • L1B 転送命令(L1B - MAB 間の転送命令)
  • L2B 転送命令(L2B - L1B 間の転送命令)
  • DRAM/PDM 転送命令(DRAM - L2B 間の転送命令)
  • 上記の命令を同時に発行することが可能

MN-Core における命令実行


  • PE 命令と MAU 命令は 4 サイクルの間に同一命令を実行する
  • サイクルごとにアドレスをインクリメントする仕組み、または異なるアドレスを指定する仕組みが存在する
  • 条件分岐は Mask として表現できる
  • 各種 SIMD 命令によくある、フラグをみて特定のスロットのみ出力する cpm + select と同様のイメージ
Sample1
dvadd $lm0v $lr0v $ln0v
説明
1. LM0 のアドレス0 と GRF0 のアドレス0 を開始位置として、64 ビット長単位でアクセス
2. 読み込んだ 2 つの 64 ビット長データに対して、倍精度加算を行う
3. 結果を 64 ビット長単位でアクセスし、LM1 のアドレス0 を開始位置とする場所に書き込む
4. 各アドレスはサイクル毎に 1 ずつインクリメントされる
Sample2
hvmul $lm0v $lr0v $ln0v
説明
1. LM0 のアドレス0 と GRF0 のアドレス0 を開始位置として、64 ビット長単位でアクセス
2. 読み込んだ 2 つの 64 ビット長データに対して、半精度 * 4 とみなして半精度乗算を行う
3. 結果を 64 ビット長単位でアクセスし、LM1 のアドレス0 を開始位置とする場所に書き込む
4. 各アドレスはサイクル毎に 1 ずつインクリメントされる
Sample3
dvadd/0101 $lm0v $lr0v $ln0v
説明
1. LM0 のアドレス0 と GRF0 のアドレス0 を開始位置として、64 ビット長単位でアクセス
2. 読み込んだ 2 つの 64 ビット長データに対して、倍精度加算を行う
3. 結果を 64 ビット長単位でアクセスし、LM1 のアドレス0 を開始位置とする場所に、2 サイクル目と 4 サイクル目のみ書き込む
4. 各アドレスはサイクル毎に 1 ずつインクリメントされる

演算器近傍の高速なメモリの活用(Near-memory Computing)


GRF0/GRF1

  • GRF0 および GRF1 という 2 つのレジスタファイル(またはメモリブロック)が存在する

  • GRF0GRF1 は、それぞれが 2KB の容量を持つユニット(各レジスタファイルのサイズが 2KB という意味でもある)

  • 各サイクル(クロックサイクル)ごとに、 1 回の読み取り(read)と 1 回の書き込み(write)が可能

    • レジスタファイルが 1 サイクルごとに同時に 1 つのデータを読み出し、1 つのデータを書き込む能力があることを意味する
    • 並列に読み書きができるということ
  • 各サイクル(クロックサイクル)ごとに最大 32Byte のデータの読み書きが可能

    • この数値は、1 回の読み取りまたは書き込みでの転送量(データ幅)を示す
  • GRF0 および GRF1 は、1 サイクルで 32Byte 分のデータの読み書きを行うことができ、データ転送帯域幅(データの送受信能力)が非常に高い設計になっている

  • GRF0GRF1 のそれぞれが、2KB の容量を持ち、各クロックサイクルで同時に 32Byte のデータの読み書きが可能な高性能レジスタファイル(メモリブロック)である

LM0/LM1

  • LM0 および LM1 という 2 つのメモリユニットが存在する

  • LM0LM1 は、それぞれが 16KB の容量を持つユニット

  • 各サイクル(クロックサイクル)ごとに、1 回の読み取り(read)または 1 回の書き込み(write)が可能

    • 1 サイクルでどちらか一方の操作しかできず、同時に読み書きを行うことはできない
    • 読み取りまたは書き込みの動作が交互に行われることを意味し、読み取りと書き込みの操作が並行して行える GRF0 や GRF1 とは異なる
  • 各サイクル(クロックサイクル)ごとに最大 16Byte のデータの読み取りまたは書き込みが可能

    • この数値は、1 回の読み取りまたは書き込みでの転送量(データ幅)を示す
  • LM0LM1 は 16KB の大容量である一方、各サイクルでの操作が「1サイクルにつき 16Byte のデータを1回の読み取りまたは1回の書き込みのいずれか」に制限されている

参考文献