英ARMは、Cortex-A72の詳細情報などと合わせて、組み込み系プロセッサやmbed OSなどについても情報のアップデートを行った。ここでは、それらをいくつかまとめて紹介する。

組み込み向けのハイエンドプロセッサ「Cortex-M7」

ARM系のプロセッサは、大きくアプリケーションプロセッサ、組み込み系、リアルタイム系と分かれていて、前回紹介したCortex-A72は、アプリケーションプロセッサの1つ。このクラスは仮想記憶や仮想マシン、情報保護といった機能を備え、高度な機能を持つOSと組み合わせてスマートフォンやタブレットなどに使われる。

これに対して組み込み向けはCortex-M系列のプロセッサが対応する。このクラスは仮想記憶などを行うMMU(メモリ管理ユニット)がなく、命令体系もシンプルものになっている(Thumb-2 短縮命令セット)。

わずか0.08ミリ角になるCortex-M0から、スーパースケーラー構造で浮動小数点演算も可能なCortex-M7まで5種のプロセッサをそろえる。このうち、Cortex-M7は、組み込み向けの「ハイエンド」プロセッサ。プロセッサのおおまかな構造は(図2)のようになる。

図1:組み込み向けのCortex-M系列には、M0からM7までの5つのプロセッサコアがある

図2:Cortex-M7は、M系列で最も高性能なプロセッサ。なお、ARMのプロセッサは、これをベースに半導体メーカーが実際のプロセッサを作り、オプションとなっている機能がいくつかある

PC用などの一般的なプロセッサで見慣れないのが「TCM:Tightly Coupled Memory」だ。これは、プロセッサ外部に置くスタティックメモリ(同期SRAMを最大16メガバイトまでサポート)で、命令コード用(64bit幅)とデータ用(32bit幅×2、アドレスの下位3ビット目で切り替え)がある。

図3:TCMは外部メモリよりも高速なSRAMなどを接続して、命令、データのアクセスを高速化するしくみ。ただしオプションの機能

組み込み系では、プログラムの格納にフラッシュメモリを使うことが多いが、その読み書きの速度に対して、組み込み系のプロセッサは高速になりつつある。以前は、プログラムはNOR型フラッシュ、データストレージはNAND型といった使い分けもあったが、速度が出ないNAND型のみが大容量化したためにコストが下がったという状況もある。

高速なプロセッサであるCortex-M7ともなれば、そのメモリとの速度差はかなり大きくなる。そこで、割り込みなど高速に対応するプログラムや必要なデータなどをTCMに置いておき、必要に応じて利用するわけだ。

また、TCMは設定でメモリ空間に割り当てることができるため、見かけ上はプログラムやデータへのアクセスが高速化したようになり、アクセスに専用の命令を使う必要もない。ただし、事前にプログラムやデータをTCMに入れておくという処理は必要となる。また、TCMに使うSRAMが不揮発性の場合、ここから起動する機能もあるようだ。

TCMはオプションの機能ではあるが、Cortex-M7を高いクロックで実行させる場合には重要となるだろう。一般に組み込み系では、フラッシュメモリなどに書き込まれた命令やデータをメインメモリに展開して実行する(アプリケーションプロセッサなどはこのようにして高速なメインメモリをアクセスする)ことはあまり行われない。

その理由としては、電源オンやリセット後のシステム起動の仕組みが複雑になり時間がかかること、メインメモリ量が増えコストが上がることに加えて、用途によってはノイズによる影響の可能性や、メモリが書き換えられてしまうというセキュリティ的なリスクなども挙げられる。

ただし、Cortex-M7はTCMのほか、オプションで命令用やデータ用のキャッシュを装備することも可能だ。キャッシュの場合、初回にメモリからキャッシュに取り込む時間はかかるが、1回キャッシュに入ってしまうと、高速化が期待できる。

組み込み系では、あまり大きなプログラムを使うことはないため、使い方に対して適切なキャッシュを装備することで、フラッシュメモリとの速度差の問題はある程度防ぐことができる。また、キャッシュの場合、TCMのように事前にプログラムやデータをロードしておく必要はない。

Cortex-M7のさらなる詳細

さて、肝心のCortex-M7のパイプラインだが、(図4)のようになる。フェッチされた命令はInstraction Buffer(写真左端のグレーのボックス)、Instruction Decorder、Intenger Register Fileを経て、9つの実行ポートへと発行される。

図4:Cortex-M7のパイプライン。インオーダーだがスーパースケーラー構造を取る。2×ロード、2×整数演算パイプ、MAC(積和)、ストア、分岐、浮動小数点演算、浮動小数点乗算/除算/ルート演算の9つの実行パイプを持つ

実行ポートは、

  • 2つの32bitロードパイプ
  • 2つの整数演算ALUパイプ
  • 積和パイプ
  • ストアパイプ
  • ブランチ
  • 浮動小数点用演算パイプ
  • 浮動小数点、乗算、除算、ルートパイプ

となっている。2つの32bitロードパイプは、組み合わせて使うことで64bitデータのロードに対応できる。また、2つの整数演算パイプは、それぞれ構造が異なり、シフトと演算が別ステージになっているものと、1ステージ分処理を遅らせてシフトまたは演算のどちらかを行うものになっている。これはロード命令と組み合わされる演算命令の処理を考慮したものだ。

メモリからロードされたデータは、レジスタファイルへの書き込みとは別のパスを使って整数演算パイプに渡すことができ、このとき、1ステージずらした演算パイプだと、パイプラインをストールせずに演算に入ることができる。

また、浮動小数点命令も開始を1ステージずらしてあり、ロードして演算という命令の組み合わせに対応できる。浮動小数点演算は、加算などの単純演算用と乗算、除算、ルート演算用の2つに分かれており、浮動小数点の積和演算の場合には2つのパイプをつなげて演算を行う。倍精度浮動小数点演算も可能だが、Cortex-M7は、単精度浮動小数点演算に最適化されている。

図5:浮動小数点演算は、単純演算と複雑演算(乗除算など)の2つのパイプにわかれていて、積和演算の場合には、2つのパイプをつなげて処理する

なお、Cortex-M7は、スーパースケーラー構造だが、実行はインオーダーで、特定の条件(整数演算と浮動小数点演算など)でのみ2命令を同時に発行できる。整数演算などは4ステージ、ストアや浮動小数点パイプは5ステージとなっている。

Cortex-M7は、組み込み系にしては「リッチ」な内部構造を持つも、回路構成からするとかなり高速で、逆にフラッシュメモリとの速度差が大きく、この点ではTCMなどを使わないと高速化できないことがある。

用途としては、ディスプレイを備え、タッチ操作や音声操作などが可能なものや、通信機能を持つもの、多数のモーターなどを同時制御する組み込み機器などが想定されている。家庭内でいえば、高性能な白物家電などが相当する。

また、映像関連の組み込み機器(テレビやレコーダー)は、もはやCortex-Aの領域だが、オーディオ機器などのほか、工作機械や自動車の機能モジュール、ドローンといった、ある程度の性能が要求されるが高性能なOSを動かさない組み込み機器もCortex-M7の対象となる。

組み込み機器でも年々、プロセッサに求められる性能は上がっており、IoTではさらに多数の組み込み機器が登場することを考えると、高性能なものはM7が使われることになると想定されている。