マルチプロセサ

人間が作業する場合でも、仕事が多ければ、複数の人で作業を分担すれば速く進めることができる。これと同じで、より性能を上げるために1個のプロセサではなく、複数個のプロセサを使うということが考えられ、古くは、1965年のIBM 360 Model 65で2台のプロセサがメモリを共有して処理を分担するマルチプロセサ構成が採られた。

マルチプロセサのメモリアクセス

マルチプロセサの場合、メモリをアクセスするプロセサが複数存在するので、各プロセサは何時でも自由にメモリを使えるわけではなく、他のプロセサがメモリを使っている場合は終了を待ち合わせる必要があるし、メモリが空いていたとしても、複数のプロセサから同時にメモリを使いたいという要求がある場合には、プロセサ間の優先順位を決めて順番に使わせるようにする必要がある。

図9.1に示すように、メモリを使用する場合は、プロセサは、先ず、RQRequest)信号線を使って調停機構(Arbiter:アービタという)に使用要求を送る。そして、アービタは、複数のプロセサから要求がある場合には、どのプロセサにコモンバスの使用権を与えるかを決定し、ACK(Acknowledge)信号線を使って、使用権を与えるプロセサには使用可(ACK)、その他のプロセサには使用不可(NACK)という信号を返す。そして、使用可の応答を得たプロセサがコモンバスを使用してメモリにアクセスを行う。そして、アービタは、到着している要求を見て、次のメモリ使用権をどのプロセサに与えるかを決定する。

図9.1 コモンバス使用権の調停によるメモリアクセス制御

アービタがどのように使用権を与えるプロセサを決めるかは使用形態に依存する。組み込みシステムのように各プロセサの処理分担が決まっており、処理の優先度が固定されているというようなケースもあるが、汎用のプロセサでは、内部にカウンタを持ち、使用権を与えるプロセサをグルグルと順番に廻るラウンドロビンのように、全プロセサに均等に使用権を与える方法を用いるのが普通である。

そして使用権(Acknowledge(ACK)、あるいはBus Grantなどと呼ぶ)を与えられたプロセサがメモリアドレスなどの情報をコモンバスに送り出してメモリをアクセスする。このような方法を採ることにより、複数のプロセサで1つのメモリを共用することが出来る。

しかし、多くのプロセサを用いる大規模なマルチプロセサシステムでは、一時に1つのプロセサしかメモリにアクセスできないということになると、メモリ待ちの長い行列が出来てしまって性能が上がらないことになってしまう。このため、メモリ全体を番地で分割して、それぞれのグループ(これをバンクという)ごとにアクセスを可能にするインタリーブという方法が用いられる。例えば、キャシュラインサイズを単位として、その上の数ビットのアドレスでバンクを選択するというような方法が一般的である。次の図9.2に4バンクのメモリの例を示す。この例ではアドレス0~63+256*n(nは0~の整数)をバンク0、64~127+256*nをバンク1、128~191+256*nをバンク2、192~255+256*nをバンク3が担当するという構成となっている。そして、各バンクごとに図9.1に示したようなアービタとコモンバスを設けることにより、4つのメモリバンクを並列に動作させることができるようになる。

図9.2 4バンクのメモリ構成

このようなインタリーブを行うと、各プロセサからアクセスするメモリ番地がランダムであるとすると各バンクへのアクセスの確率は均等であり、4バンクのメモリに対して2つのアクセスが異なるバンクに行く確率は3/4、3つのアクセスがすべて異なるバンクに行く確率は3/8、4つのアクセスが全部違うバンクに行く確率は3/32である。つまり、4バンクに分割して、それぞれが独立にメモリアクセスを処理できるようにすると、平均的に2つから3つのメモリアクセスを並行して処理できるようになる。