GPU based random number generator
We make use of a GPU with OpenCL support in order to generate random numbers.
It works as “Global memory is consistent across work-items in a single work-group at a work-group barrier, but there are no guarantees of memory consistency between different work-groups executing a kernel.”, also different work-groups don’t necessarily execute instructions at precisely the same time.
The kernel which is executed on multiple processing elements:
__kernel void rng(__global int* data) { int z =0; for(z = 0; z<10091; z++) data[0] = data[0] ^ 1; }
All kernel instances try to read and write to the same memory element. We simply toggle the value
of the same element in a global array, by making use of xor.
If you play with this, I strongly suggest you play around with the following values (along with choosing the number
of iterations in the above for loop):
const size_t N = 1024*20; const size_t groupsize = 4;
The output from ‘ent’ which provides information on how random
the data in a file is:
Entropy = 7.988515 bits per byte. Optimum compression would reduce the size of this 32632 byte file by 0 percent. Chi square distribution for 32632 samples is 522.98, and randomly would exceed this value less than 0.01 percent of the times. Arithmetic mean value of data bytes is 127.8626 (127.5 = random). Monte Carlo value for Pi is 3.168076499 (error 0.84 percent). Serial correlation coefficient is -0.012086 (totally uncorrelated = 0.0).
Interesting notes:
The following generates more randomness:
const size_t N = ARRAY_SIZE*200;
const size_t groupsize = ARRAY_SIZE*10;
Than:
const size_t N = ARRAY_SIZE*10;
const size_t groupsize = ARRAY_SIZE*200;
This is because N roughly relates to the amount of compute units which are used. We’ve found the greater the value
of N, the more random the output is. N should be much greater than groupsize.
(Please don’t use this RNG for anything important)
I’m currently looking into making it more efficient, to generate more bits / second, and am then
planning to subject it to the ‘dieharder’ program’s statistical tests
Leave Comment
Error