Hello:
I have a simple application of creating a conv2d_NCHWc.x86 tuning task and generate ASM code for external use. Here’s my code:
import tvm
from tvm import autotvm, te
from tvm.topi.x86.conv2d import *
target = tvm.target.Target("llvm -mcpu=core-avx2")
data = te.placeholder((1, 64, 56, 56), name="data")
kernel = te.placeholder((128, 64, 3, 3), name="kernel")
task = autotvm.task.create("conv2d_NCHWc.x86", args=[data, kernel, 1, 1, 1, "NCHW", "NCHW", "float32"], target=target)
# Edited
# kernel = te.placeholder((128, 64, 1, 1), name="kernel")
# task = autotvm.task.create("conv2d_NCHWc.x86", args=[data, kernel, 1, 0, 1, "NCHW", "NCHW", "float32"], target=target)
print(task.config_space)
print(task.target)
print(task.workload)
measure_option = autotvm.measure_option(
builder=autotvm.LocalBuilder(),
runner=autotvm.LocalRunner()
)
tuner = autotvm.tuner.XGBTuner(task, feature_type="curve")
log_name = "test.log"
n_trial = 16
tuner.tune(n_trial=n_trial,
measure_option=measure_option,
callbacks=[autotvm.callback.progress_bar(min(n_trial, len(task.config_space))),
autotvm.callback.log_to_file(log_name)])
dispatch_context = autotvm.apply_history_best(log_name)
best_config = dispatch_context.query(task.target, task.workload)
print('\nBest config:')
print(best_config)
with target:
s, arg_bufs = task.instantiate(best_config)
print(tvm.lower(s, arg_bufs, simple_mode=True))
func = tvm.build(s, arg_bufs, target, name='conv2d')
print(func.get_source('asm'))
However, I found that the ASM code has a different order for the input arguments. We expect the order to be data, kernel, and output, while the order in the ASM code is
output, kernel, and data (examined by looking at the shape of arguments). This affects the external use of it in C code. Is that by design? Or if not how can we fix it?
Thanks in advance!