後藤弘茂のWeekly海外ニュース

Llanoの内部アーキテクチャの秘密



●見えてきたLlano(ラノ)の内部アーキテクチャ

 AMDはソフトウェアデベロッパのための技術カンファレンス「AMD Fusion Developer Summit(AFDS)」で、新APU(Accelerated Processing Unit)「AMD Aシリーズ」(Llano)のチップアーキテクチャの概要を明らかにした。AFDSは米ワシントン州ベルビューで6月13~16日に開催されたカンファレンスで、AMDはそこでLlanoの内部バスアーキテクチャや、CPUコアとGPUコアの間でのデータ交換を可能にするゼロコピーの概要などを公開した。Llanoでは、CPUコアとGPUコアは単に同じダイの載せられたけででなく、新しいバスアーキテクチャで結ばれている。

 AFDSでの技術セッションやAMD関係者の説明で見えてきたLlano全体の推測図は下の通り。ぱっと見てわかる通り、GPUコアは、特殊なバスアーキテクチャでユニファイドノースブリッジ(UNB)と接続されている。「Fusion Compute Link(Onion)」と「Radeon Memory Bus(Garlic)」の2系統のバスが並列しており、Garlicの方は2本分のバスが走っている。

Llanoのアーキテクチャ
PDF版はこちら

 より引いた見方をすれば、Llanoでは、GPUコアがCPUコアとハードウェア的には同格以上の扱いになっていることがわかる。従来の組み込みSoC(System on a Chip)では、CPUコア群は内部CPUバスに接続されているが、GPUコアは内部I/Oバスに接続されており、CPUコアやメモリコントローラとは距離があるのが一般的だ。Llanoの図で言えば、通常はGPUコアからI/Oコントローラへと伸びる左側のバスしか持っていない。

 しかし、AMD APUアーキテクチャでは、GPUコアはI/Oコントローラへのバスに加えて、メモリコントローラに直結するバスRadeon Memory Bus(Garlic)を備えている。このバスは、個々のCPUコアからメモリコントローラへのリンクよりも帯域が倍もある。加えてLlanoでは、CPUとのコヒーレンシを取るFusion Compute Link(Onion)バスも備えている。メモリアクセスのバスが2系統になっている。

 この仕組みは、GPUコアに広帯域のメモリアクセスを維持しつつ、CPUコアとGPUコアの間での部分的なデータ交換を可能とするためのものだ。GPU中心のバス構成と言ってもいい豪華さだ。もちろん、その目的は、5SIMDで400プロセッサと演算能力の高いGPUコア「Sumo」にデータをフィードすることにある。

Sumoの概要
PDF版はこちら

 また、この構造は、Llanoだけでなく、下位のAPU「AMD EシリーズAPU(Zacate/Ontario:ザカーテ/オンタリオ)」でも共通しているようだ。プログラミングの一貫性を維持するために、同世代のAPU間でアーキテクチャを統一していると見られる。そのため、Llanoの内部構成は、Zacate/Ontarioの内部構成から推測することが可能になった。Zacate/Ontarioの内部構成は、今年2月のISSCC(IEEE International Solid-State Circuits Conference)と、4月に日本で開催されたCOOL Chipsで明らかにされている。下がCOOL Chipsで明らかにされたZacate/Ontarioアーキテクチャの図だ。

Zacate/Ontarioのアーキテクチャ

●大きく異なるGarlicとOnionの2つのバス

 より詳しく見ると、GPUコアとUVD3ユニットなどGPUに付属するユニットは、グラフィックスメモリコントローラに接続されている。ここからバスが結ばれており、Radeon Memory Bus(Garlic)はユニファイドノースブリッジユニットの中のDRAMコントローラと直結している。この構造は、Zacate/Ontarioとも同じだが、Llanoでは1つ違いがある。

 LlanoのGarlicバスは2重になっており、それぞれが2チャネルのDRAMの片方のチャネルと結びついているという。GPUコアは2チャネルをフルに使うことができるため、Garlicバスを使ったアクセスは広帯域だ。ビデオメモリ領域へのアクセスの実効帯域は、最高でリードが17GB/sec、ライトが12GB/secとなる。

 GarlicバスのGPUコアからのピーク帯域は29.8GB/secで、メモリ帯域と一致している。しかし、通常、実効帯域はピーク帯域の70%以下に落ちるのが一般的なので、Garlicの帯域はフルに近い。ちなみに、LlanoのCPUコアは、単体ではメモリリード&ライトが8GB/secで、マルチコアアクセス時に13GB/secであるため、GPUコアの方がメモリ帯域では優遇されている。

 Garlicバスでのアクセスでは、CPUキャッシュのスヌープは一切行なわない。コヒーレンシを取るCPUバスとは接続していないのはそのためだ。アクセスするメモリ領域は、主に共有メモリ内のビデオメモリ領域だ。Garlicは、言ってみればディスクリートGPUのメモリバスに近いイメージのバスアーキテクチャだ。GarlicバスにRadeonという名前を冠した理由もわかる。

Llanoのダイレイアウト
PDF版はこちら

 それに対して、もう片方のFusion Compute Link(Onion)バスは、GPUコアをある程度CPUコア的に扱うためのバスだ。Onion経由のメモリアクセスでは、GPUコアが、これまでできなかった、CPUキャッシュへのスヌープが可能になる。アクセスするメモリ領域は、共有メモリ内のCPU側のシステムメモリ領域だ。CPUとのコヒーレントバスで、CPUとGPUの間でのデータ交換のために設置された。

 Fusion Compute Link(Onion)バスは、その機能上から、CPUバスに接続されていると推測される。AMDマルチコアCPUの内部バスでは、コア間のシステムリクエストを調整するキューがあり、それが外部リンクとのクロスバースイッチと接続している。Onionは、直接かどうかは不明だが、このコヒーレントキューに接続されているはずだ。

 LlanoのCPUコア群は、従来通りL2キャッシュを経由したキャッシャブルなメモリアクセスパスのほかに、ライトコンバイン(WC)バッファ経由の書き込みができる。WCバッファは64byteで、各コアに備えられている。WCバッファ自体は以前からAMDコアが備えていた機能だが、APUでのGPUコアとのデータ交換と密接に結びついているため、特に図に描き加えた。

 ちなみに、ライバルであるIntelのSandy Bridgeは、下の図のように単一のリングバスにCPUコアとそのキャッシュ、そしてGPUコアがそれぞれ同列に接続される構成となっている。

Sandy Bridgeのリングバス
PDF版はこちら

●細かく領域に分かれるLlanoの物理メモリ

 では、これらのGPUバスとCPUバスを使ったメモリアクセスはどうなるのか。これについてはAFDSで概要が説明された。下の図は、AFDSでの説明をベースに作成したLlanoのメモリ領域のチャートだ。

Llanoのメモリアクセス領域
PDF版はこちら

 Llanoでは、CPUコアとGPUコアが同じ物理メモリを共有しているが、依然としてCPUとGPUのメモリアドレススペースは完全に分かれている。ポインタで地続きに両メモリ領域にアクセスすることはできない。しかし、限定された形で、プログラム上で明示することで互いのメモリスペースにアクセスすることができる。

 まず、CPU側のシステムメモリには、GPUコア側からアクセスができる「USWC(Uncached Speculative Write Combine)」領域を設定できる。USWCはCPUでキャッシュされないメモリで、CPU側からも通常のアクセスができない。WCバッファを経由したアクセスとなる。

 また、キャッシュされたシステムメモリには、GPUコア側からFusion Compute Link(Onion)バス経由でアクセスするためのページを設定できる。ただし、GPUがアクセスするページは、CPUの通常のページオペレーションが行なわれないように固定する必要がある。また、GPUがアクセスできるようにできるメモリスペースも限られる。

 GPUコア側には、GPUのメモリシステムでアドレスされているローカルビデオメモリ領域がある。CPU側からはWCを経由することで、このGPUのローカルメモリにアクセスすることもできる。

●メモリ領域でメモリパフォーマンスに大きな違い

 制約は多いものの相互にアクセスができるCPUコアとGPUコア。しかし、同じ物理メモリにアクセスするにも関わらず、そのメモリパフォーマンスはメモリ領域によって大きな違いがある。下の図は、左がCPUコアから3メモリ領域へのアクセスの経路と帯域を示した図。右側が同じ図のGPU版だ。書き込んであるパフォーマンスはAMDの発表数値だが、これはシステムやドライバで変化する可能性がある。しかし、大枠では変わらないはずだ。

Llanoのメモリアクセス
PDF版はこちら

 まず、CPUが通常のシステムメモリにアクセスする場合は、キャッシュ階層を経由する。シングルCPUコアのアクセス帯域はリード&ライトともに8GB/secで、マルチコアでのアクセスは13GB/secとなる。ピーク帯域の半分程度だが、それでもそれなりの帯域が確保されている。

 USWCにWCバッファ経由でアクセスする場合、書き込みは通常のキャッシャブルシステムメモリに対するものと同じ8~13GB/sec。ところが、リードはガクっと落ちて1GB/sec以下となってしまう。同じWCバッファ経由で、GPU側のローカルビデオメモリ領域にアクセスする場合は、ライトが8GB/secでリードが1GB/sec以下と、これも読み出しが非常に遅い。

 GPUサイドを見ると、GPUが自分のビデオメモリ領域にアクセスする場合は、すでに書いたように、リードが17GB/secで、ライトが12GB/secと最大帯域となる。これはRadeon Memory Bus(Garlic)バスを使ったアクセスだ。

 同じRadeon Memory Bus(Garlic)バス経由でも、CPU側のUSWC(Uncached Speculative Write Combine)にアクセスする場合はリード&ライトとも6~12GB/sec。やや低速になる。そして、Fusion Compute Link(Onion)バスを使ってキャッシャブルメモリにアクセスする場合はリードが4.5GB/sec、ライトが5.5GB/secと、かなり遅くなる。

●FSAまでの中間解のLlanoメモリアーキテクチャ

 AMDは、今後のヘテロジニアスコンピューティングのためのプログラミングフレームワークである「FSA(Fusion System Architecture)」をAFDSで発表した。FSAでは、究極的にはCPUコアとGPUコアが同じバーチャルメモリ空間をコヒーレンシを取りながら共有することで、両コア間の自由なデータ交換を実現する。

AMDの次世代コアのメモリ空間
PDF版はこちら

 しかし、それを実現するのは、AMDが今年末にリリースを予定している次世代GPUコア「Graphics Core Next」がAPUに統合された時になる。この新コアでは、従来のAMD GPUとはメモリ階層もメモリアドレッシングも一新される。GPU内部のキャッシュもリード&ライトとなり、CPUとキャッシュコヒーレンシが維持されるようになる。

次世代GPUコアのコヒーレンシ
PDF版はこちら

 現在は、まだその道半ばで、Llanoでは現在のバス&メモリコントローラのアーキテクチャで部分的な共有を実現しようとトライしたように見える。Llanoでのメモリ共有は、制約があり、プログラムで明示しなければならない上に、パフォーマンスの大きな違いにも気を配らなければならない。使いやすいとは、とても言えないのが現状だ。Llanoのアプローチは、あくまでも、FSAへの道程の中間解に過ぎないようだ。

AMD CPUアーキテクチャの移行
PDF版はこちら

 最後に、以前のLlanoのGPUコア、Sumoのプロセッサコアの図に64-bit倍精度のオペレーションを書き込んであったが、Llanoのコアは単精度だけで倍精度をサポートしないことがAFDSで明らかになった。元になっているRadeon HD 5870(Cypress)系は、その前のRadeon HD 4800(RV770)世代から、アーキテクチャ的には倍精度をサポートしていた。なぜLlanoで倍精度をサポートしなかったのか理由はわからないが、これでHPC(High Performance Computing)市場へのLlanoの道はほぼ閉ざされたと言ってよさそうだ。

SumoのSIMDアレイ
PDF版はこちら