History

Add high bit Hadamard 8x8 avx2 implementation

Speed tests: [ RUN ] C/HadamardHighbdTest.DISABLED_Speed/0 Hadamard8x8[ 10 runs]: 0 us Hadamard8x8[ 10000 runs]: 316 us Hadamard8x8[ 10000000 runs]: 311749 us [ OK ] C/HadamardHighbdTest.DISABLED_Speed/0 (371 ms) [ RUN ] AVX2/HadamardHighbdTest.DISABLED_Speed/0 Hadamard8x8[ 10 runs]: 0 us Hadamard8x8[ 10000 runs]: 161 us Hadamard8x8[ 10000000 runs]: 156910 us [ OK ] AVX2/HadamardHighbdTest.DISABLED_Speed/0 (160 ms)

sdeng committed 8 years ago

Commit f5306a51 parent 5fbc7a23 files · +129 −1Browse files

Unified · Split

3 files
  1. test/hadamard_test.cc +7 −0
  2. vpx_dsp/vpx_dsp_rtcd_defs.pl +1 −1
  3. vpx_dsp/x86/avg_intrin_avx2.c +121 −0
test/hadamard_test.cc+7−0
@@ -306,5 +306,12 @@ INSTANTIATE_TEST_CASE_P( · 305 unmodified lines
306306 ::testing::Values(HadamardFuncWithSize(&vpx_highbd_hadamard_8x8_c, 8),
307307 HadamardFuncWithSize(&vpx_highbd_hadamard_16x16_c, 16),
308308 HadamardFuncWithSize(&vpx_highbd_hadamard_32x32_c, 32)));
309+
310+#if HAVE_AVX2
311+INSTANTIATE_TEST_CASE_P(
312+ AVX2, HadamardHighbdTest,
313+ ::testing::Values(HadamardFuncWithSize(&vpx_highbd_hadamard_8x8_avx2, 8)));
314+#endif // HAVE_AVX2
315+
309316 #endif // CONFIG_VP9_HIGHBITDEPTH
310317 } // namespace
vpx_dsp/vpx_dsp_rtcd_defs.pl+1−1
@@ -786,7 +786,7 @@ if (vpx_config("CONFIG_VP9_ENCODER") eq "yes") { · 785 unmodified lines
786786 specialize qw/vpx_hadamard_32x32 sse2 avx2/;
787787
788788 add_proto qw/void vpx_highbd_hadamard_8x8/, "const int16_t *src_diff, ptrdiff_t src_stride, tran_low_t *coeff";
789− specialize qw/vpx_highbd_hadamard_8x8/;
789+ specialize qw/vpx_highbd_hadamard_8x8 avx2/;
790790
791791 add_proto qw/void vpx_highbd_hadamard_16x16/, "const int16_t *src_diff, ptrdiff_t src_stride, tran_low_t *coeff";
792792 specialize qw/vpx_highbd_hadamard_16x16/;
vpx_dsp/x86/avg_intrin_avx2.c+121−0
@@ -15,6 +15,127 @@ · 14 unmodified lines
1515 #include "vpx_dsp/x86/bitdepth_conversion_avx2.h"
1616 #include "vpx_ports/mem.h"
1717
18+#if CONFIG_VP9_HIGHBITDEPTH
19+static void highbd_hadamard_col8_avx2(__m256i *in, int iter) {
20+ __m256i a0 = in[0];
21+ __m256i a1 = in[1];
22+ __m256i a2 = in[2];
23+ __m256i a3 = in[3];
24+ __m256i a4 = in[4];
25+ __m256i a5 = in[5];
26+ __m256i a6 = in[6];
27+ __m256i a7 = in[7];
28+
29+ __m256i b0 = _mm256_add_epi32(a0, a1);
30+ __m256i b1 = _mm256_sub_epi32(a0, a1);
31+ __m256i b2 = _mm256_add_epi32(a2, a3);
32+ __m256i b3 = _mm256_sub_epi32(a2, a3);
33+ __m256i b4 = _mm256_add_epi32(a4, a5);
34+ __m256i b5 = _mm256_sub_epi32(a4, a5);
35+ __m256i b6 = _mm256_add_epi32(a6, a7);
36+ __m256i b7 = _mm256_sub_epi32(a6, a7);
37+
38+ a0 = _mm256_add_epi32(b0, b2);
39+ a1 = _mm256_add_epi32(b1, b3);
40+ a2 = _mm256_sub_epi32(b0, b2);
41+ a3 = _mm256_sub_epi32(b1, b3);
42+ a4 = _mm256_add_epi32(b4, b6);
43+ a5 = _mm256_add_epi32(b5, b7);
44+ a6 = _mm256_sub_epi32(b4, b6);
45+ a7 = _mm256_sub_epi32(b5, b7);
46+
47+ if (iter == 0) {
48+ b0 = _mm256_add_epi32(a0, a4);
49+ b7 = _mm256_add_epi32(a1, a5);
50+ b3 = _mm256_add_epi32(a2, a6);
51+ b4 = _mm256_add_epi32(a3, a7);
52+ b2 = _mm256_sub_epi32(a0, a4);
53+ b6 = _mm256_sub_epi32(a1, a5);
54+ b1 = _mm256_sub_epi32(a2, a6);
55+ b5 = _mm256_sub_epi32(a3, a7);
56+
57+ a0 = _mm256_unpacklo_epi32(b0, b1);
58+ a1 = _mm256_unpacklo_epi32(b2, b3);
59+ a2 = _mm256_unpackhi_epi32(b0, b1);
60+ a3 = _mm256_unpackhi_epi32(b2, b3);
61+ a4 = _mm256_unpacklo_epi32(b4, b5);
62+ a5 = _mm256_unpacklo_epi32(b6, b7);
63+ a6 = _mm256_unpackhi_epi32(b4, b5);
64+ a7 = _mm256_unpackhi_epi32(b6, b7);
65+
66+ b0 = _mm256_unpacklo_epi64(a0, a1);
67+ b1 = _mm256_unpacklo_epi64(a4, a5);
68+ b2 = _mm256_unpackhi_epi64(a0, a1);
69+ b3 = _mm256_unpackhi_epi64(a4, a5);
70+ b4 = _mm256_unpacklo_epi64(a2, a3);
71+ b5 = _mm256_unpacklo_epi64(a6, a7);
72+ b6 = _mm256_unpackhi_epi64(a2, a3);
73+ b7 = _mm256_unpackhi_epi64(a6, a7);
74+
75+ in[0] = _mm256_permute2x128_si256(b0, b1, 0x20);
76+ in[1] = _mm256_permute2x128_si256(b0, b1, 0x31);
77+ in[2] = _mm256_permute2x128_si256(b2, b3, 0x20);
78+ in[3] = _mm256_permute2x128_si256(b2, b3, 0x31);
79+ in[4] = _mm256_permute2x128_si256(b4, b5, 0x20);
80+ in[5] = _mm256_permute2x128_si256(b4, b5, 0x31);
81+ in[6] = _mm256_permute2x128_si256(b6, b7, 0x20);
82+ in[7] = _mm256_permute2x128_si256(b6, b7, 0x31);
83+ } else {
84+ in[0] = _mm256_add_epi32(a0, a4);
85+ in[7] = _mm256_add_epi32(a1, a5);
86+ in[3] = _mm256_add_epi32(a2, a6);
87+ in[4] = _mm256_add_epi32(a3, a7);
88+ in[2] = _mm256_sub_epi32(a0, a4);
89+ in[6] = _mm256_sub_epi32(a1, a5);
90+ in[1] = _mm256_sub_epi32(a2, a6);
91+ in[5] = _mm256_sub_epi32(a3, a7);
92+ }
93+}
94+
95+void vpx_highbd_hadamard_8x8_avx2(const int16_t *src_diff, ptrdiff_t src_stride,
96+ tran_low_t *coeff) {
97+ __m128i src16[8];
98+ __m256i src32[8];
99+
100+ src16[0] = _mm_loadu_si128((const __m128i *)src_diff);
101+ src16[1] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
102+ src16[2] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
103+ src16[3] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
104+ src16[4] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
105+ src16[5] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
106+ src16[6] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
107+ src16[7] = _mm_loadu_si128((const __m128i *)(src_diff += src_stride));
108+
109+ src32[0] = _mm256_cvtepi16_epi32(src16[0]);
110+ src32[1] = _mm256_cvtepi16_epi32(src16[1]);
111+ src32[2] = _mm256_cvtepi16_epi32(src16[2]);
112+ src32[3] = _mm256_cvtepi16_epi32(src16[3]);
113+ src32[4] = _mm256_cvtepi16_epi32(src16[4]);
114+ src32[5] = _mm256_cvtepi16_epi32(src16[5]);
115+ src32[6] = _mm256_cvtepi16_epi32(src16[6]);
116+ src32[7] = _mm256_cvtepi16_epi32(src16[7]);
117+
118+ highbd_hadamard_col8_avx2(src32, 0);
119+ highbd_hadamard_col8_avx2(src32, 1);
120+
121+ _mm256_storeu_si256((__m256i *)coeff, src32[0]);
122+ coeff += 8;
123+ _mm256_storeu_si256((__m256i *)coeff, src32[1]);
124+ coeff += 8;
125+ _mm256_storeu_si256((__m256i *)coeff, src32[2]);
126+ coeff += 8;
127+ _mm256_storeu_si256((__m256i *)coeff, src32[3]);
128+ coeff += 8;
129+ _mm256_storeu_si256((__m256i *)coeff, src32[4]);
130+ coeff += 8;
131+ _mm256_storeu_si256((__m256i *)coeff, src32[5]);
132+ coeff += 8;
133+ _mm256_storeu_si256((__m256i *)coeff, src32[6]);
134+ coeff += 8;
135+ _mm256_storeu_si256((__m256i *)coeff, src32[7]);
136+}
137+#endif // CONFIG_VP9_HIGHBITDEPTH
138+
18139 static void hadamard_col8x2_avx2(__m256i *in, int iter) {
19140 __m256i a0 = in[0];
20141 __m256i a1 = in[1];

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