code: def matmul(N, L, M, dtype):
      A = te.placeholder((N, L), name="A", dtype=dtype)
      B = te.placeholder((L, M), name="B", dtype=dtype)
  
      k = te.reduce_axis((0, L), name="k")
      C = te.compute(
          (N, M),
          lambda i, j: te.sum(A[i, k] * B[k, j], axis=k),
          name="C",
      )
      s = te.create_schedule(C.op)
  
      # schedule
      y, x = s[C].op.axis
      k = s[C].op.reduce_axis[0]
  
      ##### define space begin #####
      cfg = autotvm.get_config()
      cfg.define_split("tile_y", y, num_outputs=2)
      cfg.define_split("tile_x", x, num_outputs=2)
      ##### define space end #####
  
      # schedule according to config
      yo, yi = cfg["tile_y"].apply(s, C, y)
      # Make sure configurations have a varied number of itervars. Splitting adds
      # new itervars, so conditionally splitting with cause the number of
      # itervars to depend on the tile size.
      if cfg["tile_x"].size[-1] > 1:
          xo, xi = cfg["tile_x"].apply(s, C, x)
          s[C].reorder(yo, xo, k, yi, xi)
      else:
          s[C].reorder(yo, k, yi, x)
  
      return s, [A, B, C]
  
file_path: tvm/python/tvm/testing/autotvm.py
imports: import time
  import numpy
  import tvm
  from tvm import te
  from tvm import autotvm
  from tvm.autotvm import MeasureInput, MeasureResult
  from tvm.autotvm.measure.measure import Runner
label_desc: Use image node_id 1 for calling a global function with example usage: matmul(N, L, M, dtype) and returns: s,  list