[FFmpeg-devel] [PATCH][RFC] lavu/libm: add exp10 support
Ganesh Ajjanagadde
gajjanagadde at gmail.com
Tue Dec 22 04:19:50 CET 2015
exp10 is a function available in GNU libm. Looks like no other common
libm has it. As such, I am mostly neutral about its inclusion, with a
very slight bias in favor since I am actually posting this.
pros:
1. It is faster than pow, and has less of a chance of going into one of
the terribly slow paths:
https://github.com/andikleen/glibc/blob/rtm-devel9/sysdeps/ieee754/dbl-64/e_exp10.c
vs
https://github.com/andikleen/glibc/blob/rtm-devel9/sysdeps/ieee754/dbl-64/e_pow.c.
Speedup is roughly 30% of the original execution time for an "average"
benchmark over 1e8 arguments uniformly spaced from -1 to 1
(similar results for other intervals):
./test 4.07s user 0.00s system 100% cpu 4.068 total (exp10)
./test 5.71s user 0.00s system 100% cpu 5.711 total (pow)
cons:
1. It is GNU libm only, and requires -D_GNU_SOURCE.
2. Speedup is not that impressive.
3. pow(10, x) is not terribly common in the code, and still cheaper
approximation (not as accurate, but often reasonable) exp(ln(10)*x) is
much faster:
./test 2.55s user 0.00s system 99% cpu 2.548 total (exp(ln(10)*x))
4. It (AFAIK) does not lie in speed critical code anyway, and for table
generation purposes, there often exist tailored, much faster approaches
anyway.
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
---
configure | 2 ++
libavutil/libm.h | 14 ++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/configure b/configure
index 46021c4..f63741d 100755
--- a/configure
+++ b/configure
@@ -1796,6 +1796,8 @@ MATH_FUNCS="
copysign
cosf
erf
+ exp10
+ exp10f
exp2
exp2f
expf
diff --git a/libavutil/libm.h b/libavutil/libm.h
index 146768a..c05acea 100644
--- a/libavutil/libm.h
+++ b/libavutil/libm.h
@@ -282,6 +282,20 @@ static inline double erf(double z)
#define expf(x) ((float)exp(x))
#endif
+#if !HAVE_EXP10
+static av_always_inline double exp10(double x)
+{
+ return pow(10, x);
+}
+#endif
+
+#if !HAVE_EXP10F
+static av_always_inline float exp10f(float x)
+{
+ return powf(10, x);
+}
+#endif
+
#if !HAVE_EXP2
#undef exp2
#define exp2(x) exp((x) * 0.693147180559945)
--
2.6.4
More information about the ffmpeg-devel
mailing list