From 3f2658150c52c56c9074fa1b253f3e05192274e0 Mon Sep 17 00:00:00 2001 From: wanghuancoder Date: Thu, 24 Nov 2022 07:40:01 +0800 Subject: [PATCH] dense tensor in eager mode support data_ptr (#48235) * dense tensor in eager mode support data_ptr --- paddle/fluid/pybind/eager_method.cc | 17 ++++++++++ .../tests/unittests/test_tensor_data_ptr.py | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 python/paddle/fluid/tests/unittests/test_tensor_data_ptr.py diff --git a/paddle/fluid/pybind/eager_method.cc b/paddle/fluid/pybind/eager_method.cc index 3c52a705fc5..545889d3473 100644 --- a/paddle/fluid/pybind/eager_method.cc +++ b/paddle/fluid/pybind/eager_method.cc @@ -1845,6 +1845,19 @@ static PyObject* tensor__unset_fake_empty(TensorObject* self, EAGER_CATCH_AND_THROW_RETURN_NULL } +static PyObject* tensor_data_ptr(TensorObject* self, + PyObject* args, + PyObject* kwargs) { + EAGER_TRY + if (self->tensor.initialized() && self->tensor.is_dense_tensor()) { + ToPyObject((int64_t)std::dynamic_pointer_cast( // NOLINT + self->tensor.impl()) + ->data()); + } + RETURN_PY_NONE + EAGER_CATCH_AND_THROW_RETURN_NULL +} + #if defined(PADDLE_WITH_CUDA) static PyObject* tensor_method__uva(TensorObject* self, PyObject* args, @@ -2100,6 +2113,10 @@ PyMethodDef variable_methods[] = { (PyCFunction)(void (*)(void))tensor__unset_fake_empty, METH_VARARGS | METH_KEYWORDS, NULL}, + {"data_ptr", + (PyCFunction)(void (*)(void))tensor_data_ptr, + METH_VARARGS | METH_KEYWORDS, + NULL}, #if defined(PADDLE_WITH_CUDA) {"_tensor_uva", (PyCFunction)(void (*)(void))tensor_method__uva, diff --git a/python/paddle/fluid/tests/unittests/test_tensor_data_ptr.py b/python/paddle/fluid/tests/unittests/test_tensor_data_ptr.py new file mode 100644 index 00000000000..10e816370ec --- /dev/null +++ b/python/paddle/fluid/tests/unittests/test_tensor_data_ptr.py @@ -0,0 +1,31 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +import numpy as np + +import paddle + + +class TestTensorDataPtr(unittest.TestCase): + def test_tensor_data_ptr(self): + np_src = np.random.random((3, 8, 8)) + src = paddle.to_tensor(np_src, dtype="float64") + dst = paddle.Tensor() + src._share_buffer_to(dst) + self.assertEqual(src.data_ptr(), dst.data_ptr()) + + +if __name__ == '__main__': + unittest.main() -- GitLab