This reference describes unreleased code on main; no release documents it yet.

DLTensor

structExperimental#include <rlmesh.h>[source]

\brief Plain C Tensor object, does not manage memory.

struct

data

field[source]
void* data

\brief The data pointer points to the allocated data. This will be CUDA device pointer or cl_mem handle in OpenCL. It may be opaque on some device types. This pointer is always aligned to 256 bytes as in CUDA. The byte_offset field should be used to point to the beginning of the data.

Note that as of Nov 2021, multiply libraries (CuPy, PyTorch, TensorFlow, TVM, perhaps others) do not adhere to this 256 byte aligment requirement on CPU/CUDA/ROCm, and always use byte_offset=0. This must be fixed (after which this note will be updated); at the moment it is recommended to not rely on the data pointer being correctly aligned.

For given DLTensor, the size of memory required to store the contents of data is calculated as follows:

\code{.c} static inline size_t GetDataSize(const DLTensor* t) { size_t size = 1; for (tvm_index_t i = 0; i < t->ndim; ++i) { size *= t->shape[i]; } size *= (t->dtype.bits * t->dtype.lanes + 7) / 8; return size; } \endcode

Note that if the tensor is of size zero, then the data pointer should be set to NULL.

device

field[source]
DLDevice device

\brief The device of the tensor

ndim

field[source]
int32_t ndim

\brief Number of dimensions

dtype

field[source]
DLDataType dtype

\brief The data type of the pointer

shape

field[source]
int64_t* shape

\brief The shape of the tensor

strides

field[source]
int64_t* strides

\brief strides of the tensor (in number of elements, not bytes) can be NULL, indicating tensor is compact and row-majored.

byte_offset

field[source]
uint64_t byte_offset

\brief The offset in bytes to the beginning pointer to data