https://github.com/tanakamura/waifu2x-converter-cpp/commit/9439d109f12d8767883dcbb851369b62d13496c0#diff-537df786c04c13fc2b123301d7f60928R143
やっつけでneonも対応した。

まあほんとはキャッシュサイズ小さいCPU用に修正しないといけないんだが…やろうと思ってやってないのでもういいかという感じで…

RasPi2 で動かして、サイクル当たり2flop x 4core x 900MHz なので理論値7.2GFLOPSで、実測2.2GFLOPSの効率30%ぐらい。

30%出てればまあいんじゃね?といってもCortex-A7はNeonがあんまり意味無いので参考にならないが…

今ならCortex-A53,A57とかKyroとかで試したいがOpenCVとかがいるからAndroidで動かすの面倒なんだよね…



そういえばCortex-A7 のIPCも一応はかったのでまあ必要なら

https://github.com/tanakamura/ude-bench

== num_insn = 32 ==
 generic :                                     add rd, rm, rn :         latency : CPI=    1.04, IPC=    0.96
 generic :                                     add rd, rm, rn :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                     add rd, rm, rn :          rename : CPI=    1.04, IPC=    0.96
 generic :                                    adds rd, rm, rn :         latency : CPI=    1.04, IPC=    0.96
 generic :                                    adds rd, rm, rn :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                    adds rd, rm, rn :          rename : CPI=    1.04, IPC=    0.96
 generic :                             add rd, rm, rn, lsl #4 :         latency : CPI=    2.01, IPC=    0.50
 generic :                             add rd, rm, rn, lsl #4 :      throughput : CPI=    1.04, IPC=    0.96
 generic :                             add rd, rm, rn, lsl #4 :          rename : CPI=    1.04, IPC=    0.96
 generic :                                    add rd, rm, imm :         latency : CPI=    1.04, IPC=    0.96
 generic :                                    add rd, rm, imm :      throughput : CPI=    0.57, IPC=    1.76
 generic :                                    add rd, rm, imm :          rename : CPI=    0.57, IPC=    1.76
 generic :                                     add rd, rm, pc :         latency : CPI=    1.04, IPC=    0.96
 generic :                                     add rd, rm, pc :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                     add rd, rm, pc :          rename : CPI=    1.04, IPC=    0.96
 generic :                                      add pc, pc, 0 :         latency : CPI=    4.72, IPC=    0.21
 generic :                                     orr rd, rm, rn :         latency : CPI=    1.04, IPC=    0.96
 generic :                                     orr rd, rm, rn :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                     orr rd, rm, rn :          rename : CPI=    1.04, IPC=    0.96
 generic :                                     eor rd, rm, rn :         latency : CPI=    1.04, IPC=    0.96
 generic :                                     eor rd, rm, rn :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                     eor rd, rm, rn :          rename : CPI=    1.04, IPC=    0.96
 generic :                                     mul rd, rm, rs :         latency : CPI=    3.01, IPC=    0.33
 generic :                                     mul rd, rm, rs :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                     mul rd, rm, rs :          rename : CPI=    1.04, IPC=    0.96
 generic :                                 mla rd, rm, rs, rn :         latency : CPI=    3.01, IPC=    0.33
 generic :                                 mla rd, rm, rs, rn :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                 mla rd, rm, rs, rn :          rename : CPI=    1.04, IPC=    0.96
 generic :                                   ldr rt, [rn, rm] :         latency : CPI=    3.01, IPC=    0.33
 generic :                                   ldr rt, [rn, rm] :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                   ldr rt, [rn, rm] :          rename : CPI=    1.04, IPC=    0.96
 generic :                           ldr rt, [rn, rm, lsl #4] :         latency : CPI=    5.01, IPC=    0.20
 generic :                           ldr rt, [rn, rm, lsl #4] :      throughput : CPI=    3.04, IPC=    0.33
 generic :                           ldr rt, [rn, rm, lsl #4] :          rename : CPI=    3.08, IPC=    0.32
 generic :                                       ldm rt, {r0} :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                       ldm rt, {r0} :          rename : CPI=    1.04, IPC=    0.96
 generic :                                    ldm rt, {r0-r3} :      throughput : CPI=    2.04, IPC=    0.49
 generic :                                    ldm rt, {r0-r3} :          rename : CPI=    2.04, IPC=    0.49
 generic :                                    ldm rt, {r0-r7} :      throughput : CPI=    4.04, IPC=    0.25
 generic :                                    ldm rt, {r0-r7} :          rename : CPI=    4.04, IPC=    0.25
 generic :                                     ldrex rd, [rn] :      throughput : CPI=    5.01, IPC=    0.20
 generic :                                     ldrex rd, [rn] :          rename : CPI=    5.07, IPC=    0.20
 generic :                                 strex rd, rm, [rn] :      throughput : CPI=    3.01, IPC=    0.33
 generic :                                 strex rd, rm, [rn] :          rename : CPI=    3.01, IPC=    0.33
 generic :                ldrex r0, [rn]; strex rd, r0, [rn]  :      throughput : CPI=   13.05, IPC=    0.08
 generic :                ldrex r0, [rn]; strex rd, r0, [rn]  :          rename : CPI=   13.01, IPC=    0.08
 generic :                                   str rt, [rn, #0] :      throughput : CPI=    1.04, IPC=    0.96
 generic :                                   str rt, [rn, #0] :          rename : CPI=    1.04, IPC=    0.96
 generic :                                    {str->ldr}->... :         latency : CPI=    3.04, IPC=    0.33
 generic :                                   {strb->ldr}->... :         latency : CPI=    3.04, IPC=    0.33
  neon64 :                                   vadd.f32 d, d, d :         latency : CPI=    4.01, IPC=    0.25
  neon64 :                                   vadd.f32 d, d, d :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                   vadd.f32 d, d, d :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                   vadd.f32 q, q, q :         latency : CPI=    4.04, IPC=    0.25
 neon128 :                                   vadd.f32 q, q, q :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                   vadd.f32 q, q, q :          rename : CPI=    4.08, IPC=    0.25
  neon64 :                                   vmul.f32 d, d, d :         latency : CPI=    4.01, IPC=    0.25
  neon64 :                                   vmul.f32 d, d, d :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                   vmul.f32 d, d, d :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                   vmul.f32 q, q, q :         latency : CPI=    4.04, IPC=    0.25
 neon128 :                                   vmul.f32 q, q, q :      throughput : CPI=    4.08, IPC=    0.24
 neon128 :                                   vmul.f32 q, q, q :          rename : CPI=    4.04, IPC=    0.25
  neon64 :                                   vmul.f32 d, d, d :         latency : CPI=    4.05, IPC=    0.25
  neon64 :                                   vmul.f32 d, d, d :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                   vmul.f32 d, d, d :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                   vmul.f32 q, q, q :         latency : CPI=    4.11, IPC=    0.24
 neon128 :                                   vmul.f32 q, q, q :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                   vmul.f32 q, q, q :          rename : CPI=    4.08, IPC=    0.25
  neon64 :                                   vmla.f32 d, d, d :         latency : CPI=    4.01, IPC=    0.25
  neon64 :                                   vmla.f32 d, d, d :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                   vmla.f32 d, d, d :          rename : CPI=    2.08, IPC=    0.48
 neon128 :                                   vmla.f32 q, q, q :         latency : CPI=    4.04, IPC=    0.25
 neon128 :                                   vmla.f32 q, q, q :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                   vmla.f32 q, q, q :          rename : CPI=    4.04, IPC=    0.25
  neon64 :                                    vld1.32 d, [rn] :      throughput : CPI=    1.04, IPC=    0.96
  neon64 :                                    vld1.32 d, [rn] :          rename : CPI=    1.04, IPC=    0.96
  neon64 :                                    vld2.32 d, [rn] :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                    vld2.32 d, [rn] :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                    vld4.32 q, [rn] :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                    vld4.32 q, [rn] :          rename : CPI=    4.08, IPC=    0.24
  neon64 :                                    vst1.32 d, [rn] :      throughput : CPI=    1.04, IPC=    0.96
  neon64 :                                    vst1.32 d, [rn] :          rename : CPI=    1.04, IPC=    0.96
  neon64 :                                    vst2.32 d, [rn] :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                    vst2.32 d, [rn] :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                    vst4.32 q, [rn] :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                    vst4.32 q, [rn] :          rename : CPI=    4.04, IPC=    0.25
  neon64 :                                  vcvt.f32.s32 d, d :      throughput : CPI=    2.08, IPC=    0.48
  neon64 :                                  vcvt.f32.s32 d, d :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                  vcvt.f32.s32 q, q :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                  vcvt.f32.s32 q, q :          rename : CPI=    4.04, IPC=    0.25
  neon64 :                                  vcvt.s32.f32 d, d :      throughput : CPI=    2.04, IPC=    0.49
  neon64 :                                  vcvt.s32.f32 d, d :          rename : CPI=    2.04, IPC=    0.49
 neon128 :                                  vcvt.s32.f32 q, q :      throughput : CPI=    4.04, IPC=    0.25
 neon128 :                                  vcvt.s32.f32 q, q :          rename : CPI=    4.04, IPC=    0.25

基本的には1/cycleかな… add rd, rm, imm だけ2

でもなんかよく止まったりSEGVしたりするのでレジスタの退避かなんかをミスってる気がする。