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);
229 template <
typename Derived>
267 inline bool SaveDLTensor(dmlc::Stream* strm,
const DLTensor* tensor);
346 static constexpr
const char*
_type_key =
"runtime.NDArray";
364 size *=
static_cast<size_t>(arr.shape[i]);
366 size *= (arr.dtype.bits * arr.dtype.lanes + 7) / 8;
375 static inline bool IsContiguous(
const DLTensor& arr) {
376 if (arr.strides ==
nullptr)
return true;
377 int64_t expected_stride = 1;
378 for (int32_t i = arr.ndim; i != 0; --i) {
380 if (arr.shape[k] == 1) {
389 if (arr.strides[k] != expected_stride)
return false;
390 expected_stride *= arr.shape[k];
396 return ::tvm::runtime::IsContiguous(
get_mutable()->dl_tensor);
400 ICHECK(
data_ !=
nullptr);
405 ICHECK(
data_ !=
nullptr);
406 ICHECK(other.
data_ !=
nullptr);
411 ICHECK(
data_ !=
nullptr);
416 ICHECK(
data_ !=
nullptr);
417 ICHECK(other.
data_ !=
nullptr);
430 return GetObjectPtr<Object>(
456 strm->Write(reserved);
467 cpu_dev.device_type = kDLCPU;
468 cpu_dev.device_id = 0;
469 strm->Write(cpu_dev);
470 strm->Write(tensor->ndim);
471 strm->Write(tensor->dtype);
472 int ndim = tensor->ndim;
473 strm->WriteArray(tensor->shape, ndim);
474 int type_bytes = (tensor->dtype.bits + 7) / 8;
475 int64_t num_elems = 1;
476 for (
int i = 0; i < ndim; ++i) {
477 num_elems *= tensor->shape[i];
479 int64_t data_byte_size = type_bytes * num_elems;
480 strm->Write(data_byte_size);
482 if (DMLC_IO_NO_ENDIAN_SWAP && tensor->device.device_type == kDLCPU &&
483 tensor->strides ==
nullptr && tensor->byte_offset == 0) {
485 strm->Write(tensor->data, data_byte_size);
487 std::vector<uint8_t> bytes(data_byte_size);
492 if (!DMLC_IO_NO_ENDIAN_SWAP) {
493 dmlc::ByteSwap(dmlc::BeginPtr(bytes), type_bytes, num_elems);
495 strm->Write(dmlc::BeginPtr(bytes), data_byte_size);
503 uint64_t header, reserved;
504 ICHECK(strm->Read(&header)) <<
"Invalid DLTensor file format";
505 ICHECK(strm->Read(&reserved)) <<
"Invalid DLTensor file format";
510 ICHECK(strm->Read(&dev)) <<
"Invalid DLTensor file format";
511 ICHECK(strm->Read(&ndim)) <<
"Invalid DLTensor file format";
512 ICHECK(strm->Read(&dtype)) <<
"Invalid DLTensor file format";
513 ICHECK_EQ(dev.device_type, kDLCPU) <<
"Invalid DLTensor device: can only save as CPU tensor";
514 std::vector<int64_t>
shape(ndim);
516 ICHECK(strm->ReadArray(&
shape[0], ndim)) <<
"Invalid DLTensor file format";
519 int64_t num_elems = 1;
521 for (
int i = 0; i <
ret->ndim; ++i) {
522 num_elems *=
ret->shape[i];
524 int64_t data_byte_size;
525 ICHECK(strm->Read(&data_byte_size)) <<
"Invalid DLTensor file format";
526 ICHECK(data_byte_size == num_elems * elem_bytes) <<
"Invalid DLTensor file format";
527 auto read_ret = strm->Read(
ret->data, data_byte_size);
529 if (ndim > 0 &&
shape[0] != 0) {
530 ICHECK(read_ret) <<
"Invalid DLTensor file format";
532 if (!DMLC_IO_NO_ENDIAN_SWAP) {
533 dmlc::ByteSwap(
ret->data, elem_bytes, num_elems);
546 if (device.device_type == DLDeviceType::kDLCUDA) {
547 return Device{DLDeviceType::kDLCUDAHost, 0};
548 }
else if (device.device_type == DLDeviceType::kDLROCM) {
549 return Device{DLDeviceType::kDLROCMHost, 0};
552 return Device{DLDeviceType::kDLCPU, 0};
562 std::size_t operator()(
const tvm::Device& dev)
const {
563 return ((dev.device_id << 8) | dev.device_type);
570 return (lhs.device_type == rhs.device_type && lhs.device_id == rhs.device_id);
DLTensor * TVMArrayHandle
the array handle
Definition: c_runtime_api.h:204
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:238
int64_t tvm_index_t
type of array index.
Definition: c_runtime_api.h:89
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:276
DLTensor dl_tensor
The corresponding dl_tensor field.
Definition: ndarray.h:284
void * manager_ctx
additional context, reserved for recycling
Definition: ndarray.h:292
ShapeTuple shape_
The shape container, can be used for shape data.
Definition: ndarray.h:299
Object container class that backs NDArray.
Definition: ndarray.h:306
static constexpr const uint32_t _type_index
Definition: ndarray.h:343
Container()
default constructor
Definition: ndarray.h:309
static constexpr const uint32_t _type_child_slots_can_overflow
Definition: ndarray.h:345
void SetDeleter(FDeleter deleter)
Set the deleter field.
Definition: ndarray.h:335
Container(void *data, ShapeTuple shape, DLDataType dtype, Device dev)
Definition: ndarray.h:319
static constexpr const char * _type_key
Definition: ndarray.h:346
static constexpr const uint32_t _type_child_slots
Definition: ndarray.h:344
friend class RPCWrappedFunc
Definition: ndarray.h:350
void DecRef()
developer function, decrease reference counter.
Definition: object.h:846
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:434
void CopyFrom(const DLTensor *other)
Copy data content from another array.
Definition: ndarray.h:399
bool IsContiguous() const
Definition: ndarray.h:395
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:410
runtime::DataType DataType() const
int use_count() const
Definition: ndarray.h:421
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:429
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:423
Container * get_mutable() const
Get mutable internal container pointer.
Definition: ndarray.h:425
bool Load(dmlc::Stream *stream)
Load NDArray from stream.
Definition: ndarray.h:502
static void FFIDecRef(TVMArrayHandle handle)
DecRef resource managed by an FFI array handle.
Definition: ndarray.h:442
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:500
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:846
void(* FDeleter)(Object *self)
Object deleter.
Definition: object.h:177
void IncRef()
developer function, increases reference counter.
Definition: object.h:844
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:1824
A utility class that adds methods useful for each POD type.
Definition: packed_func.h:738
Internal base class to handle conversion to POD values.
Definition: packed_func.h:615
Return Value container, Unlike TVMArgValue, which only holds reference and do not delete the underlyi...
Definition: packed_func.h:946
size_t GetDataSize(const DLTensor &arr)
return the size of data the DLTensor hold, in term of number of bytes
Definition: ndarray.h:361
Device GetPreferredHostDevice(Device device)
Get the preferred host device from the input device.
Definition: ndarray.h:545
bool SaveDLTensor(dmlc::Stream *strm, const DLTensor *tensor)
Save a DLTensor to stream.
Definition: ndarray.h:453
constexpr uint64_t kTVMNDArrayMagic
Magic number for NDArray file.
Definition: ndarray.h:451
Object * TVMArrayHandleToObjectHandle(TVMArrayHandle handle)
Definition: ndarray.h:446
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:1913
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