code: def __call__(self, x, y=None):
      if y is None:
          y = gpuarray.zeros(
              self.shape[0], dtype=self.dtype, allocator=x.allocator
          )
  
      if self.nnz == 0:
          return y
  
      flat_func, x_texref = self.get_flat_kernel()
      x.bind_to_texref_ext(x_texref, allow_double_hack=True)
      flat_func.prepared_call(
          (self.num_blocks, 1),
          self.tail,
          self.interval_size,
          self.row_gpu.gpudata,
          self.col_gpu.gpudata,
          self.data_gpu.gpudata,
          y.gpudata,
      )
  
      self.get_serial_kernel().prepared_call(
          (1, 1),
          self.nnz - self.tail,
          self.row_gpu[self.tail :].gpudata,
          self.col_gpu[self.tail :].gpudata,
          self.data_gpu[self.tail :].gpudata,
          x.gpudata,
          y.gpudata,
      )
  
      return y
  
file_path: pycuda/pycuda/sparse/coordinate.py
imports: from __future__ import division
  from __future__ import absolute_import
  from pytools import memoize_method
  import pycuda.driver
  import pycuda.gpuarray
  from pycuda.compiler import SourceModule
  import numpy
label_desc: Use image node_id 4 for calling the CoordinateSpMV obj's underlying member method code with example usage: obj.__call__(x, y) and returns: y, y