diff --git a/src/plugins/intel_gpu/include/intel_gpu/plugin/common_utils.hpp b/src/plugins/intel_gpu/include/intel_gpu/plugin/common_utils.hpp index e3ec998df78..df2caf5bcfc 100644 --- a/src/plugins/intel_gpu/include/intel_gpu/plugin/common_utils.hpp +++ b/src/plugins/intel_gpu/include/intel_gpu/plugin/common_utils.hpp @@ -121,6 +121,7 @@ inline void ForceExit() { void convert_and_copy(const ov::ITensor* src, cldnn::memory::ptr dst, cldnn::stream& stream); void convert_and_copy(const cldnn::memory::ptr src, ov::ITensor const* dst, const cldnn::stream& stream); void convert_and_copy(const ov::ITensor* src, ov::ITensor const* dst, const cldnn::stream& stream); +void convert_and_copy(const cldnn::memory::ptr src, cldnn::memory::ptr dst, cldnn::stream& stream); } // namespace intel_gpu diff --git a/src/plugins/intel_gpu/src/plugin/common_utils.cpp b/src/plugins/intel_gpu/src/plugin/common_utils.cpp index 7dfa876570b..9ab7b74b82d 100644 --- a/src/plugins/intel_gpu/src/plugin/common_utils.cpp +++ b/src/plugins/intel_gpu/src/plugin/common_utils.cpp @@ -138,6 +138,20 @@ void convert_and_copy(const cldnn::memory::ptr src, ov::ITensor const* dst, cons return ::convert_and_copy(src_ptr, src_et, dst_ptr, dst_et, size, src->get_layout()); } +void convert_and_copy(const cldnn::memory::ptr src, cldnn::memory::ptr dst, cldnn::stream& stream) { + const bool blocking = true; + auto src_et = src->get_layout().data_type; + auto dst_et = dst->get_layout().data_type; + + cldnn::mem_lock src_lock(src, stream); + const void* src_ptr = src_lock.data(); + + size_t size = ov::shape_size(src->get_layout().get_shape()); + ov::Tensor tmp_tensor(dst_et, src->get_layout().get_shape()); + ::convert_and_copy(src_ptr, src_et, tmp_tensor.data(), dst_et, size, src->get_layout()); + dst->copy_from(stream, tmp_tensor.data(), blocking); +} + void convert_and_copy(const ov::ITensor* src, ov::ITensor const* dst, const cldnn::stream& stream) { auto src_et = src->get_element_type(); auto dst_et = dst->get_element_type(); 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 51861988f1f..8b21669f2d8 100644 --- a/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp +++ b/src/plugins/intel_gpu/src/plugin/sync_infer_request.cpp @@ -675,7 +675,13 @@ std::vector SyncInferRequest::prepare_input(const std::string bool convert_needed = is_convert_required(element_type, device_tensor_et); if (is_remote) { - m_plugin_inputs[name] = user_tensor_wrapper; + if (convert_needed) { + m_plugin_inputs[name] = { create_device_tensor(pshape, + cldnn::element_type_to_data_type(element_type), + false), TensorOwner::PLUGIN }; + } else { + m_plugin_inputs[name] = user_tensor_wrapper; + } } else if (is_usm_host_tensor && !convert_needed && can_use_usm_host(engine)) { if (element_type != cldnn::element_type_to_data_type(element_type)) { m_plugin_inputs[name] = {std::make_shared(m_context, @@ -753,14 +759,17 @@ std::vector SyncInferRequest::prepare_input(const std::string } cldnn::event::ptr ret_event = nullptr; - if (!is_remote) { - if (convert_needed) { - convert_and_copy(user_tensor.get(), device_tensor.get(), stream); + if (!is_remote && !convert_needed) { + auto src_ptr = static_cast(user_tensor->data()); + if (!same_host_mem(memory, src_ptr)) { + ret_event = memory->copy_from(stream, src_ptr, false); + } + } + if (convert_needed) { + if (is_remote) { + convert_and_copy(remote_ptr->get_memory(), device_tensor->get_memory(), stream); } else { - auto src_ptr = static_cast(user_tensor->data()); - if (!same_host_mem(memory, src_ptr)) { - ret_event = memory->copy_from(stream, src_ptr, false); - } + convert_and_copy(user_tensor.get(), device_tensor.get(), stream); } }