概要
今回はdsPICシリーズに初搭載されたFPUの性能について検証します。
| 記事 | リンク | |
| 第1回 | dsPIC33AKシリーズについて | dsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第2回 | 開発ボード、コンフィグレーション設定、クロック設定について | dsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第3回 | CPU性能について | dsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第4回(本記事) | FPU性能について | |
| 第5回(予定) | DSP性能について |
開発環境
開発環境は以下のとおり。
| 項目 | 値 | リンク |
| ベースボード | dsPIC33A CURIOSITY PLATFORM DEVELOPMENT BOARD | dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com) |
| CPUボード | EV68M17A – dsPIC33AK128MC106 Motor Control DIM | dsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com) |
| 統合開発環境 | MPLAB X IDE v6.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |

| 項目 | 値 | リンク |
| ベースボード | dsPIC33CH CURIOSITY DEVELOPMENT BOARD | DSPIC33CH CURIOSITY DEVELOPMENT BOARD | Microchip Technology |
| 統合開発環境 | MPLAB X IDE v6.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |
今回の実験のコンフィクレーションおよびクロックの設定は第2回の記事のとおりとします。
FPU概要
dspPIC33AKシリーズのFPUは単精度(*1)と倍精度(*2)をサポートするIEEE 754-2019準拠の浮動小数点ユニットです。従来のdsPICはFPUが搭載されていませんでしたので固定小数点演算などで演算をしていましたが、速度や精度が劣るという問題が有りました。もちろんこれまでもfloatやdoubleは扱えたのですが、非常に遅くクリティカルな速度が求められる部分に関しては用いられなかったと思われます。
浮動小数点演算ユニット(FPU)の単精度とは、32ビットの浮動小数点数(float)を扱う能力を指します。単精度浮動小数点数は、IEEE 754規格に基づいて表現されます。単精度浮動小数点数の構造は以下の通りです:
1.符号ビット(Sign bit):1ビット。数値の正負を示します。0は正、1は負を意味します。
2.指数部(Exponent):8ビット。数値のスケーリングを行うための指数を示します。
3.仮数部(Mantissa または significand):23ビット。数値の精度を保持する部分です。設計の重要なポイントです。
これにより、単精度浮動小数点数は約7桁の10進数の精度を持ち、指数範囲は約 10^-38から 10^38 までを表現できます。
倍精度浮動小数点数(double precision)とは、64ビットの浮動小数点数を扱う能力を指します。倍精度浮動小数点数も、IEEE 754規格に基づいて表現されます。倍精度浮動小数点数の構造は以下の通りです:
- 符号ビット(Sign bit):1ビット。数値の正負を示します。0は正、1は負を意味します。
- 指数部(Exponent):11ビット。数値のスケーリングを行うための指数を示します。
- 仮数部(Mantissa または significand):52ビット。数値の精度を保持する部分です。
これにより、単精度浮動小数点数は約7桁の10進数の精度を持ち、指数範囲は約 10^-308から 10^308 までを表現できます。
下記にFPUのブロック図を示します。

FPU実行速度検証①
コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。
■コンフィグレーションファイル (config.h)
■クロック設定ソースファイル(Clock_Driver.c)
■クロックヘッダーファイル(clock_driver.h)
ソースコード
#define ITERATIONS 1000000
void float_operations()
{
float a = 1.23f;
float b = 4.56f;
float c = 0.0f;
for (int i = 0; i < ITERATIONS; i++) //33CH は long
{
c += a * b;
a += 0.01f;
b -= 0.01f;
}
// ループの最適化を防ぐためのダミー出力
DAC1DAT = (a + b + c ) /15; //33CH は DAT1DATH
}
void double_operations()
{
double a = 1.23;
double b = 4.56;
double c = 0.0;
for (int i = 0; i < ITERATIONS; i++) //33CH は long
{
c += a * b;
a += 0.01;
b -= 0.01;
}
// ループの最適化を防ぐためのダミー出力
DAC1DAT = (a + b + c ) / 15; //33CH は DAT1DATH
}
int main()
{
/*----------------------------------------------------------------------------*/
/*初期化*/
/*----------------------------------------------------------------------------*/
vdg_Clock_Set_Register();
TRISDbits.TRISD9 = 0u;
TRISDbits.TRISD10 = 0u;
TRISCbits.TRISC9 = 0u;
/*----------------------------------------------------------------------------*/
/*メインルーチン*/
/*----------------------------------------------------------------------------*/
while(1)
{
// 単精度浮動小数点演算のベンチマーク
LATDbits.LATD9 = 1u;
float_operations();
LATDbits.LATD9 = 0u;
// 倍精度浮動小数点演算のベンチマーク
LATDbits.LATD10 = 1u;
double_operations();
LATDbits.LATD10 = 0u;
}
return 0;
}
結果
| 検証①結果 単精度 | dsPIC33CH (90MHz Main Core) | dsPIC33AK |
| 実行スピード(ms) (コンパイラオプション = 0) | 5440 | 200 |
| 実行スピード(ms) (コンパイラオプション = 1) | 5350 | 44.8 |

| 検証①結果 倍精度 | dsPIC33CH (90MHz Main Core) | dsPIC33AK |
| 実行スピード(ms) (コンパイラオプション = 0) | 5560 | 200 |
| 実行スピード(ms) (コンパイラオプション = 1) | 5380 | 45.6 |

まとめ
FPUの有無によって、速度が約30倍も向上しています。
実際には割り込みなども影響するため、もう少し複雑な要因が絡んでいると思いますが、一つの参考値としてご覧いただければ幸いです。
記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、もし内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント