2019年7月18日木曜日

Mbed StudioのGPIOと浮動小数点数演算の速度測定

毎度のことながら、浮動小数点数演算の速度を測定しました。Mbed Studioというか、ARM Compilerをmbedで使った場合の速度ということになります。

GPIO


GPIOをH/Lさせてオシロで拾って演算速度を測定するので、まずはGPIO単体をH/Lさせるのにかかる時間を測定しました。

ターゲットボード: Nucleo-F446RE
Mbed Studio: 0.5.3
mbed-os: 5.12.0

<ソースコード>

#include "mbed.h"
DigitalOut CheckPin1(D2);
// main() runs in its own thread in the OS
int main()
{
    while (true) {
        CheckPin1 = 1;
        CheckPin1 = 0;
    }
}

Mbed Studioには、Build profileに「Debug」「Develop」「Release」があります。それぞれのprofileでBuildして測定しました。

Debug

周期: 361.0ns

Develop

周期: 61.17ns

Release

周期: 61.08ns

mbed-cliの場合は、61.09nsだったので(参考「GPIO出力の速度比較 mbed OS5 vs HAL API vs LL API」)、profileが「Release」「Develop」の場合はほとんど同じです。「Debug」の場合は遅くなっています。Debug用の割り込みがかかってるんでしょう。

浮動小数点数演算


<ソースコード>

#include "mbed.h"
#include <cstdio>
#include <cmath>

#define PI_F (3.14159265f)
#define LOOP_N (1000)

DigitalOut CheckPin1(D2);

volatile float buffer[LOOP_N];

// main() runs in its own thread in the OS
int main()
{
    while (true) {
        CheckPin1 = 1;
        volatile float fv = 0.0f;
        for (int i = 0; i < LOOP_N; i++) {
            fv += 0.001f;
            //buffer[i] = fv + PI_F; // Add
            //buffer[i] = fv - PI_F; // Sub
            //buffer[i] = fv * PI_F; // Mul
            //buffer[i] = fv / PI_F; // Div
            //buffer[i] = sinf(fv);
            //buffer[i] = cosf(fv);
            //buffer[i] = tanf(fv);
            //buffer[i] = expf(fv);
            //buffer[i] = logf(fv);
            //buffer[i] = powf(2.0f, fv);
        }
        CheckPin1 = 0;
    }
}

1000回ループさせて処理時間を測定しました。
#include <cstdio>
#include <cmath>
は、
#include <stdio.h>
#include <math.h>
とするとアラートが出たので変更しています。

コメントアウトしてある部分を、一つずつコメントアウトしたり外したりして再Buildして測定しました。



測定データ(us)

- mbed-cli Mbed Studio 差2
no-op 39 55.9 16.9
add 77.8 94.75 16.95 0.05
sub 77.8 94.625 16.825 -0.075
mul 77.8 94.75 16.95 0.05
div 145 167 22 5.1
sinf() 569 448 -121 -137.9
cosf() 621 415 -206 -222.9
tanf() 986 555 -431 -447.9
expf() 958 645 -313 -329.9
logf() 946 573 -373 -389.9
powf() 2625 2010 -615 -631.9

no-opは演算をすべてコメントアウトした場合の処理時間です。

四則演算ではmbed-cliの方が速くて残念な感じですが、算術関数はMbed Studioの方がかなり速くなっています。

測定データの「差2」はループ固有の処理時間の差を考慮したMbed Studioとmbed-cli処理時間の差です。no-op分を差し引くと四則演算でも引き分けに近い結果です。

メモ


Mbed Studioではbare metal profileというのがあって、RTOSなしで動作するようです。速度はどうだかわかりませんが、サイズはコンパクトになるはず。

「Using the Mbed OS bare metal profile in Mbed Studio」https://os.mbed.com/docs/mbed-studio/0.5/using-mbed-studio/using-the-mbed-os-bare-metal-profile.html

0 件のコメント:

コメントを投稿