写真提供:マイナビニュース

写真拡大

●Cortex-A35はどういった立ち位置のコアなのか?
基調講演では簡単に性能面が(Cortex-A7と比較する形で)示された「Cortex-A35」だが、もう少し細かい話をご紹介したいと思う。

まず製品セグメントから。Photo01が各々の製品分け、という形になる。

実を言えばこの図は厳密にはCortex-A9とCortex-A53の間にARMv7-A(*)としてCortex-A12が入った形になる"はずだった"。ところがCortex-A12は発表こそされたものの、あまりニーズが無いということで、2014年10月にCortex-A17に統合される形になってしまい、この結果ARMv7-A(*)と書いた、32bitを超えるLPA(Large Physical Addressing)を利用できるHigh Efficency向けのARM v7-aベースのコアがなくなってしまった。実際に製品動向を見ると、Cortex-A15の動作周波数を落として使う、なんてケースがしばしば見られたのは、Cortex-A7とCortex-A15/17の間にかなりの性能ギャップがあったためである。

これもあってか、ARMv8-Aでは当初からCortex-A57とCortex-A53が比較的近い性能で登場しており、特にこのCortex-A53はかなり広く利用されたのだが、64bitの裾野が広がってきた(つまりOSやアプリケーションの64bitへの移行が進んだ)結果、性能はもう少し低くても良いから省電力で、かつ64bitにも対応できるプロセッサが望まれるようになった、というのは自然な成り行きであり、これに向けて投入されたのがCortex-A35という訳だ。

そのCortex-A35、絶対性能という意味ではかならずしも高くない。むしろ性能/消費電力比や性能/エリアサイズを高める事を優先したコアであり、このため基本はまるでCortex-A7を64bit化したような構成になっている(Photo02)。もっともこれに関しては「設計を見るとかなりCortex-A7に近いが、別にCortex-A7のパイプラインを持ってきたわけではなく、ScratchからCPUのパイプラインを設計するにあたり、ターゲットとした性能/回路規模/消費電力に見合う形で設計をした結果、似たような構成になった」(ARMのNandan Nayampally氏)という話であった。実際にはパイプラインの構造などはCortex-A7のものを参考にしつつ、ここにCortex-A53などでインプリメントされたARMv8-Aのエッセンスを統合した、というニュアンスの発言であった。

では具体的にどの改善されたかということでまずは電力比で言うと、当初のCortex-A7に比べて同一周波数で20%程度、28nmで最適化を行ったCortex-A7と比較しても10%程度の省電力化が実現したとする(Photo03)。またエリアサイズを25%縮小し、効率を25%改善したとする(Photo04)。

さて、ここからもう少し内部の話を。Photo05が発表されたパイプライン構成である。パイプライン段数としてはALUの場合に8段とされている。ちょっとこれだと判りにくいので、比較対象のためにPhoto06にCortex-A7のパイプラインを示すが、おおむね各ステージは同程度の段数と思われる。

ちなみにCortex-A7も一見するとDual Issuに見えるが、同時に実行できる命令は非常に限られており、実際にDual Issueで実行可能なのはALU/moveとbranch/call程度になっている。これは例えばGitHubに置かれたGCCのCortex-A7用のconfig-a7.mdを眺めると明白で、Dual issueで実行可能なのは

・ALU instruction with an immediate operand
・ALU instruction with register operands

の場合のみで、Callについてはolder instructionsや他の分岐命令との組み合わせはDual issueでは実行できないとしている。残念ながらCortex-A35用のConfigはまだ公開されていないが、インタビューで聞いた範囲ではほぼこの制約がそのままCortex-A35にも適用される感じであった。

●Cortex-A7と比べてると大きく性能が改善されたFPUとNEON
さて、以下個別に。まずFetch→Decodeの範囲であるが、これはCortec-A7にかなり近い構成に思える。ちなみにCortex-A7の場合、Decodeは完全2命令の同時Decodeが可能となっていたが、Cortex-A35ではこれがもう少し低くなっている可能性がある。実行段は極めて限定的なDual-Issueなので、実際には1.5命令/cycleまで行かないだろう。それを考えると、Decodeはもう少し動作速度を落として動かしても十分に思えるからだ。

もっとも2命令/cycleのままにして、Queueが一杯になったら停止する、というインプリメントとどちらが消費電力が少ないのかは微妙なところで、案外相変わらず2命令/cycleでDecodeが行われているのかもしれない。

またIssueが無いのは、Decode段に統合されているように思える。実際の所Queue→Decodeで2 Stageというよりは、Queue+Early Decodeで1 Stage、Late Decode(Issue含む)で1 Stageという感じだ。また分岐予測に関しては、さらに効率化を図ったとされている。具体的にはCortex-A35の改善点として、4KBのConditional Predictorと、256 entryのIndirect Predictorを搭載するとしている。Conditional PredictorはいわゆるBHT(Branch History Table)の事で、Indirect PredictorはBTAC(Branch Target Address Cache)ではないかと思うが、例えばBTACはCortex-A7だと8 entryだから、大幅にこれを強化した模様だ。もっとも、それでどの程度Efficiencyが向上したのかは今の所公開されていない。Load/Storeに関しては、遂に自動Prefetchが搭載されるようになった。ただこれはあくまでもアドレスベースの、それも簡単なものに留まっており、あまり複雑な事はやってないとの事。このあたりは性能とダイエリア&消費電力のバランスなので、あれこれ搭載すればいいというものでもないのだろう。

ちなみに説明の中にはInteger ALUに関するものは割愛されているが、これはおおむねCortex-A7と変わらないと思われる。もちろん64bit命令をサポートするから、Cortex-A7そのままでは済まないと思うが。恐らくExecuteが2 stageで、それにWritebackが入ってトータル3 stageと思われる。あとこのスライドには入っていないが、512 entryのMain TLBとは別に、10 entryのμTLBが別に用意されており、こちらを利用できる場合にはLatencyがかなり減るとされている。

L2回り(Photo09)に関しては、基本効率を改善したということしか明らかにされていない。ただL2のサイズは128KB〜1MBとされており、Cortex-A53が最大2MBを搭載できるあたりと比べると、より低い性能レンジに合わせた構成になっていることは間違い無い。Cortex-A7がやはり最大1MBというあたりからもこれは明白である。

Cortex-A7と比べると大きく性能が改善されたのが、FPU/NEONである(Photo10)。ここにもあるように、単精度で2倍、倍精度で5倍のスループットが実現されているとする。バスI/FはAXI4/AMBA4 ACE/AMBA5 CHIが搭載されており、必要ならACPがさらに利用できる(Photo11)。最後がGovernor(ガバナー)である(Photo12)。これだけ見ると何をやっているのか良く判らないかもしれないが、これは省電力のところで説明したい。

次がいくつか性能に関するもの。まずPhoto13は見ての通りで、同じプロセス/動作周波数で32bitのアプリケーションを稼動させた場合でも16%ほど高速であり、また同じ28nmでも速度よりに振ると2GHzまで性能が上げられ、その場合84%高速になるとする。

とりあえず動作周波数が違うと比較が難しいので、同一周波数上で性能比較を行ったのがこちら(Photo14)。基調講演で出てきた6〜40%の性能改善はこれを基にしたと思われる。

またL1/L2の性能改善により、メモリアクセスの性能を大幅に改善したとしており(Photo15)、これも全体としての性能改善に寄与している。また暗号化アクセラレータを搭載したことで、セキュリティ関連が大幅に高速化された(Photo16)。

●省電力化を実現できた大きな理由とは?
さて次が省電力関連である。Cortex-A35がCortex-A7と比べて省電力化を実現できた理由の大きな部分は、新しい省電力機構を搭載したことにある(Photo17)。まずQ-Channelであるが、これはAMBA/AHBのSideband(Ian Smythe氏)という形で実装される(Photo18)。

なにをやっているか、というとCPUの動作状態がQ-Channelを経由して外部のパワーコントローラに通知されており、ある程度以上アイドル状態が続いたと外部のパワーコントローラが判断すると、Q-Channelを経由してCPUに対して(この後説明する)リテンション状態に入るように指示する仕組みだ。これはパワードメインごとに用意されており、Cortex-A35の場合はNEONで1つ、NEON以外のCPUコアで1つという形になる。ちなみにPhoto05を見るとL2やSCU/ACPもコアの一部に見えるが、こちらは実装としてはコア外になるので、実際にはPhoto19の様になる。

さてこの2つのパワードメインに対して新しく用意されたのがRetention Modeである。これは何かというと、復帰のために必要な最低限のプロセッサステートを保持しつつ、回路の電圧を落とすというもので、サスペンドとアイドルの中間に位置するものになる(Photo20)。

この結果として、電源完全カットに近い程度までリーク電流を減らしつつも、完全電源Offよりも迅速に復帰が可能になるという仕組みだ(Photo21)。このRetention Modeの制御を行うのが、先に説明したGovernorである(Photo22)。Governor(とRetentionで利用される保持領域)は原則常に電源ONで、Q-Channelからの指令を受けてコアに対しての電圧制御を行う事になる。

次がスケーラビリティの話。Cortex-A35は最大4コアまでの構成が可能である(Photo23)。ではbig.Littleは? というと、「任意の64bitのCortex-Aシリーズでbig.LITTLEを構成できる」(James Bruce氏)という話で、(意味があるかどうかは別にして)例えばCortex-A35とCortex-A53でも、Cortex-A35とCortex-A72でもbig.LITTLEを構成できるとの話だった。

またCortex-A35自身がバリュー向けのスマートフォンのみならずウェアラブルまでターゲットにしていることもあり、最小構成だと28nmで0.4平方mmまでエリアサイズを縮小できるとしている(Photo24)。実はこの2つは、同じ28nmといっても利用するプロセスも最適化方法も異なっており、左は性能優先で恐らく28nm HPMあたり、右はエリアサイズ優先で28nmのLPないしULPを使ったものの様だ。このあたりは当然ターゲットとする周波数にも関係してくる。それがPhoto25で、LPなりULPを使うと動作周波数は100MHz程度まで落ちる代わりに6mW未満で動作し、逆にHPMあたりを利用すると90mWで1GHzを実現できることになる。

この6mW未満、というのはちょっと高速なMCUと同レベルであり、またエリアサイズが0.4平方mmというのもやや古めのプロセスを利用したMCU並である。要するにCortex-A35は(2014年に発表したCortex-M7とあわせて)MCUとMPUの性能面での境目を無くすという同社の遠大なストラテジーを担う、結構重要な製品と考える事もできる。

搭載製品が投入されるのは早ければ2016年末であり、当初はスマートフォンのエントリーモデル向けであろう。ただし2016年中には既存のCortex-A5/A7ベースの組み込み向けコントローラの代替としてこれを採用したSoCがラインアップされはじめるだろう。いよいよ組み込みそのものが64bitに本格シフトの準備が整いはじめた訳だ。

(大原雄介)