Cmod A7ボード(FPGA)を使って、オリジナル16ビットCPUコアMoscoviumの開発を進めています。
本章から暫く、1つのマイコン上に多数のCPUコアを集積する、多コア化をテーマに進めていくことになります。
世間一般的には、1つのチップ上に複数のCPUコアが搭載された物をマルチコアCPU(multi-core CPU)と言います。一般的にはマルチコアで通っているのですが、本ページでは、敢えての「多コア」→ポリコア(poly-core)と言う言葉を使って区別して行こうと思います。
※polygonは多角形、polyhedronは多面体、と言う事で、polyは「多」の接頭子です。
マルチコアCPUと言えば、PCやスマホなどのMPU(Micro Processing Unit)では、4コア(quad-core)や6コア(hexa-core)、8コア(octa-core)🐙等が主流です。ムーアの法則がフン詰まって以降、CPUの動作周波数が上がらなくなった代わりに、マルチコアによってパフォーマンスを上げるのが流行りです。
一方、最近何かと話題となるNVIDIAのGPU(Graphics Processing Unit)に至っては、なんと!6,000コア〜18,000コア(※)が集積されているらしいです。生成AIサーバ向けとして脚光を浴びていますよね?その様な多数のコアを持っていることで、人工知能AIの基本となる、ニューラルネットワークを処理するのに適しているらしいです。
※NVIDIA GPUのコアはCPUではなく、CUDA(Compute Unified Device Architecture)と呼ぶ汎用演算器なので、CPUのコア数と同列で比較するのは正しくありません、念のため。
コア数の呼び名は、一般的には以下の様な感じでしょうか?
ですが本ページでは、ここも敢えて、化学分野で有機化合物の命名等に使われるIUPAC命名法に寄せて行こうと思います。
一般的な呼び名でも、6コア以上のコア数では、IUPAC命名法が使われている様なので、本ページでは上の通りとします。
※IUPAC命名法では、モノ(1)、ジ(2)、トリ(3)、テトラ(4)、ペンタ(5)、ヘキサ(6)、……、です。
本HPにて開発中のMoscoviumシリーズマイコンにも、2コア(dual core)の展開があります。以下記事等をご参照ください。
「#17-1 双頭の狼」 (から始まる3章等)
今回テーマとするポリコアは、2コアを越えて、なるべく多くのCPUコアを集積する事を目指します。
とは言え、手持ちのCmod A7ボード(FPGA)には、集積可能な論理規模に上限があります。Cmod A7ボードに書き込むことなく、シミュレーションだけやって、お仕舞いにする様では電子工作(Arduino D.I.Y.)の名折れとなりましょう。
ちゃんとCmod A7ボードに実装可能な範囲でコア数の上限を目指したいと思います。その為には、論理規模がなるだけ小さなCPUコアを使う事が肝要と、なります。各CPUの論理規模はこちらをご参照ください。先日スリム化したMoscovium-BSコアや、Tennessineコアを使ってポリコア版マイコンを構築していくのが正道です。
最小のTennessineであれば、1,000LUT程ですね。周辺回路に5,000LUT程度を見積もると、Cmod A7ボードに搭載されたXilinx XC7A35T FPGAチップの論理容量である、最大20,800LUTを考え合わせると、
最大コア数≒(20,800LUT(最大)−5,000LUT(周辺))÷1,000LUT(Tennessineコア)≒15.8コア
と、言ったところですかね?まあ、機能を絞り込んで頑張っても16コアって感じです。
もう少し具体的に検討して行くと、以下のプログラマモデルに行き着きます。
状態レジスタsrのIDフィールドが、CPUのコア番号を保持するフィールドです。拡張前の時点ではID[1:0]の2ビットを割り当てていました。SrレジスタのIDフィールドには、上位側に2ビットの空き領域があるので、そこへIDフィールドを拡張して合計4ビットにします。
Moscoviumのデュアルコアでは、CPU ID番号を、1または2としています。ID=0と3は、別な情報を示す為に使っているため、IDフィールドは2ビット有っても、コア数としては、2コアが最大でありました。
ポリコアでも、ID=0とID=15は、別な情報を示すために使うので、結果、ID[3:0]の4ビットで表現可能なコア数は最大で14コアと、なります。前節で概算したTennessineの最大実装可能なコア数(15.8コア)とも近い値となりました。
決定。コア数は最大14コア(tetradeca-core)を目指します。IDフィールドの数値とコア番号については以下の通りです。
Sr[ID]フィールド:
ポリコア版では、ID=2〜15が読み出されます。
ID=15は、メインCPUのプログラムで、「ポリコア版」であることを認識するための特殊な値です。CPUとしてはCPU15では無く、CPU1(メインCPU)と呼びます。CPU1だけは、IDフィールドから読み出せる値とコア番号が不一致なので注意してください。
一旦、何も考えず、バスステートコントローラBUSCに対して14個のCPUコアを並列に接続してみると、以下図となります。
CPUが1個や2個ならまだしも、最大14個も接続されることを考えると、このトポロジでは破綻するのが見えています。共有メモリであるROMやRAM、果ては共有リソースであるI/Oユニットへアクセスするのに、全てのCPUがBUSCを通して、メモリバスへアクセスする事になるからです。
BUSC(従ってメモリバス)がボトルネックとなって、処理が滞ることは容易に想像できます。
まず第一段階として、「多数のコアが共有メモリにアクセスしてプログラムを実行する」という図式その物を、根本的に打開しなくてはなりません。
Moscoviumコアは、ROMからプログラムコードをフェッチして、それを実行します。実行に際して、スタックやワーク領域などが必要となった場合、RAMに一時データを記憶するのです。この様に、ノイマン型CPUの基本動作にはROMとRAMへのアクセスが欠かせません。
ROM/RAMへのアクセスがボトルネックとなるので共有メモリがダメと、なったら、占有メモリもしくは専用メモリなのです。
プログラム実行に必要なROM/RAMを、特定のCPUコア専用に確保したのが上図です。この階層をPUNIT(Poly-core Unit)階層と呼ぶことにします。
上図のROM/RAMは、図中のMoscoviumコア専用です。メモリバスとは分離されているので、他のCPUコアからアクセスする事はできません。逆に、図中のMoscoviumコアからは、誰にも邪魔されることなく、いつでも最速でアクセス可能なメモリです。
この様に、CPUと密接に結合したメモリを密結合メモリ(TCM;Tightly Coupled Memory)と呼びます。密結合メモリコントローラTCMC16は、密結合メモリ空間以外へのアクセスだけをメモリバスへブリッジする機能を果たします。
このPUNITは、ポリコア版マイコンに於いてCPUコアの置き換えとなります。MoscoviumだのTennessineだのというCPUコアがインスタンスされていた場所に、PUNITがインスタンスされる、と言う事です。従って、PUNITのインターフェイス信号は、基本的にCPUコアと揃えておく必要があります。
このPUNITをCPUコアの最小単位として、最終的に最大14コアを目指しましょう。
Moscoviumは、ブートモードでシリアルモニタからプログラムコードをROMへダウンロードできる様にしてあります。
今回、肝心なROMは密結合メモリとなって、CPUコア毎にN倍化されています。図中に示した「ROM write」インターフェイスが、ブートモードでの書き込みインターフェイスです。N倍化された密結合ROMへ、この書き込みインターフェイスを使ってダイレクトに書き込む事ができます。
このインターフェイスを含め、ポリコア版に対応するための専用インターフェイス信号を幾つか追加が必要だと判ってきました。逐次追加しながら設計を進めて行きます。
メモリマップは、こちらで示したのと同じです(以下図)。
ポリコア版では上のメモリマップに於いて、ROM領域(≦16Kバイト)とI-RAM領域(4Kバイト)が密結合メモリ空間となって、コアの数だけN倍化されます。それ以外のRAM領域やI/O領域、24ビット拡張メモリ空間が、メモリバス経由のアクセスで、共有リソースです。
メモリバス経由、共有リソースへのアクセスではバス権調停が適応されます。複数CPUからの同時アクセス要求は調停されて、優先順位の高いCPU1個だけがアクセス権を勝ち取るため、他のCPUは待たされます。その代わり、コア毎にN倍化される事は無いので、1組搭載すればOKなのです。
ポリコア版ではコアの数だけ密結合メモリが実装される事は、議論した通りです。しかし、Cmod A7ボード(FPGA)のRAMマクロ数には上限があります。Cmod A7ボードのFPGAチップXC7A35Tで使用可能なRAMマクロ数は、最大50個(1個当たり4Kバイト)なので、14コアを考えると1コアに割り当て可能なRAMマクロ数は以下の通りです。
50個(最大RAMマクロ数)÷14コア≒3.5個≒14Kバイト
ROM/RAM合わせて、上のサイズが上限です。密結合メモリ以外にもRAMマクロの用途は有るので、その分も捻出する必要があります。よって、手持ちのCmod A7ボード(FPGA)に実装可能な密結合ROMの上限は16Kバイト、密結合I-RAMは4Kバイトと考えて良いです。
まず、密結合メモリと言う概念を導入して、メモリバスのボトルネックを解消する措置を取りました。引き続き、多コア化の設計を進めて行きます。