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

 アウトオブオーダ実行は自動的に命令の実行順を入れ替えてできる分から効率的に済ましていく方式だが、命令で明示的に並列実行を指示するにはどうしたらよいか考えてみた。

 先行する命令列Aと後続の命令列Bについて考える。

 並列実行ができない実装のプロセッサでは命令列Aの実行を済ませてから命令列Bの実行を行う。並列実行ができるプロセッサは命令列Aと同時に命令列Bを実行する。ただしいくつか条件がある。

・レジスタリネーミングに使える潤沢な物理レジスタがあること
・命令列Bは副作用がない、レジスタ操作のみの命令であること
・命令列Bで例外が発生しないこと

 命令列Aと平行して命令列Bを実行する。命令列Aについての制限はないが、命令列Bはメモリ操作命令があるとその直前で一時停止する。命令列Aの完了をもって、それまで実行した命令列Bをコミットし、続きから実行する。命令列Bの実行結果はコミットされるまでは反映されない。

 命令列Aで命令列Bが参照するレジスタを更新した場合は、命令列Bの実行を破棄し、命令列Aの実行完了を待つ。そして命令列Bの実行に移る。この場合は並列実行にはならない。または命令列Bの先頭から命令列Aと依存関係のない箇所まで実行して反映してもよい。

 命令列Bの先頭は、直前の命令(=命令列Aの最後の命令)の結果に依存しないこと。依存している場合は並列実行できない。
 命令列B内で例外が発生した場合。ほとんどの場合レジスタ間演算で例外は発生しないが、例えば命令のエミュレーショントラップなどが起きたらその例外は発生させずに命令列Bの実行をキャンセルする。または例外発生の一つ前の命令で待機。

 さてこれを指示する命令は何が適当か。分岐しない命令BRN(Branch Never)がよさそう。BRNで示した飛び先が命令列Bの先頭、BRNに続き飛び先の一つ前までの命令が命令列Aとしたらよさそう。この場合は飛び先はPCが増える方向となる。

 実際には命令列Bの長さについては制限がなく、リソースが許す限り実行して命令列Aの完了を待つ。

 命令列Bの中でさらに並列実行の指示があったら?これは実装による。レジスタの依存関係の処理が多重になるなど。

 この考えは投機実行に似ている。ただし投機実行ではどちらか片方の結果が捨てられるが、この場合は同時に処理した結果を活かせる可能性がある。

 ということでBRN命令で指示することにより順序実行と互換性を損なわず並列実行できそうな感じだ。





ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック

  • ぼくのかんがえたさいきょうCPU:バリア命令

    Excerpt:  メモリオーダリングでロードやストアの順序を入れ替えて効率よく実行させるが、いったん実行中のメモリアクセスを完了させる用途にバリア命令を用意。 Weblog: 竹下世界塔の計算機よもやま話 racked: 2018-12-02 22:23