Skip to content

Commit c1c0f72

Browse files
pereanubpraasz
andauthored
Get ROI tensor data offset (#33124)
### Details: - *Tensor helper to get the data offset from ROI tensors* ### Tickets: - *CVS-176616* --------- Signed-off-by: Bogdan Pereanu <bogdan.pereanu@intel.com> Co-authored-by: Pawel Raasz <pawel.raasz@intel.com>
1 parent 71d7d40 commit c1c0f72

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

src/core/tests/ov_tensor_test.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "openvino/op/parameter.hpp"
1818
#include "openvino/reference/utils/coordinate_transform.hpp"
1919
#include "openvino/runtime/allocator.hpp"
20+
#include "openvino/runtime/make_tensor.hpp"
2021
#include "openvino/runtime/remote_tensor.hpp"
2122
#include "openvino/runtime/tensor.hpp"
2223

@@ -953,6 +954,23 @@ TEST_F(OVTensorTest, createAllocationOverflow) {
953954
HasSubstr("Cannot allocate memory"));
954955
}
955956

957+
TEST_F(OVTensorTest, getTensorDataOffsetFromRoiTensor) {
958+
const ov::Tensor tensor(ov::element::f32, ov::Shape{3, 5, 32, 128});
959+
ov::Tensor roi_tensor;
960+
OV_ASSERT_NO_THROW(roi_tensor = ov::Tensor(tensor, {1, 2, 5, 64}, {2, 3, 10, 128}));
961+
size_t tensor_data_offset = ov::get_tensor_data_offset(*ov::get_tensor_impl(roi_tensor)._ptr);
962+
EXPECT_EQ(static_cast<const uint8_t*>(roi_tensor.data()),
963+
static_cast<const uint8_t*>(tensor.data()) + tensor_data_offset);
964+
}
965+
966+
TEST_F(OVTensorTest, getTensorDataOffsetFromGeneralTensor) {
967+
const ov::Tensor tensor(ov::element::f32, ov::Shape{3, 5, 32, 128});
968+
size_t tensor_data_offset = ov::get_tensor_data_offset(*ov::get_tensor_impl(tensor)._ptr);
969+
EXPECT_EQ(static_cast<const uint8_t*>(tensor.data()),
970+
static_cast<const uint8_t*>(tensor.data()) + tensor_data_offset);
971+
EXPECT_EQ(0, tensor_data_offset); // special case for general tensor it returns 0
972+
}
973+
956974
struct TestParams {
957975
ov::Shape src_shape;
958976
ov::Strides src_strides;

src/inference/dev_api/openvino/runtime/make_tensor.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,17 @@ OPENVINO_RUNTIME_API ov::Tensor make_tensor(const ov::SoPtr<ITensor>& tensor);
8484
*/
8585
OPENVINO_RUNTIME_API ov::SoPtr<ov::ITensor> get_tensor_impl(const ov::Tensor& tensor);
8686

87+
/**
88+
* @brief Returns the byte offset of the tensor's data pointer from the base memory allocation
89+
*
90+
* @details This function is useful for ROI (Region of Interest) tensors that share memory with a parent tensor
91+
* but start at a different position within that memory.
92+
*
93+
* @param tensor Tensor implementation to get the offset from.
94+
*
95+
* @return The offset in bytes from the base memory pointer. Returns 0 if the tensor starts at the
96+
* beginning of its memory allocation or if no offset is applicable.
97+
*/
98+
OPENVINO_RUNTIME_API size_t get_tensor_data_offset(const ov::ITensor& tensor);
99+
87100
} // namespace ov

src/inference/src/dev/make_tensor.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,10 @@ class BaseRoiTensor {
416416
m_shape = std::move(new_shape);
417417
}
418418

419+
size_t get_offset() const {
420+
return m_offset;
421+
}
422+
419423
protected:
420424
std::shared_ptr<ITensor> m_owner;
421425
Shape m_shape;
@@ -587,4 +591,11 @@ ov::SoPtr<ov::ITensor> get_tensor_impl(const ov::Tensor& tensor) {
587591
return ov::SoPtr<ov::ITensor>(tensor_impl, so);
588592
}
589593

594+
size_t get_tensor_data_offset(const ov::ITensor& tensor) {
595+
if (auto tensor_impl = dynamic_cast<const BaseRoiTensor*>(&tensor)) {
596+
return tensor_impl->get_offset();
597+
}
598+
return 0;
599+
}
600+
590601
} // namespace ov

0 commit comments

Comments
 (0)