class_docstr: Class surrounding CURAND kernels from CUDA 3.2.
  It allows for generating random numbers with uniform
  and normal probability function of various types.
class_docstr_tok: ["Class","surrounding","CURAND","kernels","from","CUDA","3.2",".","It","allows","for","generating","random","numbers","with","uniform","and","normal","probability","function","of","various","types","."]
code: def fill_normal(self, data, stream=None):
      if data.dtype == np.float32:
          func_name = "normal_float"
      elif data.dtype == np.float64:
          func_name = "normal_double"
      else:
          raise NotImplementedError
  
      data_size = data.size
      if self.has_box_muller and data_size % 2 == 0:
          func_name += "2"
          data_size //= 2
  
      func = self.generators[func_name]
  
      func.prepared_async_call(
          (self.block_count, 1),
          (self.generators_per_block, 1, 1),
          stream,
          self.state,
          data.gpudata,
          int(data_size),
      )
  
imports: import numpy
  import pycuda.compiler
  import pycuda.driver
  import pycuda.gpuarray
  from pytools import memoize_method
label_desc: Use image node_id 7 for calling the _RandomNumberGeneratorBase obj's underlying member method code with example usage: obj.fill_normal(data, stream) without return types