Average vertically before horizontally; horizontal averaging is more worksome. Doing the vertical averaging first reduces the number of horizontal averages by half. Use pmaddubsw and pavgw to do the horizontal averaging for a slight performance improvement. Minor tweaks. Improve the SSSE3 dyadic downsample routines and drop the SSE4 routines. The non-temporal loads used in the SSE4 routines do nothing for cache- backed memory AFAIK. Adjust tests because averaging vertically first gives slightly different output. ~2.39x speedup for the widthx32 routine on Haswell when not memory-bound. ~2.20x speedup for the widthx16 routine on Haswell when not memory-bound. Note that the widthx16 routine can be unrolled for further speedup.
Showing the changes to codec/processing/src/downsample (2 of 7 files). Show all
Unified · Split
| @@ -102,8 +102,6 @@ void CDownsampling::InitDownsampleFuncs (SDownsampleFuncs& sDownsampleFunc, int · 101 unmodified lines | |||
| 102 | sDownsampleFunc.pfGeneralRatioLuma = GeneralBilinearFastDownsamplerWrap_ssse3; | 102 | sDownsampleFunc.pfGeneralRatioLuma = GeneralBilinearFastDownsamplerWrap_ssse3; |
| 103 | } | 103 | } |
| 104 | if (iCpuFlag & WELS_CPU_SSE41) { | 104 | if (iCpuFlag & WELS_CPU_SSE41) { |
| 105 | sDownsampleFunc.pfHalfAverageWidthx32 = DyadicBilinearDownsamplerWidthx32_sse4; | ||
| 106 | sDownsampleFunc.pfHalfAverageWidthx16 = DyadicBilinearDownsamplerWidthx16_sse4; | ||
| 107 | sDownsampleFunc.pfOneThirdDownsampler = DyadicBilinearOneThirdDownsampler_sse4; | 105 | sDownsampleFunc.pfOneThirdDownsampler = DyadicBilinearOneThirdDownsampler_sse4; |
| 108 | sDownsampleFunc.pfQuarterDownsampler = DyadicBilinearQuarterDownsampler_sse4; | 106 | sDownsampleFunc.pfQuarterDownsampler = DyadicBilinearQuarterDownsampler_sse4; |
| 109 | sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_sse41; | 107 | sDownsampleFunc.pfGeneralRatioChroma = GeneralBilinearAccurateDownsamplerWrap_sse41; |
| @@ -94,10 +94,6 @@ HalveDownsampleFunc DyadicBilinearDownsamplerWidthx32_sse; · 93 unmodified lines | |||
| 94 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx16_ssse3; | 94 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx16_ssse3; |
| 95 | // iSrcWidth= x32 pixels | 95 | // iSrcWidth= x32 pixels |
| 96 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx32_ssse3; | 96 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx32_ssse3; |
| 97 | // iSrcWidth= x16 pixels | ||
| 98 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx16_sse4; | ||
| 99 | // iSrcWidth= x32 pixels | ||
| 100 | HalveDownsampleFunc DyadicBilinearDownsamplerWidthx32_sse4; | ||
| 101 | 97 | ||
| 102 | GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_sse2; | 98 | GeneralDownsampleFunc GeneralBilinearFastDownsamplerWrap_sse2; |
| 103 | GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_sse2; | 99 | GeneralDownsampleFunc GeneralBilinearAccurateDownsamplerWrap_sse2; |