[Tim, incidentally notes that passing 10 as the divisor to inplace_divrem1()
 is "impossibly fast" on Windows, consuming less than a third the time as
 when passing seemingly any other divisor]

[Mark Dickinson, discovers much the same is true under other, but not all,
 Linux-y builds, due to the generated code doing a runtime(!) check for
 10 and using a scaled integer reciprocal multiplication trick, instead of
 HW division, in that specific case]

And there's a picture of this in the dictionary, next to the "dubious
optimization" entry ;-)

I have to believe the same is true under Visual Studio 2019, but
offhand don't know how to prove that. I understand Steve uses PGO to
build the python.org Windows release, but I've never done that - the
"Release build" configuration I get from Github does not use PGO, and
the code I get from my own "release builds" is equally slow for all
divisors (and the generated assembler is obviously not trying to
special-case anything).

You later gave PGO the credit, which made sense from the start. But I
_assumed_ PGO was latching on to // 10 because all sorts of programs
use that all the time simply as a consequence of converting Python
integers to strings. But that's not it, The base-conversion code
doesn't call inplace_divrem1() - it does its own division loops with
compile-time constants.

So, as you already said ;-), it appears to be mostly an accident due
to the specific tests we feed to PGO builds.

More interesting to me now is the "over 3x faster" empirical
observation. The paper I referenced earlier has a cheaper way to use
scaled integer reciprocals, requiring nothing worse than 32x32->64 int
mult, and, to compute the fudged reciprocal, nothing worse than
64x32-:>32 int divide.

OTOH, libdivide already has working code ready to use, and - unlike
the paper I referenced - does not require "normalizing" the divisor
(shifting left to ensure it's >= base/2).

libdivide needs more cycles to compute its 64-bit reciprocal, but in
the context of bigints that's amortized over the number of digits in
the numerator. A win is a win ;-)
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/NEUNFZU3TQU4CPTYZNF3WCN7DOJBBTK5/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to