ARM
UKサイト Chinaサイト 投資家情報 イベント情報 プレスルーム 採用情報 Document Center


THE ARCHITECTURE FOR THE DIGITAL WORLD
メールサービス
会社概要 マーケット プロダクト&ソリューション テクニカルサポート ドキュメント
ドキュメント
TOP > ドキュメント > ホワイトペーパー
マニュアルダウンロード
カタログダウンロード
IQマガジン
ARM発行日本語書籍
ARM関連市販書籍
ARM開発ガイド
ホワイトペーパー
IQオンライン(英語版)

ホワイトペーパー

ARMのコード密度と性能を改善

ARMアーキテクチャの新Thumb拡張

Richard Phelan 2003年6月

今日のシステム設計者にとって最も重要な問題の1つは、低コストでバッテリ寿命の長い高性能組込みシステムを実現するために、矛盾する諸条件のバランスをとることです。ARMは、この問題の解決を目指し、業界最先端で革新的なソリューションを提供してきました。

ARMアーキテクチャの最新の拡張であるThumb-2コア技術は、低消費電力の高性能システムとしてのARMソリューションの実績をこれまで以上に伸ばすものです。このホワイトペーパーでは、性能/消費電力/コストのバランスをとる上で設計者の選択に影響する事項を検討し、より優れたソリューションに向けてThumb-2コア技術がどのように貢献するかを詳しく説明します。


ARM/Thumb命令セット

ARM命令セットは、ARMアーキテクチャに対応した確定的で総合的な32ビット命令群です。

Thumb命令セットは、非常に高いコード密度を実現する32ビットARMアーキテクチャの拡張です。

Thumb命令セットは、最も頻繁に使用される32ビットARM命令を、サブセットとして16ビット幅のオペコードに圧縮したものです。これらの16ビット命令は、実行時にデコードされ、対応する元の32ビットARM命令と同じ機能を果たします。

Thumb技術では、コード密度が約30%改善されます(ARM命令セットと比較)。しかし通常、この効率性のために性能が犠牲になります。1本のThumb命令セットは1本のARM命令に相当しますが、最終的に同じ機能を果たすには32ビットARM命令より多くの16ビットThumb命令が必要となるからです。

したがって、命令をフェッチする時間が同じであれば、ARMコードのほうがThumbコードより性能的に有利です。


設計トレードオフ

コスト、性能、消費電力は、設計者にとって重要なパラメータです。アプリケーション内でARMコードとThumbコードを組み合わせて使用することにより、設計者は、システムのコスト、性能、消費電力特性のバランスをとることができます。

コード密度はプログラムメモリ、ひいてはメモリサイズに影響します。メモリはシステムコストの主要部分であり、システムが複雑になってメモリが増加するとその部分のコストが増大するため、メモリサイズの縮小が望ましいことになります。

消費電力の削減は常に重要ですが、ポータブルアプリケーションの設計者にとってはバッテリ寿命を最大限に延長することが不可欠です。したがって、消費電力は設計上の決断すべてに強い影響を与えます。

性能が最優先であれば、一般に命令が少ないほどいいことになり、通常はARM命令だけを使えば最善の結果につながります。

性能と電力損失は、密接に関連しています。より効率的な命令(ARM命令セット)を使えば、低いクロック速度で特定の機能を提供でき、電力損失を大幅に削減する可能性があります。また、必要な処理を早く終え、システムを低電力モードにしても、システムの総消費電力が減るかもしれません。

コード密度と消費電力の関係は、さほど明確ではありません。メモリタイプによって消費電力が異なる場合は、コード密度の向上もシステムの電力損失低減に貢献します。

オフチップのデータまたは命令トランザクションがあると、すべてをオンチップで処理するより多量の電力が消費される傾向があります。一般に、より多くのゲートがクロックされ、より多くのクロックサイクルが必要となるからです。しかし、オンチップメモリの量は限られています。

Thumb命令を使ってアプリケーションを記述した場合、最も頻繁に使用されるコードを、より多くオンチップメモリに保存できるため、やはり高いコード密度も消費電力低減の目的に適っていると言えます。

結論を言えば、性能、コード密度、消費電力のトレードオフは単純ではありません。したがって、これらのパラメータの理想的なバランスを目指して手作業でコードを調整すると、非常に時間がかかることがあります。


コード開発プロセス

基本的な設計トレードオフとともに、総開発時間も極めて重要な問題です。

消費電力、性能、コード密度の理想的なバランスを実現し、設計を最適化するため、設計者はARM命令とThumb命令を混合して使用するのが普通です。

性能クリティカルなコードを把握すれば、高速ルーチンをARM命令で開発できます。可能であればThumb命令をコードの残り部分に使用し、メモリフットプリントを抑えます。

これは、ARMとThumbを使ったコード開発に対する実践的なソリューションです。しかし、ARMとThumbを混合するアプローチには限界があります。

すなわち、すべてのARM命令に対応するThumb命令があるわけではありません。そのため、コード密度を最高にしようとしても、いくらかのARM命令を使う必要があります。

例えば、特定の機能(SIMDなど)やコプロセッサレジスタにアクセスしたり、特権命令を使用したりするThumb命令はありません。このような場合、Thumbコードは、処理を実行するARMコードを呼び出してから再びThumbコードに戻る必要があります。

開発中、ARMコードとThumbコードの実装の境界は、メモリの限界を模索するにつれて変化します。しかし、設計が完成に近づき、実際のハードウェア環境を使用するまで、設計の正確な状況はわかりません。

このため、開発プロセスは複雑となります。特に厳しいメモリ制限を設定した場合は、ARMとThumbを最適に使用するためにコードの微調整を何度も繰り返すことがあります。


性能、コード密度、効率的な開発:ARM Thumb-2コア技術

Thumb-2コア技術は、ARMアーキテクチャを拡張するものであり、コード密度と性能に有利な拡張機能をThumb ISAに追加します。このISAでは、既存の16ビットThumb命令に以下が追加されます。
  • プログラムフローを改善する新しい16ビットThumb命令
  • 対応するARM命令から作った新しい32ビットThumb命令
  • 同時に、ARM 32ビットISAにも新しい32ビットARM命令が追加され、性能とデータ処理が改善されました。
Thumbに32ビット命令を追加することにより、前述の限界が克服されます。新しい32ビット命令には、コプロセッサアクセス、特権命令、SIMDなどの特殊機能に対応するものがあるからです。今やThumbは、高性能と卓越したコード密度の両方を実現するために必要な命令をすべて使用できます。


新しいThumb-2コア技術の特長
  • ほぼすべてのARM命令に対応する命令を使用
  • 性能とコードサイズのバランスを変えるまったく新しい12の命令
  • ARM命令セットだけを使って開発されたCコードの98%に達する性能
  • ARM命令セットを使った実装の74%に相当するメモリフットプリント
  • 既存のThumb高密度コードより優れた特性
    •  5%小型
    •  2〜3%高速
コードサイズ コードサイズ

以前は、Thumb命令セットとARM命令セットのどちらを使用するかの選択に不確定性がありましたが、今後は、Thumb-2コア技術が大半のアプリケーションでデフォルト命令セットをして使用されるようになるでしょう。

特に性能、コード密度、消費電力のトレードオフが単純でない場合には、Thumb-2コア技術が開発プロセスを大幅に簡略化します。

また、ARM命令とThumb命令の混合を調節するコードの「ブレンディング」は、不要となります。

前世代のARMアーキテクチャでARMコードとThumbコードに多大な投資をした開発者にとっては、Thumb-2コア技術により、コード密度を大幅に向上させることができます。大半のコードに変更は必要なく、性能コードの一部の領域に注目するだけです。これにより、既存のアプリケーションに新しい機能を追加し、それを短期間で市場化できます。

Thumb-2コア技術により、開発者は最適なエンドソリューションに、しかも早く近づくことになります。


性能とコードサイズのバランス


Thumb-2コア技術のために開発された新しい命令は、幅広いサンプルを使い、ARMコンパイラとThumbコンパイラが生成したコードを分析した成果です。

新しい命令を仮定すれば、性能とコード密度の両方における効果がわかります。


主要な命令

ビットフィールド命令

パックデータ構造の処理を改善するため、ビットフィールドを挿入、抽出する命令がThumb 32ビット命令とARM 32ビット命令の両方に追加されました。これにより、多数のビットを挿入したり、レジスタから多数のビットを抽出したりするのに必要な命令数が減るため、パックデータ構造を使用するメリットが増え、必要なデータメモリの削減にもつながります。

ARM(v6以前) Thumb-2(ARMまたはThumb)
AND r2, r1, #bitmask BFI r0, r1, #bitpos, #bitwidth
BIC r0, r0, #bitmask << bitpos  
ORR r0, r0, r2, LSL #bitpos  


上記は、マスクとシフトマスクがARM命令内でフィールドの限界を超えない単純な場合に、3本の命令が必要なことを示しています。フィールド幅が大きければ、さらに多くの命令が必要です。Thumb-2コア技術では、この限界がありません。またARMコードでは、中間値のためのレジスタが1本余計に必要です。


ビットリバーサル命令

この命令は、ソースレジスタの各ビットをデスティネーションレジスタのビット[n]からビット[31-n]へ転送します。ビットリバーサル命令を使わずにこれを行うには、命令15本のシーケンスで全部のビットをリバースするまで少しずつスワップを続けるなど、多数の方法があります。しかし、これにはワーキングレジスタも必要です。したがってビットリバーサル命令は、命令数を大幅に節約します。ビットリバーサルは、FFTなどのDSPアルゴリズムに使用されます。


16ビット定数

プログラム定数の処理を柔軟に行うため、2本の新しい命令がARM 32ビット命令セットおよびThumb 32ビット命令セットに追加されました。1つはMOVW命令で、レジスタに16ビット定数をロードし、結果をゼロ拡張するものです。もう1つはMOVT命令で、16ビット定数をレジスタの上半分にロードします。32ビット定数をレジスタにロードするには、この2つの組み合わせを使います。これがよく使用されるのは、ペリフェラルの1本以上のレジスタにアクセスする前にペリフェラルのアドレスをロードするときで、現在はリテラルプールが使用されています。リテラルプールとは、命令ストリームに組み込まれた32ビット定数群で、プログラムカウンタを基準にアクセスされます。

リテラルプールは、定数をストアし、それにアクセスするために必要なコードサイズを抑えるのに有効です。しかし、ハーバードアーキテクチャを実装するコアではオーバヘッドが発生します。このオーバヘッドとは、命令ストリームに含まれる定数をコアのデータポートで使用可能にするために必要なサイクル数です。つまり、定数をデータキャッシュにロードするか、プロセッサのデータポートからプログラムメモリにアクセスできることを指します。

定数を半分に分け、2本の命令に組み込めば、定数が既に命令ストリームにあることになり、データアクセスは不要となります。これは、小型のリテラルプールに有効です。定数にアクセスするためのサイクル数が減ることで性能が改善され、事実上、定数にアクセスする際の消費電力が削減されるからです。


テーブル分岐命令

テーブルを使い、変数の値に基づいてプログラムフローを制御するのは、高級言語に一般的な機能です。これは、ARMおよびThumb命令セットについても当てはまります。ARMは高性能コードに使用されることが多く、コンパイラがサイズを犠牲にして速度を優先したコードシーケンスを選択する傾向があります。逆にThumbコンパイラは、パックデータテーブルを使ったコードシーケンスで、組み合わせたコードとテーブルが使用するメモリを最小限に抑える傾向があります。

Thumb-2コア技術では、両方のテクニックの長所を組み合わせたテーブル分岐命令を使用します。このため、パックデータに使用する命令数が最小限となり、極めて少ないコードおよびデータフットプリントで最大限の性能を発揮します。


IT - if then

ARM命令セットには、すべての命令を条件付きで実行する機能があります。この機能は、コンパイラが短い条件節を構成するコードを生成する際に有効です。しかし、Thumb 16ビット命令のエンコードスペースには、この機能を維持するに十分なスペースがないため、Thumbコンパイラにこの機能はありません。

しかしThumb-2コア技術には、同様のメカニズムを提供する命令があります。このIT命令は、ステータスレジスタに含まれる1本以上の条件フラグに基づいた条件コードのうち、1つの条件コードに基づく最大4本のThumb命令実行をプレディケートします。これにより、ThumbコードがARMコードに近いレベルの性能を発揮します。


ARM Thumb Thumb-2
LDREQ r0,[r1] BNE L1 ITETE EQ
LDRNE r0,[r2] LDR r0, [r1] LDR r0, [r1]
ADDEQ r0, r3, r0 ADD r0, r3, r0 LDR r0, [r2]
ADDNE r0, r4, r0 B L2 ADD r0, r3, r0
  L1 ADD r0, r4, r0
  LDR r0, [r2]  
  ADD r0, r4, r0  
  L2  

上記の例では、ARMコードが16バイト、Thumbコードが12バイト、Thumb-2コア技術コードが10バイトを使用しています。ARMコードは実行に4サイクル、Thumbコードは4〜20サイクル、Thumb-2コア技術コードは4または5サイクルかかります。Thumbのサイクル数は、分岐が正確に予測されるかどうかによって決まります。Thumb-2コア技術の場合、IT命令を分岐命令と同様にフォールドできるため、サイクル数が5から4に減っています。


ゼロ比較&分岐 - CZB

この命令は、ゼロ比較の後に分岐命令が続く一般的なシーケンスの代用となります。目的は通常、アドレスポインタのテストです。新しい32ビットThumb命令には、プログラムフロー制御、データ処理、ロード/ストア命令のほか、コプロセッサアクセス命令が含まれます。コプロセッサアクセス命令によって、コプロセッサの中でも、初めてベクタ浮動小数点(VFP)ユニットに対応するThumbコードの記述が可能となりました。システムレジスタにアクセスする命令に加え、この命令によって、ARMステートに切替えて特殊機能にアクセスする必要がなくなり、アプリケーション全体をThumbステートで記述することが可能となります。


ケーススタディ:アプリケーションの例

表1は、既存のARM-Thumb実装をThumb-2コア技術でコンパイルする効果を示しています。

1Mbのアプリケーションは元々、コードの80%をThumb命令にして最高のコードを実現し、残りの20%をARM命令にして必要な性能を得ています。コードすべてをThumb-2コア技術でコンパイルすると、90kバイト、すなわち9%が全体として節約されます。

ARM Thumb-2
200k 150k
Thumb Thumb-2
800k 760k
表1 Thumb v4のコード生成

しかし、性能を優先したARMコードは、キャッシュまたは密結合メモリに常駐するのが通常です。密結合メモリに常駐するコードについてのみ、Thumb-2コア技術を使ったコード生成の効果を分析しても、オンチップメモリを大幅に効率的に使用することがわかります。使用できる命令TCMが128kとして、50%をARMコード、50%をThumbコードが使用すると、15%のメモリ節約になります。

ARM Thumb-2
64k 48k
Thumb Thumb-2
64k 61k
表2 キャッシュ/TCMメモリの節約


まとめ

Thumb-2コア技術は、ARMアーキテクチャを大幅に強化するものであり、従来、ARMアーキテクチャで可能だったよりも高いコード密度で性能を提供します。また、プログラムフロー、プログラムの効率性、コードサイズをさらに改善する多数の新しい機能を備えています。このような利点は、機能豊富なエンドユーザ機器を作る総合的な基盤を提供します。そして設計者は、より多くの機能をデバイスに搭載するとともに、優れた電力特性や性能特性を得ることが可能となります。

page top

UKサイト お問い合わせ サイトマップ このサイトについて
Copyright