Skip to content

Commit 631c085

Browse files
authored
[Snippets][CPU][RV64] Enable eltwise binary op tests (openvinotoolkit#34040)
### Details: - Implement `BroadcastMove` emitter for RISC-V - Attach `RankNormalization` emitter to RISC-V CPU generator - Enable testing for `smoke_Snippets_Eltwise*` and `smoke_Snippets_ThreeInputsEltwise*` scopes ### Tickets: - N/A
1 parent a892434 commit 631c085

File tree

5 files changed

+74
-9
lines changed

5 files changed

+74
-9
lines changed

src/plugins/intel_cpu/src/emitters/snippets/riscv64/cpu_generator.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "openvino/core/node.hpp"
2525
#include "openvino/core/node_output.hpp"
2626
#include "openvino/op/abs.hpp"
27+
#include "openvino/op/add.hpp"
2728
#include "openvino/op/clamp.hpp"
2829
#include "openvino/op/elu.hpp"
2930
#include "openvino/op/erf.hpp"
@@ -36,6 +37,7 @@
3637
#include "openvino/op/is_inf.hpp"
3738
#include "openvino/op/is_nan.hpp"
3839
#include "openvino/op/mish.hpp"
40+
#include "openvino/op/multiply.hpp"
3941
#include "openvino/op/negative.hpp"
4042
#include "openvino/op/parameter.hpp"
4143
#include "openvino/op/relu.hpp"
@@ -47,9 +49,11 @@
4749
#include "snippets/generator.hpp"
4850
#include "snippets/lowered/expression.hpp"
4951
#include "snippets/op/broadcastload.hpp"
52+
#include "snippets/op/broadcastmove.hpp"
5053
#include "snippets/op/kernel.hpp"
5154
#include "snippets/op/load.hpp"
5255
#include "snippets/op/loop.hpp"
56+
#include "snippets/op/rank_normalization.hpp"
5357
#include "snippets/op/result.hpp"
5458
#include "snippets/op/scalar.hpp"
5559
#include "snippets/op/store.hpp"
@@ -154,7 +158,10 @@ CPUTargetMachine::CPUTargetMachine(ov::intel_cpu::riscv64::cpu_isa_t host_isa, o
154158
// data movement
155159
jitters[op::v0::Parameter::get_type_info_static()] = emitter_factory.from_expr<jit_nop_emitter>();
156160
jitters[snippets::op::Result::get_type_info_static()] = emitter_factory.from_expr<jit_nop_emitter>();
161+
jitters[snippets::op::RankNormalization::get_type_info_static()] = emitter_factory.from_expr<jit_nop_emitter>();
157162
jitters[snippets::op::Scalar::get_type_info_static()] = emitter_factory.from_expr<jit_scalar_emitter>();
163+
jitters[snippets::op::BroadcastMove::get_type_info_static()] =
164+
emitter_factory.from_expr<jit_broadcast_move_emitter>();
158165

159166
// memory access
160167
jitters[snippets::op::Load::get_type_info_static()] = emitter_factory.from_expr<jit_load_memory_emitter>();
@@ -174,12 +181,12 @@ CPUTargetMachine::CPUTargetMachine(ov::intel_cpu::riscv64::cpu_isa_t host_isa, o
174181
emitter_factory.from_expr<jit_kernel_dynamic_emitter>();
175182

176183
// binary operations
177-
// jitters[op::v1::Add::get_type_info_static()] = emitter_factory.from_node<jit_add_emitter>();
184+
jitters[op::v1::Add::get_type_info_static()] = emitter_factory.from_node<jit_add_emitter>();
178185
// jitters[op::v1::Divide::get_type_info_static()] = emitter_factory.from_node<jit_divide_emitter>();
179186
// jitters[op::v1::Maximum::get_type_info_static()] = emitter_factory.from_node<jit_maximum_emitter>();
180187
// jitters[op::v1::Minimum::get_type_info_static()] = emitter_factory.from_node<jit_minimum_emitter>();
181188
// jitters[op::v1::Mod::get_type_info_static()] = emitter_factory.from_node<jit_mod_emitter>();
182-
// jitters[op::v1::Multiply::get_type_info_static()] = emitter_factory.from_node<jit_multiply_emitter>();
189+
jitters[op::v1::Multiply::get_type_info_static()] = emitter_factory.from_node<jit_multiply_emitter>();
183190
// jitters[snippets::op::PowerStatic::get_type_info_static()] =
184191
// emitter_factory.from_node<jit_power_static_emitter>(); jitters[op::v0::SquaredDifference::get_type_info_static()]
185192
// =

src/plugins/intel_cpu/src/emitters/snippets/riscv64/jit_snippets_emitters.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "openvino/core/type/element_type.hpp"
1818
#include "openvino/op/constant.hpp"
1919
#include "snippets/lowered/expression.hpp"
20+
#include "snippets/op/broadcastmove.hpp"
21+
#include "utils/general_utils.h"
2022
#include "xbyak_riscv/xbyak_riscv.hpp"
2123
#include "xbyak_riscv/xbyak_riscv_csr.hpp"
2224

@@ -31,6 +33,47 @@ jit_nop_emitter::jit_nop_emitter(jit_generator_t* h, cpu_isa_t isa, [[maybe_unus
3133
in_out_type_ = emitter_in_out_map::gpr_to_gpr;
3234
}
3335

36+
jit_broadcast_move_emitter::jit_broadcast_move_emitter(jit_generator_t* h, cpu_isa_t isa, const ExpressionPtr& expr)
37+
: jit_emitter(h, isa) {
38+
const auto n = expr->get_node();
39+
OV_CPU_JIT_EMITTER_ASSERT(ov::as_type_ptr<snippets::op::BroadcastMove>(n) != nullptr,
40+
"Expects BroadcastMove expression");
41+
const auto element_type = n->get_input_element_type(0);
42+
OV_CPU_JIT_EMITTER_ASSERT(any_of(element_type.size(), 1U, 2U, 4U), "Unsupported element type: ", element_type);
43+
byte_size = element_type.size();
44+
}
45+
46+
void jit_broadcast_move_emitter::emit_impl(const std::vector<size_t>& in, const std::vector<size_t>& out) const {
47+
if (host_isa_ == ov::intel_cpu::riscv64::gv) {
48+
emit_isa<ov::intel_cpu::riscv64::gv>(in, out);
49+
} else {
50+
OV_CPU_JIT_EMITTER_THROW("Doesn't support isa ", host_isa_);
51+
}
52+
}
53+
54+
template <cpu_isa_t isa>
55+
void jit_broadcast_move_emitter::emit_isa(const std::vector<size_t>& in, const std::vector<size_t>& out) const {
56+
auto src_vreg = Xbyak_riscv::VReg(in[0]);
57+
auto dst_vreg = Xbyak_riscv::VReg(out[0]);
58+
59+
switch (byte_size) {
60+
case 1:
61+
h->vsetivli(Xbyak_riscv::zero, 4, Xbyak_riscv::SEW::e8, Xbyak_riscv::LMUL::m1);
62+
break;
63+
case 2:
64+
h->vsetivli(Xbyak_riscv::zero, 4, Xbyak_riscv::SEW::e16, Xbyak_riscv::LMUL::m1);
65+
break;
66+
case 4:
67+
h->vsetivli(Xbyak_riscv::zero, 4, Xbyak_riscv::SEW::e32, Xbyak_riscv::LMUL::m1);
68+
break;
69+
default:
70+
OV_CPU_JIT_EMITTER_THROW("Unsupported data size ", byte_size);
71+
}
72+
73+
// Broadcast the first element of src to all dst lanes.
74+
h->vrgather_vi(dst_vreg, src_vreg, 0);
75+
}
76+
3477
jit_scalar_emitter::jit_scalar_emitter(jit_generator_t* h, cpu_isa_t isa, const ExpressionPtr& expr)
3578
: jit_emitter(h, isa) {
3679
const auto n = expr->get_node();
@@ -80,4 +123,4 @@ void jit_scalar_emitter::emit_isa([[maybe_unused]] const std::vector<size_t>& in
80123
h->vmv_v_x(dst_vreg, tmp_gpr);
81124
}
82125

83-
} // namespace ov::intel_cpu::riscv64
126+
} // namespace ov::intel_cpu::riscv64

src/plugins/intel_cpu/src/emitters/snippets/riscv64/jit_snippets_emitters.hpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,25 @@ class jit_nop_emitter : public jit_emitter {
2929
void emit_impl(const std::vector<size_t>& in, const std::vector<size_t>& out) const override {}
3030
};
3131

32+
class jit_broadcast_move_emitter : public jit_emitter {
33+
public:
34+
jit_broadcast_move_emitter(ov::intel_cpu::riscv64::jit_generator_t* h,
35+
ov::intel_cpu::riscv64::cpu_isa_t isa,
36+
const ov::snippets::lowered::ExpressionPtr& expr);
37+
38+
size_t get_inputs_num() const override {
39+
return 1;
40+
}
41+
42+
private:
43+
void emit_impl(const std::vector<size_t>& in, const std::vector<size_t>& out) const override;
44+
45+
template <ov::intel_cpu::riscv64::cpu_isa_t isa>
46+
void emit_isa(const std::vector<size_t>& in, const std::vector<size_t>& out) const;
47+
48+
size_t byte_size = 0;
49+
};
50+
3251
class jit_scalar_emitter : public jit_emitter {
3352
public:
3453
jit_scalar_emitter(ov::intel_cpu::riscv64::jit_generator_t* h,
@@ -53,4 +72,4 @@ class jit_scalar_emitter : public jit_emitter {
5372
int32_t value;
5473
};
5574

56-
} // namespace ov::intel_cpu::riscv64
75+
} // namespace ov::intel_cpu::riscv64

src/plugins/intel_cpu/src/nodes/executors/riscv64/subgraph.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class SubgraphStaticExecutor : public SubgraphExecutor, public SubgraphStaticBas
4545
void exec_impl(const std::vector<MemoryPtr>& inMemPtrs, const std::vector<MemoryPtr>& outMemPtrs) override;
4646
};
4747

48-
// Dynamic specialized executor is not used on RISCV64 yet, but keep the class for symmetry
4948
class SubgraphDynamicSpecializedExecutor : public SubgraphExecutor, public SubgraphDynamicSpecializedBaseExecutor {
5049
public:
5150
template <typename... Args>

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -474,12 +474,9 @@ const std::vector<std::regex>& disabled_test_patterns() {
474474
// Quantized models unsupported
475475
std::regex(R"(.*Quantized.*)"),
476476
std::regex(R"(smoke_Snippets.*\[.*\?.*\].*)"),
477+
std::regex(R"(smoke_Snippets.*IS\[0\]=\[1\.1\.\.10\.1\.\.8\.1\.\.4\].*)"),
477478
std::regex(R"(smoke_Snippets(?!_(Eltwise|ThreeInputsEltwise)(/|_)).*)"),
478479
std::regex(R"(.*_enforceSnippets=1.*)"),
479-
std::regex(R"(smoke_Snippets_Eltwise.*/Add.*)"),
480-
std::regex(R"(smoke_Snippets_Eltwise/TwoInputsAndOutputs.*)"),
481-
std::regex(R"(smoke_Snippets_Eltwise_TwoResults.*)"),
482-
std::regex(R"(smoke_Snippets_ThreeInputsEltwise.*)"),
483480
#endif
484481
#if !defined(OPENVINO_ARCH_X86_64)
485482
// very time-consuming test

0 commit comments

Comments
 (0)