code: def execute(cls, ctx, op):
      chunk = op.outputs[0]
      (a, b), device_id, xp = as_same_device(
          [ctx[c.key] for c in op.inputs],
          device=op.device,
          ret_extra=True,
      )
  
      with device(device_id):
          if not op.sparse and is_sparse_module(xp):
              # tell sparse to do calculation on numpy or cupy dot
              ctx[chunk.key] = xp.dot(a, b, sparse=False)
          else:
              ctx[chunk.key] = xp.dot(a, b)
  
file_path: mars/mars/tensor/linalg/dot.py
imports: from ...None import opcodes
  from ...serialization.serializables import KeyField
  from ..core import Tensor, TensorOrder
  from ..operands import TensorOperand, TensorOperandMixin
  from ..datasource import tensor
  from ..array_utils import device, as_same_device, is_sparse_module
  from .tensordot import tensordot
label_desc: Use image node_id 4 for calling the TensorDot obj's underlying member method code with example usage: obj.execute(cls, ctx, op) without return types