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

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
31OBJS-$(CONFIG_H264CHROMA) += riscv/h264_chroma_init_riscv.o31OBJS-$(CONFIG_H264CHROMA) += riscv/h264_chroma_init_riscv.o
32RVV-OBJS-$(CONFIG_H264CHROMA) += riscv/h264_mc_chroma.o32RVV-OBJS-$(CONFIG_H264CHROMA) += riscv/h264_mc_chroma.o
33OBJS-$(CONFIG_H264DSP) += riscv/h264dsp_init.o33OBJS-$(CONFIG_H264DSP) += riscv/h264dsp_init.o
34RVV-OBJS-$(CONFIG_H264DSP) += riscv/h264dsp_rvv.o
34OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_init.o35OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_init.o
35RVV-OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_rvv.o36RVV-OBJS-$(CONFIG_HUFFYUV_DECODER) += riscv/huffyuvdsp_rvv.o
36OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_init.o37OBJS-$(CONFIG_IDCTDSP) += riscv/idctdsp_init.o
libavcodec/riscv/h264dsp_init.c+12−1
@@ -24,8 +24,14 @@ · 23 unmodified lines
24 24
25#include "libavutil/attributes.h"25#include "libavutil/attributes.h"
26#include "libavutil/cpu.h"26#include "libavutil/cpu.h"
27#include "libavutil/riscv/cpu.h"
27#include "libavcodec/h264dsp.h"28#include "libavcodec/h264dsp.h"
28 29
30void ff_h264_v_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride,
31 int alpha, int beta, int8_t *tc0);
32void ff_h264_h_loop_filter_luma_8_rvv(uint8_t *pix, ptrdiff_t stride,
33 int alpha, int beta, int8_t *tc0);
34
29extern int ff_startcode_find_candidate_rvb(const uint8_t *, int);35extern int ff_startcode_find_candidate_rvb(const uint8_t *, int);
30extern int ff_startcode_find_candidate_rvv(const uint8_t *, int);36extern int ff_startcode_find_candidate_rvv(const uint8_t *, int);
31 37
@@ -38,8 +44,13 @@ av_cold void ff_h264dsp_init_riscv(H264DSPContext *dsp, const int bit_depth, · 6 unmodified lines
38 if (flags & AV_CPU_FLAG_RVB_BASIC)44 if (flags & AV_CPU_FLAG_RVB_BASIC)
39 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvb;45 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvb;
40# if HAVE_RVV46# 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 }
42 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvv;52 dsp->startcode_find_candidate = ff_startcode_find_candidate_rvv;
53 }
43# endif54# endif
44#endif55#endif
45}56}
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
30func 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
99endfunc
100
101func 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
126endfunc
127
128func 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
140endfunc

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