def test_generate_normal(self): for ctx in (self.ctx, None): res = [] for pass_size in (True, False): rng = curand.CURAND(ctx) rng.seed = 123 a = self._test_generate_normal(ctx, numpy.float32, rng.generate_normal, pass_size) a64 = self._test_generate_normal(ctx, numpy.float64, rng.generate_normal_double, pass_size) rng = curand.CURAND(ctx) rng.seed = 123 b = self._test_generate_normal(ctx, numpy.float32, rng.generate_log_normal, pass_size) b64 = self._test_generate_normal( ctx, numpy.float64, rng.generate_log_normal_double, pass_size) self.assertGreater(numpy.count_nonzero(a - b), a.size - a.size // 512) self.assertGreater(numpy.count_nonzero(a64 - b64), a.size - a.size // 512) res.extend((a, a64, b, b64)) for i in range(4): self.assertEqual(numpy.count_nonzero(res[i] - res[i + 4]), 0)
def test_properties(self): rng = curand.CURAND(self.ctx) self.assertEqual(rng.rng_type, curand.CURAND_RNG_PSEUDO_DEFAULT) # version ver = rng.version logging.debug("cuRAND version is %d", ver) self.assertTrue(ver == int(ver)) # ordering, seed, offset, dimensions self.assertEqual(rng.ordering, 0) rng.ordering = curand.CURAND_ORDERING_PSEUDO_DEFAULT try: rng.dimensions = 64 except cu.CUDARuntimeError: pass self.assertEqual(rng.dimensions, 0) self.assertEqual(rng.ordering, curand.CURAND_ORDERING_PSEUDO_DEFAULT) self.assertEqual(rng.seed, 0) self.assertEqual(rng.offset, 0) rng.seed = 123 self.assertEqual(rng.seed, 123) self.assertEqual(rng.offset, 0) rng.offset = 4096 self.assertEqual(rng.seed, 123) self.assertEqual(rng.offset, 4096) rng.seed = 12345.1 rng.offset = 8192.3 self.assertEqual(rng.seed, 12345) self.assertEqual(rng.offset, 8192) self.assertEqual(rng.ordering, curand.CURAND_ORDERING_PSEUDO_DEFAULT) rng = curand.CURAND(self.ctx, curand.CURAND_RNG_QUASI_DEFAULT) rng.dimensions = 64 self.assertEqual(rng.dimensions, 64) self.assertEqual(rng.rng_type, curand.CURAND_RNG_QUASI_DEFAULT) self.assertEqual(rng.ordering, 0) self.assertEqual(rng.seed, 0) self.assertEqual(rng.offset, 0)
def test_generate_uniform(self): for ctx in (self.ctx, None): res = [] for pass_size in (True, False): rng = curand.CURAND(ctx) rng.seed = 123 res.append( self._test_generate_uniform(ctx, numpy.float32, rng.generate_uniform, pass_size)) res.append( self._test_generate_uniform(ctx, numpy.float64, rng.generate_uniform_double, pass_size)) for i in range(2): self.assertEqual(numpy.count_nonzero(res[i] - res[i + 2]), 0)
def test_poisson(self): for ctx in (self.ctx, None): res = [] for pass_size in (True, False): rng = curand.CURAND(ctx) rng.seed = 123 a = numpy.zeros(65536, dtype=numpy.uint32) a_buf = (cu.MemAlloc(ctx, a) if ctx is not None else numpy.zeros_like(a)) if pass_size: rng.generate_poisson(a_buf, a.size) rng.generate_poisson(a_buf, a.size, 1.0) else: rng.generate_poisson(a_buf) rng.generate_poisson(a_buf, lam=1.0) if ctx is not None: a_buf.to_host(a) else: a[:] = a_buf[:] # TODO(a.kazantsev): add better test for correctness. self.assertGreater(numpy.count_nonzero(a), a.size // 2) res.append(a) for i in range(1): self.assertEqual(numpy.count_nonzero(res[i] - res[i + 1]), 0)
def _test_generate(self, ctx): rng = curand.CURAND(ctx) rng.seed = 123 a = numpy.zeros(65536, dtype=numpy.int32) a_buf = cu.MemAlloc(ctx, a) if ctx is not None else numpy.zeros_like(a) rng.generate32(a_buf, a.size) if ctx is not None: a_buf.to_host(a) else: a[:] = a_buf[:] self.assertGreater(numpy.count_nonzero(a), a.size - a.size // 512) # Check that seed matters rng = curand.CURAND(ctx) rng.seed = 123 if ctx is not None: a_buf.memset32_async() else: a_buf[:] = 0 rng.generate32(a_buf, a.size) b = numpy.zeros_like(a) if ctx is not None: a_buf.to_host(b) else: b[:] = a_buf[:] self.assertEqual(numpy.count_nonzero(a - b), 0) rng = curand.CURAND(ctx) rng.seed = 456 if ctx is not None: a_buf.memset32_async() else: a_buf[:] = 0 rng.generate32(a_buf, a.size) if ctx is not None: a_buf.to_host(b) else: b[:] = a_buf[:] self.assertGreater(numpy.count_nonzero(a - b), a.size - a.size // 512) # Check that result will be the same when the size is not passed rng = curand.CURAND(ctx) rng.seed = 123 if ctx is not None: a_buf.memset32_async() else: a_buf[:] = 0 rng.generate32(a_buf) b = numpy.zeros_like(a) if ctx is not None: a_buf.to_host(b) else: b[:] = a_buf[:] self.assertEqual(numpy.count_nonzero(a - b), 0) # Check 64-bit version rng = curand.CURAND(ctx, curand.CURAND_RNG_QUASI_SOBOL64) try: rng.seed = 123 self.assertTrue( False, "CURAND_RNG_QUASI_SOBOL64 should not support seed") except cu.CUDARuntimeError: pass rng.dimensions = 64 if ctx is not None: a_buf.memset32_async() else: a_buf[:] = 0 try: rng.generate32(a_buf, a.size) self.assertTrue( False, "CURAND_RNG_QUASI_SOBOL64 should not support generate32") except cu.CUDARuntimeError: pass a64 = numpy.zeros(a.size // 2, dtype=numpy.int64) rng.generate64(a_buf, a64.size) if ctx is not None: a_buf.to_host(a64) else: a64[:] = a_buf.view(numpy.int64)[:] self.assertGreater(numpy.count_nonzero(a64), a64.size - a64.size // 256) # Check that result will be the same when the size is not passed rng = curand.CURAND(ctx, curand.CURAND_RNG_QUASI_SOBOL64) rng.dimensions = 64 if ctx is not None: a_buf.memset32_async() else: a_buf[:] = 0 rng.generate64(a_buf) b64 = numpy.zeros_like(a64) if ctx is not None: a_buf.to_host(b64) else: b64[:] = a_buf.view(numpy.int64)[:] self.assertEqual(numpy.count_nonzero(a64 - b64), 0)
def test_create(self): rng = curand.CURAND(self.ctx) del rng