[libmath-prime-util-perl] 22/35: Tweaks to LMO performance
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:50:04 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.33
in repository libmath-prime-util-perl.
commit ffec9178601147fec901824d40102c3a05f95550
Author: Dana Jacobsen <dana at acm.org>
Date: Fri Nov 8 15:05:25 2013 -0800
Tweaks to LMO performance
---
lehmer.c | 55 +++++++++++++++++++++++++++++--------------------------
1 file changed, 29 insertions(+), 26 deletions(-)
diff --git a/lehmer.c b/lehmer.c
index 4e43f6e..45f6fe2 100644
--- a/lehmer.c
+++ b/lehmer.c
@@ -367,8 +367,8 @@ static uint32_t mapes7_32(uint32_t x) {
}
/* Max memory = 2*A*X bytes, e.g. 2*400*24000 = 18.3 MB */
-#define PHICACHEA 400
-#define PHICACHEX 32768
+#define PHICACHEA 257
+#define PHICACHEX 32769
typedef struct
{
uint32_t max[PHICACHEA];
@@ -392,28 +392,25 @@ static void phicache_free(cache_t* cache) {
}
#define PHI_CACHE_POPULATED(x, a) \
- ((a) < PHICACHEA && (x) < PHICACHEX && \
- cache->max[a] > (x) && cache->val[a][x] != 0)
-
-static void phi_cache_insert(UV x, UV a, IV sum, cache_t* cache) {
- if (a < PHICACHEA && x < PHICACHEX) {
- uint32_t cap = ((x+1+31)/32)*32;
- if (cache->val[a] == 0) {
- Newz(0, cache->val[a], cap, int16_t);
- cache->max[a] = cap;
- } else if (cache->max[a] < cap) {
- uint32_t i;
- Renew(cache->val[a], cap, int16_t);
- for (i = cache->max[a]; i < cap; i++)
- cache->val[a][i] = 0;
- cache->max[a] = cap;
- }
- if (sum < SHRT_MIN || sum > SHRT_MAX)
- croak("phi(%lu,%lu) 16-bit overflow: sum = %ld\n", x, a, sum);
- if (cache->val[a] == 0)
- croak("phi cache allocation failure");
- cache->val[a][x] = sum;
+ ((a) < PHICACHEA && (UV) cache->max[a] > (x) && cache->val[a][x] != 0)
+
+static void phi_cache_insert(uint32_t x, uint32_t a, IV sum, cache_t* cache) {
+ uint32_t cap = ( (x+32) >> 5) << 5;
+ if (cache->val[a] == 0) {
+ Newz(0, cache->val[a], cap, int16_t);
+ cache->max[a] = cap;
+ } else if (cache->max[a] < cap) {
+ uint32_t i;
+ Renew(cache->val[a], cap, int16_t);
+ for (i = cache->max[a]; i < cap; i++)
+ cache->val[a][i] = 0;
+ cache->max[a] = cap;
}
+ if (sum < SHRT_MIN || sum > SHRT_MAX)
+ croak("phi(%lu,%lu) 16-bit overflow: sum = %ld\n", x, a, sum);
+ if (cache->val[a] == 0)
+ croak("phi cache allocation failure");
+ cache->val[a][x] = sum;
}
static IV _phi3(UV x, UV a, int sign, const UV* const primes, const UV lastidx, cache_t* cache)
@@ -450,7 +447,8 @@ static IV _phi3(UV x, UV a, int sign, const UV* const primes, const UV lastidx,
sum = sign * mapes(x, a);
}
}
- phi_cache_insert(x, a, sign * sum, cache);
+ if (a < PHICACHEA && x < PHICACHEX)
+ phi_cache_insert(x, a, sign * sum, cache);
return sum;
}
#define phi_small(x, a, primes, lastidx, cache) _phi3(x, a, 1, primes, lastidx, cache)
@@ -878,6 +876,11 @@ UV _XS_LMO_pi(UV n)
}
lpf[1] = UV_MAX; /* Set lpf[1] to max */
+ /* Remove mu[i] == 0 using lpf */
+ for (i = 1; i <= n13; i++)
+ if (mu[i] == 0)
+ lpf[i] = 0;
+
/* Thanks to Kim Walisch for help with the S1+S2 calculations. */
k = (a < 7) ? a : 7;
S1 = 0;
@@ -885,7 +888,7 @@ UV _XS_LMO_pi(UV n)
phicache_init(&pcache);
TIMING_START;
for (i = 1; i <= n13; i++)
- if (lpf[i] > primes[k] && mu[i] != 0)
+ if (lpf[i] > primes[k])
/* S1 += mu[i] * phi_small(n/i, k, primes, lastprime, &pcache); */
S1 += mu[i] * phi(n/i, k);
TIMING_END_PRINT("S1")
@@ -895,7 +898,7 @@ UV _XS_LMO_pi(UV n)
UV p = primes[i+1];
/* TODO: #pragma omp parallel for reduction(+: S2) firstprivate(pcache) schedule(dynamic, 16) */
for (j = (n13/p)+1; j <= n13; j++)
- if (lpf[j] > p && mu[j] != 0)
+ if (lpf[j] > p)
S2 += -mu[j] * phi_small(n / (j*p), i, primes, lastprime, &pcache);
}
TIMING_END_PRINT("S2")
--
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