def METHOD_NAME(
    data_dtype,
    kernel_dtype,
    out_dtype,
    im_height,
    im_width,
    in_filter,
    out_filter,
    k_h,
    k_w,
    hpad,
    wpad,
    hstride,
    wstride,
):
    """
    Runs the inference and checks the functional correctness between
    compute and schedule outputs
    """
    (data_shape, kernel_shape, o_shape) = get_shape(
        im_height,
        im_width,
        in_filter,
        out_filter,
        k_h,
        k_w,
        hpad,
        wpad,
        hstride,
        wstride,
        out_dtype,
    )
    # Create TVM placeholders
    data = te.placeholder(data_shape, name="data", dtype=data_dtype)
    kernel = te.placeholder(kernel_shape, name="kernel", dtype=kernel_dtype)
    # Create the numpy arrays to be used for executing conv models
    if data_dtype == "float32":
        data_array = tvm.nd.array(np.random.rand(*data_shape).astype(dtype=data_dtype), DEV)
        kernel_array = tvm.nd.array(np.random.rand(*kernel_shape).astype(dtype=kernel_dtype), DEV)
    else:
        data_array = tvm.nd.array(np.random.randint(100, size=data_shape).astype(data_dtype))
        kernel_array = tvm.nd.array(np.random.randint(100, size=kernel_shape).astype(kernel_dtype))
    # c_orig will be used for declaration ouptut
    # c_sch will be used for scheduled computation output
    c_orig = tvm.nd.array(np.zeros(o_shape, dtype=out_dtype), DEV)
    c_sch = tvm.nd.array(np.zeros(o_shape, dtype=out_dtype), DEV)
    with tvm.target.Target(TARGET_NAME):
        conv = topi.nn.conv2d_NCHWc(
            data,
            kernel,
            stride=hstride,
            padding=hpad,
            dilation=(1, 1),
            layout="NCHWc",
            out_layout="NCHWc",
            out_dtype=out_dtype,
        )
        out = topi.nn.relu(conv)
        sch = te.create_schedule(out.op)
        func = tvm.build(sch, [data, kernel, out], target=TARGET_NAME, name="out")
        func(data_array, kernel_array, c_orig)
        LOGGER.debug(tvm.lower(sch, [data, kernel], simple_mode=True))
        # Generate and run the optimized schedule
        sconv = topi.generic.nn.schedule_conv2d_NCHWc(outs=[out])
        func = tvm.build(sconv, [data, kernel, out], target=TARGET_NAME, name="conv")
        func(data_array, kernel_array, c_sch)
        # Functional check
        if data_dtype == "uint8":
            np.testing.assert_equal(c_orig.numpy(), c_sch.numpy())
        else:
            assert np.allclose(c_orig.numpy(), c_sch.numpy())
        evaluator = func.time_evaluator(func.entry_name, DEV, number=1000)
        LOGGER.debug(tvm.lower(sconv, [data, kernel], simple_mode=True))
        return evaluator(data_array, kernel_array, c_sch).mean