about summary refs log tree commit diff
path: root/ChangeLog
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2013-06-12 10:36:48 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2013-06-12 10:36:48 +0530
commit2506109403de69bd454de27835d42e6eb6ec3abc (patch)
treef6830d3dba0fff9d4b5909616c0a111599263a8d /ChangeLog
parent59b3055595783f347b899a9588ddad0280feded9 (diff)
downloadglibc-2506109403de69bd454de27835d42e6eb6ec3abc.tar.gz
glibc-2506109403de69bd454de27835d42e6eb6ec3abc.tar.xz
glibc-2506109403de69bd454de27835d42e6eb6ec3abc.zip
Set/restore rounding mode only when needed
The most common use case of math functions is with default rounding
mode, i.e. rounding to nearest.  Setting and restoring rounding mode
is an unnecessary overhead for this, so I've added support for a
context, which does the set/restore only if the FP status needs a
change.  The code is written such that only x86 uses these.  Other
architectures should be unaffected by it, but would definitely benefit
if the set/restore has as much overhead relative to the rest of the
code, as the x86 bits do.

Here's a summary of the performance improvement due to these
improvements; I've only mentioned functions that use the set/restore
and have benchmark inputs for x86_64:

Before:

cos(): ITERS:4.69335e+08: TOTAL:28884.6Mcy, MAX:4080.28cy, MIN:57.562cy, 16248.6 calls/Mcy
exp(): ITERS:4.47604e+08: TOTAL:28796.2Mcy, MAX:207.721cy, MIN:62.385cy, 15543.9 calls/Mcy
pow(): ITERS:1.63485e+08: TOTAL:28879.9Mcy, MAX:362.255cy, MIN:172.469cy, 5660.86 calls/Mcy
sin(): ITERS:3.89578e+08: TOTAL:28900Mcy, MAX:704.859cy, MIN:47.583cy, 13480.2 calls/Mcy
tan(): ITERS:7.0971e+07: TOTAL:28902.2Mcy, MAX:1357.79cy, MIN:388.58cy, 2455.55 calls/Mcy

After:

cos(): ITERS:6.0014e+08: TOTAL:28875.9Mcy, MAX:364.283cy, MIN:45.716cy, 20783.4 calls/Mcy
exp(): ITERS:5.48578e+08: TOTAL:28764.9Mcy, MAX:191.617cy, MIN:51.011cy, 19071.1 calls/Mcy
pow(): ITERS:1.70013e+08: TOTAL:28873.6Mcy, MAX:689.522cy, MIN:163.989cy, 5888.18 calls/Mcy
sin(): ITERS:4.64079e+08: TOTAL:28891.5Mcy, MAX:6959.3cy, MIN:36.189cy, 16062.8 calls/Mcy
tan(): ITERS:7.2354e+07: TOTAL:28898.9Mcy, MAX:1295.57cy, MIN:380.698cy, 2503.7 calls/Mcy

So the improvements are:

cos: 27.9089%
exp: 22.6919%
pow: 4.01564%
sin: 19.1585%
tan: 1.96086%

The downside of the change is that it will have an adverse performance
impact on non-default rounding modes, but I think the tradeoff is
justified.
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog49
1 files changed, 49 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f42d563fb8..66ac05a36b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,52 @@
+2013-06-12  Siddhesh Poyarekar  <siddhesh@redhat.com>
+
+	* include/fenv.h: Include stdbool.h.
+	(struct rm_ctx): New structure.
+	* sysdeps/generic/math_private.h (SET_RESTORE_ROUND_GENERIC):
+	Define macro.
+	(SET_RESTORE_ROUND): Define using SET_RESTORE_ROUND_GENERIC.
+	(SET_RESTORE_ROUNDF): Likewise.
+	(SET_RESTORE_ROUNDL): Likewise.
+	(SET_RESTORE_ROUND_NOEX): Likewise.
+	(SET_RESTORE_ROUND_NOEXF): Likewise.
+	(SET_RESTORE_ROUND_NOEXL): Likewise.
+	(SET_RESTORE_ROUND_53BIT): Likewise.
+	[HAVE_RM_CTX] (libc_feresetround_noex_ctx): Define macro.
+	(libc_feresetround_noexf_ctx): Likewise.
+	(libc_feresetround_noexl_ctx): Likewise.
+	(libc_feholdsetround_53bit_ctx): Likewise.
+	(libc_feresetround_53bit_ctx): Likewise.
+	* sysdeps/i386/fpu/fenv_private.h (HAVE_RM_CTX): Define macro.
+	(libc_feholdexcept_setround_sse_ctx): New function.
+	(libc_fesetenv_sse_ctx): Likewise.
+	(libc_feupdateenv_sse_ctx): Likewise.
+	(libc_feholdexcept_setround_387_prec_ctx): Likewise.
+	(libc_feholdexcept_setround_387_ctx): Likewise.
+	(libc_feholdexcept_setround_387_53bit_ctx): Likewise.
+	(libc_feholdsetround_387_prec_ctx): Likewise.
+	(libc_feholdsetround_387_ctx): Likewise.
+	(libc_feholdsetround_387_53bit_ctx): Likewise.
+	(libc_feholdsetround_sse_ctx): Likewise.
+	(libc_feresetround_sse_ctx): Likewise.
+	(libc_feresetround_387_ctx): Likewise.
+	(libc_feupdateenv_387_ctx): Likewise.
+	(libc_feholdexcept_setroundf_ctx): Define macro.
+	(libc_fesetenvf_ctx): Likewise.
+	(libc_feupdateenvf_ctx): Likewise.
+	(libc_feholdsetroundf_ctx): Likewise.
+	(libc_feresetroundf_ctx): Likewise.
+	(libc_feholdexcept_setround_ctx): Likewise.
+	(libc_fesetenv_ctx): Likewise.
+	(libc_feupdateenv_ctx): Likewise.
+	(libc_feholdsetround_ctx): Likewise.
+	(libc_feresetround_ctx): Likewise.
+	(libc_feholdexcept_setroundl_ctx): Likewise.
+	(libc_feupdateenvl_ctx): Likewise.
+	(libc_feholdsetroundl_ctx): Likewise.
+	(libc_feresetroundl_ctx): Likewise.
+	[!__SSE2_MATH__] (libc_feholdsetround_53bit_ctx): Likewise.
+	(libc_feresetround_53bit_ctx): Likewise.
+
 2013-06-11  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
 	* locale/iso-639.def: Convert to UTF-8.