[Python-ideas] Fused multiply-add (FMA)

Gregory P. Smith greg at krypto.org
Mon Jan 16 14:28:22 EST 2017


Is there a good reason not to detect single expression multiply adds and
just emit a new FMA bytecode?

Is our goal for floats to strictly match the result of the same operations
coded in unoptimized C using doubles?

Or can we be more precise on occasion?

I guess a similar question may be asked of all C compilers as they too
could emit an FMA instruction on such expressions... If they don't do it by
default, that suggests we match them and not do it either.

Regardless +1 on adding math.fma() either way as it is an expression of
precise intent.

-gps

On Mon, Jan 16, 2017, 10:44 AM David Mertz <mertz at gnosis.cx> wrote:

> My understanding is that NumPy does NOT currently support a direct FMA
> operation "natively."  However, higher-level routines like
> `numpy.linalg.solve` that are linked to MKL or BLAS DO take advantage of
> FMA within the underlying libraries.
>
> On Mon, Jan 16, 2017 at 10:06 AM, Guido van Rossum <gvanrossum at gmail.com>
> wrote:
>
> Does numpy support this?
>
> --Guido (mobile)
>
> On Jan 16, 2017 7:27 AM, "Stephan Houben" <stephanh42 at gmail.com> wrote:
>
> Hi Steve,
>
> Very good!
> Here is a version which also handles the nan's, infinities,
> negative zeros properly.
>
> ===============
> import math
> from fractions import Fraction
>
> def fma2(x, y, z):
>     if math.isfinite(x) and math.isfinite(y) and math.isfinite(z):
>         result = float(Fraction(x)*Fraction(y) + Fraction(z))
>         if not result and not z:
>             result = math.copysign(result, x*y+z)
>     else:
>         result = x * y + z
>         assert not math.isfinite(result)
>     return result
> ===========================
>
> Stephan
>
>
> 2017-01-16 12:04 GMT+01:00 Steven D'Aprano <steve at pearwood.info>:
>
> On Mon, Jan 16, 2017 at 11:01:23AM +0100, Stephan Houben wrote:
>
> [...]
> > So the following would not be a valid FMA fallback
> >
> > double bad_fma(double x, double y, double z) {
> >   return x*y + z;
> > }
> [...]
> > Upshot: if we want to provide a software fallback in the Python code, we
> > need to do something slow and complicated like musl does.
>
> I don't know about complicated. I think this is pretty simple:
>
> from fractions import Fraction
>
> def fma(x, y, z):
>     # Return x*y + z with only a single rounding.
>     return float(Fraction(x)*Fraction(y) + Fraction(z))
>
>
> When speed is not the number one priority and accuracy is important,
> its hard to beat the fractions module.
>
>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>
>
>
> --
> Keeping medicines from the bloodstreams of the sick; food
> from the bellies of the hungry; books from the hands of the
> uneducated; technology from the underdeveloped; and putting
> advocates of freedom in prisons.  Intellectual property is
> to the 21st century what the slave trade was to the 16th.
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170116/f139cc83/attachment-0001.html>


More information about the Python-ideas mailing list