Ryuz's tech blog

FPGAなどの技術ブログ

MN-Coreを素人考察してみる

はじめに

先般 MN-Ccore Challenge なるものが開催され、私もスキマ時間に気分転換的にちょこちょこ挑戦していたのですが(順位はまあ微妙な感じでしたが)、とても面白いアーキテクチャだなと思いました。

普段 FPGAプログラミングが多い私ですが、いろいろ新しい観点で頭に刺激を頂きました。

今更私なんかが考察する余地もない気はしますが、折角なのでプログラミングではなく、プロセッサアーキの方を少しだけ感想程度に記録しておければと思います。

いろいろ資料も公式に公開されていますし、コンテストも終わったようなので、安心してあれこれと自分用の勉強の教材にして楽しませて頂きたいなと思います。

なお、ほんとに素人考察なので、あんまりマサカリは投げないでおいてあげてください(言い訳)。

どんな構成なのか

最初に「ソフトウェア開発者マニュアル(SDM)」を読んでみて、書き起こしたのが下記の図です。

SDMを読んで最初に書いた図

私が適当に書いたので間違ってるかもしれませんが、とりあえず、階層構造というか、ピラミッド構造というか、そういう風になっているようです。

似たようなものとして思い出したのが PEZY Computing さんの PEZY-SC2 などの資料で見た構造です。

一方で、最近の AI系のコアだと、Versal の AI コアでもある AMDXDNAであったり、 Tenstorrent の Whormhole であったり 二次元メッシュ構造をよく見るような気がするので、それぞれにどういうメリットデメリットがあるのかは興味深いところです。

MN-Core はというべきか、 MN-Core もと言うべきか、キャッシュメモリが存在しないアーキテクチャなので、階層間での明示的データ転送が一つの大きな肝になってくるのでは無いかと思いました。

階層があるかどうかで、お隣さんとの距離感に重みがあるわけなので、このあたりの向き不向きが適用するアプリによってありそうな気がしなくもありません。

レジスタファイルではなくメモリ

次に肝心な計算ユニットであるPEですが、公式の図に私が勝手に赤字で落書きさせて頂いたのが下記ですが、なんとプロセッサなのにいわゆるレジスタファイル(汎用レジスタ)がなさそうです。シングルポートのメモリや、書き込み専用と読み込み専用のデュアルポートになっているメモリなど、比較的シンプルなメモリが演算器にそのまま繋がっています。

レジスタファイルではなくメモリ

これはFPGAプログラマ的には凄くいいなと思いました。以前こんな記事こんな記事を書きましたが、FPGAの大敵である大量ポートのレジスタファイルなどは不要で、FPGAにあるBlockRAM でも同じような構成は低コストで再現できそうです。おそらくLSIにおいてもトランジスタ効率の良い実装なのでは無いでしょうか?

ではなぜこんなことが出来るのかと考えてみると、4サイクルを1ステップとする命令体系 にあるような気がします。普通は1つの命令で4データ処理すると言われると、4並列のSIMDを想像してしまいますが、MN-Core では1命令を4サイクルで実行します。

以前私がこの記事でバレルプロセッサを作った話を書きましたが、同じ原理で依存関係のないデータが並んでいれば、ハザードを起こさずにパイプラインを深くすることが出来ます(SIMD並列できるようなデータ同士には演算順序の依存関係はないので)。そうすると多少レイテンシのかかるメモリであっても汎用レジスタのように利用可能になってくるようです。

プログラマSIMD命令に慣れている ことを逆手にとって、SIMDっぽい命令体系を直列実行してパイプラインハザードを回避している と捉えるとすごく面白い気がします(注:個人の感想です)。

また、4サイクルで1ステップと言いつつ、アドレスだけは4サイクル分個別に投入できる命令体系です。これはもう命令ストリームではなく、アドレスストリームとも言えるのでは無いでしょうか? FPGAプログラミングでいろんなところでアドレスジェネレータが重要になることがあるので、感覚的にはアドレスだけ命令密度が高いのもしっくりくるところがあったりもします。 まとまった単位で扱わないと性能の出ないDRAMに比べて、ランダムアクセスが得意なのがSRAMなので、ローカルSRAMにデータを持ってきた後はそこをフルにプログラムから使えるのはある意味でデバイス特性をフルに引き出していると言えるのかもしれません。

対して ALUなどの命令切り替えは 4サイクルに一回で十分 というのも、毎サイクルどころか1サイクルに異種の命令を何個も並列発行する現在のアオウトオブオーダーのスーパースカラプロセッサに隠れた無駄を指摘しているアンチテーゼにも思えます。

どこをプログラミングしているのか?

通常のCPUであれば 「ALU に何をさせるか」をプログラミングさせるかと思います。一方で、MN-Core ではどうやら、二モニックこそそれっぽく見せかけているものの、実体はマルチプレクサのスイッチをプログラムする仕組みになっているようです。

マルチプレクサの切り替えをプログラム

そしてこれらは決して巨大マルチプレクサではなく、一個一個はそれこそFPGA のLUT で構成しても許容できる程度のコンパクトなものになっています。そしてこれらもまた4サイクルに一回切り替えられれば十分という、従来の固定観念を見直させてくれるなかなか興味深い構成となっているように思いました。

マルチプレクサの切り替えは データ経路のプログラミング に他ならないので、その点はHailoとか、ルネサスDRPなどに通じる部分もひょっとするとあるのかもしれません。

FPGAプログラミングとの違い

それでもやはり汎用計算機の宿命なのかなと思ったのが、PE内で ALU なり MAU なりで演算されたデータはまた元のところに戻ってきてぐるぐる回りながら演算する構成であるところでしょうか。フォワーディングレジスタのおかげでかなり面白いデータ流が作れそうですが、やはりサイクル内ではMABに閉じた流れにはなりそうに思いました。

筆者が画像処理が多かったせいかもしれませんが、FPGAプログラミングではALUのような多目的な演算器ではなく固定の演算を並べて配置する事が多いので、データはある演算器で計算したら次の演算器に渡されるといった、パイプラインを構成する事が多いように思います。もちろんそれはFPGAはASIC化されてないFPGAのままだから出来るプログラミングではあるのですが、やはり少し毛色の違いは感じてしまいました。

AVX-262144 というネタも飛び出しておりましたが、全部のPEが同時に全部同じことをする という並列プログラミングの宿命なのかもしれません(それで FizzBazz も解けてしまうのだから驚きなのですが)。

おわりに

LSI上に存在するトランジスタリソースを如何に高密度に演算に割り当てるか?」という問題と「如何に汎用性を持たせるか?」という2つの相反する問題に限界まで挑んでいるのが昨今のプロセッサかと思います。

そんな中でかなり理論限界に迫っているプロセッサの一つが MN-Core なのかとは思います。限界に近づくほどにいろんな特徴が見えくるのは感じました。

随所で参考になりそうなものはいろいろありましたので、今後のFPGAプログラミングの参考にさせて頂きたいなと思った次第です。

余談ですが、きっとPFNさんの中では試作段階でFPGAでの評価とかもされてるのではないかと想像しますが、FPGAにも優しい設計になっていそうな気はしました。

あと、今回のチャレンジで上位スコアを取るような方々が特定の問題を解くためのFPGAプログラミングなんかしたらとんでもなく凄いコードが出てくるんだろうなと、凄い人たちの凄さを改めて体感した次第でした。