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

ARMの新32-bit CPU「Cortex-A12」のアーキテクチャ

ボリュームが出る市場向けのバランスの取れたCPUコア

 ARMが投入するミッドレンジ向けのCPUコアが「Cortex-A12」だ。現在、スマートフォンやタブレット向けのARMコアは、ハイエンドがCortex-A15、バリューがCortex-A7、中間のミッドレンジがCortex-A9だ。Cortex-A12は、Cortex-A9と同じミッドレンジで、スマートフォンやタブレットのCPUパフォーマンスを40%以上伸ばす。

Cortexのアーキテクチャ、位置付け、登場時期(PDF版はこちら)

 Cortex-A12は1クラスタに1~4 CPUコアを搭載できるマルチコアシステムとなっている。マルチコアクラスタのデバッグのために、同社のオンチップデバッグ&トレースインフラストラクチャである「CoreSight」が統合されている。

 Cortex-A12では、マルチコア間のコヒーレンシをコントロールする「SCU(Snoop Control Unit)」のキャッシュコヒーレンシプロトコルは「MOESI (Modified, Owned, Exclusive, Shared, Invalid)」に拡張された。Cortex-A9はMESIプロトコルで、これはMIPS MPアーキテクチャから引き継いだものだったという。また、ブロードキャストオペレーションも拡張したという。

 キャッシュはインクルーシブとエクスクルーシブの混合で、ほとんどはインクルーシブだが、部分的にエクスクルーシブであるため、スヌーピングでは他のCPUコアもスヌープする必要がある。スヌープフィルタリングも行なっている。ARMの場合は、スヌープフィルタリングはソケット間ではなく、オンチップのコア間の話だ。

Cotex-A9がミッドレンジの中心
Cortex-A12はミッドレンジに最適化
Cortex-A12の1~4 CPUのマルチコアクラスタ

 システムバスインターフェイスは「AMBA 4 AXI 128-bit」バスになった。Cortex-A9は「AMBA 3 AXI 64-bit」バスだがデュアルポート構成ができた。Cortex-A12では、ペリフェラルポートの追加でさらにトラフィックを増やすことができるという。AMBA 4 AXIはCortex-A15/A7と互換であるため、big.LITTLEシステム構成を取ることができる。

パイプラインは整数演算で11ステージ

パイプラインステージは最短11、2-wayスーパースカラ、完全アウトオブオーダ

 パイプラインは整数演算の最短で11ステージ。これはフェッチからライトバックまでのステージで、ブランチミスプレディクションパイプラインはより短い。2-wayイシューのスーパースカラパイプラインで、完全なアウトオブオーダ実行となっている。Cortex-A9ではNEONパイプラインなどはインオーダ実行で、完全なアウトオブオーダ実行ではなかった。

 上のスライドのパイプラインの構成を整理すると下の図のようになる。パイプラインステージ構成自体はCortex-A9からモディファイし、特にディスパッチ回りのステージ構成が変わっている。Cortex-A12パイプラインの最初のフェッチ0はオーバーラップするため実際にはパイプラインに数える必要がないという。そのため、フェッチは3ステージとなりCortex-A9と変わらない。

Cortex-A12のパイプライン(PDF版はこちら)
Cortex-A9のパイプライン

 デコードはプリデコードと合わせて2ステージ。、Cortex-A9はデコードで2ステージの構成だ。次にレジスタリネーミングのステージがあり、ディスパッチステージとなる。ディスパッチステージでレジスタファイルアクセスを行なう。イシューステージは2ステージで、I0がリザベーションステーションのキューとなっている。ちなみに、ARMはCortex-A9に対してCortex-A12では、ディスパッチ-イシューで1ステージ増えただけと説明している。Cortex-A9のオリジナルアーキテクチャの説明では、パイプラインは最短で9ステージとなっているが実際にはディスパッチ回りがもう1ステージ多いと見られる。

 整数演算が1ステージと2ステージになっているのは命令種類による。ロード/ストアパイプはアドレス生成が1ステージ、L1キャッシュアクセスが2ステージ。浮動小数点/NEON SIMD(Single Instruction, Multiple Data)エンジンのパイプラインでは、命令デコードのためのステージが1つ追加されている。実行は命令によってレイテンシが異なるが、Cortex-A12ではNEONパイプラインも完全にアウトオブオーダ実行化されている。

 パイプラインの深さはCortex-A12でもCortex-A9と大きな差がない。このことは、同じプロセス技術でCortex-A12の動作周波数は、原理的にCortex-A9とあまり差が無いことを示している。Cortex-A12は消費電力に影響が大きい動作周波数を上げるよりも、命令の実行効率を上げることでパフォーマンスアップを目指している。

分岐予測を大幅に強化したCortex-A9

命令フェッチ部分「I-Side」

 ARMが「I-Side」と呼ぶフロントエンドの命令フェッチの部分は、Cortex-A9より大幅に拡張されている。キャッシュラインはCortex-A9の32-byteラインから、Cortex-A12では64-byteラインに拡張された。これは、Cortex-A15/A7とキャッシュラインの整合性を取るためだ。L1命令キャシュは32KBまたは64KBのどちらかをチップベンダーが選択できる。4-wayセットアソシエイティブ。最大で4つの命令フェッチリクエストをインフライトで発行できる。

 命令Translation Lookaside Buffer (TLB)は2階層構成で、インストラクションμTLBと、メインユニファイドTLBとなっている。μTLBは64エントリ。

 命令フェッチはスロットベースで128-bitバッファを持つスロットが6ユニットの構成となっている。1スロットに対して1サイクルアクセスとなっている。ループの場合に命令フェッチをスキップするループモードでは、このスロットをカスケイドさせて繰り返し実行するという。また、各スロットにいくつの分岐が含まれているかがディテクトされ、分岐予測ユニットと連携する。

Cortex-A12のブロック図(PDF版はこちら)

 Branch Target Address Cache(BTAC)はメインが2Kエントリまたは4Kエントリで、チップベンダー側の実装でどちらかを選択できる。これはL1命令キャッシュが32KBと64KBの2容量から選択になっているためだ。基本は32KB L1命令キャッシュに対しては2KエントリのBTAC、64KBに対しては4KエントリのBTACを推奨している。しかし、顧客のチップベンダーは、キャッシュ容量とBTACの量を個別に選択することもできる。Cortex-A9も現在のRevision 4では4kエントリだが、例えばRevision 2は2-way 512エントリと少なかった。Cortex-A12はメインのBTACとは別にレイテンシの短いμBTACも持つ。

 グローバル分岐予測ユニットのプレディクタは、GShareが2つの2bit 2Kエントリ、また1Kエントリのバイモード(bi-mode)プレディクタと1Kエントリのメタプレディクタを持つ。プレディクタの構成がCortex-A9より複雑になっている。リターンスタックは32-bitが8エントリで、これはCortex-A9と同じだ。

 シンプルに言えば、分岐予測は従来のCortex-A9よりかなり強化された。機能的にはCortex-A53の分岐ユニットに近いという。その分、分岐予測ミスが小さく、投機実行のムダが少なくなり、パフォーマンスが上がり、電力のムダな消費が減る。実際に、Cortex-A12でのパフォーマンスアップのかなりの割合は、分岐予測の強化によるとARMのStephane Brochier氏(Consultant Engineer, Processors Division, ARM)は語る。

A9から大きく変わった命令デコードから下の構成

 フェッチキューの下のプリデコードステージは静的分岐予測をハンドルする。命令デコードは1ステージで、ARMv7の全ての命令セットARM(32-bit)、Thumb-2とCortex-A15以降の拡張命令をサポートする。デコーダは2命令同時デコードで、2個のデコードユニットの機能は同等で、基本的にデコードできる命令ペアの制約はないという。

 Cortex-A9と大きく異なるのは、Cortex-A12ではデコードステージから下が、スカラ整数演算系と浮動小数点/SIMD演算系に分かれること。どちらのパイプラインにも最大2命令がイシューされる。どちらもアウトオブオーダ実行だ。スケジューリングが2系統に分かれるため、パイプラインの構造はCortex-A9とは完全に別モノとなっている。

Cortex-A12の実行ユニット群(PDF版はこちら)
Cortex-A9r4のブロック図(PDF版はこちら)
レジスタセット。32-bit長の37レジスタ

 スカラ整数演算系のパイプラインは、デコードの下に1ステージのレジスタリネーミングのステージが来る。Cortex-A9との違いはリネーミング空間で、Cortex-A9は56物理レジスタだったのが、Cortex-A12は80物理レジスタになっている。ちなみにARMv7での論理レジスタはトータルで37レジスタだが実際にはバンキングによってレジスタをマップしている。ユーザーモードでの汎用レジスタは16本で、そのうち3レジスタは特定の機能が割り振られている。論理レジスタ数が少ないことは、従来のARM命令セットの弱味だ。Cortex-A12は、物理レジスタを増やしたことで、より多くレジスタの競合を避けることができるため、命令スケジューリングの余裕ができた。

 次のディスパッチステージが、レジスタアクセス待ちのステージとなっている。データが揃った段階で、次のイシューステージ群へと進む。リザベーションステーション方式のキューとなっている。

 キューは演算パイプライン系とロード/ストア系で分離されている。整数演算系のリソースでは、整数除算ユニットが新たに加わった。ARMプロセッサではCortex-A15まで除算ユニットを持たなかった。また、整数乗算ユニットは2サイクルレイテンシとパフォーマンスが向上した。整数演算ALU(Arithmetic Logic Unit)は2ステージになっているが、一部に2サイクルかかる命令があるからだ(ARM命令にはシフト+ALU演算がある)。しかし、ほとんどの命令は1サイクル実行となり、演算の1ステージ目はスキップされるという。

 依存性を持つ条件分岐の解決をモニタするブランチモニターは、Cortex-A9の6エントリから9エントリに増やされた。

パフォーマンスが大幅に増えたSIMDパイプライン

 Cortex-A9では浮動小数点/SIMD演算パイプはオプション扱いで完全には統合されていなかった。また、シングルイシューのインオーダ実行だった。しかし、Cortex-A12では、浮動小数点/SIMD演算パイプも完全に統合され、専用のディスパッチポートも設けられた。デュアルイシューパイプラインでアウトオブオーダ実行となっている。ただし、デュアルイシューパイプになったと言っても、SIMDパイプが二重化されたわけではない。SIMD系は1パイプにまとめられている。

 Cortex-A12では、浮動小数点/SIMDパイプも物理レジスタファイルへのリネーミング方式を取っている。物理レジスタは64本の64-bitレジスタ構成となっている。NEONエンジン自体のSIMD演算は最大128-bit幅で、128-bit時にはデュアルビューで2個の64-bitレジスタを128-bitレジスタとして使う。128-bit換算なら32本のレジスタとなる。Cortex-A12の物理レジスタ数は、ちょうど論理レジスタ数の倍となっている。

パイプの統合や専用ディスパッチポート
NEONエンジンは最大128-bit幅

 Cortex-A12はCortex-A9に対して主要なワークロードで40%パフォーマンスがアップするが、NEON命令だけを取ると50%以上のパフォーマンスアップになるという。

ロード/ストアユニットは倍に

 ARMが「D-Side」と呼ぶデータアクセスエンジン部分も、Cortex-A9より大幅に強化されて、ロード/ストアユニットはデュアルイシュー2ユニットになった。またCortex-A9と異なり、完全にアウトオブオーダ実行になった。Cortex-A9はシングルイシューで、この部分がボトルネックになる場合が多かったという。

 ロード/ストアユニット群は専用のアウトオブオーダイシューキューを備える。2個のロード/ストアユニットは、それぞれ独立したアドレス生成ユニットを備える。2ユニットで、ロードとストアをどの組み合わせでも並列に発行できる。1ロードと1ストア、2ロード、2ストアが可能だ。ロード/ストアスロットはCortex-A9の4スロットに対してCortex-A12は8スロット。Cortex-A9より多くのロード/ストアリクエストをハンドルできる。

データアクセスエンジン「D-Side」が大幅に強化

 アドレス生成に1サイクル、L1データキャッシュアクセスに2サイクルの3サイクルパイプラインで、ストラクチャ自体はCortex-A9に似ている。μTLBは32エントリ。L1データキャッシュは32KBで、キャッシュラインは64-byteに増えた。データキャッシュに対するルックアップは2ユニットが並列に動作する。

 ストアバッファは8スロットで、読み出しが連続するストリーミングモードを検知できる。データのプリフェッチはCortex-A9が4ストリームだったのが、Cortex-A12では8ストリームになった。ただし、Cortex-A9もr4では最大8ストリームとなっている。

 プリフェッチャは2レベルで、L2キャッシュからL1データキャッシュへのプリフェッチを試みてデータがL2になかった場合はメモリからL2キャッシュにプリフェッチできる。最大4キャッシュラインをプリフェッチできる。

 メインTLBは1Kエントリで4-way。Cortex-A9では最大512エントリで2-wayだった。よりヒットミスが減るため、メモリアクセス性能がアップする。また、Cortex-A12はCortex-A9になかったハードウェアバーチャライゼーションをサポートしたため、ページネストのレイテンシを減らしている。

 Cortex-A9の物理メモリアドレススは32-bitだが、Cortex-A12はCortex-A15と同じLong Physical Address Extensions (LPAE)の40-bitアドレッシングをサポートする。これもバーチャライゼーションでの使用を想定したものだ。

 L2キャッシュはクラスタ内のCPUコア間で共有する。Cortex-A9ではオプションだったが、Cortex-A12ではL2が統合されている。

MMUの機能
2ステージのアドレス移行
L2キャッシュ

28nmプロセスでの提供準備が進むCortex-A12

 Cortex-A12をCortex-A9とスペック上で比較すると下図(左側)のようになる。ほとんどの機能が強化されているが、一部に後退している部分もある。Cortex-A9ではオプションで提供されていたキャッシュのパリティが、Cortex-A12では省かれている。これは、幅広いアプリケーションを想定していたCortex-A9に対して、Cortex-A12はモバイルにフォーカスしているためだ。

 ARM自身が見積もるパフォーマンス差はほとんどのワークロードでCortex-A9の40%以上。NEON主体になるとパフォーマンスアップは50%前後になるが、Webレンダリングでは差は20%程度に縮まる。

Cortex-A9、Cortex-A12のスペック比較
Cortex-A9、Cortex-A12の性能比較

 Cortex-A12の物理実装は急ピッチで進んでおり、ARM TechConでもGLOBALFOUNDRIESなどが28nmプロセスでのA12の物理設計について説明を行なった。Cortex-A12は価格に敏感なミッドレンジ帯をターゲットにしているため、当面は28nmプロセスで提供される。ARMがファウンダリと協力して開発するプロセス最適化パック「POP(Process Optimized Packages)」は、TSMCの28HPMとGLOBALFOUNDRIESの28SLPで提供されている。最初のシリコンは2014年の第1四半期中と見込まれており、エンドユーザー製品も2014年には登場する。

Cortex-A12の製造予定
搭載製品は2014年に登場予定

 Cortex-A12のターゲットはミッドレンジ価格帯のモバイルデバイス向けのSoCで、ダイサイズ(半導体本体の面積)の目安は50~80平方mm。マルチプロセッサ構成のCPUコアとL2キャッシュの合計面積で5~10平方mmがターゲットレンジだ。CPUコア単体のサイズは1~1.5平方mm程度、消費電力はマルチコアCPUプラスL2キャッシュで400~450mW。このクラスでは、Cortex-A12は、Cortex-A9より大幅に性能を伸ばす有力なCPUコアとなる。

モバイルSoCのARMコアの位置付け(PDF版はこちら)

(後藤 弘茂 (Hiroshige Goto)E-mail