History

lavc/h264dsp: R-V V 8-bit luma loop filter

T-Head C908 (cycles): h264_h_loop_filter_luma_8bpp_c: 297.5 h264_h_loop_filter_luma_8bpp_rvv_i32: 369.2 h264_v_loop_filter_luma_8bpp_c: 862.7 h264_v_loop_filter_luma_8bpp_rvv_i32: 199.7 Performance in the horizontal scenario seems worse than scalar. x86 SSE2 and AVX optimisations are similarly affected. This is presumably caused by unlucky inputs from checkasm, such that the C code short-circuits almost all filter calculations.

Rémi Denis-Courmont committed 2 years ago

Commit 5a6e3331 parent 03175b53 files · +153 −1Browse files

Showing the changes to libavcodec (3 of 3 files). Show all

Unified · Split

3 files
  1. libavcodec/riscv/Makefile +1 −0
  2. libavcodec/riscv/h264dsp_init.c +12 −1
  3. libavcodec/riscv/h264dsp_rvv.S +140 −0
libavcodec/riscv/Makefile+1−0
@@ -31,6 +31,7 @@ RVV-OBJS-$(CONFIG_H263DSP) += riscv/h263dsp_rvv.o · 30 unmodified lines
3131 OBJS-$(CONFIG_H264CHROMA) += riscv/h264_chroma_init_riscv.o
3232 RVV-OBJS-$(CONFIG_H264CHROMA) += riscv/h264_mc_chroma.o
3333 OBJS-$(CONFIG_H264DSP) += riscv/h264dsp_init.o
34+RVV-OBJS-$(CONFIG_H264DSP) += riscv/h264dsp_rvv.o
3435 OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_init.o
3536 RVV-OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_rvv.o
3637 OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_init.o
libavcodec/riscv/h264dsp_init.c+12−1
@@ -24,8 +24,14 @@ · 23 unmodified lines
2424
2525 #include "libavutil/attributes.h"
2626 #include "libavutil/cpu.h"
27+#include "libavutil/riscv/cpu.h"
2728 #include "libavcodec/h264dsp.h"
2829
30+void ff_h264_v_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride,
31+ int alpha, int beta, int8_t *tc0);
32+void ff_h264_h_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride,
33+ int alpha, int beta, int8_t *tc0);
34+
2935 extern int ff_startcode_find_candidate_rvb(const uint8_t *, int);
3036 extern int ff_startcode_find_candidate_rvv(const uint8_t *, int);
3137
@@ -38,8 +44,13 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 6 unmodified lines
3844 if (flags & AV_CPU_FLAG_RVB_BASIC)
3945 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvb;
4046 # if HAVE_RVV
41− if (flags & AV_CPU_FLAG_RVV_I32)
47+ if (flags & AV_CPU_FLAG_RVV_I32) {
48+ if (bit_depth == 8 && ff_rv_vlen_least(128)) {
49+ dsp->h264_v_loop_filter_luma = ff_h264_v_loop_filter_luma_8_rvv;
50+ dsp->h264_h_loop_filter_luma = ff_h264_h_loop_filter_luma_8_rvv;
51+ }
4252 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvv;
53+ }
4354 # endif
4455 #endif
4556 }
libavcodec/riscv/h264dsp_rvv.S+140−0
@@ -0,0 +1,140 @@
1+/*
2+ * Copyright © 2024 Rémi Denis-Courmont.
3+ *
4+ * Redistribution and use in source and binary forms, with or without
5+ * modification, are permitted provided that the following conditions are met:
6+ *
7+ * 1. Redistributions of source code must retain the above copyright notice,
8+ * this list of conditions and the following disclaimer.
9+ *
10+ * 2. Redistributions in binary form must reproduce the above copyright notice,
11+ * this list of conditions and the following disclaimer in the documentation
12+ * and/or other materials provided with the distribution.
13+ *
14+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24+ * POSSIBILITY OF SUCH DAMAGE.
25+ */
26+
27+#include "libavutil/riscv/asm.S"
28+
29+ .variant_cc ff_h264_loop_filter_luma_8_rvv
30+func ff_h264_loop_filter_luma_8_rvv, zve32x
31+ # p2: v8, p1: v9, p0: v10, q0: v11, q1: v12, q2: v13
32+ # alpha: a2, beta: a3, tc_orig: v6
33+ csrwi vxrm, 0
34+ vaaddu.vv v14, v10, v11 # (p0 + q0 + 1) / 2
35+ vwsubu.vv v16, v9, v12
36+ vwaddu.vv v18, v8, v14
37+ vwaddu.vv v20, v13, v14
38+ vnsra.wi v24, v16, 2 # (p1 - q1) / 4
39+ vnsrl.wi v14, v18, 1
40+ vnsrl.wi v15, v20, 1
41+ vneg.v v5, v6 # -tc_orig
42+ vwsubu.vv v22, v11, v10 # q0 - p0
43+ vwsubu.vv v18, v14, v9
44+ vwsubu.vv v20, v15, v12
45+ vwadd.wv v16, v22, v24
46+ vmsge.vi v7, v6, 0 # tc_orig >= 0
47+ vnclip.wi v14, v18, 0
48+ vnclip.wi v15, v20, 0
49+ vnclip.wi v16, v16, 1 # clip8((q0 - p0 + (p1 - q1) / 4 + 1) >> 1)
50+ vmin.vv v14, v14, v6
51+ vmin.vv v15, v15, v6
52+ vmax.vv v14, v14, v5 # clip(p2 + ... - p1, +/-tc_orig)
53+ vmax.vv v15, v15, v5 # clip(q2 + ... - q1, +/-tc_orig)
54+ vwsubu.vv v20, v10, v11
55+ vwsubu.vv v24, v9, v10
56+ vwsubu.vv v26, v10, v9
57+ vwsubu.vv v28, v12, v11
58+ vwsubu.vv v30, v11, v12
59+ vwsubu.vv v0, v8, v10
60+ vwsubu.vv v2, v10, v8
61+ vwsubu.vv v4, v13, v11
62+ vwsubu.vv v18, v11, v13
63+ vsetvli zero, zero, e16, m2, ta, ma
64+ vmax.vv v20, v20, v22 # abs(p0 - q0)
65+ vmax.vv v24, v24, v26 # abs(p1 - p0)
66+ vmax.vv v28, v28, v30 # abs(q1 - q0)
67+ vmax.vv v22, v0, v2 # abs(p2 - p0)
68+ vmax.vv v26, v4, v18 # abs(q2 - q0)
69+ vmslt.vx v1, v20, a2
70+ vmslt.vx v2, v24, a3
71+ vmand.mm v7, v7, v1
72+ vmslt.vx v3, v28, a3
73+ vmand.mm v7, v7, v2
74+ vmslt.vx v0, v22, a3
75+ vmand.mm v7, v7, v3 # whether to update p0 and q0
76+ vmslt.vx v1, v26, a3
77+ vmand.mm v0, v0, v7
78+ vsetvli zero, zero, e8, m1, ta, mu
79+ vadd.vi v6, v6, 1, v0.t # tc++
80+ vadd.vv v9, v9, v14, v0.t # p1'
81+ vmand.mm v0, v1, v7
82+ vadd.vi v6, v6, 1, v0.t # tc++
83+ vadd.vv v12, v12, v15, v0.t # q1'
84+ vneg.v v5, v6 # -tc
85+ vmin.vv v16, v16, v6
86+ vwcvtu.x.x.v v18, v10
87+ vmax.vv v16, v16, v5
88+ vwcvtu.x.x.v v20, v11
89+ vwadd.wv v18, v18, v16
90+ vwsub.wv v20, v20, v16
91+ vmmv.m v0, v7
92+ vsetvli zero, zero, e16, m2, ta, ma
93+ vmax.vx v18, v18, zero
94+ vmax.vx v20, v20, zero
95+ vsetvli zero, zero, e8, m1, ta, mu
96+ vnclipu.wi v10, v18, 0, v0.t # p0'
97+ vnclipu.wi v11, v20, 0, v0.t # q0'
98+ jr t0
99+endfunc
100+
101+func ff_h264_v_loop_filter_luma_8_rvv, zve32x
102+ vsetivli zero, 4, e32, m1, ta, ma
103+ vle8.v v4, (a4)
104+ li t0, 0x01010101
105+ vzext.vf4 v6, v4
106+ sub t3, a0, a1
107+ vmul.vx v6, v6, t0
108+ vsetivli zero, 16, e8, m1, ta, ma
109+ vle8.v v11, (a0)
110+ sub t2, t3, a1
111+ vid.v v0
112+ vle8.v v10, (t3)
113+ sub t1, t2, a1
114+ vle8.v v9, (t2)
115+ add t5, a0, a1
116+ vle8.v v8, (t1)
117+ add t6, t5, a1
118+ vle8.v v12, (t5)
119+ vle8.v v13, (t6)
120+ jal t0, ff_h264_loop_filter_luma_8_rvv
121+ vse8.v v9, (t2)
122+ vse8.v v10, (t3)
123+ vse8.v v11, (a0)
124+ vse8.v v12, (t5)
125+ ret
126+endfunc
127+
128+func ff_h264_h_loop_filter_luma_8_rvv, zve32x
129+ vsetivli zero, 4, e32, m1, ta, ma
130+ vle8.v v4, (a4)
131+ li t0, 0x01010101
132+ vzext.vf4 v6, v4
133+ addi a0, a0, -3
134+ vmul.vx v6, v6, t0
135+ vsetivli zero, 16, e8, m1, ta, ma
136+ vlsseg6e8.v v8, (a0), a1
137+ jal t0, ff_h264_loop_filter_luma_8_rvv
138+ vssseg6e8.v v8, (a0), a1
139+ ret
140+endfunc

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t