[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#718577: libc6: Libc6/libm-2.17 almost two times slower than 2.13 in trigonometric calculations



On Fri, Aug 2, 2013 at 12:10 PM, bugsbuster <hal.bugsbuster@gmail.com> wrote:
>    * What led up to the situation?

Upstream glibc fixed a number of correctness issues in non-default
rounding modes.

These correctness issues had a performance impact which has only just
been fixed in 2.18.

I suggest Debian backport Siddhesh Poyarekar's work to fix this:
~~~
commit 2506109403de69bd454de27835d42e6eb6ec3abc
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
Date:   Wed Jun 12 10:36:48 2013 +0530

    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

    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.
~~~


Reply to: