[Haskell-cafe] Performance Issue
James Swaine
james.swaine at gmail.com
Thu Feb 26 12:12:03 EST 2009
i'm implementing a benchmark which includes a detailed specification for a
random number generator. for any of the kernels outlined in the benchmark,
i might have to generate a set of random numbers R, which has a length n,
using the following formulas:
R[k] = ((2^-46)(X[k])) mod 2^46, where
X[k] = (a^k)s
where the values of a and s are constant and defined below.
many of the kernels in the benchmark require a large number of randoms to be
generated (in the tens of millions). when i invoke the following getRandAt
function that many times to build up a list, evaluation of the list takes
forever (somewhere between 5 and 10 minutes). i've tried optimizing this
several different ways, with no luck. i though i might post my code here
and see if anyone notices anything i'm doing wrong that might be causing
such a large bottleneck:
--constants
a :: Int64
a = 5^13
divisor :: Int64
divisor = 2^46
multiplier :: Float
multiplier = 2**(-46)
--gets r[k], which is the value at the kth
--position in the overall sequence of
--pseudorandom numbers
getRandAt :: Int64 -> Int64 -> Float
getRandAt 0 seed = multiplier * (fromIntegral seed)
getRandAt k seed = multiplier * (fromIntegral x_next)
where
x_prev = (a^k * seed) `mod` divisor
x_next = (a * x_prev) `mod` divisor
thanks all in advance for your help!
-james
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090226/0726675e/attachment.htm
More information about the Haskell-Cafe
mailing list