/*! * Copyright (c) 2017 by Contributors * \brief Example code on load and run TVM module.s * \file cpp_deploy_example.cc */ #include <cstdio> #include <dlpack/dlpack.h> #include <tvm/runtime/module.h> #include <tvm/runtime/registry.h> #include <tvm/runtime/packed_func.h> void Verify(tvm::runtime::Module mod, std::string fname) { // Get the function from the module. tvm::runtime::PackedFunc f = mod.GetFunction(fname); CHECK(f != nullptr); // Allocate the DLPack data structures. // // Note that we use TVM runtime API to allocate the DLTensor in this example. // TVM accept DLPack compatible DLTensors, so function can be invoked // as long as we pass correct pointer to DLTensor array. // // For more information please refer to dlpack. // One thing to notice is that DLPack contains alignment requirement for // the data pointer and TVM takes advantage of that. // If you plan to use your customized data container, please // make sure the DLTensor you pass in meet the alignment requirement. // DLTensor* x; DLTensor* y; int ndim = 1; int dtype_code = kDLFloat; int dtype_bits = 32; int dtype_lanes = 1; int device_type = kDLCPU; int device_id = 0; int64_t shape[1] = {10}; TVMArrayAlloc(shape, ndim, dtype_code, dtype_bits, dtype_lanes, device_type, device_id, &x); TVMArrayAlloc(shape, ndim, dtype_code, dtype_bits, dtype_lanes, device_type, device_id, &y); for (int i = 0; i < shape[0]; ++i) { static_cast<float*>(x->data)[i] = i; } // Invoke the function // PackedFunc is a function that can be invoked via positional argument. // The signature of the function is specified in tvm.build f(x, y); // Print out the output for (int i = 0; i < shape[0]; ++i) { CHECK_EQ(static_cast<float*>(y->data)[i], i + 1.0f); } LOG(INFO) << "Finish verification..."; } int main(void) { // Normally we can directly tvm::runtime::Module mod_dylib = tvm::runtime::Module::LoadFromFile("lib/test_addone_dll.so"); LOG(INFO) << "Verify dynamic loading from test_addone_dll.so"; Verify(mod_dylib, "addone"); // For libraries that are directly packed as system lib and linked together with the app // We can directly use GetSystemLib to get the system wide library. LOG(INFO) << "Verify load function from system lib"; tvm::runtime::Module mod_syslib = (*tvm::runtime::Registry::Get("module._GetSystemLib"))(); Verify(mod_syslib, "addonesys"); return 0; }