Armv8-Mでパフォーマンスと開発効率を最大化
本記事では、Armv8-Mベースラインアーキテクチャが提供するパフォーマンスの向上、特にCortex-M0/M0+の強化された機能について探ります。これらのコアは、8/16ビットのマイクロコントローラを置き換えるために、あるいは低コストと低消費電力が重要な要素となるデバイスで広く使用されています。そして今、Cortex-M23(Armv8-Mベース)により、より強力な代替手段となる、いくつかの注目すべきパフォーマンスの向上が見られます。
Cortex-M0/M0+の性能アップ
Cortex-M0/M0+は8/16ビットマイコンの置き換えや低コストや低消費電力が必要なデバイスで採用されることが多いのです。そのために、Armv6-Mの採用された命令が限られています。これに対して、CPUコアとしてはCortex-M23(アーキテクチャとしてはArmv8-M Baseline)では、以下の命令が追加/レベルアップされました。
- ハードウェア除算
- Compare and branch(CBZ, CBNZ)命令
- Long Branch(B)命令
- 16ビット即値が使えるMOV命令
それぞれについて確認をしていきます。
ハードウェア除算
Cortex-M0/M0+にはハードウェア除算器がありませんでした。Cortex-M0/M0+をお使いの方からは、「C言語でプログラム書いているが、除算は出来ているぞ」とお言葉を頂くかもしれません。それはそうなのですが、除算器が無い場合には、コンパイラはソフトウェアのライブラリを使用するようにコードを生成します。
Armv8-M Baselineではハードウェア除算の命令が追加されたことで、除算を実行する場合の実行速度の向上と除算のソフトウェア・ライブラリが不要になることによりコードサイズ小さくすることができます。signedの除算を使ったところCortex-M0+とCortex-M23ではコードサイズでいうと224バイトの差が出ています。
CortexM23の資料を見るとハードウェア除算器は、Fast (17 cycles) または slow (34 cycles)となっています。実行速度はソフトウェア・ライブラリの場合には、データ値により必要となる実行サイクルが変わるのですが、手元でいくつかのデータで試したところハードウェア除算器に比べるとソフトウェア・ライブラリだと2倍から5倍程度時間がかかっていましたので、除算を使うアプリケーションではかなり高速化が期待できます。
Compare and branch(CBZ, CBNZ)命令
C言語のプログラムでは、変数の値がゼロだったら処理するとか、あるいは、変数の値が非ゼロだったら処理するといった記述がよく使われます。たとえば、以下のif文などが該当します。Cortex-M0+ではゼロと比較(CMP命令)して、その結果がNot Equal(NE)の場合にはジャンプして後続の命令をスキップします。このため2命令(CMP命令とBNE命令)を使っていましたが、Cortex-M23ではCBNZ命令で実現することが出来ます。
ちなみにCBZ/CBNZ命令はCortex-M3/M4/M7では採用されていますので、ソフトウェアの再利用性でもよい選択になっています。
Long Branch(B)命令
Cortex-M0/M0+のジャンプ(B)命令を見ると即値を使ってジャンプできるのですが、その指定範囲が-2048から2046です。しかし、ソフトウェアが大きくなってくると即値でジャンプが出来なくなるケースが増えてきます。その場合には複数の命令でジャンプする必要があります‘。例えば、メモリ上のジャンプアドレスをレジスタに読込、そのレジスタの値でジャンプする方法などが使用されます。Cortex-M23ではこの即値で指定出来る範囲が-16,777,216から 16,777,214と大きくなりました。
16ビット即値が使えるMOV命令
Cortex-MにはMOV命令があり、レジスタに定数値を設定する際によく使用されます。
たとえば、以下のようなa=301;のようなケースです。Cortex-M0+では即値が255までしか扱えないので、MOVSで最初に255をレジスタに設定し、次のADD命令で+46をしています。Cortex-M23では16ビットの即値が扱えるので1つのMOV命令でレジスタへ301と言う値を設定することが出来ます。
こうした命令の追加により、性能向上がしています。MHzあたりのCoreMarkベンチマークのスコアが以下になります(参考文献[1]よりCortex-M0/M0+/M23のスコアを抽出)。
CPUコア |
CoreMark/MHz |
Cortex-M0 |
2.33 |
Cortex-M0+ |
2.42 |
Cortex-M23 |
2.5 |
次回に向けて
次回のブログでは、Armv8-Mアーキテクチャにおけるセキュリティの改善について取り上げ、TrustZoneやその他の機能が組み込みシステムをどのようにより安全なものにしているかを探ります。
IAR Embedded Workbench for ARMは、Armv8-M(Cortex-M23、Cortex-M33)を含むCortex-Mファミリー全体をサポート。標準マイコンであるCortex-Mに対して、統一的な開発環境を提供します。これらの優れたマイクロコントローラで、可能なことをさらに広げることができます。
本シリーズのそのほかの記事はこちら
Cortex-M23およびCortex-M33におけるArmv8-M アーキテクチャ徹底解説
TrustZoneの深層にせまる:組み込みシステムのセキュリティ強化
参考文献
[1] Armv8-M Memory Model and Memory Protection Version 1.1 User Guide