/*! * 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 #include #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_