目次: ベンチマーク
先日(2021年2月5日の日記参照)非正規化数(Denormal数)の計算は遅いと書きましたが、いかほどでしょうか?どのくらい遅いのか、デノーマルフラッシュでどの程度速くなるのか、この2点について見ていこうと思います。
おそらく世の中のどのFPUも割り算が一番苦手なはずです。入力を正規化数、非正規化数の2パターン用意して、下記の演算をたくさん実行してみます。
#define SIZE 10000
union uuu {
double f;
long long n;
};
...
void test_speed(union uuu *val)
{
for (int i = 0; i < SIZE; i++) {
dst[i].f =
val[i].f / 1.08f -
val[i].f / 1.07f +
val[i].f / 1.06f -
val[i].f / 1.05f +
val[i].f / 1.04f -
val[i].f / 1.03f +
val[i].f / 1.02f -
val[i].f / 1.01f;
}
}
コードは全部貼り付けると邪魔くさいのでGitHubにおきました(GitHubへのリンク)。前回のFTZ, DAZのテストに使ったコードも一緒に入っています。
まずはx86系のCPUで測ってみましょう。手元にあるのはZen系(AMD Ryzen 7 2700)と、Atom系(Intel Pentium J4205)なので、この2つで測ります。コンパイラはgcc (Debian 10.2.1-6) 10.2.1 20210110、最適化レベルはO2です。
10000 loops Normal ----- FTZ:OFF, DAZ:OFF 0.912859[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:OFF, DAZ:ON 0.880695[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:OFF 0.880633[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:ON 0.880653[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) Denormal ----- FTZ:OFF, DAZ:OFF 1.806291[s] dst : -4.446591e-323(0x8000000000000009) FTZ:OFF, DAZ:ON 0.783578[s] dst : 0.000000e+00(0x00000000) FTZ:ON, DAZ:OFF 1.513203[s] dst : 0.000000e+00(0x00000000) FTZ:ON, DAZ:ON 0.783183[s] dst : 0.000000e+00(0x00000000)
1000 loops Normal ----- FTZ:OFF, DAZ:OFF 1.024671[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:OFF, DAZ:ON 1.025767[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:OFF 1.025151[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:ON 1.027414[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) Denormal ----- FTZ:OFF, DAZ:OFF 12.147070[s] dst : -4.446591e-323(0x8000000000000009) FTZ:OFF, DAZ:ON 0.309857[s] dst : 0.000000e+00(0x00000000) FTZ:ON, DAZ:OFF 7.126950[s] dst : 0.000000e+00(0x00000000) FTZ:ON, DAZ:ON 0.312373[s] dst : 0.000000e+00(0x00000000)
Ryzen 7 2700でもPentium J4205でも、Denormal数が計算に出現すると遅くなりますが、J4205はその傾向が顕著で10倍くらい遅いです。FTZ, DAZをONにすると、効果覿面に速くなります。
次にARMで測ってみましょう。手元にあるのはRK3399です。Cortex-A72とCortex-A53が混載されているので、両方で測ります。カーネルはLinux 5.11.0-rc3-next-20210113、コンパイラはgcc (Debian 8.3.0-6) 8.3.0、最適化レベルはO2です。
ARMは仕様上FTZとDAZが分かれていない(FZという両方合わせたような機能がある)ので、片方だけONにした結果はありません。
$ taskset 0x10 ./a.out 10000 ... 10000 loops Normal ----- FTZ:OFF, DAZ:OFF 7.153237[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:ON 7.118581[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) Denormal ----- FTZ:OFF, DAZ:OFF 8.008282[s] dst : -4.446591e-323(0x8000000000000009) FTZ:ON, DAZ:ON 1.779883[s] dst : 0.000000e+00(0x00000000)
$ taskset 0x1 ./a.out 10000 ... 10000 loops Normal ----- FTZ:OFF, DAZ:OFF 11.693382[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) FTZ:ON, DAZ:ON 11.691307[s] dst : -3.668038e-02(0xbfa2c7c56ca81140) Denormal ----- FTZ:OFF, DAZ:OFF 12.196882[s] dst : -4.446591e-323(0x8000000000000009) FTZ:ON, DAZ:ON 11.697961[s] dst : 0.000000e+00(0x00000000)
Cortex-A72はデノーマルフラッシュの効果抜群ですが、Cortex-A53はデノーマルフラッシュによる変化はほとんどありません。どちらもARMが設計した同世代のCPUにも関わらず、速度の傾向は大きく異なります。詳細な理由はARMにしかわかりませんが、なかなか興味深い結果です。
< | 2021 | > | ||||
<< | < | 02 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | - | - | - | - | - | - |
合計:
本日: