ぼくのかんがえたさいきょうCPU: 明示的な命令列の並列実行

 EPICじゃないよ。あれは命令の明示的な並列実行の指定。これの続き。
ぼくのかんがえたさいきょうCPU:明示的な並列実行

 命令列のかたまりをランと呼ぶことにする。ランは色々な演算を行った結果、最後にレジスタライトまたはメモリ書き込みで終わるような、その中の命令をOutofOrderなどで並列に実行しづらいかたまり。前回はランAとランBを並列に実行するためにBRN(飛ばないブランチ)命令を使ってA,Bを指定し、ランAを優先することで安全に並列実行させることを考えた。しかしこれでは並列度の度合いが高められそうにない、また待ち合わせなどの依存関係解消のために複雑になりそうな気がする。これ考えててメモリオーダリングに似ているように感じた。ではメモリへの読み書きの順序が入れ替わっても構わないリラックスメモリオーダリング風に、レジスタへの書き込みの順序が入れ替わっても構わない仕組みをどうするか?

次のプログラムを考える。

ランA: レジスタR1に結果を書き込み
ランB: レジスタR2に結果を書き込み
ランC: レジスタR3に結果を書き込み
ランD: レジスタR1,R2,R3を入力として使う

 ランA,B,Cの実行順序に依存関係はないものとする。ランA,B,Cはそれぞれ独立して実行できるが、それぞれが使用する演算器などのリソースのやりくりでどういった順序で完了するかはわからない(命令の並び方による)。そしてランA,B,Cがすべて完了しないとランDは開始できない。
 ということでレジスタ書き込み版のバリア命令、SYNCRというのを考えてみる。

SYNCR R[,Rm...]

SYNCR命令は指定したレジスタがすべて更新されるまで待つ。ランDの先頭にSYNCR命令を置くことによりランA,B,Cの待ち合わせができる。

SYNCR命令を実現するためにはレジスタに書き込まれたことがわかるフラグを追加しなければならない。このフラグをランA,B,Cの先頭でクリアできるようCLRR命令を用意する。

CLRR R[,Rm...]

CLRR命令で指定したレジスタの書き込み済みフラグを落とす。CLRR命令で指定するのはランA,B,Cの実行結果として書き込むレジスタ。

ちょっとした工夫:SYNCR命令、CLRR命令ではオペランドで昇順に指定した2つのレジスタ番号はその間のレジスタも指定したとみなす。
SYNCR R1-R5はR1〜R5を指定。SYNCR R5,R1,R3はR1とR3とR5の2つのレジスタを指定。

さて、SYNCRで待ち合わせるレジスタとそれ以前で書き込まれる予定のレジスタの指定を間違ってしまうとSYNCR命令で止まってしまう恐れがある。ウォッチドッグタイマ的なもので監視してもよいがそれぞれのランに時間のかかるロードストアやエミュレーション命令がはいっていると待ち合わせ時間を固定値で指定するのはむずかしい。SYNCR命令以前のランがすべて実行完了したら次に進むことにする。このとき、SYNCR命令が出力するフラグにレジスタ待ち合わせ完了かラン実行完了かわかる値を返せばよい。


こんな感じのコードになる。プロセッサが並列実行に対応していない場合は上から順に実行される。


CLRR R1-R3
BRN RUN_D

RUN_A:
BRN RUN_B
...
WR R1

RUN_B:
BRN RUN_C
...
WR R2

RUN_C:
...
WR R3

RUN_D:
SYNCR R1-R3
....


CLRR命令で書き込まれるレジスタのフラグをクリアした後、飛ばない分岐命令BRNでまずランA,B,CのかたまりとランDを分けて並列実行を指定する。ランDはSYNCR命令によりすぐさま待ち合わせ状態にはいり、ランA,B,Cのかたまりの先頭から実行される。
ランA,B,Cのかたまりの先頭ではBRNでランAとランB,Cを並列化する。ランBの先頭でさらにBRN命令でランBとランCを並列化する。これでランA,B,Cは同時に実行できるよう指定される。あとはそれぞれのランの実行結果がR1,R2,R3のすべてに書き込まれるか、ランA,B,Cの実行が完了すればランDのSYNCR命令の次から実行される。

並列実行時にメモリアクセスはそれぞれのランからどの順序から発行されるかわからないので影響のない番地で行うか、メモリバリア命令でロードストアの待ち合わせを行う。あとは割り込み発生の問題だが、命令エミュレーションならどれかが命令エミュレーション実行時は待ち合わせることになる。このあたりはもうちょっと考えなければいけない。

レジスタの依存関係を明示することで以前考えた方式よりだいぶ制限が減ったのではないかな。


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント