新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

とある演算結果

arm で -O2 でコンパイル。フロートの処理と自前の固定小数点。

11396.128134
11400.286300

11400.286577
11414.937859

自前の方が遅い。float の方が早い。-mcpu=cortex-a9 追加。

11632.349062
11636.424210

11636.424468
11652.179357

自前の方は遅くなってるじゃないか。

  • mfpu=vfpv3 追加。
12096.295129
12100.291424
3.996295
12100.291756
12115.918984
15.627228

多少早くなった?neon にしてみる。

12195.973746
12199.950669
3.976923
12199.951001
12215.611444
15.660443

neon のコードが生成されているのか?
あれあれ?関数コールしている。

      58:       ebfffffe        bl      0 <__aeabi_fadd>
      5c:       e1a0100a        mov     r1, sl
      60:       ebfffffe        bl      0 <__aeabi_fadd>
  • mfloat-abi=softfp をつけたらちゃんとアセンブラコードになった。
  18:   ed9d2a0e        vldr    s4, [sp, #56]   ; 0x38
  1c:   ee66ba83        vmul.f32        s23, s13, s6
  20:   ee723a43        vsub.f32        s7, s4, s6

劇的に早くなった。-mfpu=vfpv3 -mfloat-abi=softfp

12549.425039
12549.717631
0.292592
12549.717926
12564.937932
15.220006
  • mfpu=neon としても vmul などの vfpu のコードが生成される。

double じゃないと neon は吐き出さないのだろうか?

  • O3 。-mfpu=vfpv3 -mfloat-abi=softfp

O3 にしたらもっと早くなった嘘みたいな数字。

12935.004343
12935.004343
0.000000
12935.004638
12945.532333
10.527695

double にしてもかわらない、、、

      2c:       edddbb10        vldr    d27, [sp, #64]  ; 0x40
      30:       ee221ba9        vmul.f64        d1, d18, d25
      34:       ee626b07        vmul.f64        d22, d2, d7
      38:       ee627b2e        vmul.f64        d23, d2, d30
      3c:       ee3b4be9        vsub.f64        d4, d27, d25
      40:       ee728bec        vsub.f64        d24, d18, d28

neon のコードが吐き出されない?

double vs float どっちがはやい?

double
13188.552350
13188.552368
0.000018
float
13245.959996
13245.959996
0.000000

float の方が早いのか、、、、

neon をつかっているのか vfpu を使っているかわからなくなってきた、、、、
アセンブラを出力の diff をとる。

<       .fpu neon
---
>       .fpu vfpv3

アセンブラーコードではわからないのか?生成されたオブジェクトのアセンブラコードは一緒のようだ。結局 vfpv3 を使っている気がする。

double にしても同じコードがはかれていることを確認した。

NEON 拡張は、ARMv7-A と ARMv7-R のアーキテクチャでのみオプションとして使用できます。 NEON をサポートしているシステムでは、半精度命令を除くすべての NEON 命令を使用できます。 命令の中には、NEON なしの VFP 拡張を実装したシステムで使用できるものもあります。 これらは「共通の命令」と呼ばれます。

なんじゃこりゃ。neon と vfp は一部同じなのか?
整理されないまま、今回は終了。