[FFmpeg-devel] [PATCH 3/4] libavfilter/x86/vf_threshold: add ff_threshold8/16_avx512
Wu Jianhua
jianhua.wu at intel.com
Fri Aug 27 07:51:43 EEST 2021
Performance(Less is better)
8bit:
ff_threshold8_sse4 32.7555351
ff_threshold8_avx2 32.1713562
ff_threshold8_avx512 32.0103531
16bit:
ff_threshold16_sse4 37.7713432
ff_threshold16_avx2 35.3348312
ff_threshold16_avx512 32.6976166
Signed-off-by: Wu Jianhua <jianhua.wu at intel.com>
---
libavfilter/x86/vf_threshold.asm | 44 +++++++++++++++++++++--------
libavfilter/x86/vf_threshold_init.c | 8 ++++++
2 files changed, 41 insertions(+), 11 deletions(-)
diff --git a/libavfilter/x86/vf_threshold.asm b/libavfilter/x86/vf_threshold.asm
index 098069b083..dc4126c7af 100644
--- a/libavfilter/x86/vf_threshold.asm
+++ b/libavfilter/x86/vf_threshold.asm
@@ -29,6 +29,15 @@ pb_128_0 : times 8 db 0, 128
SECTION .text
+%macro DECL_MASK 2
+%if mmsize < 64
+ %xdefine %1 m%2
+%else
+ %assign %%i %2 + 1
+ %xdefine %1 k %+ %%i
+%endif
+%endmacro
+
;%1 depth (8 or 16) ; %2 b or w ; %3 constant
%macro THRESHOLD 3
%if ARCH_X86_64
@@ -58,17 +67,24 @@ cglobal threshold%1, 5, 7, 5, in, threshold, min, max, out, w, x
.nextrow:
mov xq, wq
- .loop:
- movu m1, [inq + xq]
- movu m0, [thresholdq + xq]
- movu m2, [minq + xq]
- movu m3, [maxq + xq]
- pxor m0, m4
- pxor m1, m4
- pcmpgt%2 m0, m1
- PBLENDVB m3, m2, m0
- movu [outq + xq], m3
- add xq, mmsize
+.loop:
+ movu m1, [inq + xq]
+ movu m0, [thresholdq + xq]
+ movu m2, [minq + xq]
+ movu m3, [maxq + xq]
+ pxor m0, m4
+ pxor m1, m4
+ DECL_MASK mask, 0
+ pcmpgt%2 mask, m0, m1
+
+%if mmsize == 64
+ vpblendm%2 m3{mask}, m3, m2
+%else
+ PBLENDVB m3, m2, mask
+%endif
+
+ movu [outq + xq], m3
+ add xq, mmsize
jl .loop
add inq, ilinesizeq
@@ -90,3 +106,9 @@ INIT_YMM avx2
THRESHOLD 8, b, pb_128
THRESHOLD 16, w, pb_128_0
%endif
+
+%if HAVE_AVX512_EXTERNAL
+INIT_ZMM avx512
+THRESHOLD 8, b, pb_128
+THRESHOLD 16, w, pb_128_0
+%endif
diff --git a/libavfilter/x86/vf_threshold_init.c b/libavfilter/x86/vf_threshold_init.c
index 71bde15097..23500ea1bf 100644
--- a/libavfilter/x86/vf_threshold_init.c
+++ b/libavfilter/x86/vf_threshold_init.c
@@ -34,8 +34,10 @@ void ff_threshold##depth##_##opt(const uint8_t *in, const uint8_t *threshold,\
THRESHOLD_FUNC(8, sse4)
THRESHOLD_FUNC(8, avx2)
+THRESHOLD_FUNC(8, avx512)
THRESHOLD_FUNC(16, sse4)
THRESHOLD_FUNC(16, avx2)
+THRESHOLD_FUNC(16, avx512)
av_cold void ff_threshold_init_x86(ThresholdContext *s)
{
@@ -48,6 +50,9 @@ av_cold void ff_threshold_init_x86(ThresholdContext *s)
if (EXTERNAL_AVX2_FAST(cpu_flags)) {
s->threshold = ff_threshold8_avx2;
}
+ if (EXTERNAL_AVX512(cpu_flags)) {
+ s->threshold = ff_threshold8_avx512;
+ }
} else {
if (EXTERNAL_SSE4(cpu_flags)) {
s->threshold = ff_threshold16_sse4;
@@ -55,5 +60,8 @@ av_cold void ff_threshold_init_x86(ThresholdContext *s)
if (EXTERNAL_AVX2_FAST(cpu_flags)) {
s->threshold = ff_threshold16_avx2;
}
+ if (EXTERNAL_AVX512(cpu_flags)) {
+ s->threshold = ff_threshold16_avx512;
+ }
}
}
--
2.17.1
More information about the ffmpeg-devel
mailing list