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
2364void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size);2364void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size);
2365void ff_shuffle_bytes_1203_avx2(const uint8_t *src, uint8_t *dst, int src_size);2365void ff_shuffle_bytes_1203_avx2(const uint8_t *src, uint8_t *dst, int src_size);
2366 2366
2367void ff_shuffle_bytes_2103_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2368void ff_shuffle_bytes_0321_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2369void ff_shuffle_bytes_1230_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2370void ff_shuffle_bytes_3012_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2371void ff_shuffle_bytes_3210_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2372void ff_shuffle_bytes_3102_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2373void ff_shuffle_bytes_2013_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2374void ff_shuffle_bytes_2130_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2375void ff_shuffle_bytes_1203_avx512icl(const uint8_t *src, uint8_t *dst, int src_size);
2376
2367void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,2377void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
2368 const uint8_t *src, int width, int height,2378 const uint8_t *src, int width, int height,
2369 int lumStride, int chromStride, int srcStride);2379 int lumStride, int chromStride, int srcStride);
@@ -2454,6 +2464,17 @@ av_cold void rgb2rgb_init_x86(void) · 84 unmodified lines
2454 shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2;2464 shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2;
2455 shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx2;2465 shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx2;
2456 }2466 }
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 }
2457 if (EXTERNAL_AVX2_FAST(cpu_flags)) {2478 if (EXTERNAL_AVX2_FAST(cpu_flags)) {
2458 uyvytoyuv422 = ff_uyvytoyuv422_avx2;2479 uyvytoyuv422 = ff_uyvytoyuv422_avx2;
2459#endif2480#endif
libswscale/x86/rgb_2_rgb.asm+59−31
@@ -57,40 +57,53 @@ SECTION .text · 56 unmodified lines
57%macro SHUFFLE_BYTES 457%macro SHUFFLE_BYTES 4
58cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x58cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x
59 VBROADCASTI128 m0, [pb_shuffle%1%2%3%4]59 VBROADCASTI128 m0, [pb_shuffle%1%2%3%4]
60 movsxdifnidn wq, wd60 movsxdifnidn wq, wd
61 mov xq, wq61 mov xq, wq
62 62
63 add srcq, wq63 add srcq, wq
64 add dstq, wq64 add dstq, wq
65 neg wq65 neg wq
66 66
67;calc scalar loop67%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
68 and xq, mmsize-480 and xq, mmsize-4
69 je .loop_simd81 je .loop_simd
70 82
71.loop_scalar:83 .loop_scalar:
72 mov tmpb, [srcq + wq + %1]84 mov tmpb, [srcq + wq + %1]
73 mov [dstq+wq + 0], tmpb85 mov [dstq+wq + 0], tmpb
74 mov tmpb, [srcq + wq + %2]86 mov tmpb, [srcq + wq + %2]
75 mov [dstq+wq + 1], tmpb87 mov [dstq+wq + 1], tmpb
76 mov tmpb, [srcq + wq + %3]88 mov tmpb, [srcq + wq + %3]
77 mov [dstq+wq + 2], tmpb89 mov [dstq+wq + 2], tmpb
78 mov tmpb, [srcq + wq + %4]90 mov tmpb, [srcq + wq + %4]
79 mov [dstq+wq + 3], tmpb91 mov [dstq+wq + 3], tmpb
80 add wq, 492 add wq, 4
81 sub xq, 493 sub xq, 4
82 jg .loop_scalar94 jg .loop_scalar
83 95%endif
84;check if src_size < mmsize96
85cmp wq, 097 ;check if src_size < mmsize
86jge .end98 cmp wq, 0
87 99 jge .end
88.loop_simd:100
89 movu m1, [srcq+wq]101 .loop_simd:
90 pshufb m1, m0102 movu m1, [srcq + wq]
91 movu [dstq+wq], m1103 pshufb m1, m0
92 add wq, mmsize104 movu [dstq + wq], m1
93 jl .loop_simd105 add wq, mmsize
106 jl .loop_simd
94 107
95.end:108.end:
96 RET109 RET
@@ -122,6 +135,21 @@ SHUFFLE_BYTES 1, 2, 0, 3 · 25 unmodified lines
122%endif135%endif
123%endif136%endif
124 137
138%if ARCH_X86_64
139%if HAVE_AVX512ICL_EXTERNAL
140INIT_ZMM avx512icl
141SHUFFLE_BYTES 2, 1, 0, 3
142SHUFFLE_BYTES 0, 3, 2, 1
143SHUFFLE_BYTES 1, 2, 3, 0
144SHUFFLE_BYTES 3, 0, 1, 2
145SHUFFLE_BYTES 3, 2, 1, 0
146SHUFFLE_BYTES 3, 1, 0, 2
147SHUFFLE_BYTES 2, 0, 1, 3
148SHUFFLE_BYTES 2, 1, 3, 0
149SHUFFLE_BYTES 1, 2, 0, 3
150%endif
151%endif
152
125;-----------------------------------------------------------------------------------------------153;-----------------------------------------------------------------------------------------------
126; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,154; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
127; const uint8_t *src, int width, int height,155; 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