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
306 ::testing::Values(HadamardFuncWithSize(&vpx_highbd_hadamard_8x8_c, 8),306 ::testing::Values(HadamardFuncWithSize(&vpx_highbd_hadamard_8x8_c, 8),
307 HadamardFuncWithSize(&vpx_highbd_hadamard_16x16_c, 16),307 HadamardFuncWithSize(&vpx_highbd_hadamard_16x16_c, 16),
308 HadamardFuncWithSize(&vpx_highbd_hadamard_32x32_c, 32)));308 HadamardFuncWithSize(&vpx_highbd_hadamard_32x32_c, 32)));
309
310#if HAVE_AVX2
311INSTANTIATE_TEST_CASE_P(
312 AVX2, HadamardHighbdTest,
313 ::testing::Values(HadamardFuncWithSize(&vpx_highbd_hadamard_8x8_avx2, 8)));
314#endif // HAVE_AVX2
315
309#endif // CONFIG_VP9_HIGHBITDEPTH316#endif // CONFIG_VP9_HIGHBITDEPTH
310} // namespace317} // 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
786 specialize qw/vpx_hadamard_32x32 sse2 avx2/;786 specialize qw/vpx_hadamard_32x32 sse2 avx2/;
787 787
788 add_proto qw/void vpx_highbd_hadamard_8x8/, "const int16_t *src_diff, ptrdiff_t src_stride, tran_low_t *coeff";788 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/;
790 790
791 add_proto qw/void vpx_highbd_hadamard_16x16/, "const int16_t *src_diff, ptrdiff_t src_stride, tran_low_t *coeff";791 add_proto qw/void vpx_highbd_hadamard_16x16/, "const int16_t *src_diff, ptrdiff_t src_stride, tran_low_t *coeff";
792 specialize qw/vpx_highbd_hadamard_16x16/;792 specialize qw/vpx_highbd_hadamard_16x16/;
vpx_dsp/x86/avg_intrin_avx2.c+121−0
@@ -15,6 +15,127 @@ · 14 unmodified lines
15#include "vpx_dsp/x86/bitdepth_conversion_avx2.h"15#include "vpx_dsp/x86/bitdepth_conversion_avx2.h"
16#include "vpx_ports/mem.h"16#include "vpx_ports/mem.h"
17 17
18#if CONFIG_VP9_HIGHBITDEPTH
19static 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
95void 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
18static void hadamard_col8x2_avx2(__m256i *in, int iter) {139static void hadamard_col8x2_avx2(__m256i *in, int iter) {
19 __m256i a0 = in[0];140 __m256i a0 = in[0];
20 __m256i a1 = in[1];141 __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