Пример #1
0
 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)
Пример #2
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)
Пример #3
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)
Пример #4
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)
Пример #5
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)
Пример #6
0
 def test_create(self):
     rng = curand.CURAND(self.ctx)
     del rng