Hi,

Le 2010-10-18 à 11:30, Bogdan Opanchuk a écrit :
> Hi all,
> 
> Consider the following program, which is supposed to check the
> "randomness" of pycuda random number generator:
[...]
> def test(size, dtype):
>       a = curandom.rand((size,), dtype=dtype).get()
>       return numpy.sum(a) / size
[...]
> I get the following output on CentOS, PyCuda 0.94, GF GTX280:
> <type 'numpy.float32'>
[...]
> 8.0M elements: 0.499930769205
> 16.0M elements: 0.49999204278
> 32.0M elements: 0.5
> 64.0M elements: 0.25
> 128.0M elements: 0.125
[...]
> It looks like for single precision generator starts repeating itself
> after ~16M numbers. Is it some restriction of the algorithm or a bug
> in code?

  I'm not sure what is happening exactly, but there is no indication that the 
random numbers are *repeating themselves*

  However you seem to hit a floating point issue *when computing the sum* => if 
you replace numpy.sum(a)/size by numpy.sum(a.astype(numpy.float64))/size, you 
get correct results for float32 (always around 0.5).

  It is actually not suprising: when you sum 2**25 times numbers which are on 
average 0.5, you get ~ 2**24. And in single precision floating point, the 
mantissa is indeed stored using 24 bits => when you try adding the next 
numbers, they are simply too small to register in the mantissa, and are not 
added. e.g. try: float32(2**24)+float32(.5)=  float32(2**24) !

  Funny example of the limits of single precision floating point...

        Vincent
-- 
Vincent Favre-Nicolin                    http://inac.cea.fr

CEA/Grenoble              Institut Nanosciences & Cryogénie
Laboratoire SP2M/Nano-structures et Rayonnement Synchrotron
17, rue des Martyrs
38054 Grenoble Cedex 9 - France

Université Joseph Fourier        http://www.ujf-grenoble.fr

tél: (+33) 4 38 78 95 40           fax: (+33) 4 38 78 51 38

_______________________________________________
PyCUDA mailing list
PyCUDA@tiker.net
http://lists.tiker.net/listinfo/pycuda

Reply via email to