MN-Core2 チュートリアルの最初の方
HPCMN-Core
2024-3-13 0:29 JST

MN-Core2 のチュートリアルの最初の方をやってみた。絵もつけて説明するよ。

過去に雑誌インターフェースで書いた記事をおさらいしていると、いつまでたってもMN-Core2 の話になりそうにないから並行して MN-Core2 の話題も書いていくことにする。

階層構造

「MN-Core 2 ソフトウェア開発者マニュアル」の冒頭に「構成」として階層構造が説明されている。MN-Core の絵は出回っているのだが、MN-Core2 の絵は出回っていないので、この「構成」から想像してみよう。

「PE はボードあたり 4096 個」ということなので、1つのチップに PE は 4096 個ある。「L2B は 2 つごと、計 4 つのグループに分かれており、グループごとに 1 つの PDM (PIU Data Memory、PIU は PCIe Interface Unit) という SRAM と、DRAM が付属する」ということで、「MN-Core™第1世代は4ダイ1パッケージで構成されており」だったので、第2世代はその辺りに変更がある。

物理的な詳細はよくわからないけど、いずれにせよ、ソフトウェア的にはグループになっているということがわかっていれば良い

データの転送

計算するためには PE がアクセスできるメモリ領域にデータを存在させなくてはいけなくて、そのためにデータは上の階層構造を順にたどって転送される。

1. PCIe を通してホストからボード内の DRAM へデータが転送される。PDM でもいいけど、ここでは DRAM。

2. DRAM から L2B 内ののメモリブロック(L2BM)にデータが転送される。

3. DRAM から L2B 内のメモリブロック(L2BM)にデータが転送される。

4. L2B から L1B 内のメモリブロック(L1BM)にデータが転送される。

5. L1B から MAB 内の PE のレジスタ(GRF0, GRF1) あるいはメモリ(LM0, LM1) のどこかにデータが転送される。

6. PE 内を詳しく見るとメモリ領域として GRF0 か GRF1 か LM0 か LM1 があるのでその何処かに L1B からのデータが転送される。

ステップとサイクル

実行するときにステップとサイクルという概念が出てくる。「PE 命令は 1 命令で L2B 以下全体を 4 サイクル制御する*2 。この 4 サイクルの単位をステップと呼ぶ」ということなので、次のような模式図になる。

これがどういうところに効いてくるかというと、3.6.3 ハザードの回避にあるように「命令間で適切にステップ数を空けなければならない場合がある。」で考慮しなければならなくなる。「書き込みが完了するまで読み出しを待たなければならないことに起因するデータ競合」は普通の CPU でも発生するのでおなじみかな。

「命令ストリームは Auto stride モードと Flat モードの 2 つのモードを持つ。」とのことだからこの辺も関係するみたいだ。おいおい調査する。

チュートリアルを実行

触りの部分だけ、チュートリアルを実行してみた。study-mncore2として github で公開したけど、まぁ tutorial のコピーだから目新しさはない。

「LM0/LM1 に書き込んだ後は、ポート衝突により 2 ステップ空けてからでないと読み出しを開始できない。」とか「GRF0/GRF1 に書き込んだ後は、データ競合により 1 ステップ空けてからでないと同じアドレスからは読み出しを開始できない。異なるアドレスであれば同時に書き込みと読み出しを独立に発行できる。」とかを試してみる。更に、「正確には、PE メモリへの書き込みを伴う命令は完了まで 6 サイクルを要する。」のサンプルを見ながら、/1000 とか書いてサイクルの動きを見る。

test.vsm
imm f"1.0" $r0/1000
nop
dvadd $lm0v $r0e $ln0v

ということは、何も指定しないと同じ命令を4回繰り返すのかね?"通常"はそんな必要ないから、/1000 を勝手に挿入してくれても良さそうだけどね。
何を通常とするかによるのか。アクセラレターだから連続実行して高速化したいので、それが標準になっていると解釈しましょう。