diff --git a/src/plugins/intel_gpu/src/graph/impls/onednn/concatenation_onednn.hpp b/src/plugins/intel_gpu/src/graph/impls/onednn/concatenation_onednn.hpp index 0e6696355abd76..d6c149622ef9a3 100644 --- a/src/plugins/intel_gpu/src/graph/impls/onednn/concatenation_onednn.hpp +++ b/src/plugins/intel_gpu/src/graph/impls/onednn/concatenation_onednn.hpp @@ -54,14 +54,10 @@ struct ConcatenationImplementationManager : public ImplementationManager { if (out_layout.data_padding) return false; - std::vector all_dep_types; - bool any_dep_is_onednn = false; for (const auto& dep : node.get_dependencies()) { const auto& in_layout = dep.first->get_output_layout(false, dep.second); - all_dep_types.push_back(in_layout.format.value); - if (!one_of(in_layout.data_type, supported_types)) return false; @@ -75,9 +71,6 @@ struct ConcatenationImplementationManager : public ImplementationManager { any_dep_is_onednn = true; } - if (std::adjacent_find(all_dep_types.begin(), all_dep_types.end(), std::not_equal_to<>() ) != all_dep_types.end()) - return false; - if (!any_dep_is_onednn && format::is_simple_data_format(out_layout.format)) return false; diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp index f5f8a5a0ba2429..4f1338205b88c3 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/concatenation_gpu_test.cpp @@ -1790,158 +1790,6 @@ INSTANTIATE_TEST_SUITE_P(smoke, ), concat_gpu::PrintToStringParamName); - -template -struct concat_gpu_4d_implicit_mix_types_onednn : public concat_gpu { -public: - cldnn::memory::ptr run_concat_network(std::vector>>>> input, format::type fmt, ExecutionConfig config) { - auto data_type = ov::element::from(); - auto& engine = get_test_engine(); - const size_t batch_num = testing::get<0>(GetParam()); - const std::vector in_features = testing::get<1>(GetParam()); - const size_t input_y = testing::get<2>(GetParam()); - const size_t input_x = testing::get<3>(GetParam()); - size_t output_f = 0; - for (auto& f : in_features) - output_f += f; - - topology topology; - - std::vector in_memory; - std::vector input_ids; - std::vector pooling_ids; - - for (size_t i = 0; i < in_features.size(); i++) { - auto size = tensor(static_cast(batch_num), - static_cast(in_features[i]), - static_cast(input_x), - static_cast(input_y)); - auto data = input[i]; - auto in_lay = layout(data_type, fmt, size); - auto data_flat = std::vector(in_lay.get_linear_size(), 0); - - for (size_t bi = 0; bi < batch_num; ++bi) { - for (size_t fi = 0; fi < in_features[i]; ++fi) { - for (size_t yi = 0; yi < input_y; ++yi) { - for (size_t xi = 0; xi < input_x; ++xi) { - auto coords = tensor(batch(bi), feature(fi), spatial(xi, yi, 0, 0)); - auto in_offset = in_lay.get_linear_offset(coords); - data_flat[in_offset] = data[bi][fi][yi][xi]; - } - } - } - } - - auto in_mem = engine.allocate_memory(in_lay); - set_values(in_mem, data_flat); - in_memory.push_back(in_mem); - - topology.add(input_layout("input" + std::to_string(i), in_lay)); - topology.add(pooling("pool" + std::to_string(i), input_info("input" + std::to_string(i)), pooling_mode::max, {1, 1}, {1, 1})); - - input_ids.push_back("input" + std::to_string(i)); - pooling_ids.push_back(input_info("pool" + std::to_string(i))); - } - - topology.add(concatenation("concat", pooling_ids, 1)); - auto weights_lay = cldnn::layout(data_type, cldnn::format::bfyx, tensor(batch(output_f), feature(output_f))); - auto weights_mem = engine.allocate_memory(weights_lay); - auto& stream = get_test_stream(); - weights_mem->fill(stream); - stream.finish(); - { - cldnn::mem_lock weights_ptr(weights_mem, stream); - for (size_t fi = 0; fi < output_f; ++fi) { - auto coords = tensor(batch(fi), feature(fi), spatial(0, 0, 0, 0)); - auto offset = weights_lay.get_linear_offset(coords); - weights_ptr[offset] = static_cast(1.f); - } - } - - std::vector concat_ids; - - concat_ids.push_back(input_info("input1")); - concat_ids.push_back(input_info("pool_final")); - - topology.add(data("weights" , weights_mem)); - topology.add(convolution("conv", input_info("concat"), "weights", "", 1, {1, 1}, {1, 1}, {0, 0}, {0, 0}, false)); - topology.add(pooling("pool_final", input_info("conv"), pooling_mode::max, {1, 1}, {1, 1})); - topology.add(concatenation("concat_final", concat_ids, 1)); - topology.add(reorder("reorder", input_info("concat_final"), layout(data_type, format::byxf, {(int32_t)batch_num, (int32_t)output_f, (int32_t)input_y, (int32_t)input_x}))); - - network concat_network(engine, topology, config); - for (size_t i = 0; i < in_features.size(); i++) { - concat_network.set_input_data(input_ids[i], in_memory[i]); - } - auto outputs = concat_network.execute(); - - bool concat_opt_enabled = config.get_optimize_data(); - bool concat_opt_result = std::static_pointer_cast(concat_network.get_primitive("concat_final"))->node->can_be_optimized(); - EXPECT_EQ(concat_opt_enabled, concat_opt_result); - - return outputs.at("reorder").get_memory(); - } - - std::vector>>>> generate_input() { - const size_t batch_num = testing::get<0>(GetParam()); - const std::vector in_features = testing::get<1>(GetParam()); - const size_t input_y = testing::get<2>(GetParam()); - const size_t input_x = testing::get<3>(GetParam()); - - std::vector>>>> input(in_features.size()); - for (size_t i = 0; i < in_features.size(); ++i) { - input[i] = rg.generate_random_4d(batch_num, in_features[i], input_y, input_x, -10, 10); - } - return input; - } - - void test(format::type fmt) { - auto& engine = get_test_engine(); - auto& stream = get_test_stream(); - if (!engine.get_device_info().supports_immad) { - // This case is only for device that uses onednn. - return; - } - auto input = generate_input(); - - // implicit concat - ExecutionConfig config1 = get_test_default_config(engine); - config1.set_property(ov::intel_gpu::optimize_data(true)); - ov::intel_gpu::ImplementationDesc impl = { format::bfyx, std::string(""), impl_types::onednn }; - config1.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{ {"conv", impl} })); - - auto out_mem1 = run_concat_network(input, fmt, config1); - cldnn::mem_lock out_ptr1(out_mem1, stream); - - // explicit concat - ExecutionConfig config2 = get_test_default_config(engine); - config2.set_property(ov::intel_gpu::optimize_data(false)); - auto out_mem2 = run_concat_network(input, fmt, config2); - cldnn::mem_lock out_ptr2(out_mem2, stream); - - ASSERT_EQ(out_ptr1.size(), out_ptr2.size()); - size_t diff_count = 0; - for (size_t i = 0; i < out_ptr1.size(); ++i) { - if (out_ptr1[i] != out_ptr2[i]) diff_count++; - } - ASSERT_EQ(diff_count, 0); - } -}; - -using concat_implicit_gpu_onednn_4d_mix_i8 = concat_gpu_4d_implicit_mix_types_onednn; - -TEST_P(concat_implicit_gpu_onednn_4d_mix_i8, input_order_opt_b_fs_yx_fsv32) { - ASSERT_NO_FATAL_FAILURE(test(format::b_fs_yx_fsv32)); -} - -INSTANTIATE_TEST_SUITE_P(smoke, - concat_implicit_gpu_onednn_4d_mix_i8, - ::testing::Values( - TestParamType_concat(1, { 8, 32 }, 2, 2, false) - ), - concat_gpu::PrintToStringParamName); - - template struct concat_gpu_4d_explicit : public concat_gpu { public: