dsPIC33AKシリーズ④FPU性能について

dsPIC33Aシリーズ

概要

今回はdsPICシリーズに初搭載されたFPUの性能について検証します。

記事リンク
第1回dsPIC33AKシリーズについてdsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com)
第2回開発ボード、コンフィグレーション設定、クロック設定についてdsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com)
第3回CPU性能についてdsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第4回(本記事)FPU性能について
第5回(予定)DSP性能について
(fig.1-1)各関連記事リンク

開発環境

開発環境は以下のとおり。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボードEV68M17A – dsPIC33AK128MC106 Motor Control DIMdsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com)
統合開発環境MPLAB X IDE v6.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)ベースボード+CPUボード(EV68M17A)

項目リンク
ベースボードdsPIC33CH CURIOSITY
DEVELOPMENT BOARD
DSPIC33CH CURIOSITY DEVELOPMENT BOARD | Microchip Technology
統合開発環境MPLAB X IDE v6.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-3)dsPIC33CHの動作確認環境

今回の実験のコンフィクレーションおよびクロックの設定は第2回の記事のとおりとします。

FPU概要

dspPIC33AKシリーズのFPUは単精度(*1)と倍精度(*2)をサポートするIEEE 754-2019準拠の浮動小数点ユニットです。従来のdsPICはFPUが搭載されていませんでしたので固定小数点演算などで演算をしていましたが、速度や精度が劣るという問題が有りました。もちろんこれまでもfloatやdoubleは扱えたのですが、非常に遅くクリティカルな速度が求められる部分に関しては用いられなかったと思われます。

(*1)単精度とは

浮動小数点演算ユニット(FPU)の単精度とは、32ビットの浮動小数点数(float)を扱う能力を指します。単精度浮動小数点数は、IEEE 754規格に基づいて表現されます。単精度浮動小数点数の構造は以下の通りです:

 1.符号ビット(Sign bit):1ビット。数値の正負を示します。0は正、1は負を意味します。
 2.指数部(Exponent):8ビット。数値のスケーリングを行うための指数を示します。
 3.仮数部(Mantissa または significand):23ビット。数値の精度を保持する部分です。設計の重要なポイントです。

これにより、単精度浮動小数点数は約7桁の10進数の精度を持ち、指数範囲は約 10^-38から 10^38 までを表現できます。

(*2)倍精度とは

倍精度浮動小数点数(double precision)とは、64ビットの浮動小数点数を扱う能力を指します。倍精度浮動小数点数も、IEEE 754規格に基づいて表現されます。倍精度浮動小数点数の構造は以下の通りです:

  1. 符号ビット(Sign bit):1ビット。数値の正負を示します。0は正、1は負を意味します。
  2. 指数部(Exponent):11ビット。数値のスケーリングを行うための指数を示します。
  3. 仮数部(Mantissa または significand):52ビット。数値の精度を保持する部分です。

これにより、単精度浮動小数点数は約7桁の10進数の精度を持ち、指数範囲は約 10^-308から 10^308 までを表現できます。

下記にFPUのブロック図を示します。

(fig.3-1)FPUブロック図(dsPIC33AK128MC106 Family Data Sheet (microchip.com) p.122より抜粋)

FPU実行速度検証① 

コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。

■コンフィグレーションファイル (config.h)

config.hダウンロード

■クロック設定ソースファイル(Clock_Driver.c)

Clock_Driver.cダウンロード

■クロックヘッダーファイル(clock_driver.h)

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)
5440200
実行スピード(ms)
(コンパイラオプション = 1)
535044.8
検証①結果 倍精度dsPIC33CH
(90MHz Main Core)
dsPIC33AK
実行スピード(ms)
(コンパイラオプション = 0)
5560200
実行スピード(ms)
(コンパイラオプション = 1)
538045.6

まとめ

FPUの有無によって、速度が約30倍も向上しています。

実際には割り込みなども影響するため、もう少し複雑な要因が絡んでいると思いますが、一つの参考値としてご覧いただければ幸いです。

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、もし内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

タイトルとURLをコピーしました