螺旋階段が性能を上げる。(キャッシュだけに頼れない理由。)   

2007年5月29日



☆PenrynならぬPoppyの見物。   
今回もいつもの余談から。

先日、まともに休めるようになった週末を利用してぶらぶらドライブがてらに 下妻市・小貝川ふれあい公園のポピー(ひなげし)を見に行ってきた。 筑波山を遠景に控え、一面のポピーが咲き乱れる夢の情景だ。

小貝川ふれあい公園のポピー。
遠くに筑波山を控え、夢の情景が広がる。

ん〜、それにしても偉そうなことを言ってカメラを買った割には全然写真の腕が良くなっていないね。 まぁ、そういう突っ込みは無しで大目に見ておいて欲しい。

しかし、これだけの大面積でポピーが咲き乱れるのは生まれて初めて見た。 しかもこのポピー、市民のボランティアがメインで維持されているのだそうで... なんと入場無料で、さらに駐車料金も無料。

普通は有料の花園だと\500〜\1000位は取られるんだから、ありがたいことこの上ない。 その上、市民ボランティアによる豚汁のサービスまであったりして、 ますますありがたいことこの上ない。 食い意地が張っているので、早速行列に並ぶ。

申し訳ないので\300ほど募金したらポピーの種を一袋頂けた。 花と豚汁だけで十分元は取れていると思っているのだが...なんだか申し訳ないね。

一面に咲き誇る。
主に赤のポピーだが、一部に黄色の別の花もあった。

この小貝川ふれあい公園のポピー、写真の視界はこれでも全面積の1/10以下だ。 とにかく広い。そして一面真っ赤。(写真の通り一部黄色い花もあるけど。) 花畑の中から垂直に飛び上がる小鳥がいたと思ったら、空中で大きな声で鳴き出した。ヒバリだ。 天気は晴れているしヒバリは鳴いているし花も良し。見ての通り最高のお花見日和である。

と言うわけで、去年の反動で今年はまったり癒し系の週末が多いね。 当サイトらしくないが、最近は秋葉の優先順位はだいぶ下がっているぞ。

と言う具合に堅い話題の前に癒していただいて、では本題へどうぞ。

☆Penrynでの主な性能向上手段はキャッシュ増量。   
intelから発表された新型コアPenryn。 このコアの特徴は性能増強の多くを2次キャッシュ増強に頼っていることだ。

報道によるとPenryn世代では45nmプロセスへの移行によって使えるトランジスタ数が増えるので、 このような性能増強手法をとっても問題ないということらしい。

当サイトもこのPenrynの手法にダメだしするつもりは毛頭ない。 キャッシュ増量は確実に性能を向上させるし、 比較的用途を問わない性能向上方法だからだ。

だが不安な点もある。 それはPenrynではキャッシュ増量以外の性能向上手法が極めて限られている事だ。

SSE4命令の追加は効く用途では効果があるが、ソフトが対応しなかったり 効かない用途だったりするとさっぱり効果がない。 また割り算の強化だが、性能向上こそすばらしいものの、 そもそも割り算は処理全体に対する出現頻度が低い場合が多い。

これに対するintelの見解は 全面改良ではなく、部分改良に留まったPenryn という記事に掲載されているので、興味のある方はご一読いただきたい。 要するにPenrynでの改良点は「美容整形」のようなもので、 肝心の心臓部に手を付ける「心臓外科手術」のような 抜本的な改良は行っていないためだそうだ。

この説明は当サイトの感想とも一致する。 intelのEden氏によれば、「Penrynでの改良は素晴らしいが、それは、あくまでも限定された“美容整形手術”のようなものだ。 全てを再アーキテクチャする、“心臓手術”のような大きなものではない。大きな変更はNehalemで行なわれる。」 とのことだ。当サイトは以前Penrynの印象を「部分最適化の集合体」と表現したことがあるが、このような事情なら納得である。

部分的な問題点を美容整形し、性能増強は2次キャッシュ増量に頼る。 プロセス改良とアーキテクチャの抜本的改良を同時に行うと、 トラブルが起こったときどちらの要因で問題が発生しているか 区別しにくくなる事を考えれば、それもやむを得ない判断ではある。

しかし、問題は今後も性能向上をキャッシュに頼り切って良いかどうかだ。

PCマニア間でよく言われることの一つに「すべてがキャッシュにヒットすれば性能は2倍にも3倍にもなる。」という話がある。 これが本当ならば、まだまだキャッシュには性能向上に寄与する余地がある。

しかし、この話...本当だろうか?

当サイトの今の考えを最初に述べておこう。 当サイトの考えでは、すべてがキャッシュにヒットするような魔法のキャッシュが 存在したとしても、おそらく多くの用途で性能は2倍にもならない... というものだ。(ただし、スパコン用途はキャッシュミスが性能低下の最大要因を占めるので例外として除く。)

キャッシュによる性能向上は他のILP水準向上とセットで効果を現すものであり、 キャッシュ単体のみの効果では成し遂げることは不可能... というのが当サイトの考えだからだ。

これは以前の原因があって結果がある。(PenrynとNehalem雑感) という話の中で「キャッシュ増量とILP向上はセットであり、お互いに無関係に 一方を強化し続けるだけで一方的に性能を強化できる訳ではないと思う。 」 と書いたことに関係している。

☆キャッシュ増量だけで性能が上がるのか?   
どういう事か、当サイトの考えを説明してみよう。

と言っても当サイトはトリ頭故に難しい話は展開できない。 従って、いつもの通りモデルをとてつもなく簡略化して考えてみよう。 今回の計算は、数式で言えば小学生の算数レベルである。 いつものお約束として、当たるも八卦当たらぬも八卦として、 当否の判断はご自身のお考えでお願いしたい。

ではここで、CPU動作時間の内訳を考えてみよう。 Pentium III/4を大きく超えると予想されるBaniasの効率 という記事の中程に「IDFでの分岐予測に関する資料」というintelの発表データがある。 古いデータだが、CPUの全動作時間の内で分岐予測ミスが約27%、データミスが約20%、パイプラインが動いているのは約53%である。

もしここで、容量がメインメモリと同容量というヒット率100%の魔法のキャッシュがあったと仮定しよう。 そうするとCPUの処理能力は何倍になるだろうか?

まず、メインメモリと同容量のキャッシュでも初回アクセスはミスするわけだが、その効果は無視して考えてみよう。 アウトオブオーダーの効果等を無視して単純に考えればだが、 キャッシュミスの時間がゼロになるわけだから、1/(1-0.2)=1.25だから性能は1.25倍になるだけである。

intelがIDFで発表した資料の内訳
実行時間の約1/2弱はストールしている。

では、ここで性能が2倍にも3倍にもなるケースについて考えてみよう。

例えば性能が2倍になるケースでは、単純計算では キャッシュミスの時間が全時間の1/2以上で無ければならない。

データミスが無くなったときに性能が2倍(実行時間が半分)になるためには...
全実行時間の半分がデータミスで無ければならない。

これが性能3倍の場合は全時間の2/3以上をキャッシュミスにより ロスしていなければならない。

データミスが無くなったときに性能が3倍(実行時間が1/3)になるためには...
全実行時間の2/3がデータミスで無ければならない。

もちろんこれは単純計算であり、キャッシュミスが発生してもただちには ストールが発生しないアウトオブオーダーの効果とか、 キャッシュは命令キャッシュ、データキャッシュ、 (両者を統合して扱う)ユニファイドキャッシュ等があり、それぞれ効果が違う事を 考えなくてはならない。だから、あまりにもモデルがシンプルすぎるという問題点はある。 (intelの発表データはデータミスだけを公表しているため。)

しかし、これを差し引いて大雑把に見てもキャッシュ増量だけで性能が2倍にも3倍にもなるという 状況はあり得ない事がおわかりいただけると思う。

キャッシュの増量だけで性能が比例して増強できるのならば、 トランジスタの搭載量はミクロンルールの改良に従ってムーアの法則に従ってどんどん増えるのだから、 ILP向上の限界がどうのこうのなどという難しい話は抜きにしてキャッシュだけをドンドン増強してゆけばいいことになる。

もしも最後の図が真実なら、逆にILP水準の向上などは総合性能の向上にほとんど寄与せず意味が無いということになる。 キャッシュが無茶苦茶に効く状態というのは、実はキャッシュ以外の手法がほとんど効かない状態でもある。

しかし、現実にはそんな単純な話ではないハズである。 Penrynコアの2次キャッシュは全コア面積の半分程度を占めているが、 コア部分がi486のままでキャッシュ容量がPenrynの2倍の12MBなんてコアが 仮にあったとしても、ダイサイズこそ同じ規模であるがもちろんPenrynには勝てないだろう。

☆キャッシュは容量増により常に効かなくなり、そしてILP向上でリカバーされる。   
しかし、キャッシュ容量増強による性能向上余地がこれほどに少ないと考えれば、 今までキャッシュ容量増強が常に性能を向上させてきた状況を説明できないのではないか? という疑問が生じる事と思う。これは確かにもっともな疑問である。

例えば、intelが以前発表した先の図を見ていただきたい。 この図によればCPUの全動作時間のうち、分岐予測ミスで27%程度をロスし、 データキャッシュミスで20%程度をロスし、CPUのパイプラインが動作しているのは 全時間の53%程度である。

これをそのまま性能向上余地と考えれば、 無限にヒットする魔法のキャッシュがあったとしても、 この20%分がゼロになるだけで性能向上は行き詰まってしまう。

しかし、現実にはキャッシュ増量は常に性能を向上させてきたという現実がある。 これは一体どういう事だろうか?

問題の本質は、この図は実時間ではなく、 あくまで実行時間の比率を示しているに過ぎないという点だ。

この図でキャッシュ増量によりキャッシュミス時間が半分になったと仮定してみよう。 単純計算の場合、性能向上は1/(0.8+0.2/2)=1.111だから11%である。 この瞬間、全動作時間に占めるキャッシュミスの割合も20%が11%に減る。 (全動作時間が短くなっているから分母も変わるので10%ではなく11%となる。)

このとき全体に対する割合がどう変わるかであるが、 キャッシュミス11%、分岐予測ミス30%、実行時間59%となる。

では次に同じ割合だけキャッシュを増量したとして、キャッシュミス時間が 半分になったとする。この場合、どれくらい性能が向上するだろうか?

単純計算だと、性能向上は1/(0.59+0.30+0.11/2)=1.058だから6%以下でしかない。 当サイトがキャッシュだけを増強しても性能を向上し続けることはできないと 指摘する所以である。ひたすらキャッシュだけを単純に増量させていった場合、 2度目のキャッシュ増量は1度目のキャッシュ増量ほどの効果は 得られないと思われる。

ではここで、ILP向上の寄与を考えてみよう。 この図が作成された頃の目標ILP水準は3だから、 ここでILPの水準が仮に3から4に上がったとし、 パイプラインは理想的に動作していると仮定してそれがそのまま CPUの動作時間短縮に寄与すると簡略化して考えてみる。 また、分岐予測レベルも2倍に向上したと仮定する。

まず、1回目のキャッシュ増量段階で次にILP水準が上がったとすると、 キャッシュミスの全時間に対する割合が回復するのである。 ここではあえて「回復する。」という表現を使わせていただいたが、 これはキャッシュ増量の効きが回復するという意味である。

この場合は実行時間が3/4に短縮され、分岐予測ミス時間が半分になるわけであるから、 性能向上は1/(0.59/(4/3)+0.30/2+0.11)=1.423となって約42%となる。

問題は、このときCPUの実行時間や分岐予測ミスによるロスタイムが減っているので、 相対的にキャッシュミスの時間が比率としては増えることだ。 実時間としては増えなくても比率としてなら増えるのである。

このとき全体に対する比率がどうなっているか計算してみよう。 計算上はキャッシュミスが16%、分岐予測ミスが21%、実行時間が63%となる。

1度目のキャッシュ増量により20%のミス比率だったロスタイムが11%に減った。 だが、ILPレベルが向上すると実時間が変わらなくても分母が減るために比率としては 16%まで回復する。このため、同じキャッシュ容量増大でも、その効き具合は 1/(0.63+0.21+0.16/2)=1.086だから約9%に回復するのである。

要するに単純にキャッシュ容量増を繰り返すと2回目以降の増量効果が大きく落ちるのに対し、 ILP水準を上げたり分岐予測水準を上げれば、キャッシュ増量の効果が大きく回復するわけだ。 キャッシュの効きはキャッシュ自身が低下させており、それを回復させるのは 実行パイプラインのILP水準向上であったり、 分岐予測のレベル向上だったりするわけだ。

実行パイプラインのILP水準向上というとCPUの性能向上という面ばかりに目が行くが、 実はキャッシュ増量時の性能向上余地の回復という隠れた効果があると当サイトは指摘したい。

☆VIAが単純なスカラプロセッサを捨てようとするのはなぜか?   
と言うわけで、キャッシュ容量増だけで他の部分の改善を怠れば、 キャッシュ増量効果は数世代後には飽和するだろう。 「キャッシュに完全にヒットすれば性能は2倍にも3倍にもなる。」という見解は キャッシュ単独の効果としては明らかに間違いだし、 逆にいえばILP水準や分岐予測ミスの改良とセットならば 2倍3倍どころか理論上は無限に性能向上の余地があるとも言える。

ここでおもしろい例を挙げておこう。 VIAの新型コアである。

VIAの新型コアは話が出るたびに 「ついにVIAがスカラコアを捨ててスーパースカラになる。」 という噂が出る。(これは試作レベルなら噂ではなく事実でもある。)

しかし、VIAのコアはPenrynコアに比べると非常に小さなキャッシュしか備えていない。

もし、単純にキャッシュ容量増だけで性能が向上できるならば、 少なくともPenrynと同じ6MBキャッシュまではスカラコアのままで キャッシュ容量を増やせば性能が向上できるハズである。

しかし、VIAがキャッシュ容量増量方針をとらず、コアのスーパースカラ化を考えるのは、 今回当サイトが書いた内容に従って考えれば、もはや単純なスカラコアのILP水準がボトルネックになって キャッシュ増量による性能向上が期待できそうもないから...という事になる。 (ちなみに、VIAは分岐予測に関しては分不相応なほどに 高度なメカニズムを採用しているので、この点はボトルネックにはならないと思われる。)

また、実行部分の実時間を短縮させる方法はILP水準の向上の他にクロック向上もある。 しかし、クロック向上はメモリアクセスとの乖離を拡大させるので、 この場合はキャッシュミスにおけるロスタイムも拡大させるという副作用があるので、 ILP水準向上ほどの効果はないと思われる。

だからVIAはキャッシュ増量ではなく、シンプルなスカラ方式を捨ててまで スーパースカラの試作に力を入れていたのだろう。

☆螺旋階段が性能を上げる。   
と言うわけで、単純にキャッシュ容量だけを増量しても性能向上余地は限られている という当サイトの趣旨をご理解いただけただろうか?

もちろん、この見解はあたるも八卦あたらぬも八卦ではある。 特にアウトオブオーダーの寄与が計算に入っていない点とか、intel発表の図ではデータミスだけが記載され 命令キャッシュミスが考えられていない点は大いに気がかりではある。 生来のトリ頭ゆえに、あまりにもモデルをシンプル化していると指摘されるなら確かにその通りかもしれない。 (もう少し複雑化したモデルも考えてみたが、途中で訳がわからなくなってきたので...あぁ、トリ頭はアカンなぁ。)

しかし、たとえ大雑把でももしこれが正しければ、ILP水準をこれ以上上げることは難しいと予想される今、 CPUコアに対しキャッシュ容量増大を繰り返す事で性能向上を行うこともまた難しいことが予測される。

キャッシュ容量増大はPenrynでは大きな寄与があるが、 Nehalemではキャッシュ容量増大ではなくアーキテクチャの抜本的刷新を行うのには このような理由があると推測される。もしNehalemでも性能向上をキャッシュ容量増大に頼るならば、 同じ割合だけキャッシュを増量してもその効き具合はPenrynより小さなものとなるだろうし、 そのまた次世代で同じ事をすれば性能向上はどんどん縮小してしまうだろう。

キャッシュ容量増大とILP水準の向上(分岐予測レベルの向上)は基本的には同時に行うべきだし、 ミクロンルールとの関係でコアの刷新を同時に行うことが危険ならば、 せめてキャッシュ容量増大とILP水準の向上は世代毎に交互に行うべきだというのが当サイトの主張点だ。 キャッシュ増量の効果を持続させるためには、ILP水準の向上や分岐予測といった他の効果を交えて、 螺旋階段を登るように順次すべてを改良していかなければならないと言うのが今回の最大の主張点である。

キャッシュが今まで順調に容量を増やし、また順調に性能を上げてきた背景には、 内部コアのILP水準もまた併行して改良されてきたという布石があってのことであろう。 (ソフトの肥大化により同一キャッシュ容量ならヒット率が時代と共に低下するという効果も忘れてはならないが...)

キャッシュは他の改良とセットならば無限の可能性を秘めているが、 キャッシュ単独での性能向上は2〜3世代位で飽和すると思われる。 つまり、ILP水準向上の危機が叫ばれる今は、実は数世代後のキャッシュの危機でもあるわけだ。

CPUの性能向上にはバランス感覚が重要であり、386から486への改良のように キャッシュだけでCPU性能がガンガン上がる!という 一点突破改良の時代は終わったと当サイトでは考えている。 強いて言うなら、速度低下の要因を均等に散らし、特定の種類のボトルネックが生じないようにするのが 正しい設計方針ということになる。

トータルバランスを極めるのは総合的にあらゆる部分の知識が必要であり、 しかもレベルも高くなければならない。 アーキテクトには厳しい時代になったものである。


6/5:数値の誤記訂正 4/3→3/4 プロセスルールが65nmになっていたので45nmに誤記訂正