後藤弘茂のWeekly海外ニュース
GTCの目玉の1つ「Tegra 4/4i」のCPUアーキテクチャ
(2013/3/19 00:00)
NVIDIAはKraitに対してのTegra 4のCortex-A15の利点を強調
NVIDIAは、同社の技術カンファレンス「GPU Technology Conference(GTC)」を、3月18日~21日(現地時間)に米サンノゼで開催している。今回のGTCは、HPC(High Performance Computing)向けGPUコンピューティングだけでなく、モバイルやゲームも含めた総合的なカンファレンスとなっている。Tegra 4などについても、より突っ込んだ情報が出てくる見込みだ。
NVIDIAは現在、Tegra 4に搭載しているARMの最新のハイエンドCPUコア「Cortex-A15」の詳しい情報も明らかにしている。Cortex-A15は、今年(2013年)のモバイルCPUの主役となる。NVIDIAによって、ARM自身も発表していなかったCortex-A15の一部詳細が明らかになり始めている。
NVIDIAはインプリメンテーションライセンスでARMコアを実装している。つまり、ARMからのRTL(Register Transfer Level)ソフトマクロの提供を受けて、RTLのオプションの範囲でARMコアをカスタマイズしてTegraに載せている。Cortex-A15では、ARMのプロセス最適化パッケージである「POP(Processor Optimized Packages)」は使わず、物理設計はNVIDIAで行なった。
NVIDIAがTegra 4/4i世代で、最大のライバルと見ているのはQualcomm。NVIDIAが欲しがっているスマートフォン市場を握っている、同じAndroid OSの土俵の上の敵だ。そのため、NVIDIAはホワイトペーパー等でも、Qualcommの独自のCPUコア「Krait(クレイト)」と比較して、Tegra 4のCortex-A15の強味がどこにあるのかを強調している。
NVIDIAがCortex-A15のパフォーマンスのポイントとして挙げるのは、広いアウトオブオーダウインドウ、強化されたハードウェアプリフェッチャ、アルゴリズムを変更した分岐予測、大きなループバッファ、共有L2キャッシュなど。それによって、命令レベルの並列性(ILP:Instruction-Level Parallelism)とメモリレベルの並列性(MLP:Memory Level Parallelism)が高まり、電力を削減し、リアルアプリケーションでの性能を上げることが可能になるとNVIDIAは説明する。
実行パイプラインが8本に増えたCortex-A15
Cortex-A9以降のARM CPUコアでは、ARMアーキテクチャの各種命令を内部命令「マイクロオペレーション(micro-op)」に変換して実行する。ARMでは、多くの命令は1対1でCPU命令からmicro-opに変換されるが、一部の命令はCISC(Complex Instruction Set Computer)的な複合命令であるため複数のmicro-opに変換される。Cortex-A15は、micro-opの命令順序を入れ替えて実行するアウトオブオーダ(Out-of-Order)実行を取る。
Cortex-A15の場合は、CPU命令を3命令ずつフェッチ&デコードする。デコードして変換したmicro-opは、ディスパッチステージに送られる。ディスパッチャは8ポートの命令発行ポートを持ち、最大で8 micro-opを発行できる。8ポートは、2つの整数演算ALU(Arithmetic Logic Unit)、分岐、乗算Multiplyと除算Divideクラスタ、2つのSIMD(Single Instruction, Multiple Data)/浮動小数点演算クラスタ、2つのロード/ストアパイプとなっている。
前世代のCortex-A9は、2命令デコードで、実行ユニットは5ユニット、命令発行ポートは4ポートだった。比べると、Cortex-A15の方が並列度の高いフロントエンドと実行パイプを持っていることがわかる。問題は、Cortex-A15のこの広い実行パイプラインを、高い稼働率で回せるかどうか。ARMはそのために、Cortex-A15ではアウトオブオーダ機構を拡充したという。
相対的に大きめのアウトオブオーダウインドウ
具体的には、Cortex-A15のアウトオブオーダウインドウを128 micro-opと相対的に広い設計とした。CPUメーカーの中でアウトオブオーダウインドウが広いIntelのCPUと対比すると、Nehalem(ネハーレン)と同等の数となる。ウインドウはかなり広い。ちなみに、ARMがCortex-A15の概要を発表した2010年9月の「Linley Tech Processor Conference」では、ARMはアウトオブオーダウインドウのサイズを60 micro-op分と説明していた。この時の説明が正しければ、実際にRTLを出すまでにウインドウを広げたことになる。また、ARMの次の64-bitコア「Cortex-A57」でも128 micro-opウインドウは引き継がれる。
対して、QualcommのKraitは、Cortex-A15と同様の3命令デコードの広いアウトオブオーダマシンだが、アウトオブオーダウインドウ自体は40 micro-opと狭いとNVIDIAは指摘する。アウトオブオーダウインドウが狭いと、ILPを制限するだけでなく、MLPに与える影響が大きいと同社は説明する。
データロードはレイテンシがあるため、そのままの命令順序で実行して行くインオーダ(In-Order)実行の場合は、ロード命令がL1キャッシュをミスした場合、ロード待ちでCPUコアがストールする。そのため、アウトオブオーダマシンでは、ストールを避けるためにロード命令を繰り上げて実行する。アウトオブオーダウインドウが広くなると、より多くのロード命令を見つけて先取り実行できるチャンスが広がることになる。
ただし、Cortex-A15は、IntelやAMDのCPUが採用しているメモリ上のデータ依存関係の曖昧さ(ambiguity)を解決する「Memory Disambiguation(メモリディスアンビギュエイション)」は採用していない。ロード/ストア命令には、プログラム順序で先行するロード/ストア命令との依存関係がメモリアドレスが解決するまでわからないものがある。その場合、ロード/ストア命令を先行するロード/ストア命令をバイパスして前に出すことができない。この問題に対して、IntelやAMDは、動的に依存関係を判定するメカニズムを備えることで、ロードをストアの前に投機的に実行することを可能にしている。下のスライドはAMDのBarcelona(バルセロナ)のものだ。
しかし、Cortex-A15アーキテクチャでは、メモリディスアンビギュエイションは機構自体が電力を食う上に、投機的なメモリアクセスで電力を消費する可能性があるため、採用していないという。効率とパフォーマンスと電力のトレードオフで、複雑化を避けた。
Cortex-A15の効率を上げるプリフェッチャと新しい分岐予測
その代わり、Cortex-A15ではデータを自動的に先取りするプリフェッチ機構を強化することでメモリレベルの並列性(MLP)を高めていると言う。次の命令が必要とするデータを、メモリアクセスパターンから予測して先読みする。Cortex-A15が実装しているのは、連続してはいないが一定の法則で並ぶデータもプリフェッチできるストライドベース(Stride-Based)プリフェッチャだ。
Cortex-A15では、各CPUコアにつき1つのハードウェアプリフェッチャをL2コントローラの内部に備える。複数のプリフェッチを管理できる上に、プリフェッチミスが発生した場合はプリフェッチを停止することもできる。これは、無駄なプリフェッチで、無意味な電力消費が発生することを避けるためだ。また、プリフェッチには、アドレスビットだけでなくPC(Program Counter)も使う。
これまでのARMアーキテクチャでは、L1キャッシュ量は顧客に実装のオプションがあり、キャッシュ量を変えることができる場合が多かった。例えば、Cortex-A9では16KB、32KB、64KBの選択肢がある。しかし、Cortex-A15では、L1キャッシュの量は命令とデータとも32KBで固定になっている。PC&サーバーCPUでは、L1アクセスレイテンシを固定するため、L1量は固定になっていることが多いが、Cortex-A15も同様となっている。
NVIDIAでは、L1からのロードのロジックが高速化されたために、小容量のL1キャッシュオプションが必要なくなり、32KB固定にできたと説明する。ちなみに、NVIDIAはここでもQualcommのKraitアーキテクチャを引き合いに出しており、KraitではL1が16KBに制限されているため、パフォーマンス上でCortex-A15が有利だと説明している。
Cortex-A15では、分岐予測(Branch Prediction)機構も一新した。分岐予測ミスは、無駄な電力消費を増やしてしまうため、予測精度を上げることは重要だ。Cortex-A15では、分岐予測に新たにBi-Mode(バイモード)プレディクタを採用した。条件分岐では、多くのケースで、分岐成立(taken)か、分岐不成立(not taken)のどちらかに結果が偏る傾向がある。Bi-Modeプレディクタはそれを利用して、成立と不成立の2つのテーブルを分けて用意する。そして、選択テーブルを用意して、成立と不成立の予測を行ない、対応するテーブルで分岐を予測する。Bi-Modeは、CPUアーキテクチャカンファレンスMicro30に出された論文以降に使われている名称だ。
また、Cortex-A15では、間接分岐(Indirect Branch)のプレディクション機構も備えた。間接分岐はインタプリタで重要となるため、Webアプリケーションのパフォーマンスにかなりの影響を与える。プログラミングモデル側の変化に対応した、CPU側のアーキテクチャ拡張だ。
省電力化の効果が大きいループバッファ
Cortex-A15では、フロントエンドパイプラインで、ループをディテクトした場合、ループの命令をプールするループバッファを備えている。32エントリのバッファで、このバッファにヒットしたループを実行する場合は、省電力化を図ることができる。下はCortex-A15の動作時の電力消費を、ユニット別に分類したチャートだ。
ループバッファにヒットした場合、バッファから読み出した命令をディスパッチステージに送るだけですむ。そのため、上の図のうち、左上の分岐予測、右上の命令フェッチ(Instruction Fetch)、そして右の赤い命令デコード(Instruction Decode)の部分が動作する必要がなくなる。Cortex-A15では、ループバッファヒット時には、これらのユニットをクロックゲートしてしまう。それによって最大で40%の省電力化を図ることができる。
ループバッファ自体は、x86系CPUでも使われている。x86系はデコードが重いため、ループバッファの効用は大きい。現在は、ARMでもループバッファの効用が大きくなっていると見られる。パイプラインを見ても、Cortex-A15ではフロントエンドが非常に長くなっている。また、Cortex-A9でも非常に小さなバッファがループ用にあるが、本格的なサイズのループバッファはCortex-A15が初となる。ちなみに、ライバルのKraitは小容量のL0キャッシュで、ループバッファと同様の効果を得ている。
NVIDIAの省電力CPUコア技術4+1
モバイルSoC(System on a Chip)のパフォーマンスを引き上げるNVIDIA。つきまとうのは消費電力の問題だ。NVIDIAは、Tegra 4にはリーク電流(Leakage)の低いプロセス技術「CLN28HPL」を使うことで、トランジスタレベルから電力を抑える。また、CPUのパフォーマンスを上げることも、逆説的だが、電力を下げる効果がある。CPU性能を上げて、ジョブにかける時間を短縮することで、素早くアイドル状態に戻すことで電力を抑える。加えて、パワーセーバーコアを使った省電力化を図る。
NVIDIAはTegra 3/4/4iでは、4個のパフォーマンスCPUコアと1個のローパワーCPUコアを切り替える省電力技術を使っている。NVIDIAはこの技術を「Variable Symmetric Multiprocessing (VSMP)」または「4+1」と呼んでいる。負荷が一定以上のタスクではパフォーマンスCPUコア群を使い、負荷が低いタスクの時は省電力コアを使う。
Tegra 4では、高パフォーマンス設計のCortex-A15が4コアとローパワー設計のCortex-A15が1コアの組み合わせとなっている。マイクロアーキテクチャは同じCortex-A15だが、物理設計が異なり、ローパワーコアの使用時は電力が10分の1になるとNVIDIAは説明する。
Tegra 4では、この4+1設計の基本はTegra 3と同じだが、構造が若干異なっている。まず、メインの4個のパフォーマンスクアッドコアは2MBのL2キャッシュを共有する。ローパワーコアは個別に512KBのL2を備える。キャッシュも、それぞれスピードと電力に最適化したメモリセルを使っている。両コア群の間でキャッシュの共有はない。
ARMのbig.LITTLEでも、Cortex-A15とCortex-A7を切り替える。big.LITTLEではコアの遷移の際に、CPUのアーキテクチャルコンテクストはSoC内部で移行させる。それに対して、NVIDIAの4+1では、Tegra 4の世代でも、コンテクストはいったんメモリに書き込んで遷移する。また、big.LITTLEではキャッシュのフラッシュとウォームアップの間、Cortex-A15とCortex-A7の間でキャッシュのスヌープを可能にする。しかし、NVIDIAの4+1では、キャッシュの同期は行なわない。
NVIDIAの方が原始的に見えるが、これには構造を簡素化することで、電力をセーブできる利点があるという。より複雑な構造で、より高度な省電力を行なうか、より簡素な構造でハードウェア自体の電力を下げるか、という選択だ。
また、Tegra 4のCortex-A15では、使わないコアはパワーゲートされる。Cortex-A15コアのパワーゲーティングは、ARMのRTLの標準オプションだという。
Tegra 4のDVFS省電力機構
NVIDIAのTegra 4でも、負荷に応じてCPUコアの電圧と動作周波数を切り替える「DVFS(Dynamic Voltage and Frequency Scaling)」を行なっている。しかし、Tegra系では、各CPUコアは同期した動作周波数で動作する。この点は、各コアを非同期でそれぞれ個別の動作周波数に切り替える多くのx86系CPUとは異なっている。
また、NVIDIAがライバルと目するQualcommのKraitも、各コアを非同期に動作させる。Kraitの場合は、各コア毎に異なるクロックと電圧で動作させることが可能だ。Qualcommは、この非同期動作を、Kraitアーキテクチャの最大の利点の1つだとしている。下はQualcommのスライドだ。
それに対して、NVIDIAは、Kraitの実装には弱点があると指摘している。NVIDIAの実装では、4個のCortex-A15コアは大きなL2キャッシュを、相対的に簡易な設計で共有できる。それは、異なる周波数や電圧で動作する回路同士の同期ハードウェアを持つ必要がないためだ。そのため、Kraitは各CPUコアがそれぞれ512KBのL2キャッシュを備える設計となっているというのがNVIDIAの指摘だ。パフォーマンスロスがあるだけでなく、同期ハードウェアによって電力も食うとしている。
NVIDIAの考え方は、コアは同期にしてハードウェア設計を簡素にし、その代わり、コア単位のパワーゲーティングによって使っていないコアをどんどんオフにするというものだ。もっとも、実際には、NVIDIAの側の制約は、ARMの提供するソフトマクロの制約から来ている。今後、NVIDIAがARMのアーキテクチャルライセンスで、ARMコアをカスタマイズしたり、独自のARMアーキテクチャコアを開発し始めると、状況は変わって行く可能性がある。
Tegra 4iのCortex-A9 R4の実像
NVIDIAはTegra 4ファミリでは、低価格版のTegra 4iに、Cortex-A9を採用した。しかし、Tegra 4iのCortex-A9は、従来のバージョンではなく、ARMの提供する新バージョンのCortex-A9 R4へと切り替わっている。Cortex-A9 R4は、一言で表せば、Cortex-A15の技術のごく一部をフィードバックした改良版Cortex-A9だ。
Cortex-A9 R4では、設計を大きく変える必要のない部分で、アーキテクチャの拡張が図られている。まず、メモリアドレスの変換キャッシュであるTLB(Translation Lookaside Buffer)のエントリは、Cortex-A9r3までの128エントリから、Cortex-A15と同等の512エントリへと一気に拡張された。
また、分岐予測ではヒストリバッファのサイズなどを、これもCortex-A15と同等に引き上げた。ただし、Cortex-A15で採用した新たな分岐予測メカニズムは実装されていない。
プリフェチングもCortex-A9 R4の強化の1つで、新たに専用バッファを備えたL1プリフェッチャが設けられた。また、L1データキャッシュからのロードメカニズムもCortex-A15同等になったという。ただし、Cortex-A9 R4のロード/ストアは1ユニットのままで、命令発行ポートはFPUと共有されている。
全体的に見るとCortex-A9 R4の拡張は、それほど抜本的なものではない。しかし、効率的にパフォーマンスボトルネックになりそうな部分を拡張している。コアサイズは28nm HPMプロセスで1.15平方mmと極めて小さく、Cortex-A15の半分以下だ。効率は高い。
NVIDIAのCPUの次のステップは64-bit対応
Tegraの次のステップはCPUコアの64-bit化と、GPUコアのCUDA対応だ。CPUコアについては、すでにARMが64-bitのCortex-A57のRTLをライセンシに提供している。Cortex-A57のブロック図は以下の通りだ。Cortex-A57には、64-bit化するARMv8命令セットに対応しているという、Cortex-A15との決定的な違いがあり、命令デコーダや整数演算ユニットなど多くのユニットが変更されている。にもかかわらず、Cortex-A15とCortex-A57の基本のブロックはよく似ている。
このことは、ソフトウェア面を除けば、比較的容易にCortex-A57への移行が可能であることを示している。ダイエリアの増加も、最小限に留められると見られるからだ。おそらく、今年後半から、モバイルデバイスでも、64-bitアーキテクチャへの移行が見え始める。iOSもAndroidも、すでに64-bitへの移行の準備を進めているはずで、CPU側の対応と同期してソフトウェア層の64-bit移行も行なわれると見られる。逆を言えば、NVIDIAも64-bit化に乗り遅れるわけには行かない。
また、CPUコアの64-bit化は、NVIDIAのよりハイパフォーマンスなSoC(System on a Chip)計画である「Project DENVER」にも深く絡む。PC向けGPUにARM CPUコアを載せたProject DENVERは、本来ならもう出ているはずが、遅れている。NVIDIAのJen-Hsun Huang(ジェンセン・フアン)氏(Co-founder, President and CEO)は、1月のCESの際にその理由を次のように説明していた。
「Project DENVERが遅れているのは、DENVERが64-bit ARMを前提としているからだ。そして、64-bit ARMはわりと最近(2011年)に発表されたばかりで、それまではDENVERの実装に取りかかることができなかった。今は、(実装したCPU)アーキテクチャができあがっているので、我々は実装に入ることができている。
もし、我々がDENVERの実装を急ぎすぎていたら、DENVERはARMv8の64-bitアーキテクチャと非互換になってしまっただろう。それは望んでいない。我々が望んでいるのは、ARMのエコシステムの中で、それを拡張して行くことだ。今は、DENVERに必要なスペシフィケーションもアーキテクチャも全て揃っている。だから、DENVERをできる限り早く現実化しようと急いでいる」。
おそらく、次のタイミングで、TegraもDENVERも同期して64-bitへ向かうと予想される。今回のGTCでも、NVIDIAの64-bitへの取り組みが明らかになるかも知れない。