4 マルチプロセサ接続の高性能化
マルチプロセサシステムを構成する場合、これまで述べてきたように、コモンバスを使って複数のプロセサコア+プライベートキャッシュのペアとメモリ(あるいはシェアードキャッシュ)を接続するというのが一番簡単な方法である。しかし、コモンバスは一時には1つのメモリアクセスしか実行できないので、プロセサの数が増えてくると渋滞が起こってしまう。そうなると、プロセサ数を増やしても性能が上がらず、逆に性能が低下してしまうケースも出てくる。
メモリアクセスを強化するアドレスインタリーブ
片側1車線の道路が渋滞してしまう場合は、道路を拡張して、片側2車線とか3車線にすれば、より多くの交通量をさばくことができる。これと同じで、プロセサコア+プライベートキャッシュとメモリ(あるいはシェアードキャッシュ)の間をつなぐバスを複数本にしてやれば、より多くのプロセサのメモリアクセスをさばくことができるというのが、メモリインタリーブの考え方である。
複数本のバスを作ると、どのメモリアクセスがどのバスを使うかという問題が出てくる。メモリをアクセスするときには各バスの混み具合を判断して、すいているバスを使うというのが理想的であるが、この判断はなかなか面倒である。また、どのバスもすべてのアドレスのメモリにアクセスできるようにする必要があり、メモリから見ると、同じアドレスに複数のバスから同時にアクセスが来るという場合に対処する必要もある。
このため、一般的に使われる方法は、メモリのアドレスによってどのバスを使うかを決めるという方式である。この構成では、1つのバスやメモリは飛び飛びのアドレスを分担し複数のバスが重なって全部のアドレスをカバーすることになり、このような構成をアドレスインタリーブ(Address Interleave)と呼ぶ。
図4.1ではコモンバスとメモリは4つのWayに分割されており、コモンバスのそれぞれのWayごとにバスの信号線とアービタを持っている。従って、プロセサAがM-1のメモリをアクセスするのと同時にプロセサBがM-0のメモリをアクセスするということができる。
なお、図4.1ではWay数=4、プロセサ数=4となっているが、これらは同じ数である必要はなく、Intelのプロセサでは、4つのプロセサコアが16wayのシェアードキャッシュに接続されているものがある。
図4.1では省略されているが、各Wayにアービタがあり、2つ以上のプロセサコアが同時に同じメモリ(例えばM0)のアクセスを要求した場合は、そのWayのバスアービタが使用権を調停するので、どれか1つの要求だけが許可されることになる。
4Way構成の場合、4つプロセサコアのメモリアクセスが互いに異なるWayとなり、全部のコアのメモリアクセスが同時に実行できるのは稀であるが、まあ、2つか3つのコアからのアクセスならば、それぞれ異なるメモリにアクセスし、同時に実行できる確率が高い。つまり、4Way構成にすることにより、単一のコモンバスを使う設計に比べて2~3倍のメモリアクセスを実行することが可能になる。
メモリアドレスとM-0~3の対応であるが、キャッシュラインのサイズを単位として、最初のアドレスのキャッシュラインをM-0、その次のアドレスのキャッシュラインをM-1という風に割り振るのが一般的である。
図4.2のようにアドレスビットを割り振ると、0番地からの64バイトはWay-0、次の64バイトはWay-1、その次はWay-2、Way3に割り振られ、その次は、また、Way-0というようになる。
このようにメモリアドレスを割り振ると、各Wayが分担するメモリアドレスは図4.3のようになる。
原理的にはWay番号を指定するビットはより上位のビットを使っても良いのであるが、命令やデータは連続した番地をアクセスすることが多く、あまり上位のアドレスビットでWay選択を行うと、プロセスの使うすべてのメモリが1つWayに収まってしまい、そのWayのメモリだけを使うようになってしまう。どのプロセスもすべてのWayをほぼ同等の頻度で使わないとWayの競合が起こりやすくなり、インタリーブの効果が薄れてしまう。