| Karim Belabas on Thu, 25 Oct 2012 18:58:10 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: forprime in 32bit is 50x slower if p>2^32 |
* Bill Allombert [2012-10-25 18:27]:
> Dear PARI developers,
>
> forprime is very slow in 32bit for large primes:
>
> gettime();my(s);forprime(p=2,6*10^9,s++;if(s%10^7==0,print(p,":",gettime())));s
>
> *** last result computed in 2min, 11,909 ms.
> give time close to 4700 ms/10^7 primes on 64bit.
>
> On 32bit we get times around 5000ms until we hit 2^32, then:
>
> 4222234741:4912
> 4444120783:172124
> 4666527007:261320
> 4889388631:266533
> 5112733757:270694
> 5336500537:274085
> 5560695863:274562
> 5785258351:278089
> ? ##
> *** last result computed in 36min, 7,175 ms.
>
> This is a 50x slowdown. This explains why ellheegner is significantly
> slower on 32bit.
Threshold between an efficient sieve and expensive unextprime()...
My sieve implementation (based on the code Charles Greathouse
contributed) is currently restricted to ulongs, so to p < 2^32 on 32-bit
machines. The sieving code itself can handle integers < 2^64 even on
32-bit machines, but I didn't bother to develop a proper interface for
this (ulong -> GEN when computing bounds and initializing sieve chunks),
for the sake of code simplicity.
I would not make it a priority: we have many more projects than we can handle
already :-(. Anyway, the code works also on 32-bit machines, it's just
much slower there; are there still people restricted to 32-bit machines
for heavy duty computations nowadays ?
Cheers,
K.B.
P.S: I believe unextprime() is expensive because it must certify actual
primes [ via uisprime() ], probably not because it must eliminate
composite numbers.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux1.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP]
`