24 #ifndef TVM_RUNTIME_NDARRAY_H_
25 #define TVM_RUNTIME_NDARRAY_H_
84 inline void CopyFrom(
const DLTensor* other);
100 inline void CopyTo(DLTensor* other)
const;
121 inline bool Load(dmlc::Stream* stream);
126 inline void Save(dmlc::Stream* stream)
const;
187 TVM_DLL
static void CopyFromTo(
const DLTensor* from, DLTensor* to,
207 TVM_DLL
static bool IsAligned(
const DLTensor& tensor);
247 inline bool SaveDLTensor(dmlc::Stream* strm,
const DLTensor* tensor);
326 static constexpr
const char*
_type_key =
"runtime.NDArray";
344 size *=
static_cast<size_t>(arr.shape[i]);
346 size *= (arr.dtype.bits * arr.dtype.lanes + 7) / 8;
355 static inline bool IsContiguous(
const DLTensor& arr) {
356 if (arr.strides ==
nullptr)
return true;
357 int64_t expected_stride = 1;
358 for (int32_t i = arr.ndim; i != 0; --i) {
360 if (arr.shape[k] == 1) {
369 if (arr.strides[k] != expected_stride)
return false;
370 expected_stride *= arr.shape[k];
376 return ::tvm::runtime::IsContiguous(
get_mutable()->dl_tensor);
380 ICHECK(
data_ !=
nullptr);
385 ICHECK(
data_ !=
nullptr);
386 ICHECK(other.
data_ !=
nullptr);
391 ICHECK(
data_ !=
nullptr);
396 ICHECK(
data_ !=
nullptr);
397 ICHECK(other.
data_ !=
nullptr);
402 ICHECK(
data_ !=
nullptr);
418 return GetObjectPtr<Object>(
444 strm->Write(reserved);
455 cpu_dev.device_type = kDLCPU;
456 cpu_dev.device_id = 0;
457 strm->Write(cpu_dev);
458 strm->Write(tensor->ndim);
459 strm->Write(tensor->dtype);
460 int ndim = tensor->ndim;
461 strm->WriteArray(tensor->shape, ndim);
462 int type_bytes = (tensor->dtype.bits + 7) / 8;
463 int64_t num_elems = 1;
464 for (
int i = 0; i < ndim; ++i) {
465 num_elems *= tensor->shape[i];
467 int64_t data_byte_size = type_bytes * num_elems;
468 strm->Write(data_byte_size);
470 if (DMLC_IO_NO_ENDIAN_SWAP && tensor->device.device_type == kDLCPU &&
471 tensor->strides ==
nullptr && tensor->byte_offset == 0) {
473 strm->Write(tensor->data, data_byte_size);
475 std::vector<uint8_t> bytes(data_byte_size);
480 if (!DMLC_IO_NO_ENDIAN_SWAP) {
481 dmlc::ByteSwap(dmlc::BeginPtr(bytes), type_bytes, num_elems);
483 strm->Write(dmlc::BeginPtr(bytes), data_byte_size);
491 uint64_t header, reserved;
492 ICHECK(strm->Read(&header)) <<
"Invalid DLTensor file format";
493 ICHECK(strm->Read(&reserved)) <<
"Invalid DLTensor file format";
498 ICHECK(strm->Read(&dev)) <<
"Invalid DLTensor file format";
499 ICHECK(strm->Read(&ndim)) <<
"Invalid DLTensor file format";
500 ICHECK(strm->Read(&dtype)) <<
"Invalid DLTensor file format";
501 ICHECK_EQ(dev.device_type, kDLCPU) <<
"Invalid DLTensor device: can only save as CPU tensor";
502 std::vector<int64_t>
shape(ndim);
504 ICHECK(strm->ReadArray(&
shape[0], ndim)) <<
"Invalid DLTensor file format";
507 int64_t num_elems = 1;
509 for (
int i = 0; i <
ret->ndim; ++i) {
510 num_elems *=
ret->shape[i];
512 int64_t data_byte_size;
513 ICHECK(strm->Read(&data_byte_size)) <<
"Invalid DLTensor file format";
514 ICHECK(data_byte_size == num_elems * elem_bytes) <<
"Invalid DLTensor file format";
515 auto read_ret = strm->Read(
ret->data, data_byte_size);
517 if (ndim > 0 &&
shape[0] != 0) {
518 ICHECK(read_ret) <<
"Invalid DLTensor file format";
520 if (!DMLC_IO_NO_ENDIAN_SWAP) {
521 dmlc::ByteSwap(
ret->data, elem_bytes, num_elems);
533 std::size_t operator()(
const tvm::Device& dev)
const {
534 return ((dev.device_id << 8) | dev.device_type);
541 return (lhs.device_type == rhs.device_type && lhs.device_id == rhs.device_id);
DLTensor * TVMArrayHandle
the array handle
Definition: c_runtime_api.h:202
const char * TVMGetLastError(void)
return str message of the last error all function in this file will return 0 when success and nonzero...
void * TVMStreamHandle
The stream that is specific to device can be NULL, which indicates the default one.
Definition: c_runtime_api.h:236
int64_t tvm_index_t
type of array index.
Definition: c_runtime_api.h:88
int TVMArrayCopyToBytes(TVMArrayHandle handle, void *data, size_t nbytes)
Copy array data to CPU byte array.
DataType dtype() const
Definition: expr.h:128
Runtime primitive data type.
Definition: data_type.h:42
int bits() const
Definition: data_type.h:89
The container base structure contains all the fields except for the Object header.
Definition: ndarray.h:256
DLTensor dl_tensor
The corresponding dl_tensor field.
Definition: ndarray.h:264
void * manager_ctx
additional context, reserved for recycling
Definition: ndarray.h:272
ShapeTuple shape_
The shape container, can be used used for shape data.
Definition: ndarray.h:279
Object container class that backs NDArray.
Definition: ndarray.h:286
static constexpr const uint32_t _type_index
Definition: ndarray.h:323
Container()
default constructor
Definition: ndarray.h:289
static constexpr const uint32_t _type_child_slots_can_overflow
Definition: ndarray.h:325
void SetDeleter(FDeleter deleter)
Set the deleter field.
Definition: ndarray.h:315
Container(void *data, ShapeTuple shape, DLDataType dtype, Device dev)
Definition: ndarray.h:299
static constexpr const char * _type_key
Definition: ndarray.h:326
static constexpr const uint32_t _type_child_slots
Definition: ndarray.h:324
friend class RPCWrappedFunc
Definition: ndarray.h:330
void DecRef()
developer function, decrease reference counter.
Definition: object.h:828
TVM_DECLARE_BASE_OBJECT_INFO(NDArray::Container, Object)
Managed NDArray. The array is backed by reference counted blocks.
Definition: ndarray.h:51
static TVMArrayHandle FFIGetHandle(const ObjectRef &nd)
Get FFI Array handle from ndarray.
Definition: ndarray.h:422
void CopyFrom(const DLTensor *other)
Copy data content from another array.
Definition: ndarray.h:379
bool IsContiguous() const
Definition: ndarray.h:375
static NDArray FromExternalDLTensor(const DLTensor &dl_tensor)
Create a NDArray backed by an external DLTensor without memory copying.
NDArray()
default constructor
Definition: ndarray.h:60
static NDArray Empty(ShapeTuple shape, DLDataType dtype, Device dev, Optional< String > mem_scope=NullOpt)
Create an empty NDArray.
static NDArray NewFromDLTensor(DLTensor *dl_tensor, const Device &dev)
Create new NDArray, data is copied from DLTensor.
void CopyTo(DLTensor *other) const
Copy data content into another array.
Definition: ndarray.h:390
runtime::DataType DataType() const
int use_count() const
Definition: ndarray.h:409
DLManagedTensor * ToDLPack() const
Create a reference view of NDArray that represents as DLManagedTensor.
static ObjectPtr< Object > FFIDataFromHandle(TVMArrayHandle handle)
Construct NDArray's Data field from array handle in FFI.
Definition: ndarray.h:417
void CopyToBytes(void *data, size_t nbytes) const
Copy data content into another array.
static NDArray FromDLPack(DLManagedTensor *tensor)
Create a NDArray backed by a dlpack tensor.
const DLTensor * operator->() const
Definition: ndarray.h:411
Container * get_mutable() const
Get mutable internal container pointer.
Definition: ndarray.h:413
bool Load(dmlc::Stream *stream)
Load NDArray from stream.
Definition: ndarray.h:490
static void FFIDecRef(TVMArrayHandle handle)
DecRef resource managed by an FFI array handle.
Definition: ndarray.h:430
static bool AbilityOfZeroCopyForDLTensor(DLTensor *tensor, const Device &dev)
Check conditions for construction NDArray over DLTensor without copying. There are three conditions t...
NDArray CreateView(ShapeTuple shape, DLDataType dtype)
Create a NDArray that shares the data memory with the current one.
static void CopyFromTo(const DLTensor *from, DLTensor *to, TVMStreamHandle stream=nullptr)
Function to copy data from one array to another.
void Save(dmlc::Stream *stream) const
Save NDArray to stream.
Definition: ndarray.h:488
void reset()
reset the content of NDArray to be nullptr
void CopyFromBytes(const void *data, size_t nbytes)
Copy data content from a byte buffer.
NDArray(ObjectPtr< Object > data)
constructor.
Definition: ndarray.h:65
A custom smart pointer for Object.
Definition: object.h:358
Base class of all object reference.
Definition: object.h:515
const Object * get() const
Definition: object.h:550
ObjectPtr< Object > data_
Internal pointer that backs the reference.
Definition: object.h:601
base class of all object containers.
Definition: object.h:167
uint32_t type_index_
Type index(tag) that indicates the type of the object.
Definition: object.h:261
void DecRef()
developer function, decrease reference counter.
Definition: object.h:828
void(* FDeleter)(Object *self)
Object deleter.
Definition: object.h:173
void IncRef()
developer function, increases reference counter.
Definition: object.h:826
static uint32_t RuntimeTypeIndex()
Definition: object.h:225
FDeleter deleter_
deleter of this object to enable customized allocation. If the deleter is nullptr,...
Definition: object.h:269
Optional container that to represent to a Nullable variant of T.
Definition: optional.h:51
Reference to shape tuple objects.
Definition: shape_tuple.h:81
const index_type * data() const
Return the data pointer.
Definition: shape_tuple.h:121
size_t size() const
Return the size of the shape tuple.
Definition: shape_tuple.h:128
ShapeTupleObj::index_type index_type
The type of shape index element.
Definition: shape_tuple.h:84
Definition: packed_func.h:1517
Internal base class to handle conversion to POD values.
Definition: packed_func.h:541
Return Value container, Unlike TVMArgValue, which only holds reference and do not delete the underlyi...
Definition: packed_func.h:799
size_t GetDataSize(const DLTensor &arr)
return the size of data the DLTensor hold, in term of number of bytes
Definition: ndarray.h:341
bool SaveDLTensor(dmlc::Stream *strm, const DLTensor *tensor)
Save a DLTensor to stream.
Definition: ndarray.h:441
constexpr uint64_t kTVMNDArrayMagic
Magic number for NDArray file.
Definition: ndarray.h:439
Object * TVMArrayHandleToObjectHandle(TVMArrayHandle handle)
Definition: ndarray.h:434
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:1763
runtime implementation for LibTorch/TorchScript.
Definition: analyzer.h:36
PrimExpr ret(PrimExpr value, Span span=Span())
Return the value.
DLDevice Device
Definition: ndarray.h:43
constexpr runtime::NullOptType NullOpt
Definition: optional.h:169
A managed object in the TVM runtime.
Runtime Optional container types.
Serializer extension to support TVM data types Include this file to enable serialization of DLDataTyp...
Runtime ShapeTuple container types.
Runtime String container types.
@ kRuntimeNDArray
runtime::NDArray.
Definition: object.h:64