code: def gspmm(gidx, op, reduce_op, lhs_data, rhs_data):
      func = GSpMM(gidx, op, reduce_op)
      ctx = to_backend_ctx(gidx.ctx)
      # XXX(minjie): There is a bug in MXNet's autograd system when one of the inputs
      #   does not require gradient. Although it still invokes the backward function,
      #   it does not set the gradient value to the correct buffer, resulting all the
      #   input gradients to be zero. Fix this by enforcing all the inputs to require
      #   gradients.
      if lhs_data is None:
          lhs_data = nd.zeros((1,), ctx=ctx)
          lhs_data.attach_grad()
      if rhs_data is None:
          rhs_data = nd.zeros((1,), ctx=ctx)
          rhs_data.attach_grad()
      return func(lhs_data, rhs_data)
  
imports: import mxnet
  import numpy
  from mxnet import nd
  from ..._sparse_ops import _bwd_segment_cmp, _csrmask, _csrmm, _csrsum, _gsddmm, _gspmm, _scatter_add, _segment_reduce
  from ...base import ALL, dgl_warning, is_all
  from ...heterograph_index import create_unitgraph_from_csr
  from .tensor import asnumpy, context, copy_to, to_backend_ctx, zerocopy_from_numpy
label_desc: Use image node_id 8 for calling a global function with example usage: gspmm(gidx, op, reduce_op, lhs_data, rhs_data) and returns: func