[flac-dev] PATCH for replaygain_synthesis

John Edwards john.edwards33 at ntlworld.com
Sun May 18 03:18:57 PDT 2014


I've not benchmarked to know if their is any real benefit, but changing 
the include in fast_float_math_hack.h to <mathimf.h> is all that is 
required to use the latest ICC.

John

On 17/05/2014 10:26, lvqcl wrote:
> The file
> src/share/replaygain_synthesis/include/private/fast_float_math_hack.h
> redefines 'tanh' as 'tanhf'. This file is intended for Intel Compiler only,
> but it includes outdated mathf.h and doesn't work with current versions
> of ICC.
>
> The fixes are trivial though, and I compiled 2 versions of flac.exe:
> with this
> 'hack' turned off an on. The difference in decoding speed is very close to
> measurement inaccuracy: for 32-bit encoder the decoding time decreases
> from 94.5s
> to 94.0s, for 64-bit it increases from 82.6s to 82.9s.
> (the option for this test was:
> --apply-replaygain-which-is-not-lossless=Ln0)
>
> So this hack is really useless today, and the first patch removes
> fast_float_math_hack.h from the sources.
>
>
>
>
> MSVS profiler shows that tanh calculation doesn't require too much CPU
> resources,
> the real problem is an integer division (int_64/int_32) in this line:
>
>      val64 = dither_output_(........) / conv_factor;
>
> Since all possible values of conv_factor are powers of 2, it's possible to
> replace division with shift. The second patch does this.
>
> Decoding time decreases from 94.5s to 64.1s for 32-bit ICC compile, and
> from 82.6s to 50.0s for 64-bit ICC compile.
>
>
>
> *************************************************
> P.S. Actually, shift ( x << n ) and division ( x / (1<<n) ) can give
> different results if x < 0. The difference is very small though: WAV files
> differ by 1 LSB. And probably shift gives better results than division.
>
> Let's compare shift by 2 and division by (1<<2) == 4:
>
> *** shift ***
> argument            result
> ....
> 12, 13, 14, 15  ->    3
>   8,  9, 10, 11  ->    2
>   4,  5,  6,  7  ->    1
>   0,  1,  2,  3  ->    0
> -4, -3, -2, -1  ->   -1
> -8, -7, -6, -5  ->   -2
> ....
>
> *** division ***
> argument                       result
> ....
> 12, 13, 14, 15              ->    3
>   8,  9, 10, 11              ->    2
>   4,  5,  6,  7              ->    1
> -3, -2, -1,  0,  1,  2,  3  ->    0
> -7, -6, -5, -4  ->          ->   -1
> -11,-10,-9, -8  ->          ->   -2
> ....
>
>
> So, shift results in small DC offset (1/2 LSB), division results in
> small 'nonlinearity' near 0.
>
>
> _______________________________________________
> flac-dev mailing list
> flac-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/flac-dev
>


More information about the flac-dev mailing list