MicroProcessor Forum 2007レポート ARMv7のマルチプロセッサ拡張会期:5月21日~23日(現地時間) 会場:米カリフォルニア州サンノゼ Microprocessor Forum 2日目のテーマには、組み込み系や特定目的のプロセッサがある。この中に含まれるのが、携帯電話関連のプロセッサである。その中でARMが行なった発表に、「ARMv7 Architecture Recieves Multi-Processor Extensions」がある。ここでは、このARMv7アーキテクチャのマルチプロセッサ・エクステンションの概要について説明しよう。 ●ちょっとしたおさらい 以後の話を理解してもらうために、ちょっとARMプロセッサについて解説しておこう。携帯電話に広く使われるARMプロセッサだが、ARMは、設計を提供するだけで、具体的な製品は、そのライセンスを受けたメーカーが製造する。ARMのプロセッサには、命令セットのアーキテクチャ(ARMv7とかARMv6とか表記される)と、具体的なプロセッサの設計ファミリと具体的な設計(ARM11とかARM7TDMIとか言われるのはこれである)がある。 ARMv7は、命令セットのアーキテクチャで、現在のARM Cortexプロセッサファミリーの命令セットである。Cortexは、これまでのARM11やARM10などのプロセッサファミリの名称である。Cortexプロセッサファミリは、アプリケーションプロセッサ(A)、リアルタイム処理(R)、組み込み用(M)の3つのプロファイルに分かれていて、具体的なプロセッサコア(これまでのARM7TDMIとかARM1020Eとかに相当するもの)にはCortex-A8とかCortex-R4などという名前が付く。ARMv7は、Cortexファミリのアーキテクチャであり、アプリケーションプロセッサ用がARMv7-A、リアルタイム処理用がARMv7-R、組み込み用にはARMv7-Mが対応する。 ARMv7以前のアーキテクチャとARMv7の概要を示したのが以下の図である。
今回の話は、ARMv7 A/Rに対してマルチコア機能を強化するためのエクステンション(MP Extensions)についてだ。マルチコア自体にはすでにARMv6で対応が行なわれているが、ARMv7では、さまざまな機能強化が行なわれ、特にプロセッサ間の同期や情報交換をハードウェアで行なえるようになった結果、マルチコアによる実行効率が向上することになるようだ。 また、プロセッサ資源の仮想化も実現し、これにより、複数OSを同時に独立させて実行するようなことが、より効率的に行なえるようになった。 仮想化とマルチコアというと、なんだが、PCのトレンドのようではあるが、Linuxなどの普及で、ARMあたりでも、ある程度PCに近い作業を行なわせる必要が出てきた。携帯電話など、中ではWebブラウザやメールソフト、デジカメ画像の閲覧や音楽再生と、機能的にはPCでやっているようなことがほとんど。これを専用OSでフルスクラッチで作るとなるとTCP/IPスタックの信頼性とか、各種のAPIの整備とか、気が遠くなるような作業が必要になるが、Linuxを動かしてやれば、大半のコードをどこかから持ってくることができる。しかし、それでは、携帯電話としてのセキュリティが保てないという向きには、仮想化技術により、システム側とは隔絶した環境を用意してやればいいわけだ。 Intelの仮想化技術VTもセキュリティ技術LT(LaGrande。現在はTXT:Trusted Execution Technology)と共有部分が多い。 こういう方向性は、まあ、トレンドといえばそうだが、世間の要求に合わせたからともいえる方向でもある。 ●Multi-Processor Extensionsが提供するもの ARMv7 MP Extensionsが提供するのは、・ハードウェアによるキャッシュの一貫性維持 である。
まずは、マルチコアで一番問題となるキャッシュの一貫性維持(Coherency)である。通常は、CPUコアが、キャッシュデータにアクセスする際に、他のコアのキャッシュや共有キャッシュで対応するメモリアドレスに変更がないかを調べるスヌープが行なわれる。 ARMv7では、L1はコアごとにあり、命令、データそれぞれにキャッシュがある。L2は、コアすべて(CPUパッケージ)で共有している。このL1、L2の一貫性維持は、MPCore Snoop Control Unit(SCU)で行なう。これは、CPU(L1)とL2の間に位置する。この部分はメモリアドレスとキャッシュデータを対応させるタグメモリ(ディレクトリ)を持っていて、何がキャッシュされているのかをすべて把握している。このため、キャッシュの変更が起こったときには、必要に応じて、L1間、L1とL2の間でのデータ転送などを行なえばよい。L1、L2の状態はSCUが把握しているため、各コアが行なうスヌープをここでフィルタリングでき、プロセッサ間の不要なスヌープ処理を低減することが可能だ。 また、DMAやコプロセッサなどのCPUコア外からのメモリアクセスもこのSCU経由でメモリをアクセスするようになっているので、データがL1、L2、メインメモリのいずれにあっても、やはりキャッシュ状態を気にする必要もなく、また、特別な処理も不要となる。 もう1つ必要になるのが、CPUコア間の情報交換である。ARMコアは、CPU内部にMMUを持っており、マルチコアでは、その情報などを共有する必要がある。その他、割り込み処理や実行プロセスに関する情報などもコア間で共有する必要がある。 ところが、これまでのARMアーキテクチャでは、こうした情報の共有は、割り込みとソフトウェアで行なうしかなかった。これをARMv7 MP Extensionsでは、ハードウェアで行なうことができる。CPUがMMUに対して変更を行ない、その結果ページテーブルなどに変更が発生したとき、自動的に他のプロセッサコアのMMUへ変更が伝搬し、キャッシュ上にあるページテーブルなどの一貫性が保たれるようになっている。
●Compre and SwapでLock-free Synchronizationを実現 ARMv6で、初めてマルチプロセッサに対応したが、その1つは、Exclusiveとよばれるもので、他のプロセッサコアが同じメモリアドレスを同時にアクセスしないことを保証する機構である。このために前述のSCUなどには、書き換え対象が同一でないことを検出する機構が備わっている。ARMv6には、メモリの読みこみ(LDREX:Load exclusive)、書き込み(STREX:Store exclusive)とクリア(CLREX:Clear exclusive)命令があったが、ARMv7 MP Extensionsでは、さらにcmpxchg8b命令が追加されている。 マルチコア環境では、プロセス間でタイミングを合わせる同期(Synchronization)の機構で、他のプロセッサが、処理対象の値を書き換えてしまわないような機能が必要になる。これまでは、ロックを使って、メモリ値を保護することで、これを実現していた。しかし、ロックは、デッドロックや優先順位の逆転(優先順位の低いプロセスがロックを行なったために、優先順位の高いプログラムの実行が阻止されること)などが発生するという欠点がある。 ロックの問題を回避する方法として「Lock-Free Synchronization」(Wait-Freeともいうことがあるが、厳密にはLock-FreeとはWait-Freeの1種である)と呼ばれるアルゴリズムが提案されている。このアルゴリズムに必要になるのは、Compare and Swap(CAS)とよばれるアトミックな操作である。この命令は、指定されたメモリアドレスにある値と指定された値を比較し、一致すれば、メモリアドレスの値を書き換えるという操作を行なう。結果として書き換えが行なわれたかどうかを示す値と、書き換える前の値を返す。ロックを使う場合と違うのは、この命令には、成功と失敗があることだ。 この命令は、メモリアドレスXにある値を読み取り、これをもとに何らかの計算を行ない、その結果を新しい値としてメモリアドレスXに書き込む際に、その時点でのメモリアドレスXの値が、計算を行なったときと同じかどうかを確認するために利用する。 ARMv7 MP Extensionsでは、このCASタイプの命令としてcmpxchg8bという命令を持つ。対象となるデータはメモリ上の8bytes(64bit)になり、状態を表す値だけでなく、カウンタも同時にチェックすることができる。 カウンタは、A-B-A問題とよばれるものに対応するためのもの。A-B-A問題とは、あるメモリ上の値が、一度別の値に書き換えられるものの、再度、最初と同じ値に書き換えられてしまうと、区別できなくなるもの。最初と最後だけを見ると同じ値なので、変化があったことを検出できない。場合によっては、途中の書き換えを見落としたとしてエラー処理などを行なわねばならない場合や、ビットパターンは同一でも意味が違う場合があり、一概に同じ値だからといって、行なっていた計算が常に正しいとは限らない。 カウンタはこれを検出するためのもので、書き換えを行なうと同時にカウンタを1つ増やし、書き換えが行なわれたことを示す。チェックする側は、値とカウンタを同時にチェックすることで、値は同じであっても、その間に書き換えが行なわれたことを検出できる。 ●Paravirtualizationをサポート Paravirtualizationは、仮想化の1種だが、仮想マシンが完全にハードウェアをエミュレーションするのではなく、ゲストOSが動作できるような仮想化は提供するものの、ゲストOS自体は仮想環境に対応したものを利用する方法。仮想化APIなどを用意してI/O処理などを仮想マシン側(ホスト側)に任せてしまうような場合の仮想化を指す。ハードウェアをエミュレーションするような仮想環境を提供している場合でも、専用ドライバなどを利用することで、Paravirtualizationとして、実行効率を上げる場合もある。ARMv7では、小規模あるいは組み込み系での利用であるため、目的は特定のアプリケーションであり、完全なハードウェアのエミュレーションまで行なうほどの仮想化は必要なく、仮想環境向けに修正したゲストOSが動作し、その上のアプリケーションがちゃんと動けばいい。このため仮想環境はParavirtualizationまでとなる。 ARMv6でTrustZoneと呼ばれる保護機構が組み込まれたが、これは、簡単にいえば、セキュアなゾーンと通常のゾーンを分離して実行する機能で、GIC(Generic Interrupt Controller)と呼ばれる機構が、割り込みのルーティングを行なう。 この機構はマルチコア環境でも有効で、複数の環境を同時に実行することが可能になるため、従来のARMアーキテクチャよりもParavirtualizationが効率的になるというのがARM側の説明だった。 ●汎用プロセッサへの進化 インターネットアクセスといえばPCが中心だが、それ以外の機器でも、同様なインターネット利用環境や、GUI環境が整いつつある。その最たる物は、携帯電話で、いまや、PC並みのWebブラウザや表計算やワープロ、PDFファイルの表示といったところまで範囲を広げつつある。これに続くのが、ゲームコンソールや家電関連機器組み込みのインターネットアクセス機能である。こうした分野では、ARMアーキテクチャは、低消費電力、低価格などの理由で、比較的競争力を持つ。だから、ARMでいうアプリケーションプロセッサが、IntelやAMDなどのプロセッサのような汎用CPU的な性格を帯びるのは当然の方向だろう。 これまでのARMは、コアは1種で、性能や付加機能の違い(MMUの有無など)で、ベースバンドやアプリケーションプロセッサといった用途に対応してきたが、Cortexファミリからは、用途別に3種類の実装が用意されることになった。今後は、それぞれの方向に最適化されたプロセッサになっていくと予想される。その証拠に、Cortex-M系列では、ARMv7といいながらも命令セットは、Thumb-2と呼ばれる16bit命令コードのみ実装である。逆にARMv7 MP Extensionsで実装されるcmpxchg8b命令などは、動作やニモニックが同じものがx86にも存在している(Pentiumで実装された)。 ARMv7-Aでは、今後、汎用プロセッサ向けの傾向が強くなる。MultiPorcessor Extensionはその第一歩といえるだろう。 □Microprocessor Forum 2007のホームページ(英文) (2007年5月30日) [Reported by 塩田紳二]
【PC Watchホームページ】
|