From fabc058b40e1591efc13913977827148d5b75641 Mon Sep 17 00:00:00 2001 From: Chen Weihang Date: Tue, 21 Dec 2021 21:03:01 -0600 Subject: [PATCH] add copy constructor for densetensor (#38319) --- paddle/pten/core/dense_tensor.cc | 3 +++ paddle/pten/core/dense_tensor.h | 5 ++--- paddle/pten/core/tensor_meta.cc | 6 ------ paddle/pten/core/tensor_meta.h | 7 +++++++ paddle/pten/tests/core/test_dense_tensor.cc | 15 +++++++++++++++ 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/paddle/pten/core/dense_tensor.cc b/paddle/pten/core/dense_tensor.cc index 3237576cb6..4298906df0 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 92c8e3d4bd..fbb39e6f17 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 3e06508be6..d8a3b5c9b2 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 cc02c57a48..18daabca03 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 2879a429d9..4a17046b2f 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 -- GitLab