diff --git a/src/core/include/openvino/op/constant.hpp b/src/core/include/openvino/op/constant.hpp index a603c6d7d67..b9976269abf 100644 --- a/src/core/include/openvino/op/constant.hpp +++ b/src/core/include/openvino/op/constant.hpp @@ -30,6 +30,10 @@ public: /// \param tensor The tensor with data Constant(const std::shared_ptr& tensor); + /// \brief Initialize a constant from ov::Tensor + /// \param tensor The ov::Tensor with data + Constant(const ov::Tensor& tensor); + /// \brief Constructs a tensor constant. /// /// \param type The element type of the tensor constant. diff --git a/src/core/src/node.cpp b/src/core/src/node.cpp index c78cca9434b..ca789560aca 100644 --- a/src/core/src/node.cpp +++ b/src/core/src/node.cpp @@ -794,8 +794,8 @@ bool ov::Node::constant_fold(OutputVector& output_values, const OutputVector& in for (const auto& input : input_values) { nodes.push_back(input.get_node_shared_ptr()); auto constant = ov::as_type_ptr(input.get_node_shared_ptr()); - auto tensor = ov::Tensor(input.get_element_type(), input.get_shape()); - std::copy_n(constant->get_data_ptr(), constant->get_byte_size(), static_cast(tensor.data())); + void* data = (void*)constant->get_data_ptr(); + auto tensor = ov::Tensor(input.get_element_type(), input.get_shape(), data); input_tensors.push_back(tensor); } @@ -807,9 +807,7 @@ bool ov::Node::constant_fold(OutputVector& output_values, const OutputVector& in OPENVINO_SUPPRESS_DEPRECATED_START if (evaluate(output_tensors, input_tensors)) { for (size_t i = 0; i < output_tensors.size(); ++i) { - output_values[i] = make_shared(output_tensors[i].get_element_type(), - output_tensors[i].get_shape(), - output_tensors[i].data()); + output_values[i] = make_shared(output_tensors[i]); copy_runtime_info(nodes, output_values[i].get_node_shared_ptr()); } return true; diff --git a/src/core/src/op/constant.cpp b/src/core/src/op/constant.cpp index 42b99b11a56..4d695cd7d58 100644 --- a/src/core/src/op/constant.cpp +++ b/src/core/src/op/constant.cpp @@ -50,6 +50,17 @@ ov::op::v0::Constant::Constant(const shared_ptr& tensor constructor_validate_and_infer_types(); } +ov::op::v0::Constant::Constant(const ov::Tensor& tensor) { + m_element_type = tensor.get_element_type(); + m_shape = tensor.get_shape(); + // Share data from ov::Tensor + m_data = make_shared>(static_cast(tensor.data()), + tensor.get_byte_size(), + tensor); + + constructor_validate_and_infer_types(); +} + ov::op::v0::Constant::Constant(const element::Type& type, const ov::Shape& shape, const std::vector& values)