Last update $Id$
(c) 2007 BakaOyaji
パイプライン実行の検討
今回はパイプライン実行について考察してみますパイプラインアーキテクチャの宿命として分岐がおきる場合の処理をちゃんと考える必要があります。PICmicro
Mid-Range MCU Family Reference Manual(文書番号33023A)の4.2 Clocking
Scheme/Instruction Cycleと4.3 Instruction
Flow/Pipeliningに結構詳しく書かれていますが、これらに加えて、いくつかの場合を考えたものを、Fig4-1〜3として載せておきます。
分
岐の起きない場合は、Fig4-1のように順番に命令を実行すればよいので問題はありません。
問題は分岐が起きる場合で、パイプライン処理のために「分岐する」ということが判った時点では既に次の命令の実行が始まっています。PIC16の場合は、
2ステージですから次の命令のフェッチ(先読み)を行ってしまっています。PIC16では、この「先読み」した命令を「Flush」して、捨ててしまいま
す。パイプラインアーキテクチャにおける、ハードウェアインターロックの一種と考えてもよいでしょう。あるいは、「先読み」を「投機的実行」(Fig4-
2,-4の黄色で色をつけたところ)と考えることもできます(おおげさ)。
これ以外の方法としては、遅延分岐(Delayed
Branch)といわれる方法もあります。遅延分岐方式では、分岐命令の次の命令(先読みした命令)を実行してから分岐をします。この様にすることで、先
読みした命令を「捨てる」ことによる無駄(=性能の低下)を防ぐことができます。いわゆるRISC系のCPUではこの方が一般的ですが、アセンブラプログ
ラムの可読性は悪くなります。まあ、分岐命令のあとは、必ずNOPを入れればよいのですがそれでは、Flushするのと変わりません。そこで命令の順番を
入れ替えて、できるだけFlushがおきないようにすることがプログラムを効率的に実行することになるのです。現在のRISCのコンパイラはこのようなこ
とを当然しています。つまり、RISCの興隆には、高度なコンパイラ技術が不可欠だったわけです。
話が脱線してしまいました。この辺の話を詳しく知りたい人は、「ヘネ・パタ」でも読んでください。まあ、PIC16では条件分岐は条
件SKIPで実装されていますので、(少なくとも条件分岐では)遅延分岐は使えません。Flush動作は、データブック
中では、Force NOPとの表現があるように、強制的にNopとして内部を動作させているようです。具体的には、Instruction
Registerの内容をクリアしているのだろうと想像できます。この様に考えると、
- GOTOやCALLなどの無条件分岐では、分岐の次のサイクルはNOPを強制的に実行
- 条件SKIPの場合は、SKIP条件が真の場合に、次のサイクルはNOPを強制的に実行
とすればよいことになります。あとは、Fig4-1〜4でも見てください。
----
※ヘネパタ
ス
タンフォードMIPSの開発を指揮したヘネシーとバークレイRISC
のパターソンが著した、RISCの教科書。
略してヘネパタ。名著です。ヘネシーはいま(2007年現在)スタンフォード大学の総長ですね。
<<前に戻る Index へ 次へ>>