今年1月、ラスベガスにて行われたCESでAMDはBobcatコアを搭載する第一世代Fusionプロセッサを発表し搭載製品も各種展示され、更に2月上旬には国内の自作マーケット向けの製品投入も始まるなど、順調に普及が始まっている。

今回投入されたのはBobcatベースのZacate/Ontarioコア製品で、その性格上競合はIntelのAtomあたりになる。メインストリーム向けのLlanoベース製品は、昨年TFE2010でウェハや動作デモが公開されたが、市場投入はもう少し時間がかかる。

さてこのZacate、筆者の手元にも2月初旬に評価キットが届き、色々と試させたいただいたのだが、つい原稿を遅らせていたら地震の影響で思いっきり後ろにずれてしまった。全く持って筆者の不徳であるが、そんなわけで遅ればせながらZacateというか、Bobcatコアの評価などをお届けしたいと思う。

Bobcatのおさらい

さて、まずはここから始めることにしよう。昨年開催されたHot Chips 22において、AMDのBrad Burgess氏(AMD Fellow, Chief Architect / Bobcat Core)により内部構造の詳細などが公開されているので、この資料を基に概略を紹介したい。

Bobcatは2命令同時実行のSuper Scalar/Out-of-Order搭載コアであることは既に良く知られている(Photo01)。このあたりの判断はメーカーによって当然異なってくるのだが、ARMのCortex-A9とかMIPSのMIPS32 74K、Freescaleのe500の様に、組み込み向けでもある程度の性能を必要とするプロセッサでOut-of-Orderを実装する製品が増えているのは、45nm以下のプロセスを使う場合では、もはやOut-of-Order実装によるトランジスタ(やダイ面積)のペナルティはそれほど大きくない、という事だろう。実際VIAもC7まではSingle Issueのパイプライン構造であったが、NanoでSuper Scalar/Out-of-Orderの搭載に踏み切っており、現時点でOut-of-Orderを搭載しないのはIntelのAtomのみという状況になっている。純粋に消費電力を下げるだけならば、勿論Single Issueのpipelineの方が有利であろうが、性能とのトレードオフを考えた場合に、必要な性能を確保するために高い動作周波数でブン回すべきか、それとも2命令/Cycle程度で動作周波数をそこそこにするか、というあたりが判断の境目になったと思われる。IntelのAtomは2命令のスーパースカラとは言えIn-Orderのままブン回すスタイルで、ただしそのままだと性能が不足するのでHyperThreadingで補ったという形であり、それに比べるとBobcatは昨今の組み込み向けプロセッサに近いトレンドとも言える。

Photo01: この図だけ見ると、K6コアともK7コアとも趣が違うのが判る。整数部だけ見るとK6コアと似てなくもないのだが、K6はFPUがきちんとパイプライン構造になっていなかった。またK7はLoad/Store共用のAGUがI-Pipeと対になる構造だったが、BobcatではAGUがI-Pipeと分離されている。

Photo02はPhoto01をもう一段噛み砕いた構造である。このレベルでは、比較的コンサバティブな構造であると言える。ではもう少し細かく見てみよう。I-Cache(Photo03)は、32KBとK7~Phenom IIの64KBから半減している。ただLine SizeやAssosiativityなどは従来と々構成を踏襲している。I-TLBについては、2MB Pageの場合は半減(Phenomだと16Entries)だが4KB Pageの場合は512Entriesとなっている。実はPhenom系の場合、I-TLBも2段構成で、4KB Pageの場合はL1 I-TLBが32、L2 I-TLBが512となっており、Bobcatではこれを1段構成とした様だ。実質、Phenom系と大きく変わらない(むしろ2段にならない分高速化された)と考えても良いかもしれない。一方分岐予測に関しては、Phenom系とほぼ同等の分岐予測機構が搭載されているようだ(Photo04)。

Photo02: この図で唯一謎なのがTable Walker。これに関しての説明がないのが残念である。

Photo03: ちょっと面白いのはFetch queueが最大32Bytes/Cycleで動作すること。ただ、これはI-Cacheのみで、D-Cacheの性能はずっと低く抑えられている。それにしてもこの512、誤植ではないのだろうか?

Photo04: 面白いのは最後の"Only nesssary structures are clocked"で、こちらもかなり厳密にClock Gatingの対象になっているようだ。

デコーダ段に関しては、x86命令を同時2命令デコード可能と説明されている(Photo05)。実行段は整数に関しては2つのIntegerユニットとLoad/Storeユニットが各1つづつ搭載される形で、このあたりの規模はP6コアに近いものと考えられる。一方FPUに関しては、2命令同時実行のパイプライン構成となっている(Photo07)。

Photo05: 9割近い命令はそのまま1つのmicroOpに変換されると説明されており、約10%が2命令、残りの1%程度がMicrocodeを使っての処理になる模様だ。"Scan up to 22 bytes"は、Prefixを無理やり増やしたりする特異なケースを除けば、概ねx86命令は11Bytes以下で表現できる事から来ていると思われる。

Photo06: とはいえ、P6の場合と異なりIntegerとLoad/Storeが別のSchedulerで管理されているあたりが独特である。

Photo07: SSEに関しては、構造からみて2つのパイプを同時に使う形で1命令を処理するという構造だと思われる。

D-Cacheについては、こちらも容量は32KBと半減しており、また従来が2way set associativityなのに対して8way set associativityになるなど、細かな違いが見られる。Line sizeは64Bytesのままで、こちらは差がない。ただこのD-Cacheに繋がるLdST Unit(Load/Store Unit)周りはずいぶん違いが見られる(Photo09)。基本的なコンセプトとして、K7~Phenom IIまではL2 Cacheまでがコアの一部とみなして扱われていたが、BobcatではL1のみがコアの一部で、512KBのL2キャッシュはもうコアの外部という扱いになっていることだ。従来だとL1 D-CacheやL1 I-CacheはそのままL2 Cacheに繋がり、その先にBU(Bus Unit)が繋がっていたのに、BobcatではBus Unitの先に512KB L2が繋がる形になり、この図でもハイライトされていないことでそれと判る。

Photo08: Phenom系の場合、L1 D-TLBが48entries(4KB/2MB)、L2 D-TLBが512 or 1024/128entriesなので、だいぶ減ったという感じだが、キャッシュ容量も減っているからこんなあたりで丁度バランスしているのだろう。

Photo09: またLoad/Store Unitの高性能化もずいぶん目に付く。このユニットではLoad/Storeが完全に独立して、しかもOut-of-orderで実行できるほか、Bypass tracking and dependency correctionといった項目も目に付く。先に述べた謎のTable Walkerだが、おそらくはこうした依存性の検出や解消(Hazard predictorもこの一部だ)の作業を行うためのものと思われる。こうしたユニットを新たに搭載したのがBobcatの特徴、という訳だ。

一般論として組み込み向けプロセッサでは、こうした構造は非常に一般的である。L2キャッシュは勿論性能改善に役立つが、その一方でダイサイズや消費電力にもインパクトがある。このため実際にはサイズを色々変えながらシミュレーションを行って調整を行い、SoCなどに採用するという形を取る。このためには、コアの中にL2が含まれているのは非常に都合が悪い。BobcatではL2を論理的にコアの外側に追い出すことで、将来の組み込み向けなどで簡単にL2のサイズを調整できるようにした、と考えてよいだろう。

またこれにより必然的に、K7~Phenom IIまでで採用してきたExclusive Cacheの方式を捨てることになった。これはこれで、特にキャッシュレイテンシを下げるという観点で効果的と見られる。

そのL2キャッシュだが、512KBで16way set associativity、64byte cache lineといった特徴はPhenom系と同じである(Photo10)。ただしここにもあるように、L2はCPUコアの半分の速度で動いていることが判る。BUもLoad/Store Unitの強化を受けて、Outstanding operationが可能な様に強化されている(Photo11)。このあたりの足回りの強化は、Bobcatの性能そのものに比べると、必要以上に豪華に見えなくも無い。ただ(これは後のベンチマーク結果などからも見て取れるのだが)Bobcatコアはオンキャッシュで大量の命令/データを抱え込んで性能を上げるというよりは、効率的にメモリからデータを取り込むことで、性能を必要以上に落とさないという、明らかな方針の転換を感じる。こうした方向転換においては当然メモリアクセス性能の効率化は必須であり、これに応じた強化がなされていると見れば良いだろう。

Photo10: この構造だと、将来的には(例えばIntelのCore Duoの様に)共有L2キャッシュを持つ、という構造もありだろう。このあたりは、どういうアプリケーション向けにコアを搭載するか、で変わってくる部分だ。もっとも一番の問題は、どこまでBobcatがSoCに入るか? (あるいはどこまでSoC向けのビジネスを展開するのか)であろうが。

Photo11: Eviction Bufferは単にL2からMemoryへのWritebackを行うための一時的なバッファで、別にL1とのExclusiveを確保するためのものではないと思われる。

パイプライン構造(Photo12)を見ると、整数演算のNormal Caseで13cycleだから、これも比較的常識的な範疇である。キャッシュからのロードがL1 Hitで3cycleなのに対しL2 Hitでは17cycleとなっているが、L2が半分の速度ということを考えれば、むしろ高速な部類と見ても良い様に思われる。

Photo12: Decodeの最後にPackが入っているあたりはK8系列のアーキテクチャからある程度影響を受けているように思われる。またFPのパイプラインは一見15cycleに見えるが、EXEが複数あるあたり、命令によってCycle数は異なってくるものと思われる。

さて、AMDは昨年9月にZacateのダイ写真を公開している。これに加えてAMDはダイ内部のレイアウトを公開した(Photo13)。ということで、実際のダイに当てはめてちょっとダイサイズを試算してみた。Photo14は今回評価に使ったZacateの1.8GHz品であるが、このパッケージは19mm角である。ここから推定して、CPU+GPU+周辺回路というダイ全体の大きさはおおよそ9.4mm×8.2mmの77.1平方mmという計算になる。次に、先のダイ写真を、これの上に重ねて貼り付けてみた(Photo15)。ここから、ZacateコアにおけるCPUの占める面積は2.1mm×7.8mmで16.4平方mmとなる。で、Zacateの場合はこれが2コアであるから、実際にはPhoto16の様なレイアウトになると考えられる。これにより、CPUコアあたりのダイサイズは2.1mm×3.9mmで8.2平方mm程度に収まることになる。ちなみにこれはL2キャッシュを含んでの数値で、L2キャッシュを含まない場合は2.1mm×2.3mmの4.8平方mm程度に収まる計算だ。

Photo13: 32KBのL1 I/D-Cacheの面積が結構大きく見える、ということからも全体の小ささが判断できる。

Photo14: これは今回評価用に借用したMSIのE-350に搭載されていたもの。

Photo15: AMDが公開したレイアウト図を、歪を直して重ねてみたもの。左端がCPU、中央がGPUとNorthbridge、右端がメモリコントローラと思われる。

Photo16: 更にCPUのレイアウト図を重ねてみた。

この4.8平方mm、という数字は恐ろしく小さい。同じ40nm(ただしTSMCの40G)プロセスを使ってARMのCortex-A9を製造した場合のターゲット値がこちらに示されているが、Hard MacroでPerformance Optimizationを掛けた場合は(L1キャッシュ込みで)6.7平方mmになるとされており、Bobcatの4.8平方mmは十分競合できるレベルになっていることが判る。