■後藤弘茂のWeekly海外ニュース■
AMDが2011年に投入する次世代CPUアーキテクチャ「Bulldozer(ブルドーザ)」。CPUアーキテクチャ上でのBulldozerの大きなポイントは、シングルスレッドの整数演算性能の追求を止めたことだ。Bulldozerでは、おそらく、現行のAMD CPUよりシングルスレッドの整数中心のアプリケーションの性能は下がる。CPU構造の簡素化で、CPUの動作周波数を上げることができれば、低下分を埋め合わせることができるかも知れないが、クロック当たりの性能は下がるだろう。その反面、マルチスレッド性能と浮動小数点演算性能は大きく伸びる。
つまり、AMDは、PC向けCPUの不文律だった、整数演算性能をたゆまなく伸ばし続けるというコースから外れることになる。なぜ、AMDはそんな決断をしたのか。それは、CPUのパフォーマンス効率を上げるためには、それがベストな方法だからだ。
CPUの性能を高めるための並列性の活用は、「命令レベルの並列性(ILP:Instruction-Level Parallelism)」から、「スレッドレベルの並列性(TLP:Thread-Level Parallelism)」や「データレベルの並列性(DLP:Data-Level Parallelism)」へと急激にシフトしている。プログラム内の命令を並べ替えて並列実行するよりも、複数のスレッドを並列実行したり、複数のデータを1命令で処理する方がいいという考え方だ。これは、今やプロセッサ業界の共通認識だ。
しかし、意見が大きく分かれるポイントもある。それは、ILPをどうするかについてだ。依然としてILPの強化を続けるのか、それともILPは現状に止めるのか、あるいはILPを引き下げるのか。
高いILPは、多くのリソースを必要とする。そのため、高ILPのCPUは、命令実行当たりの電力効率が悪くなる。CPUのパフォーマンス効率を追求するなら、ILPはある程度にまで抑えた方がいい。
しかし、ILPを下げると、既存のシングルスレッドアプリケーションの整数演算性能が下がる。つまり、これまで使っていたアプリケーションの性能が落ちてしまう。既存アプリの性能が落ちることは、これまでは禁忌だった。それができないがために、PC向けCPUは、効率が悪いことがわかっていても高いコストを払ってILPを高める方向へ進んできた。これが、PC向けCPUにとっての呪縛だった。
しかし、今、流れは変わり始めている。Intelは、低価格または低消費電力のCPUセグメントにはILPを下げた「Atom(Bonnell:ボンネル)」系CPUコアを投入した。AMDも、同じコンセプトのBobcat「(ボブキャット)」を2011年に投入する。そして、AMDは、ハイエンドからメインストリーム向けのCPUアーキテクチャであるBulldozerでも、ILPからDLP&TLPへのシフトを行ない、ILPを従来より下げる。それに対して、Intelは、DLPとTLPを高めながらも、ILPを維持しようとしている。AMDとIntelは、決定的に方向が分かれつつある。
AMD CPUアーキテクチャ移行図 PDF版はこちら |
●1スレッド当たりの整数パイプは2/3に
AMDが来年(2011年)投入するBulldozerは、2個のCPUコアを統合したCPUモジュールで2スレッドを実行する。1個のCPUモジュールの中に2個の整数コア(Integer Core)とL1キャッシュを備え、2スレッドを並列実行する。一方、浮動小数点ユニット群(FP Units)や命令デコーダ(Instruction Decoder)、L2キャッシュなどは、CPUモジュールに1個(または1グループ)ずつで、2スレッドの共有リソースとなっている。
Bulldozerモジュールのマルチスレッド PDF版はこちら |
AMD CPUは、伝統的に整数演算パイプ(Integer Pipe)とロード/ストアパイプ(Load/Store Pipe)をペアで構成している。演算の実行パイプと、データをメモリからロードまたはストアするパイプが1個ずつ組になっている。これは、演算とメモリオペレーションを含んだx86演算命令を、内部命令「uOP(MicroOP)」に分解してOut-of-Order(アウトオブオーダ)実行する際に、スケジューリングを容易にするためだ。AMDの場合は、実際にはx86命令からuOPに分解するまでの間に、複合型内部命令「MacroOP」に変換されるが、最終的な実行時にはuOPになる。Bulldozerでも、この基本は変わらないと推測される。
Bulldozerの整数コアは、2個の整数演算パイプと2個のロード/ストアパイプを備えている。つまり、演算&ロード/ストアのペアを2組備えていると見られる。それに対して、AMDの現在のCPUコア「K10(Hound:ハウンド)」では、整数ユニットは3ペア、つまり、3個の整数演算パイプと3個のロード/ストアパイプを備えている。
uOPの並列実行では、Bulldozerの整数コアが4 uOPs/Cycle、K10コアが6 uOPs/Cycleのピーク実行帯域となる。x86演算命令に換算すると、Bulldozerの2ペアの演算&ロード/ストアパイプは、2命令分(実際には同時に実行されるのは異なるx86命令の演算uOPとロード/ストアuOPの組み合わせ)をピークで並列実行できる。それに対して、K10コアはx86演算命令で3命令分を並列実行できる。
比較すると明瞭なように、Bulldozerの1個の整数コアで実行できる命令のピーク実行帯域は、現在のCPUコアの2/3になる。言い換えれば、命令レベルの並列性(ILP:Instruction-Level Parallelism)が2/3に削減されている。整数系のシングルスレッドの“ピーク”パフォーマンスは、Bulldozer世代でK10の2/3に落ちることになる。
ちなみに、x86命令のデコード帯域はK10が3 x86命令/サイクルであるのに対して、Bulldozerは4 x86命令/サイクルと、Bulldozerの方が高い。しかし、Bulldozerは2個の整数コアに命令を充填しなければならない。そのため、実質的に1スレッドが使える命令デコード帯域は、平均では半分の2 x86命令/サイクルになってしまう。命令デコード帯域でも、K10の2/3だ。
AMDアーキテクチャの比較 PDF版はこちら |
●10年前のCPU世代へとパイプ構成は後戻り
AMDは、3 x86命令デコード、6 uOPs実行の整数パイプの構成を、'99年に投入したK7世代で作り上げた。以来、基本構成はK10(Hound)まで変わっていない。AMDのCPUで、2 x86命令デコード、4 uOPs実行の整数パイプだったのはK6世代だ。K6系では、x86命令を「RISC(Reduced Instruction Set Computer)86」と呼ばれる、uOPと同じ発想の内部命令に変換する。2個のx86命令が各サイクルにデコードされ、最大4個のRISC86が各サイクルにスケジューラに発行される。単純にパイプラインの数だけで比較すれば、Bulldozerの整数コアはK6系コアと同じだ。
面白い点は、Bulldozerの整数パイプ群の構成が、同時期にAMDが投入する予定の低消費電力&低価格PC向けCPUアーキテクチャ「Bobcat(ボブキャット)」と似ていることだ。Bobcatは、2 x86命令デコード型のパイプラインで、CPUコアに整数演算系パイプが2、ロード/ストア系パイプが2含まれる。ただし、ロード/ストアパイプは、それぞれがロードとストアの専用で、整数演算パイプも完全なフル機能パイプが2本なのかどうかわからない。Bulldozerと較べると、制約があると見られる。また、浮動小数点演算ユニット群のピーク性能は、Bulldozerの方が断然上だと考えられる。
Bulldozer、K6/7/8/10の命令帯域 PDF版はこちら |
とはいえ、基本的な構成ではBulldozerとBobcatに類似点がある。Bulldozerの整数コアの構成は、従来のPC向けCPUコアよりも、10年以上前のAMD CPUや、低消費電力CPUと共通項がある。ここに、Bulldozerアーキテクチャのポイントがある。
ちなみに、IntelのAtom(Bonnell:ボンネル)系アーキテクチャも、2 x86命令デコード型のパイプラインだが、こちらは話がかなり違っている。Bonnellは、In-Order実行コアで、PC向けCPUのようにuOPには分解しない。より省電力に振ったコアであり、Bulldozerとは基本の発想が異なり、性能レンジも異なる。
●CPU設計の原則に従ったBulldozerの方向性AMDがBulldozerの整数系パイプ数を減らして、実行帯域を狭くしたのは、すでに述べたように、その方が効率が高くなるからだ。電力やトランジスタ当たりパフォーマンスを上げるには、整数パイプを減らすのが一番手っ取り早い。
そもそも、現在のPC向けCPUの3~4 x86命令デコード&実行のパイプラインは、実際にはオーバーキルなケースがある。メモリに制約がある現状では、命令間の依存性のために、x86命令換算で2命令程度しか並列実行できないケースが少なくない。uOPに砕いて実行する場合でも同じで、3~4 x86命令の並列実行帯域は、あくまでもピークであり、平均はそれよりかなり少ないというのが常識だという。
ところが、2 x86命令実行から3~4 x86命令実行に拡張すると、よりリソースが必要となる。増やしたリソースに見合う分だけ命令実行効率が上がればいいが、実際にはそう行かないため、1命令の実行当たりの電力とトランジスタの消費が増えてしまう。その分、電力とトランジスタ当たりのパフォーマンスが落ちる。
これについては、IntelもCPU設計の経験則『ポラックの法則(Pollack's Rule)』として説明を行なっている。同法則では、CPUのサイズを2倍にしても、整数演算のパフォーマンスは平方根程度にしか向上しないとされている。つまり、2倍複雑なCPUにしてILPなどを高めても、性能向上は1.4倍程度に留まるため、電力とトランジスタ当たりの効率が悪化する。
ポラックの法則 PDF版はこちら |
これまでのPC向けCPUは、シングルスレッドのシリアルコードの絶対性能を高めるために、ひたすらILPを高めてきた。ピークの並列命令実行数を増やし、その結果、現在の3 x86命令実行(AMD)や4 x86命令実行(Intel、厳密には条件分岐命令が融合されるため5命令実行)に行き着いた。1~2命令しか並列に実行できないケースがあっても、より多くの命令を並列実行できる時にピークで性能を稼ぐという考え方だ。だが、そのアプローチがCPUを肥大させ、電力とトランジスタ当たりのパフォーマンス効率を落としてしまった。
そのため、論理的には、CPUを効率的にするにはILPを抑えて、同時に実行できる命令数を減らして、CPUコアをよりシンプルにすればいいという結論になる。2 x86命令デコード&実行のパイプラインにすれば、現在よりパフォーマンス当たりの電力とトランジスタ数を下げることができる。
3~4 x86命令実行のパイプラインの場合は、ピークの性能は高くなるが、1~2 命令しか実行できない場合は、リソースが無駄になる。それに対して、2 x86命令実行パイプラインの場合は、1~2 命令しか実行できない場合も無駄が少なくて済む。ただし、3~4 x86命令を並列実行できるチャンスは活かせないため、整数系の絶対性能は落ちる。
●トレードオフで未来のアプリを取ったAMD2 x86命令実行に落として、より効率的にしたCPUコアを多数載せれば、チップ全体のパフォーマンス効率が高まる。電力とトランジスタ当たりのチップ全体のパフォーマンスがより上がり、より効率的なCPUになる。ただし、ピークのシングルスレッド整数パフォーマンスは犠牲になり、性能向上の恩恵を受けることができないアプリケーションが出てくる。
となると、PC CPUにとって、これはトレードオフの問題となる。シングルスレッドの性能を維持するか、マルチスレッドの性能を重視するのか。ピーク性能を取るか、効率を取るか。既存アプリケーションの性能を死守するのか、将来アプリケーションの性能向上にフォーカスするのか。そして、AMDは後者を取ったことになる。
AMDアーキテクチャの中での比較では、効率の追求が浮き彫りになるBulldozer。しかし、Bulldozerの整数パイプの構造をIntel系アーキテクチャと比較すると、また別なビューとなる。
Intelの現在のアーキテクチャは、ジョウゴ型のパイプラインで、上が広く下が狭い。つまり、より多くの命令をフェッチ&デコードして、それを比較的狭いパイプ群に流し込むことでパイプの稼働効率を上げようとしている。Nehalem(ネヘイレム)では最大5個のx86命令(1個が条件分岐の場合)をデコードして、最大4個のFused uOPに変換する。Fused uOPはAMDのMacroOPに当たる。MacroOPはuOPに分解されて、整数系と浮動小数点系が統合された実行パイプ群に送られる。命令のディスパッチポートは合計で6つで、Nehalemでは2スレッドのuOPをSMT(Simultaneous Multithreading)実行できる。
つまり、Nehalemでは2スレッドに対してパイプは6本。Bulldozerの2スレッドに対して合計8本のパイプより、単純計算で狭いことになる。しかし、Nehalemでは1スレッドがピークで6パイプを占めることが可能だ。それに対してBulldozerは、スレッド当たりピークで4パイプとなる。
IntelのSMTでは、例えばメモリアクセスで1スレッドがストールしている場合も、別なスレッドが実行パイプを埋めることができる。そのため、パイプの実行効率は高くなる。Bulldozerにはその利点はない。ストールしている間は、そのスレッドの整数コアは停滞してしまう。しかし、スレッド同士のリソースの競合は起こらないため、ピークの性能は削がれない。
つまり、IntelとAMDは、どちらも異なる考え方で、効率とピーク性能のバランスを取ろうとしている。Intelは、Nehalemの路線を維持すると考えられるため、両社の違いは、今後数世代は継続されると考えられる。