拓展 TVM C++ 功能#
在 C++ 中定义加法算子:
#include <tvm/runtime/packed_func.h>
#include <tvm/runtime/registry.h>
#include <tvm/tir/op.h>
using namespace tvm::runtime;
namespace tvm_ext {
namespace testing {
TVM_REGISTER_GLOBAL("tvm_ext.testing.sym_add").set_body([](TVMArgs args, TVMRetValue* rv) {
tvm::tir::Var a = args[0];
tvm::tir::Var b = args[1];
*rv = a + b;
});
TVM_REGISTER_GLOBAL("tvm_ext.testing.bind_add").set_body([](TVMArgs args_, TVMRetValue* rv_) {
PackedFunc pf = args_[0];
int b = args_[1];
*rv_ = PackedFunc([pf, b](TVMArgs args, TVMRetValue* rv) { *rv = pf(b, args[0]); });
});
}
} // namespace tvm_ext
# 部署 TVM 模块 的 Makefile 样例
# =================================================================================
IDIR = include
TVM_ROOT=$(shell cd /media/pc/data/board/arria10/lxw/tasks/tvm-ai; pwd)
PKG_CXXFLAGS = -std=c++17 -O2 -fPIC\
-I${TVM_ROOT}/include\
-I${TVM_ROOT}/3rdparty/dmlc-core/include\
-I${TVM_ROOT}/3rdparty/dlpack/include\
-I${IDIR}\
-DDMLC_USE_LOGGING_LIBRARY=\<tvm/runtime/logging.h\>
PKG_LDFLAGS = -ldl -pthread
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S), Darwin)
PKG_LDFLAGS += -undefined dynamic_lookup
endif
.PHONY: clean all
all: outputs/libs/libtvm_ext.so
# 定制 tvm 拓展运行时
# =================================================================================
outputs/libs/libtvm_ext.so: src/tvm_ext.cc
@mkdir -p $(@D)
$(CXX) $(PKG_CXXFLAGS) -shared -o $@ $^ $(PKG_LDFLAGS) -L${TVM_ROOT}/build
clean:
rm -rf outputs/*
编译:
!cd ../cpp/sym_add && make clean && make
rm -rf outputs/*
/media/pc/data/lxw/envs/anaconda3x/envs/xxx/bin/x86_64-conda-linux-gnu-c++ -std=c++17 -O2 -fPIC -I/media/pc/data/board/arria10/lxw/tasks/tvm-ai/include -I/media/pc/data/board/arria10/lxw/tasks/tvm-ai/3rdparty/dmlc-core/include -I/media/pc/data/board/arria10/lxw/tasks/tvm-ai/3rdparty/dlpack/include -Iinclude -DDMLC_USE_LOGGING_LIBRARY=\<tvm/runtime/logging.h\> -shared -o outputs/libs/libtvm_ext.so src/tvm_ext.cc -ldl -pthread -L/media/pc/data/board/arria10/lxw/tasks/tvm-ai/build
查看编译后的动态库:
!ls ../cpp/sym_add/outputs/libs
libtvm_ext.so