3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(CPU)Coreマイクロアーキテクチャの仕組み

いまさらですが、Coreマイクロアーキテクチャの仕組みに関する分かりやすいかつ詳しいサイトがありました。(今はネハレーン(Core i7)が注目ですかね)

ITmedia Coreマイクロアーキテクチャ [前編]

ITmedia Coreマイクロアーキテクチャ に迫る[後編]

前編ではCPUの基本アーキテクチャと、Pentium時代のアーキテクチャの特徴が説明されています。

後編ではCoreマイクロアーキテクチャの特徴が説明されています。

これを読むとCPUの基本的な動きが理解できます。

よくPC Watch後藤弘茂のWeekly海外ニュースの記事を読んでます。このコラムはCPUやGPUの解説が載ってますが、結構難しい用語が出てくるので、このコラムを読むうえでも、役立つかもしれません。

一応基本的用語は簡単にまとめときます。

■パイプライン

(基本情報処理技術者試験でもでてくる超基本的技術ですが、)前の命令が1サイクル終わればそのステージに次の命令を投入するという流れ作業で処理し、1クロックごとに1命令の実行を完了させるというものです。

パイプラインのステージ数を増やすとより高クロックにすることが可能です。

プログラムに分岐点があるとどっちか予想して、パイプラインに投入しますが、分岐ミスがあるとそれ以降のパイプラインがリセットされるので、その分CPUに無駄な時間が発生します。これはパイプラインのステージ数が多いほど分岐ミスのペナルティが多くなります。

■スーパースケーラ(スーパースカラー)

(これもよく基本情報処理技術者試験ででてきますが)簡単にいうと複数のパイプラインを用いて、同時に複数の命令を実行可能にすることによって高速化を図る方式です。といっても命令の依存関係等により両方のパイプラインが常に働くわけではないので、平均的な命令実行効率は1クロックあたり2命令以下になります。

OOO(アウト・オブ・オーダー)

スーパースケーラ時になるべく複数のパイプラインを止めずに処理できるようにするための方法です。これはプログラムの命令順を無視して実行可能な命令から順番に処理していく方法です。

■ハイパー・スレッディング・テクノロジー(HT)

これは有名ですね。分岐ミス等にあいている回路を別のCPUとして働かせようという方法です。

■マイクロOps

x86命令はマシンコードの長さも一定でなく、複数の処理を1つの命令で処理できるCISC系命令セットです。

その複雑なx86命令はスーパースケーラでの同時実行には不利なようなので、パイプラインに投入する前にx86命令を複数の単純な命令に置き換えます。これをマイクロOpsといいます。

■実行トレースキャッシュ

NetBurstマイクロアーキテクチャ(Pentium 4)の特徴で普通のCPUのL1命令キャッシュに相当するものです。

x86命令がマイクロOpsに変換されますが、その返還後のマイクロOpsを格納するのが実行トレースキャッシュです。

NetBurstマイクロアーキテクチャの特徴と欠点

この辺は自作PCユーザならだれもが知ってるかもしれませんね。

NetBurstはIPC値を上げるよりかは、パイプラインの段数を多くし、動作周波数を上げることでパフォーマンスを稼ごうとしました。

動作周波数を上げると当然消費電力、熱が増加するので、これに対応するためにプロセス微細化も進めてきましたが、プロセスルールが90nm以下になるとリーク電流(漏れ電流)が増加し、プロセス微細化の意味がなくなってきます。ちょうどPentium 4 の悪名高い Prescott(プレスコット) コアの時代ですね。

これらの欠点を反省し、IntelはクロックよりもIPC値を上げる方向、マルチコア化へのアプローチへと進むわけです。

■Coreアーキテクチャの特徴

NetBurstはL2キャッシュからx86デコードを通って実行トレースキャッシュにデコードされたマイクロOpsをためてましたが、Coreマイクロアーキテクチャではこの実行トレースキャッシュをやめ、毎回L1キャッシュからx86命令を読み込み、マイクロOPに変換して実行にしたようです。

パイプラインも大幅に減らし14段しかありません。分岐予測ミスのリスクを極力下げるアプローチみたいですね。

以下はCoreアーキテクチャ(一部はそれ以前のアーキテクチャでも搭載されているが)でのイノベーションです。

■ワイド・ダイナミック・エクゼキューション

1クロックあたりの同時実行命令を多くするための技術です。下記の3つがあります。

1.マイクロフュージョン

マイクロフュージョンとは、1つのx86命令から生成された2つのマイクロOP命令を、1つのマイクロOPに融合するというものらしいです。

ディスパッチユニットまでは融合したマイクロOpsで、ディスパッチユニット以後はそれぞれの実行ユニットに投入して実行するようですね。

2.マクロフュージョン

マイクロフュージョンと同様の命令融合を、x86命令レベルで行うようです。比較命令と条件分岐命令が並んでいる場合にこの技術が使われるようです。

3.専用スタックエンジン

スタックポインタの増減は専用の回路によって処理するようになっていて、そのためのマイクロOPは生成されないので、その分速度と効率がアップするようです。

■インテリジェント・パワー機能

これは使用してないCPUのブロックへの電力供給を停止する機能です。これにより省電力になるのでしょう。

■アドバンスド・スマート・キャッシュ

NetBurstのマルチコア Pentium D ではL2キャッシュがコアごとに独立してましたが、CoreアーキテクチャではL2キャッシュが各コアで共通となってます。

これにより、コア間通信でFSBという遅い外部バスを通らなくてよいのでより高速になります。

そして、ダイナミック・キャッシュ・アロケーションにより、各コアのL2キャッシュの占有率を動的に変更することができるようです。

■スマート・メモリー・アクセス

メモリへのアクセスを高速化する方法です。

1つはメモリー・ディスアンビギュレーションという技術によりメモリアクセス動作をアウトオブオーダー化するものです。

2つ目はIP ベースのプリフェッチャーというものにより、プログラムがメモリにアクセスするパターンを解析して、次にアクセスされそうなメモリの部分を予測し、そのアドレスのデータをメインメモリから投機的にプリフェッチ(先読み)して、キャッシュメモリに入れてしまうことができるようです。

■アドバンスド・デジタル・メディア・ブースト

マルチメディアの処理を高速化するためのもので、SSSE3がCore2 Duoには搭載されてます。

Pentium 4SSE3では64ビット幅のALU(論理演算ユニット)を2度動かして128ビットの処理をしてましたが、CoreアーキテクチャではALUは128ビット構成となっていて、128ビットデータを1クロックサイクルで一括処理することができます。

■45,65ナノメートルの製造プロセス

詳しくは書きませんが、プロセス微細化時にいろいろな技術を使いリーク電流を減らし、製造コストを安価にしています。

まあほぼITmediaのコピペとなってしまいましたが、一応要点でも押えとけば今後CPUに関するドキュメント読むときに参考になると思います。

ハード系はなかなか難しいですね。

いずれ時間があれば、Nehalem のアーキテクチャの特徴も簡潔にまとめたいと思います。