火曜日, 2月 12, 2013

マルチプロセッサの回路設計

それではまず、レジスタレスアーキテクチャの基本要素となる、アキュムレータマシンの回路を実際に設計してみましょう。

データの流れに従って、大まかにブロック図を描いてみます。アキュムレータマシンの内部状態は基本的に、プログラムカウンタ(PC)とアキュムレータ(Acc)のみになります。その他の状態フラグ等はとりあえず省略します。

dataflow_block.png

プロセッサは、古い内部状態(PC, Acc)をもとにメインメモリから命令とデータを同時に読み出し、演算命令やジャンプ命令を実行して新しい内部状態(PC’, ACC’)に更新します。また、PUT命令を実行する場合はメインメモリの書き換えも同時に実行します。新しい内部状態をまた古い内部状態の入力に接続すると、そのままシングルプロセッサの出来上がりです。簡単ですね。

メモリアクセスの出力とタイミングを合わせるため、内部状態は同じクロック数だけ遅延された上でプロセッサに入力されます。演算命令はアキュムレータの変更、ジャンプ命令はプログラムカウンタの変更として実現できるので、プロセッサ内部は基本的に組み合わせ回路のみで構成可能となります。そして、以下の前提のもとで、CPI(命令実行あたりのクロックサイクル数)を1にすることができます。

  1. メインメモリがデュアルポート(命令読み出しとデータ書き込みが同時に可能)
  2. メモリアクセスの遅延が1クロックのみ
  3. プロセッサ内部が組み合わせ回路のみで構成

最近のFPGAの埋め込みメモリはデュアルポートで1クロックアクセス可能なものが普通なので、上の条件は特に難しくありません。CPIを1とすることはプロセッサアーキテクチャにおける一つの目標であり、これを超えるには命令の先読みや命令レベル並列化といった複雑な技法が必要となります。したがって、プロセッサ単位ではこの程度の単純な構造に留め、あとはマルチプロセッサ化による性能改善を図ることにします。

このプロセッサを複数、内部状態の入出力を接続してリング状に結合すると、マルチプロセッサが出来上がります。メインメモリは、各プロセッサにバンク分割したものを割り当てますが、この構造のままでは、PUT命令による書き込みの際にプロセッサと同じバンクにしか書き込めないという問題が生じます。そういった不便さに目をつぶってなんとか使うという手もありますが、本質的にプロセッサ間でのデータ転送手段がアキュムレータ以外にないことになるので、単に不便なだけでなく、このままでは処理性能もあまり期待できないことになります。

dual_bad.png

実は、こういったリング状の構造(ネットワーク・トポロジー)を持つマルチプロセッサでは、回路がシンプルになる反面、ランダムアクセスに弱いという欠点があります。PUT命令はランダムアクセス書き込みのための命令ですが、他のバンクへの書き込みも間接的なプロセッサ間通信手段なので、できれば実現したいものです。とはいえ、単純に各プロセッサから全てのバンクに書き込み信号を接続したのでは、各バンクにプロセッサ数だけの書き込みポートが必要となり、せっかくリング状でシンプルな構造にしたのにこれでは台無しです。

quad_bad.png

実は、ランダムアクセス書き込みに関しては、メモリ一貫性の条件を緩和することで、この問題を回避することができます。例えば、ハードディスクの書き込みはヘッドのシークや回転待ちの関係もあって、即座に実行するのは難しいのですが、その間コンピュータが止まっていては話にならないので、大抵のOSは書き込みデータを一旦メモリに溜めて、後でまとめて遅延書き込みを行います。このマルチプロセッサでも、例えばバンク0への書き込みを、次にバンク0の読み出しを実行するまで遅延させても実際の動作には影響ありません。そこで、他のバンクへの書き込みを一旦保留して、そのバンクに到着した時についでに書き込みを行う方式を考えます。

dual_block.png

この方式では、プログラムが自分自身で書き込んだ内容を、ちゃんと読み出せることが保障されます。ただし、他のプログラムが書いた内容が、即座にメモリ内容に反映されるわけではありません。メモリ一貫性でいえば、プログラム内でのメモリ一貫性は保障されるものの、複数プログラム間でのメモリ一貫性は保障されないことになります。ただ、書き込み側のプログラムがプロセッサを一周する間にはメモリ内容にも反映されますので、こういった遅延を配慮したプログラムを書けば問題ありません。

quad_block.png

これは4プロセッサの例ですが、バンク書き込み信号が増えた分、配線は複雑になりますが、十分なプロセッサ間データ転送量を確保できる上に、各バンクメモリはデュアルポートで済むようになります。

ただし、ランダムアクセス読み出しに関しては、もう少し考える必要があります。

(つづく)