CPU は、ある処理を行うなら、フェッチ、デコード、実行、メモリーへの書き出し、これら4つの動作を行います。
フェッチとはメモリーからプログラムの命令を読み出す動作、デコードとは読み出した命令を解読する動作、実行とは実行に必要なデータをメモリーから読み出し、解読した命令の内容に従って演算処理を行う動作、メモリーへの書き出しとは実行の結果として出たデータをメモリーへ書き出す動作のことです。
CPU は、各動作を担当する部分があり、フェッチを担当する部分がフェッチを行い、他の動作に関しても同様です。
フェッチを担当する部分がフェッチする時は、フェッチ以外の動作を担当する部分は何もしていない状態であり、フェッチ後にデコードを担当する部分がデコードをする時は、デコード以外の動作を担当する部分は何もしていない状態であり、デコード後に実行を担当する部分が実行する時は、実行以外の動作を担当する部分は何もしていない状態であり、実行後にメモリーへの書き出しを担当する部分がメモリーへ書き出す時は、メモリーへの書き出し以外の動作を担当する部分は何もしていない状態です。
各動作を担当する部分は、以下のように上から下へ状態が変わっていきます。
フェッチ |
デコード |
実行 |
メモリーへの書き出し |
動作中 |
休 |
休 |
休 |
休 |
動作中 |
休 |
休 |
休 |
休 |
動作中 |
休 |
休 |
休 |
休 |
動作中 |
各動作を担当する部分が何もしていない状態をなくし、CPU の処理の効率を向上させる技術がパイプラインです。
パイプラインを利用する場合は、フェッチ後にデコードを担当する部分がデコードをする時は、フェッチを担当する部分は休まずに次の命令を読み出します。以降も同様に各動作を担当する部分が何もしていない状態がなくなるよう次々に動作を続けます。
パイプラインを利用する場合は、各動作を担当する部分は、以下のように上から下へ状態が変わっていきます。
フェッチ |
デコード |
実行 |
メモリーへの書き出し |
動作中(※1) |
休 |
休 |
休 |
動作中(※2) |
動作中(※1) |
休 |
休 |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
(※1)命令1に関する動作
(※2)命令2に関する動作
(※3)命令3に関する動作
(※4)命令4に関する動作
パイプラインを利用しない場合と比べて、単位時間あたりに行う処理数が4倍になることがわかります。
メトロノームは、カチカチと一定のタイミングで音が発生し、タイミングを合わせるために使われますが、CPU は一定のタイミングで電圧の高さが上下するクロックに合わせて動作します。
電圧が高くなった時から、次に電圧が高くなる時までが、1クロックです。
CPU 内部の各動作を担当する部分は、1クロックかけて動作しますので、フェッチからメモリーへの書き出しまで4クロックかかります。
1秒間に1クロック発生する回数をクロック周波数と呼び、単位は Hz です。100Hz なら、1秒間に100クロック発生します。
クロック周波数を高くするほど、1クロックの時間が短くなりますので、フェッチからメモリーへの書き出しまでにかかる時間も短くなります。
つまり、クロック周波数を高くするほど CPU の処理速度が速くなります。
しかし、CPU 内部の各動作を担当する部分は、動作を開始してから終わるまでに一定の時間が必要であり、これ以上クロック周波数を高められない限度が来ます。
例えば、各動作を担当する部分は動作に1秒かかり、これ以上短くできないのであれば、高められるクロック周波数の限度は 1Hz です。
そこで、各動作を担当する部分を分割して担当する部分を増やし、分割後の各担当部分が1クロックかけて動作するようにします。
分割後の各担当部分の動作にかかる時間を短くできれば、さらにクロック周波数を高められます。
例えば、フェッチ、デコード、実行、メモリーへの書き出し、それぞれの担当する部分を2分割し、分割後の各担当する部分の動作にかかる時間を0.5秒にできれば、クロック周波数を 2Hz にできます。
クロック周波数が2倍になっても、フェッチからメモリーへの書き出しまで8クロックかかりますので、フェッチからメモリーへの書き出しまでにかかる時間は変わりませんが、分割後の各担当する部分にパイプラインを適用すれば、単位時間あたりの処理数が増え、処理が効率化します。
このように、フェッチ、デコード、実行、メモリーへの書き出し、各動作を担当する部分を分割して担当する部分を増やし、クロック周波数を高められるようにして、合わせてパイプラインを利用して処理の効率化を図る技術を、スーパー・パイプラインと呼びます。
2分割した場合、分割後の各担当部分は、以下のように上から下へ状態が変わっていきます。
フェッチ |
デコード |
実行 |
メモリーへの書き出し |
動作中(※1) |
休 |
休 |
休 |
休 |
休 |
休 |
休 |
動作中(※2) |
動作中(※1) |
休 |
休 |
休 |
休 |
休 |
休 |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
休 |
休 |
休 |
休 |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
休 |
休 |
休 |
動作中(※5) |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
休 |
休 |
動作中(※6) |
動作中(※5) |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
休 |
動作中(※7) |
動作中(※6) |
動作中(※5) |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
休 |
動作中(※8) |
動作中(※7) |
動作中(※6) |
動作中(※5) |
動作中(※4) |
動作中(※3) |
動作中(※2) |
動作中(※1) |
(※1)命令1に関する動作
(※2)命令2に関する動作
(※3)命令3に関する動作
(※4)命令4に関する動作
(※5)命令5に関する動作
(※6)命令6に関する動作
(※7)命令7に関する動作
(※8)命令8に関する動作
命令の処理は、フェッチからメモリーへの書き出しまで4クロックから8クロックかかるようになってしまいましたが、スーパー・パイプラインによりクロック周波数を2倍にできれば、命令の処理にかかる時間は変わりません。
ただのパイプラインでは、単位時間あたりに行える処理数が4倍となりましたが、上記のようなスーパー・パイプラインでは8倍に増えることがわかります。