ARM Cortex-M4は、M3にDSP(SIMD,MAC)命令を追加したものだが、Cortex-M4Fと呼ばれるものは、さらに単精度のFPU(浮動小数点ユニット)を持っている。どれくらい効果があるものか、三角関数の計算で速さを比較してみた。
方法
Cortex-M4Fをコアに持つLPC4370を用い、FPUを使った場合と使わない場合で、三角関数の計算1万回にかかる時間を比較する。
- マイコンボード: LPC-Link2 (LPC4370搭載 / 動作クロック204MHz)
- 開発環境: LPCXpresso v8.1.4_606
- DSPライブラリ: CMSIS_DSPLIB_CM4 v3.20
三角関数は下記の3種類を使用する。
関数 | ヘッダファイル | 説明 |
---|---|---|
double sin(double) | math.h | ANSI標準ライブラリの倍精度実数のsin関数 |
float sinf(float) | math.h | ANSI規格外の単精度実数のsin関数 |
float arm_sin_f32(float) | arm_math.h | CMSIS DSPライブラリの単精度実数のsin関数 |
下記のようなコード(抜粋)をもちい、実行時間をオシロスコープで測定する。
while(1) { // 三角関数を1万回計算する for( float x=0.0f; x<10.0f; x+=0.001f){ //volatile float y = sin(x); // ANSI標準 倍精度版 //volatile float y = sinf(x); // ANSI規格外 単精度版 volatile float y = arm_sin_f32(x); // CMSIS DSPライブラリ版 } // テストピンをパタパタさせてオシロで計測 if(toggle){ Chip_GPIO_SetPinOutHigh(LPC_GPIO_PORT, TEST_PORT, TEST_PIN); }else{ Chip_GPIO_SetPinOutLow(LPC_GPIO_PORT, TEST_PORT, TEST_PIN); } toggle = !toggle; }
FPUを使用する設定 (LPCXpressoの場合)
プロジェクト作成時のウィザードの「Floating point unit」で「Enabled_SoftABI」を選択する。「Disabled」を選択するとFPUは無効になる。
もしくは、プロジェクト作成後にプロジェクトのPropertiesで次のように設定する。
- C/C++ Build > Settings > MCU C Compiler > Architecture で
- Floating point を「FPv4-SP(Soft ABI)」に設定する。
- C/C++ Build > Settings > MCU Linker > Architecture で
- Floating point を「FPv4-SP(Soft ABI)」に設定する。
※ Soft ABIでなくHard ABIを選ぶと、関数の引数も浮動小数点レジスタで渡されるのでより高速になるが、ライブラリも含めてリンクされる全てのコードをHard ABIでビルドする必要がある。
CMSIS DSPライブラリを使用する設定 (LPCXpressoの場合)
プロジェクト作成時のウィザードの「CMSIS DSP Library to link project to」で「CMSIS_DSPLIB_CM4」を選択する。
もしくは、プロジェクト作成後にプロジェクトのPropertiesで次のように設定する。