プロセッサを支える技術 ― 果てしなくスピードを追求する世界
命令アーキテクチャ,マイクロアーキテクチャって何?……プログラマと,計算機の中核プロセッサを結ぶ架け橋
ごくごく当たり前のことかもしれませんが…プログラムは,計算機の中核であるプロセッサで処理されます。プロセッサに上手にプログラムを渡すことが大切ですから,プログラムからプロセッサへの橋渡し役,コンパイラも,OSも,プロセッサにおけるプログラムの高速処理のために,ありとあらゆる工夫を凝らしています。
何もプロセッサのことまで知らずとも,プログラムは動かせる! たしかにそのとおりです。しかし,性能を追求したい…そのときプロセッサのことを知っていることは,プログラマの方々にとって強力なアドバンテージになるのではないでしょうか?
さて,本書『プロセッサを支える技術』は,自身でプログラムを書き「コンピュータシステムをより効率的に動かしたい」という方を対象にしたプロセッサの解説書。プロセッサに搭載されている高性能化技術および内部構造,働きを中心に解説し,どのようなプログラムを書けばプロセッサの実力を引き出せるかも説明を行いました。
なお,プロセッサの設計と言うと,AND,ORなどの論理回路を用いた論理回路レベルのハードウェア設計を連想されるかもしれませんが,本書では論理よりもハイレベルのプログラマとのインタフェースとなる「命令アーキテクチャ」「マイクロアーキテクチャ」に焦点を当てています。
本コラムでは,本書で解説する「命令アーキテクチャ」「マイクロアーキテクチャ」の基本について,わかりやすくお届けします。
命令アーキテクチャとマイクロアーキテクチャ ……ソフトウェア的な構造とハードウェア的な構造
プロセッサがどのような命令を実行するのか,そして実行した結果がどのようになるのかなどの「プロセッサの働き」を詳細に規定したものを「命令アーキテクチャ」と呼びます。命令アーキテクチャにはプロセッサはどのような命令を実行でき,その結果どうなるのかは書かれていますが,プロセッサの中身がどのように作られているかについては規定されていません。
命令アーキテクチャに対して,「具体的な中身のハードウェア構造」を「マイクロアーキテクチャ」と呼びます。
プログラムの動作という点では,命令アーキテクチャが同じであれば同じソフトウェアを動かすことができますが,その性能はマイクロアーキテクチャで変わってくるのです。
- 命令アーキテクチャ発展の道
- プログラム内蔵式コンピュータ
- 仮想記憶/仮想メモリ
- マルチプロセス
- メモリ管理機構(セグメント,ページ)
- 特権状態
- ISAの定義と互換ISA拡張
- マイクロアーキテクチャ発展の道
- パイプライン処理
- 演算器の高速化
- RISCとCISC
- スーパースカラ実行
- Out-of-Order 実行
- 分岐予測
- キャッシュ
- マルチコア
どのような命令を実行し,結果はどうなるのかという,プロセッサのそもそもの働きを規定する命令アーキテクチャも単純な計算だけでなく各種の機能が付け加えられて発展してきています。そのキーワードとしては,以下のようなものがあります。
当初の電子式コンピュータは機械式の計算機を高速化したというものでしたが,計算が高速になって処理時間が短くなってくると,プログラムを入れ替える時間や,人間がキーボードの前で入力している時間は,コンピュータが遊んでしまうという無駄が目立ってきます。このため,データと同じようにプログラムをメモリに内蔵する方式の「プログラム内蔵式コンピュータ」が考案されました。
その延長として,同じプログラムを別のコンピュータでも使用できると便利ということから,実メモリ量の制約なしに大きなメモリを必要とするプログラムを動かすことができる「仮想記憶/仮想メモリ」,また,プログラムとハードウェアのインタフェースである命令アーキテクチャ「ISA」(Instruction Set Architecture)の確立や互換性を維持したISAの拡張という動きにつながっていきます。
また,キーボードの前で考えている時間は,別のユーザに使わせることでコンピュータの利用率を上げるTSS(Time Sharing System)という使い方が出てきました。そうなると,複数のプログラムがメモリ上に存在することになり,これらの管理を行う機構として「メモリ管理機構」や「特権状態」などが命令アーキテクチャに加えられて行きます。また,TSSはマルチタスクの現在のOSへと発展していきます。
仮想記憶やTSSなどはおもにOSが実現している機能ですが,メモリ管理機構や特権状態のように使用頻度が高く,ソフトウェアによる実現では性能が出ないという機能についてはハードウェアで実現するという方法が採られています。
続いて,マイクロアーキテクチャの発展の歴史は,プログラムの実行にかかる時間を短くするという工夫の歴史です。その中で,現在のプロセッサを実現する上で主要な技術となっている以下の技術とその発展を概観しましょう。
「パイプライン処理」は流れ作業で命令を処理することにより,工場の流れ作業のように命令の処理速度を改善する技術です。そして,コンピュータは計算を行う機械なので,さまざまな演算を行うユニットを持っていますが,これらの演算を高速に実行することが重要で,とくに演算器の高速化は多くの工夫が行われきました。
x86などのCISCでは命令が複雑でパイプライン処理がやりにくかったのですが,これをパイプライン処理がやりやすい単純な命令アーキテクチャとして,小さなハードウェアで高速の実行を目指すのが「RISC」です。つまり,RISCはCISCより優れたマイクロアーキテクチャを可能とするように命令アーキテクチャを新たに作ったと考えることもできます。
パイプライン処理をさらに推し進めて流れ作業のラインを複数にして,複数の命令を並列に処理するのが「スーパースカラ実行」です。しかし,次の命令が直前の命令の計算結果を使うというようなケースは,これらの2つの命令を並列には実行できません。このため,プログラムに書いてある命令の順序を変更して,実行できる命令から先にやってしまうことで,処理速度を改善しようというのが「Out-of-Order 実行」です。また,条件分岐がある場合は,次に実行する命令がどちらになるのかわからないのですが,それを予測することによって高速化するのが「分岐予測」です。
半導体の微細化でプロセッサは高速になったのですが,DRAMメモリはメモリ容量の増大を主眼として開発が行われ,スピードの改善は比較的緩やかでした。このため,プロセッサがメモリをアクセスすると非常に長い時間がかかり,全体として性能が上がらないという問題が顕著になってきました。このメモリアクセス時間の問題をプロセッサ側に容量は小さいけれど高速のメモリを置いて解決しようというのが「キャッシュ」という技術です。
このようにして数々のプロセッサ高速化の技術が開発されてきたのですが,これらの機構の実現のために多くのトランジスタを必要とし,消費電力も大きくなって行きました。このため,個々のプロセッサにどんどんトランジスタをつぎ込んで性能を向上させるより,適当なサイズのプロセッサを複数個作るほうが消費電力あたりの性能が高いという状況になり,最近では「マルチコア」(Multi-core,複数のプロセッサコアを1つの半導体チップ上に集積する技術)が一般的になってきています。