[libmath-prime-util-perl] 05/14: Update for primesieve 4.2
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:47:52 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.25
in repository libmath-prime-util-perl.
commit 184a6885ecccf263286ac36669638c0c306536ff
Author: Dana Jacobsen <dana at acm.org>
Date: Tue Mar 12 09:06:27 2013 -0700
Update for primesieve 4.2
---
lehmer.c | 58 +++++++++++++++++++++++++++++++++-------------------------
1 file changed, 33 insertions(+), 25 deletions(-)
diff --git a/lehmer.c b/lehmer.c
index 1417e2e..848f6d9 100644
--- a/lehmer.c
+++ b/lehmer.c
@@ -45,21 +45,25 @@
* with parallel primesieve it is over 10x faster.
* pix4(10^16) takes 124 minutes, this code + primesieve takes < 4 minutes.
*
- * Timings with Perl + MPU with all-serial computation. Using the standalone
- * program with parallel primesieve speeds up stage 4 a lot for large values.
+ * Timings with Perl + MPU with all-serial computation.
* The last column is the standalone time with 12-core parallel primesieve.
*
* n phi(x,a) mem/time | stage 4 mem/time | total time | pps time
- * 10^19 1979.41 | ~13GB | | 7h 26m
- * 10^18 5515MB 483.46 | 5390MB | | 87m 0s
- * 10^17 1698MB 109.56 | 1568MB 9684.1 | 163m 36 s | 17m 37s
- * 10^16 522MB 24.14 | 460MB 1066.3 | 18m 12 s | 3m 44s
- * 10^15 159MB 5.58 | 137MB 142.5 | 2m 28 s | 48.17 s
- * 10^14 48MB 1.28 | 41MB 22.26 | 23.61 s | 10.55 s
- * 10^13 14MB 0.294 | 12MB 3.82 | 4.12 s | 2.40 s
- * 10^12 4MB 0.070 | 4MB 0.707 | 0.78 s | 0.527
- * 10^11 1MB 0.015 | 0.135 | 0.158s | 0.124s
- * 10^10 0.003 | 0.029 | 0.028s | 0.036s
+ * 10^19 17884MB 1979.41 | 9144MB | | 7h 26m
+ * 10^18 5515MB 483.46 | 2394MB | | 87m 0s
+ * 10^17 1698MB 109.56 | 634MB 9684.1 | 163m 36 s | 17m 45s
+ * 10^16 522MB 24.14 | 171MB 1066.3 | 18m 12 s | 3m 44s
+ * 10^15 159MB 5.58 | 47MB 142.5 | 2m 28 s | 47.66 s
+ * 10^14 48MB 1.28 | 13MB 22.26 | 23.61 s | 10.25 s
+ * 10^13 14MB 0.294 | 4MB 3.82 | 4.12 s | 2.21 s
+ * 10^12 4MB 0.070 | 1MB 0.707 | 0.78 s | 0.459s
+ * 10^11 1MB 0.015 | 0.135 | 0.158s | 0.097s
+ * 10^10 0.003 | 0.029 | 0.028s | 0.025s
+ *
+ * Using the standalone program with parallel primesieve speeds up stage 4
+ * a lot for large values, as can be seen by the last column. It does use
+ * quite a bit more memory in stage 4 however (lowering SIEVE_MULT can reduce
+ * it by as much as 10x, at the expense of some performance).
*
* Reference: Hans Riesel, "Prime Numbers and Computer Methods for
* Factorization", 2nd edition, 1994.
@@ -86,9 +90,10 @@ static int const verbose = 0;
#ifdef PRIMESIEVE_STANDALONE
-/* countPrimes seems to be pretty slow for small ranges, so sieve more small
- * primes and count using binary search. Uses a lot of memory though. For
- * big ranges, countPrimes is really fast. */
+/* countPrimes can be pretty slow for small ranges, so sieve more small primes
+ * and count using binary search. Uses a lot of memory though. For big
+ * ranges, countPrimes is really fast. If you use primesieve 4.2, the
+ * crossover point is lower (better). */
#define SIEVE_MULT 10
#include <limits.h>
@@ -134,12 +139,14 @@ static UV isqrt(UV n)
static UV* sieve_array = 0;
static UV sieve_k;
static UV sieve_n;
+class stop_primesieve : public std::exception { };
void primesieve_callback(uint64_t pk) {
- if (sieve_k <= sieve_n) {
- if (pk < sieve_array[sieve_k-1])
- croak("Primes generated out of order. Switch to serial mode.\n");
- sieve_array[sieve_k++] = pk;
- }
+ if (sieve_k > sieve_n) throw stop_primesieve();
+ /*
+ if (pk < sieve_array[sieve_k-1])
+ croak("Primes generated out of order. Switch to serial mode.\n");
+ */
+ sieve_array[sieve_k++] = pk;
}
/* Generate an array of n small primes, where the kth prime is element p[k].
@@ -162,9 +169,12 @@ static UV* generate_small_primes(UV n)
sieve_array = primes;
sieve_n = n;
sieve_k = 1;
- SET_PPS_SERIAL;
- ps.generatePrimes(2, nth_prime, primesieve_callback);
- SET_PPS_PARALLEL;
+ {
+ PrimeSieve sps;
+ try {
+ sps.generatePrimes(2, nth_prime, primesieve_callback);
+ } catch (stop_primesieve&) { }
+ }
sieve_array = 0;
return primes;
}
@@ -764,8 +774,6 @@ int main(int argc, char *argv[])
gettimeofday(&t0, 0);
- /* Using a smaller preseive speeds us up since our counts are usually small */
- ps.setPreSieve(13);
SET_PPS_PARALLEL;
if (!strcasecmp(method, "lehmer")) { pi = _XS_lehmer_pi(n); }
else if (!strcasecmp(method, "meissel")) { pi = _XS_meissel_pi(n); }
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list