diff --git a/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.cpp b/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.cpp index d8f363a5dbd618..772bc92cc6b597 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.cpp @@ -172,11 +172,20 @@ void jit_divide_emitter::emit_isa(const std::vector& in_vec_idxs, const VReg src1 = VReg(in_vec_idxs[1]); VReg dst = VReg(out_vec_idxs[0]); - h->vfdiv_vv(dst, src0, src1); + switch (exec_prc_) { + case ov::element::f32: + h->vfdiv_vv(dst, src0, src1); + break; + case ov::element::i32: + h->vdiv_vv(dst, src0, src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + } } std::set> jit_divide_emitter::get_supported_precisions(const std::shared_ptr& node) { - return {{element::f32, element::f32}}; + return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// Exp /// @@ -818,6 +827,39 @@ std::set> jit_sigmoid_emitter::get_supported_precisio return {{element::f32}}; } +/// SQRT /// +jit_sqrt_emitter::jit_sqrt_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} + +jit_sqrt_emitter::jit_sqrt_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, + const ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} + +size_t jit_sqrt_emitter::get_inputs_num() const { + return 1; +} + +void jit_sqrt_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { + if (host_isa_ == ov::intel_cpu::riscv64::cpu_isa_t::gv) { + emit_isa(in_vec_idxs, out_vec_idxs); + } else { + OPENVINO_THROW("Can't create jit eltwise kernel"); + } +} + +template +void jit_sqrt_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { + VReg src = VReg(in_vec_idxs[0]); + VReg dst = VReg(out_vec_idxs[0]); + + h->vfsqrt_v(dst, src); +} + +std::set> jit_sqrt_emitter::get_supported_precisions(const std::shared_ptr& node) { + return {{element::f32}}; +} + /// SUB /// jit_subtract_emitter::jit_subtract_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, const std::shared_ptr& node) diff --git a/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.hpp index dd44639dcd210e..cbb599585e4e94 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/riscv64/jit_eltwise_emitters.hpp @@ -264,6 +264,24 @@ class jit_sigmoid_emitter : public jit_emitter { std::unique_ptr jit_exp_emitter_ {nullptr}; }; +class jit_sqrt_emitter : public jit_emitter { +public: + jit_sqrt_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, + const ov::element::Type exec_prc = ov::element::f32); + jit_sqrt_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, + const std::shared_ptr& node); + + size_t get_inputs_num() const override; + + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); + +private: + void emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const override; + template + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; +}; + class jit_subtract_emitter : public jit_emitter { public: jit_subtract_emitter(ov::intel_cpu::riscv64::jit_generator* host, ov::intel_cpu::riscv64::cpu_isa_t host_isa, diff --git a/src/plugins/intel_cpu/src/nodes/eltwise.cpp b/src/plugins/intel_cpu/src/nodes/eltwise.cpp index e5bb17b2d4a605..eb474ddaa84c1c 100644 --- a/src/plugins/intel_cpu/src/nodes/eltwise.cpp +++ b/src/plugins/intel_cpu/src/nodes/eltwise.cpp @@ -815,6 +815,7 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { Algorithm::EltwisePrelu, Algorithm::EltwiseRelu, Algorithm::EltwiseSigmoid, + Algorithm::EltwiseSqrt, Algorithm::EltwiseSubtract)) { return false; } diff --git a/src/plugins/intel_cpu/src/nodes/kernels/riscv64/jit_uni_eltwise_generic.cpp b/src/plugins/intel_cpu/src/nodes/kernels/riscv64/jit_uni_eltwise_generic.cpp index 337849480f4afa..b6120c13da7b4b 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/riscv64/jit_uni_eltwise_generic.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/riscv64/jit_uni_eltwise_generic.cpp @@ -276,7 +276,7 @@ void jit_uni_eltwise_generic::load_vector(size_t vec_idx, const Xbyak_riscv vfcvt_f_x_v(src_vec(vec_idx), src_vec(vec_idx)); // int32 -> fp32 if (one_of(dst_prc, ov::element::i32) && one_of(src_prc, ov::element::f16, ov::element::f32)) - vfcvt_rtz_x_f_v(src_vec(vec_idx), src_vec(vec_idx)); // fp32 -> int32 (round-toward-zero) + vfcvt_x_f_v(src_vec(vec_idx), src_vec(vec_idx)); // fp32 -> int32 } template @@ -285,7 +285,7 @@ void jit_uni_eltwise_generic::store_vector(const Xbyak_riscv::Reg& gpr_work OPENVINO_ASSERT(one_of(src_prc, ov::element::f32, ov::element::i32), "Unsupported src prc"); if (one_of(src_prc, ov::element::f32) && one_of(dst_prc, ov::element::i8, ov::element::u8, ov::element::i32)) - vfcvt_rtz_x_f_v(dst_vec(), dst_vec()); // fp32 -> int32 (round-toward-zero) + vfcvt_x_f_v(dst_vec(), dst_vec()); // fp32 -> int32 if (one_of(src_prc, ov::element::i32) && one_of(dst_prc, ov::element::f16, ov::element::f32)) vfcvt_f_x_v(dst_vec(), dst_vec()); // int32 -> fp32 @@ -419,6 +419,7 @@ std::shared_ptr jit_uni_eltwise_generic::create_eltwise_emitte OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), OV_CASE(Algorithm::EltwiseRelu, jit_relu_emitter), OV_CASE(Algorithm::EltwiseSigmoid, jit_sigmoid_emitter), + OV_CASE(Algorithm::EltwiseSqrt, jit_sqrt_emitter), OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter)); if (!ctx.emitter) { @@ -546,6 +547,7 @@ std::set> eltwise_precision_helper::get_supported_pre OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), OV_CASE(Algorithm::EltwiseRelu, jit_relu_emitter), OV_CASE(Algorithm::EltwiseSigmoid, jit_sigmoid_emitter), + OV_CASE(Algorithm::EltwiseSqrt, jit_sqrt_emitter), OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter)); if (precisions.empty()) { diff --git a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/activation.cpp b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/activation.cpp index a1da5d10c0edbf..d1fb6cf88603f9 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/activation.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/classes/activation.cpp @@ -236,7 +236,8 @@ std::string ActivationLayerCPUTest::getPrimitiveType(const utils::ActivationType (activation_type == utils::ActivationTypes::LeakyRelu) || (activation_type == utils::ActivationTypes::Relu) || (activation_type == utils::ActivationTypes::PReLu) || - (activation_type == utils::ActivationTypes::Sigmoid) ) + (activation_type == utils::ActivationTypes::Sigmoid) || + (activation_type == utils::ActivationTypes::Sqrt)) return "jit"; } #if defined(OV_CPU_WITH_SHL)