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 は一部同じなのか?
整理されないまま、今回は終了。