diff --git a/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp b/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp index dba2809c7b1..8c6ff2b2d6e 100644 --- a/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp +++ b/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp @@ -337,6 +337,18 @@ void SyncInferRequest::wait() { "than required (", output_memory->size(), ")"); bool need_output_update = output_layout.bytes_count() == 0 || (output_memory && output_tensor->get_byte_size() != output_memory->size()); + + // Check shape is changed when size between output_tensor and output_memory are same. + if (!need_output_update) { + auto output_layout_shape = output_layout.get_shape(); + auto output_tensor_shape = output_tensor->get_shape(); + if (!output_layout_shape.empty() && !output_tensor_shape.empty()) { + if (output_layout_shape != output_tensor_shape) { + need_output_update = true; + } + } + } + if (need_output_update) { OV_ITT_SCOPED_TASK(itt::domains::intel_gpu_plugin, "SyncInferRequest::wait::update_output"); auto mem_shape = output_layout.get_shape(); diff --git a/src/plugins/intel_gpu/tests/functional/behavior/infer_request.cpp b/src/plugins/intel_gpu/tests/functional/behavior/infer_request.cpp index add2642101a..bdd02c1ec82 100644 --- a/src/plugins/intel_gpu/tests/functional/behavior/infer_request.cpp +++ b/src/plugins/intel_gpu/tests/functional/behavior/infer_request.cpp @@ -273,4 +273,38 @@ TEST(VariablesTest, smoke_set_get_state_with_convert) { ov::test::utils::compare(tensor_to_set, state_tensor, 1e-5f, 1e-5f); } + +TEST(TensorTest, smoke_outputTensorShapesForDynamicInput) { + auto core = ov::Core(); + using namespace ov::preprocess; + auto p = PrePostProcessor(ov::test::utils::make_split_multi_conv_concat()); + p.input().tensor().set_element_type(ov::element::i8); + p.input().preprocess().convert_element_type(ov::element::f32); + + auto function = p.build(); + std::map shapes = { {0, ov::PartialShape{-1, -1, -1, -1}} }; + function->reshape(shapes); + auto exec_net = core.compile_model(function, ov::test::utils::DEVICE_GPU); + auto inf_req = exec_net.create_infer_request(); + + ov::Tensor t1(ov::element::i8, {1, 4, 20, 40}); + ov::Tensor t2(ov::element::i8, {1, 4, 40, 20}); + ov::Tensor t3(ov::element::i8, {1, 4, 20, 40}); + const ov::Shape output1_shape = {1, 10, 12, 32}; + const ov::Shape output2_shape = {1, 10, 32, 12}; + const ov::Shape output3_shape = {1, 10, 12, 32}; + + // Check output shape of output tensor is correct + ASSERT_NO_THROW(inf_req.set_input_tensor(t1)); + ASSERT_NO_THROW(inf_req.infer()); + ASSERT_EQ(inf_req.get_output_tensor().get_shape(), output1_shape); + + ASSERT_NO_THROW(inf_req.set_input_tensor(t2)); + ASSERT_NO_THROW(inf_req.infer()); + ASSERT_EQ(inf_req.get_output_tensor().get_shape(), output2_shape); + + ASSERT_NO_THROW(inf_req.set_input_tensor(t3)); + ASSERT_NO_THROW(inf_req.infer()); + ASSERT_EQ(inf_req.get_output_tensor().get_shape(), output3_shape); +} } // namespace