On Fri, 11 Nov 2016, Martin Storsjö wrote:
This work is sponsored by, and copyright, Google.These are ported from the ARM version; thanks to the larger amount of registers available, we can do the loop filters with 16 pixels at a time. The implementation is fully templated, with a single macro which can generate versions for both 8 and 16 pixels wide, for both 4, 8 and 16 pixels loop filters (and the 4/8 mixed versions as well). For the 8 pixel wide versions, it is pretty close in speed (the v_4_8 and v_8_8 filters are the best examples of this; the h_4_8 and h_8_8 filters seem to get some gain in the load/transpose/store part). For the 16 pixels wide ones, we get a speedup of around 1.2-1.4x compared to the 32 bit version. Examples of runtimes vs the 32 bit version, on a Cortex A53: ARM AArch64 vp9_loop_filter_h_4_8_neon: 144.0 128.2 vp9_loop_filter_h_8_8_neon: 207.0 182.5 vp9_loop_filter_h_16_8_neon: 415.0 329.7 vp9_loop_filter_h_16_16_neon: 672.0 558.0 vp9_loop_filter_mix2_h_44_16_neon: 302.0 202.5 vp9_loop_filter_mix2_h_48_16_neon: 365.0 307.2 vp9_loop_filter_mix2_h_84_16_neon: 365.0 307.2 vp9_loop_filter_mix2_h_88_16_neon: 376.0 307.2 vp9_loop_filter_mix2_v_44_16_neon: 193.2 128.2 vp9_loop_filter_mix2_v_48_16_neon: 246.7 219.2 vp9_loop_filter_mix2_v_84_16_neon: 248.0 219.5 vp9_loop_filter_mix2_v_88_16_neon: 302.0 219.2 vp9_loop_filter_v_4_8_neon: 89.0 89.7 vp9_loop_filter_v_8_8_neon: 141.0 137.7 vp9_loop_filter_v_16_8_neon: 295.0 273.7 vp9_loop_filter_v_16_16_neon: 546.0 454.7 The speedup vs C code in checkasm tests is around 2-7x, which is pretty much the same as for the 32 bit version. Even if these functions are faster than their 32 bit equivalent, the C version that we compare to also became around 1.3-1.7x faster than the C version in 32 bit. Based on START_TIMER/STOP_TIMER wrapping around a few individual functions, the speedup vs C code is around 4-5x. --- v2: Instantiating the loop filter core once per configuration, instead of once per frontend filter, reducing the code size from 16560 bytes to 9756 bytes, with very low extra overhead. Added a missing comma from a macro invocation. --- libavcodec/aarch64/Makefile | 1 + libavcodec/aarch64/vp9dsp_init_aarch64.c | 45 + libavcodec/aarch64/vp9lpf_neon.S | 1406 ++++++++++++++++++++++++++++++ 3 files changed, 1452 insertions(+) create mode 100644 libavcodec/aarch64/vp9lpf_neon.S
+.if \wd == 8 + // If a 4/8 or 8/4 mix is used, clear the relevant half of v6 +.if \mix != 0 + mov v1.2d[0], x11
Changed into "mov v1.d[0], x11" locally, fixing builds with clang // Martin _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
