Cortex-A9プロセッサの概要
Cortex-A9プロセッサはArmv7-Aアーキテクチャで、1コアから4コアまでのマルチコア構成が可能なプロセッサです。
オプションで、VFP-v3-D16またはNEONメディアプロセッシングエンジンとTrustZoneセキュリティ拡張機能を搭載することで、システムの高性能化と信頼性向上が可能です。
Cortex-A9でのプログラムフロートレース(PTM:Program Trace Macrocell)やパフォーマンス監視ユニットを使用して、プログラムの挙動を確認することができます。
Cortex-A9は次の特徴を備えています。
- 可変長の多重発行パイプライン
- レジスタリネーミング
- 投機的なデータプリフェッチ
- 分岐予測とリターンスタック
- 高速ループモードによる電力削減
- TrustZone拡張によるセキュリティ向上
- L1データ、命令キャッシュ搭載
Cortex-A9 MPCoreの概要
Cortex-A9 MPCoreは最大4プロセッサで、AMP(Asymmetric Multiprocessing:非対称型マルチプロセシング)またはSMP(Symmetric Multiprocessing:対称型マルチプロセッシング)のマルチコア構成に対応することが可能です。
Cortex-A9 MPCoreは次の特徴を備えています。
スヌープ制御ユニット
SMP動作時のプロセッサ間のL1データキャッシュのコヒーレンシを管理します。MESIプロトコル(*1)の修正版を使用します。
汎用割り込みコントローラ
プロセッサ間通信およびシステム割り込みのルーティングと優先順位付けを行います。
プライベートタイマとウォッチドッグタイマ
各プロセッサは、プライベートタイマとウォッチドッグタイマを持っています。
グローバルタイマ
64ビットカウントアップタイマが一つあります。クラスタ内の全てのCPUが参照可能です。
(*1)MESIプロトコルとは?:マルチプロセッサシステムでメモリやキャッシュの同期をとるキャッシュコヒーレンシとメモリ一貫性のプロトコルであり、ライトバック方式のキャッシュで広く使用されています。
Cortex-A9の特徴的な機能
Cortex-A9プロセッサの特徴的な機能について説明します。
レジスタリネーミング機能
命令実行効率を上げるためには、メモリへのデータアクセスをできるだけ少なくし、レジスタ間で処理を行うことで、プログラムを高速に実行できるようになります。しかし、すべての処理をレジスタ間で行うことはできません。
プログラムを開発する場合に、関数呼び出しは「AAPCS(Armアーキテクチャのプロシージャコール標準)」で規定されており、すべてのレジスタを利用することは出来ません。プロセッサアーキテクチャで、レジスタ数を増やすことは、命令セットアーキテクチャを変更することになり、簡単に変更することはできません。
「MOV{S}<c>.W <Rd>、 #<const>」命令では、「Rd」フィールドがレジスタ番号を4ビットで示しています。他のビットがすべて使用されていることから、「Rd」フィールドを増やすことが容易でないことはご理解いただけると思います。
その解決方法として、Cortex-A9では「レジスタリネーミング」機能を搭載しています。
アーキテクチャレジスタと物理レジスタ
Cortex-A9プロセッサは、2つのクラスのレジスタを持っています。
- ソフトウェアで使用するアーキテクチャレジスタ(r-0r15、cpsr)。
- プロセッサに物理的に実装されている物理レジスタ(p0-p55)と仮想フラグ(flg0- flg7)。仮想フラグ(flg0- flg7)は、cpsrのフラグNZCV、GE、Qビットのコピーを持っています。
コーディングやデバッグでは、アーキテクチャレジスタを使用し、物理レジスタを使用することはできません。
レジスタリネーミング動作例
連続するSTR命令(*2)とLDR(*3)命令が連続して実行する場合について、レジスタリネーミングの動作を説明します。アーキテクチャレジスタでは、異なるアドレスに対して、ストアデータとロードデータで同じレジスタ(r0)を使用するので、STR命令が完了するまで、LDR命令を実行することはできません。
Cortex-A9プロセッサが自動的に物理レジスタに置き換えを行い、STR命令のr0=p0/r1=p1に、LDR命令のr0=p2/r2=p3にリネーミングします。同一レジスタを使用しませんので、STR命令とLDR命令を同時に実行することが可能となります。
仮想フラグ動作例
CMP命令(*4)の実行結果はcpsrレジスタのNZCVフラグを更新します。
アーキテクチャレジスタで実行した場合、2つのCMP命令はレジスタ依存性がないので、同時に実行することが可能ですが、cpsrレジスタは1つしかないので、2命令を同時実行する事は出来ません。Cortex-A9プロセッサが自動的に仮想フラグを使用することで、2つのCMP命令を2つの仮想フラグ(flg_0とflg_7)で使用することにより、2命令を同時に実行することが可能となります。
(*2)「STR r0、[r1]」命令は、ワードデータ(32ビット)をr0レジスタの値をr1レジスタが示すアドレスにライト動作を行う命令です。
(*3)「LDR r0、[r2]」命令は、r2レジスタが示すアドレスからワードデータ(32ビット)をr0レジスタにリード動作を行う命令です。
(*4)「CMP r0、r2」命令は、r0-r2の減算を行い、cpsrのNZCVフラグを更新します。
高速ループモード動作
64バイト未満の命令を実行する場合、命令プリフェッチステージにおいて、高速ループモードが自動的に動作し、プリフェッチユニットがキャッシュアクセスを行うことを停止することで、消費電力の削減を行います。
分岐予測とリターンスタック
Cortex-A9は、命令側L1メモリシステムに分岐予測機能を搭載しています。分岐予測機能として、次の3つの機能で構成されています。
- 分岐先アドレスキャッシュは、分岐命令の分岐先のアドレスをキャッシュします。512エントリの分岐先アドレスキャッシュを持ち、2ウェイ×256エントリとして構成されています。
- 8エントリのリターン専用のスタックが実装され、特定の命令がフェッチされることで、リターンアドレスを予測します(BL、 BLX
、 BLX の各命令が認識されます)。リンクレジスタの値が、リターンスタックにプッシュされます。 - グローバル履歴バッファとして、最後の4096個の分岐状態を4つのステート(Strongly not taken、Weakly not taken、Weakly taken、 Strongly taken)で管理します。
名称 | 意味 |
---|---|
Strongly not taken | 分岐しない(可能性大) |
Weakly not taken | 分岐しない(可能性小) |
Weakly taken | 分岐する(可能性小) |
Strongly taken | 分岐する(可能性大) |
分岐予測はリセット時に無効設定されるため、初期化処理で有効に設定する必要があります。
分岐予測はCP15(コプロセッサ15)のSCTLR(システム制御レジスタ)のZビットで設定します。
分岐予測とは何か?
分岐予測とは、プログラム中の分岐命令が分岐するか否かを予測して、命令パイプラインの効果を持続させる機能です。繰り返し処理(C言語のfor/whileなどのループ)を利用した場合を考えてみましょう。
100回ループするfor文の場合、ループカウンタの比較を行い、条件分岐命令を実行します(【サンプルプログラム例】のCMP命令とBLT命令で、for文のループカウントを行っています)。
分岐予測を分岐すると予測すれば、99回の分岐予測が成功し、1回の分岐予測失敗となります。しかし、多重ループの場合やループ回数が少ない場合、分岐予測の成功率は低下するので、分岐先アドレスキャッシュやグローバル履歴バッファを使用して命令パイプラインの効果を維持します。
Cortex-A9プロセッサの制御方法の概要
設定方法の基礎知識とキャッシュを利用するための基礎知識とパフォーマンス監視ユニットについて説明します。
コプロセッサとは?
プロセッサの機能設定は、コプロセッサの設定で行います。
コプロセッサは、バスインタフェースユニットに接続されていません。専用命令(MRC命令/MCR命令)を使用して設定を行います。プロセッサモードにより、アクセスが制限される場合があります。ご利用のプロセッサの「テクニカルリファレンスマニュアル(*5)」を参照ください。
- コプロセッサは、16個のコプロセッサが定義されています。
- CP15(コプロセッサ15)は、システム制御機能を提供します。
- CP11(コプロセッサ11)は、倍精度の浮動小数点演算をサポートします。
- CP10(コプロセッサ10)は、単精度の浮動小数点演算に加えて、VFPアドバンスドSIMDの両方のアーキテクチャの機能拡張をサポートします。
(*5)英語版「Cortex-A9 Technical Reference Manual Revision:r4p1」または、日本語版「Cortex-A9 テクニカルリファレンス マニュアルリビジョン:r2p2」を参照ください。
名称 | 略称 | R/W | 命令 |
---|---|---|---|
システム制御レジスタ | SCTLR | R | MRC p15, 0, <Rd>, c1, c0, 0 |
W | MCR p15, 0, <Rd>, c1, c0, 0 | ||
補助制御レジスタ | ACTLR | R | MRC p15, 0, <Rd>, c1, c0, 1 |
W | MCR p15, 0, <Rd>, c1, c0, 1 |
キャッシュを使用するには?
キャッシュを使用するためには、MMU(メモリマネージメントユニット)で、メモリタイプとキャッシュの構成を学ぶ必要があります。
メモリマネージメントユニットの動作概要
仮想アドレスから物理アドレスへのアドレス変換は、MMUとTLB(トランスレーション・ルックアサイド・バッファ)を使用します。アドレス変換は、テーブルウォークユニットで変換テーブルを参照して自動的に変換を行い、TLBのキャッシュも行います。
変換テーブルに、メモリタイプ(ノーマル・デバイス・ストロングリオーダ)・キャッシュ属性・バッファ属性を設定することができます。変換テーブルは、レベル1変換テーブルとレベル2変換テーブルで構成します。レベル1変換テーブルのページサイズは、1Mバイトと16Mバイトを選択することが可能で、レベル2変換テーブルを使用することで、より細かい64Kバイトと4Kバイトを選択することが可能になります。
メモリタイプ
Armアーキテクチャでは、3種類のメモリタイプを定義しています。ノーマルメモリが、キャッシュとバッファ可能なメモリタイプとなります。
- Cortex-Aシリーズは、メモリマネージメントユニットで設定します。
- Cortex-Rシリーズは、メモリプロテクションユニットで設定します。
- Cortex-Mシリーズは、メモリマップが固定されています。
メモリタイプ | 概要 |
---|---|
ノーマルメモリ | アプリケーションのコードとデータ領域のメモリタイプをノーマルと指定します。命令フェッチはメモリタイプをノーマルと指定した領域からのみ行えます。キャッシュ可能・バッファ可能です。 |
デバイスメモリ | ペリフェラル用のメモリタイプです。他のデバイスアクセスに対して、アクセス順序を保障しなければなりません。キャッシュ禁止・バッファ可能です。 |
ストロングリオーダメモリ | マルチプロセッサをターゲットとしたメモリモデルです。キャッシュ禁止・バッファ禁止です。 |
L1キャッシュの構成
命令キャッシュとデータキャッシュは、リセット時に無効となりません。手動で無効化および有効化を行うことが必要になります。
キャッシュ・ロックダウン(*6)は、Cortex-A9には実装されていません。データキャッシュは、ノンブロッキングキャッシュ(*7)で、4つの独立したリード・ライトをサポートします。
項目 | 設定値 | 備考 |
---|---|---|
サイズ | 16Kバイト / 32Kバイト / 64Kバイト | 実装時に設定 |
ラインサイズ | 8ワード | — |
構成 | 仮想インデックス、物理タグ | — |
パリティ | オプション | — |
項目 | 設定値 | 備考 |
---|---|---|
サイズ | 16Kバイト / 32Kバイト / 64Kバイト | 実装時に設定 |
ラインサイズ | 8ワード | — |
構成 | 物理インデックス、物理タグ | — |
パリティ | オプション | — |
(*6)キャッシュ・ロックダウン:重要なコードとデータをキャッシュにロードし、それらを保持するキャッシュ・ラインが後で再割り当てされないようにできます。これにより、以降のコードやデータに対して行われるアクセスは必ずキャッシュ・ヒットとなります。
(*7)ノンブロッキングキャッシュ:キャッシュミスが生じると、メインメモリからキャッシュへのデータ転送が行なわれている間、キャッシュへのアクセスができなくなり、命令の実行が停止します。これに対し、ノンブロッキングキャッシュシステムを備えた場合、キャッシュミスを保持しながら、CPUからキャッシュへのアクセスを継続して行なうことができるようになります。
データのプリフェッチ機能
プロセッサで発生したキャッシュミスを監視する自動プリフェッチ機構を実装しています。このユニットは、2つの独立したデータストリームを監視およびプリフェッチできます。CP15 ACTLR(補助制御レジスタ)の「L1 prefetch enable」を有効にすることができます。
PMU(パフォーマンス監視ユニット)
PMUは、プロセッサコアの実行を妨げることなくプロセッサの動作情報を取得する機能があります。
Cortex-A9は、サイクルカウンタと任意の項目が測定可能な6個のイベントカウンタが搭載されています。カウンタサイズは、32ビットサイズでオーバーフローした場合、割り込みを発生させることも可能です。
サイクルカウンタ
実行サイクルをカウントします。
イベントカウンタ
設定したイベント(要因)を選択することで、発生回数を測定することができます。測定項目としては、キャッシュミス、TLBミス、分岐予測のパフォーマンス、パイプラインストール、メモリアクセス等の項目を測定することが可能です。Armv7-A/Rコア共通測定項目は、「Armアーキテクチャリファレンスマニュアル Armv7-AおよびArmv7-Rエディション」を参照ください。プロセッサ毎の測定項目に関しては、「テクニカルリファレンスマニュアル」を参照ください。
イベント番号 | 内容 | 測定結果 |
---|---|---|
0x50 | コヒーレントラインフィルミス Cortex-A9プロセッサで実行され、他のCortex-A9プロセッサすべてでミスしたコヒーレントラインフィル要求の数をカウントします。これは、その要求が外部メモリに送信されたことを意味します。 | 正確 |
0x51 | コヒーレントラインフィルヒット Cortex-A9プロセッサで実行され、他のCortex-A9プロセッサでヒットしたコヒーレントラインフィル要求の数をカウントします。これは、ラインフィルデータが該当のCortex-A9キャッシュから直接フェッチされたことを意味します。 | 正確 |
まとめ
Cortex-A9プロセッサは、組み込み開発で一般的に利用されているマイクロコントローラと異なり、キャッシュ・MMU・分岐予測などの機能が搭載されています。その結果、最適なパフォーマンスを発揮させるためには、各機能を理解することが開発を行ううえで重要です。
こちらも是非
“もっと見る” Cortex-A編
初期化処理
リセット例外からmain()関数を呼び出すまでの初期化は、ユーザが作成する部分とArmコンパイラが実行する部分に分けることができます。コードのコピーや初期化変数/未初期化変数の初期化は、リンカのメモリ配置設定を処理系ライブラリが実行します。
PMU(パフォーマンス監視ユニット)
PMUに関連するレジスタは、ユーザモードでのアクセスは禁止されていますので、PMUSERENR(ユーザイネーブルレジスタ)を特権モードでユーザモードアクセス許可を設定します。PMUSERENRについては、 後述の該当項目を参照ください。
TrustZone(セキュリティ拡張機能)
TrustZoneはCortex-Aシリーズの拡張機能で、大規模OSやアプリケーションが動作するノーマルワールドとセキュリティ関連が動作するセキュアワールドを導入しています。TrustZoneでは、ノーマルワールドメモリ空間とセキュアワールドメモリ空間の分離が可能です。