History

swscale/x86/rgb2rgb: add AVX512ICL versions of shuffle_bytes

On a AMD 7950x Zen 4 shuffle_bytes_0321_c: 56.5 ( 1.00x) shuffle_bytes_0321_ssse3: 15.2 ( 3.70x) shuffle_bytes_0321_avx2: 10.2 ( 5.51x) shuffle_bytes_0321_avx512icl: 9.2 ( 6.11x) shuffle_bytes_1230_c: 84.5 ( 1.00x) shuffle_bytes_1230_ssse3: 14.2 ( 5.93x) shuffle_bytes_1230_avx2: 15.2 ( 5.54x) shuffle_bytes_1230_avx512icl: 11.2 ( 7.51x) shuffle_bytes_2103_c: 48.5 ( 1.00x) shuffle_bytes_2103_ssse3: 21.2 ( 2.28x) shuffle_bytes_2103_avx2: 13.8 ( 3.53x) shuffle_bytes_2103_avx512icl: 9.2 ( 5.24x) shuffle_bytes_3012_c: 84.5 ( 1.00x) shuffle_bytes_3012_ssse3: 14.2 ( 5.93x) shuffle_bytes_3012_avx2: 16.2 ( 5.20x) shuffle_bytes_3012_avx512icl: 10.2 ( 8.24x) shuffle_bytes_3210_c: 89.2 ( 1.00x) shuffle_bytes_3210_ssse3: 24.2 ( 3.68x) shuffle_bytes_3210_avx2: 16.2 ( 5.49x) shuffle_bytes_3210_avx512icl: 9.2 ( 9.65x)

Shreesh Adiga committed 1 year ago

Commit 59f9dba1 parent 957eb232 files · +80 −31Browse files

Unified · Split

2 files
  1. libswscale/x86/rgb2rgb.c +21 −0
  2. libswscale/x86/rgb_2_rgb.asm +59 −31
libswscale/x86/rgb2rgb.c+21−0
@@ -2364,6 +2364,16 @@ void ff_shuffle_bytes_2013_avx2(const uint8_t *src, uint8_t *dst, int src_size); · 2363 unmodified lines
23642364 void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size);
23652365 void ff_shuffle_bytes_1203_avx2(const uint8_t *src, uint8_t *dst, int src_size);
23662366
2367+void ff_shuffle_bytes_2103_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2368+void ff_shuffle_bytes_0321_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2369+void ff_shuffle_bytes_1230_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2370+void ff_shuffle_bytes_3012_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2371+void ff_shuffle_bytes_3210_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2372+void ff_shuffle_bytes_3102_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2373+void ff_shuffle_bytes_2013_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2374+void ff_shuffle_bytes_2130_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2375+void ff_shuffle_bytes_1203_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2376+
23672377 void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
23682378 const uint8_t *src, int width, int height,
23692379 int lumStride, int chromStride, int srcStride);
@@ -2454,6 +2464,17 @@ av_cold void rgb2rgb_init_x86(void) · 84 unmodified lines
24542464 shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2;
24552465 shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx2;
24562466 }
2467+ if (EXTERNAL_AVX512ICL(cpu_flags)) {
2468+ shuffle_bytes_0321 = ff_shuffle_bytes_0321_avx512icl;
2469+ shuffle_bytes_2103 = ff_shuffle_bytes_2103_avx512icl;
2470+ shuffle_bytes_1230 = ff_shuffle_bytes_1230_avx512icl;
2471+ shuffle_bytes_3012 = ff_shuffle_bytes_3012_avx512icl;
2472+ shuffle_bytes_3210 = ff_shuffle_bytes_3210_avx512icl;
2473+ shuffle_bytes_3102 = ff_shuffle_bytes_3102_avx512icl;
2474+ shuffle_bytes_2013 = ff_shuffle_bytes_2013_avx512icl;
2475+ shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx512icl;
2476+ shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx512icl;
2477+ }
24572478 if (EXTERNAL_AVX2_FAST(cpu_flags)) {
24582479 uyvytoyuv422 = ff_uyvytoyuv422_avx2;
24592480 #endif
libswscale/x86/rgb_2_rgb.asm+59−31
@@ -57,40 +57,53 @@ SECTION .text · 56 unmodified lines
5757 %macro SHUFFLE_BYTES 4
5858 cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x
5959 VBROADCASTI128 m0, [pb_shuffle%1%2%3%4]
60− movsxdifnidn wq, wd
61− mov xq, wq
62−
63− add srcq, wq
64− add dstq, wq
65− neg wq
66−
67−;calc scalar loop
60+ movsxdifnidn wq, wd
61+ mov xq, wq
62+
63+ add srcq, wq
64+ add dstq, wq
65+ neg wq
66+
67+%if mmsize == 64
68+ and xq, mmsize - 4
69+ shr xq, 2
70+ mov tmpd, -1
71+ shlx tmpd, tmpd, xd
72+ not tmpd
73+ kmovw k7, tmpd
74+ vmovdqu32 m1{k7}{z}, [srcq + wq]
75+ pshufb m1, m0
76+ vmovdqu32 [dstq + wq]{k7}, m1
77+ lea wq, [wq + 4 * xq]
78+%else
79+ ;calc scalar loop
6880 and xq, mmsize-4
6981 je .loop_simd
7082
71−.loop_scalar:
72− mov tmpb, [srcq + wq + %1]
73− mov [dstq+wq + 0], tmpb
74− mov tmpb, [srcq + wq + %2]
75− mov [dstq+wq + 1], tmpb
76− mov tmpb, [srcq + wq + %3]
77− mov [dstq+wq + 2], tmpb
78− mov tmpb, [srcq + wq + %4]
79− mov [dstq+wq + 3], tmpb
80− add wq, 4
81− sub xq, 4
82− jg .loop_scalar
83−
84−;check if src_size < mmsize
85−cmp wq, 0
86−jge .end
87−
88−.loop_simd:
89− movu m1, [srcq+wq]
90− pshufb m1, m0
91− movu [dstq+wq], m1
92− add wq, mmsize
93− jl .loop_simd
83+ .loop_scalar:
84+ mov tmpb, [srcq + wq + %1]
85+ mov [dstq+wq + 0], tmpb
86+ mov tmpb, [srcq + wq + %2]
87+ mov [dstq+wq + 1], tmpb
88+ mov tmpb, [srcq + wq + %3]
89+ mov [dstq+wq + 2], tmpb
90+ mov tmpb, [srcq + wq + %4]
91+ mov [dstq+wq + 3], tmpb
92+ add wq, 4
93+ sub xq, 4
94+ jg .loop_scalar
95+%endif
96+
97+ ;check if src_size < mmsize
98+ cmp wq, 0
99+ jge .end
100+
101+ .loop_simd:
102+ movu m1, [srcq + wq]
103+ pshufb m1, m0
104+ movu [dstq + wq], m1
105+ add wq, mmsize
106+ jl .loop_simd
94107
95108 .end:
96109 RET
@@ -122,6 +135,21 @@ SHUFFLE_BYTES 1, 2, 0, 3 · 25 unmodified lines
122135 %endif
123136 %endif
124137
138+%if ARCH_X86_64
139+%if HAVE_AVX512ICL_EXTERNAL
140+INIT_ZMM avx512icl
141+SHUFFLE_BYTES 2, 1, 0, 3
142+SHUFFLE_BYTES 0, 3, 2, 1
143+SHUFFLE_BYTES 1, 2, 3, 0
144+SHUFFLE_BYTES 3, 0, 1, 2
145+SHUFFLE_BYTES 3, 2, 1, 0
146+SHUFFLE_BYTES 3, 1, 0, 2
147+SHUFFLE_BYTES 2, 0, 1, 3
148+SHUFFLE_BYTES 2, 1, 3, 0
149+SHUFFLE_BYTES 1, 2, 0, 3
150+%endif
151+%endif
152+
125153 ;-----------------------------------------------------------------------------------------------
126154 ; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
127155 ; const uint8_t *src, int width, int height,

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