This is an automated email from the ASF dual-hosted git repository.
spectrometerHBH pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 6c27733258 [REFACTOR][RUNTIME] Remove leftover microTVM/CRT crumbs
(#19622)
6c27733258 is described below
commit 6c277332582ffe8b58ba445b7c3ea9016602289d
Author: Tianqi Chen <[email protected]>
AuthorDate: Wed May 27 15:30:32 2026 -0400
[REFACTOR][RUNTIME] Remove leftover microTVM/CRT crumbs (#19622)
## Summary
The [Refactor] Phase out microTVM commit (#17554) removed the bulk of
microTVM, but a few crumbs were left behind. This PR removes all of
them:
- `src/runtime/meta_data.h`: old snake_case header with a dmlc-based
`FunctionInfo` struct. Replaced long ago by `src/runtime/metadata.h`
(camelCase, `ffi::ObjectRef`-based). No file in the tree includes
`meta_data.h`.
- `src/runtime/crt/common/crt_runtime_api.c`: the sole remaining file
in the `src/runtime/crt/` subtree. Includes `<tvm/runtime/crt/*>`
headers that no longer exist; not picked up by any `RUNTIME_SRCS`
glob; uncompilable in the current tree.
- `cmake/utils/CRTConfig.cmake`: defines `generate_crt_config()`, which
has no callers and references a missing `crt_config.h.template`.
- `docs/conf.py`: sphinx-gallery exclusion for a tutorial file
(`micro_mlperftiny.py`) that no longer exists; simplified the regex.
No code changes elsewhere — these are all isolated leaves with zero
callers or includers across `*.cc *.h *.c *.py *.cmake CMakeLists.txt`.
---
cmake/utils/CRTConfig.cmake | 35 --
docs/conf.py | 3 +-
src/runtime/crt/common/crt_runtime_api.c | 659 -------------------------------
src/runtime/meta_data.h | 79 ----
4 files changed, 1 insertion(+), 775 deletions(-)
diff --git a/cmake/utils/CRTConfig.cmake b/cmake/utils/CRTConfig.cmake
deleted file mode 100644
index 42c523b087..0000000000
--- a/cmake/utils/CRTConfig.cmake
+++ /dev/null
@@ -1,35 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-function(generate_crt_config platform output_path)
- set(TVM_CRT_DEBUG 0)
- set(TVM_CRT_MAX_NDIM 6)
- set(TVM_CRT_MAX_ARGS 10)
- set(TVM_CRT_GLOBAL_FUNC_REGISTRY_SIZE_BYTES 512)
- set(TVM_CRT_MAX_REGISTERED_MODULES 2)
- set(TVM_CRT_MAX_PACKET_SIZE_BYTES 2048)
- set(TVM_CRT_MAX_STRLEN_DLTYPE 10)
- set(TVM_CRT_MAX_STRLEN_FUNCTION_NAME 120)
- set(TVM_CRT_MAX_STRLEN_PARAM_NAME 80)
-
- if("${platform}" STREQUAL "zephyr")
- set(TVM_CRT_MAX_PACKET_SIZE_BYTES 512)
- elseif("${platform}" STREQUAL "arduino")
- set(TVM_CRT_MAX_PACKET_SIZE_BYTES 8*1024)
- endif()
-
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/runtime/crt/crt_config.h.template"
"${output_path}")
-endfunction()
diff --git a/docs/conf.py b/docs/conf.py
index 6bcd1fbbc8..eadff4cd61 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -448,8 +448,7 @@ def force_gc(gallery_conf, fname):
gc.collect()
-# Skips certain files to avoid dependency issues
-filename_pattern_default = "^(?!.*micro_mlperftiny.py).*$"
+filename_pattern_default = ".*"
sphinx_gallery_conf = {
"backreferences_dir": "gen_modules/backreferences",
diff --git a/src/runtime/crt/common/crt_runtime_api.c
b/src/runtime/crt/common/crt_runtime_api.c
deleted file mode 100644
index 741ae52980..0000000000
--- a/src/runtime/crt/common/crt_runtime_api.c
+++ /dev/null
@@ -1,659 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// LINT_C_FILE
-
-#include <assert.h>
-#include <inttypes.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <tvm/runtime/c_runtime_api.h>
-#include <tvm/runtime/crt/crt.h>
-#include <tvm/runtime/crt/func_registry.h>
-#include <tvm/runtime/crt/internal/common/ndarray.h>
-#include <tvm/runtime/crt/internal/graph_executor/graph_executor.h>
-#include <tvm/runtime/crt/platform.h>
-
-#if defined(_WIN32) || defined(WIN32)
-#include <windows.h>
-#elif __unix__
-#include <unistd.h>
-#endif
-
-// Handle internal errors
-
-static char g_last_error[1024];
-
-void TVMAPISetLastError(const char* msg) {
- strncpy(g_last_error, msg, sizeof(g_last_error) - 1);
- g_last_error[sizeof(g_last_error) - 1] = 0;
-}
-
-__attribute__((format(printf, 1, 2))) int TVMAPIErrorf(const char* msg, ...) {
- va_list args;
- int to_return;
-
- va_start(args, msg);
- to_return = vsnprintf(g_last_error, sizeof(g_last_error), msg, args);
- va_end(args);
-
- return to_return;
-}
-
-const char* TVMGetLastError(void) { return g_last_error; }
-
-// Manipulate Tensor on target device
-
-int TVMArrayAlloc(const tvm_index_t* shape, int ndim, int dtype_code, int
dtype_bits,
- int dtype_lanes, int device_type, int device_id,
TVMArrayHandle* out) {
- DLDataType dtype;
- dtype.code = dtype_code;
- dtype.bits = dtype_bits;
- dtype.lanes = dtype_lanes;
- DLDevice dev;
- dev.device_type = (DLDeviceType)device_type;
- dev.device_id = device_id;
- TVMNDArray arr;
- int status = TVMNDArray_Empty(ndim, shape, dtype, dev, &arr);
- if (status != 0) {
- return status;
- }
- **out = arr.dl_tensor;
- return 0;
-}
-
-int TVMArrayFree(TVMArrayHandle handle) {
- TVMNDArray* arr = (TVMNDArray*)handle;
-
- return TVMNDArray_Release(arr);
-}
-
-int TVMDeviceAllocDataSpace(DLDevice dev, size_t nbytes, size_t alignment,
DLDataType type_hint,
- void** out_data) {
- if (alignment != 1) {
- nbytes = (nbytes + alignment - 1) / alignment * alignment;
- }
- return TVMPlatformMemoryAllocate(nbytes, dev, out_data);
-}
-
-int TVMDeviceAllocDataSpaceWithScope(DLDevice dev, int ndim, const int64_t*
shape, DLDataType dtype,
- const char* mem_scope, void** out_data) {
- size_t nbytes = 1;
- for (int i = 0; i < ndim; ++i) {
- nbytes *= shape[i];
- }
- nbytes *= (dtype.bits * dtype.lanes + 7) / 8;
-
- int kAllocAlignment = 64;
- size_t align = (dtype.bits / 8) * dtype.lanes;
- if (align < kAllocAlignment) align = kAllocAlignment;
- return TVMDeviceAllocDataSpace(dev, nbytes, align, dtype, out_data);
-}
-
-int TVMDeviceFreeDataSpace(DLDevice dev, void* ptr) { return
TVMPlatformMemoryFree(ptr, dev); }
-
-TVM_ATTRIBUTE_UNUSED static bool IsContiguous(const DLTensor* arr) {
- if (arr->strides == NULL) return true;
- int64_t expected_stride = 1;
- for (int32_t i = arr->ndim; i != 0; --i) {
- int32_t k = i - 1;
- if (arr->strides[k] != expected_stride) return false;
- expected_stride *= arr->shape[k];
- }
- return true;
-}
-
-int TVMDeviceCopyDataFromTo(DLTensor* from, DLTensor* to, TVMStreamHandle
stream) {
- assert(IsContiguous(from) && IsContiguous(to));
- size_t size = 1;
- for (int i = 0; i < from->ndim; ++i) {
- size *= from->shape[i];
- }
- size *= (from->dtype.bits * from->dtype.lanes + 7) / 8;
- memcpy(((uint8_t*)to->data) + to->byte_offset, ((uint8_t*)from->data) +
from->byte_offset, size);
- return 0;
-}
-
-int TVMStreamCreate(int device_type, int device_id, TVMStreamHandle* out) {
- out = NULL;
- return 0;
-}
-
-int TVMObjectFree(TVMObjectHandle obj) { return 0; }
-
-int TVMStreamFree(int device_type, int device_id, TVMStreamHandle stream) {
return 0; }
-
-int TVMSetStream(int device_type, int device_id, TVMStreamHandle stream) {
return 0; }
-
-int TVMSynchronize(int device_type, int device_id, TVMStreamHandle stream) {
return 0; }
-
-static TVMMutableFuncRegistry global_func_registry;
-
-int TVMFuncRegisterGlobal(const char* name, TVMFunctionHandle f, int override)
{
- return TVMMutableFuncRegistry_Set(&global_func_registry, name, f, override
!= 0);
-}
-
-static const TVMModule* registered_modules[TVM_CRT_MAX_REGISTERED_MODULES];
-
-/*! \brief Passed as `module_index` to EncodeFunctionHandle. */
-static const tvm_module_index_t kGlobalFuncModuleIndex =
TVM_CRT_MAX_REGISTERED_MODULES;
-
-/*! \brief Special module handle for return values from RPCTimeEvaluator. */
-static const tvm_module_index_t kTimeEvaluatorModuleIndex = 0x7fff;
-
-static int DecodeModuleHandle(TVMModuleHandle handle, tvm_module_index_t*
out_module_index) {
- tvm_module_index_t module_index;
-
- module_index = ((tvm_module_index_t)((uintptr_t)handle)) & ~0x8000;
- if (module_index > TVM_CRT_MAX_REGISTERED_MODULES ||
registered_modules[module_index] == NULL) {
- TVMAPIErrorf("invalid module handle: %08x", module_index);
- return -1;
- }
-
- *out_module_index = module_index;
- return 0;
-}
-
-static TVMModuleHandle EncodeModuleHandle(tvm_module_index_t module_index) {
- return (TVMModuleHandle)((uintptr_t)(module_index | 0x8000));
-}
-
-int TVMModCreateFromCModule(const TVMModule* mod, TVMModuleHandle* out_handle)
{
- tvm_module_index_t idx;
-
- for (idx = 0; idx < TVM_CRT_MAX_REGISTERED_MODULES; idx++) {
- if (registered_modules[idx] == NULL) {
- registered_modules[idx] = mod;
- *out_handle = EncodeModuleHandle(idx);
- return 0;
- }
- }
-
- return -1;
-}
-
-static const TVMModuleHandle kTVMModuleHandleUninitialized =
(TVMModuleHandle)(~0UL);
-
-static TVMModuleHandle system_lib_handle;
-
-int TVMModFree(TVMModuleHandle mod) {
- /* Never free system_lib_handler */
- if (mod == system_lib_handle && system_lib_handle !=
kTVMModuleHandleUninitialized) {
- return 0;
- }
-
- tvm_module_index_t module_index;
- if (DecodeModuleHandle(mod, &module_index) != 0) {
- return -1;
- }
-
- registered_modules[module_index] = NULL;
- return 0;
-}
-
-static int SystemLibraryCreate(TVMValue* args, int* type_codes, int num_args,
TVMValue* ret_val,
- int* ret_type_codes) {
- const TVMModule* system_lib;
-
- if (system_lib_handle == kTVMModuleHandleUninitialized) {
- system_lib = TVMSystemLibEntryPoint();
- if (TVMModCreateFromCModule(system_lib, &system_lib_handle) != 0) {
- TVMAPIErrorf("error registering system lib");
- return -1;
- }
- }
-
- ret_val[0].v_handle = system_lib_handle;
- ret_type_codes[0] = kTVMModuleHandle;
- return 0;
-}
-
-static TVMFunctionHandle EncodeFunctionHandle(tvm_module_index_t module_index,
- tvm_function_index_t
function_index) {
- return (TVMFunctionHandle)((
- ((uintptr_t)(module_index | 0x8000) << (sizeof(tvm_function_index_t) *
8)) |
- (function_index | 0x8000)));
-}
-
-static int DecodeFunctionHandle(TVMFunctionHandle handle, tvm_module_index_t*
module_index,
- tvm_function_index_t* function_index) {
- tvm_module_index_t unvalidated_module_index;
- unvalidated_module_index =
- (tvm_module_index_t)(((uintptr_t)handle) >>
(sizeof(tvm_function_index_t) * 8));
- unvalidated_module_index &= ~0x8000;
-
- if (unvalidated_module_index != kTimeEvaluatorModuleIndex) {
- if (unvalidated_module_index > kGlobalFuncModuleIndex) {
- TVMAPIErrorf("invalid module handle: index=%08x",
unvalidated_module_index);
- return -1;
- } else if (unvalidated_module_index < kGlobalFuncModuleIndex &&
- registered_modules[unvalidated_module_index] == NULL) {
- TVMAPIErrorf("unregistered module: index=%08x",
unvalidated_module_index);
- return -1;
- }
- }
-
- *function_index = ((uint32_t)((uintptr_t)handle)) & ~0x8000;
- *module_index = unvalidated_module_index;
- return 0;
-}
-
-int TVMByteArrayFree(TVMByteArray* arr) {
- DLDevice dev = {kDLCPU, 0};
- int to_return = TVMPlatformMemoryFree((void*)arr->data, dev);
- if (to_return != 0) {
- return to_return;
- }
-
- return TVMPlatformMemoryFree((void*)arr, dev);
-}
-
-tvm_crt_error_t RunTimeEvaluator(tvm_function_index_t function_index,
TVMValue* args,
- int* type_codes, int num_args, TVMValue*
ret_val,
- int* ret_type_code);
-
-int TVMFuncCall(TVMFunctionHandle func_handle, TVMValue* arg_values, int*
type_codes, int num_args,
- TVMValue* ret_val, int* ret_type_code) {
- tvm_module_index_t module_index;
- tvm_function_index_t function_index;
- void* resource_handle;
- const TVMFuncRegistry* registry;
- TVMBackendPackedCFunc func;
- if (DecodeFunctionHandle(func_handle, &module_index, &function_index) != 0) {
- return -1;
- }
-
- if (module_index == kTimeEvaluatorModuleIndex) {
- return RunTimeEvaluator(function_index, arg_values, type_codes, num_args,
ret_val,
- ret_type_code);
- } else if (module_index == kGlobalFuncModuleIndex) {
- resource_handle = NULL;
- registry = &global_func_registry.registry;
- } else {
- resource_handle = (void*)registered_modules[module_index]->registry;
- registry = registered_modules[module_index]->registry;
- }
-
- if (TVMFuncRegistry_GetByIndex(registry, function_index, &func) != 0) {
- TVMAPIErrorf("invalid function index: %04" PRIx16, function_index);
- return -1;
- }
-
- ret_type_code[0] = kTVMNullptr;
- ret_val[0].v_handle = NULL;
- return func(arg_values, type_codes, num_args, ret_val, ret_type_code,
resource_handle);
-}
-
-static tvm_crt_error_t FindFunctionOrSetAPIError(tvm_module_index_t
module_index,
- const TVMFuncRegistry*
registry, const char* name,
- TVMFunctionHandle* out) {
- tvm_function_index_t function_index;
- tvm_crt_error_t err = TVMFuncRegistry_Lookup(registry, name,
&function_index);
- if (err != kTvmErrorNoError) {
- return err;
- }
-
- *out = EncodeFunctionHandle(module_index, function_index);
- return kTvmErrorNoError;
-}
-
-int TVMFuncGetGlobal(const char* name, TVMFunctionHandle* out) {
- tvm_crt_error_t to_return =
- FindFunctionOrSetAPIError(kGlobalFuncModuleIndex,
&global_func_registry.registry, name, out);
- // For compatibility with the C++ runtime equivalent, in
src/runtime/registry.cc.
- if (to_return == kTvmErrorFunctionNameNotFound) {
- *out = NULL;
- to_return = kTvmErrorNoError;
- }
- return to_return;
-}
-
-int TVMModGetFunction(TVMModuleHandle mod, const char* func_name, int
query_imports,
- TVMFunctionHandle* out) {
- tvm_module_index_t module_index;
- if (DecodeModuleHandle(mod, &module_index) != 0) {
- return -1;
- }
-
- return FindFunctionOrSetAPIError(module_index,
registered_modules[module_index]->registry,
- func_name, out);
-}
-
-int ModuleGetFunction(TVMValue* args, int* type_codes, int num_args, TVMValue*
ret_value,
- int* ret_type_codes) {
- TVMModuleHandle mod;
- const char* name;
- int to_return;
- int query_imports;
-
- ret_value[0].v_handle = NULL;
- ret_type_codes[0] = kTVMNullptr;
- if (num_args != 3) {
- TVMAPISetLastError("ModuleGetFunction expects exactly 3 arguments");
- return kTvmErrorFunctionCallNumArguments;
- }
- if (type_codes[0] != kTVMModuleHandle) {
- TVMAPISetLastError("ModuleGetFunction expects first argument to be a
Module");
- return kTvmErrorFunctionCallWrongArgType;
- }
- if (type_codes[1] != kTVMStr) {
- TVMAPISetLastError("ModuleGetFunction expects second argument to be a
string");
- return kTvmErrorFunctionCallWrongArgType;
- }
-
- if (type_codes[2] == kDLInt || type_codes[2] == kTVMArgBool) {
- query_imports = args[2].v_int64 != 0;
- } else {
- TVMAPISetLastError("ModuleGetFunction expects third argument to be an
integer");
- return kTvmErrorFunctionCallWrongArgType;
- }
-
- mod = (TVMModuleHandle)args[0].v_handle;
- name = args[1].v_str;
- to_return = TVMModGetFunction(mod, name, query_imports,
&ret_value->v_handle);
-
- if (to_return == 0) {
- ret_type_codes[0] = kTVMPackedFuncHandle;
- } else {
- ret_value->v_handle = NULL;
- }
-
- // NOTE: For compatibility with C++ runtime API, return no error (but NULL
function) when the
- // function lookup failed.
- if (to_return == kTvmErrorFunctionNameNotFound) {
- to_return = kTvmErrorNoError;
- }
- return to_return;
-}
-
-typedef struct TVMCReturnValue {
- TVMValue* ret_val;
- int* ret_type_code;
-} TVMCReturnValue;
-
-int TVMCFuncSetReturn(TVMRetValueHandle ret, TVMValue* value, int* type_code,
int num_ret) {
- TVMCReturnValue* ret_val;
- int idx;
-
- ret_val = (TVMCReturnValue*)ret;
- for (idx = 0; idx < num_ret; idx++) {
- ret_val->ret_val[idx] = value[idx];
- ret_val->ret_type_code[idx] = type_code[idx];
- }
-
- return 0;
-}
-
-int TVMFuncFree(TVMFunctionHandle func) {
- // A no-op, since we don't actually allocate anything in GetFunction.
- return 0;
-}
-
-int RPCTimeEvaluator(TVMValue* args, int* type_codes, int num_args, TVMValue*
ret_val,
- int* ret_type_code);
-
-// Sends CRT max packet size.
-int RPCGetCRTMaxPacketSize(TVMValue* args, int* type_codes, int num_args,
TVMValue* ret_value,
- int* ret_type_codes) {
- // 11 bytes is for microtvm overhead:
- // packet start(2), length(4), session header(3), crc(2)
- ret_value[0].v_int64 = TVM_CRT_MAX_PACKET_SIZE_BYTES - 11;
- ret_type_codes[0] = kTVMArgInt;
- return 0;
-}
-
-// Fill the tensor in args[0] with random data using TVMPlatformGenerateRandom.
-static int RandomFill(TVMValue* args, int* type_codes, int num_args, TVMValue*
ret_val,
- int* ret_type_code) {
- if (num_args != 1) {
- return kTvmErrorFunctionCallNumArguments;
- }
-
- if (type_codes[0] != kTVMDLTensorHandle) {
- return kTvmErrorFunctionCallWrongArgType;
- }
-
- DLTensor* tensor = (DLTensor*)args[0].v_handle;
- TVMNDArray arr = {*tensor, 0};
- return TVMNDArray_RandomFill(&arr);
-}
-
-tvm_crt_error_t TVMInitializeRuntime() {
- int idx = 0;
- tvm_crt_error_t error = kTvmErrorNoError;
-
- DLDevice dev = {kDLCPU, 0};
-
- void* registry_backing_memory;
- error = TVMPlatformMemoryAllocate(TVM_CRT_GLOBAL_FUNC_REGISTRY_SIZE_BYTES,
dev,
- ®istry_backing_memory);
- if (error != kTvmErrorNoError) {
- return error;
- }
-
- system_lib_handle = kTVMModuleHandleUninitialized;
-
- error = TVMMutableFuncRegistry_Create(&global_func_registry,
registry_backing_memory,
-
TVM_CRT_GLOBAL_FUNC_REGISTRY_SIZE_BYTES);
- for (idx = 0; idx < TVM_CRT_MAX_REGISTERED_MODULES; idx++) {
- registered_modules[idx] = NULL;
- }
-
- if (error == kTvmErrorNoError) {
- error = TVMFuncRegisterGlobal("runtime.SystemLib", &SystemLibraryCreate,
0);
- }
-
- if (error == kTvmErrorNoError) {
- error = TVMFuncRegisterGlobal("tvm.rpc.server.ModuleGetFunction",
&ModuleGetFunction, 0);
- }
-
- if (error == kTvmErrorNoError) {
- error = TVMFuncRegisterGlobal("runtime.RPCTimeEvaluator",
&RPCTimeEvaluator, 0);
- }
-
- if (error == kTvmErrorNoError) {
- error = TVMFuncRegisterGlobal("tvm.rpc.server.GetCRTMaxPacketSize",
&RPCGetCRTMaxPacketSize, 0);
- }
-
- if (error == kTvmErrorNoError) {
- error = TVMFuncRegisterGlobal("tvm.contrib.random.random_fill",
&RandomFill, 0);
- }
-
- if (error != kTvmErrorNoError) {
- TVMPlatformMemoryFree(registry_backing_memory, dev);
- }
-
- return error;
-}
-
-typedef struct {
- uint16_t function_index;
- TVMFunctionHandle func_to_time;
- DLDevice device;
- int number;
- int repeat;
- int min_repeat_ms;
- int limit_zero_time_iterations;
- int cooldown_interval_ms;
- int repeats_to_cooldown;
-} time_evaluator_state_t;
-
-static time_evaluator_state_t g_time_evaluator_state;
-
-int RPCTimeEvaluator(TVMValue* args, int* type_codes, int num_args, TVMValue*
ret_val,
- int* ret_type_code) {
- ret_val[0].v_handle = NULL;
- ret_type_code[0] = kTVMNullptr;
- if (num_args < 12) {
- TVMAPIErrorf("not enough args");
- return kTvmErrorFunctionCallNumArguments;
- }
- if (type_codes[0] != kTVMModuleHandle || type_codes[1] != kTVMStr ||
- type_codes[2] != kTVMArgInt || type_codes[3] != kTVMArgInt ||
type_codes[4] != kTVMArgInt ||
- type_codes[5] != kTVMArgInt || type_codes[6] != kTVMArgInt ||
type_codes[7] != kTVMArgInt ||
- type_codes[8] != kTVMArgInt || type_codes[9] != kTVMArgInt ||
type_codes[10] != kTVMArgInt ||
- type_codes[11] != kTVMStr) {
- TVMAPIErrorf("one or more invalid arg types");
- return kTvmErrorFunctionCallWrongArgType;
- }
-
- TVMModuleHandle mod = (TVMModuleHandle)args[0].v_handle;
- const char* name = args[1].v_str;
- g_time_evaluator_state.device.device_type = args[2].v_int64;
- g_time_evaluator_state.device.device_id = args[3].v_int64;
- g_time_evaluator_state.number = args[4].v_int64;
- g_time_evaluator_state.repeat = args[5].v_int64;
- g_time_evaluator_state.min_repeat_ms = args[6].v_int64;
- g_time_evaluator_state.limit_zero_time_iterations = args[7].v_int64;
- g_time_evaluator_state.cooldown_interval_ms = args[8].v_int64;
- g_time_evaluator_state.repeats_to_cooldown = args[9].v_int64;
-
- int ret_code =
- TVMModGetFunction(mod, name, /* query_imports */ 0,
&g_time_evaluator_state.func_to_time);
- if (ret_code != 0) {
- return ret_code;
- }
-
- g_time_evaluator_state.function_index++;
- ret_val[0].v_handle =
- EncodeFunctionHandle(kTimeEvaluatorModuleIndex,
g_time_evaluator_state.function_index);
- ret_type_code[0] = kTVMPackedFuncHandle;
- return kTvmErrorNoError;
-}
-
-tvm_crt_error_t RunTimeEvaluator(tvm_function_index_t function_index,
TVMValue* args,
- int* type_codes, int num_args, TVMValue*
ret_val,
- int* ret_type_code) {
- if (function_index != g_time_evaluator_state.function_index) {
- return kTvmErrorTimeEvaluatorBadHandle;
- }
-
- // TODO(areusch): should *really* rethink needing to return doubles
- DLDevice result_byte_dev = {kDLCPU, 0};
- TVMByteArray* result_byte_arr = NULL;
- tvm_crt_error_t err =
- TVMPlatformMemoryAllocate(sizeof(TVMByteArray), result_byte_dev,
(void*)&result_byte_arr);
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- result_byte_arr->data = NULL;
- size_t data_size = sizeof(double) * g_time_evaluator_state.repeat;
- err = TVMPlatformMemoryAllocate(data_size, result_byte_dev,
(void**)&result_byte_arr->data);
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- result_byte_arr->size = data_size;
-
- // skip first time call, to activate lazy compilation components.
- err = TVMFuncCall(g_time_evaluator_state.func_to_time, args, type_codes,
num_args, ret_val,
- ret_type_code);
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
-
- double min_repeat_seconds = ((double)g_time_evaluator_state.min_repeat_ms) /
1000;
- double* iter = (double*)result_byte_arr->data;
- for (int i = 0; i < g_time_evaluator_state.repeat; i++) {
- double curr_res_seconds = 0.0;
- int absolute_zero_times = 0;
- // do-while structure ensures we run even when `min_repeat_ms` isn't set
(i.e., is 0).
- do {
- if (curr_res_seconds > 0.0) {
- double a = (min_repeat_seconds / (curr_res_seconds /
g_time_evaluator_state.number) + 1);
- const double golden_ratio = 1.618;
- double b = g_time_evaluator_state.number * golden_ratio;
- g_time_evaluator_state.number = (int64_t)(a > b ? a : b);
- }
- err = TVMPlatformBeforeMeasurement();
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- err = TVMPlatformTimerStart();
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
-
- for (int j = 0; j < g_time_evaluator_state.number; j++) {
- err = TVMFuncCall(g_time_evaluator_state.func_to_time, args,
type_codes, num_args, ret_val,
- ret_type_code);
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- }
- err = TVMPlatformTimerStop(&curr_res_seconds);
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- err = TVMPlatformAfterMeasurement();
- if (err != kTvmErrorNoError) {
- goto release_and_return;
- }
- if (fpclassify(curr_res_seconds) == FP_ZERO) absolute_zero_times++;
- } while (curr_res_seconds < min_repeat_seconds &&
- absolute_zero_times <
g_time_evaluator_state.limit_zero_time_iterations);
- double mean_exec_seconds = curr_res_seconds /
g_time_evaluator_state.number;
- *iter = mean_exec_seconds;
- iter++;
- if (g_time_evaluator_state.cooldown_interval_ms > 0 &&
- (i % g_time_evaluator_state.repeats_to_cooldown) == 0) {
-#if defined(_WIN32) || defined(WIN32)
- Sleep(g_time_evaluator_state.cooldown_interval_ms);
-#elif __unix__
- usleep(g_time_evaluator_state.cooldown_interval_ms * 1000);
-#else
- TVMAPIErrorf(
- "No support for non-zero cooldown_interval_ms for this platform: Use
"
- "cooldown_interval_ms = 0");
- goto release_and_return;
-#endif
- }
- }
-
- *ret_type_code = kTVMBytes;
- ret_val->v_handle = result_byte_arr;
- return err;
-
-release_and_return: {
- tvm_crt_error_t release_err =
- TVMPlatformMemoryFree((void*)result_byte_arr->data, result_byte_dev);
- if (release_err != kTvmErrorNoError) {
- release_err = TVMPlatformMemoryFree((void*)result_byte_arr,
result_byte_dev);
- }
-
- if (err == kTvmErrorNoError && release_err != kTvmErrorNoError) {
- err = release_err;
- }
-}
- return err;
-}
-
-// Default implementation, overridden by the platform runtime.
-TVM_WEAK tvm_crt_error_t TVMPlatformGenerateRandom(uint8_t* buffer, size_t
num_bytes) {
- return kTvmErrorFunctionCallNotImplemented;
-}
-
-// Default implementation, overridden by the platform runtime.
-TVM_WEAK tvm_crt_error_t TVMPlatformBeforeMeasurement() { return
kTvmErrorNoError; }
-
-// Default implementation, overridden by the platform runtime.
-TVM_WEAK tvm_crt_error_t TVMPlatformAfterMeasurement() { return
kTvmErrorNoError; }
diff --git a/src/runtime/meta_data.h b/src/runtime/meta_data.h
deleted file mode 100644
index 5b9fa86654..0000000000
--- a/src/runtime/meta_data.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \file meta_data.h
- * \brief Meta data related utilities
- */
-#ifndef TVM_RUNTIME_META_DATA_H_
-#define TVM_RUNTIME_META_DATA_H_
-
-#include <dmlc/io.h>
-#include <dmlc/json.h>
-#include <tvm/ffi/function.h>
-#include <tvm/runtime/module.h>
-#include <tvm/runtime/tensor.h>
-
-#include <string>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-namespace tvm {
-namespace runtime {
-
-inline ffi::String get_name_mangled(const ffi::String& module_name, const
ffi::String& name) {
- std::stringstream ss;
- ss << module_name << "_" << name;
- return ss.str();
-}
-
-namespace launch_param {
-
-/*! \brief A tag to specify whether or not dynamic shared memory is used */
-constexpr const char* kUseDynamicSharedMemoryTag = "tir.use_dyn_shared_memory";
-/*! \brief A tag to specify whether or not use programatic dependent launch */
-constexpr const char* kUseProgramaticDependentLaunch =
"tir.use_programtic_dependent_launch";
-/*! \brief A tag to specify whether or not use cooperative launch */
-constexpr const char* kUseCooperativeLaunch = "tir.use_cooperative_launch";
-
-} // namespace launch_param
-
-/*! \brief function information needed by device */
-struct FunctionInfo {
- std::string name;
- std::vector<DLDataType> arg_types;
- std::vector<std::string> launch_param_tags;
- std::vector<int> arg_is_tensormap;
-
- enum class ArgExtraTags : int { kNone = 0, kTensorMap = 1 };
- std::vector<ArgExtraTags> arg_extra_tags;
-
- void Save(dmlc::JSONWriter* writer) const;
- void Load(dmlc::JSONReader* reader);
- void Save(dmlc::Stream* writer) const;
- bool Load(dmlc::Stream* reader);
-};
-} // namespace runtime
-} // namespace tvm
-
-namespace dmlc {
-DMLC_DECLARE_TRAITS(has_saveload, ::tvm::runtime::FunctionInfo, true);
-} // namespace dmlc
-#endif // TVM_RUNTIME_META_DATA_H_