Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
6a42f08
1
aobolensk Aug 19, 2025
fde9406
2
aobolensk Aug 19, 2025
3dd7afc
3
aobolensk Aug 19, 2025
1c92860
4
aobolensk Aug 19, 2025
f1613f2
fmt
aobolensk Aug 19, 2025
945bd8a
override
aobolensk Aug 19, 2025
3854591
tune skip
aobolensk Aug 19, 2025
8aba094
tidy
aobolensk Aug 19, 2025
c850c0f
fix missing includes
aobolensk Aug 19, 2025
3bac861
fix strict aliasing
aobolensk Aug 19, 2025
6ac561e
minor remarks
aobolensk Aug 19, 2025
aa852ef
xuantie ci trigger
aobolensk Aug 19, 2025
150f03f
limit to add
aobolensk Aug 19, 2025
9f56de5
::adj
aobolensk Sep 10, 2025
f4ce6fe
fmt
aobolensk Sep 10, 2025
2e018a3
add includes
aobolensk Sep 10, 2025
17cd929
trace
aobolensk Sep 10, 2025
f604fb5
rm
aobolensk Sep 10, 2025
859da17
tests on CI
aobolensk Sep 10, 2025
9484602
fix
aobolensk Sep 10, 2025
45f8a0d
fix snippets regex
aobolensk Sep 10, 2025
e691b62
fix regex
aobolensk Sep 11, 2025
4bff223
Address part of review comments
aobolensk Sep 15, 2025
c77aea3
getHostIsa function refactoring + minoradjustments
aobolensk Sep 15, 2025
769caa7
exclude mistakenly enabled tests
aobolensk Sep 17, 2025
f4d3953
Merge remote-tracking branch 'origin/master' into snippets-riscv64
aobolensk Sep 17, 2025
449fe8b
Fix compilation on other platforms
aobolensk Sep 17, 2025
d5e2667
Fix missing snippetsManager
aobolensk Sep 18, 2025
c11a9c3
Merge remote-tracking branch 'origin/master' into snippets-riscv64
aobolensk Sep 18, 2025
c22f2bb
restore regex
aobolensk Sep 18, 2025
6f835fd
riscv gpr count
aobolensk Sep 18, 2025
f13b0a1
Merge branch 'master' into snippets-riscv64
aobolensk Sep 22, 2025
8947192
CompiledSnippetCPUCommon
aobolensk Sep 22, 2025
22b6e84
Merge branch 'master' into snippets-riscv64
aobolensk Sep 23, 2025
25a29f9
part 1
aobolensk Oct 6, 2025
39348dc
Merge remote-tracking branch 'origin/master' into snippets-riscv64
aobolensk Oct 6, 2025
034b3bd
compose_loop_args
aobolensk Oct 6, 2025
faafb85
get_*_buffer_cluster_id to utils
aobolensk Oct 6, 2025
441f003
part 2
aobolensk Oct 7, 2025
e6210ca
simplify begin_label_bound
aobolensk Oct 7, 2025
252f400
fix tests
aobolensk Oct 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/linux_riscv_xuantie_dev_cpu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ on:
- 'src/plugins/intel_cpu/src/emitters/plugin/aarch64/**'
- 'src/plugins/intel_cpu/src/emitters/plugin/riscv64/**'
- 'src/plugins/intel_cpu/src/emitters/plugin/x64/**'
- 'src/plugins/intel_cpu/src/emitters/snippets/riscv64/**'
- 'src/plugins/intel_cpu/src/nodes/executors/aarch64/**'
- 'src/plugins/intel_cpu/src/nodes/executors/shl/**'
- 'src/plugins/intel_cpu/src/nodes/kernels/riscv64/**'
Expand Down Expand Up @@ -234,7 +235,7 @@ jobs:
env:
INSTALL_DIR: ${{ github.workspace }}/install
INSTALL_TEST_DIR: ${{ github.workspace }}/install/tests
GTEST_FILTER: ${{ inputs.testFilterType == 'SMOKE' && '*smoke*' || '*ActivationLayer*:*EltwiseLayer*:*LogicalLayer*:*ComparisonLayer*:*SelectLayer*:*MatMulLayerCPUTest*:*ExtremumLayerCPUTest*' }}
GTEST_FILTER: ${{ inputs.testFilterType == 'SMOKE' && '*smoke*' || '*ActivationLayer*:*EltwiseLayer*:*LogicalLayer*:*ComparisonLayer*:*SelectLayer*:*MatMulLayerCPUTest*:*ExtremumLayerCPUTest*:smoke_Snippets*' }}

steps:
- name: Download OpenVINO artifacts (package)
Expand Down
9 changes: 7 additions & 2 deletions src/plugins/intel_cpu/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -212,18 +212,23 @@ if(NOT (AARCH64 OR ARM))
${CMAKE_CURRENT_SOURCE_DIR}/src/transformations/tpp/aarch64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/emitters/plugin/aarch64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/emitters/tpp/aarch64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/executors/aarch64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/kernels/aarch64/*)
endif()

if(NOT (AARCH64 OR ARM))
list(APPEND EXCLUDE_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/executors/aarch64/*)
endif()

if(NOT AARCH64)
list(APPEND EXCLUDE_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/src/transformations/snippets/aarch64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/emitters/snippets/aarch64/*)
endif()

if (NOT RISCV64)
list(APPEND EXCLUDE_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/src/emitters/plugin/riscv64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/kernels/riscv64/*)
${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/kernels/riscv64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/emitters/snippets/riscv64/*
${CMAKE_CURRENT_SOURCE_DIR}/src/nodes/executors/riscv64/*)
endif()

if (NOT ENABLE_MLAS_FOR_CPU)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
#include <cpu/aarch64/cpu_isa_traits.hpp>
#include <cpu/aarch64/jit_generator.hpp>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <set>
#include <utility>
Expand Down Expand Up @@ -213,23 +212,6 @@ class jit_snippet : public dnnl::impl::cpu::aarch64::jit_generator {

namespace intel_cpu::aarch64 {

CompiledSnippetCPU::CompiledSnippetCPU(std::unique_ptr<dnnl::impl::cpu::aarch64::jit_generator> h)
: h_compiled(std::move(h)) {
OPENVINO_ASSERT(h_compiled && h_compiled->jit_ker(), "Got invalid jit generator or kernel was nopt compiled");
}

const uint8_t* CompiledSnippetCPU::get_code() const {
return h_compiled->jit_ker();
}

size_t CompiledSnippetCPU::get_code_size() const {
return h_compiled->getSize();
}

bool CompiledSnippetCPU::empty() const {
return get_code_size() == 0;
}

CPUTargetMachine::CPUTargetMachine(dnnl::impl::cpu::aarch64::cpu_isa_t host_isa, ov::intel_cpu::MultiCacheWeakPtr cache)
: TargetMachine(std::make_shared<CPURuntimeConfigurator>(cache)),
h(new jit_snippet()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "cache/multi_cache.h"
#include "cpu/aarch64/jit_generator.hpp"
#include "emitters/snippets/common/compiled_snippet_cpu.hpp"
#include "openvino/core/node.hpp"
#include "openvino/core/node_output.hpp"
#include "snippets/emitter.hpp"
Expand All @@ -20,16 +21,7 @@

namespace ov::intel_cpu::aarch64 {

class CompiledSnippetCPU : public snippets::CompiledSnippet {
public:
explicit CompiledSnippetCPU(std::unique_ptr<dnnl::impl::cpu::aarch64::jit_generator> h);
[[nodiscard]] const uint8_t* get_code() const override;
[[nodiscard]] size_t get_code_size() const override;
[[nodiscard]] bool empty() const override;

private:
const std::unique_ptr<const dnnl::impl::cpu::aarch64::jit_generator> h_compiled;
};
using CompiledSnippetCPU = ov::intel_cpu::CompiledSnippetCPUCommon<dnnl::impl::cpu::aarch64::jit_generator>;

class CPUTargetMachine : public snippets::TargetMachine {
public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
#include "emitters/plugin/aarch64/jit_emitter.hpp"
#include "emitters/plugin/aarch64/jit_load_store_emitters.hpp"
#include "emitters/snippets/jit_snippets_call_args.hpp"
#include "emitters/snippets/utils/utils.hpp"
#include "emitters/utils.hpp"
#include "openvino/core/type.hpp"
#include "openvino/core/type/element_type.hpp"
#include "snippets/lowered/expression.hpp"
#include "snippets/lowered/expressions/buffer_expression.hpp"
#include "snippets/lowered/loop_manager.hpp"
#include "snippets/op/broadcastload.hpp"
#include "snippets/op/load.hpp"
Expand Down Expand Up @@ -55,13 +55,13 @@ jit_memory_emitter::jit_memory_emitter(jit_generator* h,
OV_CPU_JIT_EMITTER_ASSERT(memory_access->is_memory_access_input_port(0), "must be input port - memory access");
count = memory_access->get_input_count();
compiled_byte_offset = memory_access->get_input_offset();
buffer_cluster_id = get_parent_buffer_cluster_id(expr);
buffer_cluster_id = ov::intel_cpu::utils::get_parent_buffer_cluster_id(expr);
} else if (in_out_type_ == emitter_in_out_map::vec_to_gpr) {
OV_CPU_JIT_EMITTER_ASSERT(memory_access->is_memory_access_output_port(0),
"must be output port - memory access");
count = memory_access->get_output_count();
compiled_byte_offset = memory_access->get_output_offset();
buffer_cluster_id = get_consumer_buffer_cluster_id(expr);
buffer_cluster_id = ov::intel_cpu::utils::get_consumer_buffer_cluster_id(expr);
} else {
OV_CPU_JIT_EMITTER_THROW("unsupported in_out_type");
}
Expand All @@ -75,26 +75,6 @@ jit_memory_emitter::jit_memory_emitter(jit_generator* h,
}
}

size_t jit_memory_emitter::get_parent_buffer_cluster_id(const ov::snippets::lowered::ExpressionPtr& expr) {
OV_CPU_JIT_EMITTER_ASSERT(expr->get_input_count() == 1, "MemoryAccess must have one parent");
const auto& parent_expr = expr->get_input_expr_ptr(0);
if (const auto buffer = ov::as_type_ptr<ov::snippets::lowered::BufferExpression>(parent_expr)) {
return buffer->get_cluster_id();
}
return SIZE_MAX;
}

size_t jit_memory_emitter::get_consumer_buffer_cluster_id(const ov::snippets::lowered::ExpressionPtr& expr) {
OV_CPU_JIT_EMITTER_ASSERT(expr->get_output_count() == 1, "MemoryAccess must have one output");
const auto& consumers = expr->get_output_port_connector(0)->get_consumers();
for (const auto& consumer : consumers) {
if (const auto buffer = ov::as_type_ptr<ov::snippets::lowered::BufferExpression>(consumer.get_expr())) {
return buffer->get_cluster_id();
}
}
return SIZE_MAX;
}

jit_load_memory_emitter::jit_load_memory_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr)
: jit_memory_emitter(h, isa, expr, emitter_in_out_map::gpr_to_vec) {
bool is_supported_precision =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ class jit_memory_emitter : public jit_emitter {
std::vector<size_t> get_available_aux_gprs() const;

protected:
static size_t get_parent_buffer_cluster_id(const ov::snippets::lowered::ExpressionPtr& expr);
static size_t get_consumer_buffer_cluster_id(const ov::snippets::lowered::ExpressionPtr& expr);

ov::element::Type src_prc;
ov::element::Type dst_prc;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (C) 2018-2025 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#pragma once

#include <cstddef>
#include <cstdint>
#include <memory>

#include "openvino/core/except.hpp"
#include "snippets/target_machine.hpp"

namespace ov::intel_cpu {

// A small helper that wraps a platform-specific JIT generator and exposes
// a uniform CompiledSnippet interface. This reduces duplication across
// x64, aarch64 and riscv64 backends.
template <typename JitGeneratorT>
class CompiledSnippetCPUCommon : public ov::snippets::CompiledSnippet {
public:
explicit CompiledSnippetCPUCommon(std::unique_ptr<JitGeneratorT> h) : h_compiled(std::move(h)) {
OPENVINO_ASSERT(h_compiled && h_compiled->jit_ker(), "Got invalid jit generator or kernel was not compiled");
}

[[nodiscard]] const uint8_t* get_code() const override {
return h_compiled->jit_ker();
}
[[nodiscard]] size_t get_code_size() const override {
return h_compiled->getSize();
}
[[nodiscard]] bool empty() const override {
return get_code_size() == 0;
}

private:
const std::unique_ptr<const JitGeneratorT> h_compiled;
};

} // namespace ov::intel_cpu
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// Copyright (C) 2018-2025 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//

#pragma once

#include <cstdint>
#include <memory>
#include <vector>

#include "emitters/snippets/jit_snippets_call_args.hpp"
#include "snippets/op/loop.hpp"
#include "snippets/utils/utils.hpp"

namespace ov::intel_cpu::snippets_common {

inline jit_snippets_call_args::loop_args_t compose_loop_args(
const std::shared_ptr<ov::snippets::op::LoopEnd>& loop_end) {
const auto& ptr_increments = loop_end->get_ptr_increments();
const auto& fin_offsets = loop_end->get_finalization_offsets();
const auto& is_incremented = loop_end->get_is_incremented();
const auto wa_increment = loop_end->get_increment();

const auto int_work_amount = ov::snippets::utils::is_dynamic_value(loop_end->get_work_amount())
? ov::snippets::utils::get_dynamic_value<int64_t>()
: static_cast<int64_t>(loop_end->get_work_amount());
auto loop_args = jit_snippets_call_args::loop_args_t(int_work_amount, ptr_increments, fin_offsets);

const auto& data_sizes = loop_end->get_element_type_sizes();
for (int64_t i = 0; i < loop_args.m_num_data_ptrs; ++i) {
if (!is_incremented[i]) {
loop_args.m_ptr_increments[i] = 0;
loop_args.m_finalization_offsets[i] = 0;
continue;
}

if (!ov::snippets::utils::is_dynamic_value(loop_args.m_ptr_increments[i])) {
loop_args.m_ptr_increments[i] *= (wa_increment * data_sizes[i]);
}
if (!ov::snippets::utils::is_dynamic_value(loop_args.m_finalization_offsets[i])) {
loop_args.m_finalization_offsets[i] *= data_sizes[i];
}
}

return loop_args;
}

} // namespace ov::intel_cpu::snippets_common
Loading
Loading