Skip to content

Commit 3d33cb2

Browse files
authored
[ARM CPU] Fix eltwise op tests (Divide) (openvinotoolkit#17029)
* update skip list * skip change * fix divide * review fixes * review fixes #2
1 parent 39f843f commit 3d33cb2

File tree

4 files changed

+55
-9
lines changed

4 files changed

+55
-9
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (C) 2020-2023 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include "decompose_integer_divide.hpp"
5+
#include <ngraph/opsets/opset1.hpp>
6+
#include <ngraph/rt_info.hpp>
7+
8+
namespace ov {
9+
namespace intel_cpu {
10+
11+
DecomposeIntegerDivide::DecomposeIntegerDivide() {
12+
register_matcher(std::make_shared<ngraph::pattern::Matcher>(ngraph::pattern::wrap_type<ngraph::opset1::Divide>(), "DecomposeIntegerDivide"),
13+
[](ngraph::pattern::Matcher& m) {
14+
auto divide = std::dynamic_pointer_cast<ngraph::opset1::Divide>(m.get_match_root());
15+
if (!divide) {
16+
return false;
17+
}
18+
if (!divide->get_element_type().is_integral_number()) {
19+
return false;
20+
}
21+
22+
auto new_divide = std::make_shared<ngraph::opset1::Divide>(divide->input_value(0), divide->input_value(1));
23+
auto new_floor = std::make_shared<ngraph::opset1::Floor>(new_divide);
24+
new_floor->set_friendly_name(divide->get_friendly_name());
25+
ngraph::copy_runtime_info(divide, new_floor);
26+
ngraph::replace_node(divide, new_floor);
27+
return true;
28+
});
29+
}
30+
31+
} // namespace intel_cpu
32+
} // namespace ov
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (C) 2020-2023 Intel Corporation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <ngraph/pattern/op/wrap_type.hpp>
7+
#include <ngraph/pass/graph_rewrite.hpp>
8+
9+
namespace ov {
10+
namespace intel_cpu {
11+
12+
class DecomposeIntegerDivide: public ngraph::pass::MatcherPass {
13+
public:
14+
OPENVINO_RTTI("DecomposeIntegerDivide", "0");
15+
DecomposeIntegerDivide();
16+
};
17+
18+
} // namespace intel_cpu
19+
} // namespace ov

src/plugins/intel_cpu/src/transformations/transformation_pipeline.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
#include "transformations/cpu_opset/arm/pass/convert_group_conv1d.hpp"
100100
#include "transformations/cpu_opset/arm/pass/convert_reduce_multi_axis.hpp"
101101
#include "transformations/cpu_opset/arm/pass/mish_decomposition.hpp"
102+
#include "transformations/cpu_opset/arm/pass/decompose_integer_divide.hpp"
102103
#include "transformations/cpu_opset/common/pass/convert_fq_rnn_to_quantized_rnn.hpp"
103104
#include "transformations/cpu_opset/common/pass/move_eltwise_up_data_movement.hpp"
104105
#include "transformations/cpu_opset/common/pass/ref_convert_i64_i32.hpp"
@@ -262,6 +263,9 @@ void Transformations::PreLpt(const std::vector<ov::element::Type>& defaultPrecis
262263
CPU_REGISTER_PASS_ARM(manager, ConvertConv1D);
263264
CPU_REGISTER_PASS_ARM(manager, ConvertGroupConv1D);
264265
CPU_REGISTER_PASS_ARM(manager, ConvertGroupConvolution);
266+
// The plugin computes Divide in floating point precision.
267+
// To preserve correct math for integer division we need to insert explicit Floor operation.
268+
CPU_REGISTER_PASS_ARM(manager, DecomposeIntegerDivide);
265269

266270
// SpaceToDepth/ DepthToSpace node implementation supports only equal input/output tensors with rank <= 5
267271
CPU_SET_CALLBACK_COMMON(manager,

src/plugins/intel_cpu/tests/functional/shared_tests_instances/skip_tests_config.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,6 @@ std::vector<std::string> disabledTestPatterns() {
201201
retVector.emplace_back(R"(smoke_CPU_OVClassCompileModelAndCheckWithSecondaryPropertiesDoubleTest.*)");
202202
}
203203
retVector.emplace_back(R"(smoke_LPT.*)");
204-
retVector.emplace_back(R"(smoke_Activation_Basic/ActivationLayerTest.CompareWithRefs.*)");
205-
retVector.emplace_back(R"(smoke_Integer_Activation_Basic/ActivationLayerTest.CompareWithRefs/(Tanh|Negative|Sqrt).*)");
206-
retVector.emplace_back(R"(smoke_Activation_Basic_Prelu_Const/ActivationLayerTest.CompareWithRefs/(LeakyRelu|PReLu).*)");
207-
retVector.emplace_back(R"(smoke_Activation_Basic_Prelu_Param/ActivationParamLayerTest.CompareWithRefs/(LeakyRelu|PReLu).*)");
208-
retVector.emplace_back(R"(smoke_CompareWithRefs/ComparisonLayerTest.ComparisonTests.*)");
209-
retVector.emplace_back(R"(smoke_CompareWithRefs_static/EltwiseLayerTest.EltwiseTests.*)");
210-
retVector.emplace_back(R"(smoke_CompareWithRefs_static_check_collapsing/EltwiseLayerTest.EltwiseTests.*)");
211-
retVector.emplace_back(R"(smoke_SingleThread/EltwiseLayerTest.EltwiseTests.*)");
212204
retVector.emplace_back(R"(smoke_Decomposition_(3|4)D/Mvn6LayerTest.CompareWithRefs.*)");
213205
retVector.emplace_back(R"(smoke_AvgPool_ExplicitPad_CeilRounding/PoolingLayerTest.CompareWithRefs.*)");
214206
retVector.emplace_back(R"(smoke_TestsDFT_(1|2|3|4)d/DFTLayerTest.CompareWithRefs.*)");
@@ -217,7 +209,6 @@ std::vector<std::string> disabledTestPatterns() {
217209
retVector.emplace_back(R"(smoke_Quantized.*)");
218210
retVector.emplace_back(R"(smoke_NegativeQuantizedMatMulMultiplyFusion.*)");
219211
retVector.emplace_back(R"(MultipleLSTMCellTest/MultipleLSTMCellTest.CompareWithRefs.*)");
220-
retVector.emplace_back(R"(smoke_MultipleAdd_Nd/MultiplyAddLayerTest.CompareWithRefs.*)");
221212
retVector.emplace_back(R"(smoke_If/SimpleIfTest.CompareWithRefs.*)");
222213
retVector.emplace_back(R"(smoke_If/SimpleIfNotConstConditionTest.CompareWithRefs.*)");
223214
#endif

0 commit comments

Comments
 (0)