Skip to content

Commit 4bf52c1

Browse files
[GPU] Fix USMHost tensor sharing between models from different Cores (#27105)
### Details: - Treat USMHost tensor from another context as non-sharable
1 parent ac7cb8b commit 4bf52c1

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ TensorWrapper SyncInferRequest::create_or_share_device_tensor(const TensorWrappe
547547

548548
bool can_share = !is_convert_required(user_tensor->get_element_type(), element_type) && can_use_usm_host(engine) && !generic_remote_tensor;
549549

550-
if (usm_host_tensor && can_share) {
550+
if (usm_host_tensor && can_share && m_context == usm_host_tensor->get_impl()->get_context()) {
551551
return { usm_host_tensor->get_impl(), user_tensor_wrapper.owner };
552552
} else if (usm_host_raw_ptr && can_share) {
553553
return { std::make_shared<RemoteTensorImpl>(m_context,
@@ -727,7 +727,7 @@ std::vector<cldnn::event::ptr> SyncInferRequest::prepare_input(const std::string
727727
auto usm_host_ptr = std::dynamic_pointer_cast<USMHostTensor>(user_tensor);
728728
bool is_generic_remote = iremote_tensor_ptr != nullptr && remote_tensor_impl_ptr == nullptr;
729729
bool is_remote_tensor_impl = remote_tensor_impl_ptr != nullptr;
730-
bool is_usm_host_tensor = usm_host_ptr != nullptr;
730+
bool is_usm_host_tensor = usm_host_ptr != nullptr && usm_host_ptr->get_impl()->get_context() == m_context;
731731

732732
GPU_DEBUG_TRACE_DETAIL << "Prepare input for " << internal_name
733733
<< " (is_remote_tensor_impl ? " << is_remote_tensor_impl

src/plugins/intel_gpu/tests/functional/behavior/infer_request.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
#include "common_test_utils/test_common.hpp"
77
#include "common_test_utils/common_utils.hpp"
88
#include "common_test_utils/node_builders/activation.hpp"
9+
#include "openvino/core/partial_shape.hpp"
910
#include "openvino/core/preprocess/pre_post_process.hpp"
11+
#include "openvino/op/parameter.hpp"
12+
#include "openvino/op/relu.hpp"
13+
#include "openvino/op/result.hpp"
1014
#include "openvino/runtime/core.hpp"
1115
#include "transformations/utils/utils.hpp"
1216
#include "shared_test_classes/base/ov_subgraph.hpp"
@@ -369,4 +373,26 @@ TEST(TensorTest, smoke_outputTensorShapesForDynamicInput) {
369373
OV_ASSERT_NO_THROW(inf_req.infer());
370374
ASSERT_EQ(inf_req.get_output_tensor().get_shape(), output3_shape);
371375
}
376+
377+
TEST(TensorTest, smoke_canShareTensorIfModelsFromDifferentCores) {
378+
auto core1 = ov::Core();
379+
auto core2 = ov::Core();
380+
381+
auto param = std::make_shared<ov::op::v0::Parameter>(ov::element::f32, ov::PartialShape{4, 8});
382+
auto relu = std::make_shared<ov::op::v0::Relu>(param);
383+
auto result = std::make_shared<ov::op::v0::Result>(relu);
384+
auto model = std::make_shared<ov::Model>(ov::ResultVector{result}, ov::ParameterVector{param});
385+
386+
auto compiled_model1 = core1.compile_model(model, ov::test::utils::DEVICE_GPU);
387+
auto compiled_model2 = core2.compile_model(model, ov::test::utils::DEVICE_GPU);
388+
389+
auto request1 = compiled_model1.create_infer_request();
390+
auto request2 = compiled_model2.create_infer_request();
391+
392+
request2.set_input_tensor(request1.get_output_tensor());
393+
request2.set_output_tensor(request1.get_input_tensor());
394+
395+
OV_ASSERT_NO_THROW(request1.infer());
396+
OV_ASSERT_NO_THROW(request2.infer());
397+
}
372398
} // namespace

0 commit comments

Comments
 (0)