tvm
c_runtime_api.h
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 /*
21  * \file tvm/runtime/c_runtime_api.h
22  * \brief TVM runtime library.
23  *
24  * The philosophy of TVM project is to customize the compilation
25  * stage to generate code that can used by other projects transparently.
26  * So this is a minimum runtime code gluing, and some limited
27  * memory management code to enable quick testing.
28  *
29  * The runtime API is independent from TVM compilation stack and can
30  * be linked via libtvm_runtime.
31  *
32  * The common flow is:
33  * - Use TVMFuncListGlobalNames to get global function name
34  * - Use TVMFuncCall to call these functions.
35  *
36  * Possible return values of the API functions:
37  * * 0: success
38  * * -1: the error can be retrieved through TVMGetLastError.
39  * * -2: a frontend error occurred and recorded in the frontend.
40  */
41 #ifndef TVM_RUNTIME_C_RUNTIME_API_H_
42 #define TVM_RUNTIME_C_RUNTIME_API_H_
43 
44 // Macros to do weak linking
45 #ifdef _MSC_VER
46 #define TVM_WEAK __declspec(selectany)
47 #else
48 #define TVM_WEAK __attribute__((weak))
49 #endif
50 
51 #ifdef __EMSCRIPTEN__
52 #include <emscripten/emscripten.h>
53 #define TVM_DLL EMSCRIPTEN_KEEPALIVE
54 #endif
55 
56 #ifndef TVM_DLL
57 #ifdef _WIN32
58 #ifdef TVM_EXPORTS
59 #define TVM_DLL __declspec(dllexport)
60 #else
61 #define TVM_DLL __declspec(dllimport)
62 #endif
63 #else
64 #define TVM_DLL __attribute__((visibility("default")))
65 #endif
66 #endif
67 
68 // TVM version
69 #define TVM_VERSION "0.11.dev0"
70 
71 // TVM Runtime is DLPack compatible.
72 #include <dlpack/dlpack.h>
73 
74 #ifdef __cplusplus
75 extern "C" {
76 #endif
77 #include <stddef.h>
78 #include <stdint.h>
79 
81 typedef int64_t tvm_index_t;
82 
106 #ifdef __cplusplus
107 typedef enum : int32_t {
108 #else
109 typedef enum {
110 #endif
111  // To help avoid accidental conflicts between `DLDeviceType`
112  // and this enumeration, start numbering the new enumerators
113  // a little higher than (currently) seems necessary.
114  kDLAOCL = 32,
118  TVMDeviceExtType_End, // sentinel value
120 
121 #ifdef __cplusplus
122 // Some other parts of TVM hardcode the integer identifier for
123 // some DLPack / TVM devices, rather then using the symbolic
124 // enumerator. E.g., `2` rather than `kDLCUDA`.
125 // These asserts should alert us when that mapping breaks.
126 #define TVM_HARCODED_INTEGER_CHANGED_MSG \
127  "Change in compile-time integer. Make sure hardcoded uses of this integer throughout TVM are " \
128  "updated."
129 static_assert(kDLCPU == 1, TVM_HARCODED_INTEGER_CHANGED_MSG);
130 static_assert(kDLCUDA == 2, TVM_HARCODED_INTEGER_CHANGED_MSG);
131 static_assert(kDLCUDAHost == 3, TVM_HARCODED_INTEGER_CHANGED_MSG);
132 static_assert(kDLOpenCL == 4, TVM_HARCODED_INTEGER_CHANGED_MSG);
133 static_assert(kDLVulkan == 7, TVM_HARCODED_INTEGER_CHANGED_MSG);
134 static_assert(kDLMetal == 8, TVM_HARCODED_INTEGER_CHANGED_MSG);
135 static_assert(kDLVPI == 9, TVM_HARCODED_INTEGER_CHANGED_MSG);
136 static_assert(kDLROCM == 10, TVM_HARCODED_INTEGER_CHANGED_MSG);
137 static_assert(kDLROCMHost == 11, TVM_HARCODED_INTEGER_CHANGED_MSG);
138 static_assert(kDLExtDev == 12, TVM_HARCODED_INTEGER_CHANGED_MSG);
139 static_assert(kDLCUDAManaged == 13, TVM_HARCODED_INTEGER_CHANGED_MSG);
140 static_assert(kDLOneAPI == 14, TVM_HARCODED_INTEGER_CHANGED_MSG);
141 static_assert(kDLWebGPU == 15, TVM_HARCODED_INTEGER_CHANGED_MSG);
142 static_assert(kDLHexagon == 16, TVM_HARCODED_INTEGER_CHANGED_MSG);
143 
144 static_assert(kDLAOCL == 32, TVM_HARCODED_INTEGER_CHANGED_MSG);
145 static_assert(kDLSDAccel == 33, TVM_HARCODED_INTEGER_CHANGED_MSG);
146 static_assert(kOpenGL == 34, TVM_HARCODED_INTEGER_CHANGED_MSG);
147 static_assert(kDLMicroDev == 35, TVM_HARCODED_INTEGER_CHANGED_MSG);
148 #undef TVM_HARCODED_INTEGER_CHANGED_MSG
149 #endif
150 
167 typedef enum {
168  kTVMArgInt = kDLInt,
169  kTVMArgFloat = kDLFloat,
173  kDLDevice = 6U,
178  kTVMStr = 11U,
179  kTVMBytes = 12U,
182  // Extension codes for other frameworks to integrate TVM PackedFunc.
183  // To make sure each framework's id do not conflict, use first and
184  // last sections to mark ranges.
185  // Open an issue at the repo if you need a section of code.
189  // The following section of code is used for non-reserved types.
191  kTVMExtEnd = 128U,
193 
195 typedef DLTensor* TVMArrayHandle;
196 
201 typedef union {
202  int64_t v_int64;
203  double v_float64;
204  void* v_handle;
205  const char* v_str;
206  DLDataType v_type;
207  DLDevice v_device;
208 } TVMValue;
209 
214 typedef struct {
215  const char* data;
216  size_t size;
217 } TVMByteArray;
218 
220 typedef void* TVMModuleHandle;
222 typedef void* TVMFunctionHandle;
224 typedef void* TVMRetValueHandle;
229 typedef void* TVMStreamHandle;
231 typedef void* TVMObjectHandle;
232 
238 TVM_DLL void TVMAPISetLastError(const char* msg);
239 
249 TVM_DLL const char* TVMGetLastError(void);
260 TVM_DLL int TVMModLoadFromFile(const char* file_name, const char* format, TVMModuleHandle* out);
261 
270 TVM_DLL int TVMModImport(TVMModuleHandle mod, TVMModuleHandle dep);
271 
280 TVM_DLL int TVMModGetFunction(TVMModuleHandle mod, const char* func_name, int query_imports,
281  TVMFunctionHandle* out);
282 
294 TVM_DLL int TVMModFree(TVMModuleHandle mod);
295 
301 TVM_DLL int TVMFuncFree(TVMFunctionHandle func);
302 
323 TVM_DLL int TVMFuncCall(TVMFunctionHandle func, TVMValue* arg_values, int* type_codes, int num_args,
324  TVMValue* ret_val, int* ret_type_code);
325 
337 TVM_DLL int TVMCFuncSetReturn(TVMRetValueHandle ret, TVMValue* value, int* type_code, int num_ret);
338 
349 TVM_DLL int TVMCbArgToReturn(TVMValue* value, int* code);
350 
362 typedef int (*TVMPackedCFunc)(TVMValue* args, int* type_codes, int num_args, TVMRetValueHandle ret,
363  void* resource_handle);
364 
369 typedef void (*TVMPackedCFuncFinalizer)(void* resource_handle);
370 
380 typedef int (*TVMExtensionFuncDeclarer)(TVMFunctionHandle register_func_handle);
381 
393 TVM_DLL int TVMFuncCreateFromCFunc(TVMPackedCFunc func, void* resource_handle,
394  TVMPackedCFuncFinalizer fin, TVMFunctionHandle* out);
395 
405 TVM_DLL int TVMFuncRegisterGlobal(const char* name, TVMFunctionHandle f, int override);
406 
416 TVM_DLL int TVMFuncGetGlobal(const char* name, TVMFunctionHandle* out);
417 
424 TVM_DLL int TVMFuncListGlobalNames(int* out_size, const char*** out_array);
425 
430 TVM_DLL int TVMFuncRemoveGlobal(const char* name);
431 
432 // Array related apis for quick proptyping
447 TVM_DLL int TVMArrayAlloc(const tvm_index_t* shape, int ndim, int dtype_code, int dtype_bits,
448  int dtype_lanes, int device_type, int device_id, TVMArrayHandle* out);
449 
455 TVM_DLL int TVMArrayFree(TVMArrayHandle handle);
456 
464 TVM_DLL int TVMArrayCopyFromBytes(TVMArrayHandle handle, void* data, size_t nbytes);
465 
473 TVM_DLL int TVMArrayCopyToBytes(TVMArrayHandle handle, void* data, size_t nbytes);
474 
482 TVM_DLL int TVMArrayCopyFromTo(TVMArrayHandle from, TVMArrayHandle to, TVMStreamHandle stream);
483 
491 TVM_DLL int TVMArrayFromDLPack(DLManagedTensor* from, TVMArrayHandle* out);
492 
500 TVM_DLL int TVMArrayToDLPack(TVMArrayHandle from, DLManagedTensor** out);
501 
506 TVM_DLL void TVMDLManagedTensorCallDeleter(DLManagedTensor* dltensor);
507 
516 TVM_DLL int TVMStreamCreate(int device_type, int device_id, TVMStreamHandle* out);
517 
526 TVM_DLL int TVMStreamFree(int device_type, int device_id, TVMStreamHandle stream);
527 
539 TVM_DLL int TVMSetStream(int device_type, int device_id, TVMStreamHandle handle);
540 
549 TVM_DLL int TVMSynchronize(int device_type, int device_id, TVMStreamHandle stream);
550 
560 TVM_DLL int TVMStreamStreamSynchronize(int device_type, int device_id, TVMStreamHandle src,
561  TVMStreamHandle dst);
562 
570 TVM_DLL int TVMObjectGetTypeIndex(TVMObjectHandle obj, unsigned* out_tindex);
571 
578 TVM_DLL int TVMObjectTypeKey2Index(const char* type_key, unsigned* out_tindex);
579 
586 TVM_DLL int TVMObjectTypeIndex2Key(unsigned tindex, char** out_type_key);
587 
595 TVM_DLL int TVMObjectRetain(TVMObjectHandle obj);
596 
605 TVM_DLL int TVMObjectFree(TVMObjectHandle obj);
606 
612 TVM_DLL int TVMByteArrayFree(TVMByteArray* arr);
613 
624 TVM_DLL int TVMDeviceAllocDataSpace(DLDevice dev, size_t nbytes, size_t alignment,
625  DLDataType type_hint, void** out_data);
626 
640 TVM_DLL int TVMDeviceAllocDataSpaceWithScope(DLDevice dev, int ndim, const int64_t* shape,
641  DLDataType dtype, const char* mem_scope,
642  void** out_data);
643 
650 TVM_DLL int TVMDeviceFreeDataSpace(DLDevice dev, void* ptr);
651 
661 TVM_DLL int TVMDeviceCopyDataFromTo(DLTensor* from, DLTensor* to, TVMStreamHandle stream);
662 
670 TVM_DLL int TVMObjectDerivedFrom(uint32_t child_type_index, uint32_t parent_type_index,
671  int* is_derived);
672 
673 #ifdef __cplusplus
674 } // TVM_EXTERN_C
675 #endif
676 #endif // TVM_RUNTIME_C_RUNTIME_API_H_
Definition: c_runtime_api.h:187
int64_t v_int64
Definition: c_runtime_api.h:202
int(* TVMPackedCFunc)(TVMValue *args, int *type_codes, int num_args, TVMRetValueHandle ret, void *resource_handle)
C type of packed function.
Definition: c_runtime_api.h:362
void TVMAPISetLastError(const char *msg)
Used for implementing C API function. Set last error message before return.
constexpr const char * device_type
The device type.
Definition: stmt.h:1405
Definition: c_runtime_api.h:118
int TVMFuncFree(TVMFunctionHandle func)
Free the function when it is no longer needed.
int TVMArrayFree(TVMArrayHandle handle)
Free the TVM Array.
Definition: c_runtime_api.h:115
void * TVMModuleHandle
Handle to TVM runtime modules.
Definition: c_runtime_api.h:220
int TVMModImport(TVMModuleHandle mod, TVMModuleHandle dep)
Add dep to mod&#39;s dependency. This allows functions in this module to use modules. ...
void * v_handle
Definition: c_runtime_api.h:204
int TVMDeviceAllocDataSpaceWithScope(DLDevice dev, int ndim, const int64_t *shape, DLDataType dtype, const char *mem_scope, void **out_data)
Allocate a data space on device with special memory scope.
Definition: c_runtime_api.h:181
int TVMFuncListGlobalNames(int *out_size, const char ***out_array)
List all the globally registered function name.
Definition: c_runtime_api.h:168
Definition: c_runtime_api.h:176
const char * v_str
Definition: c_runtime_api.h:205
int TVMFuncCreateFromCFunc(TVMPackedCFunc func, void *resource_handle, TVMPackedCFuncFinalizer fin, TVMFunctionHandle *out)
Wrap a TVMPackedCFunc to become a FunctionHandle.
DLTensor * TVMArrayHandle
the array handle
Definition: c_runtime_api.h:195
Definition: c_runtime_api.h:172
int TVMArrayCopyToBytes(TVMArrayHandle handle, void *data, size_t nbytes)
Copy array data to CPU byte array.
int TVMModLoadFromFile(const char *file_name, const char *format, TVMModuleHandle *out)
Load module from file.
Definition: c_runtime_api.h:177
size_t size
Definition: c_runtime_api.h:216
Definition: c_runtime_api.h:114
Union type of values being passed through API and function calls.
Definition: c_runtime_api.h:201
Definition: c_runtime_api.h:175
const char * data
Definition: c_runtime_api.h:215
const char * TVMGetLastError(void)
return str message of the last error all function in this file will return 0 when success and nonzero...
Byte array type used to pass in byte array When kTVMBytes is used as data type.
Definition: c_runtime_api.h:214
void * TVMStreamHandle
The stream that is specific to device can be NULL, which indicates the default one.
Definition: c_runtime_api.h:229
int TVMCFuncSetReturn(TVMRetValueHandle ret, TVMValue *value, int *type_code, int num_ret)
Set the return value of TVMPackedCFunc.
int TVMFuncCall(TVMFunctionHandle func, TVMValue *arg_values, int *type_codes, int num_args, TVMValue *ret_val, int *ret_type_code)
Call a Packed TVM Function.
int TVMStreamStreamSynchronize(int device_type, int device_id, TVMStreamHandle src, TVMStreamHandle dst)
Synchronize two streams of execution.
int TVMCbArgToReturn(TVMValue *value, int *code)
Inplace translate callback argument value to return value. This is only needed for non-POD arguments...
constexpr const char * device_id
The allocation device for global malloc in host.
Definition: stmt.h:1403
int TVMFuncRemoveGlobal(const char *name)
Remove a global function.
int TVMFuncGetGlobal(const char *name, TVMFunctionHandle *out)
Get a global function.
Definition: c_runtime_api.h:191
TVMDeviceExtType
Extension device types in TVM.
Definition: c_runtime_api.h:109
int TVMSynchronize(int device_type, int device_id, TVMStreamHandle stream)
Wait until all computations on stream completes.
int TVMModFree(TVMModuleHandle mod)
Free the Module.
int TVMByteArrayFree(TVMByteArray *arr)
Free a TVMByteArray returned from TVMFuncCall, and associated memory.
void TVMDLManagedTensorCallDeleter(DLManagedTensor *dltensor)
Delete (free) a DLManagedTensor&#39;s data.
int TVMModGetFunction(TVMModuleHandle mod, const char *func_name, int query_imports, TVMFunctionHandle *out)
Get function from the module.
int TVMObjectFree(TVMObjectHandle obj)
Free the object.
Definition: c_runtime_api.h:117
Definition: c_runtime_api.h:116
TVMArgTypeCode
The type code in used and only used in TVM FFI for argument passing.
Definition: c_runtime_api.h:167
Definition: c_runtime_api.h:180
int TVMStreamFree(int device_type, int device_id, TVMStreamHandle stream)
Free a created stream handle.
int(* TVMExtensionFuncDeclarer)(TVMFunctionHandle register_func_handle)
Signature for extension function declarer.
Definition: c_runtime_api.h:380
DLDevice v_device
Definition: c_runtime_api.h:207
int TVMDeviceAllocDataSpace(DLDevice dev, size_t nbytes, size_t alignment, DLDataType type_hint, void **out_data)
Allocate a data space on device.
int TVMArrayCopyFromTo(TVMArrayHandle from, TVMArrayHandle to, TVMStreamHandle stream)
Copy the array, both from and to must be valid during the copy.
int TVMArrayToDLPack(TVMArrayHandle from, DLManagedTensor **out)
Produce a DLMangedTensor from the array that shares data memory with the array.
void * TVMRetValueHandle
Handle to hold return value.
Definition: c_runtime_api.h:224
void * TVMFunctionHandle
Handle to packed function handle.
Definition: c_runtime_api.h:222
Tensor shape(const Tensor &src, DataType dtype, const std::string name="T_shape", const std::string tag=kInjective)
Get the shape of input tensor.
Definition: transform.h:1758
int64_t tvm_index_t
type of array index.
Definition: c_runtime_api.h:81
Definition: c_runtime_api.h:170
int TVMObjectRetain(TVMObjectHandle obj)
Increase the reference count of an object.
DLDataType v_type
Definition: c_runtime_api.h:206
int TVMObjectDerivedFrom(uint32_t child_type_index, uint32_t parent_type_index, int *is_derived)
Check that an object is derived from another.
int TVMObjectTypeIndex2Key(unsigned tindex, char **out_type_key)
Convert type index to type key.
int TVMStreamCreate(int device_type, int device_id, TVMStreamHandle *out)
Create a new runtime stream.
Definition: c_runtime_api.h:186
int TVMFuncRegisterGlobal(const char *name, TVMFunctionHandle f, int override)
Register the function to runtime&#39;s global table.
Definition: c_runtime_api.h:169
void * TVMObjectHandle
Handle to Object.
Definition: c_runtime_api.h:231
Definition: c_runtime_api.h:171
int TVMObjectTypeKey2Index(const char *type_key, unsigned *out_tindex)
Convert type key to type index.
Definition: c_runtime_api.h:188
int TVMObjectGetTypeIndex(TVMObjectHandle obj, unsigned *out_tindex)
Get the type_index from an object.
int TVMSetStream(int device_type, int device_id, TVMStreamHandle handle)
Set the runtime stream of current thread to be stream. The subsequent calls to the same device_type w...
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)
Allocate a nd-array&#39;s memory, including space of shape, of given spec.
int TVMArrayCopyFromBytes(TVMArrayHandle handle, void *data, size_t nbytes)
Copy array data from CPU byte array.
tvm::PrimExpr mod(const tvm::PrimExpr &a, const tvm::PrimExpr &b)
Definition: broadcast.h:290
int TVMArrayFromDLPack(DLManagedTensor *from, TVMArrayHandle *out)
Produce an array from the DLManagedTensor that shares data memory with the DLManagedTensor.
Definition: c_runtime_api.h:173
const Op & ret()
Return value.
Definition: c_runtime_api.h:179
int TVMDeviceCopyDataFromTo(DLTensor *from, DLTensor *to, TVMStreamHandle stream)
Copy data from one place to another.
int TVMDeviceFreeDataSpace(DLDevice dev, void *ptr)
Free a data space on device.
Definition: c_runtime_api.h:178
Definition: c_runtime_api.h:190
double v_float64
Definition: c_runtime_api.h:203
Definition: c_runtime_api.h:174
void(* TVMPackedCFuncFinalizer)(void *resource_handle)
C callback to free the resource handle in C packed function.
Definition: c_runtime_api.h:369