First cut of rand_rate...

Robert G. Brown rgb at phy.duke.edu
Thu Jan 16 13:22:19 PST 2003


Just for folks interested in the gsl rngs (and so far ONLY the gsl rngs)
I'm announcing the first 0.1.0 cut of a rng benchmarking and testing
tool called "rand_rate" that is directly integrated with the gsl.

You can get a (linux "only", as it uses /dev/random to seed) tarball of
the source from

  http://www.phy.duke.edu/~rgb/rand_rate.tgz

which "should" just make on a linux box with the gsl installed.

It seeds from /dev/random, and will need to be hacked to support a
different seeding mechanism (like the one indicated in the gsl manual)
if you don't have a /dev/random device on your machine or use a
different OS.

This snapshot isn't documented anywhere but in this note and in the
source, so ignore the "man page" and output from -h.  All that works is:

If entered as

  rand_rate -v 2

it will list all the gsl random number generators (if your gsl revision
is far enough along that e.g. gsl_rng_name() etc. exists).

If entered as

  rand_rate -t gsl_num

(where gsl_num is the index number of one of the tests from the -v 2
listing)  it should run the benchmark, e.g.:

rgb at ganesh|T:454>rand_rate -t 12
#========================================================================
# Timing "Empty" Loop
# Samples = 100  Loop iterations per sample = 8388608
# Time(sec): 2.34589458e-09 +/- 9.09979502e-12
#========================================================================
# Timing test 12
# Time(sec): 4.33561719e-05 +/- 5.91981762e-08
# Samples = 100  Loop iterations per sample = 256
#========================================================================
# Benchmark of the gsl_rnd_int() for the mt19937 generator:
#    and vector size = 1000 (4000 bytes)
# Average Time:  43.35 nanoseconds
# BogomegaRate:  23.07 mt19937 megarands per second

Actually, one should still be able to use e.g. -s and -n options to vary
vector size and number of samples, but I don't think they'll be
important for this benchmark.

Note that the benchmark for /dev/random doesn't yet work, and I don't
yet have any homemade tests (ones not yet in the gsl) wrapped so ignore
the final /dev/random index.  I'm hoping to put a nice gsl wrapper in
this testing program so that anything from a hardware generator to a new
software generator can be wrapped up for testing (preferrably without
having to rebuild the entire gsl library:-) and then simply added to the
gsl if it is deemed worthy.

At this moment, rand_rate only times the tests and returns their
"bogomegarate" of a gsl rng -- a very respectable 23 million unsigned
long random integers per second, for the excellent mt19937 generator on
my 1300 MHz Athlon desktop, for example.

My next chore (after arranging for importing hw/sw generators
consistently in gsl wrappers) is going to be integrating this tool with
all the tests I can from both diehard and sts (and any additional ones
that come to mind or are suggested).  The same tool should eventually be
able to both benchmark a rng and automagically test its overall quality
against a decent sized set of well-known tests.  This would greatly
simplify rng selection and implementation, as well as act as an
"importing tool" for potential rng algorithms to facilitate their
addition to the gsl.

I also want to test the speedup that should result from filling a vector
(a quite long vector) of rands all at once WITHIN a single subroutine
call -- I'm betting that major factor in the speed of a gsl rng is the
subroutine call overhead and cache thrashing, as the actual arithmetic
required for most rng's suggests (according to e.g. stream benchmarks)
rates that should be perhaps twice this, if not more.  

If so, it might be a good idea to create a macro interface to a
"streaming" implementation that generally returns the next rand from a
vector of rands and increments a pointer and only calls gsl subroutine
to refill the entire vector all at once when the pointer reaches the end
of the vector.  Monte Carlo folks can consume a LOT of rands in a
computation, and a factor of e.g. even 10-20% speedup can make a major
difference in time of completion, and who knows, it might be even more.

Hope this helps somebody.  If nothing else, the rand_rate source makes
it very clear how easy it is to generate rands using the gsl and
provides at least one way of "reliably" seeding it (presuming that
/dev/random ultimately passes e.g. diehard and sts:-).  The timing and
quality results are certainly useful to me, anyway, which is why I'm
writing it.

   rgb

Robert G. Brown	                       http://www.phy.duke.edu/~rgb/
Duke University Dept. of Physics, Box 90305
Durham, N.C. 27708-0305
Phone: 1-919-660-2567  Fax: 919-660-2525     email:rgb at phy.duke.edu







More information about the Beowulf mailing list