後藤弘茂のWeekly海外ニュース
AMDの完成形APU「Kaveri」のアーキテクチャ
(2014/1/14 22:01)
AMDのAPUのあるべき姿がKaveri
AMDが、遂に“真の”APU(Accelerated Processing Unit)「Kaveri(カヴェリ)」を発表した。真とつけたのは、KaveriがAMDが構想するAPUの完成形の第一歩だからだ。Kaveriは、GPUコアにGPUコンピュートに最適化した「GCN(Graphics Core Next)」を搭載し、CPUとGPUを統合するプログラミングフレームワーク「HSA(Heterogeneous System Architecture)」に対応する。本来APUが目指していた機能を初めて備えたのがKaveriだ。
AMDのメインストリームAPUは、2011年の初代の「Llano(ラノ)」、2012年の第2世代の「Trinity(トリニティ)」とTrinityを改良した2013年の「Richland(リッチランド)」を経て、技術的にはKaveriで3世代目となる。3世代かけて、当初の構想に沿ったアーキテクチャに到達した。また、CPUコアも新アーキテクチャの「Steamroller(スチームローラ)」になった。
KaveriのTDP(Thermal Design Power:熱設計消費電力)はノートPC向けの15Wからデスクトップ向けの95Wまで幅広い。デスクトップはOEMによってTDPを切り替えることができるコンフィギュラブルTDPで提供される。TDPポイントは45W/65W/95Wとされている。同じAPUを、95Wでも65Wでも使うことができる。今回のKaveriは、まずデスクトップ版が投入され、それからノートPCが投入される。
Kaveriはプロセス技術も従来の32nmから28nmに移行した。AMDのメインストリームAPUは、これまでGLOBALFOUNDRIESの32nm SOI(silicon-on-insulator)プロセスだった。しかし、Kaveriからは、同じGLOBALFOUNDRIESの28nmバルクプロセスとなる。32nm SOIから28nm バルクでは、プロセス技術上のパフォーマンスアップは望みにくいが、トランジスタ密度が高まるため、より多くのユニットを搭載できる。それを利用して、Kaveriは従来のTrinity/Richlandよりトランジスタを8割増やしてGPUコアを大幅に強化した。
また、28nmプロセスも、GLOBALFOUNDRIESと協力して開発したAPU向けのSHPを使っている。SHPはいったんGLOBALFOUNDRIESのロードマップから消えていたプロセスで、AMDはCPU向けのハイパフォーマンストランジスタと、GPU向けの密度の高い配線の両方を備えたプロセスとして開発してもらったという。Kaveriが最初の28nm SHPプロセスの製品となる。
デスクトップでは3 SKUで投入されるKaveri
AMDはKaveriを3 SKU(Stock Keeping Unit=アイテム)で投入する。すでに上位の2SKUは発売されているが、ブランドはA10とA8にまたがる。型番は7000番台となる。いずれもクアッドCPUコア(2 CPUモジュール)の構成だ。
ハイエンドの「A10-7850K」は4 CPUコアと8 GPU CU(Compute Unit)=512 FMAD(浮動小数点積和演算ユニット)の構成となる。最高クロックはCPUがMax Turbo時4GHz/デフォルト時3.7GHz。GPUクロックは720MHzだ。ちなみに、AMDは今回のKaveriから、CPUコアとGPUのCUをどちらもコンピュートコア(Compute Core)と呼び、同列であるという印象を強調している。A10-7850Kの場合にはコンピュートコアが12の構成となる。実際には、呼び方を変えただけで、内容的には従来と違いが無い。
「A10-7700」はGPUコアを6 GPU CU=384 FMADに抑えたバージョンだ。KaveriはGPUのCUを物理的に8個搭載しているため、CU上に欠陥がある場合にも製品歩留まりを上げるという意味も持つ。CUのどれかに欠陥があっても、そのCUを無効にすればA10-7700として出荷できる。CPUコアはMax Turbo時3.8GHz/デフォルト3.4GHzで、GPUコアは同じく720MHzだ。A10の2SKUは95Wをターゲットにしており、65Wも可能だが、45Wに持って行くことはあまり想定されていない。
下位の「A8-7600」は65W/45WをターゲットにしたSKU。実態は低TDPのスクリーニング品だ。現在はまだ発売されておらず、第1四半期中の発売予定だ。GPUコアは6 GPU CU=384 FMADで、65W時のCPU周波数は3.8GHz/3.3GHz、45W時は3.3/3.1GHzだ。AMDはこの3 SKUで、IntelのCore i5/i3のメインストリームSKUにぶつける。
AMDはKaveriでは前世代のRichlandに対して、特に低TDP時にパフォーマンスのアップリフトが大きいため、スモールフォームファクタで有利になると説明している。特に、3DMarkの上げ幅が大きく、そのためKaveriではゲームを強調している。また、プラットフォーム的にはSocket FM2+マザーボードベースで、今回はジャンプはない。
新しいバスが設けられたAPUアーキテクチャ
Kaveriの全体アーキテクチャは下のようになっている。2チャネル(128-bit)のDRAMコントローラをCPUコアとGPUコアが共有する。I/Oコントローラを内蔵し、I/OコントローラにPCI Expressなどが接続されている。DRAMコントローラは、DDR3サポートで、JEDEC(半導体の標準化団体)メモリ規格では最高の2,133Mtpsまでサポート。独自規格ではオーバークロックの2,400Mtpsなどにも対応する。PCI Expressは、16レーン分がGen3対応となっている。
Kaveriの構成は、従来のAPUとそれほど大きくは変わらない。ただし、1点大きな違いがある。それは、GPUコアからのメモリアクセスバスだ。従来のAPUでは、GPUコアとDRAMコントローラは2系統のバスで結ばれていた。片方は「Radeon Memory Bus(Garlic:ガーリック)」で、これはGPUコアからメモリコントローラへの広帯域のアクセスを実現する。Garlicは、GPUコアがメモリコントローラに広帯域に直結するディスクリートGPUに近いアクセスのためのバスだ。2つ目のバスは「Fusion Compute Link (Onion:オニオン)」で、ディスクリートGPUがI/Oコントローラ経由でCPUと接続されていたバスをオンダイに実装したようなバスだ。Onionバスは、GPUコアからCPUキャッシュへのスヌープができるコヒーレントバスになっていた。
Kaveriではこの構造が大きく変わり、新たにGPUコアとCPUコアの間の「コヒーレントバス(Coherent Bus/Onion+)」が設けられた。PlayStation 4(PS4)に実装されているOnion+バスと同じ機能と見られる。最大の特徴は、GPUのL2キャッシュをバイパスすることだ。これは、CPUコア側がGPUキャッシュをスヌープできないI/Oコヒーレンシで接続されたGPUが、効率的にCPUコアとのコヒーレンシを保つための仕組みだ。この仕組みについては後述する。
このほか、Kaveriにはオーディオプロセッサ「TrueAudio」も統合されている。TrueAudioはRadeon R9 290シリーズなどに搭載された機能で、TensilicaのオーディオDSPを使っている。TrueAudioを使うと、サラウンドサウンドやエフェクトを多用したオーディオを、低いCPU負荷で簡単に利用できるようになる。また、動画コーデックハードウェアも拡張され、デコーダは「UNIFIED VIDEO DECODER 4(UVD4)」に、エンコーダは「VIDEO CODING ENGINE 2(VCE2)」になった。
シングルスレッド性能を高めたSteamroller CPU
Kaveriでは、CPUコアはシングルスレッドのIPC(Instruction-per-Clock)が強化された「Steamroller」となった。AMDのBulldozer系CPUコアは、これまで、Intel CPUと比べてシングルスレッドの性能が低いことが弱点だった。これは、AMDがCPUのシングルスレッド性能より、CPUやGPUのスループット/ダイエリアを重視する設計に切り替えたためだった。
AMDは、Bulldozer開発に当たってダイエリアを増やさずにスループットを増やすことを焦点に設計した。そのため、AMDはBulldozerでは、2個のCPUコアを融合させた「モジュール」にして、一部の機能を2つのCPUコアで共有する設計を取った。“重い”部分を共有ユニットとすることで、CPUコアのエリア当たりのスループットを高める戦略だ。結果として、AMDはK10コアの2個分の面積に、2コアのBulldozerモジュールを収めることに成功した。同等のプロセスのIntelのCPUコアと比べると、1コア当たりは半分の面積の計算となる。
しかし、そのためにBulldozerアーキテクチャではシングルスレッド性能は犠牲となった。ボトルネックの1つはCPUのパイプラインの前半フロントエンド部だ。命令フェッチユニットと命令デコーダを、2個のCPUコアで共有していたため、Bulldozer系CPUでは、実行ユニットに供給できる命令数が制約され、シングルスレッド性能を落とす可能性があった。
そこで、Steamrollerでは命令デコーダの数を2個に増やして、2個のCPUコアそれぞれに命令デコーダを配置した。2コアで共有するのは浮動小数点演算ユニットやL1命令キャッシュ、命令フェッチなどになった。
また、SteamrollerではL1命令キャッシュも拡張され、その結果、L1命令ミスが30%減るという。分岐予測も強化され、スレッド当たりの内部命令発行幅も25%広がる。
また、整数ユニットでは、物理レジスタ数も強化、命令スケジューリングの効率も5~10%改良したという。さらに、L1データキャッシュのハンドリングも改良。また、フロントエンドではループに最適化した改良、L2は動的なキャッシュサイズの変更などが加えられた。その一方で、浮動小数点演算ユニットは、リソースの簡素化が図られた。
2012年8月のHot Chips時には、結果として、オーバーオールでサイクル当たりの内部命令OPsの発行は30%増やすことができるとしていた。今回の発表では、少し大人しく、最高で20%のIPC向上、平均では10%の向上としている。
IPCの向上によって、Kaveriでは、従来のRichlandより10%程度、CPUの動作周波数を落としても、同等のCPU性能を達成できるようになった。よりCPUの電力効率が上がったわけで、AMDはその分の電力(熱)枠をGPU側に振り分けることが可能になった。CPUの電力効率の向上が、GPUコアの比率の高いKaveriのチップ全体のパフォーマンスを引き上げている。また、このことは将来、20nm/14nmプロセスへと移行した時に、AMDがCPUコアのパフォーマンスをさらに引き上げる余地ができたことも示している。
GCNアーキテクチャに移行したKaveriのGPU
Kaveriの最大の魅力は、実際にはCPUコア側ではなく、GPUコアの方だ。AMDのAPUは、これまで、ディスクリートGPUより古いアーキテクチャのGPUコアを搭載していた。前世代のRichland/Trinityは、古いVLIW(Very Long Instruction Word)4アーキテクチャのGPUコアで、より柔軟なプロセッサ構造へと変革されたGCN(Graphics Core Next)アーキテクチャのディスクリートGPUとの差が開いていた。しかし、KaveriからはGPUコアはGCNとなり、最新のグラフィックス技術をフルに活かせるようになった。また、AMDアーキテクチャベースの新世代ゲーム機「PlayStation 4(PS4)」「Xbox One」との技術上の親和性も非常に高い。
GCNでは、GPUは「コンピュートユニット(Compute Unit:CU)」または今回からコンピュートコアと呼ばれるようになったプロセッサクラスタを基本単位として構成されている。CUは、演算ユニット、ロード/ストア&テクスチャユニット、キャッシュ&ローカルスクラッチパッドメモリ、命令ユニットを備えた、フルのプロセッサだ。
CUは16レーンのベクターユニットを4個備え、命令ユニットから複数のスレッドの命令を同時に発行する。旧来のAMD GPUでは中央にあった命令ユニットは、GCNのCU(Compute Unit)では、CUに備えられている。AMD GPUでは、Wavefrontと呼ぶ64スレッドのバッチ単位で処理を行なう。つまり、物理的ユニットなベクター長は16レーンだが、論理的なベクター長は64レーン分となる。命令ユニットの、命令バッファとプログラムカウンタは、64スレッドの束であるWavefront単位で制御する。4個のベクター演算ユニットは、並列に走る4個のWavefrontがそれぞれ占有するが、他のユニットは共有する。
GCNの最大の利点は、4-wayのベクター演算が多いグラフィックス以外の処理も高速なことだ。GCNではStructure of Arrays(SOA)型で、16レーンの広いベクターユニットで、4サイクルで64個のデータを処理する。同じ命令を64スレッドに対して実行する。コントロールフローの制御は、マスクレジスタを使ったプレディケーションで行なう。そのため、各スレッドは、あたかもシングルスレッドのプログラムのように振る舞う。このアーキテクチャのために、GCNでは、ベクターにパック化されていない処理も高速になる。また、GCNではメモリ階層も改良され、ライタブルなキャッシュを備えるようになった。
KaveriのGCN GPUコアは、アーキテクチャ的には最新のAMD Radeon R9 290(Hawaii)相当だ。HSA対応のKaveriでは、プログラムカウンタが拡張されている。
コンピュートタスクに最適化したKaveriのGPUコア
GPUコア全体の構成は、最大8個のコンピュートユニット(CU)となっており、浮動小数点積和演算(FMAD)ユニット数(以前はコアまたはストリームプロセッサと呼んでいた)は最大512個。GPUコアの動作クロックは720MHzで、GPUコアの演算パフォーマンスは737GFLOPSに達する。CPUと合わせると856GFLOPSとなる。FMAD専用ユニットの数は、Llanoの320からTrinityの384、そして今回のKaveriの512と着実に増えている。Radeon R7クラスのグラフィックス性能で、プロセッサ数はXbox Oneの3分の2と最新のゲーム機に迫る。
ジオメトリパイプラインとラスタライザはそれぞれ1ユニットと最小構成となっている。ROP(Rendering Output Pipeline)ユニットは4バンドルだ。DRAMインターフェイスは64-bit×2系列なので、ROPもそれに対応して2分割されていると見られる。
KaveriのGPUコアで目立つのは、GPU上でのコンピュートタスクへの最適化だ。コンピュートタスクを実行しやすいGCNに切り替えただけでなく、コンピュートタスクのハンドリング機能を大幅に強化している。GCNアーキテクチャでは、コンピュートタスクは「ACE(Asynchronous Compute Engine)」と呼ばれるユニットでハンドリングされる。
ACEは、GPUコアの演算ユニット群に対して、汎用コンピュートタスクを発行するユニットだ。Kaveriでは、8ユニットの演算クラスタ「CU(Compute Unit)」に対して8 ACE。CUに対して1対1でACEが配置されており、非常にコンピュートタスクの制御が重視されている。各ACEは、それぞれ8個のタスクキューを備えており、最大64タスクをキューできる。
キューに格納されたタスクは原則的にはスタックの順番に演算コアにディスパッチされ実行される。タスクにはプライオリティレベルも設定されており、ACEはそれに応じてディスパッチもできる。また、ACEはタスク側の依存性のタグを見て、依存性のチェックを行なうこともできる。ACEはディスパッチしたタスクの完了も行なう。そのため、タスク間に依存性がある場合は、前のタスクが終了するまでは、次のタスクは発行されない。
ACEとコンピュートタスクキューが多いことは、より細かな粒度のコンピュートをハンドルできることを意味している。コンピュートタスクは、グラフィックスと比べると粒度が小さいタスクが発生する可能性が高い。ACEが十分な数ないと、タスクのディスパッチが間に合わず、汎用コンピューティングで性能を発揮できない可能性がある。ACEの数が多ければ、より多くのタスクをハンドルできる。
ACEの数が必要なのは、1個のACEがハンドルできるタスクに制限があるからだ。そのため、多種の異なるタスクを流そうとすると多数のACEが必要となる。ちなみに、PS4とAMD Radeon R9 290(Hawaii)もKaveri同様に8個のACEを搭載している。
KaveriのGPUコアは、AMDの新しいグラフィックスAPI「Mantle」にも対応している。正確に言えば、MantleはGCNでサポートされるため、KaveriもMantle対応となる。Mantleはゲーム機のAPIのように、ハードウェアをより直接操作できるAPIだ。ゲーム機API以上に薄く、ほとんど裸に近いAPIとなっている。DirectXと比べると、APIのオーバーヘッドが小さいため、同じGPUハードウェアでもMantleを使えばより高速にグラフィックスを走らせられる。AMDはMantle版のBattlefield 4なら、APU上でDirectX版より45%速いパフォーマンスを発揮するとしている。
HSAのメモリ共有機能に対応したメモリコヒーレンシ
Kaveriのアーキテクチャ上の最も重要な拡張はHSA(Heterogeneous System Architecture)への対応だ。AMDのHSAにはさまざまな段階があるが、今回サポートされたメモリモデル「hUMA(heterogeneous Uniform Memory Access:ヒューマ)」とキューイングモデル「hQ(Heterogeneous Queue)」は、中でも最重要の機能だ。なぜなら、この2つの機能によって、GPUで走るグラフィックス以外のプログラムを書くことが飛躍的に簡単になるからだ。
特に、CPUとGPUが同じメモリを使えるようにするhUMAの重要性は高い。これまでは、GPUで処理を行なおうとすると、通常は、CPUのメモリ上にあるデータをGPUのメモリにいったん送らなければならなかった。APUのように同じメモリを共有していても、これまでは、CPUの扱うバーチャルメモリ空間と、GPUのバーチャルメモリ空間は分かれており、簡単にはアクセスできなかった。
しかし、hUMAではCPUとGPUが同じバーチャルメモリアドレス空間に直接アクセスできるようになる。CPUからGPUへデータを明示的に送る必要がなくなり、データをGPUが扱えるようにするには、CPUは共有するバーチャルメモリ上のポインタをGPUに送るだけで済む。
hUMAでは、この共有バーチャルメモリをハードウェア制御で行なうことを求めており、ソフトウェアだけの制御の場合と異なり共有バーチャルメモリにアクセスした場合のパフォーマンスロスがない。そのため、GPUで動作するアプリケーションのプログラミングは飛躍的に簡単になり、GPUプログラミングを難しいと感じていた開発者が、手軽にGPU向けのプログラムを書くことができるようになるとAMDでは期待している。メモリモデルはプログラミングに与える影響が大きいため、KaveriでのhUMAの導入は、HSAの大きな山場となる。
hUMAでの重要なポイントは下の3点。
- CPUとGPUのユニファイドアドレス空間
- CPUのポインタを使ったGPUのページャブルシステムメモリへのアクセス
- CPUとGPU間でのフルコヒーレントメモリ
これを実現するため、AMDはKaveriに新しいバスを追加した。GPU側からCPU側のフィジカルメモリアドレスに、メモリコヒーレントを保ちながらアクセスできる「コヒーレントバス(Coherent Bus)」だ。この新バスの機能については、次の記事で説明したい。
新世代ゲーム機との親和性が高いKaveri
ベールが剥がれたKaveriは、技術的には非常に革新的なAPUだ。AMDは、このAPUを前世代のTrinity/Richlandと同レベルのダイサイズで実現した。ダイサイズは245平方mmで、AMDの現在のメインストリームチップサイズに収まっている。ただし、ダイ面積の中でGPUコアが占める割合はさらに増えた。また、物理設計的にも、従来より密度の高い設計となっており、コア以外の部分の比率が低い。
アーキテクチャ的にはKaveriは、今世代のゲーム機と非常に親和性が高い。特に、PS4とは兄弟のように似ている。Xbox Oneアーキテクチャともそれほど隔たっているわけではない。これは、技術的にゲームの最適化の方向も似てくることを意味している。AMDが今回のKaveriでは、Mantleとともにゲームへの最適化を強調する背景には、こうした技術的な要因もある。