tvm
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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 // helper macro to suppress unused warning
57 #if defined(__GNUC__)
58 #define TVM_ATTRIBUTE_UNUSED __attribute__((unused))
59 #else
60 #define TVM_ATTRIBUTE_UNUSED
61 #endif
62 
63 #ifndef TVM_DLL
64 #ifdef _WIN32
65 #ifdef TVM_EXPORTS
66 #define TVM_DLL __declspec(dllexport)
67 #else
68 #define TVM_DLL __declspec(dllimport)
69 #endif
70 #else
71 #define TVM_DLL __attribute__((visibility("default")))
72 #endif
73 #endif
74 
75 // TVM version
76 #define TVM_VERSION "0.12.0"
77 
78 // TVM Runtime is DLPack compatible.
79 #include <dlpack/dlpack.h>
80 
81 #ifdef __cplusplus
82 extern "C" {
83 #endif
84 #include <stddef.h>
85 #include <stdint.h>
86 
88 typedef int64_t tvm_index_t;
89 
113 #ifdef __cplusplus
114 typedef enum : int32_t {
115 #else
116 typedef enum {
117 #endif
118  // To help avoid accidental conflicts between `DLDeviceType`
119  // and this enumeration, start numbering the new enumerators
120  // a little higher than (currently) seems necessary.
121  kDLAOCL = 32,
125  TVMDeviceExtType_End, // sentinel value
127 
128 #ifdef __cplusplus
129 // Some other parts of TVM hardcode the integer identifier for
130 // some DLPack / TVM devices, rather then using the symbolic
131 // enumerator. E.g., `2` rather than `kDLCUDA`.
132 // These asserts should alert us when that mapping breaks.
133 #define TVM_HARCODED_INTEGER_CHANGED_MSG \
134  "Change in compile-time integer. Make sure hardcoded uses of this integer throughout TVM are " \
135  "updated."
136 static_assert(kDLCPU == 1, TVM_HARCODED_INTEGER_CHANGED_MSG);
137 static_assert(kDLCUDA == 2, TVM_HARCODED_INTEGER_CHANGED_MSG);
138 static_assert(kDLCUDAHost == 3, TVM_HARCODED_INTEGER_CHANGED_MSG);
139 static_assert(kDLOpenCL == 4, TVM_HARCODED_INTEGER_CHANGED_MSG);
140 static_assert(kDLVulkan == 7, TVM_HARCODED_INTEGER_CHANGED_MSG);
141 static_assert(kDLMetal == 8, TVM_HARCODED_INTEGER_CHANGED_MSG);
142 static_assert(kDLVPI == 9, TVM_HARCODED_INTEGER_CHANGED_MSG);
143 static_assert(kDLROCM == 10, TVM_HARCODED_INTEGER_CHANGED_MSG);
144 static_assert(kDLROCMHost == 11, TVM_HARCODED_INTEGER_CHANGED_MSG);
145 static_assert(kDLExtDev == 12, TVM_HARCODED_INTEGER_CHANGED_MSG);
146 static_assert(kDLCUDAManaged == 13, TVM_HARCODED_INTEGER_CHANGED_MSG);
147 static_assert(kDLOneAPI == 14, TVM_HARCODED_INTEGER_CHANGED_MSG);
148 static_assert(kDLWebGPU == 15, TVM_HARCODED_INTEGER_CHANGED_MSG);
149 static_assert(kDLHexagon == 16, TVM_HARCODED_INTEGER_CHANGED_MSG);
150 
151 static_assert(kDLAOCL == 32, TVM_HARCODED_INTEGER_CHANGED_MSG);
152 static_assert(kDLSDAccel == 33, TVM_HARCODED_INTEGER_CHANGED_MSG);
153 static_assert(kOpenGL == 34, TVM_HARCODED_INTEGER_CHANGED_MSG);
154 static_assert(kDLMicroDev == 35, TVM_HARCODED_INTEGER_CHANGED_MSG);
155 #undef TVM_HARCODED_INTEGER_CHANGED_MSG
156 #endif
157 
174 typedef enum {
175  kTVMArgInt = kDLInt,
176  kTVMArgFloat = kDLFloat,
180  kDLDevice = 6U,
185  kTVMStr = 11U,
186  kTVMBytes = 12U,
189  // Extension codes for other frameworks to integrate TVM PackedFunc.
190  // To make sure each framework's id do not conflict, use first and
191  // last sections to mark ranges.
192  // Open an issue at the repo if you need a section of code.
196  // The following section of code is used for non-reserved types.
198  kTVMExtEnd = 128U,
200 
202 typedef DLTensor* TVMArrayHandle;
203 
208 typedef union {
209  int64_t v_int64;
210  double v_float64;
211  void* v_handle;
212  const char* v_str;
213  DLDataType v_type;
214  DLDevice v_device;
215 } TVMValue;
216 
221 typedef struct {
222  const char* data;
223  size_t size;
224 } TVMByteArray;
225 
227 typedef void* TVMModuleHandle;
229 typedef void* TVMFunctionHandle;
231 typedef void* TVMRetValueHandle;
236 typedef void* TVMStreamHandle;
238 typedef void* TVMObjectHandle;
239 
245 TVM_DLL void TVMAPISetLastError(const char* msg);
246 
256 TVM_DLL const char* TVMGetLastError(void);
267 TVM_DLL int TVMModLoadFromFile(const char* file_name, const char* format, TVMModuleHandle* out);
268 
277 TVM_DLL int TVMModImport(TVMModuleHandle mod, TVMModuleHandle dep);
278 
287 TVM_DLL int TVMModGetFunction(TVMModuleHandle mod, const char* func_name, int query_imports,
288  TVMFunctionHandle* out);
289 
301 TVM_DLL int TVMModFree(TVMModuleHandle mod);
302 
308 TVM_DLL int TVMFuncFree(TVMFunctionHandle func);
309 
330 TVM_DLL int TVMFuncCall(TVMFunctionHandle func, TVMValue* arg_values, int* type_codes, int num_args,
331  TVMValue* ret_val, int* ret_type_code);
332 
344 TVM_DLL int TVMCFuncSetReturn(TVMRetValueHandle ret, TVMValue* value, int* type_code, int num_ret);
345 
356 TVM_DLL int TVMCbArgToReturn(TVMValue* value, int* code);
357 
369 typedef int (*TVMPackedCFunc)(TVMValue* args, int* type_codes, int num_args, TVMRetValueHandle ret,
370  void* resource_handle);
371 
376 typedef void (*TVMPackedCFuncFinalizer)(void* resource_handle);
377 
387 typedef int (*TVMExtensionFuncDeclarer)(TVMFunctionHandle register_func_handle);
388 
400 TVM_DLL int TVMFuncCreateFromCFunc(TVMPackedCFunc func, void* resource_handle,
401  TVMPackedCFuncFinalizer fin, TVMFunctionHandle* out);
402 
412 TVM_DLL int TVMFuncRegisterGlobal(const char* name, TVMFunctionHandle f, int override);
413 
423 TVM_DLL int TVMFuncGetGlobal(const char* name, TVMFunctionHandle* out);
424 
431 TVM_DLL int TVMFuncListGlobalNames(int* out_size, const char*** out_array);
432 
437 TVM_DLL int TVMFuncRemoveGlobal(const char* name);
438 
439 // Array related apis for quick proptyping
454 TVM_DLL int TVMArrayAlloc(const tvm_index_t* shape, int ndim, int dtype_code, int dtype_bits,
455  int dtype_lanes, int device_type, int device_id, TVMArrayHandle* out);
456 
462 TVM_DLL int TVMArrayFree(TVMArrayHandle handle);
463 
471 TVM_DLL int TVMArrayCopyFromBytes(TVMArrayHandle handle, void* data, size_t nbytes);
472 
480 TVM_DLL int TVMArrayCopyToBytes(TVMArrayHandle handle, void* data, size_t nbytes);
481 
489 TVM_DLL int TVMArrayCopyFromTo(TVMArrayHandle from, TVMArrayHandle to, TVMStreamHandle stream);
490 
498 TVM_DLL int TVMArrayFromDLPack(DLManagedTensor* from, TVMArrayHandle* out);
499 
507 TVM_DLL int TVMArrayToDLPack(TVMArrayHandle from, DLManagedTensor** out);
508 
513 TVM_DLL void TVMDLManagedTensorCallDeleter(DLManagedTensor* dltensor);
514 
523 TVM_DLL int TVMStreamCreate(int device_type, int device_id, TVMStreamHandle* out);
524 
533 TVM_DLL int TVMStreamFree(int device_type, int device_id, TVMStreamHandle stream);
534 
546 TVM_DLL int TVMSetStream(int device_type, int device_id, TVMStreamHandle handle);
547 
556 TVM_DLL int TVMSynchronize(int device_type, int device_id, TVMStreamHandle stream);
557 
567 TVM_DLL int TVMStreamStreamSynchronize(int device_type, int device_id, TVMStreamHandle src,
568  TVMStreamHandle dst);
569 
577 TVM_DLL int TVMObjectGetTypeIndex(TVMObjectHandle obj, unsigned* out_tindex);
578 
585 TVM_DLL int TVMObjectTypeKey2Index(const char* type_key, unsigned* out_tindex);
586 
593 TVM_DLL int TVMObjectTypeIndex2Key(unsigned tindex, char** out_type_key);
594 
602 TVM_DLL int TVMObjectRetain(TVMObjectHandle obj);
603 
612 TVM_DLL int TVMObjectFree(TVMObjectHandle obj);
613 
619 TVM_DLL int TVMByteArrayFree(TVMByteArray* arr);
620 
631 TVM_DLL int TVMDeviceAllocDataSpace(DLDevice dev, size_t nbytes, size_t alignment,
632  DLDataType type_hint, void** out_data);
633 
647 TVM_DLL int TVMDeviceAllocDataSpaceWithScope(DLDevice dev, int ndim, const int64_t* shape,
648  DLDataType dtype, const char* mem_scope,
649  void** out_data);
650 
657 TVM_DLL int TVMDeviceFreeDataSpace(DLDevice dev, void* ptr);
658 
668 TVM_DLL int TVMDeviceCopyDataFromTo(DLTensor* from, DLTensor* to, TVMStreamHandle stream);
669 
677 TVM_DLL int TVMObjectDerivedFrom(uint32_t child_type_index, uint32_t parent_type_index,
678  int* is_derived);
679 
680 #ifdef __cplusplus
681 } // TVM_EXTERN_C
682 #endif
683 #endif // TVM_RUNTIME_C_RUNTIME_API_H_
Definition: c_runtime_api.h:194
int64_t v_int64
Definition: c_runtime_api.h:209
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:369
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:1355
Definition: c_runtime_api.h:125
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:122
void * TVMModuleHandle
Handle to TVM runtime modules.
Definition: c_runtime_api.h:227
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:211
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:188
int TVMFuncListGlobalNames(int *out_size, const char ***out_array)
List all the globally registered function name.
Definition: c_runtime_api.h:175
Definition: c_runtime_api.h:183
const char * v_str
Definition: c_runtime_api.h:212
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:202
Definition: c_runtime_api.h:179
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:184
size_t size
Definition: c_runtime_api.h:223
Definition: c_runtime_api.h:121
Union type of values being passed through API and function calls.
Definition: c_runtime_api.h:208
Definition: c_runtime_api.h:182
const char * data
Definition: c_runtime_api.h:222
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:221
void * TVMStreamHandle
The stream that is specific to device can be NULL, which indicates the default one.
Definition: c_runtime_api.h:236
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:1353
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:198
TVMDeviceExtType
Extension device types in TVM.
Definition: c_runtime_api.h:116
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:124
Definition: c_runtime_api.h:123
TVMArgTypeCode
The type code in used and only used in TVM FFI for argument passing.
Definition: c_runtime_api.h:174
Definition: c_runtime_api.h:187
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:387
DLDevice v_device
Definition: c_runtime_api.h:214
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:231
void * TVMFunctionHandle
Handle to packed function handle.
Definition: c_runtime_api.h:229
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:1768
int64_t tvm_index_t
type of array index.
Definition: c_runtime_api.h:88
Definition: c_runtime_api.h:177
int TVMObjectRetain(TVMObjectHandle obj)
Increase the reference count of an object.
DLDataType v_type
Definition: c_runtime_api.h:213
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:193
int TVMFuncRegisterGlobal(const char *name, TVMFunctionHandle f, int override)
Register the function to runtime&#39;s global table.
Definition: c_runtime_api.h:176
void * TVMObjectHandle
Handle to Object.
Definition: c_runtime_api.h:238
Definition: c_runtime_api.h:178
int TVMObjectTypeKey2Index(const char *type_key, unsigned *out_tindex)
Convert type key to type index.
Definition: c_runtime_api.h:195
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:180
const Op & ret()
Return value.
Definition: c_runtime_api.h:186
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:185
Definition: c_runtime_api.h:197
double v_float64
Definition: c_runtime_api.h:210
Definition: c_runtime_api.h:181
void(* TVMPackedCFuncFinalizer)(void *resource_handle)
C callback to free the resource handle in C packed function.
Definition: c_runtime_api.h:376