| /*! |
| * Copyright (c) 2017 by Contributors |
| * \file dlpack.h |
| * \brief The common header of DLPack. |
| */ |
| |
| // Copied from pytorch/torch/lib/ATen/dlpack.h |
| |
| #ifndef DLPACK_DLPACK_H_ |
| #define DLPACK_DLPACK_H_ |
| |
| #ifdef __cplusplus |
| #define DLPACK_EXTERN_C extern "C" |
| #else |
| #define DLPACK_EXTERN_C |
| #endif |
| |
| /*! \brief The current version of dlpack */ |
| #define DLPACK_VERSION 010 |
| |
| /*! \brief DLPACK_DLL prefix for windows */ |
| #ifdef _WIN32 |
| #ifdef DLPACK_EXPORTS |
| #define DLPACK_DLL __declspec(dllexport) |
| #else |
| #define DLPACK_DLL __declspec(dllimport) |
| #endif |
| #else |
| #define DLPACK_DLL |
| #endif |
| |
| #include <stdint.h> |
| #include <stddef.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| /*! |
| * \brief The device type in DLContext. |
| */ |
| typedef enum { |
| kCPU = 1, |
| kGPU = 2, |
| // kCPUPinned = kCPU | kGPU |
| kCPUPinned = 3, |
| kOpenCL = 4, |
| kMetal = 8, |
| kVPI = 9, |
| kROCM = 10, |
| } DLDeviceType; |
| |
| /*! |
| * \brief A Device context for Tensor and operator. |
| */ |
| typedef struct { |
| /*! \brief The device type used in the device. */ |
| DLDeviceType device_type; |
| /*! \brief The device index */ |
| int device_id; |
| } DLContext; |
| |
| /*! |
| * \brief The type code options DLDataType. |
| */ |
| typedef enum { |
| kInt = 0U, |
| kUInt = 1U, |
| kFloat = 2U, |
| } DLDataTypeCode; |
| |
| /*! |
| * \brief The data type the tensor can hold. |
| * |
| * Examples |
| * - float: type_code = 2, bits = 32, lanes=1 |
| * - float4(vectorized 4 float): type_code = 2, bits = 32, lanes=4 |
| * - int8: type_code = 0, bits = 8, lanes=1 |
| */ |
| typedef struct { |
| /*! |
| * \brief Type code of base types. |
| * We keep it uint8_t instead of DLDataTypeCode for minimal memory |
| * footprint, but the value should be one of DLDataTypeCode enum values. |
| * */ |
| uint8_t code; |
| /*! |
| * \brief Number of bits, common choices are 8, 16, 32. |
| */ |
| uint8_t bits; |
| /*! \brief Number of lanes in the type, used for vector types. */ |
| uint16_t lanes; |
| } DLDataType; |
| |
| /*! |
| * \brief Plain C Tensor object, does not manage memory. |
| */ |
| typedef struct { |
| /*! |
| * \brief The opaque data pointer points to the allocated data. |
| * This will be CUDA device pointer or cl_mem handle in OpenCL. |
| * This pointer is always aligns to 256 bytes as in CUDA. |
| */ |
| void* data; |
| /*! \brief The device context of the tensor */ |
| DLContext ctx; |
| /*! \brief Number of dimensions */ |
| int ndim; |
| /*! \brief The data type of the pointer*/ |
| DLDataType dtype; |
| /*! \brief The shape of the tensor */ |
| int64_t* shape; |
| /*! |
| * \brief strides of the tensor, |
| * can be NULL, indicating tensor is compact. |
| */ |
| int64_t* strides; |
| /*! \brief The offset in bytes to the beginning pointer to data */ |
| uint64_t byte_offset; |
| } DLTensor; |
| |
| /*! |
| * \brief C Tensor object, manage memory of DLTensor. |
| */ |
| typedef struct DLManagedTensor { |
| /*! \DLTensor which is being memory managed */ |
| DLTensor dlTensor; |
| /*! \brief context in which DLManagedTensor is used in a framework. It can |
| * also be NULL |
| */ |
| void * ctx; |
| /*! \brief Destructor signature void (*)(void*) - this should be called |
| * to destruct ctx which holds the DLManagedTensor. It can be NULL if there |
| * is no way for the caller to provide a reasonable destructor. |
| */ |
| void (*destructor)(DLManagedTensor * self); |
| } DLManagedTensor; |
| |
| #ifdef __cplusplus |
| } // DLPACK_EXTERN_C |
| #endif |
| #endif // DLPACK_DLPACK_H_ |