コンピューター=アーキテクチャ

http://d.hatena.ne.jp/hyoshiok/20070916#p1

  • 昨今の最新マイクロプロセッサでは機械語がもはや機械の挙動と一対一に対応しなくなっちゃったのである、というツッコミをしたくなった。
  • 昨今のプロセッサは、機械語をμOPというのに変換してそれを「並列」に実行しちゃうのである。

特にX86系限定の話だと思うが,これは同意.*1 *2

並列に実行しちゃうことをOut of Order (OOO)実行とか言っちゃうのだけど、(厳密に言えばOOOは並列に実行することを含意していない。実行順が機械語の順番と違うことを言っているだけ)、

厳密にというより,おそらく全く関係ない.

並列と言ってもいろんなレベルがあるんだが,いわゆる「パイプライン*3」「スーパースカラ*4」「SIMD*5」「マルチコア*6」などがある.*7

Out of Order処理は文字通り命令の実行順序を変更するもので,レジスタリネーミングなんかと同じ最適化処理の一つとみなすべきだろう*8.パイプラインやスーパースカラで単純に並列化しても,そのままではレジスタ名の衝突や同時実行できる命令の上限などから,あまり高い性能が出せない.これをピーク性能に近づけるためにOut of Orderやレジスタリネーミングが必要になる.

だからパイプラインさえないCPUにOut of Order処理を入れることは技術的には可能だと思うけれど,コストが嵩む割にメリットが少ないので誰もやらない.結果として「Out of Order処理があるチップ => 命令レベル並列処理のあるチップ」ということになるんだと思う.*9

ジャンプの場合、機械語をメモリから取り出すというのがあらかじめできなくなるので性能を出すために、どれだけ命令をプリフェッチできるかにかかっている。

ジャンプ命令でも読み出しはするし,パイプラインでの処理も行う.ただ,いわばこれも投機的実行の一つなので,分岐予測が外れた場合はパイプラインストールが発生して性能ががた落ちになる.だから分岐命令が高コストというのは最近の(特にPen4系のX86プロセッサでは)新たな常識になっている.


この辺りの話はX86CISCRISCアーキテクチャの歴史もまとめて勉強しないとイマイチ理解しがたい.X86系は8086とのバイナリ互換を維持するために,内部的にはかなり無理な実装をしていることでも有名なのだ.


そういう正確な知識を勉強するつもりがあるならば,その筋の名著を読んだ方が実は一番簡単で安上がりだ.

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (下)

コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (下)

Computer Organization and Design, Revised Printing, Third Edition, Third Edition: The Hardware/Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Organization and Design, Revised Printing, Third Edition, Third Edition: The Hardware/Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)

コンピュータ・アーキテクチャ

コンピュータ・アーキテクチャ

*10
Computer Architecture, Fourth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Architecture, Fourth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

多分,ほとんど誰も買わないだろけどさ.

*1:「マイクロ命令」以外に,それとは全く関係のない「マイクロプログラム」というものもあるから,ややこしい.昔はマイクロプログラムは広く使われていたが,性能向上の足枷になるので最近のチップではまず使われない.

*2:外部の命令セットと一対一対応こそするものの,「外部の命令から内部的な処理が直接には見えない」と言う点では大昔のマイクロプログラムも同じだよね.

*3:http://en.wikipedia.org/wiki/Instruction_pipeline

*4:「スーパースケーラ」とも.http://en.wikipedia.org/wiki/Superscalar

*5:Single Instruction Multi Data stream.「ストリーミングSIMD命令」ってあるよね.あんまり使われてるのを見たこと無いけれど,分類上はSISD,SIMD,MISD,MIMDがある.

*6:これを「CPU内部の並列処理機構」に分類すべきかは意見の分かれる所だろう.

*7:あとCrusoeで一躍有名になったVLIWか.どこへ行ったんだろう,Crusoe

*8:そう言えば「バイパス=レジスタ」なんかも常識?

*9:逆はありえる.VLIWなんかだとハード自体は命令順に処理させて,並び替えはソフト任せにして制御系をシンプルにすることが多いと思う.初期のRISCチップや組込みマイコンなんかもそうじゃないか?

*10:名著なんだけど今となっては古すぎる.洋書の最新版の方がお勧め.