[FFmpeg-devel] [PATCH] lavu/libm: add exp10 support
gajjanag at mit.edu
Wed Dec 23 18:25:09 CET 2015
On Tue, Dec 22, 2015 at 4:31 PM, Ganesh Ajjanagadde <gajjanag at mit.edu> wrote:
> On Tue, Dec 22, 2015 at 4:17 PM, Hendrik Leppkes <h.leppkes at gmail.com> wrote:
>> On Wed, Dec 23, 2015 at 12:29 AM, Ganesh Ajjanagadde
>> <gajjanagadde at gmail.com> wrote:
>>> exp10 is a function available in GNU libm. Looks like no other common
>>> libm has it. This adds support for it to FFmpeg.
>>> There are essentially 2 ways of handling the fallback:
>>> 1. Using pow(10, x)
>>> 2. Using exp2(M_LOG2_10 * x).
>>> First one represents a Pareto improvement, with no speed or accuracy
>>> regression anywhere, but speed improvement limited to GNU libm.
>>> Second one represents a slight accuracy loss (relative error ~ 1e-13)
>>> for non GNU libm. Speedup of > 2x is obtained on non GNU libm platforms,
>>> ~30% on GNU libm. These are "average case numbers", another benefit is
>>> the lack of triggering of the well-known terrible worst case paths
>>> through pow.
>>> Based on reviews, second one chosen. Comment added accordingly.
>>> Reviewed-by: Michael Niedermayer <michael at niedermayer.cc>
>>> Reviewed-by: Ronald S. Bultje <rsbultje at gmail.com>
>>> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>>> configure | 2 ++
>>> libavutil/libm.h | 24 ++++++++++++++++++++++++
>>> 2 files changed, 26 insertions(+)
>>> diff --git a/configure b/configure
>>> index 54c9789..ea717a5 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -1815,6 +1815,8 @@ MATH_FUNCS="
>>> + exp10
>>> + exp10f
>>> diff --git a/libavutil/libm.h b/libavutil/libm.h
>>> index 146768a..9705755 100644
>>> --- a/libavutil/libm.h
>>> +++ b/libavutil/libm.h
>>> @@ -292,6 +292,30 @@ static inline double erf(double z)
>>> #define exp2f(x) ((float)exp2(x))
>>> #endif /* HAVE_EXP2F */
>>> +/* Somewhat inaccurate fallbacks, relative error ~ 1e-13 concentrated on very
>>> +small and very large values. For perfection accuracy-wise, should use pow.
>>> +Speed benefits (>2x average, with no super slow paths) deemed to be worth the
>>> +accuracy tradeoff */
>>> +#if !HAVE_EXP10
>>> +static av_always_inline double exp10(double x)
>>> +#ifndef M_LOG2_10
>>> +#define M_LOG2_10 3.32192809488736234787 /* log_2 10 */
>> Should include mathematic.h for this constant, it already defines
>> common constants if not present.
> Did not know if it was safe or not. Changed locally, thanks.
More information about the ffmpeg-devel