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

ARM CPUのサーバーへの道を開く新命令セットアーキテクチャ「ARMv8」



●ARMアーキテクチャの歴史の中で最大の変化

 ARMは、64-bit拡張を含む新しい世代の命令セットアーキテクチャ(ISA:Instruction Set Architecture)「ARMv8 (ARM Version 8)」を発表した。ARMv8では複数の命令セット系列が登場する予定で、ARMの技術カンファレンスである「ARM TechCon 2011」では、このうちハイエンドのARMv8-Aだけが発表された。アナウンスされたARMv8の大きなポイントは2つ。

ARM TechCon会場となったSanta Clara convention Center

 1つ目は、ARMが入り込めていない市場であるPCクラスのコンピュータやサーバー、スーパーコンピュータへとARM CPUを浸透させること。現在32-bitのARM命令セットを、64-bitに拡張することで、256TB(48-bitアドレス)までの物理メモリをサポートし、大規模なシステムにARMを使うことができるようにする。これは、x86 CPUなどと同じ領域にARM CPUが浸透できることを意味する。

 当然、Intelと激突のコースであり、ARMに賭けるNVIDIAが待ち望んでいた展開であり、MicrosoftがWindowsをARMに載せた理由はここにある。特に、サーバーへの進出では、64-bitがこれまでARMに欠けていた要素の中で最重要であり、ARMv8-Aでサーバーへの道が開けた。そして、サーバーやスーパーコンピュータでは、電力効率をこれまで以上に高めることが望まれている。低消費電力で伸びてきたARMのテクニックは、今後のサーバー市場では大きく伸びる可能性を秘めている。そのため、ARMベースのサーバーCPUやサーバー、スーパーコンピュータの発表が相次ぐと予想される。

 ARMv8の2つ目のポイントは、ARMの命令セットのリセットをすること。「ARMv8-AはARMアーキテクチャの歴史の中で最大の変化」とリードアーキテクトのRichard Grisenthwaite氏(Lead Architect and Fellow. ARM)は語る。ARMは今回、ARMv8-Aの64-bitステイト「AArch64」で、命令セットのフォーマットやレジスタファイル構成、例外処理モデルなどをガラリと変える。ARMの命令セットの特殊性だった、条件付きの演算命令や複雑な例外処理モード、バンクレジスタといった部分を変更する。言ってみれば、ARMの命令セットの“普通化”を行なおうとしているように見える。

 ARMは64-bitからは命令セットやモードをすっきりしたものにすることで、CPUの複雑化を防ぎ、さらには実装もし易くするものと推測される。ARMv8-AのAArch64が、ARMアーキテクチャのリセットだと考えるなら、今後長期間に渡ってARMアーキテクチャを発展させる土台となると見られる。ただし、ARMv8-Aでは、64-bitで新フォーマットの命令セットを導入しながら、従来の32-bitとの後方互換性も維持する。そのために、32-bitの「AArch32」ステイトを備える。

 また、ARMv8-Aは、ARMのヘテロジニアス(Heterogeneous:異種混合)コンピューティング戦略の土台でもある。例えば、ARMはGPUコンピューティングをサポートするユニファイドシェーダ型のGPUコア「Mali T-604」を開発したが、このコアはARMv8の64-bitアドレッシングをサポートする"64-bit GPU"となっている。


●実際の64-bit ARMチップの登場は2014年頃

 ARMアーキテクチャは、プロファイルによって下のスライドのように階層化されている。最上位はアプリケーションプロセッサ向けでARMv7命令セットでは「ARMv7-A」となり、ARMコアではCortex-Aファミリに実装されている。その下のリアルタイムプロファイルが「ARMv7-R」で、Cortex-Rファミリに実装されている。最下層がマイクロコントローラプロファイルの「ARMv7-M/ARMv6-M」で、Cortex-Mファミリなどだ。

 この対応関係から行くと、ARMv8-Aに対応するのはCortex-A系かその後続プロセッサファミリだが、ARMは今回、ARMv8-Aに対応する64-bit CPUを発表しなかった。アーキテクチャだけに限定した発表だ。ARM TechConのキーノートスピーチでARMv8を発表したARMのMike Muller CTOは、その理由を説明する。

ARMのMike Muller CTO

 「我々は、今日、ARMの最初の64-bitアーキテクチャを発表する。ただし、64-bitのCPUの発表は、まだ行なわない。実際の64-bit製品までには、まだ長い道のりが待っている。

 では、なぜアーキテクチャだけを先に発表するのか。それは、64-bitのソフトウェアエコシステムを創り上げるのに時間がかかるからだ。我々は、それを認識しており、ARMv8のアーキテクチャを発表することで、ソフトウェア開発者が、将来のハードウェアのためのソフトウェア層の開発をスタートさせることを望んでいる」。

 自社でチップを製造しないARMは、命令セットアーキテクチャ(ISA)を定義、ISAを実装したCPUコアの物理IPを開発、IPのライセンスを受けた半導体メーカーが、実際の半導体チップに実装するというプロセスで製品を世に出す。また、一部のメーカーはアーキテクチャライセンスをARMから受け、ARMと命令セット互換のCPUアーキテクチャを自社で開発する。ARMv8は、現在、命令セットの概要が公開された段階にある。

 「我々は、これまでARMv8のツールチェインと64-bitのLinuxカーネルに力を注いできた。今日、仕様とモデルをリリースし、契約したパートナーへ提供を始めてエコシステムの立ち上げを始める。来年(2012年)は、ARMv8のエコシステムの実際に組み上げる年となる。プロトタイプシステムが登場するのは2013年以降となるだろう」とMuller氏は語る。ちなみにプレスリリースでは、コンシューマ向けとエンタープライズ向けのプロトタイプが2014年に登場となっている。

 ARMは、今回のARM Techconで、ハイパフォーマンスのCortex-A15と、ローパフォーマンスのCortex-A7を組み合わせることで、低負荷時の電力消費を大幅に下げるbig.LITTLEコンセプトを発表した。そのために、Cortex-A7はローエンドのスマートフォン向けのコアでありながら、ハイエンドのスマートフォンやタブレット向けのCortex-A15と同等の命令セットと機能を備える。Cortex-A15で走っているプログラムを、シームレスにCortex-A7上へと切り替えることができるようにするためだ。

 このことは、ARMがARMv8-AベースのCPUコアをリリースする際にも、同様のラインナップ化が必要になることを示唆している。ARMv8-Aベースの世代でも、big.LITTLEコンセプトで電力消費を抑えるプランを拡張するつもりなら、ARMは高パフォーマンスコアと低消費電力コアとペアを登場させることになるだろう。ARMv8-Aベースの64-bitチップの利点を、低消費電力に持ってくるのなら、ARMはbig.LITTLEの2種類のコアを出す必要がある。つまり、ARMv8-A CPUコアをまずハイエンドで出して、次第に下のクラスにもたらすウォータフォールは取りにくい。

●最初はモバイルデバイスの64-bit化を見据えてスタート

 ARMプロセッサのサーバーへの扉を開くARMv8の64-bitアーキテクチャだが、面白いのは、ARMが最初の段階では、サーバーを特に重要なターゲットとはしていなかった点だ。ARMは、現在の命令セットであるARMv7が、追加フィーチャを含めて完成しつつあった2007年に、64-bitアーキテクチャの作業をスタートさせたという。命令セットアーキテクトの手が空いた段階で、次に取りかかったと思われる。

 Grisenthwaite氏は、64-bit化の基本的な動機はARMの伝統的な市場での、64-bitへの進化の圧力にあったと説明する。ムーアの法則でトランジスタ数が増えるため、システムに搭載できるメモリ量が増えて行くことが基本的な原動力だった。

 「ハイエンドのスマートフォンやタブレットは、2010年代の終わりよりも前に4GBを超えるメモリを必要とするようになることは確実だった。そうした要求に応えるには、大きなメモリアドレス空間を持つ必要があった。それが32-bitから64-bitへの移行の基本的なモチベーションだ」(Grisenthwaite氏)。

 モバイルでの4GB越えのニーズはまだ先なので、今の段階では急ぐ必要はなかったはずだ。しかし、サーバーなどの新市場が見えてきたことで、状況が変わった。64-bitを2014~15年に間に合うタイミングで出す必要が出てきたと言う。ARMv8をこのタイミングで発表した背景には、そうした事情があったようだ。

●Acorn時代からの遺産の例外モードを変更

 ARMv8-Aでは、従来の命令セット互換の32-bitステイト「AArch32」と、新しい64-bit「AArch64」ステイトの2つのステイトがある。ステイト切り替え式で、64-bitと32-bitを併存させる。

 AArch64ステイトでは、新命令セット「A64」が定義された。旧来のARM命令セットはA32、ARMのサブ命令セットThumbはT32だ。ARMは、ARMv8が完全にARMv7を内包すると説明する。ARMv7-Aの主要機能は全て取りこまれている。その中には、仮想化やセキュリティ機能のTrustZoneも含まれる。つまり、ARMv7-Aの上位互換の命令セットがARMv8-Aだ。また、64-bitを加えただけでなく、32-bitのAArch32にも、若干の機能拡張が加えられている。

 AArch64ステイトの概要はすでにレポートされているので、目立つポイントだけに絞ると、まず、従来との大きな違いの1つは、例外制御だと言う。従来のARMのアーキテクチャは、例外モードが多く、また、例外モードによって汎用レジスタをバンクレジスタとして切り替える仕様になっていた。ARMは、これをAArch64では大幅に変更したと言う。Grisenthwaite氏は次のように説明する。

 「ARMは歴史的にAcornが使う専用アーキテクチャとして出発した。そのため、例外モードは、Acornの専用OSのために設計された。これまでのARMアーキテクチャは、これを継承してサポートしてきたが、現状には合っていない。そこで、新しい64-bit命令セットでは、バンクレジスタとモードを減らすことにした」。

 例外レベルはEL0からEL3までの4段階の特権レベルに整理された。より、簡素化されたという。

従来のARMのプロセッサモード
ARMv8-Aの例外モデル

 ARMはもともとイギリスの教育用コンピュータメーカーAcorn Computersが、自社コンピュータ用の独自CPUとして1985~87年に開発したARM1/2を源流としている。ARMに関心を持ったAppleが共同開発をもちかけ、現在のARMの元となるARM6が産まれた。ARMは、25年振りに、Acorn時代からの荷物を降ろすことにした。

 A64の命令セットは32-bit固定長で、命令フォーマットの中のレジスタスペースは5-bit長になった。汎用レジスタは、64-bit長へと拡張されただけでなく、従来の16本から31本+ゼロレジスタの構成と本数も増えた。

 また、従来アーキテクチャでは汎用レジスタを転用していたプログラムカウンタとスタックポインタは個別になった。例外モードでの汎用レジスタのバンキングもなくなった。つまり、レジスタ本数は、単純に倍増しただけでなく、より有効に使えるようになった。また、SIMD(Single Instruction, Multiple Data)命令用のメディアレジスタも128-bit幅が32本と倍増した。

 Grisenthwaite氏によると、レジスタを増やしたのはパフォーマンスを上げるためだけでなく、電力効率のためだという。アプリケーションが複雑になるに連れて増える、レジスタ内容のキャッシュへの待避によるスピル&フィルを減らすことで、キャッシュアクセスを減らして電力消費を減らすと言う。

従来のARMのレジスタセットとバンクレジスタ関係
ARMv8-AのA64命令セットでのレジスタ

●命令フォーマットをよりシンプルに変更

 ARMは、A64命令セットで大きく変更を加えたが、基本の命令セマンティクスは、できる限り従来と同じに保ったと言う。これは、同じデータパス、同じバックエンドパイプラインを共有できるようにして、32-bitと64-bitの間でのオーバーヘッドを減らすためだという。

 命令フォーマットも変わった。従来のARM命令はユニークな条件付き実行命令フォーマットを持っていた。命令フィールドに条件コードを埋め込み、条件実行させることができる。そのため、条件分岐命令を使わずに条件実行させることができた。しかし、Grisenthwaite氏は、現在のマイクロアーキテクチャにおいては、このフォーマットはあまり有効ではないと説明する。

 「ARMの命令セットの歴史では、実質的に条件命令の比率が非常に高かった。しかし、現在ではこの方式は、命令スペースのコストに対してあまり有用ではない。分岐予測の設計も複雑にしてしまう」(Grisenthwaite氏)。

 そのため、AArch64では条件実行は、分岐や比較などに制約したと言う。これも、命令セットの簡素化だ。

従来のARMの命令セット

 ARM Techconのキーノートスピーチで、CTOのMuller氏は、新しいARMv8でも既存の32-bitのソフトウェア資産との互換性を維持することを強調した。

 「ARMv8では、膨大な既存の32-bitソフトウェアに対して完全な後方互換を取る。我々は、多くの労力を、ARMv8のソフトウェア層の上で、32-bitコードが効率的に走るように設計することに費やした。64-bitソフトウェアのためだけのモンスターマシンではなく、32-bitタスクも効率的になるようにした」。

 ARMは、ARMv8で従来互換の32-bitステイト「AArch32」と、新しい64-bit「AArch64」ステイトを慎重に分離している。ステイト切り替えで64-bitをサポートし、例外処理とリターン時のみ32/64-bitの切り替えができる仕様となっている。

 32-bitアプリケーションは64-bit OSで走らせることが可能で、32-bit OSは64-bit Hypervisorで走らせることができる。64-bitのソフトウェア層の上で、32-bitコードの互換を扱う。

 こうしてみると、ARMv8-AがARMにとって極めて大きなジャンプであることがわかってくる。この他にもさまざまな拡張が加えられており、ARMの歴史上で最も大きな変革であることは、間違いがない。過去との互換を維持しつつも、Acorn時代からの重荷から脱却することで、新しい土台を作ろうとしている。