diff --git a/paddle/pten/core/compat_utils.h b/paddle/pten/core/compat_utils.h index 289c311bf3eba27f942c24657f9197f7c4b071e3..dc65e04b3ae7349b599eb123a44b128adb5331b2 100644 --- a/paddle/pten/core/compat_utils.h +++ b/paddle/pten/core/compat_utils.h @@ -45,6 +45,39 @@ class CompatibleDenseTensorUtils { static_cast(tensor->storage_.get()) ->Reset(); } + + static DenseTensor Slice(DenseTensor* tensor, + int64_t begin_idx, + int64_t end_idx) { + tensor->check_memory_size(); + PADDLE_ENFORCE_GE(begin_idx, + 0, + paddle::platform::errors::OutOfRange( + "The start row index must be greater than 0." + "But received the start index is d%.", + begin_idx)); + PADDLE_ENFORCE_LE(end_idx, + tensor->dims()[0], + paddle::platform::errors::OutOfRange( + "The end row index is out of bound.")); + PADDLE_ENFORCE_LT( + begin_idx, + end_idx, + paddle::platform::errors::InvalidArgument( + "The start row index must be less than the end row index." + "But received the start index = %d, the end index = %d.", + begin_idx, + end_idx)); + DenseTensor ret = + DenseTensor(copy_intrusive(tensor->storage_), tensor->meta_); + if (tensor->dims()[0] != 1) { + ret.meta_.dims[0] = end_idx - begin_idx; + ret.meta_.offset = tensor->meta_.offset + + begin_idx * (tensor->numel() / tensor->dims()[0]) * + paddle::experimental::SizeOf(tensor->data_type()); + } + return ret; + } }; } // namespace pten diff --git a/paddle/pten/core/dense_tensor.h b/paddle/pten/core/dense_tensor.h index ca313ef9cc31f840e78977d70492118ad0f97fc9..b0a4195bc6cec33e77fd1515b109990e3ec1d4bc 100644 --- a/paddle/pten/core/dense_tensor.h +++ b/paddle/pten/core/dense_tensor.h @@ -174,12 +174,6 @@ class DenseTensor : public TensorBase, /// \return The const data pointer value of raw type. const void* data() const; - /// \brief Get the shallow clone of current tensor. - /// \return The shallow clone of current tensor. - DenseTensor shallow_clone() const { - return DenseTensor(copy_intrusive(storage_), meta_); - } - private: friend class CompatibleDenseTensorUtils; diff --git a/paddle/pten/core/tensor_meta.h b/paddle/pten/core/tensor_meta.h index a7cba706dd7d0341335899c954c4386eca5e4ac1..eae270171d88e6b4aea35871ee4ef1408850d58c 100644 --- a/paddle/pten/core/tensor_meta.h +++ b/paddle/pten/core/tensor_meta.h @@ -57,6 +57,7 @@ struct DenseTensorMeta { const DataType type{DataType::UNDEFINED}; const DataLayout layout{DataLayout::NCHW}; LoD lod; + size_t offset{0}; }; inline DenseTensorMeta::DenseTensorMeta(DataType type, const DDim& dims) @@ -86,7 +87,7 @@ 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.type == rhs.type) && (lhs.layout == rhs.layout) && - (lhs.lod == rhs.lod); + (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 59f67320752551abb1e5b909bee7532aaea8ae41..dac2575713bfb40db4d5c86bd9920f99014b7dbb 100644 --- a/paddle/pten/tests/core/test_dense_tensor.cc +++ b/paddle/pten/tests/core/test_dense_tensor.cc @@ -125,20 +125,5 @@ TEST(dense_tensor, resize) { CHECK_EQ(storage->size(), 6u); } -TEST(dense_tensor, shallow_clone) { - 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); - - auto tensor_1 = tensor_0.shallow_clone(); - CHECK(tensor_0.meta() == tensor_1.meta()); - CHECK(tensor_0.release() == tensor_1.release()); -} - } // namespace tests } // namespace pten