2020#include " intel_gpu/op/fully_connected.hpp"
2121#include " intel_gpu/op/fully_connected_compressed.hpp"
2222#include " intel_gpu/op/placeholder.hpp"
23+ #include " openvino/op/variadic_split.hpp"
2324
2425using namespace testing ;
2526using namespace ov ::intel_gpu;
@@ -28,7 +29,7 @@ TEST_F(TransformationTestsF, FullyConnectedConvertFusionTest1) {
2829 {
2930 auto input = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::PartialShape{ -1 , 16 });
3031 auto weights_const = ov::op::v0::Constant::create (ov::element::u8 , ov::Shape{ 32 , 16 }, { 1 });
31- auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
32+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
3233 auto scale_const = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{ 32 , 1 }, { 1 });
3334 auto zp_const = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{ 32 , 1 }, { 1 });
3435 auto fc_compressed = std::make_shared<ov::intel_gpu::op::FullyConnectedCompressed>(input, weights_const, no_bias, scale_const, zp_const);
@@ -40,7 +41,7 @@ TEST_F(TransformationTestsF, FullyConnectedConvertFusionTest1) {
4041 {
4142 auto input = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::PartialShape{ -1 , 16 });
4243 auto weights_const = ov::op::v0::Constant::create (ov::element::u8 , ov::Shape{ 32 , 16 }, { 1 });
43- auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
44+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
4445 auto scale_const = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{ 32 , 1 }, { 1 });
4546 auto zp_const = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{ 32 , 1 }, { 1 });
4647 auto fc_compressed = std::make_shared<ov::intel_gpu::op::FullyConnectedCompressed>(input, weights_const, no_bias, scale_const, zp_const, ov::element::f32 );
@@ -53,7 +54,7 @@ TEST_F(TransformationTestsF, FullyConnectedConvertFusionTest2) {
5354 {
5455 auto input1 = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::Shape{3 , 2 , 2 });
5556 auto input2 = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{2 , 2 }, {1 });
56- auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
57+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
5758 auto matmul = std::make_shared<op::FullyConnected>(input1, input2, no_bias);
5859 auto convert = std::make_shared<ov::op::v0::Convert>(matmul, ov::element::f32 );
5960
@@ -63,7 +64,43 @@ TEST_F(TransformationTestsF, FullyConnectedConvertFusionTest2) {
6364 {
6465 auto input1 = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::Shape{3 , 2 , 2 });
6566 auto input2 = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{2 , 2 }, {1 });
66- auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
67+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
68+ auto matmul = std::make_shared<op::FullyConnected>(input1, input2, no_bias, ov::element::f32 );
69+
70+ model_ref = std::make_shared<ov::Model>(ov::OutputVector{matmul}, ov::ParameterVector{input1});
71+ }
72+ }
73+
74+ TEST_F (TransformationTestsF, FullyConnectedConvertFusionTest3) {
75+ {
76+ auto input1 = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::Shape{1 , 163 , 960 });
77+ auto axis_const = ov::op::v0::Constant::create (ov::element::i64 , ov::Shape{1 }, {1 });
78+ auto split_const = ov::op::v0::Constant::create (ov::element::i64 , ov::Shape{2 }, {113 , 50 });
79+ auto split = std::make_shared<ov::op::v1::VariadicSplit>(input1, axis_const, split_const);
80+ auto input2 = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{720 , 960 }, {1 });
81+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
82+
83+ bool default_output_mismatch_exception = false ;
84+ try {
85+ auto matmul = std::make_shared<op::FullyConnected>(split, input2, no_bias);
86+ } catch (std::exception& exc) {
87+ const std::string error = exc.what ();
88+ default_output_mismatch_exception = error.find (" Default output not supported" ) != std::string::npos;
89+ }
90+
91+ ASSERT_TRUE (default_output_mismatch_exception);
92+
93+ auto non_split_input = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::Shape{1 , 50 , 960 });
94+ auto matmul = std::make_shared<op::FullyConnected>(non_split_input, input2, no_bias);
95+ auto convert = std::make_shared<ov::op::v0::Convert>(matmul, ov::element::f32 );
96+ model = std::make_shared<ov::Model>(ov::OutputVector{convert}, ov::ParameterVector{non_split_input});
97+ manager.register_pass <FullyConnectedConvertFusion>();
98+
99+ }
100+ {
101+ auto input1 = std::make_shared<ov::op::v0::Parameter>(ov::element::f16 , ov::Shape{1 , 50 , 960 });
102+ auto input2 = ov::op::v0::Constant::create (ov::element::f16 , ov::Shape{720 , 960 }, {1 });
103+ auto no_bias = std::make_shared<ov::intel_gpu::op::Placeholder>();
67104 auto matmul = std::make_shared<op::FullyConnected>(input1, input2, no_bias, ov::element::f32 );
68105
69106 model_ref = std::make_shared<ov::Model>(ov::OutputVector{matmul}, ov::ParameterVector{input1});
0 commit comments