これまでのCPU設計
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/04/17 05:17 UTC 版)
「Explicit Data Graph Execution」の記事における「これまでのCPU設計」の解説
ほぼ全てのコンピュータプログラムは、データをある形態から別の形態へと変換する命令列から成り立っている。CPUの目的は、データの変換を可能な限り高速に行って性能を向上させることであり、CPUがサポートする命令セットは変換が高速になるような意図で設計されている。コンピュータの発展に伴って、コンピュータ内部の様々な要素の相対的なコストが大きく変化し、それによって命令セットの設計に大きな転換期が何度か訪れた。 1960年代にはメモリが相対的に高価であり、CPU設計者は貴重なメモリ資源を有効に活用できるよう、内部に命令とデータを密に詰め込んだ命令セットを開発した。たとえば、 A と B を加算し、C に出力 という命令は A と B を主記憶、インデックス、レジスタなど様々な場所から取り出すために異なる種類のものが提供されていた。異なる命令が提供されることで、プログラマは最もメモリ消費量が抑えられる命令を選択することができた。全ての命令に任意のデータアクセス方法を選択できるようにした命令セット(たとえばMotorola 68000)は「直交的」と呼ばれ、設計の模範とされた。こうした命令セットは様々なアクセス方法を提供するため複雑化し、今日ではCISC(複雑な命令セットを備えたコンピュータ)と呼ばれている。 1970年代の後半までにメモリは安価になったが、相対的に性能が低くなり、CPUはメモリの数倍の速度で動作できるようになった。その結果、直交性によりCPUはわずかなメモリ上のスペースを節約できるものの、性能の向上には寄与せず、もはや直交性は重要ではなくなった。この時期にはRISCの設計思想が繁栄し、直交的な命令はほとんどなくなってデータを操作する命令はレジスタとのみやり取りするようになった。命令を減らしたことで命令デコーダが簡潔なものになり、CPUには大きな空きスペースが生まれた。このスペースはレジスタを大きく増やすために用いられた。データをレジスタ内に保持することでアクセスが高速になり、1990年代まで、RISC設計のCPUはCISC設計のものの性能を上回った。この差は圧倒的なもので、その後x86などの現代的なCISC設計のCPUは、実質的にRISCのエンジンとなり、内部で CISC 命令を RISC 的な形式に変換して動作するようになった。 1990年代にはチップの設計技術、製造プロセスが進歩し、安価なプロセッサにすら実現可能な全ての機能を盛り込むことができる段階に達した。さらなる性能向上のため、CPUの設計は内部的に並列性を獲得するようになった。これは "スーパースケーラ" と呼ばれる。どんなプログラムでも、互いに関連のないデータを処理する命令があり、演算ユニットを追加すれば、これらは同時に実行することができる。CPUに追加された新たな要素「スケジューラ」が、関連のないデータを探して演算ユニットに投入し、出力結果を並べ替える。外部には通常に実行したかのように見える。 スーパースケーラの設計で獲得できる並列性の度合いは、スケジューラが命令同士の依存関係を調べることのできる数に依存する。多数の命令を調べることができれば並列に実行可能な命令を見つける可能性が高まるが、これにはスケジューラー自体を複雑にする以外にない。膨大な労力が費やされたが、これまでのRISC / CISC命令セットでは演算ユニットの数は3〜4で飽和している。 他には、特定の種類のデータを処理する命令を見つけて専用の処理ユニットを追加することで、システムの性能を向上させることができる。浮動小数点演算ユニットや、最近ではSIMDユニットの追加はこうした方法である。この方法の問題はCPUが汎用的ではなくなることで、たとえば全てが浮動小数点演算であるようなプログラムを実行すると、FPUは全力で動作し続けるが他のユニットは遊んでしまう。 現代的なCPU設計で、より近年問題になっているのはレジスタとのやり取りに伴う遅延である。CPUのダイサイズは過去数十年間概して変わっていないが、各機能ユニットは様々な機能ユニットが追加されにつれどんどん小さくなっている。すなわち、機能ユニットとレジスタとの相対的な距離はどんどん長くなっている。かつてメインメモリとの通信による遅延を抑えるために生まれたレジスタが避けるべき遅延となってきている。 かつてメモリが安価になり通信による遅延が問題になったことがCISCからRISCへの急激な変化を引き起こしたように、CPUの設計者は、並列化による性能向上の問題とレジスタの遅延の問題が、基本的に命令セットを切り替えることになるかどうかについて検討している。 新しい命令セットを導入しようという試みの一つがItaniumに代表されるVery Long Instruction Word (VLIW) アーキテクチャである。VLIWはスケジューラのロジックをCPUから移動し、命令列を検査するのに十分な時間とメモリを使用することが可能なコンパイラで実行する。この「静的配置、静的発行」という実行モデルは遅延が全て事前に既知である場合にはうまく動作するが、実際にはコンパイラが命令語を命令で満たすことは困難な挑戦であることがわかってきた。たとえば、キャッシュにデータがあれば5サイクルかかる命令も、なければ数百サイクルかかる可能性があるが、コンパイラには実行中にどのデータがキャッシュに入っているかを知る術はない。こうした遅延は、コンパイルするプログラムとは何の関係もないシステムの全体的な負荷やその他の要素によって定まるものである。
※この「これまでのCPU設計」の解説は、「Explicit Data Graph Execution」の解説の一部です。
「これまでのCPU設計」を含む「Explicit Data Graph Execution」の記事については、「Explicit Data Graph Execution」の概要を参照ください。
- これまでのCPU設計のページへのリンク