| Ilya Zakharevich on Wed, 24 Jan 2024 12:45:50 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Big GOTCHAs WITH forprime() |
On Fri, Jan 12, 2024 at 02:27:45PM -0800, Ilya Zakharevich wrote:
> ⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜⁜ 1/10000th of a workaround
>
> At some moment, the code which allowed to support arbitrarily large
> primelimit (up to a word size) was removed from PARI. (Compare with
> https://pari.math.u-bordeaux.fr/archives/pari-dev-2401/msg00008.html
> .) So now only the (unoptimized untunable buggy) code above can be
> used in the range about [436e6, 436e6²].
>
> This removal has advantages: when I introduced the code in question,
> it could give a slowdown of 3–5% to forprime() — due to one extra
> (very rarely taken) conditional branch inside a hot loop.
>
> However:
>
> • With the progress in branch prediction in processors during the
> last 20 years, I would not be surprised that this slowdown is
> removed COMPLETELY nowadays.
Oups! What I have been thinking these 20–25 years ago?! However small
the slowdown may be, it can have be REMOVED COMPLETELY!
Just rework the current scheme of the byte
pointer_to_primediff[0] == 0
denoting “the end of the prime difference table” to
pointer_to_primediff[0] == pointer_to_primediff[1] == 0
denoting “the end of this table”.
Then one can encode “a prime difference of 256*n+m > 255 as a sequence of
the form
0 n m
so one can process it in the same (rare) branch used to processing the
end of the list.
Hope this helps,
Ilya
P.S. At the very least, I expect that this may be useful as a way to
speed up primepi() — if needed.