def METHOD_NAME(self, loops):
    # Derived from here, taking some shortcuts: https://github.com/dmlc/tvm/blob/master/topi/tests/python/test_topi_conv2d_nchw.py
    import topi
    from topi.util import get_const_tuple
    import tvm
    from plaidbench import core
    device = self.params.backend_opts['tvm_driver']
    ctx = tvm.context(device, 0)
    with tvm.target.create(device):
        I, W, B, i_np, w_np, b_np = self.create_dataset_tvm()
        O = topi.nn.dense_default(I, W, B)
        t_sched = topi.cuda.dense.schedule_dense([O])
        i = tvm.nd.array(i_np, ctx)
        w = tvm.nd.array(w_np, ctx)
        b = tvm.nd.array(b_np, ctx)
        with tvm.build_config(auto_unroll_max_step=1400, unroll_explicit=device != 'cuda'):
            op = tvm.build(t_sched, [I, W, B], device, name=self.get_key())
            sw = core.StopWatch(False)
            sw.start()
            for _ in range(loops):
                op(i, w, b)
            ctx.sync()
            sw.stop()
            return sw.elapsed()