code: def dot(a, b):
      if a.ndim != 2:
          raise Exception(
              "dot expects its arguments to be 2-dimensional, but "
              "a.ndim = {}.".format(a.ndim)
          )
      if b.ndim != 2:
          raise Exception(
              "dot expects its arguments to be 2-dimensional, but "
              "b.ndim = {}.".format(b.ndim)
          )
      if a.shape[1] != b.shape[0]:
          raise Exception(
              "dot expects a.shape[1] to equal b.shape[0], but "
              "a.shape = {} and b.shape = {}.".format(a.shape, b.shape)
          )
      shape = [a.shape[0], b.shape[1]]
      result = DistArray(shape)
      for i, j in np.ndindex(*result.num_blocks):
          args = list(a.object_refs[i, :]) + list(b.object_refs[:, j])
          result.object_refs[i, j] = blockwise_dot.remote(*args)
      return result
  
imports: import numpy
  import ray
  import ray.experimental.array.remote
label_desc: Use image node_id 10 for calling a global function with example usage: dot(a, b) and returns: result