不動の4番打者(キャッシュ・分岐予測の重要性)   

2003年12月10日




年末特有の忙しさとなっているが、本日は現実逃避シリーズ第二弾である。 (あぁ〜、仕事なんてオラ知らねぇ。)

少し前に後輩が部屋に来て「最近、どんなゲームで遊んでます?」と聞かれた。 仕事が忙しい時なのに「イヤミかぁ〜、こいつぅ。」とグチりつつ、 手持ちのPCゲームソフトを見せたところ、 「先輩、戦うゲームしか持ってませんね。」と言われてしまった。 (ちなみに、コンシューマゲーム機は一台も持っていない。 この話をするとみんな驚くが、なぜ?)

いや、気にしていなかったが確かにその通りである。 コンバット系フライトシムとか潜水艦シミュレーションとか好きなんだが、 それ以外でも将棋ソフトに至るまで全部が全部「戦うゲーム」である。

思えばU.S.NAVY FIGHTERS(コンバット・フライトシム)をいかに 高速にプレイさせるか、なんて所が「我がオーバークロック道」の原点だった訳で、 ゲームとPC改造の関係は深いのだ。1)

オヤジ的年齢となってしまった最近では、さすがに昔ほどゲームにのめり込んだりは しないが、それでもオーバークロックには時々発作のようにのめり込むことがある。 ゲーム抜きなら普段の用途ではGHzなんてまったく不要で、わざわざ信頼性を 落としてまでオーバークロックする意味なんて全然無いってのは、 重々分かっているんだけど... それでも、目の前に石があったらとりあえずクロックいじってみるってのは、 もはや一種の病気(ビョーキ)ですかね?

☆必要にして十分なCyrix-III   
というわけで、オーバークロックはゲーム専用PCに任せ、 Web機の方は昔からショボショボCPUなのだ。 不治痛製HDD爆死事件以前は、ゲーム機から引退したCeleron300A@450MHzの 余生の場だったし、それで何の不自由もなかった。 Webを見るためだけにCeleron-2GHzマシンやAthlonXP-1800+(苺皿) とかをわざわざ動かす気にはなれない。うるさいし、アンチエコだしね。

で、その後Web機のHDDが吹っ飛んでしまったわけだが、 その後のシステム再構築でこれを機会にあることをやってみた。 それは、メインマシンのCPUをCyrix-IIIの600MHzに交換することである。

今までは450MHzにOCしたCeleron300Aだったのだが、 少し考えていたことを実機で体感してみたくなったのである。 それは、「ゲームやビデオ編集さえしなければ、パソコンにGHzパワーは不要。」 という持論をさらに拡張し、 どこまでショボいCPUでもストレス無く使えるか?ということと、 キャッシュ、分岐予測の重要性を(ベンチマークではなく)体で体感してみよう、 ということだ。

たるさんのPC環境ではゲーム機とWeb機を使い分けているし、 ビデオ編集系の趣味はあまり無いので、 Web関係用途中心のメインマシンではGHzパワーは不要(なハズ)なのだ。

メインマシンのCPUをCyrix-IIIに交換
フィンだけのジャンクファンレス放熱器(写真上の黒い奴)で冷却。
これでも連続6時間以上安定稼働。発熱の低さだけは凄い。

残念ながら従来のマザーではCyrix-IIIは動かなかったので同じ環境とは言えないが (ビデオもi810からG200へ変更。Webだけならこれで十分。)、 ソケット370環境でCyrix-IIIシステムを2ヶ月ほど体感してみた。

ふふふっ、Cyrix-III(600MHz)というCPUまでグレードダウンしても何の問題もない。 Webを閲覧していても必要にして十分な速さなのである。 少なくとも、たるさんはこのCPUで不足を感じていない。 この記事だって、Cyrix-IIIマシンで書いているしね。

パソコン雑誌を見ると最新高性能CPUは有用というプロパガンダ記事が あふれているが、これには正直言ってうんざりである。 CPUパワーが不足している用途というのは限られていて、ビデオ編集が趣味とか、 ハードゲーマーとかでない限り、最新CPUというのは宝の持ち腐れである。

Net-Burstアーキテクチャなどというキャッシュミス・分岐予測ミスに弱いCPUが 長期に渡って最速の看板を掲げていられたのも、CPUパワーが必要とされる局面が 3Dゲームとかビデオ編集といったSSE絡みの処理がメインだったためである。 (この意味では、深深度のパイプライン段数を持つNet-Burstアーキテクチャは、 確かに間違いではなかったと言えるだろう。) もしこれがワープロとかWeb閲覧とかでCPUパワーが必要だったら、AthlonXP等に あっという間に駆逐されてintelは斜陽の時を迎えていただろう。

話がそれたが、要するにマルチメディア、ゲーム、CAD等のハードなビジネスソフト というジャンル以外ではCPUパワーは十分足りており、 Webを見たりメールをやりとりしたりワープロで文章を書いたりという用途では GHzパワーは不要なのだ。

実際、たるさんの環境下ではゲームマシンとWebマシンを分けているので ADSL環境下でのWeb閲覧程度では最新CPUパワーは能力過剰ということだ。 Cyrix-III(600MHz)などという「猫またぎ」系CPU(VIAの技術者さん、ごめんなさい。) でも必要にして十分な能力なのであった。

たとえば、下図はバックグランドジョブで音楽 (潜水艦シミュレーションゲーム「SUB-COMMAND」のテーマ曲) を聴きながら、Cyrix-IIIマシンで秋葉PCホットラインの「今週の新製品」の ページを読んだときのCPU負荷率である。

Cyrix-IIIでWeb閲覧時のCPU負荷率
秋葉PCホットラインの「今週見つけた新製品」という
画像バリバリ系ページを見た場合。
Cyrix-IIIで必要にして十分である事がわかる。

このページは小さな画像が多数満載で、音楽ファイルの再生と並列動作では Cyrix-IIIのようにハードウエアリソースがショボいCPUには 荷が重いと思っていた。だが、実際は ADSLから画像を取り込む段階で一瞬だけ負荷率100%になった以外は余力を持っていた。 (意外だったのは、スクロールの負荷が意外に高い事。マウスのホイールを回すと 負荷率がどっと上がる。)

こうなると、最新CPUって要するにプレステ2代替チップ?って思えてくる。 たるさんの好きなゲーム・タイトルはコンシューマ機には無い (たとえば上記の潜水艦シミュレーションとか本格フライトシムとか...) のでPCでゲームをプレイしているわけだ。 しかし、ゲーム専用機に欲しいゲーム・タイトルがあるなら、 数万円で買える激安マシン+PS2等の一般ゲーム機、 という選択枝の方が、十数万円する超ド級最新CPUマシンの購入より間違いなく ベストであろう。

これは、PCマニアであるたるさんですら認めざるを得ない悲しい事実であるようだ。 (なんせ、今回のレベルのマシンなら、秋葉で中古パーツをかき集めれば 超ド級最新CPUマシンの1/10程度の激安予算で作れるぞ!)

☆「見切り」の思想   
ところで、クロックが450MHzのCeleron300A@オーバークロックより Cyrix-IIIの600MHzの方が、なぜショボイのか? という疑問を持つ方がいらっしゃる可能性があるので、 それについて簡単に説明しておく。 Cyrix-IIIはアーキテクチャ上の制約から、同クロックのCeleron (Net-Burstアーキテクチャじゃない古いP6アーキテクチャのCeleron。) のほぼ2/3の性能と思っていただいてかまわない。 つまり、Celeron400相当なのである。

実は、CPU開発では設計思想が最重要である。 たとえば、Pentium4では「高クロック化に徹したアーキテクチャ。」である。 これが間違っていると枝葉末節の末端回路でいくら優れた設計をしても CPUトータルでは失敗作となるらしい。2)

では、Cyrix-IIIの設計思想はどうなのであろうか?  たるさんが思うにその本質は「見切りの思想」であろう。 つまり、「商売として成り立つ小さなダイサイズをまず決めて、 その制限内で最大限性能を上げるためには、何を残し、何を見切るか?」が 設計思想の中心だったと想像する。

彼らがそこで見切って捨てたのは「スーパースカラ」であり、 「アウトオブオーダー機構」である。 重要と判断したのは「1次キャッシュ」であり、「分岐予測」である。 (ちなみに、迷いが見えたのが「2次キャッシュ」。 最初は無かったが、後日後継機種に搭載された。)

Cyrix-IIIは実はパイプラインが1本しかなく、しかもインオーダー実行方式である。 この点だけ見ればなんと486世代のCPUなのだ。 しかし、当時としては大きかった128KBの1次キャッシュを備え、 分岐予測機構はintelやAMDの重装備プロセッサをも上回る当時の最先端方式が 惜しげもなく搭載されていた。

しかし、ダイサイズの制約は厳しくベンチ結果だけ見れば 下記の通り無惨な結果である。 重要性は低いと判断されたスーパースカラやアウトオブオーダー機構でも、 確かにそれなりの効果はあるのである。

Cyrix-III-600MHzのベンチ結果
ベンチ結果だけ見れば、これでもかと言う位ショボいのだが... 実はこれでもマシな方なのだ!

実は、この判断はたるさんのCPU感と一致している。 ダイサイズの制約からすべてのメカニズムを搭載できなかったわけだが、 たるさんでも見切らなければならないとしたら、たぶん同じ選択をしただろう。 (低消費電力化を狙ったのだという人もいるが、たるさんはそれは結果論であって Transmetaのように最初から低消費電力を狙っていた、というわけではないと思う。)

この判断の正しさは、今回の体感速度で実証されている。 「キャッシュ」と「分岐予測」以外は486世代というショボCPUでも、 それなりにまともにWeb閲覧できているのがその証拠。 この記事もCyrix-IIIマシンで書いている。 お世辞にも速いとは言えないが、Webマシンの速度としては 十分に満足できるのである。 少なくとも、Web専用機としての使用ならば不満は感じられない。

もしこれが逆の判断で、スーパースカラやアウトオブオーダー機構は 装備されているが、1次キャッシュや分岐予測機構の無いCPUだったら どうだったのだろうか?  たぶん、本物の486程度の性能だったのではなかろうか?

☆謎のキャッシュレス重装CPUをテストする。(笑)   
さて、ではここでスーパースカラやアウトオブオーダー機構は 装備されているがキャッシュの無いCPU にご登場頂き、CyrixIIIとベンチマーク勝負していただこう。

そのCPUとはこれである。こいつの中身は1次2次ともにキャッシュが無い。 いや、無い様に見える。外見はCeleron-2GHzそのもののように見えるが、 たぶん気のせいであろう。(笑)

謎のキャッシュレスCPU
Celeron-2GHzそっくりなのは気のせいである。(笑)

この、BIOSでキャッシュをDisableしたCeleron-2GHz 謎のキャッシュレスCPUでHD-Benchを行ってみた。 結果を見たら愕然とすること請け合いである。

皆様ももしPentium4やAthlonXPをお持ちなら、是非キャッシュをBIOSで Disableにしてマシンを起動していただきたい。 Cyrix-IIIでは、決して速くはないが実用性のある速度でマシンが動作した。 しかし、キャッシュレス最新CPUマシン (と言うほど新しくはないが...一応Net-Burstアーキテクチャだから。)では、 Web閲覧やエディタでの文章書き といった軽負荷でさえ、血管ブチ切れ寸前になるような速度 でしかマシンが動作しなくなる。

もしたるさんが、Cyrix-III-600MHzマシンとキャッシュレスCeleron-2GHzマシンの 二つからマシンを選ぶという究極の選択を迫られたら、躊躇無くCyrix-IIIマシンを 選ぶだろう。

BIOSでキャッシュを殺したCeleron-2GHzマシンのベンチ結果
何なのだ...この数値は!
こっ、これでもNet-Burstアーキテクチャかっ!

さて、最新CPUのキャッシュを殺すと、 キャッシュ以外のアウトオブオーダー機構やスーパースカラは生きているのに 「何これ?」って感じの超低性能になる事がおわかりいただけただろうか?  486と互角の低性能ぶりはたるさんが保証するが、最新CPUにおいてキャッシュが いかに重要かがおわかりいただけた事だろう。

これを見ればCyrix-IIIを開発した技術者の判断がいかに妥当な判断であったかが はっきりとわかる。世間では「静音PC以外では使い物にならない。」とか 「性能に見るべき物はない。」とか酷評されているCPUだが、 絶対性能ではなく効率面でみればそれなりに優れたCPUだと思う。

☆キャッシュと分岐予測の重要性   
徐々に本題に入っていこう。 というわけで、今回はCyrix-IIIとCeleronの比較から、 各高速化メカニズムの効き具合を推測することができた。

実は、PCマニアがCPUを語る場合においては人それぞれ主義主張があるわけだが、 CPUが高速を高速に動かす方法についての分類は人それぞれいろいろある。

一番有名なのは「高クロック派」「高IPC派」で、 歴史的にも設計思想は両者の間を揺れ動いてきた経緯がある。

実際、今は高クロック派優勢期の末期である。 ちょっと前までは「高クロックにあらざれば、高性能CPUに非ず。」 とまで言われていたが、高クロック路線は危うくなりつつある。

たるさん自身は消費電力100W程度で高クロック路線が断絶するとは考えておらず、 熱問題が顕在化するのは140W程度からと考えていた。だから、 一時TOPに立ったAMD64系CPUも、Hyper-Threadingの逆襲を受けると 予想しているのである。だがこの予想が的中するかは予断を許さず、 現状を見る限りなかなか厳しそうである。

しかし、もう少し詳細に見るとこれとは別の分類もある。 たとえば、CPUの速度を高めるのに「性能を高める機能」に注目するか、 「性能を維持する機能」に注目するかという、IPCの中身の違いに 注目した分類である。 言い換えれば、一つは高並列化、もう一つは高効率化である。

高並列化は同時に演算される命令数を増やすことで高IPC化を狙うもので、 スーパースカラやVLIWでは王道である。 Efficeonの8命令同時実行VLIWが典型例だろう。

もう一つは見逃されがちだ。 これは、効率を高めることで高IPC化しようというアーキテクチャだ。

えっ、高並列=高効率だろうって?

いやいや、これはよく聞かれる間違った常識で、 実はそうではないと思う。 たとえば、演算ユニットが3つのAアーキテクチャと 演算ユニットが6つのBアーキテクチャとでは どちらが高効率だろうか?(演算ユニットの性能は互角とする。)

Bアーキテクチャと答えた方...少し考えてみてほしい。 たとえば、演算ユニットがAアーキテクチャでは90%使われていて、 Bアーキテクチャでは40%だったとするとどうだろうか?3)

おわかりいただけたと思うが、 並列数からだけでは高効率かどうかは分からない。 いや、それどころか高性能かどうかすらわからないのである。 当たり前のことであるが、多くの演算ユニットを装備するプロセッサは、 これらが高稼働率を維持できるだけの並列化支援装備も充実していなければならない。

では、効率を高めるとはどういう事だろうか? すでにある演算リソースが100%稼働に近づけば近づくほど 高効率であるといえるだろう。

例えば、一番典型的なのがキャッシュ分岐予測である。 キャッシュも分岐予測も同時に実行される命令数を直接増やすことはない。 (リオーダーバッファに蓄えられる命令を増やすという意味で、 間接的には同時実行命令数を増やす効果はある。)

しかし、キャッシュミスや分岐予測ミスがあれば、パイプラインストールが 回復するまでは事実上のゼロIPC状態が続く。 これにより、平均値としてのIPCは低下してしまう。 (例外はPentium4のHyper-Threadingである。もう一方のスレッドを実行することで ゼロIPC状態を回避することができる。)

キャッシュや分岐予測はそれ自体並列実行命令数を増やすわけではないが、 ゼロIPC部分を減らすことで平均のIPCを押し上げることができるのだ。 これが、効率を上げる事で高IPCを目指すということの一つの解答である。

クルマで例えてみよう。

「性能を高める機能」に注目する場合とは、 「たとえ一部渋滞にぶつかっても、フェラーリで目的地に向かうのが速い。」 と考える事である。 逆に「性能を維持する機能」に注目する場合とは、「たとえ軽自動車でも、 渋滞にぶつからない方が速く目的地に着ける。」と考えることである。 もちろん、渋滞のない高速道路をフェラーリで走るのが一番速いのであるが、 これはCyrix-IIIのようなコスト重視のプロセッサでは難しい。

クルマなら勝負の帰趨はあきらかだ。たとえば、渋滞の激しい都内なら、 たるさんがフェラーリで混雑する主要街道を走るより、地元の都民が軽自動車で 渋滞の少ない裏道を走る方が速く目的地に着けるだろう。

CPUの場合はそう単純な話ではないが、たとえばHyper-Threadingの解釈でも、 「実行ユニットに従来以上の並列性が期待できる。」という雑誌説明は 「性能を高める機能」的解釈であり、 たるさんがそれよりも重要と主張している 「ミスキャッシュや分岐予測ミスのペナルティーを減らす事ができる。」は 「性能を維持する機能」である。

もちろん両方とも進化させるのが望ましいのは言うまでもないが、両者を比較した場合 より重要なのは「性能を維持する技術」であるとたるさんは考えている。 「性能を維持する。」という発想は地味で目立たないので脚光は浴びにくいが、 年季の入った職人のように渋い「いい仕事」をするのである。

その点では、キャッシュと分岐予測の重要性は今後もまったく 色あせる事はないだろう。 Hyper-Threadingもミスキャッシュと分岐予測ミスのペナルティーを 見かけ上減らすという意味において、 CPUとメモリのクロック乖離が激しくなるこれから、 さらに期待される技術であると思う。

本来のCeleron-2GHzのベンチマーク
1次2次キャッシュが有効ならば、本来はCyrix-IIIなど問題にしない速度。
(HDDの値が低いが、これはドライブ性能の違い。)

Cyrix-IIIとキャッシュを殺したCeleron-2GHzの比較からわかったのであるが、 最新CPU高速化のキモとは「キャッシュ」と「分岐予測」であり、 そこから考えられる核心部分とは「いかにパイプラインをストールさせない ように動作させるか。」であると、たるさんは確信している。

その重要性に比べれば、スーパースカラやアウトオブオーダー機構等の並列性向上 テクニックはキャッシュがまともに動作した上で初めて効果が上がる話で、 ある意味脇役的存在であろう。決して主役ではないのだ。

それはなぜか? アウトオブオーダー機構が稼ぐゲインは2つの命令を まとめて並列処理できたとしても1サイクルのゲインでしかないからだ。 最近のCPUはほぼすべてのユニットがパイプライン化されているので、並列化に失敗して 2つの命令を2回に分けて逐次実行しても、 多くの場合ペナルティーは1サイクルでしかない。 (アウトオブオーダー機構で2倍のゲインを得ようとしたら、 「すべての命令」の並列度を2倍にしなければならない。)

ところが、キャッシュや分岐予測のゲインはどうだろう。

Net-Burstアーキテクチャの場合、分岐予測に失敗すれば たとえトレースキャッシュに命令があったとしても約20サイクルの ペナルティーだ。また、キャッシュミスが1次2次と重なってしまい メインメモリから読み出さなければならない場合はさらにひどいことになる。 メインメモリの種類にもよるが、下手をすると 最悪数百サイクルものペナルティーが出る場合があるのである。

いくら優秀なアウトオブオーダー機構を設計しても、 数百サイクルのゲインを得られるシステムというのは現状のテクノロジでは不可能だ。 ゲインとペナルティーにこれほどの差があるならば、 たとえ並列化とキャッシュミスの出現頻度に差があろうとも どちらに重点を置くべきかは自明のように思われるのだが...

実際問題として、先ほどのベンチの結果もそれを支持している。 もし、スーパースカラやアウトオブオーダー機構が単独で キャッシュに匹敵するほどの効果を持つなら、 キャッシュを止めたCeleron-2GHzとCyrix-IIIのベンチマーク結果が ここまで差が開くことは無かったハズだ。

整数演算のベンチマーク数値を見比べてみて欲しい。 Cyrix-IIIが17倍もの大差を付けて キャッシュレスCeleron-2GHzに圧勝である。 だれが、この結果を予想し得たであろうか? (クロック周波数だって3倍以上違うんだから...)

最後に念のため一つだけ注意しておくが、スーパースカラやアウトオブオーダー 機構等が高速化に効果が無いと主張している訳では決してない。 限られたトランジスタ資源のダイにおいて 重点配分すべきメカニズムの優先順位について考え、 並列性向上メカニズムの効果に過度の期待は禁物と言いたかったわけである。

たるさんは、今後のCPU設計思想の中心は高並列化ではなく高効率化になると 考えている。高並列化的手法は、高並列化が進めば進むほど並列化できない部分が ボトルネックになる。その意味で、相対的には将来性が高いとは考えていない。

まず優先してやるべき事は、あくまで 並列性向上ではなくパイプラインストールの防止である。 その意味で、キャッシュ、分岐予測以外にも、 プリフェッチ、SMT、動的命令消尽(EfficeonのCMSで実装。)なんて方法は、 高並列化よりも将来性が高いと考える。

いけない、話題がそれた。話を戻そう。

要するにアウトオブオーダー機構が無くてもキャッシュは効くが、 キャッシュ無しではアウトオブオーダー機構はほとんど効果はない といえるだろう。 これらはキャッシュが動作して初めて効果の上がるシステムで、 言ってみれば「お釈迦様の手のひらで暴れる孫悟空」の様な関係なのである。 (そもそも、命令が連続して流れ込まなくては アウトオブオーダー機構は暇をもてあますだけである。)

というわけで、 今日でもCPU高速化のキモは「キャッシュ」と「分岐予測」である 事がおわかりいただけただろうか?  それは技術の進歩した今日でも変わらない不動の4番打者なのである。



1)
今でこそオーバークロックのためのオーバークロックになってしまっているが、 当時の486機ではU.S.NAVY FIGHTERSでどうやってもF-14がコマ送りでしか飛ばず、 大枚\75000もはたいてPentium-166への乗り換えを決意させたのだった。 しかし、それでも全然能力不足でMMX-Pentium-166(SL27K)を 225MHzにオーバークロックし、しつこくまだ能力不足で、 コプロの能力に一縷の望みを託してCeleron-266(SL2QG)の400MHz化... 無駄金叩いてたんだね。

落ち着いたのはCeleron300Aを450MHz駆動したときで、 これでようやくF-14やF-18がまともに飛ぶようになり、 オーバークロック・マイブームは沈静化したのであった。 あの頃のオーバークロックはちゃんとした目的があったんだなぁ〜って、 思い出すと懐かしい。

しかし、あのときの「思い出のCPU」も今やゴミ同然。 秋葉原のジャンク屋でCeleron266が\266、Celeron300Aが\300で 売っているのを見かけたときは涙もんでしたよ。それにしても、 今じゃ「そこにCPUがあるからオーバークロックするんだ!」みたいに、目的と手段が 入れ替わってるもんなぁ。意味無いよ。

2)
いい例がAMDのK5プロセッサだ。意外だがK5は命令デコード等では K6より洗練されたアーキテクチャを持っていた。つまり、 すべてのデコーダーが全命令をデコードできたのだ。 K6ではすべての命令をデコードできるのは1個だけで 他は簡単な命令専用のショートデコーダーだった。 しかし、総合性能はK6の方が断然上である。

3)
QuantiSpeedアーキテクチャ(AthlonXPのアーキテクチャ)は Net-Burstアーキテクチャ(Pentium4のアーキテクチャ)と比べて高効率と言われている。 だが、それは世間で言われているようにAthlonXPが高並列実行だからだろうか? 

ちなみに、AthlonXPは最大9命令を並列実行可能で、 Pentium4は最大6命令を並列実行可能である。 一見するとQuantiSpeedアーキテクチャが優れているように見える。

ただし、Pentium4はμOPS命令読み込み能力が3命令/サイクルしかないので、 6命令同時は瞬間最大風速であり、連続的には3命令同時相当となる。 AthlonXPでもデコーダーは3つしかないので、連続的には3命令同時相当となる。 なんだ、実質的にはほとんど同じじゃないのか?

というわけで、AthlonXPがPentium4より高IPCなのは、 同時に実行できる命令数が高い事だけが原因なのではなく、 パイプライン段数の差でキャッシュミス・分岐予測ミスの ペナルティーが小さい事が単純に効いているのではないだろうか? と推定している。やはり、高並列より高効率なのだ。