diff --git a/paddle/pten/core/dense_tensor.cc b/paddle/pten/core/dense_tensor.cc index 3237576cb64370b32f2cda3eff186874b0b23f32..4298906df0b066cd27b59eca0c6c63ce7319ab8c 100644 --- a/paddle/pten/core/dense_tensor.cc +++ b/paddle/pten/core/dense_tensor.cc @@ -38,6 +38,9 @@ DenseTensor::DenseTensor(intrusive_ptr storage, DenseTensor::DenseTensor(intrusive_ptr storage, DenseTensorMeta&& meta) : meta_(std::move(meta)), storage_(std::move(storage)) {} +DenseTensor::DenseTensor(const DenseTensor& other) + : meta_(other.meta()), storage_(copy_intrusive(other.storage_)) {} + int64_t DenseTensor::numel() const { if (meta_.is_scalar) { return 1; diff --git a/paddle/pten/core/dense_tensor.h b/paddle/pten/core/dense_tensor.h index 92c8e3d4bdbdf57e2464ed1fd098972b668ca274..fbb39e6f17fed79189e8f5cf10b5e32c75b8918d 100644 --- a/paddle/pten/core/dense_tensor.h +++ b/paddle/pten/core/dense_tensor.h @@ -62,9 +62,8 @@ class DenseTensor : public TensorBase, /// move constructor to support move semantics. DenseTensor(DenseTensor&& other) = default; - /// \brief We do not recommend deep copy of dense tensor because of its - /// efficiency and complexity across devices. The operation is disabled here. - DenseTensor(const DenseTensor& other) = delete; + /// \brief DenseTensor shallow copy constructor. + DenseTensor(const DenseTensor& other); /// \brief Destroy the tensor object and release exclusive resources. virtual ~DenseTensor() = default; diff --git a/paddle/pten/core/tensor_meta.cc b/paddle/pten/core/tensor_meta.cc index 3e06508be69d6574fdd93dc5d28afe3bd9c1827e..d8a3b5c9b2c61c4dd2d3c07dc12000c9764c003f 100644 --- a/paddle/pten/core/tensor_meta.cc +++ b/paddle/pten/core/tensor_meta.cc @@ -38,10 +38,4 @@ bool DenseTensorMeta::valid() const noexcept { return valid; } -bool operator==(const DenseTensorMeta& lhs, const DenseTensorMeta& rhs) { - bool ret = true; - return ret && (lhs.is_scalar == rhs.is_scalar) && (lhs.dims == rhs.dims) && - (lhs.dtype == rhs.dtype) && (lhs.layout == rhs.layout) && - (lhs.lod == rhs.lod) && (lhs.offset == rhs.offset); -} } // namespace pten diff --git a/paddle/pten/core/tensor_meta.h b/paddle/pten/core/tensor_meta.h index cc02c57a48ba13c89f80a6aeafa149bdffaf6edf..18daabca038ce13b0704fbb45b9541f95e97f01c 100644 --- a/paddle/pten/core/tensor_meta.h +++ b/paddle/pten/core/tensor_meta.h @@ -60,4 +60,11 @@ struct DenseTensorMeta { size_t offset{0}; }; +inline bool operator==(const DenseTensorMeta& lhs, const DenseTensorMeta& rhs) { + bool ret = true; + return ret && (lhs.is_scalar == rhs.is_scalar) && (lhs.dims == rhs.dims) && + (lhs.dtype == rhs.dtype) && (lhs.layout == rhs.layout) && + (lhs.lod == rhs.lod) && (lhs.offset == rhs.offset); +} + } // namespace pten diff --git a/paddle/pten/tests/core/test_dense_tensor.cc b/paddle/pten/tests/core/test_dense_tensor.cc index 2879a429d9b8260d85a1eef24cdb0f76371a94f6..4a17046b2f30c1ff50df30eddf4fac32925b0e96 100644 --- a/paddle/pten/tests/core/test_dense_tensor.cc +++ b/paddle/pten/tests/core/test_dense_tensor.cc @@ -122,5 +122,20 @@ TEST(dense_tensor, resize) { CHECK_EQ(storage->size(), 6u); } +TEST(dense_tensor, shallow_copy) { + const DDim dims({1, 2}); + const DataType dtype{DataType::INT8}; + const DataLayout layout{DataLayout::NHWC}; + const std::vector> lod{}; + DenseTensorMeta meta(dtype, dims, layout, lod); + + auto alloc = std::make_shared(); + DenseTensor tensor_0(alloc, meta); + + DenseTensor tensor_1(tensor_0); + CHECK(tensor_0.meta() == tensor_1.meta()); + CHECK(tensor_0.release() == tensor_1.release()); +} + } // namespace tests } // namespace pten