Ryuz's tech blog

FPGAなどの技術ブログ

クロスバースイッチの規模考察

はじめに

今日は、最近のプロセッサをウォッチしている中での素人の妄想を書いてみます。

プロセッサの性能と規模の法則としてポラックの法則というものがあります。

これは簡単に言うとプロセッサの性能を2倍、3倍、4倍にするには、プロセッサに適用するトランジスタの数を4倍、9倍、16倍に増やしていかないといけないというものです。 半導体の微細化が進んでムーアの法則でプロセッサに使えるトランジスタ数が増えていっても、プロセッサがさほど高性能化しないことをよく表している法則に思います。

ポラックの法則はまだシングルプロセッサが周波数競争をしていた時代からあった法則ですが、現在の周波数が頭打ちして並列度を上げていくしかない状況においてもある程度理にかなった法則な気がしています。

この要因の1つにNが増えたときに対角線がNの二乗で増えていくという、安直な話が深く関連しているのではないかと考えてみました。

対角線の増え方

この話は、だいぶ前に下記の記事で Masayukis 氏に LVT Multiport RAM を教えて頂いた話とか、

ryuz.hatenablog.com

半導体雑談会で HBM を教えて頂いた後に、下記などを参考に調べてみたりとか、

vengineer.hatenablog.com

ありとあらゆるところで、いわゆる クロスバースイッチ が課題になっている気がしています。

スーパースカラプロセッサの並列実行

身近なパソコンでもスーパースカラ実行が行われるようになり、OoO(Out of Order) 実行できるプロセッサは今や身近にどこにでもあるものになりました。

Instructions per second - Wikipedia によると 1コアで1サイクルに並列実行できる命令数(instruction per clock per core)は 10を超えるようなものも出ているようです。

一般的に並列実行可能な実行ユニットが増えると少なくとも実行ユニットで同時実行できるだけ同時に命令デコードできないといけませんし、デコードした結果はあらゆる命令を含むのでどの実行ユニットにも命令供給できないといけません。実行ユニットもいろいろあって面倒なのでここでは全部同じALUがあるというシンプルなモデルでオーダーだけを考えてみます。 ALUはレジスタファイルから値を読みだして演算してまたレジスタファイルに書き戻します。レジスタファイルもALUの並列数が増えるとレジスタリネーミングなどを行う為にレジスタ数自体も増えますし、レジスタファイルからはも同時実行に必要な数だけレジスタファイルから読みだせないといけませんし、同時に演算した結果は一度にに書き込めないと意味がありません。そして汎用レジスタを謡う以上はALUはすべてのレジスタを演算対象に出来ないといけないのでフルクロスバスイッチになるはずです。

超テキトーな絵を書くと、下記のようにあちこちにクロスバスイッチ的なものが挿入されることになりそうに思います。

超テキトーなスーパースカラのモデル図

そして並列実行数が増えるとクロスバスイッチは目に見えて複雑になってるはずです。

レジスタ周りのクロスバスイッチはこんなことになってないか?

実際には、こんなシンプルな話ではなく、OoO を行う為にありとあらゆる機構が入っていて、ものすごい数の実行可能かの並列判定だったり、リオーダーバッファでの並び替えであったり、リネーミングを引くためのCAM(Content Addressable Memory)であったり、いろいろあるんだと想像されます。

Cardyak 氏のポストを勝手ながら引用させて頂くと、昨今のプロセッサは凄いことになっているようです。

メモリもすごいことに

HBM については、雑談会で教えてもらうまで知らなかったのですが、DDR4-SDRAM みたいなものが 8並列とかそんな感じに入っているものなのですね(DDR5-SDRAMも既にDDR4-SDRAMが2並列に入っているような構造のようですが)。

AMD-Xilinx の Versal の HBM 周りをPG313から引用させてもらうと、下記のような NoC と switch のお化けのようです。

Versal の HBM のアクセス機構

CPUやGPUではさらに HBM が 4 つとか 6つとかついていますので、例えば HBM が 4 つに、コアが32個あるような CPU だと、32x32 の対応関係を作らないと行けなくなります。

ここで全部をクロスバスイッチではなく、NoC などと組み合わせる Versal のようなアプローチは個人的には正解に思います。 フル接続のクロスバーは NxN のリソースを消費するのに、同時接続数は N しかないのでトランジスタ稼働率としてはクロスバスイッチはとてももったいなく思えるからです(ダークシリコンの問題もあるのでちょうどいいという可能性もありますが)。

一方で、先に述べたプロセッサの中のレジスタファイルの前後なんかはそんなことは難しい気はするので、これはこれでそのうち破綻するんじゃないかと心配してみたりもします。

こちらにある HBM 12個なんか、12x8 で 96並列のメモリになるわけですが、中はどうなっているのでしょうね?

vengineer.hatenablog.com

おわりに

ムーアの法則もいつまで続くのかわかりませんが(もう終わった説もありますが)、とにもかくにも半導体のプロセス進化は今も進んでいます。 プロセッサの効率を考えたときに、一個のプロセッサを高速化する話も、マルチコアとマルチメモリで並列化する話も、どちらも 対角線的な接続 が今後ますます強いボトルネックになっていく気がしています。

FPGAしか知らない筆者ですが、FPGAでやるとマルチプレクサだらけになる世界しか想像できないので、ASICでもFPGAほどではないにせよオーダーとしてはやはり二乗のオーダーでインパクトがあるのではないかと想像しています。

ソフトウェアのアルゴリズムではよく O記法で O(N2)などと演算オーダーを表しますが、最高次数以外を無視します。なぜなら N が大きくなるとそれ以外は微々たるものになるからです。

結局のところ、疎結合を許容しない限りこのオーダーは変わらないわけで、いずれまた 汎用レジスタより専用レジスタUMA より NUMA、スーパースカラよりシンプルなMIMD、OpenMP より MPI などのようになっていく日が来そうな気がしなくもないな、など素人の戯言を述べたところで、今日の妄想を締めたいと思います。