テストプログラム
https://github.com/ryood/Nucleo_DCO/tree/master/mbed/FloatingPoint_Test01
測定結果
青とオレンジがfloat型の演算結果で、グレーと黄色がdouble型の演算結果です。
add, sub, mul, divはそれぞれ加算、減算、乗算、除算で圧倒的にfloat型が高速です。
ところが、なぜだがか三角関数や指数関数のsin, cos, exp, logは、float型とdouble型の差があまりありません。
DDSのチューニングワードを計算する
// calc tuning wordという演算では、むしろmbed OS 5のdouble型(グラフではtwordのグレイ)が最速となっています。「pow(2.0, 32)」という項は定数なので、この場合最適化されているのかもしれません。
t.reset();
t.start();
for (int i = 0; i < LOOP_N; i++) {
buffer[i] = pow(2.0, 32) * (double)i / 100000.0;
}
t.stop();
elapse = t.read_us();
pc.printf("tword\t%d\t%f\r\n", elapse, (float)elapse / LOOP_N);
Nucleo F767ZIをmbedで使った場合に限りますが、浮動小数点数演算の四則演算はfloat型でやったほうが速く、三角関数や指数関数(特にDDSがらみの演算)はdouble型でやってもそれほど遅くないと言えると思います。
測定データ
op | OS 5 float | Mbed 2 float | OS 5 double | Mbed 2 double |
---|---|---|---|---|
add | 0.03708 | 0.02549 | 2.23522 | 1.64085 |
sub | 0.07417 | 0.04866 | 2.29228 | 1.684 |
mul | 0.11125 | 0.07416 | 2.36179 | 1.7396 |
div | 0.21784 | 0.16682 | 2.54717 | 1.90871 |
sin | 0.55664 | 0.37082 | 0.88683 | 0.93309 |
cos | 0.59404 | 0.35549 | 0.95088 | 1.11853 |
exp | 0.76539 | 0.53734 | 1.16889 | 1.04258 |
log | 0.82766 | 0.48837 | 1.2759 | 1.36975 |
sqrt | 1.31143 | 0.22935 | 3.23866 | 0.37065 |
pow32 | 2.28002 | 1.59155 | 0.6069 | 3.92082 |
tword | 2.1812 | 1.60074 | 0.21782 | 3.48061 |
<追記:2018.09.16>
mbed-cliのOS 5とオンラインコンパイラのmbed 2で分けてグラフ化しました。
Mbed OS 5
Mbed 2
</追記>
0 件のコメント:
コメントを投稿