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

Reply via email to