■
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したりするのでレジスタの退避かなんかをミスってる気がする。