History

[Processing/x86] Add an AVX2 implementation of GeneralBilinearAccurateDownsample

Keep track of relative pixel offsets and utilize pshufb to efficiently extract relevant pixels for horizontal scaling ratios <= 8. Because pshufb does not cross 128-bit lanes, the overhead of address calculations and loads is relatively greater as compared with an SSSE3/SSE4.1 implementation. Fall back to a generic approach for ratios > 8. The implementation assumes that data beyond the end of each line, before the next line begins, can be dirtied; which AFAICT is safe with the current usage of these routines. Speedup is ~8.52x/~6.89x (32-bit/64-bit) for horizontal ratios <= 2, ~7.81x/~6.13x for ratios within (2, 4], ~5.81x/~4.52x for ratios within (4, 8], and ~5.06x/~4.09x for ratios > 8 when not memory-bound on Haswell as compared with the current SSE2 implementation.

Sindre Aamås committed 10 years ago

Commit e4902151 parent b43e58a5 files · +616 −0Browse files

Showing the changes to codec/processing/src/downsample (3 of 5 files). Show all

Unified · Split

3 files
  1. codec/processing/src/downsample/downsample.cpp +1 −0
  2. codec/processing/src/downsample/downsample.h +4 −0
  3. codec/processing/src/downsample/downsamplefuncs.cpp +1 −0
codec/processing/src/downsample/downsample.cpp+1−0
@@ -110,6 +110,7 @@ void CDownsampling::InitDownsampleFuncs (SDownsampleFuncs& sDownsampleFunc, int · 109 unmodified lines
110 sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_sse41;110 sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_sse41;
111 }111 }
112 if (iCpuFlag & WELS_CPU_AVX2) {112 if (iCpuFlag & WELS_CPU_AVX2) {
113 sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_avx2;
113 sDownsampleFunc.pfGeneralRatioLuma = GeneralBilinearFastDownsamplerWrap_avx2;114 sDownsampleFunc.pfGeneralRatioLuma = GeneralBilinearFastDownsamplerWrap_avx2;
114 }115 }
115#endif//X86_ASM116#endif//X86_ASM
codec/processing/src/downsample/downsample.h+4−0
@@ -104,6 +104,7 @@ GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_sse2; · 103 unmodified lines
104GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_ssse3;104GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_ssse3;
105GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_sse41;105GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_sse41;
106GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_avx2;106GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_avx2;
107GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_avx2;
107 108
108SpecificDownsampleFunc DyadicBilinearOneThirdDownsampler_ssse3;109SpecificDownsampleFunc DyadicBilinearOneThirdDownsampler_ssse3;
109SpecificDownsampleFunc DyadicBilinearOneThirdDownsampler_sse4;110SpecificDownsampleFunc DyadicBilinearOneThirdDownsampler_sse4;
@@ -126,6 +127,9 @@ void GeneralBilinearAccurateDownsampler_sse41 (uint8_t* pDst, int32_t iDstStride · 16 unmodified lines
126void GeneralBilinearFastDownsampler_avx2 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth,127void GeneralBilinearFastDownsampler_avx2 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth,
127 int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX,128 int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX,
128 uint32_t uiScaleY);129 uint32_t uiScaleY);
130void GeneralBilinearAccurateDownsampler_avx2 (uint8_t* pDst, int32_t iDstStride, int32_t iDstWidth,
131 int32_t iDstHeight, uint8_t* pSrc, int32_t iSrcStride, uint32_t uiScaleX,
132 uint32_t uiScaleY);
129 133
130WELSVP_EXTERN_C_END134WELSVP_EXTERN_C_END
131#endif135#endif
codec/processing/src/downsample/downsamplefuncs.cpp+1−0
@@ -285,6 +285,7 @@ DEFINE_GENERAL_BILINEAR_ACCURATE_DOWNSAMPLER_WRAP (sse2) · 284 unmodified lines
285DEFINE_GENERAL_BILINEAR_FAST_DOWNSAMPLER_WRAP (ssse3)285DEFINE_GENERAL_BILINEAR_FAST_DOWNSAMPLER_WRAP (ssse3)
286DEFINE_GENERAL_BILINEAR_ACCURATE_DOWNSAMPLER_WRAP (sse41)286DEFINE_GENERAL_BILINEAR_ACCURATE_DOWNSAMPLER_WRAP (sse41)
287DEFINE_GENERAL_BILINEAR_FAST_DOWNSAMPLER_WRAP (avx2)287DEFINE_GENERAL_BILINEAR_FAST_DOWNSAMPLER_WRAP (avx2)
288DEFINE_GENERAL_BILINEAR_ACCURATE_DOWNSAMPLER_WRAP (avx2)
288#endif //X86_ASM289#endif //X86_ASM
289 290
290#ifdef HAVE_NEON291#ifdef HAVE_NEON

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