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;
123 inline bool Load(dmlc::Stream* stream);
128 inline void Save(dmlc::Stream* stream)
const;
205 TVM_DLL
static void CopyFromTo(
const DLTensor* from, DLTensor* to,
225 TVM_DLL
static bool IsAligned(
const DLTensor& tensor);
265 inline bool SaveDLTensor(dmlc::Stream* strm,
const DLTensor* tensor);
344 static constexpr
const char*
_type_key =
"runtime.NDArray";
362 size *=
static_cast<size_t>(arr.shape[i]);
364 size *= (arr.dtype.bits * arr.dtype.lanes + 7) / 8;
373 static inline bool IsContiguous(
const DLTensor& arr) {
374 if (arr.strides ==
nullptr)
return true;
375 int64_t expected_stride = 1;
376 for (int32_t i = arr.ndim; i != 0; --i) {
378 if (arr.shape[k] == 1) {
387 if (arr.strides[k] != expected_stride)
return false;
388 expected_stride *= arr.shape[k];
394 return ::tvm::runtime::IsContiguous(
get_mutable()->dl_tensor);
398 ICHECK(
data_ !=
nullptr);
403 ICHECK(
data_ !=
nullptr);
404 ICHECK(other.
data_ !=
nullptr);
409 ICHECK(
data_ !=
nullptr);
414 ICHECK(
data_ !=
nullptr);
415 ICHECK(other.
data_ !=
nullptr);
428 return GetObjectPtr<Object>(
454 strm->Write(reserved);
465 cpu_dev.device_type = kDLCPU;
466 cpu_dev.device_id = 0;
467 strm->Write(cpu_dev);
468 strm->Write(tensor->ndim);
469 strm->Write(tensor->dtype);
470 int ndim = tensor->ndim;
471 strm->WriteArray(tensor->shape, ndim);
472 int type_bytes = (tensor->dtype.bits + 7) / 8;
473 int64_t num_elems = 1;
474 for (
int i = 0; i < ndim; ++i) {
475 num_elems *= tensor->shape[i];
477 int64_t data_byte_size = type_bytes * num_elems;
478 strm->Write(data_byte_size);
480 if (DMLC_IO_NO_ENDIAN_SWAP && tensor->device.device_type == kDLCPU &&
481 tensor->strides ==
nullptr && tensor->byte_offset == 0) {
483 strm->Write(tensor->data, data_byte_size);
485 std::vector<uint8_t> bytes(data_byte_size);
490 if (!DMLC_IO_NO_ENDIAN_SWAP) {
491 dmlc::ByteSwap(dmlc::BeginPtr(bytes), type_bytes, num_elems);
493 strm->Write(dmlc::BeginPtr(bytes), data_byte_size);
501 uint64_t header, reserved;
502 ICHECK(strm->Read(&header)) <<
"Invalid DLTensor file format";
503 ICHECK(strm->Read(&reserved)) <<
"Invalid DLTensor file format";
508 ICHECK(strm->Read(&dev)) <<
"Invalid DLTensor file format";
509 ICHECK(strm->Read(&ndim)) <<
"Invalid DLTensor file format";
510 ICHECK(strm->Read(&dtype)) <<
"Invalid DLTensor file format";
511 ICHECK_EQ(dev.device_type, kDLCPU) <<
"Invalid DLTensor device: can only save as CPU tensor";
512 std::vector<int64_t>
shape(ndim);
514 ICHECK(strm->ReadArray(&
shape[0], ndim)) <<
"Invalid DLTensor file format";
517 int64_t num_elems = 1;
519 for (
int i = 0; i <
ret->ndim; ++i) {
520 num_elems *=
ret->shape[i];
522 int64_t data_byte_size;
523 ICHECK(strm->Read(&data_byte_size)) <<
"Invalid DLTensor file format";
524 ICHECK(data_byte_size == num_elems * elem_bytes) <<
"Invalid DLTensor file format";
525 auto read_ret = strm->Read(
ret->data, data_byte_size);
527 if (ndim > 0 &&
shape[0] != 0) {
528 ICHECK(read_ret) <<
"Invalid DLTensor file format";
530 if (!DMLC_IO_NO_ENDIAN_SWAP) {
531 dmlc::ByteSwap(
ret->data, elem_bytes, num_elems);
543 std::size_t operator()(
const tvm::Device& dev)
const {
544 return ((dev.device_id << 8) | dev.device_type);
551 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:129
Runtime primitive data type.
Definition: data_type.h:43
int bits() const
Definition: data_type.h:94
The container base structure contains all the fields except for the Object header.
Definition: ndarray.h:274
DLTensor dl_tensor
The corresponding dl_tensor field.
Definition: ndarray.h:282
void * manager_ctx
additional context, reserved for recycling
Definition: ndarray.h:290
ShapeTuple shape_
The shape container, can be used for shape data.
Definition: ndarray.h:297
Object container class that backs NDArray.
Definition: ndarray.h:304
static constexpr const uint32_t _type_index
Definition: ndarray.h:341
Container()
default constructor
Definition: ndarray.h:307
static constexpr const uint32_t _type_child_slots_can_overflow
Definition: ndarray.h:343
void SetDeleter(FDeleter deleter)
Set the deleter field.
Definition: ndarray.h:333
Container(void *data, ShapeTuple shape, DLDataType dtype, Device dev)
Definition: ndarray.h:317
static constexpr const char * _type_key
Definition: ndarray.h:344
static constexpr const uint32_t _type_child_slots
Definition: ndarray.h:342
friend class RPCWrappedFunc
Definition: ndarray.h:348
void DecRef()
developer function, decrease reference counter.
Definition: object.h:842
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:432
void CopyFrom(const DLTensor *other)
Copy data content from another array.
Definition: ndarray.h:397
bool IsContiguous() const
Definition: ndarray.h:393
NDArray CreateView(ShapeTuple shape, DLDataType dtype, uint64_t relative_byte_offset=0)
Create a NDArray that shares the data memory with the current one.
static NDArray FromExternalDLTensor(const DLTensor &dl_tensor)
Create a NDArray backed by an external DLTensor without memory copying.
NDArray CopyTo(const Device &dev, Optional< String > mem_scope=NullOpt) const
Copy the data to another device.
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:408
runtime::DataType DataType() const
int use_count() const
Definition: ndarray.h:419
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:427
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:421
Container * get_mutable() const
Get mutable internal container pointer.
Definition: ndarray.h:423
bool Load(dmlc::Stream *stream)
Load NDArray from stream.
Definition: ndarray.h:500
static void FFIDecRef(TVMArrayHandle handle)
DecRef resource managed by an FFI array handle.
Definition: ndarray.h:440
static bool AbilityOfZeroCopyForDLTensor(DLTensor *tensor, const Device &dev)
Check conditions for construction NDArray over DLTensor without copying. There are three conditions t...
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:498
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:362
Base class of all object reference.
Definition: object.h:519
const Object * get() const
Definition: object.h:554
ObjectPtr< Object > data_
Internal pointer that backs the reference.
Definition: object.h:605
base class of all object containers.
Definition: object.h:171
uint32_t type_index_
Type index(tag) that indicates the type of the object.
Definition: object.h:265
void DecRef()
developer function, decrease reference counter.
Definition: object.h:842
void(* FDeleter)(Object *self)
Object deleter.
Definition: object.h:177
void IncRef()
developer function, increases reference counter.
Definition: object.h:840
static uint32_t RuntimeTypeIndex()
Definition: object.h:229
FDeleter deleter_
deleter of this object to enable customized allocation. If the deleter is nullptr,...
Definition: object.h:273
Optional container that to represent to a Nullable variant of T.
Definition: optional.h:51
Reference to shape tuple objects.
Definition: shape_tuple.h:85
const index_type * data() const
Return the data pointer.
Definition: shape_tuple.h:125
size_t size() const
Return the size of the shape tuple.
Definition: shape_tuple.h:132
ShapeTupleObj::index_type index_type
The type of shape index element.
Definition: shape_tuple.h:88
Definition: packed_func.h:1680
Internal base class to handle conversion to POD values.
Definition: packed_func.h:552
Return Value container, Unlike TVMArgValue, which only holds reference and do not delete the underlyi...
Definition: packed_func.h:807
size_t GetDataSize(const DLTensor &arr)
return the size of data the DLTensor hold, in term of number of bytes
Definition: ndarray.h:359
bool SaveDLTensor(dmlc::Stream *strm, const DLTensor *tensor)
Save a DLTensor to stream.
Definition: ndarray.h:451
constexpr uint64_t kTVMNDArrayMagic
Magic number for NDArray file.
Definition: ndarray.h:449
Object * TVMArrayHandleToObjectHandle(TVMArrayHandle handle)
Definition: ndarray.h:444
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:1853
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