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

ARMの新省電力技術big.LITTLEプロセッシング



●Cortex-A15とCortex-A7を組み合わせるbig.LITTLE

 ARMは、CPUのバッテリ駆動時間を延ばす新テクニック「big.LITTLE Processing」を導入しようとしている。高パフォーマンスCPUコア(big)と、低消費電力CPUコア(LITTLE)を組み合わせて省電力化を図るヘテロジニアスマルチコア技術だ。big.LITTLEの最初の実装は、ハイパフォーマンスな次世代コアCortex-A15と、低消費電力の次世代コアCortex-A7の組み合わせとなる。

 Cortex-A15は3命令デコードのアウトオブオーダ型CPUコアで、ARM設計のCPUとしては最高パフォーマンスコアだ。対してCortex-A7は、限定された2命令デコードのインオーダ型CPUコアでARMのCortex-Aファミリでは極めて小型で省電力なコアだ。言ってみれば、Cortex-A15とCortex-A7は、IntelのCore i系とAtom系のような関係にある。

Cortex-A7のブロックダイアグラム
PDF版はこちら
Cortex-A15のブロックダイアグラム
PDF版はこちら

 Cortex-A15とCortex-A7のパフォーマンス差は、ARMの資料では1.9~3倍。電力効率の差は2.3~3.8倍。Dhrystoneで比べるとCortex-A15は1.9倍のパフォーマンスだが、Cortex-A7の方が3.5倍電力効率がいい。見事にポラックの法則(1.4倍のパフォーマンスを得るには2倍のトランジスタ=電力が必要)の通りのパフォーマンスと電力効率の差となっている。

bigとLITTLEの比較
PDF版はこちら

 Cortex-A7の大きな特長は、CPUマイクロアーキテクチャこそ省電力に簡素化されているものの、命令セットや機能の面ではCortex-A15と互換になっていること。Cortex-A7クラスのCPUでは不要に見えるバーチャライゼーションやアドレス空間拡張「Large Physical Address Extensions」も搭載されている。「Cortex-A7は、アーキテクチャ的にはCortex-A15と全く同一に見える」とARMのPeter Greenhalgh氏(Cortex-A7 & big.LITTLE Technical Lead, ARM)は説明する。

 Cortex-A15とCortex-A7は、それぞれ別なCPUクラスタとして束ねられている。ARMのCortex-A系のアーキテクチャでは、各CPUクラスタに、1~4個のCPUコアと共有L2キャッシュ、それにスヌープコントロールユニット(SCU)を持つ。big.LITTLEのリファレンスでは、2コアのCortex-A15クラスタと2コアのCortex-A7クラスタの構成が示された。Cortex-A15とCortex-A7は、後で説明する理由から同数が望ましいとされている。もし、Cortex-A15が1コアならCortex-A7も1コアの構成となる。

big.LITTLEのアーキテクチャ
PDF版はこちら

 Cortex-A15とCortex-A7の両クラスタは、ARMの新しいシステムバスであるAMBA4 CCI-400(コヒーレントインターコネクト)で結ばれている。このバスによって、Cortex-A15クラスタとCortex-A7クラスタの間もメモリコヒーレンシが保たれている。また、両クラスタは、同じ割り込み制御のGIC(Generic Interrupt Controller)-400にも接続されている。GIC-400はプログラマブルで、割り込みを両CPUコアクラスタ間で移すことができる。

 「big.LITTLEのユニークな側面はハードウェアコヒーレンシだ。Cortex-A15とCortex-A7は、互いのL1とL2キャッシュをスヌープできる。タイトなコヒーレントによって、両CPUクラスタ間のコンテクストのスイッチを迅速に行なうことができる。外部のメモリまでいったんステイトを書き出してから読み込む必要はない」とCortex-A7を担当するBrian Jeff氏(Product Manager, ARM)は説明する。

 マルチコア構成のコア同士がメモリコヒーレンシをハードウェアで維持することは、PCの世界から見れば当たり前に見える。しかし、組み込みの場合は、異種コアをコヒーレンシを取らずに載せることも多い。そのため、ハードウェアコヒーレンシはユニークな機能となる。

 このように、Cortex-A15とCortex-A7は、アーキテクチャ上はほぼ同一で、実装形態もよく似ている。しかし、パフォーマンスと電力効率の面では、全く異なっている。それを、メモリコヒーレンシを維持して接続しているため、タスクのスイッチが容易になる。

●基本の仕組み:タスクマイグレーション

 big.LITTLEプロセッシングでは、こうした構成のCortex-A15とCortex-A7の間で、タスクを移行させて、電力の最適化を図る。ポイントは、ここでARMが2つのソフトウェアモデルを提示していることだ。「big.LITTLE Task Migration Use Model」と「big.LITTLE MP Use Model」の2つだ。

big.LITTLEのソフトウェアーキテクチャ
PDF版はこちら

 前者のbig.LITTLEタスクマイグレーション(Task Migration)モデルは、従来のOSがそのまま移行できるモデルで、ソフトウェア側の対応はほとんど必要がない。動作周波数と電圧を遷移させる「DVFS(Dynamic Voltage and Frequency Scaling)」などに対応したOSの省電力制御機構の延長で、Cortex-A15とCortex-A7を切り替える。既存のソフトウェアインフラをそのまま使えるモデルで、当面はこちらが使われると見られる。

 後者のbig.LITTLE MPモデルは、OS側のタスクディスパッチャをbig.LITTLEに最適化し、タスクの負荷に応じてCPUコアを割り当てる。負荷の高いタスクだけをCortex-A15に振り、負荷の低いタスクだけの時はCortex-A7だけを有効にする。こちらは、OS自体に手を入れる必要があるため、浸透には時間がかかりそうだ。

 big.LITTLEタスクマイグレーションの時には、システムはCortex-A15とCortex-A7のどちらかを使う。両コアが同時にオンになることは、移行時を除けば基本的にはない。ARMはDVFSのオペレーティングポイントを使って両コア間のマイグレーションを行なう手法を提案している。

big.LITTLEのパワーパフォーマンス
PDF版はこちら

 Cortex-A15の最も低いDVFSオペレーティングポイント(周波数と電圧の組み合わせ)まで下がると、Cortex-A7を起動してタスクをシフトする。Cortex-A15上で走っていたOSやアプリケーションは、そのままCortex-A7へと移る。逆のケースではCortex-A7の最も高いDVFSオペレーティングポイントに上がるとCortex-A15へと移行する。

 「両コア間のマイグレーションは、DVFSのオペレーティングポイントの違いへと簡素化している。そのため、電力管理テクニックでOSが管理できる。Cortex-A15でのオペレーティングポイントの下限に来たら、バーチャライゼーションスイッチングソフトウェアを起動して、Cortex-A15の全てのステイトをCortex-A7に移す」(Greenhalgh氏)。

 Cortex-A7とCortex-A15はどちらもバーチャライゼーションを実装している。そのため、Hypervisor層でレジスタをトラップして、移行させることができる。組み込み向けのARMでバーチャライゼーションをどう使うのかが疑問視されていたが、こうした"落としどころ"が用意されていた。OS側から見ると、同じCPU上で異なる電圧と周波数のポイントへとシフトすることと、ほとんど変わらない。

●クラスタ単位で電圧を制御可能

 ここで出てくる疑問の1つは、マイグレーション時のCPUコアの電圧。Cortex-A15の最低の周波数&電圧に合わせると、Cortex-A7は最高の周波数&電圧ポイントで駆動することはできない。そのため、big.LITTLEの実装では、Cortex-A15とCortex-A7は個別の電圧&周波数で動作させることができるようになるという。ただし、これは電圧のサプライを2系統持った場合の話だ。また、CPUクラスタ内では周波数と電圧は同期する必要がある。

 さらに、タスクマイグレーションモデルではCPUコア数は対称型であるのが望ましいと言う。「CPUコアが対称でないと、タスクのスイッチが複雑になってしまうからだ。2つのCPUで2つのタスクが走っている場合、それを1つのCPUへとマイグレートさせるためには、タスクを1つに減らしてスイッチしなければならない。それを避けるために、コア数は対称が望ましい」(Greenhalgh氏)。

 big.LITTLEタスクマイグレーションモデルでは、ARMがソフトウェアスイッチャを提供する。このスイッチャが、Cortex-A15とCortex-A7の間のマイグレーションに必要な全てのメカニズムをハンドルする。プロセッサステイトのセーブ&リストアから、割り込みの移行、それぞれのプロセッサがコヒーレンシ状態に入ったり出たりするタイミング、それに合わせたスヌーピングをコントロールする。

 big.LITTLEタスクマイグレーションモデルのキーポイントは、マイグレーション時のブラックアウト時間が20μsecと極めて短いことだ。正確には1GHz動作時に20μsecで周波数が変わると変動する。ステイトのセーブ&リストアに必要な命令数は2,000命令以下だと言う。マイグレーションに時間がかかると、短時間のスイッチングはあまり現実的ではなくなってしまう。ARMは20μsecのマイグレーション時間を強調することで、有効性をアピールしている。

●タスクマイグレーションのプロセス

 どうやってbig.LITTLEでは20μsecと短時間のスイッチングを可能にしているのか。そこには、テクニックがある。下のダイアグラム図を見ると、それがわかる。

 big.LITTLEでは、これからオフするCPUコアをアウトバウンドプロセッサ、これからオンするCPUコアをインバウンドプロセッサと呼んでいる。下のチャートの右がアウトバウンドプロセッサで、左がインバウンドプロセッサだ。

big.LITTLEのタスクマイグレーション
PDF版はこちら

 まず、稼働中のアウトバウンドプロセッサが、一定の周波数&電圧ポイントに達するなどでマイグレーションのトリガが入る。OSからバーチャライズドスイッチャが起動され、システムファームウェアインターフェイスを通じて、移行先のインバウンドプロセッサをスリープ状態からパワーオンする。トリガから起動までのプロセスは、実際にはスイッチャを使わない実装もありうる。

 パワーオンしたインバウンドプロセッサは、キャッシュを初期化しスヌーピングを有効にする。インバウンドプロセッサがウォームアップしている間は、アウトバウンドプロセッサがタスクをそのまま実行し続ける。インバウンドプロセッサがステイトを受け容れ可能になると、スイッチャがアウトバウンドプロセッサのアーキテクチャ上のステイトをセーブし始める。

 ステイトは、そのままスヌーピングによってインバウンドプロセッサに送られる。インバウンドプロセッサはステイトをリストアすると、オペレーションを引き継いで実行し始める。アウトバウンドプロセッサがステイトをセーブし始めてから、インバウンドプロセッサがリストアを終えるまでのブラックアウトタイム、つまり処理が途切れる時間が20μsecだ。

●キャッシュのスヌーピングは継続

 インバウンドプロセッサがオペレーションを開始した後もインバウンドプロセッサは、アウトバウンド側のL2をスヌープし続けることができる。ヒットした場合はアウトバウンドのL2からデータを取ってくることができる。メモリから読み出すよりアウトバウンドL2から読む方が速いため、インバウンドプロセッサのキャッシュのウォームアップが速く進む。そして、一定時間の後、アウトバウンドプロセッサ側のキャッシュは完全にクリーンになり、スヌーピングがディセーブルされ、完全にアウトバウンドプロセッサがターンオフされる。

 ARMのGreenhalgh氏によると、このプロセス全体で数百μsecのレンジだと言う。ウォームアップとクリーンナップの時間を入れると、プロセス全体では数百μsecだが、その間のオペレーションが途切れる時間は20μsecと短い。「これだけ短時間なら、誰も気にしない」と説明する。

 しかし、電力的には、ウォームアップとクリーンナップの間は余計な電力消費が生じるため、ある程度の粒度でマイグレーションを行なわないと、相対的にムダが大きくなる。また、パフォーマンスが必要になってから、インバウンドプロセッサに処理を引き渡すまでのレイテンシも20μsecよりは長い。このあたりが、実際に使った場合にどうなるのかが、未知数の部分だ。しかし、数百μsecでも充分に短いレイテンシであるため、通常のアプリケーションでは、使える場面はかなり多そうだ。

 タスクマイグレーションの仕組みを見て疑問となるポイントは、L2キャッシュがCortex-A15とCortex-A7の間で共有されてい点だろう。キャッシュが共有なら、マイグレーションプロセスも1段簡単になる。共有キャッシュならSRAMセル部分も二重に持つ必要がないからムダが少ないように見える。

 「L2キャッシュを共有にしなかった理由は、L2もハイパフォーマンス実装と効率重視の実装では大きく異なるからだ。また、最適なキャッシュサイズも異なる。キャッシュサイズが大きくなるとタグRAMの消費電力もばかにならなくなるため、電力効率を重視するならサイズを小さくすることになる」とGreenhalgh氏は説明する。ただし、ARMも共有キャッシュは検討しなかったわけではなく、共有L3キャッシュを置くことを含めて検討を行なっていると言う。

●大小のヘテロジニアスマルチコア化は潮流

 ARMのbig.LITTLEは、ARMだけの突き抜けたコンセプトではない。似たようなヘテロジニアスマルチコア型の設計は、モバイルプロセッサの間で急速に広まりつつある。

 例えば、NVIDIAが発表した「Tegra 3(Kal-El)」は、高性能コアとしてパフォーマンス最適化マクロのCortex-A9を4コア載せ、省電力コアとして電力最適化マクロのCortex-A9を1コア載せている。また、Texas Instruments(TI)の次期SoC「OMAP5」も、ハイパフォーマンスなCortex-A15を2コアとマイクロコントローラのCortex-M4を2コア載せている。ARM自身も、big.LITTLEに似たアイデアが広まっていることを認める。

 「big.LITTLEを見れば、誰もがNVIDIAがTegra3でやったことを思い出すだろう。あれは実際にクールなアイデアで、NVIDIAは非常にいい仕事をし、我々もインスパイアされた。Tegra3の考え方は、big.LITTLEに似ている。しかし、Tegra3では、Cortex-A9コアで実現しているため、(bigとLITTLEの間の)メモリコヒーレンシが取れていない。そのため、スイッチングはbig.LITTLEより難しくなっている。コヒーレンシメカニズムは、タスクスイッチングを簡単にするカギだ」とGreenhalgh氏は語る。

 Tegra3では、Cortex-A9 4コアを載せたCPUコアクラスタと、省電力時用のCortex-A9の間のメモリコヒーレンシを取ることができない。そのため、big.LITTLEと比べると、CPUコアの切り替えに、より長い時間がかかってしまう。

NVIDIAのTegra3

 ちなみに、NVIDIAはTegra2では、Cortex-A9 2コアの他に、待機時にメールのダウンロードなどを行なわせるためのARM7コアを実装した。ARMは、Tegra2のアプローチは、また違うものだと説明する。

 「Tegra2でのCortex-A9とARM7は、big.LITTLEとは異なるアプローチだ。ARM7は、いわゆるオフラインプロセッサで、OSはCortex-A9の方で走る。ただ、このアプローチも有効だ。面白いのは、big.LITTLEの実装を考えている設計者でも、big.LITTLEに加えて、さらにオフラインプロセッサを載せることを検討している人がいることだ」(Greenhalgh氏)。

 いずれにせよ、大型高パフォーマンスコアと、小型低消費電力コアの組み合わせは、モバイルSoCでは潮流となりつつある。