code: def backward(ctx, dc):
      # saved for backward
      a, b = ctx.saved_tensors
      da, db = None, None
      mode = ctx.mode
      # gradients w.r.t. a
      if ctx.needs_input_grad[0]:
          mode_da = mode[1] + mode[0] + mode[2]
          da = _matmul.fn[mode_da](
              dc,
              b,
              ctx.trans_c,
              not ctx.trans_b,
              ctx.trans_a,
              ctx.spdims,
              ctx.block,
              ctx.da_lut,
              ctx.da_width,
          )
      # gradients w.r.t. b
      if ctx.needs_input_grad[1]:
          mode_db = mode[2] + mode[1] + mode[0]
          db = _matmul.fn[mode_db](
              a,
              dc,
              not ctx.trans_a,
              ctx.trans_c,
              ctx.trans_b,
              ctx.spdims,
              ctx.block,
              ctx.db_lut,
              ctx.db_width,
          )
      dout = dc if ctx.has_out else None
      return (
          da,
          db,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          None,
          dout,
      )
  
file_path: triton/python/triton/ops/blocksparse/matmul.py
imports: import torch
  from ...None import cdiv, heuristics, jit
  from ...None import language
label_desc: Use image node_id 2 for calling the _matmul obj's underlying member method code with example usage: obj.backward(ctx, dc) and returns: da,  db,  None,  None,  None,  None,  None,  None,  None,  None,  None,  None,  None,  None,  dout