code: def compute_backward_vadd(dtype, ndim, reduce1st, req):
      # The backward of broadcast op is basically a reduction on broadcast axes.
      # We label the reduce axes as 1 and other axes as 0, and they form a bit string.
      # Each bit string correponds to a kernel, so the number of kernels is as many as `2^n`
      # To reduce it, the bit string is compressed by combining consecutive 0s or 1s.
      # In this way, the number of bit string (the number of kernels) is reduced to `2 * n`
      # They compressed bit string is stored in `axes`. And `reduce1st` represents the first bit
      # of the compressed bit string. Credit to @junrushao1994 and @yzhliu.
      axes = ([reduce1st, 1 - reduce1st] * ndim)[:ndim]
      X = tvm.te.placeholder(
          [tvm.te.size_var() for _ in range(ndim)],
          name="X",
          dtype=dtype,
      )
      reducer = tvm.te.comm_reducer(
          lambda x, y: x + y,
          lambda t: tvm.tir.const(0, dtype=t),
          name="sum",
      )
      ret = reduce_axes(X, axes, reducer)
      in_grad_a, in_grad = assign_by_req(ret, req)
      s = tvm.te.create_schedule(in_grad.op)
      return s, X, in_grad_a, in_grad, [ret, in_grad]
  
file_path: mxnet/contrib/tvmop/basic/ufunc.py
imports: import tvm
  from ..None import defop, AllTypes, RealTypes
  from ..None import assign_by_req, reduce_axes
label_desc: Use image node_id 4 for calling a global function with example usage: compute_backward_vadd(dtype, ndim, reduce1st, req) and returns: s,  X,  in_grad_a,  in_grad,  list