From 1b480cba7b8bd55a46345868567af6f864e9ff39 Mon Sep 17 00:00:00 2001 From: Oleg Pipikin Date: Tue, 10 Dec 2024 13:23:17 +0100 Subject: [PATCH 01/31] New plugins property to pass mmap buffer (#27981) ### Details: - Replacement for https://github.com/openvinotoolkit/openvino/pull/27644 ### Tickets: - CVS-154602 - CVS-157192 --- .../openvino/runtime/internal_properties.hpp | 7 + src/inference/src/cache_manager.hpp | 6 +- src/inference/src/dev/core_impl.cpp | 5 +- .../tests/functional/caching_test.cpp | 136 ++++++++++++++++++ src/plugins/intel_cpu/src/plugin.cpp | 9 +- src/plugins/intel_cpu/src/utils/serialize.cpp | 13 +- src/plugins/intel_cpu/src/utils/serialize.hpp | 7 +- src/plugins/intel_gpu/src/plugin/plugin.cpp | 6 + 8 files changed, 178 insertions(+), 11 deletions(-) diff --git a/src/inference/dev_api/openvino/runtime/internal_properties.hpp b/src/inference/dev_api/openvino/runtime/internal_properties.hpp index 60d6b66cfda897..bec304104581ac 100644 --- a/src/inference/dev_api/openvino/runtime/internal_properties.hpp +++ b/src/inference/dev_api/openvino/runtime/internal_properties.hpp @@ -9,6 +9,7 @@ #pragma once +#include "openvino/runtime/aligned_buffer.hpp" #include "openvino/runtime/properties.hpp" #include "openvino/runtime/threading/istreams_executor.hpp" @@ -36,6 +37,12 @@ static constexpr Property, PropertyMutability::RO> cac */ static constexpr Property caching_with_mmap{"CACHING_WITH_MMAP"}; +/** + * @brief Property to get a ov::AlignedBuffer with cached model + * @ingroup ov_dev_api_plugin_api + */ +static constexpr Property, PropertyMutability::RW> cached_model_buffer{"CACHED_MODEL_BUFFER"}; + /** * @brief Allow to create exclusive_async_requests with one executor * @ingroup ov_dev_api_plugin_api diff --git a/src/inference/src/cache_manager.hpp b/src/inference/src/cache_manager.hpp index c441811c3cfd02..82813e5dd4788f 100644 --- a/src/inference/src/cache_manager.hpp +++ b/src/inference/src/cache_manager.hpp @@ -69,7 +69,7 @@ class ICacheManager { /** * @brief Function passing created input stream */ - using StreamReader = std::function; + using StreamReader = std::function)>; /** * @brief Callback when OpenVINO intends to read model from cache @@ -143,10 +143,10 @@ class FileStorageCacheManager final : public ICacheManager { std::make_shared>>(mmap->data(), mmap->size(), mmap); OwningSharedStreamBuffer buf(shared_buffer); std::istream stream(&buf); - reader(stream); + reader(stream, shared_buffer); } else { std::ifstream stream(blob_file_name, std::ios_base::binary); - reader(stream); + reader(stream, nullptr); } } } diff --git a/src/inference/src/dev/core_impl.cpp b/src/inference/src/dev/core_impl.cpp index 244d27b5eebb67..673f6fd569a11e 100644 --- a/src/inference/src/dev/core_impl.cpp +++ b/src/inference/src/dev/core_impl.cpp @@ -1413,7 +1413,7 @@ ov::SoPtr ov::CoreImpl::load_model_from_cache( cacheContent.blobId, coreConfig.get_enable_mmap() && ov::util::contains(plugin.get_property(ov::internal::supported_properties), ov::internal::caching_with_mmap), - [&](std::istream& networkStream) { + [&](std::istream& networkStream, std::shared_ptr model_buffer) { OV_ITT_SCOPE(FIRST_INFERENCE, ov::itt::domains::LoadTime, "Core::load_model_from_cache::ReadStreamAndImport"); @@ -1459,6 +1459,9 @@ ov::SoPtr ov::CoreImpl::load_model_from_cache( update_config[ov::weights_path.name()] = weights_path; } } + if (model_buffer) { + update_config[ov::internal::cached_model_buffer.name()] = model_buffer; + } compiled_model = context ? plugin.import_model(networkStream, context, update_config) : plugin.import_model(networkStream, update_config); }); diff --git a/src/inference/tests/functional/caching_test.cpp b/src/inference/tests/functional/caching_test.cpp index 5b01af9a22cde8..6b1c7f938ae731 100644 --- a/src/inference/tests/functional/caching_test.cpp +++ b/src/inference/tests/functional/caching_test.cpp @@ -2424,6 +2424,142 @@ TEST_P(CachingTest, Load_threads) { std::cout << "Caching Load multiple threads test completed. Tried " << index << " times" << std::endl; } +TEST_P(CachingTest, Load_mmap) { + ON_CALL(*mockPlugin, import_model(_, _)).WillByDefault(Invoke([&](std::istream& istr, const ov::AnyMap& config) { + if (m_checkConfigCb) { + m_checkConfigCb(config); + } + std::shared_ptr model_buffer; + if (config.count(ov::internal::cached_model_buffer.name())) + model_buffer = config.at(ov::internal::cached_model_buffer.name()).as>(); + EXPECT_TRUE(model_buffer); + + std::string name; + istr >> name; + char space; + istr.read(&space, 1); + std::lock_guard lock(mock_creation_mutex); + return create_mock_compiled_model(m_models[name], mockPlugin); + })); + + ON_CALL(*mockPlugin, get_property(ov::internal::supported_properties.name(), _)) + .WillByDefault(Invoke([&](const std::string&, const ov::AnyMap&) { + return std::vector{ov::internal::caching_properties.name(), + ov::internal::caching_with_mmap.name()}; + })); + EXPECT_CALL(*mockPlugin, get_property(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, query_model(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::device::architecture.name(), _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::internal::caching_properties.name(), _)).Times(AnyNumber()); + if (m_remoteContext) { + return; // skip the remote Context test for Multi plugin + } + int index = 0; + m_post_mock_net_callbacks.emplace_back([&](MockICompiledModelImpl& net) { + EXPECT_CALL(net, export_model(_)).Times(1); + }); + MkDirGuard guard(m_cacheDir); + EXPECT_CALL(*mockPlugin, compile_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, compile_model(A&>(), _)).Times(1); + EXPECT_CALL(*mockPlugin, import_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, import_model(_, _)).Times(1); + testLoad([&](ov::Core& core) { + core.set_property({{ov::cache_dir.name(), m_cacheDir}}); + m_testFunction(core); + m_testFunction(core); + }); + std::cout << "Caching Load multiple threads test completed. Tried " << index << " times" << std::endl; +} + +TEST_P(CachingTest, Load_mmap_is_disabled) { + ON_CALL(*mockPlugin, import_model(_, _)).WillByDefault(Invoke([&](std::istream& istr, const ov::AnyMap& config) { + if (m_checkConfigCb) { + m_checkConfigCb(config); + } + std::shared_ptr model_buffer; + if (config.count(ov::internal::cached_model_buffer.name())) + model_buffer = config.at(ov::internal::cached_model_buffer.name()).as>(); + EXPECT_FALSE(model_buffer); + + std::string name; + istr >> name; + char space; + istr.read(&space, 1); + std::lock_guard lock(mock_creation_mutex); + return create_mock_compiled_model(m_models[name], mockPlugin); + })); + ON_CALL(*mockPlugin, get_property(ov::internal::supported_properties.name(), _)) + .WillByDefault(Invoke([&](const std::string&, const ov::AnyMap&) { + return std::vector{ov::internal::caching_properties.name(), + ov::internal::caching_with_mmap.name()}; + })); + EXPECT_CALL(*mockPlugin, get_property(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, query_model(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::device::architecture.name(), _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::internal::caching_properties.name(), _)).Times(AnyNumber()); + if (m_remoteContext) { + return; // skip the remote Context test for Multi plugin + } + int index = 0; + m_post_mock_net_callbacks.emplace_back([&](MockICompiledModelImpl& net) { + EXPECT_CALL(net, export_model(_)).Times(1); + }); + MkDirGuard guard(m_cacheDir); + EXPECT_CALL(*mockPlugin, compile_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, compile_model(A&>(), _)).Times(1); + EXPECT_CALL(*mockPlugin, import_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, import_model(_, _)).Times(1); + testLoad([&](ov::Core& core) { + core.set_property({{ov::cache_dir.name(), m_cacheDir}}); + core.set_property({ov::enable_mmap(false)}); + m_testFunction(core); + m_testFunction(core); + }); + std::cout << "Caching Load multiple threads test completed. Tried " << index << " times" << std::endl; +} + +TEST_P(CachingTest, Load_mmap_is_not_supported_by_plugin) { + ON_CALL(*mockPlugin, import_model(_, _)).WillByDefault(Invoke([&](std::istream& istr, const ov::AnyMap& config) { + if (m_checkConfigCb) { + m_checkConfigCb(config); + } + std::shared_ptr model_buffer; + if (config.count(ov::internal::cached_model_buffer.name())) + model_buffer = config.at(ov::internal::cached_model_buffer.name()).as>(); + EXPECT_FALSE(model_buffer); + + std::string name; + istr >> name; + char space; + istr.read(&space, 1); + std::lock_guard lock(mock_creation_mutex); + return create_mock_compiled_model(m_models[name], mockPlugin); + })); + EXPECT_CALL(*mockPlugin, get_property(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, query_model(_, _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::device::architecture.name(), _)).Times(AnyNumber()); + EXPECT_CALL(*mockPlugin, get_property(ov::internal::caching_properties.name(), _)).Times(AnyNumber()); + if (m_remoteContext) { + return; // skip the remote Context test for Multi plugin + } + int index = 0; + m_post_mock_net_callbacks.emplace_back([&](MockICompiledModelImpl& net) { + EXPECT_CALL(net, export_model(_)).Times(1); + }); + MkDirGuard guard(m_cacheDir); + EXPECT_CALL(*mockPlugin, compile_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, compile_model(A&>(), _)).Times(1); + EXPECT_CALL(*mockPlugin, import_model(_, _, _)).Times(0); + EXPECT_CALL(*mockPlugin, import_model(_, _)).Times(1); + testLoad([&](ov::Core& core) { + core.set_property({{ov::cache_dir.name(), m_cacheDir}}); + core.set_property({ov::enable_mmap(true)}); + m_testFunction(core); + m_testFunction(core); + }); + std::cout << "Caching Load multiple threads test completed. Tried " << index << " times" << std::endl; +} + #if defined(ENABLE_OV_IR_FRONTEND) static std::string getTestCaseName(const testing::TestParamInfo>& obj) { diff --git a/src/plugins/intel_cpu/src/plugin.cpp b/src/plugins/intel_cpu/src/plugin.cpp index 6fdbf7a4ea4dee..33cb87b337bfef 100644 --- a/src/plugins/intel_cpu/src/plugin.cpp +++ b/src/plugins/intel_cpu/src/plugin.cpp @@ -565,8 +565,16 @@ std::shared_ptr Plugin::import_model(std::istream& model_str decript_from_string = true; } + auto _config = config; + std::shared_ptr model_buffer; + if (_config.count(ov::internal::cached_model_buffer.name())) { + model_buffer = _config.at(ov::internal::cached_model_buffer.name()).as>(); + _config.erase(ov::internal::cached_model_buffer.name()); + } + ModelDeserializer deserializer( model_stream, + model_buffer, [this](const std::shared_ptr& model, const std::shared_ptr& weights) { return get_core()->read_model(model, weights); }, @@ -579,7 +587,6 @@ std::shared_ptr Plugin::import_model(std::istream& model_str Config::ModelType modelType = getModelType(model); conf.applyRtInfo(model); // check ov::loaded_from_cache property and erase it to avoid exception in readProperties. - auto _config = config; const auto& it = _config.find(ov::loaded_from_cache.name()); bool loaded_from_cache = false; if (it != _config.end()) { diff --git a/src/plugins/intel_cpu/src/utils/serialize.cpp b/src/plugins/intel_cpu/src/utils/serialize.cpp index 814e8d19311a8c..33d8140fbe4a84 100644 --- a/src/plugins/intel_cpu/src/utils/serialize.cpp +++ b/src/plugins/intel_cpu/src/utils/serialize.cpp @@ -30,8 +30,12 @@ void ModelSerializer::operator<<(const std::shared_ptr& model) { ////////// ModelDeserializer ////////// -ModelDeserializer::ModelDeserializer(std::istream& model_stream, ModelBuilder fn, const CacheDecrypt& decrypt_fn, bool decript_from_string) - : m_istream(model_stream), m_model_builder(std::move(fn)), m_decript_from_string(decript_from_string) { +ModelDeserializer::ModelDeserializer(std::istream& model_stream, + std::shared_ptr model_buffer, + ModelBuilder fn, + const CacheDecrypt& decrypt_fn, + bool decript_from_string) + : m_istream(model_stream), m_model_builder(std::move(fn)), m_decript_from_string(decript_from_string), m_model_buffer(model_buffer) { if (m_decript_from_string) { m_cache_decrypt.m_decrypt_str = decrypt_fn.m_decrypt_str; } else { @@ -42,9 +46,8 @@ ModelDeserializer::ModelDeserializer(std::istream& model_stream, ModelBuilder fn void ModelDeserializer::set_info(pugi::xml_node& root, std::shared_ptr& model) {} void ModelDeserializer::operator>>(std::shared_ptr& model) { - if (auto mmap_buffer = dynamic_cast(m_istream.rdbuf())) { - auto buffer = mmap_buffer->get_buffer(); - process_mmap(model, buffer); + if (m_model_buffer) { + process_mmap(model, m_model_buffer); } else { process_stream(model); } diff --git a/src/plugins/intel_cpu/src/utils/serialize.hpp b/src/plugins/intel_cpu/src/utils/serialize.hpp index 897a2c2e52f092..4dfdd6b22afbd4 100644 --- a/src/plugins/intel_cpu/src/utils/serialize.hpp +++ b/src/plugins/intel_cpu/src/utils/serialize.hpp @@ -31,7 +31,11 @@ class ModelDeserializer { public: typedef std::function(const std::shared_ptr&, const std::shared_ptr&)> ModelBuilder; - ModelDeserializer(std::istream& model, ModelBuilder fn, const CacheDecrypt& encrypt_fn, bool decript_from_string); + ModelDeserializer(std::istream& model, + std::shared_ptr model_buffer, + ModelBuilder fn, + const CacheDecrypt& encrypt_fn, + bool decript_from_string); virtual ~ModelDeserializer() = default; @@ -48,6 +52,7 @@ class ModelDeserializer { ModelBuilder m_model_builder; CacheDecrypt m_cache_decrypt; bool m_decript_from_string; + std::shared_ptr m_model_buffer; }; } // namespace intel_cpu diff --git a/src/plugins/intel_gpu/src/plugin/plugin.cpp b/src/plugins/intel_gpu/src/plugin/plugin.cpp index c8839472a6d962..9f9c9692b57b42 100644 --- a/src/plugins/intel_gpu/src/plugin/plugin.cpp +++ b/src/plugins/intel_gpu/src/plugin/plugin.cpp @@ -329,6 +329,12 @@ std::shared_ptr Plugin::import_model(std::istream& model, _orig_config.erase(it); } + std::shared_ptr model_buffer; + if (_orig_config.count(ov::internal::cached_model_buffer.name())) { + model_buffer = _orig_config.at(ov::internal::cached_model_buffer.name()).as>(); + _orig_config.erase(ov::internal::cached_model_buffer.name()); + } + ExecutionConfig config = m_configs_map.at(device_id); config.set_user_property(_orig_config); config.apply_user_properties(context_impl->get_engine().get_device_info()); From 348469ffca697c7b2401814e3938f104c28c31fe Mon Sep 17 00:00:00 2001 From: Evgeny Kotov Date: Tue, 10 Dec 2024 13:25:13 +0100 Subject: [PATCH 02/31] added code to dump start and end manager time (#27884) ### Details: - modify class Profiler, add additional time info dumping ### Tickets: - 157579 Co-authored-by: Ivan Tikhonov --- src/core/src/pass/manager.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/src/pass/manager.cpp b/src/core/src/pass/manager.cpp index 9168292f5284c0..a6f1fc287e221c 100644 --- a/src/core/src/pass/manager.cpp +++ b/src/core/src/pass/manager.cpp @@ -104,8 +104,8 @@ class stopwatch { void stop() { if (m_active) { - auto end_time = m_clock.now(); - m_last_time = end_time - m_start_time; + m_end_time = m_clock.now(); + m_last_time = m_end_time - m_start_time; m_active = false; } } @@ -122,9 +122,17 @@ class stopwatch { return std::chrono::duration_cast(get_timer_value()).count(); } + std::chrono::nanoseconds get_start_time() const { + return std::chrono::duration_cast(m_start_time.time_since_epoch()); + } + + std::chrono::nanoseconds get_end_time() const { + return std::chrono::duration_cast(m_end_time.time_since_epoch()); + } + private: std::chrono::high_resolution_clock m_clock; - std::chrono::time_point m_start_time; + std::chrono::time_point m_start_time, m_end_time; bool m_active = false; std::chrono::nanoseconds m_last_time = std::chrono::high_resolution_clock::duration::zero(); }; @@ -221,6 +229,8 @@ class Profiler { if (is_pass_manager) { m_file << "m;" << name << ";" << stopwatch.get_timer_value().count() << ";" << (applied ? "1" : "0") << std::endl; + m_file << "m_start;" << name << ";" << stopwatch.get_start_time().count() << std::endl; + m_file << "m_end;" << name << ";" << stopwatch.get_end_time().count() << std::endl; } else { m_file << "t;" << name << ";" << m_manager_name << ";" << stopwatch.get_timer_value().count() << ";" << (applied ? "1" : "0") << std::endl; From 59188b77a95b50e68265317823668c46927ec1f5 Mon Sep 17 00:00:00 2001 From: Andrii Staikov Date: Tue, 10 Dec 2024 13:48:42 +0100 Subject: [PATCH 03/31] [TRANSFORMATIONS] Allow NOP-elimination for shapes with dynamic 0th dimension (#27939) NOP-elimination doesn't allow the removal of unnecessary data-movement operations stacked on top of each other if their shapes are dynamic, even though certain cases of dynamic shapes can be covered by NOP-elimination. Allow NOP-elimination for dynamic shapes if they have only the 0th dimension dynamic and other static, making this case compatible for such a fusion. - Tickets: * CVS-158394 Signed-off-by: Andrii Staikov --------- Signed-off-by: Andrii Staikov --- .../common_optimizations/nop_elimination.cpp | 40 +++++++++++++++---- .../common_optimizations/nop_elimination.cpp | 32 +++++++++++++++ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/common/transformations/src/transformations/common_optimizations/nop_elimination.cpp b/src/common/transformations/src/transformations/common_optimizations/nop_elimination.cpp index 8b26d74dc2aac6..3883e94b74d33c 100644 --- a/src/common/transformations/src/transformations/common_optimizations/nop_elimination.cpp +++ b/src/common/transformations/src/transformations/common_optimizations/nop_elimination.cpp @@ -132,6 +132,23 @@ static bool eliminate_nop(const shared_ptr& node) { return false; } +// Check if first dim is dynamic, other dims are static +static bool only_first_dim_dynamic(const PartialShape& pshape) { + if (pshape.rank().is_static() && pshape.size() > 0) { + if (pshape[0].is_dynamic()) { + for (size_t i = 1; i < pshape.size(); ++i) { + if (pshape[i].is_dynamic()) { + return false; + } + } + + return true; + } + } + + return false; +} + static bool eliminate_reshape_v1(const shared_ptr& node) { auto input = node->input_value(0); @@ -139,14 +156,17 @@ static bool eliminate_reshape_v1(const shared_ptr& node) { if (input.get_partial_shape().same_scheme(node->get_output_partial_shape(0))) return replace_output_update_name(node->output(0), input); } - // check if reshape is not identity op if (input.get_partial_shape().is_dynamic() || node->get_output_partial_shape(0).is_dynamic()) { - OPENVINO_DEBUG(node, " has dynamic shapes."); - return false; + if (!only_first_dim_dynamic(input.get_partial_shape()) || + !only_first_dim_dynamic(node->get_output_partial_shape(0))) { + OPENVINO_DEBUG(node, " has dynamic shapes with not only 0th dimension dynamic."); + return false; + } } + // remove identity op - if (input.get_shape() == node->get_output_shape(0)) { + if (input.get_partial_shape() == node->get_output_partial_shape(0)) { return replace_output_update_name(node->output(0), input); } // eliminate redundant reshape, squeeze, or unsqueeze @@ -156,15 +176,19 @@ static bool eliminate_reshape_v1(const shared_ptr& node) { if (input_node->get_output_target_inputs(0).size() != 1) return false; - auto shape = node->get_output_shape(0); + auto shape = node->get_output_partial_shape(0); // remove interchangeable nodes - if (input_node->get_input_partial_shape(0).is_static() && input_node->get_input_shape(0) == shape) { + if (input_node->get_input_partial_shape(0).is_static() && + input_node->get_input_partial_shape(0) == node->get_output_partial_shape(0)) { return replace_output_update_name(node->output(0), input_node->input_value(0)); } else { vector vi; - vi.assign(shape.begin(), shape.end()); - auto pat = ov::op::v0::Constant::create(element::i64, Shape{vi.size()}, vi); + vi.reserve(shape.size()); + for (const auto& dim : shape) { + vi.push_back(dim.is_dynamic() ? -1 : dim.get_length()); + } + auto pat = ov::op::v0::Constant::create(element::i64, Shape{shape.size()}, vi); auto new_reshape = make_shared(input.get_node()->input_value(0), pat, false); new_reshape->set_friendly_name(node->get_friendly_name()); copy_runtime_info({input_node, node}, new_reshape); diff --git a/src/common/transformations/tests/common_optimizations/nop_elimination.cpp b/src/common/transformations/tests/common_optimizations/nop_elimination.cpp index 19b5fefd79b9b0..1245bd26e0d3b2 100644 --- a/src/common/transformations/tests/common_optimizations/nop_elimination.cpp +++ b/src/common/transformations/tests/common_optimizations/nop_elimination.cpp @@ -233,6 +233,38 @@ TEST(nop_elimination, squeeze_unsqueeze_elimination_dynamic_without_squeeze_axis EXPECT_NO_THROW(pass_manager.run_passes(f)); } +TEST_F(TransformationTestsF, reshape_reshape_elimination_v1_dynamic) { + { + auto input = make_shared(element::f32, PartialShape({-1, 32, 1, 128})); + + auto top_reshape_const = op::v0::Constant::create(element::i32, Shape{4}, {-1, 32, 1, 128}); + auto top_reshape = std::make_shared(input, top_reshape_const, false); + + auto bottom_reshape_const = op::v0::Constant::create(element::i32, Shape{2}, {-1, 4096}); + auto bottom_reshape = std::make_shared(top_reshape, bottom_reshape_const, false); + + auto add_param = make_shared(element::f32, PartialShape({-1, 4096})); + auto add = std::make_shared(bottom_reshape, add_param); + model = std::make_shared(NodeVector{add}, ParameterVector{input, add_param}); + } + { + auto input = make_shared(element::f32, PartialShape({-1, 32, 1, 128})); + + auto bottom_reshape_const = op::v0::Constant::create(element::i32, Shape{2}, {-1, 4096}); + auto bottom_reshape = std::make_shared(input, bottom_reshape_const, false); + + auto add_param = make_shared(element::f32, PartialShape({-1, 4096})); + auto add = std::make_shared(bottom_reshape, add_param); + model_ref = std::make_shared(NodeVector{add}, ParameterVector{input, add_param}); + } + + manager.register_pass(); + manager.run_passes(model); + + auto res = comparator.compare(model, model_ref); + ASSERT_TRUE(res.valid) << res.message; +} + TEST(nop_elimination, reshape_elimination_v1_dynamic_negative) { auto arg = std::make_shared(element::i64, PartialShape::dynamic()); auto pattern = make_shared(element::i64, PartialShape::dynamic(1)); From 535f807ea45c9c6e8e6cbe198ba12b215a4d59d8 Mon Sep 17 00:00:00 2001 From: Sebastian Golebiewski Date: Tue, 10 Dec 2024 13:57:16 +0100 Subject: [PATCH 04/31] [DOCS] Updating notebooks (#28002) --- docs/nbdoc/consts.py | 2 +- .../3D-pose-estimation-with-output.rst | 61 +- ...-segmentation-point-clouds-with-output.rst | 6 +- ...entation-point-clouds-with-output_11_1.png | 3 + .../action-recognition-webcam-with-output.rst | 6 +- ...on-recognition-webcam-with-output_22_0.png | 4 +- docs/notebooks/all_notebooks_paths.txt | 12 +- docs/notebooks/animate-anyone-with-output.rst | 263 ++++---- docs/notebooks/async-api-with-output.rst | 63 +- .../async-api-with-output_23_0.png | 4 +- docs/notebooks/auto-device-with-output.rst | 48 +- .../auto-device-with-output_14_0.png | 3 + .../auto-device-with-output_27_0.png | 4 +- .../auto-device-with-output_28_0.png | 4 +- ...visual-language-processing-with-output.rst | 4 +- docs/notebooks/catvton-with-output.rst | 53 +- ...ontrolnet-stable-diffusion-with-output.rst | 7 +- .../convert-to-openvino-with-output.rst | 8 +- .../convnext-classification-with-output.rst | 2 +- ...ss-lingual-books-alignment-with-output.rst | 6 +- ...segmentation-quantize-nncf-with-output.rst | 70 +-- ...ntation-quantize-nncf-with-output_37_1.png | 4 +- ...ddcolor-image-colorization-with-output.rst | 46 +- .../depth-anything-v2-with-output.rst | 52 +- docs/notebooks/depth-anything-with-output.rst | 32 +- .../detectron2-to-openvino-with-output.rst | 152 ++--- ...etectron2-to-openvino-with-output_22_0.jpg | 4 +- ...etectron2-to-openvino-with-output_22_0.png | 4 +- ...etectron2-to-openvino-with-output_32_0.jpg | 4 +- ...etectron2-to-openvino-with-output_32_0.png | 4 +- ...micrafter-animating-images-with-output.rst | 339 +++++++---- docs/notebooks/efficient-sam-with-output.rst | 88 +-- .../efficient-sam-with-output_17_1.png | 4 +- .../efficient-sam-with-output_25_1.png | 4 +- .../efficient-sam-with-output_36_1.png | 4 +- .../encodec-audio-compression-with-output.rst | 20 +- .../fast-segment-anything-with-output.rst | 37 +- docs/notebooks/florence2-with-output.rst | 38 +- .../florence2-with-output_18_0.png | 4 +- .../freevc-voice-conversion-with-output.rst | 42 +- docs/notebooks/glm-edge-v-with-output.rst | 516 ++++++++++++++++ .../glm-edge-v-with-output_13_1.jpg | 3 + .../glm-edge-v-with-output_13_1.png | 3 + .../grounded-segment-anything-with-output.rst | 26 +- .../notebooks/handwritten-ocr-with-output.rst | 8 +- .../notebooks/hello-detection-with-output.rst | 6 +- .../hello-detection-with-output_11_0.png | 3 + .../hello-segmentation-with-output.rst | 10 +- .../hello-segmentation-with-output_11_1.png | 3 + docs/notebooks/hello-world-with-output.rst | 8 +- .../hello-world-with-output_11_0.png | 3 + .../hugging-face-hub-with-output.rst | 101 +-- ...nyuan-dit-image-generation-with-output.rst | 1 + ...lassification-quantization-with-output.rst | 44 +- docs/notebooks/instant-id-with-output.rst | 2 +- ...anus-multimodal-generation-with-output.rst | 472 +++++++++++++++ ...multimodal-generation-with-output_14_1.jpg | 3 + ...multimodal-generation-with-output_14_1.png | 3 + ...multimodal-generation-with-output_18_0.jpg | 3 + ...multimodal-generation-with-output_18_0.png | 3 + ...classification-to-openvino-with-output.rst | 354 +++++++++++ ...ification-to-openvino-with-output_16_0.jpg | 3 + ...ification-to-openvino-with-output_16_0.png | 3 + .../knowledge-graphs-conve-with-output.rst | 40 +- ...modal-large-language-model-with-output.rst | 30 +- ...-large-language-model-with-output_29_1.jpg | 4 +- ...-large-language-model-with-output_29_1.png | 4 +- ...-large-language-model-with-output_48_1.png | 4 +- ...l-large-language-model-with-output_8_0.jpg | 4 +- ...l-large-language-model-with-output_8_0.png | 4 +- .../language-quantize-bert-with-output.rst | 67 +- ...a-multimodal-chatbot-genai-with-output.rst | 2 +- ...va-next-multimodal-chatbot-with-output.rst | 6 +- .../llm-agent-rag-llamaindex-with-output.rst | 2 +- .../llm-agent-react-langchain-with-output.rst | 236 ++++---- .../notebooks/llm-agent-react-with-output.rst | 86 ++- .../llm-chatbot-generate-api-with-output.rst | 83 ++- docs/notebooks/llm-chatbot-with-output.rst | 15 +- docs/notebooks/localai-with-output.rst | 220 +++++++ ...a-content-type-recognition-with-output.rst | 2 +- docs/notebooks/meter-reader-with-output.rst | 8 +- ...nicpm-v-multimodal-chatbot-with-output.rst | 2 +- .../mobileclip-video-search-with-output.rst | 97 ++- ...bileclip-video-search-with-output_12_0.png | 3 + .../modelscope-to-openvino-with-output.rst | 560 +++++++++++++++++ ...odelscope-to-openvino-with-output_12_0.jpg | 3 + ...odelscope-to-openvino-with-output_12_0.png | 3 + .../music-generation-with-output.rst | 12 +- ...o-llava-multimodal-chatbot-with-output.rst | 21 +- .../notebooks_with_binder_buttons.txt | 1 - .../notebooks_with_colab_buttons.txt | 2 - .../object-detection-with-output.rst | 14 +- docs/notebooks/omniparser-with-output.rst | 79 ++- docs/notebooks/openvino-api-with-output.rst | 56 +- docs/notebooks/openvoice-with-output.rst | 85 ++- ...ical-character-recognition-with-output.rst | 6 +- .../optimize-preprocessing-with-output.rst | 14 +- .../outetts-text-to-speech-with-output.rst | 367 +++++++++++ .../paddle-ocr-webcam-with-output.rst | 8 +- .../paddle-ocr-webcam-with-output_30_0.png | 4 +- ...to-openvino-classification-with-output.rst | 18 +- .../parler-tts-text-to-speech-with-output.rst | 221 ++++++- .../notebooks/person-tracking-with-output.rst | 133 ++-- .../person-tracking-with-output_25_0.png | 4 +- docs/notebooks/phi-3-vision-with-output.rst | 31 +- docs/notebooks/photo-maker-with-output.rst | 41 +- docs/notebooks/pixart-with-output.rst | 48 +- .../pixart-with-output_6_0.jpg | 4 +- .../pixart-with-output_6_0.png | 4 +- docs/notebooks/pixtral-with-output.rst | 65 +- .../notebooks/pose-estimation-with-output.rst | 4 +- .../pose-estimation-with-output_22_0.png | 4 +- .../pytorch-onnx-to-openvino-with-output.rst | 16 +- ...training-quantization-nncf-with-output.rst | 118 ++-- ...uantization-aware-training-with-output.rst | 89 +-- ...on-sparsity-aware-training-with-output.rst | 365 ++++++----- .../pytorch-to-openvino-with-output.rst | 14 +- docs/notebooks/qrcode-monster-with-output.rst | 110 ++-- .../qrcode-monster-with-output_22_1.jpg | 4 +- .../qrcode-monster-with-output_22_1.png | 4 +- .../qrcode-monster-with-output_39_0.png | 4 +- docs/notebooks/qwen2-audio-with-output.rst | 25 +- docs/notebooks/qwen2-vl-with-output.rst | 79 ++- .../rmbg-background-removal-with-output.rst | 6 +- .../segment-anything-2-image-with-output.rst | 39 +- ...ment-anything-2-image-with-output_92_0.png | 3 + .../segment-anything-2-video-with-output.rst | 50 +- ...ment-anything-2-video-with-output_40_1.png | 4 +- ...ment-anything-2-video-with-output_46_0.png | 4 +- ...-shot-image-classification-with-output.rst | 10 +- ...-image-classification-with-output_24_1.png | 4 +- ...tch-to-image-pix2pix-turbo-with-output.rst | 50 +- ...o-image-pix2pix-turbo-with-output_19_0.jpg | 4 +- ...o-image-pix2pix-turbo-with-output_19_0.png | 4 +- .../sparsity-optimization-with-output.rst | 44 +- .../speculative-sampling-with-output.rst | 32 +- ...tion-quantization-wav2vec2-with-output.rst | 136 ++--- ...hbrain-emotion-recognition-with-output.rst | 26 +- ...e-cascade-image-generation-with-output.rst | 12 +- ...cade-image-generation-with-output_29_2.jpg | 4 +- ...cade-image-generation-with-output_29_2.png | 4 +- ...scade-image-generation-with-output_8_2.jpg | 3 + ...scade-image-generation-with-output_8_2.png | 3 + ...table-diffusion-ip-adapter-with-output.rst | 38 +- ...-diffusion-ip-adapter-with-output_22_1.png | 4 +- ...-diffusion-ip-adapter-with-output_25_0.png | 4 +- ...-diffusion-ip-adapter-with-output_28_0.png | 4 +- ...fusion-torchdynamo-backend-with-output.rst | 9 +- ...able-diffusion-v3-torch-fx-with-output.rst | 562 +++++++++++++++++ .../stable-diffusion-xl-with-output.rst | 6 +- docs/notebooks/style-transfer-with-output.rst | 6 +- .../style-transfer-with-output_25_0.png | 4 +- .../table-question-answering-with-output.rst | 56 +- ...fication-nncf-quantization-with-output.rst | 573 ++++++++++++++++++ ...ion-nncf-quantization-with-output_10_1.png | 3 + ...ion-nncf-quantization-with-output_27_1.png | 3 + ...tion-nncf-quantization-with-output_9_1.png | 3 + ...classification-to-openvino-with-output.rst | 6 +- ...ification-to-openvino-with-output_19_0.png | 3 + ...e-segmentation-to-openvino-with-output.rst | 10 +- ...mentation-to-openvino-with-output_39_0.png | 4 +- ...ject-detection-to-openvino-with-output.rst | 23 +- ...detection-to-openvino-with-output_38_0.png | 4 +- .../text-to-image-genai-with-output.rst | 62 +- ...tflite-selfie-segmentation-with-output.rst | 34 +- ...e-selfie-segmentation-with-output_33_0.png | 4 +- .../tflite-to-openvino-with-output.rst | 24 +- .../tiny-sd-image-generation-with-output.rst | 199 +++--- ...-detection-and-recognition-with-output.rst | 10 +- .../vision-background-removal-with-output.rst | 22 +- .../vision-monodepth-with-output.rst | 39 +- docs/notebooks/wav2lip-with-output.rst | 64 +- ...isper-subtitles-generation-with-output.rst | 19 +- .../yolov10-optimization-with-output.rst | 11 - ...ov11-instance-segmentation-with-output.rst | 98 ++- ...instance-segmentation-with-output_10_1.jpg | 3 + ...instance-segmentation-with-output_10_1.png | 3 + ...instance-segmentation-with-output_46_0.png | 4 +- ...yolov11-keypoint-detection-with-output.rst | 82 ++- ...11-keypoint-detection-with-output_43_0.png | 4 +- .../yolov11-object-detection-with-output.rst | 109 ++-- ...ov11-object-detection-with-output_10_1.jpg | 3 + ...ov11-object-detection-with-output_10_1.png | 3 + ...ov11-object-detection-with-output_43_0.png | 4 +- ...tion-with-accuracy-control-with-output.rst | 2 +- docs/notebooks/yolov8-obb-with-output.rst | 1 - .../yolov8-object-detection-with-output.rst | 12 +- .../yolov9-optimization-with-output.rst | 55 +- .../yolov9-optimization-with-output_36_0.png | 4 +- 189 files changed, 6678 insertions(+), 2619 deletions(-) create mode 100644 docs/notebooks/3D-segmentation-point-clouds-with-output_files/3D-segmentation-point-clouds-with-output_11_1.png create mode 100644 docs/notebooks/auto-device-with-output_files/auto-device-with-output_14_0.png create mode 100644 docs/notebooks/glm-edge-v-with-output.rst create mode 100644 docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.jpg create mode 100644 docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.png create mode 100644 docs/notebooks/hello-detection-with-output_files/hello-detection-with-output_11_0.png create mode 100644 docs/notebooks/hello-segmentation-with-output_files/hello-segmentation-with-output_11_1.png create mode 100644 docs/notebooks/hello-world-with-output_files/hello-world-with-output_11_0.png create mode 100644 docs/notebooks/janus-multimodal-generation-with-output.rst create mode 100644 docs/notebooks/janus-multimodal-generation-with-output_files/janus-multimodal-generation-with-output_14_1.jpg create mode 100644 docs/notebooks/janus-multimodal-generation-with-output_files/janus-multimodal-generation-with-output_14_1.png create mode 100644 docs/notebooks/janus-multimodal-generation-with-output_files/janus-multimodal-generation-with-output_18_0.jpg create mode 100644 docs/notebooks/janus-multimodal-generation-with-output_files/janus-multimodal-generation-with-output_18_0.png create mode 100644 docs/notebooks/jax-classification-to-openvino-with-output.rst create mode 100644 docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.jpg create mode 100644 docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.png create mode 100644 docs/notebooks/localai-with-output.rst create mode 100644 docs/notebooks/mobileclip-video-search-with-output_files/mobileclip-video-search-with-output_12_0.png create mode 100644 docs/notebooks/modelscope-to-openvino-with-output.rst create mode 100644 docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.jpg create mode 100644 docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.png create mode 100644 docs/notebooks/outetts-text-to-speech-with-output.rst create mode 100644 docs/notebooks/segment-anything-2-image-with-output_files/segment-anything-2-image-with-output_92_0.png create mode 100644 docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.jpg create mode 100644 docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.png create mode 100644 docs/notebooks/stable-diffusion-v3-torch-fx-with-output.rst create mode 100644 docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output.rst create mode 100644 docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_10_1.png create mode 100644 docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_27_1.png create mode 100644 docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_9_1.png create mode 100644 docs/notebooks/tensorflow-classification-to-openvino-with-output_files/tensorflow-classification-to-openvino-with-output_19_0.png create mode 100644 docs/notebooks/yolov11-instance-segmentation-with-output_files/yolov11-instance-segmentation-with-output_10_1.jpg create mode 100644 docs/notebooks/yolov11-instance-segmentation-with-output_files/yolov11-instance-segmentation-with-output_10_1.png create mode 100644 docs/notebooks/yolov11-object-detection-with-output_files/yolov11-object-detection-with-output_10_1.jpg create mode 100644 docs/notebooks/yolov11-object-detection-with-output_files/yolov11-object-detection-with-output_10_1.png diff --git a/docs/nbdoc/consts.py b/docs/nbdoc/consts.py index 1a4d3a13049041..e5c5d4773dce4c 100644 --- a/docs/nbdoc/consts.py +++ b/docs/nbdoc/consts.py @@ -6,7 +6,7 @@ repo_owner = "openvinotoolkit" repo_name = "openvino_notebooks" repo_branch = "tree/main" -artifacts_link = "http://repository.toolbox.iotg.sclab.intel.com/projects/ov-notebook/0.1.0-latest/20241120220806/dist/rst_files/" +artifacts_link = "http://repository.toolbox.iotg.sclab.intel.com/projects/ov-notebook/0.1.0-latest/20241209220902/dist/rst_files/" blacklisted_extensions = ['.xml', '.bin'] notebooks_repo = "https://github.com/openvinotoolkit/openvino_notebooks/blob/latest/" notebooks_binder = "https://mybinder.org/v2/gh/openvinotoolkit/openvino_notebooks/HEAD?filepath=" diff --git a/docs/notebooks/3D-pose-estimation-with-output.rst b/docs/notebooks/3D-pose-estimation-with-output.rst index 9e09d96094fc78..7959bf48a75e45 100644 --- a/docs/notebooks/3D-pose-estimation-with-output.rst +++ b/docs/notebooks/3D-pose-estimation-with-output.rst @@ -113,58 +113,57 @@ Lab instead.** Collecting torch Using cached https://download.pytorch.org/whl/cpu/torch-2.4.1%2Bcpu-cp38-cp38-linux_x86_64.whl (194.9 MB) Collecting tqdm - Using cached tqdm-4.67.0-py3-none-any.whl.metadata (57 kB) - Requirement already satisfied: ipywidgets>=7.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pythreejs) (8.1.5) + Using cached tqdm-4.67.1-py3-none-any.whl.metadata (57 kB) + Requirement already satisfied: ipywidgets>=7.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pythreejs) (8.1.5) Collecting ipydatawidgets>=1.1.1 (from pythreejs) Using cached ipydatawidgets-4.3.5-py2.py3-none-any.whl.metadata (1.4 kB) Collecting numpy (from pythreejs) Using cached numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB) - Requirement already satisfied: traitlets in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pythreejs) (5.14.3) + Requirement already satisfied: traitlets in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pythreejs) (5.14.3) Collecting openvino-telemetry>=2023.2.1 (from openvino>=2024.4.0) Using cached openvino_telemetry-2024.5.0-py3-none-any.whl.metadata (2.3 kB) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2024.4.0) (24.2) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2024.4.0) (24.2) Collecting filelock (from torch) Using cached filelock-3.16.1-py3-none-any.whl.metadata (2.9 kB) - Requirement already satisfied: typing-extensions>=4.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (4.12.2) + Requirement already satisfied: typing-extensions>=4.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (4.12.2) Collecting sympy (from torch) Using cached sympy-1.13.3-py3-none-any.whl.metadata (12 kB) Collecting networkx (from torch) Using cached https://download.pytorch.org/whl/networkx-3.2.1-py3-none-any.whl (1.6 MB) - Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1.4) + Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1.4) Collecting fsspec (from torch) Using cached fsspec-2024.10.0-py3-none-any.whl.metadata (11 kB) Collecting traittypes>=0.2.0 (from ipydatawidgets>=1.1.1->pythreejs) Using cached traittypes-0.2.1-py2.py3-none-any.whl.metadata (1.0 kB) - Requirement already satisfied: comm>=0.1.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (0.2.2) - Requirement already satisfied: ipython>=6.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (8.12.3) - Requirement already satisfied: widgetsnbextension~=4.0.12 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (4.0.13) - Requirement already satisfied: jupyterlab-widgets~=3.0.12 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (3.0.13) - Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch) (2.1.5) + Requirement already satisfied: comm>=0.1.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (0.2.2) + Requirement already satisfied: ipython>=6.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (8.12.3) + Requirement already satisfied: widgetsnbextension~=4.0.12 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (4.0.13) + Requirement already satisfied: jupyterlab-widgets~=3.0.12 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipywidgets>=7.2.1->pythreejs) (3.0.13) + Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch) (2.1.5) INFO: pip is looking at multiple versions of networkx to determine which version is compatible with other requirements. This could take a while. Collecting networkx (from torch) Using cached networkx-3.1-py3-none-any.whl.metadata (5.3 kB) Collecting mpmath<1.4,>=1.1.0 (from sympy->torch) Using cached https://download.pytorch.org/whl/mpmath-1.3.0-py3-none-any.whl (536 kB) - Requirement already satisfied: backcall in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.0) - Requirement already satisfied: decorator in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (5.1.1) - Requirement already satisfied: jedi>=0.16 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.19.2) - Requirement already satisfied: matplotlib-inline in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.1.7) - Requirement already satisfied: pickleshare in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.7.5) - Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (3.0.48) - Requirement already satisfied: pygments>=2.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (2.18.0) - Requirement already satisfied: stack-data in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.6.3) - Requirement already satisfied: pexpect>4.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (4.9.0) - Requirement already satisfied: parso<0.9.0,>=0.8.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.8.4) - Requirement already satisfied: ptyprocess>=0.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.7.0) - Requirement already satisfied: wcwidth in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.13) - Requirement already satisfied: executing>=1.2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (2.1.0) - Requirement already satisfied: asttokens>=2.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (2.4.1) - Requirement already satisfied: pure-eval in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.3) - Requirement already satisfied: six>=1.12.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from asttokens>=2.1.0->stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (1.16.0) + Requirement already satisfied: backcall in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.0) + Requirement already satisfied: decorator in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (5.1.1) + Requirement already satisfied: jedi>=0.16 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.19.2) + Requirement already satisfied: matplotlib-inline in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.1.7) + Requirement already satisfied: pickleshare in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.7.5) + Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (3.0.48) + Requirement already satisfied: pygments>=2.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (2.18.0) + Requirement already satisfied: stack-data in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.6.3) + Requirement already satisfied: pexpect>4.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (4.9.0) + Requirement already satisfied: parso<0.9.0,>=0.8.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.8.4) + Requirement already satisfied: ptyprocess>=0.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.7.0) + Requirement already satisfied: wcwidth in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.13) + Requirement already satisfied: executing>=1.2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (2.1.0) + Requirement already satisfied: asttokens>=2.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (3.0.0) + Requirement already satisfied: pure-eval in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.2.1->pythreejs) (0.2.3) Using cached pythreejs-2.4.2-py3-none-any.whl (3.4 MB) Using cached openvino-2024.4.0-16579-cp38-cp38-manylinux2014_x86_64.whl (42.6 MB) Using cached opencv_python-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (62.5 MB) - Using cached tqdm-4.67.0-py3-none-any.whl (78 kB) + Using cached tqdm-4.67.1-py3-none-any.whl (78 kB) Using cached ipydatawidgets-4.3.5-py2.py3-none-any.whl (271 kB) Using cached numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB) Using cached openvino_telemetry-2024.5.0-py3-none-any.whl (23 kB) @@ -174,7 +173,7 @@ Lab instead.** Using cached sympy-1.13.3-py3-none-any.whl (6.2 MB) Using cached traittypes-0.2.1-py2.py3-none-any.whl (8.6 kB) Installing collected packages: openvino-telemetry, mpmath, traittypes, tqdm, sympy, numpy, networkx, fsspec, filelock, torch, openvino, opencv-python, ipydatawidgets, pythreejs - Successfully installed filelock-3.16.1 fsspec-2024.10.0 ipydatawidgets-4.3.5 mpmath-1.3.0 networkx-3.1 numpy-1.24.4 opencv-python-4.10.0.84 openvino-2024.4.0 openvino-telemetry-2024.5.0 pythreejs-2.4.2 sympy-1.13.3 torch-2.4.1+cpu tqdm-4.67.0 traittypes-0.2.1 + Successfully installed filelock-3.16.1 fsspec-2024.10.0 ipydatawidgets-4.3.5 mpmath-1.3.0 networkx-3.1 numpy-1.24.4 opencv-python-4.10.0.84 openvino-2024.4.0 openvino-telemetry-2024.5.0 pythreejs-2.4.2 sympy-1.13.3 torch-2.4.1+cpu tqdm-4.67.1 traittypes-0.2.1 Note: you may need to restart the kernel to use updated packages. @@ -250,7 +249,7 @@ Download the model .. parsed-literal:: - model/human-pose-estimation-3d.tar.gz: 0%| | 0.00/17.6M [00:00`__ tackles the task of generating animation sequences from a single character image. It @@ -34,10 +36,14 @@ Learn more in `GitHub repo `__ and `paper `__. -.. warning:: +.. container:: alert alert-warning - This tutorial requires at least **96 GB** of RAM for model conversion and **40 GB** for inference. Changing the values of ``HEIGHT``, ``WIDTH`` and ``VIDEO_LENGTH`` variables will change the memory consumption but will also affect accuracy. + :: +

! WARNING !

+

+ This tutorial requires at least 96 GB of RAM for model conversion and 40 GB for inference. Changing the values of HEIGHT, WIDTH and VIDEO_LENGTH variables will change the memory consumption but will also affect accuracy. +

**Table of contents:** @@ -70,9 +76,6 @@ need a Jupyter server to start. For details, please refer to `Installation Guide `__. -.. |image0| image:: https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/animate-anyone/animate-anyone.gif - - Prerequisites ------------- @@ -110,13 +113,6 @@ Prerequisites %load_ext skip_kernel_extension - -.. parsed-literal:: - - Note: you may need to restart the kernel to use updated packages. - Note: you may need to restart the kernel to use updated packages. - - Note that we clone a fork of original repo with tweaked forward methods. .. code:: ipython3 @@ -171,9 +167,11 @@ Note that we clone a fork of original repo with tweaked forward methods. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/outputs.py:63: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead. + /home/itrushkin/.virtualenvs/test/lib/python3.10/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead. + torch.utils._pytree._register_pytree_node( + /home/itrushkin/.virtualenvs/test/lib/python3.10/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead. torch.utils._pytree._register_pytree_node( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/outputs.py:63: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead. + /home/itrushkin/.virtualenvs/test/lib/python3.10/site-packages/diffusers/utils/outputs.py:63: UserWarning: torch.utils._pytree._register_pytree_node is deprecated. Please use torch.utils._pytree.register_pytree_node instead. torch.utils._pytree._register_pytree_node( @@ -221,13 +219,6 @@ Prepare base model local_dir=local_dir, ) - - -.. parsed-literal:: - - diffusion_pytorch_model.bin: 0%| | 0.00/3.44G [00:00:2: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. - :6: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. - :9: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. - - Convert model to OpenVINO IR ---------------------------- @@ -423,7 +337,7 @@ semantic features are extracted through the CLIP image encoder for Cross-Attention. Temporal-Attention operates in the temporal dimension. Finally, the VAE decoder decodes the result into a video clip. -|image01| +.. image:: https://humanaigc.github.io/animate-anyone/static/images/f2_img.png The pipeline contains 6 PyTorch modules: @@ -463,8 +377,6 @@ compression parameters. More details about weights compression can be found in `OpenVINO documentation `__. -.. |image01| image:: https://humanaigc.github.io/animate-anyone/static/images/f2_img.png - .. code:: ipython3 %%skip not $SHOULD_CONVERT @@ -522,12 +434,14 @@ of the pipeline, it will be better to convert them to separate models. .. parsed-literal:: + WARNING:nncf:NNCF provides best results with torch==2.1.2, while current torch version is 2.2.2+cpu. If you encounter issues, consider switching to torch==2.1.2 INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (32 / 32) │ 100% (32 / 32) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (32 / 32) | 100% (32 / 32) | + +--------------+---------------------------+-----------------------------------+ @@ -543,6 +457,14 @@ of the pipeline, it will be better to convert them to separate models. + + + + + + + + .. code:: ipython3 %%skip not $SHOULD_CONVERT @@ -568,11 +490,12 @@ of the pipeline, it will be better to convert them to separate models. .. parsed-literal:: INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (40 / 40) │ 100% (40 / 40) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (40 / 40) | 100% (40 / 40) | + +--------------+---------------------------+-----------------------------------+ @@ -588,6 +511,14 @@ of the pipeline, it will be better to convert them to separate models. + + + + + + + + Reference UNet ~~~~~~~~~~~~~~ @@ -634,11 +565,12 @@ step. .. parsed-literal:: INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (270 / 270) │ 100% (270 / 270) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (270 / 270) | 100% (270 / 270) | + +--------------+---------------------------+-----------------------------------+ @@ -654,6 +586,14 @@ step. + + + + + + + + Denoising UNet ~~~~~~~~~~~~~~ @@ -727,11 +667,12 @@ step. .. parsed-literal:: INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (534 / 534) │ 100% (534 / 534) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (534 / 534) | 100% (534 / 534) | + +--------------+---------------------------+-----------------------------------+ @@ -747,6 +688,14 @@ step. + + + + + + + + Pose Guider ~~~~~~~~~~~ @@ -773,11 +722,12 @@ efficiently integrate pose control signals into the denoising process. .. parsed-literal:: INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (8 / 8) │ 100% (8 / 8) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (8 / 8) | 100% (8 / 8) | + +--------------+---------------------------+-----------------------------------+ @@ -793,6 +743,14 @@ efficiently integrate pose control signals into the denoising process. + + + + + + + + Image Encoder ~~~~~~~~~~~~~ @@ -818,19 +776,19 @@ required for both reference and denoising UNets. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /home/itrushkin/.virtualenvs/test/lib/python3.10/site-packages/transformers/modeling_utils.py:4225: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( - `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. .. parsed-literal:: INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (146 / 146) │ 100% (146 / 146) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + +--------------+---------------------------+-----------------------------------+ + | Num bits (N) | % all parameters (layers) | % ratio-defining parameters | + | | | (layers) | + +==============+===========================+===================================+ + | 8 | 100% (146 / 146) | 100% (146 / 146) | + +--------------+---------------------------+-----------------------------------+ @@ -846,6 +804,14 @@ required for both reference and denoising UNets. + + + + + + + + Inference --------- @@ -871,6 +837,15 @@ For starting work, please select inference device from dropdown list. device = device_widget() + + + +.. parsed-literal:: + + Dropdown(description='Device:', index=5, options=('CPU', 'GPU.0', 'GPU.1', 'GPU.2', 'GPU.3', 'AUTO'), value='A… + + + .. code:: ipython3 class OVPose2VideoPipeline(Pose2VideoPipeline): @@ -1168,7 +1143,7 @@ Video post-processing .. raw:: html @@ -1242,23 +1217,9 @@ Interactive inference demo = make_demo(fn=generate) try: - demo.queue().launch(debug=False) + demo.queue().launch(debug=True) except Exception: - demo.queue().launch(debug=False, share=True) + demo.queue().launch(debug=True, share=True) # if you are launching remotely, specify server_name and server_port # demo.launch(server_name='your server name', server_port='server port in int') # Read more in the docs: https://gradio.app/docs/" - - -.. parsed-literal:: - - Running on local URL: http://127.0.0.1:7860 - - To create a public link, set `share=True` in `launch()`. - - - - - - - diff --git a/docs/notebooks/async-api-with-output.rst b/docs/notebooks/async-api-with-output.rst index 9f9130a4fe0db2..86ff1bc0aa9b0c 100644 --- a/docs/notebooks/async-api-with-output.rst +++ b/docs/notebooks/async-api-with-output.rst @@ -59,7 +59,14 @@ Imports .. code:: ipython3 %pip install -q "openvino>=2023.1.0" - %pip install -q opencv-python "matplotlib>=3.4" + %pip install -q opencv-python tqdm "matplotlib>=3.4" + + +.. parsed-literal:: + + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + .. code:: ipython3 @@ -97,26 +104,36 @@ the person in each frame of the video. .. code:: ipython3 + from pathlib import Path + # directory where model will be downloaded base_model_dir = "model" # model name as named in Open Model Zoo model_name = "person-detection-0202" precision = "FP16" - model_path = f"model/intel/{model_name}/{precision}/{model_name}.xml" - download_command = f"omz_downloader " f"--name {model_name} " f"--precision {precision} " f"--output_dir {base_model_dir} " f"--cache_dir {base_model_dir}" - ! $download_command + model_path = Path("model") / f"{model_name}.xml" + + base_model_url = "https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1" + + if not Path(model_path).exists(): + utils.download_file(f"{base_model_url}/{model_name}/{precision}/{model_name}.xml", filename=model_path.name, directory=model_path.parent) + utils.download_file( + f"{base_model_url}/{model_name}/{precision}/{model_name}.bin", filename=model_path.name.replace(".xml", ".bin"), directory=model_path.parent + ) + .. parsed-literal:: - ################|| Downloading person-detection-0202 ||################ - - ========== Retrieving model/intel/person-detection-0202/FP16/person-detection-0202.xml from the cache - - ========== Retrieving model/intel/person-detection-0202/FP16/person-detection-0202.bin from the cache - - + person-detection-0202.xml: 0%| | 0.00/249k [00:00=4.30.2", "controlnet-aux>=0.0.6", "gradio>=3.36", + "datasets>=2.14.6", + "nncf>=2.7.0", + "opencv-python", "--extra-index-url", "https://download.pytorch.org/whl/cpu", ) - pip_install("openvino>=2023.1.0", "datasets>=2.14.6", "nncf>=2.7.0", "opencv-python") + pip_install("openvino>=2023.1.0") Instantiating Generation Pipeline --------------------------------- @@ -296,7 +299,7 @@ Now, let us check its result on example image: image_path = Path("example_image.jpg") if not image_path.exists(): - download_file(image_path, filename="example_image.jpg") + download_file(example_url, filename="example_image.jpg") img = Image.open(image_path) pose = pose_estimator(img) diff --git a/docs/notebooks/convert-to-openvino-with-output.rst b/docs/notebooks/convert-to-openvino-with-output.rst index 507dd407eae739..bc5a45f244e376 100644 --- a/docs/notebooks/convert-to-openvino-with-output.rst +++ b/docs/notebooks/convert-to-openvino-with-output.rst @@ -184,10 +184,10 @@ NLP model from Hugging Face and export it in ONNX format: .. parsed-literal:: - 2024-11-22 00:16:16.864961: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 00:16:16.903350: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-09 23:09:00.018226: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-09 23:09:00.080568: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 00:16:17.575066: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-09 23:09:00.743048: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT .. parsed-literal:: @@ -660,7 +660,7 @@ frameworks conversion guides. .. parsed-literal:: - 2024-11-22 00:16:33.997234: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1956] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. + 2024-12-09 23:09:17.262024: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1956] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. Skipping registering GPU devices... diff --git a/docs/notebooks/convnext-classification-with-output.rst b/docs/notebooks/convnext-classification-with-output.rst index 9466f30c22898e..1204ea2c17f106 100644 --- a/docs/notebooks/convnext-classification-with-output.rst +++ b/docs/notebooks/convnext-classification-with-output.rst @@ -192,7 +192,7 @@ And print results Predicted Class: 281 Predicted Label: n02123045 tabby, tabby cat - Predicted Probability: 0.5919997096061707 + Predicted Probability: 0.5351971983909607 Convert the model to OpenVINO Intermediate representation format diff --git a/docs/notebooks/cross-lingual-books-alignment-with-output.rst b/docs/notebooks/cross-lingual-books-alignment-with-output.rst index b116f0e1f5cda1..68f51ad137ff16 100644 --- a/docs/notebooks/cross-lingual-books-alignment-with-output.rst +++ b/docs/notebooks/cross-lingual-books-alignment-with-output.rst @@ -32,7 +32,7 @@ Prerequisites - ``requests`` - for getting books - ``pysbd`` - for splitting sentences -- ``transformers[torch]`` and ``openvino_dev`` - for getting sentence +- ``transformers[torch]`` and ``openvino`` - for getting sentence embeddings - ``seaborn`` - for alignment matrix visualization - ``ipywidgets`` - for displaying HTML and JS output in the notebook @@ -416,12 +416,12 @@ languages. It has the same architecture as the BERT model but has been trained on a different task: to produce identical embeddings for translation pairs. -|image01| +|image02| This makes LaBSE a great choice for our task and it can be reused for different language pairs still producing good results. -.. |image01| image:: https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/627d3a39-7076-479f-a7b1-392f49a0b83e +.. |image02| image:: https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/627d3a39-7076-479f-a7b1-392f49a0b83e .. code:: ipython3 diff --git a/docs/notebooks/ct-segmentation-quantize-nncf-with-output.rst b/docs/notebooks/ct-segmentation-quantize-nncf-with-output.rst index c3d645f1841a17..853da533385284 100644 --- a/docs/notebooks/ct-segmentation-quantize-nncf-with-output.rst +++ b/docs/notebooks/ct-segmentation-quantize-nncf-with-output.rst @@ -154,10 +154,10 @@ Imports .. parsed-literal:: - 2024-11-22 00:16:56.689204: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 00:16:56.724390: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-09 23:09:41.789833: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-09 23:09:41.824673: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 00:16:57.319913: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-09 23:09:42.418712: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT .. parsed-literal:: @@ -213,7 +213,7 @@ notebook `__. .. parsed-literal:: - pretrained_model/unet_kits19_state_dict.pth: 0%| | 0.00/7.58M [00:00`__. .. parsed-literal:: - /tmp/ipykernel_3514722/1592321960.py:3: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + /tmp/ipykernel_2165966/1592321960.py:3: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. state_dict = torch.load(state_dict_file, map_location=torch.device("cpu")) @@ -444,7 +444,7 @@ this notebook. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/monai/networks/nets/basic_unet.py:168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/monai/networks/nets/basic_unet.py:168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if x_e.shape[-i - 1] != x_0.shape[-i - 1]: @@ -526,18 +526,18 @@ Convert quantized model to OpenVINO IR model and save it. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/quantization/layers.py:340: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/quantization/layers.py:340: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! return self._level_low.item() - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/quantization/layers.py:348: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/quantization/layers.py:348: TracerWarning: Converting a tensor to a Python number might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! return self._level_high.item() - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/monai/networks/nets/basic_unet.py:168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/monai/networks/nets/basic_unet.py:168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if x_e.shape[-i - 1] != x_0.shape[-i - 1]: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: Tensor-likes are not close! - Mismatched elements: 247214 / 262144 (94.3%) - Greatest absolute difference: 4.1846349239349365 at index (0, 0, 379, 430) (up to 1e-05 allowed) - Greatest relative difference: 15984.079041034269 at index (0, 0, 447, 390) (up to 1e-05 allowed) + Mismatched elements: 250458 / 262144 (95.5%) + Greatest absolute difference: 3.8674159049987793 at index (0, 0, 351, 76) (up to 1e-05 allowed) + Greatest relative difference: 12206.866810726728 at index (0, 0, 144, 31) (up to 1e-05 allowed) _check_trace( @@ -663,7 +663,7 @@ be run in the notebook with ``! benchmark_app`` or [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.LATENCY. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 8.99 ms + [ INFO ] Read model took 8.90 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] x (node: x) : f32 / [...] / [1,1,512,512] @@ -677,7 +677,7 @@ be run in the notebook with ``! benchmark_app`` or [ INFO ] Model outputs: [ INFO ] ***NO_NAME*** (node: __module.final_conv/aten::_convolution/Add) : f32 / [...] / [1,1,512,512] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 240.78 ms + [ INFO ] Compile model took 264.91 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model0 @@ -714,17 +714,17 @@ be run in the notebook with ``! benchmark_app`` or [ INFO ] Fill input 'x' with random values [Step 10/11] Measuring performance (Start inference synchronously, limits: 15000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 49.70 ms + [ INFO ] First inference took 48.49 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 425 iterations - [ INFO ] Duration: 15023.51 ms + [ INFO ] Count: 431 iterations + [ INFO ] Duration: 15002.34 ms [ INFO ] Latency: - [ INFO ] Median: 34.55 ms - [ INFO ] Average: 35.13 ms - [ INFO ] Min: 34.21 ms - [ INFO ] Max: 47.23 ms - [ INFO ] Throughput: 28.29 FPS + [ INFO ] Median: 34.52 ms + [ INFO ] Average: 34.59 ms + [ INFO ] Min: 34.20 ms + [ INFO ] Max: 36.19 ms + [ INFO ] Throughput: 28.73 FPS .. code:: ipython3 @@ -750,7 +750,7 @@ be run in the notebook with ``! benchmark_app`` or [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.LATENCY. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 11.10 ms + [ INFO ] Read model took 10.56 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] x (node: x) : f32 / [...] / [1,1,512,512] @@ -764,7 +764,7 @@ be run in the notebook with ``! benchmark_app`` or [ INFO ] Model outputs: [ INFO ] ***NO_NAME*** (node: __module.final_conv/aten::_convolution/Add) : f32 / [...] / [1,1,512,512] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 251.41 ms + [ INFO ] Compile model took 248.98 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model49 @@ -801,17 +801,17 @@ be run in the notebook with ``! benchmark_app`` or [ INFO ] Fill input 'x' with random values [Step 10/11] Measuring performance (Start inference synchronously, limits: 15000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 29.68 ms + [ INFO ] First inference took 29.18 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 911 iterations - [ INFO ] Duration: 15009.49 ms + [ INFO ] Count: 908 iterations + [ INFO ] Duration: 15011.20 ms [ INFO ] Latency: - [ INFO ] Median: 15.73 ms - [ INFO ] Average: 16.27 ms - [ INFO ] Min: 15.41 ms - [ INFO ] Max: 24.40 ms - [ INFO ] Throughput: 60.69 FPS + [ INFO ] Median: 15.48 ms + [ INFO ] Average: 16.33 ms + [ INFO ] Min: 15.15 ms + [ INFO ] Max: 28.31 ms + [ INFO ] Throughput: 60.49 FPS Visually Compare Inference Results @@ -905,7 +905,7 @@ seed is displayed to enable reproducing specific runs of this cell. .. parsed-literal:: - Visualizing results with seed 1732231099 + Visualizing results with seed 1733782265 @@ -989,7 +989,7 @@ performs inference, and displays the results on the frames loaded in .. parsed-literal:: Loaded model to AUTO in 0.15 seconds. - Total time for 68 frames: 2.31 seconds, fps:29.91 + Total time for 68 frames: 2.32 seconds, fps:29.70 References diff --git a/docs/notebooks/ct-segmentation-quantize-nncf-with-output_files/ct-segmentation-quantize-nncf-with-output_37_1.png b/docs/notebooks/ct-segmentation-quantize-nncf-with-output_files/ct-segmentation-quantize-nncf-with-output_37_1.png index a0c854d6dd33f6..fc10c642d8d2a1 100644 --- a/docs/notebooks/ct-segmentation-quantize-nncf-with-output_files/ct-segmentation-quantize-nncf-with-output_37_1.png +++ b/docs/notebooks/ct-segmentation-quantize-nncf-with-output_files/ct-segmentation-quantize-nncf-with-output_37_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:588fb52eb7dcf0ede69419b9645ad6dc93526e8960af83679e12bac98e6817f6 -size 385527 +oid sha256:52955890ed558e516a361399057b8529ffd5103a7b63ed20a2549062b4d900b5 +size 386283 diff --git a/docs/notebooks/ddcolor-image-colorization-with-output.rst b/docs/notebooks/ddcolor-image-colorization-with-output.rst index cd3bf024065b55..11b92fe4897f5e 100644 --- a/docs/notebooks/ddcolor-image-colorization-with-output.rst +++ b/docs/notebooks/ddcolor-image-colorization-with-output.rst @@ -135,7 +135,7 @@ Prerequisites .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/timm/models/layers/__init__.py:48: FutureWarning: Importing from timm.models.layers is deprecated, please import via timm.layers + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/timm/models/layers/__init__.py:48: FutureWarning: Importing from timm.models.layers is deprecated, please import via timm.layers warnings.warn(f"Importing from {__name__} is deprecated, please import via timm.layers", FutureWarning) @@ -416,10 +416,10 @@ Perform model quantization .. parsed-literal:: - 2024-11-22 00:20:47.511999: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 00:20:47.551328: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-09 23:13:28.920989: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-09 23:13:28.960154: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 00:20:47.960841: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-09 23:13:29.365051: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT @@ -527,7 +527,7 @@ Tool + @@ -314,13 +313,13 @@ loading on device using ``core.complie_model``. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2_layers/patch_embed.py:73: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2_layers/patch_embed.py:73: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert H % patch_H == 0, f"Input image height {H} is not a multiple of patch height {patch_H}" - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2_layers/patch_embed.py:74: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2_layers/patch_embed.py:74: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert W % patch_W == 0, f"Input image width {W} is not a multiple of patch width: {patch_W}" - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2.py:183: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dinov2.py:183: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if npatch == N and w == h: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dpt.py:147: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/Depth-Anything-V2/depth_anything_v2/dpt.py:147: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! out = F.interpolate(out, (int(patch_h * 14), int(patch_w * 14)), mode="bilinear", align_corners=True) @@ -412,7 +411,7 @@ range. .. parsed-literal:: - + @@ -429,11 +428,10 @@ Run inference on video VIDEO_FILE = "./Coco Walking in Berkeley.mp4" - if not Path(VIDEO_FILE).exists(): - download_file( - "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/video/Coco%20Walking%20in%20Berkeley.mp4", - VIDEO_FILE, - ) + download_file( + "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/video/Coco%20Walking%20in%20Berkeley.mp4", + VIDEO_FILE, + ) # Number of seconds of input video to process. Set `NUM_SECONDS` to 0 to process # the full video. @@ -636,7 +634,7 @@ Run inference on video .. parsed-literal:: - Processed 60 frames in 13.34 seconds. Total FPS (including video processing): 4.50.Inference FPS: 10.65 + Processed 60 frames in 13.15 seconds. Total FPS (including video processing): 4.56.Inference FPS: 10.69 Video saved to 'output/Coco Walking in Berkeley_depth_anything.mp4'. @@ -663,7 +661,7 @@ Run inference on video .. parsed-literal:: Showing video saved at - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/output/Coco Walking in Berkeley_depth_anything.mp4 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/output/Coco Walking in Berkeley_depth_anything.mp4 If you cannot see the video in your browser, please click on the following link to download the video @@ -797,10 +795,10 @@ quantization code below may take some time. .. parsed-literal:: - 2024-11-22 00:29:02.540402: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 00:29:02.574640: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-09 23:21:25.394147: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-09 23:21:25.427427: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 00:29:03.160362: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-09 23:21:26.001101: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT @@ -926,10 +924,10 @@ data. .. parsed-literal:: - Processed 60 frames in 12.91 seconds. Total FPS (including video processing): 4.65.Inference FPS: 12.59 + Processed 60 frames in 12.60 seconds. Total FPS (including video processing): 4.76.Inference FPS: 13.15 Video saved to 'output/Coco Walking in Berkeley_depth_anything_int8.mp4'. Showing video saved at - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/output/Coco Walking in Berkeley_depth_anything.mp4 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/depth-anything/output/Coco Walking in Berkeley_depth_anything.mp4 If you cannot see the video in your browser, please click on the following link to download the video @@ -1009,9 +1007,9 @@ Tool =4.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (4.12.2) - Requirement already satisfied: sympy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (1.13.3) - Requirement already satisfied: networkx in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1) - Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1.4) - Requirement already satisfied: fsspec in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (2024.9.0) - Requirement already satisfied: numpy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchvision) (1.23.5) - Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchvision) (10.4.0) - Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch) (2.1.5) - Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from sympy->torch) (1.3.0) + Requirement already satisfied: torch in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (2.4.1+cpu) + Requirement already satisfied: torchvision in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (0.19.1+cpu) + Requirement already satisfied: opencv-python in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (4.10.0.84) + Requirement already satisfied: wheel in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (0.45.1) + Requirement already satisfied: filelock in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.16.1) + Requirement already satisfied: typing-extensions>=4.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (4.12.2) + Requirement already satisfied: sympy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (1.13.3) + Requirement already satisfied: networkx in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1) + Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (3.1.4) + Requirement already satisfied: fsspec in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch) (2024.9.0) + Requirement already satisfied: numpy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchvision) (1.23.5) + Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchvision) (10.4.0) + Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch) (2.1.5) + Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from sympy->torch) (1.3.0) Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cpu Collecting git+https://github.com/facebookresearch/detectron2.git - Cloning https://github.com/facebookresearch/detectron2.git to /tmp/pip-req-build-4klmx21d + Cloning https://github.com/facebookresearch/detectron2.git to /tmp/pip-req-build-89enhchj .. parsed-literal:: - Running command git clone --filter=blob:none --quiet https://github.com/facebookresearch/detectron2.git /tmp/pip-req-build-4klmx21d + Running command git clone --filter=blob:none --quiet https://github.com/facebookresearch/detectron2.git /tmp/pip-req-build-89enhchj .. parsed-literal:: @@ -125,73 +125,73 @@ Install required packages for running model Resolved https://github.com/facebookresearch/detectron2.git to commit c69939aa85460e8135f40bce908a6cddaa73065f Preparing metadata (setup.py): started Preparing metadata (setup.py): finished with status 'done' - Requirement already satisfied: Pillow>=7.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (10.4.0) - Requirement already satisfied: black in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (24.3.0) - Requirement already satisfied: cloudpickle in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (3.1.0) - Requirement already satisfied: fvcore<0.1.6,>=0.1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.1.5.post20221221) + Requirement already satisfied: Pillow>=7.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (10.4.0) + Requirement already satisfied: black in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (24.3.0) + Requirement already satisfied: cloudpickle in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (3.1.0) + Requirement already satisfied: fvcore<0.1.6,>=0.1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.1.5.post20221221) Collecting hydra-core>=1.1 (from detectron2==0.6) Using cached hydra_core-1.3.2-py3-none-any.whl.metadata (5.5 kB) Collecting iopath<0.1.10,>=0.1.7 (from detectron2==0.6) Using cached https://download.pytorch.org/whl/iopath-0.1.9-py3-none-any.whl (27 kB) - Requirement already satisfied: matplotlib in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (3.7.5) + Requirement already satisfied: matplotlib in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (3.7.5) Collecting omegaconf<2.4,>=2.1 (from detectron2==0.6) Using cached omegaconf-2.3.0-py3-none-any.whl.metadata (3.9 kB) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (24.2) - Requirement already satisfied: pycocotools>=2.0.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.0.7) - Requirement already satisfied: tabulate in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.9.0) - Requirement already satisfied: tensorboard in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.12.3) - Requirement already satisfied: termcolor>=1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.4.0) - Requirement already satisfied: tqdm>4.29.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (4.67.0) - Requirement already satisfied: yacs>=0.1.8 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.1.8) - Requirement already satisfied: numpy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2==0.6) (1.23.5) - Requirement already satisfied: pyyaml>=5.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2==0.6) (6.0.2) - Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.1->detectron2==0.6) (4.9.3) - Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.1->detectron2==0.6) (6.4.5) - Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath<0.1.10,>=0.1.7->detectron2==0.6) (3.0.0) - Requirement already satisfied: contourpy>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (1.1.1) - Requirement already satisfied: cycler>=0.10 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (0.12.1) - Requirement already satisfied: fonttools>=4.22.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (4.55.0) - Requirement already satisfied: kiwisolver>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (1.4.7) - Requirement already satisfied: pyparsing>=2.3.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (3.1.4) - Requirement already satisfied: python-dateutil>=2.7 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (2.9.0.post0) - Requirement already satisfied: click>=8.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (8.1.7) - Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (1.0.0) - Requirement already satisfied: pathspec>=0.9.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (0.12.1) - Requirement already satisfied: platformdirs>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (4.3.6) - Requirement already satisfied: tomli>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (2.1.0) - Requirement already satisfied: typing-extensions>=4.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (4.12.2) - Requirement already satisfied: absl-py>=0.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.4.0) - Requirement already satisfied: grpcio>=1.48.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.68.0) - Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (2.36.0) - Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.0.0) - Requirement already satisfied: markdown>=2.6.8 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.7) - Requirement already satisfied: protobuf>=3.19.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.20.3) - Requirement already satisfied: requests<3,>=2.21.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (2.32.3) - Requirement already satisfied: setuptools>=41.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (44.0.0) - Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (0.7.2) - Requirement already satisfied: werkzeug>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.0.6) - Requirement already satisfied: wheel>=0.26 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (0.45.0) - Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (5.5.0) - Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (0.4.1) - Requirement already satisfied: rsa<5,>=3.1.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (4.9) - Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard->detectron2==0.6) (2.0.0) - Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.1->detectron2==0.6) (3.20.2) - Requirement already satisfied: importlib-metadata>=4.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard->detectron2==0.6) (8.5.0) - Requirement already satisfied: six>=1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->detectron2==0.6) (1.16.0) - Requirement already satisfied: charset-normalizer<4,>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (3.4.0) - Requirement already satisfied: idna<4,>=2.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (3.10) - Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (2.2.3) - Requirement already satisfied: certifi>=2017.4.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (2024.8.30) - Requirement already satisfied: MarkupSafe>=2.1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from werkzeug>=1.0.1->tensorboard->detectron2==0.6) (2.1.5) - Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (0.6.1) - Requirement already satisfied: oauthlib>=3.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard->detectron2==0.6) (3.2.2) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (24.2) + Requirement already satisfied: pycocotools>=2.0.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.0.7) + Requirement already satisfied: tabulate in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.9.0) + Requirement already satisfied: tensorboard in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.12.3) + Requirement already satisfied: termcolor>=1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (2.4.0) + Requirement already satisfied: tqdm>4.29.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (4.67.1) + Requirement already satisfied: yacs>=0.1.8 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from detectron2==0.6) (0.1.8) + Requirement already satisfied: numpy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2==0.6) (1.23.5) + Requirement already satisfied: pyyaml>=5.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fvcore<0.1.6,>=0.1.5->detectron2==0.6) (6.0.2) + Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.1->detectron2==0.6) (4.9.3) + Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.1->detectron2==0.6) (6.4.5) + Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath<0.1.10,>=0.1.7->detectron2==0.6) (3.0.0) + Requirement already satisfied: contourpy>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (1.1.1) + Requirement already satisfied: cycler>=0.10 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (0.12.1) + Requirement already satisfied: fonttools>=4.22.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (4.55.2) + Requirement already satisfied: kiwisolver>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (1.4.7) + Requirement already satisfied: pyparsing>=2.3.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (3.1.4) + Requirement already satisfied: python-dateutil>=2.7 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from matplotlib->detectron2==0.6) (2.9.0.post0) + Requirement already satisfied: click>=8.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (8.1.7) + Requirement already satisfied: mypy-extensions>=0.4.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (1.0.0) + Requirement already satisfied: pathspec>=0.9.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (0.12.1) + Requirement already satisfied: platformdirs>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (4.3.6) + Requirement already satisfied: tomli>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (2.2.1) + Requirement already satisfied: typing-extensions>=4.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from black->detectron2==0.6) (4.12.2) + Requirement already satisfied: absl-py>=0.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.4.0) + Requirement already satisfied: grpcio>=1.48.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.68.1) + Requirement already satisfied: google-auth<3,>=1.6.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (2.36.0) + Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (1.0.0) + Requirement already satisfied: markdown>=2.6.8 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.7) + Requirement already satisfied: protobuf>=3.19.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.20.3) + Requirement already satisfied: requests<3,>=2.21.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (2.32.3) + Requirement already satisfied: setuptools>=41.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (44.0.0) + Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (0.7.2) + Requirement already satisfied: werkzeug>=1.0.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (3.0.6) + Requirement already satisfied: wheel>=0.26 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from tensorboard->detectron2==0.6) (0.45.1) + Requirement already satisfied: cachetools<6.0,>=2.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (5.5.0) + Requirement already satisfied: pyasn1-modules>=0.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (0.4.1) + Requirement already satisfied: rsa<5,>=3.1.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (4.9) + Requirement already satisfied: requests-oauthlib>=0.7.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard->detectron2==0.6) (2.0.0) + Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.1->detectron2==0.6) (3.20.2) + Requirement already satisfied: importlib-metadata>=4.4 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from markdown>=2.6.8->tensorboard->detectron2==0.6) (8.5.0) + Requirement already satisfied: six>=1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib->detectron2==0.6) (1.17.0) + Requirement already satisfied: charset-normalizer<4,>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (3.4.0) + Requirement already satisfied: idna<4,>=2.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (3.10) + Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (2.2.3) + Requirement already satisfied: certifi>=2017.4.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests<3,>=2.21.0->tensorboard->detectron2==0.6) (2024.8.30) + Requirement already satisfied: MarkupSafe>=2.1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from werkzeug>=1.0.1->tensorboard->detectron2==0.6) (2.1.5) + Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->detectron2==0.6) (0.6.1) + Requirement already satisfied: oauthlib>=3.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard->detectron2==0.6) (3.2.2) Using cached hydra_core-1.3.2-py3-none-any.whl (154 kB) Using cached omegaconf-2.3.0-py3-none-any.whl (79 kB) Building wheels for collected packages: detectron2 Building wheel for detectron2 (setup.py): started Building wheel for detectron2 (setup.py): finished with status 'done' - Created wheel for detectron2: filename=detectron2-0.6-cp38-cp38-linux_x86_64.whl size=8313367 sha256=4eb79589c47d522c993509a8f16dfbf494af0f494c6a73577d9d3668c1ee4a05 - Stored in directory: /tmp/pip-ephem-wheel-cache-mkdcktsx/wheels/19/ac/65/e48e5e4ec2702274d927c5a6efb75709b24014371d3bb778f2 + Created wheel for detectron2: filename=detectron2-0.6-cp38-cp38-linux_x86_64.whl size=8313251 sha256=a744a8ccf54176a60e63af7e14e6a7f431f5b19935a3c1260a7d39f7a7f84bc8 + Stored in directory: /tmp/pip-ephem-wheel-cache-cb2ga2gq/wheels/19/ac/65/e48e5e4ec2702274d927c5a6efb75709b24014371d3bb778f2 Successfully built detectron2 Installing collected packages: omegaconf, iopath, hydra-core, detectron2 Attempting uninstall: omegaconf @@ -203,10 +203,10 @@ Install required packages for running model Uninstalling iopath-0.1.10: Successfully uninstalled iopath-0.1.10 Successfully installed detectron2-0.6 hydra-core-1.3.2 iopath-0.1.9 omegaconf-2.3.0 - Requirement already satisfied: openvino>=2023.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (2024.4.0) - Requirement already satisfied: numpy<2.1.0,>=1.16.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (1.23.5) - Requirement already satisfied: openvino-telemetry>=2023.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (2024.5.0) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (24.2) + Requirement already satisfied: openvino>=2023.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (2024.4.0) + Requirement already satisfied: numpy<2.1.0,>=1.16.6 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (1.23.5) + Requirement already satisfied: openvino-telemetry>=2023.2.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (2024.5.0) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from openvino>=2023.1.0) (24.2) Define helpers for PyTorch model initialization and conversion diff --git a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.jpg b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.jpg index 2c18ecdc61719a..9ffd8dbc558859 100644 --- a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.jpg +++ b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:edc1fd6c9bb94b1ff9dde163988de0d5635f35a9cb918138eb058de89fe36b6c -size 58029 +oid sha256:ec1aaa179217e234b7c93d22f9da2f1ac0281e5bf8e4271c4094c3d680793782 +size 58047 diff --git a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.png b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.png index 0890e13959d7b2..0c626a2f115cc3 100644 --- a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.png +++ b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_22_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b54cfa3647ce484120c2dac840789885273b1a61d0fdf6fd1fdb93e78753c114 -size 509016 +oid sha256:5ae2588579f79d5d3e23a9fd9870f28f3bd063b9166da901cd639f16f0f04fca +size 508747 diff --git a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.jpg b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.jpg index d2b1ec1ee92784..6063ffe4fca6ec 100644 --- a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.jpg +++ b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ffdd1e786238678562e14aa201c2a602b1733bb7db8b1c175f7d86b3c011fa2 -size 54276 +oid sha256:d414af832026a73bf7d8a8165a202c499989ddbc4db0826e6e0ca1951b2b4605 +size 54234 diff --git a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.png b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.png index d970f117246904..656018b2fa8884 100644 --- a/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.png +++ b/docs/notebooks/detectron2-to-openvino-with-output_files/detectron2-to-openvino-with-output_32_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6b8a9ccae3ca190acfaa9ddaa9be7641e02edae972b15c49f21cf9a8de9ae454 -size 456077 +oid sha256:8aa8664400b8c51d604d23e669d6e44f766d4eb6b9958d38f4757d5e1cbefe88 +size 457666 diff --git a/docs/notebooks/dynamicrafter-animating-images-with-output.rst b/docs/notebooks/dynamicrafter-animating-images-with-output.rst index 13b4c9475f7092..fac46c9f3e6cad 100644 --- a/docs/notebooks/dynamicrafter-animating-images-with-output.rst +++ b/docs/notebooks/dynamicrafter-animating-images-with-output.rst @@ -151,6 +151,13 @@ Prerequisites %pip install -q "openvino>=2024.2.0" "nncf>=2.11.0" "datasets>=2.20.0" %pip install -q "gradio>=4.19" omegaconf einops pytorch_lightning kornia "open_clip_torch==2.22.0" transformers av opencv-python "torch==2.2.2" --extra-index-url https://download.pytorch.org/whl/cpu + +.. parsed-literal:: + + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + + .. code:: ipython3 from pathlib import Path @@ -168,6 +175,15 @@ Prerequisites ) open("notebook_utils.py", "w").write(r.text) + + + +.. parsed-literal:: + + 24624 + + + .. code:: ipython3 from cmd_helper import clone_repo @@ -175,6 +191,15 @@ Prerequisites clone_repo("https://github.com/Doubiiu/DynamiCrafter.git", "26e665cd6c174234238d2ded661e2e56f875d360") + + + +.. parsed-literal:: + + PosixPath('DynamiCrafter') + + + Load and run the original pipeline ---------------------------------- @@ -238,7 +263,7 @@ We will use model for 256x256 resolution as example. Also, models for hf_hub_download(repo_id=REPO_ID, filename="model.ckpt", local_dir="./checkpoints/dynamicrafter_256_v1/", local_dir_use_symlinks=False) ckpt_path = "checkpoints/dynamicrafter_256_v1/model.ckpt" - config_file = "dynamicrafter/configs/inference_256_v1.0.yaml" + config_file = "DynamiCrafter/configs/inference_256_v1.0.yaml" config = OmegaConf.load(config_file) model_config = config.pop("model", OmegaConf.create()) model_config["params"]["unet_config"]["params"]["use_checkpoint"] = False @@ -252,11 +277,56 @@ We will use model for 256x256 resolution as example. Also, models for model = download_model() +.. parsed-literal:: + + Note: switching to '26e665cd6c174234238d2ded661e2e56f875d360'. + + You are in 'detached HEAD' state. You can look around, make experimental + changes and commit them, and you can discard any commits you make in this + state without impacting any branches by switching back to a branch. + + If you want to create a new branch to retain commits you create, you may + do so (now or later) by using -c with the switch command. Example: + + git switch -c + + Or undo this operation with: + + git switch - + + Turn off this advice by setting config variable advice.detachedHead to false + + HEAD is now at 26e665c add dataset + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/huggingface_hub/file_download.py:1204: UserWarning: `local_dir_use_symlinks` parameter is deprecated and will be ignored. The process to download files to a local folder has been updated and do not rely on symlinks anymore. You only need to pass a destination folder as`local_dir`. + For more details, check out https://huggingface.co/docs/huggingface_hub/main/en/guides/download#download-files-to-local-folder. + warnings.warn( + + + +.. parsed-literal:: + + model.ckpt: 0%| | 0.00/10.4G [00:00>> model checkpoint loaded. - + Convert the model to OpenVINO IR -------------------------------- @@ -333,6 +403,17 @@ Convert CLIP text encoder del cond_stage_model gc.collect(); + +.. parsed-literal:: + + WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.base has been moved to tensorflow.python.trackable.base. The old module will be deleted in version 2.11. + + +.. parsed-literal:: + + WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.base has been moved to tensorflow.python.trackable.base. The old module will be deleted in version 2.11. + + Convert CLIP image encoder ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -355,6 +436,49 @@ resolutions. del model.embedder gc.collect(); + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/utils/image.py:226: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if input.numel() == 0: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:573: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if size == input_size: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:579: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + antialias = antialias and (max(factors) > 1) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:581: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if antialias: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:584: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + sigmas = (max((factors[0] - 1.0) / 2.0, 0.001), max((factors[1] - 1.0) / 2.0, 0.001)) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:589: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + ks = int(max(2.0 * 2 * sigmas[0], 3)), int(max(2.0 * 2 * sigmas[1], 3)) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/geometry/transform/affwarp.py:589: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + ks = int(max(2.0 * 2 * sigmas[0], 3)), int(max(2.0 * 2 * sigmas[1], 3)) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/filters/gaussian.py:55: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + sigma = tensor([sigma], device=input.device, dtype=input.dtype) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/filters/gaussian.py:55: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + sigma = tensor([sigma], device=input.device, dtype=input.dtype) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/core/check.py:78: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if x_shape_to_check[i] != dim: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/filters/kernels.py:92: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + mean = tensor([[mean]], device=sigma.device, dtype=sigma.dtype) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:101: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if len(mean.shape) == 0 or mean.shape[0] == 1: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:103: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if len(std.shape) == 0 or std.shape[0] == 1: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:107: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if mean.shape and mean.shape[0] != 1: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:108: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if mean.shape[0] != data.shape[1] and mean.shape[:2] != data.shape[:2]: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:112: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if std.shape and std.shape[0] != 1: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:113: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if std.shape[0] != data.shape[1] and std.shape[:2] != data.shape[:2]: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:116: TracerWarning: torch.as_tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + mean = torch.as_tensor(mean, device=data.device, dtype=data.dtype) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/kornia/enhance/normalize.py:117: TracerWarning: torch.as_tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + std = torch.as_tensor(std, device=data.device, dtype=data.dtype) + + Convert AE encoder ~~~~~~~~~~~~~~~~~~ @@ -377,6 +501,13 @@ Convert AE encoder del model.first_stage_model.encoder gc.collect(); + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/ae_modules.py:67: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + w_ = w_ * (int(c)**(-0.5)) + + Convert Diffusion U-Net model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -414,6 +545,21 @@ Convert Diffusion U-Net model del model.model.diffusion_model gc.collect(); + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/openaimodel3d.py:556: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if l_context == 77 + t*16: ## !!! HARD CODE here + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/openaimodel3d.py:205: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if batch_size: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/openaimodel3d.py:232: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if self.use_temporal_conv and batch_size: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/openaimodel3d.py:76: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + assert x.shape[1] == self.channels + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/dynamicrafter-animating-images/DynamiCrafter/lvdm/modules/networks/openaimodel3d.py:99: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + assert x.shape[1] == self.channels + + Convert AE decoder ~~~~~~~~~~~~~~~~~~ @@ -785,7 +931,7 @@ Run OpenVINO pipeline inference .. code:: ipython3 - image_path = "dynamicrafter/prompts/256/art.png" + image_path = "DynamiCrafter/prompts/256/art.png" prompt = "man fishing in a boat at sunset" seed = 234 image = Image.open(image_path) @@ -797,15 +943,15 @@ Run OpenVINO pipeline inference .. parsed-literal:: Seed set to 234 - /tmp/ipykernel_971108/2451984876.py:25: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:206.) + /tmp/ipykernel_2173449/2451984876.py:25: UserWarning: The given NumPy array is not writable, and PyTorch does not support non-writable tensors. This means writing to this tensor will result in undefined behavior. You may want to copy the array to protect its data or make it writable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:206.) img_tensor = torch.from_numpy(image).permute(2, 0, 1).float().to(model.device) - + .. parsed-literal:: - start: man fishing in a boat at sunset 2024-08-06 13:54:24 - Saved in man_fishing_in_a_boat_at_sunset.mp4. Time used: 164.28 seconds - + start: man fishing in a boat at sunset 2024-12-09 23:46:36 + Saved in man_fishing_in_a_boat_at_sunset.mp4. Time used: 194.37 seconds + .. code:: ipython3 @@ -828,7 +974,7 @@ Run OpenVINO pipeline inference - + @@ -1000,6 +1146,19 @@ To collect intermediate model inputs for calibration we should customize 0%| | 0/300 [00:00>> model checkpoint loaded. - + .. code:: ipython3 %%skip not $to_quantize.value - image_path = "dynamicrafter/prompts/256/art.png" + image_path = "DynamiCrafter/prompts/256/art.png" prompt = "man fishing in a boat at sunset" seed = 234 image = Image.open(image_path) @@ -1317,13 +1375,13 @@ Let’s run the optimized pipeline .. parsed-literal:: Seed set to 234 - + .. parsed-literal:: - start: man fishing in a boat at sunset 2024-08-06 15:09:26 - Saved in man_fishing_in_a_boat_at_sunset.mp4. Time used: 81.47 seconds - + start: man fishing in a boat at sunset 2024-12-10 01:17:34 + Saved in man_fishing_in_a_boat_at_sunset.mp4. Time used: 98.80 seconds + .. code:: ipython3 @@ -1345,7 +1403,7 @@ Let’s run the optimized pipeline - + Compare model file sizes @@ -1373,7 +1431,7 @@ Compare model file sizes encoder_first_stage_ir compression rate: 3.986 embedder_ir compression rate: 3.977 model_ir compression rate: 3.981 - + Compare inference time of the FP32 and INT8 models ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1427,10 +1485,10 @@ models, we use median inference time on calibration subset. .. parsed-literal:: - FP32 latency: 162.304 - INT8 latency: 79.590 - Performance speed up: 2.039 - + FP32 latency: 193.524 + INT8 latency: 97.073 + Performance speed up: 1.994 + Interactive inference --------------------- @@ -1454,6 +1512,15 @@ to launch the interactive demo. use_quantized_models + + + +.. parsed-literal:: + + Checkbox(value=True, description='Use quantized models') + + + .. code:: ipython3 from functools import partial @@ -1472,9 +1539,23 @@ to launch the interactive demo. demo = make_demo(fn=get_image_fn) try: - demo.queue().launch(debug=True) + demo.queue().launch(debug=False) except Exception: - demo.queue().launch(debug=True, share=True) + demo.queue().launch(debug=False, share=True) # if you are launching remotely, specify server_name and server_port # demo.launch(server_name='your server name', server_port='server port in int') # Read more in the docs: https://gradio.app/docs/ + + +.. parsed-literal:: + + Running on local URL: http://127.0.0.1:7860 + + To create a public link, set `share=True` in `launch()`. + + + + + + + diff --git a/docs/notebooks/efficient-sam-with-output.rst b/docs/notebooks/efficient-sam-with-output.rst index 2341db94e22f68..ce83a3675d1d8c 100644 --- a/docs/notebooks/efficient-sam-with-output.rst +++ b/docs/notebooks/efficient-sam-with-output.rst @@ -82,11 +82,22 @@ Prerequisites .. code:: ipython3 - %pip install -q "openvino>=2023.3.0" "nncf>=2.7.0" opencv-python "gradio>=4.13" "matplotlib>=3.4" torch torchvision tqdm --extra-index-url https://download.pytorch.org/whl/cpu + import platform + + %pip install -q "openvino>=2024.5.0" "nncf>=2.14.0" + %pip install -q "torch>=2.2.0" "torchaudio>=2.2.0" "torchvision>=0.17.0" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q opencv-python "gradio>=4.13" "matplotlib>=3.4" tqdm + + if platform.system() == "Darwin": + %pip install -q "numpy<2.0.0" .. parsed-literal:: + ERROR: Could not find a version that satisfies the requirement openvino>=2024.5.0 (from versions: 2021.3.0, 2021.4.0, 2021.4.1, 2021.4.2, 2022.1.0, 2022.2.0, 2022.3.0, 2022.3.1, 2022.3.2, 2023.0.0.dev20230119, 2023.0.0.dev20230217, 2023.0.0.dev20230407, 2023.0.0.dev20230427, 2023.0.0, 2023.0.1, 2023.0.2, 2023.1.0.dev20230623, 2023.1.0.dev20230728, 2023.1.0.dev20230811, 2023.1.0, 2023.2.0.dev20230922, 2023.2.0, 2023.3.0, 2024.0.0, 2024.1.0, 2024.2.0, 2024.3.0, 2024.4.0, 2024.4.1.dev20240926) + ERROR: No matching distribution found for openvino>=2024.5.0 + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. Note: you may need to restart the kernel to use updated packages. @@ -130,7 +141,7 @@ Prerequisites .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM Load PyTorch model @@ -203,6 +214,13 @@ build PyTorch model pt_model.eval(); + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:303: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + state_dict = torch.load(f, map_location="cpu") + + Run PyTorch model inference --------------------------- @@ -385,23 +403,23 @@ disk using ``openvino.save_model``. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:220: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:220: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if ( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:241: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:241: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert ( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:163: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:163: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! size = int(math.sqrt(xy_num)) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert size * size == xy_num - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:166: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:166: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if size != h or size != w: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:251: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam_encoder.py:251: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert x.shape[2] == num_patches - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:85: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:85: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if num_pts > self.decoder_max_num_input_points: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:92: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:92: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! elif num_pts < self.decoder_max_num_input_points: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:126: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam/EfficientSAM/efficient_sam/efficient_sam.py:126: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if output_w > 0 and output_h > 0: @@ -648,10 +666,10 @@ architecture type, we should specify ``transformer`` in ``model_type``. .. parsed-literal:: - 2024-11-22 00:51:57.265752: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 00:51:57.297997: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 01:35:21.740526: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 01:35:21.772231: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 00:51:57.938257: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-10 01:35:22.412391: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT @@ -818,7 +836,7 @@ models, we use ``bencmark_app``. [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 29.71 ms + [ INFO ] Read model took 29.92 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] batched_images (node: batched_images) : f32 / [...] / [?,?,?,?] @@ -838,7 +856,7 @@ models, we use ``bencmark_app``. [ INFO ] ***NO_NAME*** (node: aten::reshape/Reshape_3) : f32 / [...] / [?,?,?,?,?] [ INFO ] ***NO_NAME*** (node: aten::reshape/Reshape_2) : f32 / [...] / [?,?,?] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 1398.31 ms + [ INFO ] Compile model took 1396.28 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model0 @@ -879,17 +897,17 @@ models, we use ``bencmark_app``. [ INFO ] Fill input 'batched_point_labels' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 6 inference requests, limits: 15000 ms duration) [ INFO ] Benchmarking in full mode (inputs filling are included in measurement loop). - [ INFO ] First inference took 793.15 ms + [ INFO ] First inference took 850.98 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 55 iterations - [ INFO ] Duration: 17124.15 ms + [ INFO ] Count: 49 iterations + [ INFO ] Duration: 16117.80 ms [ INFO ] Latency: - [ INFO ] Median: 1829.15 ms - [ INFO ] Average: 1806.67 ms - [ INFO ] Min: 872.57 ms - [ INFO ] Max: 2037.03 ms - [ INFO ] Throughput: 3.21 FPS + [ INFO ] Median: 1890.12 ms + [ INFO ] Average: 1899.68 ms + [ INFO ] Min: 1013.52 ms + [ INFO ] Max: 2315.56 ms + [ INFO ] Throughput: 3.04 FPS .. code:: ipython3 @@ -915,7 +933,7 @@ models, we use ``bencmark_app``. [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 43.85 ms + [ INFO ] Read model took 43.16 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] batched_images (node: batched_images) : f32 / [...] / [?,?,?,?] @@ -935,7 +953,7 @@ models, we use ``bencmark_app``. [ INFO ] ***NO_NAME*** (node: aten::reshape/Reshape_3) : f32 / [...] / [?,?,?,?,?] [ INFO ] ***NO_NAME*** (node: aten::reshape/Reshape_2) : f32 / [...] / [?,?,?] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 1631.76 ms + [ INFO ] Compile model took 1639.65 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model0 @@ -976,17 +994,17 @@ models, we use ``bencmark_app``. [ INFO ] Fill input 'batched_point_labels' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 6 inference requests, limits: 15000 ms duration) [ INFO ] Benchmarking in full mode (inputs filling are included in measurement loop). - [ INFO ] First inference took 583.55 ms + [ INFO ] First inference took 586.73 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 56 iterations - [ INFO ] Duration: 16266.69 ms + [ INFO ] Count: 55 iterations + [ INFO ] Duration: 15880.08 ms [ INFO ] Latency: - [ INFO ] Median: 1710.59 ms - [ INFO ] Average: 1692.97 ms - [ INFO ] Min: 713.08 ms - [ INFO ] Max: 1952.47 ms - [ INFO ] Throughput: 3.44 FPS + [ INFO ] Median: 1710.19 ms + [ INFO ] Average: 1694.56 ms + [ INFO ] Min: 569.82 ms + [ INFO ] Max: 1827.81 ms + [ INFO ] Throughput: 3.46 FPS Interactive segmentation demo @@ -1316,7 +1334,7 @@ Interactive segmentation demo .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/efficient-sam Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. diff --git a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_17_1.png b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_17_1.png index f9dfb53e3b8796..ee488196e09a35 100644 --- a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_17_1.png +++ b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_17_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cffb9233e156bb558299a8c9bd3931dad6999f9bf7f358b208549949411460d1 -size 1259114 +oid sha256:c724c8a2e1ea229d28fc4828d1e0f8e3709b56e66b4568cd5c300123a6b6990b +size 1259642 diff --git a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_25_1.png b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_25_1.png index 108e6e0e4564e0..25a70458403cd0 100644 --- a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_25_1.png +++ b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_25_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5760726cd720e435c5d3a85315e772a741d583553996d8cfe7833f5d941e79f3 -size 1260778 +oid sha256:8086bb37d6a8400d681ce701a0ccd8aca10ef94cbb1d2fd387ae08f06e26342a +size 1262788 diff --git a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_36_1.png b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_36_1.png index c767ab3d6193bd..cb5a9e6e89c825 100644 --- a/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_36_1.png +++ b/docs/notebooks/efficient-sam-with-output_files/efficient-sam-with-output_36_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3909739937c5c50e2b26b3cba0b8b30e98e13fee3eab6c4f382735ec82ae9250 -size 1261525 +oid sha256:a18bb4842ab402d752631d693ed64876b58b8cd3cff35bbb3342ba67b35f2c30 +size 1260902 diff --git a/docs/notebooks/encodec-audio-compression-with-output.rst b/docs/notebooks/encodec-audio-compression-with-output.rst index 4cf2479f638656..4d10def61a4a57 100644 --- a/docs/notebooks/encodec-audio-compression-with-output.rst +++ b/docs/notebooks/encodec-audio-compression-with-output.rst @@ -72,8 +72,6 @@ Install required dependencies: .. parsed-literal:: - ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. - torchvision 0.17.2+cpu requires torch==2.2.2, but you have torch 2.4.1+cpu which is incompatible. Note: you may need to restart the kernel to use updated packages. @@ -142,7 +140,7 @@ bandwidth. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. WeightNorm.apply(module, name, dim) @@ -302,7 +300,7 @@ similar as possible to the original. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. WeightNorm.apply(module, name, dim) @@ -402,13 +400,13 @@ with ``ov.save_model``. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:60: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:60: TracerWarning: Converting a tensor to a Python float might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! ideal_length = (math.ceil(n_frames) - 1) * stride + (kernel_size - padding_total) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:85: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:85: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert padding_left >= 0 and padding_right >= 0, (padding_left, padding_right) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:87: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:87: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! max_pad = max(padding_left, padding_right) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:89: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:89: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if length <= max_pad: @@ -428,11 +426,11 @@ with ``ov.save_model``. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/quantization/core_vq.py:358: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/quantization/core_vq.py:358: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. quantized_out = torch.tensor(0.0, device=q_indices.device) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/quantization/core_vq.py:359: TracerWarning: Iterating over a tensor might cause the trace to be incorrect. Passing a tensor of different shape won't change the number of iterations executed (and might lead to errors or silently give incorrect results). + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/quantization/core_vq.py:359: TracerWarning: Iterating over a tensor might cause the trace to be incorrect. Passing a tensor of different shape won't change the number of iterations executed (and might lead to errors or silently give incorrect results). for i, indices in enumerate(q_indices): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:103: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/encodec/modules/conv.py:103: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert (padding_left + padding_right) <= x.shape[-1] diff --git a/docs/notebooks/fast-segment-anything-with-output.rst b/docs/notebooks/fast-segment-anything-with-output.rst index 9becf2719559bc..0071e2dca60e74 100644 --- a/docs/notebooks/fast-segment-anything-with-output.rst +++ b/docs/notebooks/fast-segment-anything-with-output.rst @@ -85,8 +85,6 @@ Install requirements .. parsed-literal:: - ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. - torchaudio 2.4.1+cpu requires torch==2.4.1, but you have torch 2.2.2+cpu which is incompatible. Note: you may need to restart the kernel to use updated packages. Note: you may need to restart the kernel to use updated packages. Note: you may need to restart the kernel to use updated packages. @@ -158,7 +156,9 @@ model and generate a segmentation map. .. parsed-literal:: - 100%|██████████| 138M/138M [00:02<00:00, 48.9MB/s] + 100%|██████████| 138M/138M [00:03<00:00, 46.3MB/s] + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/ultralytics/nn/tasks.py:732: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + ckpt = torch.load(file, map_location="cpu") @@ -170,8 +170,8 @@ model and generate a segmentation map. .. parsed-literal:: - image 1/1 /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything/coco_bike.jpg: 768x1024 37 objects, 642.9ms - Speed: 3.9ms preprocess, 642.9ms inference, 771.9ms postprocess per image at shape (1, 3, 768, 1024) + image 1/1 /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything/coco_bike.jpg: 768x1024 37 objects, 638.3ms + Speed: 3.4ms preprocess, 638.3ms inference, 500.4ms postprocess per image at shape (1, 3, 768, 1024) The model returns segmentation maps for all the objects on the image. @@ -209,15 +209,15 @@ tracing. The FastSAM model itself is based on YOLOv8 model. .. parsed-literal:: - Ultralytics YOLOv8.2.24 🚀 Python-3.8.10 torch-2.2.2+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) + Ultralytics YOLOv8.2.24 🚀 Python-3.8.10 torch-2.4.1+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) PyTorch: starting from 'FastSAM-x.pt' with input shape (1, 3, 1024, 1024) BCHW and output shape(s) ((1, 37, 21504), (1, 32, 256, 256)) (138.3 MB) OpenVINO: starting export with openvino 2024.4.0-16579-c3152d32c9c-releases/2024/4... - OpenVINO: export success ✅ 6.1s, saved as 'FastSAM-x_openvino_model/' (276.1 MB) + OpenVINO: export success ✅ 6.2s, saved as 'FastSAM-x_openvino_model/' (276.1 MB) - Export complete (9.1s) - Results saved to /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything + Export complete (9.2s) + Results saved to /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything Predict: yolo predict task=segment model=FastSAM-x_openvino_model imgsz=1024 Validate: yolo val task=segment model=FastSAM-x_openvino_model imgsz=1024 data=ultralytics/datasets/sa.yaml Visualize: https://netron.app @@ -321,8 +321,8 @@ pipeline. .. parsed-literal:: - image 1/1 /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything/coco_bike.jpg: 1024x1024 42 objects, 494.2ms - Speed: 6.6ms preprocess, 494.2ms inference, 30.3ms postprocess per image at shape (1, 3, 1024, 1024) + image 1/1 /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/fast-segment-anything/coco_bike.jpg: 1024x1024 42 objects, 498.5ms + Speed: 6.1ms preprocess, 498.5ms inference, 31.6ms postprocess per image at shape (1, 3, 1024, 1024) One can observe the converted model outputs in the next cell, they is @@ -521,6 +521,11 @@ repo <-with-output.html>`__. preset=nncf.QuantizationPreset.MIXED) +.. parsed-literal:: + + :7: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console) + + .. parsed-literal:: INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, tensorflow, onnx, openvino @@ -615,8 +620,8 @@ calibration dataset to measure the performance. .. parsed-literal:: - Segmented in 72 seconds. - Resulting in 1.78 fps + Segmented in 68 seconds. + Resulting in 1.88 fps .. code:: ipython3 @@ -643,9 +648,9 @@ calibration dataset to measure the performance. .. parsed-literal:: - Segmented in 23 seconds - Resulting in 5.57 fps - That is 3.13 times faster! + Segmented in 21 seconds + Resulting in 6.1 fps + That is 3.24 times faster! Try out the converted pipeline diff --git a/docs/notebooks/florence2-with-output.rst b/docs/notebooks/florence2-with-output.rst index e4ab6fbcbd3a3b..7ec9ce6e6557ca 100644 --- a/docs/notebooks/florence2-with-output.rst +++ b/docs/notebooks/florence2-with-output.rst @@ -100,10 +100,10 @@ available model. By default, we will use .. parsed-literal:: - 2024-11-22 01:05:34.426758: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:05:34.462006: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 01:48:13.363088: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 01:48:13.396921: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 01:05:35.115966: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-10 01:48:14.055295: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT @@ -193,31 +193,31 @@ pipeline. .. parsed-literal:: - config.json: 0%| | 0.00/2.43k [00:00 1 or self.sliding_window is not None: /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/chkpt/modeling_florence2.py:1205: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! is_causal = True if self.is_causal and attention_mask is None and tgt_len > 1 else False diff --git a/docs/notebooks/florence2-with-output_files/florence2-with-output_18_0.png b/docs/notebooks/florence2-with-output_files/florence2-with-output_18_0.png index c233468fe95f4e..0ffc56ebd94d65 100644 --- a/docs/notebooks/florence2-with-output_files/florence2-with-output_18_0.png +++ b/docs/notebooks/florence2-with-output_files/florence2-with-output_18_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d15ed97d6e50919caff2aee785bc4c90f91dcfcc9bb248f70e9d79bb203be64f -size 259663 +oid sha256:552934f1e05cf6d598ce249bb662530388c1f3335dc2a6af6c304825c8aa023a +size 259656 diff --git a/docs/notebooks/freevc-voice-conversion-with-output.rst b/docs/notebooks/freevc-voice-conversion-with-output.rst index eb1dffbcf5da08..69a935f4c4f78d 100644 --- a/docs/notebooks/freevc-voice-conversion-with-output.rst +++ b/docs/notebooks/freevc-voice-conversion-with-output.rst @@ -133,8 +133,8 @@ Install extra requirements Downloading... From: https://drive.google.com/uc?id=12-cB34qCTvByWT-QtOcZaqwwO21FLSqU&confirm=t&uuid=a703c43c-ccce-436c-8799-c11b88e9e7e4 - To: /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/freevc-voice-conversion/FreeVC/wavlm/WavLM-Large.pt - 100%|██████████| 1.26G/1.26G [00:26<00:00, 47.5MB/s] + To: /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/freevc-voice-conversion/FreeVC/wavlm/WavLM-Large.pt + 100%|██████████| 1.26G/1.26G [01:03<00:00, 19.9MB/s] .. code:: ipython3 @@ -153,7 +153,7 @@ Install extra requirements .. parsed-literal:: - checkpoints/freevc.pth: 0%| | 0.00/451M [00:00 - + Your browser does not support the audio element. diff --git a/docs/notebooks/glm-edge-v-with-output.rst b/docs/notebooks/glm-edge-v-with-output.rst new file mode 100644 index 00000000000000..2449d414d82594 --- /dev/null +++ b/docs/notebooks/glm-edge-v-with-output.rst @@ -0,0 +1,516 @@ +Visual-language assistant with GLM-Edge-V and OpenVINO +------------------------------------------------------ + +The +`GLM-Edge `__ +series is `Zhipu `__\ ’s attempt to meet +real-world deployment scenarios for edge devices. It consists of two +sizes of large language dialogue models and multimodal understanding +models (GLM-Edge-1.5B-Chat, GLM-Edge-4B-Chat, GLM-Edge-V-2B, +GLM-Edge-V-5B). Among them, the 1.5B / 2B models are mainly targeted at +platforms like mobile phones and car machines, while the 4B / 5B models +are aimed at platforms like PCs. Based on the technological advancements +of the GLM-4 series, some targeted adjustments have been made to the +model structure and size, balancing model performance, real-world +inference efficiency, and deployment convenience. Through deep +collaboration with partner enterprises and relentless efforts in +inference optimization, the GLM-Edge series models can run at extremely +high speeds on some edge platforms. + +In this tutorial we consider how to launch multimodal model GLM-Edge-V +using OpenVINO for creation multimodal chatbot. Additionally, we +optimize model to low precision using +`NNCF `__ + +**Table of contents:** + +- `Prerequisites <#prerequisites>`__ +- `Select Model <#select-model>`__ +- `Convert and Optimize model <#convert-and-optimize-model>`__ + + - `Compress model weights to + 4-bit <#compress-model-weights-to-4-bit>`__ + +- `Select inference device <#select-inference-device>`__ +- `Run OpenVINO model <#run-openvino-model>`__ +- `Interactive demo <#interactive-demo>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +Prerequisites +------------- + + + +install required packages and setup helper functions. + +.. code:: ipython3 + + %pip install -q "torch>=2.1" "torchvision" "protobuf>=3.20" "gradio>=4.26" "Pillow" "accelerate" "tqdm" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q "openvino>=2024.5.0" "nncf>=2.14.0" + + +.. parsed-literal:: + + Note: you may need to restart the kernel to use updated packages. + ERROR: Could not find a version that satisfies the requirement openvino>=2024.5.0 (from versions: 2021.3.0, 2021.4.0, 2021.4.1, 2021.4.2, 2022.1.0, 2022.2.0, 2022.3.0, 2022.3.1, 2022.3.2, 2023.0.0.dev20230119, 2023.0.0.dev20230217, 2023.0.0.dev20230407, 2023.0.0.dev20230427, 2023.0.0, 2023.0.1, 2023.0.2, 2023.1.0.dev20230623, 2023.1.0.dev20230728, 2023.1.0.dev20230811, 2023.1.0, 2023.2.0.dev20230922, 2023.2.0, 2023.3.0, 2024.0.0, 2024.1.0, 2024.2.0, 2024.3.0, 2024.4.0, 2024.4.1.dev20240926) + ERROR: No matching distribution found for openvino>=2024.5.0 + Note: you may need to restart the kernel to use updated packages. + + +.. code:: ipython3 + + %pip install -q "git+https://github.com/huggingface/transformers" + + +.. parsed-literal:: + + error: subprocess-exited-with-error + + × Preparing metadata (pyproject.toml) did not run successfully. + │ exit code: 1 + ╰─> [6 lines of output] + + Cargo, the Rust package manager, is not installed or is not on PATH. + This package requires Rust and Cargo to compile extensions. Install it through + the system's package manager or via https://rustup.rs/ + + Checking for Rust toolchain.... + [end of output] + + note: This error originates from a subprocess, and is likely not a problem with pip. + error: metadata-generation-failed + + × Encountered error while generating package metadata. + ╰─> See above for output. + + note: This is an issue with the package mentioned above, not pip. + hint: See above for details. + Note: you may need to restart the kernel to use updated packages. + + +.. code:: ipython3 + + import requests + from pathlib import Path + + if not Path("glmv_helper.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/glm-edge-v/glmv_helper.py") + open("glmv_helper.py", "w").write(r.text) + + + if not Path("gradio_helper.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/glm-edge-v/gradio_helper.py") + open("gradio_helper.py", "w").write(r.text) + + if not Path("notebook_utils.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py") + open("notebook_utils.py", "w").write(r.text) + +Select Model +------------ + + + +The tutorial supports the following models from GLM-Edge-V model family: + +- `glm-edge-v-2b `__ +- `glm-edge-v-5b `__ + +You can select one from the provided options below. + +.. code:: ipython3 + + import ipywidgets as widgets + + # Select model + model_ids = [ + "THUDM/glm-edge-v-2b", + "THUDM/glm-edge-v-5b", + ] + + model_dropdown = widgets.Dropdown( + options=model_ids, + value=model_ids[0], + description="Model:", + disabled=False, + ) + + model_dropdown + + + + +.. parsed-literal:: + + Dropdown(description='Model:', options=('THUDM/glm-edge-v-2b', 'THUDM/glm-edge-v-5b'), value='THUDM/glm-edge-v… + + + +Convert and Optimize model +-------------------------- + + + +GLM-Edge-V is PyTorch model. OpenVINO supports PyTorch models via +conversion to OpenVINO Intermediate Representation (IR). `OpenVINO model +conversion +API `__ +should be used for these purposes. ``ov.convert_model`` function accepts +original PyTorch model instance and example input for tracing and +returns ``ov.Model`` representing this model in OpenVINO framework. +Converted model can be used for saving on disk using ``ov.save_model`` +function or directly loading on device using ``core.complie_model``. + +The script ``glmv_helper.py`` contains helper function for model +conversion, please check its content if you interested in conversion +details. + +.. raw:: html + +
+ +Click here for more detailed explanation of conversion steps GLM-Edge-V +is autoregressive transformer generative model, it means that each next +model step depends from model output from previous step. The generation +approach is based on the assumption that the probability distribution of +a word sequence can be decomposed into the product of conditional next +word distributions. In other words, model predicts the next token in the +loop guided by previously generated tokens until the stop-condition will +be not reached (generated sequence of maximum length or end of string +token obtained). The way the next token will be selected over predicted +probabilities is driven by the selected decoding methodology. You can +find more information about the most popular decoding methods in this +blog. The entry point for the generation process for models from the +Hugging Face Transformers library is the ``generate`` method. You can +find more information about its parameters and configuration in the +documentation. To preserve flexibility in the selection decoding +methodology, we will convert only model inference for one step. + +GLM-Edge-V model consists of 3 parts: + +- **Vision Model** for encoding input images into embedding space. +- **Embedding Model** for conversion input text tokens into embedding + space +- **Language Model** for generation answer based on input embeddings + provided by Image Encoder and Input Embedding models. + +.. raw:: html + +
+ +Compress model weights to 4-bit +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For reducing memory +consumption, weights compression optimization can be applied using +`NNCF `__. + +.. raw:: html + +
+ +Click here for more details about weight compression Weight compression +aims to reduce the memory footprint of a model. It can also lead to +significant performance improvement for large memory-bound models, such +as Large Language Models (LLMs). LLMs and other models, which require +extensive memory to store the weights during inference, can benefit from +weight compression in the following ways: + +- enabling the inference of exceptionally large models that cannot be + accommodated in the memory of the device; + +- improving the inference performance of the models by reducing the + latency of the memory access when computing the operations with + weights, for example, Linear layers. + +`Neural Network Compression Framework +(NNCF) `__ provides 4-bit / +8-bit mixed weight quantization as a compression method primarily +designed to optimize LLMs. The main difference between weights +compression and full model quantization (post-training quantization) is +that activations remain floating-point in the case of weights +compression which leads to a better accuracy. Weight compression for +LLMs provides a solid inference performance improvement which is on par +with the performance of the full model quantization. In addition, weight +compression is data-free and does not require a calibration dataset, +making it easy to use. + +``nncf.compress_weights`` function can be used for performing weights +compression. The function accepts an OpenVINO model and other +compression parameters. Compared to INT8 compression, INT4 compression +improves performance even more, but introduces a minor drop in +prediction quality. + +More details about weights compression, can be found in `OpenVINO +documentation `__. + +.. raw:: html + +
+ +.. code:: ipython3 + + from pathlib import Path + import nncf + from glmv_helper import convert_glmv_model + + + model_id = model_dropdown.value + out_dir = Path("model") / Path(model_id).name / "INT4" + compression_configuration = { + "mode": nncf.CompressWeightsMode.INT4_SYM, + "group_size": 64, + "ratio": 0.6, + } + convert_glmv_model(model_id, out_dir, compression_configuration) + + +.. parsed-literal:: + + INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, tensorflow, onnx, openvino + + +.. parsed-literal:: + + 2024-12-10 01:51:54.756921: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 01:51:54.790860: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. + 2024-12-10 01:51:55.339388: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + + +.. parsed-literal:: + + ⌛ glm-edge-v-2b conversion started. Be patient, it may takes some time. + ⌛ Load Original model + ✅ Original model successfully loaded + ⌛ Convert Input embedding model + WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.base has been moved to tensorflow.python.trackable.base. The old module will be deleted in version 2.11. + + +.. parsed-literal:: + + [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + warnings.warn( + `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. + + +.. parsed-literal:: + + ✅ Input embedding model successfully converted + ⌛ Convert Image embedding model + + +.. parsed-literal:: + + /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/THUDM/glm-edge-v-2b/30c2bc691c9d46433abfd450e04441458d503f34/siglip.py:48: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + grid_size = int(s**0.5) + /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/THUDM/glm-edge-v-2b/30c2bc691c9d46433abfd450e04441458d503f34/siglip.py:53: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + image_emb = torch.cat([self.boi.repeat(len(image_emb), 1, 1), image_emb, self.eoi.repeat(len(image_emb), 1, 1)], dim=1) + + +.. parsed-literal:: + + ✅ Image embedding model successfully converted + ⌛ Convert Language model + + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:458: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + or len(self.key_cache[layer_idx]) == 0 # the layer has no cache + /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/THUDM/glm-edge-v-2b/30c2bc691c9d46433abfd450e04441458d503f34/modeling_glm.py:995: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if sequence_length != 1: + /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/THUDM/glm-edge-v-2b/30c2bc691c9d46433abfd450e04441458d503f34/modeling_glm.py:153: TracerWarning: Converting a tensor to a Python integer might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + rotary_dim = int(q.shape[-1] * partial_rotary_factor) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors + /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/THUDM/glm-edge-v-2b/30c2bc691c9d46433abfd450e04441458d503f34/modeling_glm.py:249: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:168: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the .grad field to be populated for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more informations. (Triggered internally at aten/src/ATen/core/TensorBody.h:489.) + if a.grad is not None: + + +.. parsed-literal:: + + ✅ Language model successfully converted + ⌛ Weights compression with int4_sym mode started + + + +.. parsed-literal:: + + Output() + + + + + + + + + +.. parsed-literal:: + + INFO:nncf:Statistics of the bitwidth distribution: + ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ + │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ + ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ + │ 8 │ 45% (115 / 169) │ 40% (114 / 168) │ + ├────────────────┼─────────────────────────────┼────────────────────────────────────────┤ + │ 4 │ 55% (54 / 169) │ 60% (54 / 168) │ + ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ + + + +.. parsed-literal:: + + Output() + + + + + + + + + +.. parsed-literal:: + + ✅ Weights compression finished + ✅ glm-edge-v-2b model conversion finished. You can find results in model/glm-edge-v-2b/INT4 + + +Select inference device +----------------------- + + + +.. code:: ipython3 + + from notebook_utils import device_widget + + device = device_widget(default="AUTO", exclude=["NPU"]) + + device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', index=1, options=('CPU', 'AUTO'), value='AUTO') + + + +Run OpenVINO model +------------------ + + + +``OvGLMv`` class provides convenient way for running model. It accepts +directory with converted model and inference device as arguments. For +running model we will use ``generate`` method. + +.. code:: ipython3 + + from glmv_helper import OvGLMv + + model = OvGLMv(out_dir, device.value) + +.. code:: ipython3 + + import requests + from PIL import Image + + url = "https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11" + image = Image.open(requests.get(url, stream=True).raw) + + query = "Please describe this picture" + + print(f"Question:\n {query}") + image + + +.. parsed-literal:: + + Question: + Please describe this picture + + + + +.. image:: glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.png + + + +.. code:: ipython3 + + from transformers import TextStreamer, AutoImageProcessor, AutoTokenizer + import torch + + messages = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": query}]}] + + processor = AutoImageProcessor.from_pretrained(out_dir, trust_remote_code=True) + tokenizer = AutoTokenizer.from_pretrained(out_dir, trust_remote_code=True) + inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_dict=True, tokenize=True, return_tensors="pt").to("cpu") + generate_kwargs = { + **inputs, + "pixel_values": torch.tensor(processor(image).pixel_values).to("cpu"), + "max_new_tokens": 100, + "do_sample": True, + "top_k": 20, + "streamer": TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True), + } + + print("Answer:") + output = model.generate(**generate_kwargs) + + +.. parsed-literal:: + + Answer: + The image depicts a cat resting inside a cardboard box placed on a soft carpeted floor. The cat is lying with its head towards the bottom of the box, and its front paws are stretched out with the right one slightly forward, while its back and hind legs are positioned in the box. The box appears to be in partial disassembly, with the flaps folded down and one side raised slightly off the ground. The cat's fur is well-groomed and + + +Interactive demo +---------------- + + + +.. code:: ipython3 + + from gradio_helper import make_demo + + demo = make_demo(model, processor, tokenizer) + + try: + demo.launch(debug=False, height=600) + except Exception: + demo.launch(debug=False, share=True, height=600) + # if you are launching remotely, specify server_name and server_port + # demo.launch(server_name='your server name', server_port='server port in int') + # Read more in the docs: https://gradio.app/docs/ + + +.. parsed-literal:: + + Running on local URL: http://127.0.0.1:7860 + + To create a public link, set `share=True` in `launch()`. + + + + + + + diff --git a/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.jpg b/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.jpg new file mode 100644 index 00000000000000..c6aeec77cd3cb2 --- /dev/null +++ b/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fc0d22d75f23474fb4f8aec8c0bf0fdf5d9377f3379e82a3887003e6da47e7e +size 60425 diff --git a/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.png b/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.png new file mode 100644 index 00000000000000..c6673a757ab5dc --- /dev/null +++ b/docs/notebooks/glm-edge-v-with-output_files/glm-edge-v-with-output_13_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c715d8adee4bf7519690de20b57ef2edaa2f914c86a64d107f99a919dcdad218 +size 854224 diff --git a/docs/notebooks/grounded-segment-anything-with-output.rst b/docs/notebooks/grounded-segment-anything-with-output.rst index a51ce8249239f9..6449fb1a6a9507 100644 --- a/docs/notebooks/grounded-segment-anything-with-output.rst +++ b/docs/notebooks/grounded-segment-anything-with-output.rst @@ -201,7 +201,7 @@ Download checkpoints and load PyTorch models .. parsed-literal:: - checkpoints/groundingdino_swint_ogc.pth: 0%| | 0.00/662M [00:00 + @@ -215,7 +215,7 @@ Do Inference .. parsed-literal:: - + diff --git a/docs/notebooks/hello-segmentation-with-output_files/hello-segmentation-with-output_11_1.png b/docs/notebooks/hello-segmentation-with-output_files/hello-segmentation-with-output_11_1.png new file mode 100644 index 00000000000000..3677caabff4380 --- /dev/null +++ b/docs/notebooks/hello-segmentation-with-output_files/hello-segmentation-with-output_11_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76113c575caa9c8a8aca45d3ec6ebd7a4b513dadffd8e9e63861a7a041d7e5de +size 249032 diff --git a/docs/notebooks/hello-world-with-output.rst b/docs/notebooks/hello-world-with-output.rst index 5bd1216db29701..94d6dca5798876 100644 --- a/docs/notebooks/hello-world-with-output.rst +++ b/docs/notebooks/hello-world-with-output.rst @@ -98,13 +98,13 @@ Download the Model and data samples .. parsed-literal:: - artifacts/v3-small_224_1.0_float.xml: 0%| | 0.00/294k [00:00=4.33.0" "torch>=2.1.0" %pip install -q ipywidgets - %pip install -q "openvino>=2023.1.0" + %pip install -q "openvino>=2023.1.0" "Pillow" .. parsed-literal:: @@ -132,10 +132,10 @@ tutorials `__. from optimum.intel.openvino import OVModelForSequenceClassification - -.. parsed-literal:: - - huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks... - To disable this warning, you can either: - - Avoid using `tokenizers` before the fork if possible - - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false) - - Initialize and Convert the Model Automatically using OVModel class ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -436,7 +427,7 @@ Full list of supported arguments available via ``--help`` .. parsed-literal:: - 2024-11-22 01:15:03.858078: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-10 01:57:20.152345: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT usage: optimum-cli export openvino [-h] -m MODEL [--task TASK] [--framework {pt,tf}] [--trust-remote-code] [--weight-format {fp32,fp16,int8,int4,mxfp4,nf4}] @@ -445,8 +436,10 @@ Full list of supported arguments available via ``--help`` [--pad-token-id PAD_TOKEN_ID] [--ratio RATIO] [--sym] [--group-size GROUP_SIZE] + [--backup-precision {none,int8_sym,int8_asym}] [--dataset DATASET] [--all-layers] [--awq] [--scale-estimation] [--gptq] + [--lora-correction] [--sensitivity-metric SENSITIVITY_METRIC] [--num-samples NUM_SAMPLES] [--disable-stateful] @@ -467,20 +460,20 @@ Full list of supported arguments available via ``--help`` --task TASK The task to export the model for. If not specified, the task will be auto-inferred based on the model. Available tasks depend on the model, but are among: - ['audio-xvector', 'image-text-to-text', 'mask- - generation', 'text-generation', 'masked-im', 'image- - classification', 'token-classification', 'question- - answering', 'automatic-speech-recognition', 'multiple- - choice', 'image-segmentation', 'semantic- - segmentation', 'text2text-generation', 'feature- - extraction', 'image-to-text', 'text-to-audio', 'text- - to-image', 'zero-shot-object-detection', 'inpainting', - 'zero-shot-image-classification', 'object-detection', - 'text-classification', 'image-to-image', 'sentence- - similarity', 'audio-frame-classification', 'depth- - estimation', 'audio-classification', 'fill-mask']. For - decoder models, use `xxx-with-past` to export the - model using past key values in the decoder. + ['zero-shot-object-detection', 'multiple-choice', + 'audio-xvector', 'masked-im', 'text2text-generation', + 'inpainting', 'image-segmentation', 'semantic- + segmentation', 'question-answering', 'token- + classification', 'audio-frame-classification', + 'feature-extraction', 'text-to-audio', 'image-to- + image', 'fill-mask', 'automatic-speech-recognition', + 'image-classification', 'text-classification', 'zero- + shot-image-classification', 'object-detection', + 'image-to-text', 'audio-classification', 'sentence- + similarity', 'depth-estimation', 'text-to-image', + 'mask-generation', 'text-generation']. For decoder + models, use `xxx-with-past` to export the model using + past key values in the decoder. --framework {pt,tf} The framework to use for the export. If not provided, will attempt to use the local checkpoint's original framework or what is available in the environment. @@ -514,12 +507,27 @@ Full list of supported arguments available via ``--help`` --group-size GROUP_SIZE The group size to use for quantization. Recommended value is 128 and -1 uses per-column quantization. + --backup-precision {none,int8_sym,int8_asym} + Defines a backup precision for mixed-precision weight + compression. Only valid for int4 weight format. If not + provided, backup precision is int8_asym. 'none' stands + for original floating-point precision of the model + weights, in this case weights are retained in their + original precision without any quantization. + 'int8_sym' stands for 8-bit integer symmetric + quantization without zero point. 'int8_asym' stands + for 8-bit integer asymmetric quantization with zero + points per each quantization group. --dataset DATASET The dataset used for data-aware compression or - quantization with NNCF. You can use the one from the - list ['wikitext2','c4','c4-new'] for language models - or ['conceptual_captions','laion/220k-GPT4Vision- - captions-from-LIVIS','laion/filtered-wit'] for - diffusion models. + quantization with NNCF. For language models you can + use the one from the list + ['auto','wikitext2','c4','c4-new']. With 'auto' the + dataset will be collected from model's generations. + For diffusion models it should be on of + ['conceptual_captions','laion/220k-GPT4Vision- + captions-from-LIVIS','laion/filtered-wit']. For visual + language models the dataset must be set to + 'contextual'. --all-layers Whether embeddings and last MatMul layers should be compressed to INT4. If not provided an weight compression is applied, they are compressed to INT8. @@ -527,7 +535,7 @@ Full list of supported arguments available via ``--help`` generation quality of INT4-compressed LLMs, but requires additional time for tuning weights on a calibration dataset. To run AWQ, please also provide a - dataset argument. Note: it's possible that there will + dataset argument. Note: it is possible that there will be no matching patterns in the model to apply AWQ, in such case it will be skipped. --scale-estimation Indicates whether to apply a scale estimation @@ -541,9 +549,15 @@ Full list of supported arguments available via ``--help`` to minimize the difference between activations of a compressed and original layer. Please note, that applying GPTQ takes additional memory and time. + --lora-correction Indicates whether to apply LoRA Correction algorithm. + When enabled, this algorithm introduces low-rank + adaptation layers in the model that can recover + accuracy after weight compression at some cost of + inference latency. Please note, that applying LoRA + Correction algorithm takes additional memory and time. --sensitivity-metric SENSITIVITY_METRIC The sensitivity metric for assigning quantization - precision to layers. Can be one of the following: + precision to layers. It can be one of the following: ['weight_quantization_error', 'hessian_input_activation', 'mean_activation_variance', 'max_activation_variance', @@ -561,7 +575,7 @@ Full list of supported arguments available via ``--help`` performance. Use it when you intentionally want to use a stateless model, for example, to be compatible with existing OpenVINO native inference code that expects - kv-cache inputs and outputs in the model. + KV-cache inputs and outputs in the model. --disable-convert-tokenizer Do not add converted tokenizer and detokenizer OpenVINO models. @@ -585,7 +599,7 @@ compression: .. parsed-literal:: - 2024-11-22 01:15:09.417610: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-10 01:57:25.755800: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT Some weights of the model checkpoint at cardiffnlp/twitter-roberta-base-sentiment-latest were not used when initializing RobertaForSequenceClassification: ['roberta.pooler.dense.bias', 'roberta.pooler.dense.weight'] - This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model). - This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model). @@ -636,9 +650,8 @@ OpenVINO `__ 3. `Stable Diffusion v2.1 using Optimum-Intel OpenVINO `__ 4. `Image generation with Stable Diffusion -XL `__ 5. `Instruction following using -Databricks Dolly 2.0 `__ 6. `Create -LLM-powered Chatbot using OpenVINO `__ 7. `Document -Visual Question Answering Using Pix2Struct and -OpenVINO `__ 8. `Automatic speech recognition -using Distil-Whisper and OpenVINO `__ +XL `__ 5. `Create LLM-powered Chatbot using +OpenVINO `__ 6. `Document Visual Question Answering +Using Pix2Struct and OpenVINO `__ 7. `Automatic +speech recognition using Distil-Whisper and +OpenVINO `__ diff --git a/docs/notebooks/hunyuan-dit-image-generation-with-output.rst b/docs/notebooks/hunyuan-dit-image-generation-with-output.rst index 01b20ab650824e..61c412fe6f5e62 100644 --- a/docs/notebooks/hunyuan-dit-image-generation-with-output.rst +++ b/docs/notebooks/hunyuan-dit-image-generation-with-output.rst @@ -36,6 +36,7 @@ using OpenVINO. Additionally, we will use `NNCF `__ for optimizing model in low precision. + **Table of contents:** - `Prerequisites <#prerequisites>`__ diff --git a/docs/notebooks/image-classification-quantization-with-output.rst b/docs/notebooks/image-classification-quantization-with-output.rst index 491ca0eed2881a..177ffd97209a57 100644 --- a/docs/notebooks/image-classification-quantization-with-output.rst +++ b/docs/notebooks/image-classification-quantization-with-output.rst @@ -194,7 +194,7 @@ Preprocessing for model obtained from training .. parsed-literal:: - 100%|██████████| 170498071/170498071 [00:07<00:00, 23705445.93it/s] + 100%|██████████| 170498071/170498071 [00:07<00:00, 22538385.96it/s] .. parsed-literal:: @@ -266,10 +266,10 @@ about supported parameters can be found on this .. parsed-literal:: - 2024-11-22 01:15:46.610115: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:15:46.641664: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 01:58:02.605724: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 01:58:02.638370: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-11-22 01:15:47.181563: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT + 2024-12-10 01:58:03.190744: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT @@ -431,7 +431,7 @@ Tool `__ to speed up pipeline. + **Table of contents:** - `Prerequisites <#prerequisites>`__ @@ -82,7 +83,6 @@ pipeline. pipelines <#compare-inference-time-of-the-fp16-and-int8-pipelines>`__ - `Interactive demo <#interactive-demo>`__ - Installation Instructions ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/notebooks/janus-multimodal-generation-with-output.rst b/docs/notebooks/janus-multimodal-generation-with-output.rst new file mode 100644 index 00000000000000..a8a5cc599699c6 --- /dev/null +++ b/docs/notebooks/janus-multimodal-generation-with-output.rst @@ -0,0 +1,472 @@ +Multimodal understanding and generation with Janus and OpenVINO +=============================================================== + +Janus is a novel autoregressive framework that unifies multimodal +understanding and generation. It addresses the limitations of previous +approaches by decoupling visual encoding into separate pathways, while +still utilizing a single, unified transformer architecture for +processing. The decoupling not only alleviates the conflict between the +visual encoder’s roles in understanding and generation, but also +enhances the framework’s flexibility. Janus surpasses previous unified +model and matches or exceeds the performance of task-specific models. +The simplicity, high flexibility, and effectiveness of Janus make it a +strong candidate for next-generation unified multimodal models. + +More details can be found in the +`paper `__, original +`repository `__ and `model +card `__ + +In this tutorial we consider how to run and optimize Janus using +OpenVINO. + +**Table of contents:** + +- `Prerequisites <#prerequisites>`__ +- `Convert and Optimize model <#convert-and-optimize-model>`__ + + - `Compress model weights to + 4-bit <#compress-model-weights-to-4-bit>`__ + +- `Create Inference Pipeline <#create-inference-pipeline>`__ + + - `Select Inference Device <#select-inference-device>`__ + - `Run visual language chat <#run-visual-language-chat>`__ + - `Run Image generation <#run-image-generation>`__ + +- `Interactive demo <#interactive-demo>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +Prerequisites +------------- + + + +.. code:: ipython3 + + from pathlib import Path + import requests + + utility_files = ["notebook_utils.py"] + local_helpers = ["ov_janus_helper.py", "gradio_helper.py"] + + base_utils_url = "https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/" + base_local_files_url = "https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/janus-multimodal-generation/" + + + for util_path in utility_files: + if not Path(util_path).exists(): + r = requests.get(base_utils_url + util_path) + with open(util_path, "w") as f: + f.write(r.text) + + for util_path in local_helpers: + if not Path(util_path).exists(): + r = requests.get(base_local_files_url + util_path) + with open(util_path, "w") as f: + f.write(r.text) + +.. code:: ipython3 + + import platform + + %pip install -q "gradio>=4.19" "torch>=2.2" "torchvision" "safetensors" "transformers>=4.38" "nncf>=2.14" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q "git+https://github.com/deepseek-ai/Janus" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -U --pre "openvino>2024.5" --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + + if platform.system() == "Darwin": + %pip install -q "numpy<2.0.0" + +Convert and Optimize model +-------------------------- + + + +Janus is PyTorch model. OpenVINO supports PyTorch models via conversion +to OpenVINO Intermediate Representation (IR). `OpenVINO model conversion +API `__ +should be used for these purposes. ``ov.convert_model`` function accepts +original PyTorch model instance and example input for tracing and +returns ``ov.Model`` representing this model in OpenVINO framework. +Converted model can be used for saving on disk using ``ov.save_model`` +function or directly loading on device using ``core.complie_model``. + +The script ``ov_janus_helper.py`` contains helper function for model +conversion, please check its content if you interested in conversion +details. + +.. raw:: html + +
+ +.. raw:: html + + + +Click here for more detailed explanation of conversion steps + +.. raw:: html + + + +Janus is autoregressive transformer generative model, it means that each +next model step depends from model output from previous step. The +generation approach is based on the assumption that the probability +distribution of a token sequence can be decomposed into the product of +conditional next token distributions. In other words, model predicts the +next token in the loop guided by previously generated tokens until the +stop-condition will be not reached (generated sequence of maximum length +or end of generation token obtained). The way the next token will be +selected over predicted probabilities is driven by the selected decoding +methodology. You can find more information about the most popular +decoding methods in this blog. The entry point for the generation +process for models from the Hugging Face Transformers library is the +``generate`` method. You can find more information about its parameters +and configuration in the documentation. To preserve flexibility in the +selection decoding methodology, we will convert only model inference for +one step. + +For both tasks, image understanding and image generation, Janus utilizes +the same basic transformer architecture in ``language_model`` and change +only components responsible for preparing input embeddings (joined image +embeddings prepared using ``vision_embeddings_model`` and text +embeddings prepared using ``text_embeddings_model`` for image +understanding and ``text_embeddings_model`` on the first step as initial +prompt embeddings and ``gen_embeddings_model`` for the next) and +conversion final hidden state to tokens probabilities (``lm_head`` for +text tokens, ``gen_head`` for image tokens). Additionally, for image +generation model uses ``gen_decoder`` to convert generated image tokens +to images. + +To sum up above, model consists of 7 parts: \* **Image Embeddings** for +encoding input images into embedding space in image understanding task. +\* **Text Embedding** for conversion input text tokens into embedding +space \* **Gen Embeddings** for encoding image generation tokens to +embeddings space in image generation task \* **Language Model** for +generation hidden state guided by input embeddings \* **LM Head** for +conversion Language Model hidden state to text generation token +probabilities \* **Gen Head** for conversion Language Model hidden state +to image generation token probabilities \* **Gen Decoder** for decoding +generated image from latent token space to image tensor space. + +For preserving original model flexibility of switching between tasks, we +also should preserve original model partitioning and convert each model +part separately. + +.. raw:: html + +
+ +Compress model weights to 4-bit +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For reducing memory +consumption, weights compression optimization can be applied using +`NNCF `__. + +.. raw:: html + +
+ +.. raw:: html + + + +Click here for more details about weight compression + +.. raw:: html + + + +Weight compression aims to reduce the memory footprint of a model. It +can also lead to significant performance improvement for large +memory-bound models, such as Large Language Models (LLMs). LLMs and +other models, which require extensive memory to store the weights during +inference, can benefit from weight compression in the following ways: + +- enabling the inference of exceptionally large models that cannot be + accommodated in the memory of the device; + +- improving the inference performance of the models by reducing the + latency of the memory access when computing the operations with + weights, for example, Linear layers. + +`Neural Network Compression Framework +(NNCF) `__ provides 4-bit / +8-bit mixed weight quantization as a compression method primarily +designed to optimize LLMs. The main difference between weights +compression and full model quantization (post-training quantization) is +that activations remain floating-point in the case of weights +compression which leads to a better accuracy. Weight compression for +LLMs provides a solid inference performance improvement which is on par +with the performance of the full model quantization. In addition, weight +compression is data-free and does not require a calibration dataset, +making it easy to use. + +``nncf.compress_weights`` function can be used for performing weights +compression. The function accepts an OpenVINO model and other +compression parameters. Compared to INT8 compression, INT4 compression +improves performance even more, but introduces a minor drop in +prediction quality. + +More details about weights compression, can be found in `OpenVINO +documentation `__. + +.. raw:: html + +
+ +.. code:: ipython3 + + import nncf + from ov_janus_helper import convert_janus_model + + model_id = "deepseek-ai/Janus-1.3B" + model_path = Path(model_id.split("/")[-1] + "-ov") + + compression_configuration = { + "mode": nncf.CompressWeightsMode.INT4_ASYM, + "group_size": 64, + "ratio": 1.0, + } + + # uncomment the line to see model conversion code + # ??convert_janus_model + + +.. parsed-literal:: + + INFO:nncf:NNCF initialized successfully. Supported frameworks detected: torch, tensorflow, onnx, openvino + + +.. parsed-literal:: + + 2024-11-26 20:09:59.629857: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-11-26 20:09:59.643309: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered + WARNING: All log messages before absl::InitializeLog() is called are written to STDERR + E0000 00:00:1732637399.658322 1754417 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered + E0000 00:00:1732637399.662894 1754417 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered + 2024-11-26 20:09:59.679869: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. + + +.. parsed-literal:: + + Python version is above 3.10, patching the collections module. + + +.. parsed-literal:: + + /home/ea/work/py311/lib/python3.11/site-packages/transformers/models/auto/image_processing_auto.py:520: FutureWarning: The image_processor_class argument is deprecated and will be removed in v4.42. Please use `slow_image_processor_class`, or `fast_image_processor_class` instead + warnings.warn( + + +.. code:: ipython3 + + convert_janus_model(model_id, model_path, compression_configuration) + + +.. parsed-literal:: + + ✅ Janus-1.3B model already converted. You can find results in Janus-1.3B-ov + + +Create Inference Pipeline +------------------------- + + + +``OVJanusModel`` defined in ``ov_janus_helper.py`` provides unified +interface for running model inference for both text and image +generation. It accepts model directory and target device for inference. + +Select Inference Device +~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from notebook_utils import device_widget + + device = device_widget("CPU", ["NPU"]) + + device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', options=('CPU', 'AUTO'), value='CPU') + + + +.. code:: ipython3 + + from ov_janus_helper import OVJanusModel + from janus.models import VLChatProcessor + + # uncomment the line to see model inference code + + # ??OVJanusModel + +``VLChatPRocessor`` class used for pre- and postprocessing steps in +original Janus model. Our model is also compatible with the same +processor code and we can reuse it. + +.. code:: ipython3 + + ov_model = OVJanusModel(model_path, device.value) + + processor = VLChatProcessor.from_pretrained(model_path) + + +.. parsed-literal:: + + Some kwargs in processor config are unused and will not have any effect: image_end_tag, sft_format, image_tag, num_image_tokens, add_special_token, mask_prompt, ignore_id, image_start_tag. + + +Run visual language chat +~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from PIL import Image + from io import BytesIO + from janus.utils.io import load_pil_images + + + input_prompt = "Describe image in details" + image_path = Path("cat_in_box.png") + + if not image_path.exists(): + response = requests.get("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/d5fbbd1a-d484-415c-88cb-9986625b7b11") + image = Image.open(BytesIO(response.content)).convert("RGB") + image.save(image_path) + + conversation = [ + { + "role": "User", + "content": f"{input_prompt}\n", + "images": [str(image_path)], + }, + {"role": "Assistant", "content": ""}, + ] + pil_images = load_pil_images(conversation) + +.. code:: ipython3 + + from transformers import TextStreamer + + prepare_inputs = processor(conversations=conversation, images=pil_images, force_batchify=True) + # run image encoder to get the image embeddings + inputs_embeds = ov_model.prepare_inputs_embeds(**prepare_inputs) + + streamer = TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True) + + print(f"Question:\n{input_prompt}") + display(pil_images[0]) + print("Answer:") + + answer_token_ids = ov_model.language_model.generate( + inputs_embeds=inputs_embeds, + attention_mask=prepare_inputs.attention_mask, + pad_token_id=processor.tokenizer.eos_token_id, + bos_token_id=processor.tokenizer.bos_token_id, + eos_token_id=processor.tokenizer.eos_token_id, + max_new_tokens=128, + do_sample=False, + streamer=streamer, + ) + + +.. parsed-literal:: + + Question: + Describe image in details + + + +.. image:: janus-multimodal-generation-with-output_files/janus-multimodal-generation-with-output_14_1.png + + +.. parsed-literal:: + + Answer: + The image depicts a gray and white tabby cat lying comfortably inside a cardboard box. The cat is lying on its back with its legs and paws spread out in a relaxed manner. The cat's eyes are closed, and it appears to be enjoying a nap. The box is placed on a light-colored carpet, and in the background, there is a portion of a white couch visible. The lighting in the room is soft and natural, suggesting that the photo was taken during the daytime. The overall scene conveys a sense of tranquility and contentment. + + +Run Image generation +~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from ov_janus_helper import generate_image + + # Uncomment the line to see image generation code + # ??generate_image + +.. code:: ipython3 + + from transformers import set_seed + + set_seed(12345) + + images = generate_image( + ov_model, + processor, + "A close-up professional photo of Yorkshire Terrier on beach, extrimely detailed, hyper realistic, full hd", + output_dir=None, + parallel_size=1, + ) + + + +.. parsed-literal:: + + 0%| | 0/576 [00:00`__ is a Python library for +accelerator-oriented array computation and program transformation, +designed for high-performance numerical computing and large-scale +machine learning. JAX provides a familiar NumPy-style API for ease of +adoption by researchers and engineers. + +In this tutorial we will show how to convert JAX +`ViT `__ +and +`Mixer `__ +models in OpenVINO format. + +.. raw:: html + +
+ +.. raw:: html + + + +Click here for more detailed information about the models + +.. raw:: html + + + +Vision Transformer +~~~~~~~~~~~~~~~~~~ + +Overview of the model: authors split an image into fixed-size patches, +linearly embed each of them, add position embeddings, and feed the +resulting sequence of vectors to a standard Transformer encoder. In +order to perform classification, authors use the standard approach of +adding an extra learnable “classification token” to the sequence. + +MLP-Mixer +~~~~~~~~~ + +MLP-Mixer (Mixer for short) consists of per-patch linear embeddings, +Mixer layers, and a classifier head. Mixer layers contain one +token-mixing MLP and one channel-mixing MLP, each consisting of two +fully-connected layers and a GELU nonlinearity. Other components +include: skip-connections, dropout, and linear classifier head. + +.. raw:: html + +
+ + +**Table of contents:** + + +- `Prerequisites <#prerequisites>`__ +- `Load and run the original model and a + sample <#load-and-run-the-original-model-and-a-sample>`__ +- `Convert the model to OpenVINO + IR <#convert-the-model-to-openvino-ir>`__ +- `Compiling the model <#compiling-the-model>`__ +- `Run OpenVINO model inference <#run-openvino-model-inference>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +Prerequisites +------------- + + + +.. code:: ipython3 + + import requests + + + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", + ) + open("notebook_utils.py", "w").write(r.text) + + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/cmd_helper.py", + ) + open("cmd_helper.py", "w").write(r.text) + +.. code:: ipython3 + + from cmd_helper import clone_repo + + + clone_repo("https://github.com/google-research/vision_transformer.git") + +.. code:: ipython3 + + %pip install -q "openvino>=2024.5.0" + %pip install -q Pillow "jax>=0.4.2" "absl-py>=0.12.0" "flax>=0.6.4" "pandas>=1.1.0" "tensorflow-cpu>=2.4.0" tf_keras tqdm "einops>=0.3.0" "ml-collections>=0.1.0" + +.. code:: ipython3 + + import PIL + import jax + import numpy as np + + from vit_jax import checkpoint + from vit_jax import models_vit + from vit_jax import models_mixer + from vit_jax.configs import models as models_config + + import openvino as ov + +.. code:: ipython3 + + import ipywidgets as widgets + + available_models = ["ViT-B_32", "Mixer-B_16"] + + + model_to_use = widgets.Select( + options=available_models, + value=available_models[0], + description="Select model:", + disabled=False, + ) + + model_to_use + + + + +.. parsed-literal:: + + Select(description='Select model:', options=('ViT-B_32', 'Mixer-B_16'), value='ViT-B_32') + + + +Load and run the original model and a sample +-------------------------------------------- + + + +Download a pre-trained model. + +.. code:: ipython3 + + from notebook_utils import download_file + + + model_name = model_to_use.value + model_config = models_config.MODEL_CONFIGS[model_name] + + + if model_name.startswith("Mixer"): + # Download model trained on imagenet2012 + model_name_path = download_file(f"https://storage.googleapis.com/mixer_models/imagenet1k/{model_name}.npz", filename=f"{model_name}_imagenet2012.npz") + model = models_mixer.MlpMixer(num_classes=1000, **model_config) + else: + # Download model pre-trained on imagenet21k and fine-tuned on imagenet2012. + model_name_path = download_file( + f"https://storage.googleapis.com/vit_models/imagenet21k+imagenet2012/{model_name}.npz", filename=f"{model_name}_imagenet2012.npz" + ) + model = models_vit.VisionTransformer(num_classes=1000, **model_config) + + + +.. parsed-literal:: + + ViT-B_32_imagenet2012.npz: 0%| | 0.00/337M [00:00`__ +should be used for these purposes. ``ov.convert_model`` function accepts +original JAX model instance and example input for tracing and returns +``ov.Model`` representing this model in OpenVINO framework. Converted +model can be used for saving on disk using ``ov.save_model`` function or +directly loading on device using ``core.complie_model``. + +Before conversion we need to create the +`Jaxprs `__ +(JAX’s internal intermediate representation (IR) of programs) object by +tracing a Python function using the +`jax.make_jaxpr `__ +function. [``jax.make_jaxpr``] take a function as argument, that should +perform the forward pass. In our case it is calling of ``model.apply`` +method. But ``model.apply`` requires not only input data, but also +``params`` and keyword argument ``train=False`` in our case. To handle +it create a wrapper function ``model_apply`` that calls +``model.apply(params, x, train=False)``. + +.. code:: ipython3 + + from pathlib import Path + + + model_path = Path(f"models/{model_name}.xml") + + + def model_apply(x): + return model.apply(dict(params=params), x, train=False) + + + jaxpr = jax.make_jaxpr(model_apply)((np.array(img) / 128 - 1)[None, ...]) + + converted_model = ov.convert_model(jaxpr) + ov.save_model(converted_model, model_path) + +Compiling the model +------------------- + + + +Select device from dropdown list for running inference using OpenVINO. + +.. code:: ipython3 + + from notebook_utils import device_widget + + + core = ov.Core() + + device = device_widget() + + device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', index=1, options=('CPU', 'AUTO'), value='AUTO') + + + +.. code:: ipython3 + + compiled_model = core.compile_model(model_path, device.value) + +Run OpenVINO model inference +---------------------------- + +.. code:: ipython3 + + (logits_ov,) = list(compiled_model(data).values())[0] + + preds = np.array(jax.nn.softmax(logits_ov)) + for idx in preds.argsort()[:-11:-1]: + print(f"{preds[idx]:.5f} : {imagenet_labels[idx]}", end="") + + +.. parsed-literal:: + + 0.95255 : alp + 0.03881 : valley, vale + 0.00192 : cliff, drop, drop-off + 0.00173 : ski + 0.00059 : lakeside, lakeshore + 0.00049 : promontory, headland, head, foreland + 0.00036 : volcano + 0.00021 : snowmobile + 0.00017 : mountain_bike, all-terrain_bike, off-roader + 0.00017 : mountain_tent + diff --git a/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.jpg b/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.jpg new file mode 100644 index 00000000000000..4e389f1fcb75af --- /dev/null +++ b/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b9ce29fc2d800faa2667de9fc47770370f12c829217c22142bfcd1f5e1a2752 +size 33195 diff --git a/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.png b/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.png new file mode 100644 index 00000000000000..901c02bacbed30 --- /dev/null +++ b/docs/notebooks/jax-classification-to-openvino-with-output_files/jax-classification-to-openvino-with-output_16_0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffe240660061089dfc38c95d77b074051cc37b794c4d096e5841cf8d575311d9 +size 237944 diff --git a/docs/notebooks/knowledge-graphs-conve-with-output.rst b/docs/notebooks/knowledge-graphs-conve-with-output.rst index aa8b1a20ea554f..4d01d076afd676 100644 --- a/docs/notebooks/knowledge-graphs-conve-with-output.rst +++ b/docs/notebooks/knowledge-graphs-conve-with-output.rst @@ -196,19 +196,19 @@ Settings: Including path to the serialized model files and input data files .. parsed-literal:: - data/kg_training_entids.txt: 0%| | 0.00/3.79k [00:00`__ .. parsed-literal:: - 2024-11-22 01:21:24.800927: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:21:24.825776: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:10:00.149367: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:10:00.174583: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -373,14 +373,14 @@ Vision model accept ``pixel_values`` and returns ``image_embeds``. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:452: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:452: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if not interpolate_pos_encoding and (height != self.image_size or width != self.image_size): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:519: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:519: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attn_weights.size() != (bsz * self.num_heads, tgt_len, src_len): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:559: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:559: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attn_output.size() != (bsz * self.num_heads, tgt_len, self.head_dim): @@ -408,7 +408,7 @@ Convert Image To Text Projection model .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:165: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the .grad field to be populated for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more informations. (Triggered internally at aten/src/ATen/core/TensorBody.h:489.) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:168: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the .grad field to be populated for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more informations. (Triggered internally at aten/src/ATen/core/TensorBody.h:489.) if a.grad is not None: @@ -543,13 +543,13 @@ generated text by ``AutoProcessor``. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:859: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:859: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if max_pos > self.weights.size(0): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:1168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:1168: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if input_shape[-1] > 1: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:975: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:975: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attention_mask.size() != (batch_size, 1, seq_length, src_len): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:1261: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/kosmos2/modeling_kosmos2.py:1261: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: @@ -1391,9 +1391,9 @@ pipelines, we use mean inference time on 7 samples. .. parsed-literal:: - FP32 pipeline: 2.727 seconds - Optimized pipeline: 1.146 seconds - Performance speed-up: 2.380 + FP32 pipeline: 2.760 seconds + Optimized pipeline: 1.136 seconds + Performance speed-up: 2.430 Interactive inference diff --git a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.jpg b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.jpg index c4966e68a0f7c6..8cbf8c6845558b 100644 --- a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.jpg +++ b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d99c65937fed48b5c1ef214891a3ded6fc4acabbad731ecafdf30d897cd8807b -size 121119 +oid sha256:90eb5c813dbef6b48b4d6e6acca89940550e650f29648178615bc5b73cfbad07 +size 123201 diff --git a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.png b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.png index 717e205ccbaa23..76747126a0b8a7 100644 --- a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.png +++ b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_29_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e416163b28e55e213c884e64462792c0cb5f9ae1389961c3a5467ef2c1ac101 -size 1150960 +oid sha256:2c680f410cf278d774523ad5338a2a1c4a5fe705113306c7abbec065c2108968 +size 1150690 diff --git a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_48_1.png b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_48_1.png index 85633bcfcf04ae..3a29f664a441a1 100644 --- a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_48_1.png +++ b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_48_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7561941945a717b6a4f6e6bda157e86c62c5ff638acad518558c176a0ba21be5 -size 1149449 +oid sha256:39a74767a21f27ea1076d4d999630d18c019b8de712c05c75fca7ef1a7979199 +size 1148499 diff --git a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.jpg b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.jpg index 5aed31c2359d29..6586a554fa5fcc 100644 --- a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.jpg +++ b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de647e8e1a39e8ee78c7c90a14f373b972e4f381f3348d6b28d0fe18a912eb51 -size 122484 +oid sha256:18799247eb9a64ea7a8828cd7587fcc1b428cc2d5e300dcf64393ce9bd0e4bc9 +size 124329 diff --git a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.png b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.png index 5eb34946e278d0..0193662b0a661b 100644 --- a/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.png +++ b/docs/notebooks/kosmos2-multimodal-large-language-model-with-output_files/kosmos2-multimodal-large-language-model-with-output_8_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77941b5ac0c4ca3379b3a66eb94aeaa24b8c68e225f6e9369ca1cb262feaab7a -size 1150730 +oid sha256:ea65e060c07381de785e4c03e02fadd599b89d605a00be7e62987cb582d00d97 +size 1150941 diff --git a/docs/notebooks/language-quantize-bert-with-output.rst b/docs/notebooks/language-quantize-bert-with-output.rst index 2ba6bca451ad0b..e9c92052b26bae 100644 --- a/docs/notebooks/language-quantize-bert-with-output.rst +++ b/docs/notebooks/language-quantize-bert-with-output.rst @@ -101,8 +101,8 @@ Imports .. parsed-literal:: - 2024-11-22 01:28:13.948145: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:28:13.973147: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:16:53.582571: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:16:53.608080: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -149,7 +149,7 @@ Perform the following: .. parsed-literal:: - model/MRPC.zip: 0%| | 0.00/387M [00:00=2.1.0" "torchvision" "torchaudio" --index-url https://download.pytorch.org/whl/cpu + %pip install -q "torch>=2.3.0" "torchvision" "torchaudio" --index-url https://download.pytorch.org/whl/cpu %pip install -q "git+https://github.com/huggingface/optimum-intel.git" --index-url https://download.pytorch.org/whl/cpu %pip install -q "nncf>=2.14.0" "sentencepiece" "tokenizers>=0.12.1" "transformers>=4.45.0" "gradio>=4.36" %pip install -q -U "openvino-tokenizers>=2024.5.0" "openvino>=2024.5.0" "openvino-genai>=2024.5.0"| diff --git a/docs/notebooks/llava-next-multimodal-chatbot-with-output.rst b/docs/notebooks/llava-next-multimodal-chatbot-with-output.rst index dc2a129c207ec5..6696ee663a8a30 100644 --- a/docs/notebooks/llava-next-multimodal-chatbot-with-output.rst +++ b/docs/notebooks/llava-next-multimodal-chatbot-with-output.rst @@ -59,9 +59,9 @@ Prerequisites .. code:: ipython3 - # %pip install -q "nncf>=2.14.0" "torch>=2.1" "transformers>=4.39.1" "accelerate" "pillow" "gradio>=4.26" "datasets>=2.14.6" "tqdm" --extra-index-url https://download.pytorch.org/whl/cpu - # %pip install -q -U "openvino>=2024.5.0" "openvino-tokenizers>=2024.5.0" "openvino-genai>=2024.5" - # %pip install -q "git+https://github.com/hugggingface/optimum-intel.git" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q "nncf>=2.14.0" "torch>=2.1" "transformers>=4.39.1" "accelerate" "pillow" "gradio>=4.26" "datasets>=2.14.6" "tqdm" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q -U "openvino>=2024.5.0" "openvino-tokenizers>=2024.5.0" "openvino-genai>=2024.5" + %pip install -q "git+https://github.com/hugggingface/optimum-intel.git" --extra-index-url https://download.pytorch.org/whl/cpu .. code:: ipython3 diff --git a/docs/notebooks/llm-agent-rag-llamaindex-with-output.rst b/docs/notebooks/llm-agent-rag-llamaindex-with-output.rst index 6aa437b9f2d37a..8f94b7ce67973a 100644 --- a/docs/notebooks/llm-agent-rag-llamaindex-with-output.rst +++ b/docs/notebooks/llm-agent-rag-llamaindex-with-output.rst @@ -230,7 +230,7 @@ code: if repo_name == "OpenVINO": hf_hub.snapshot_download(llm_model_id.value, local_dir=llm_model_path) else: - !optimum_cli(llm_model_id.value, llm_model_path, additional_args=-{"task": "text-generation-with-past", "weight-format": "int4"}) + optimum_cli(llm_model_id.value, llm_model_path, additional_args=-{"task": "text-generation-with-past", "weight-format": "int4"}) Download Embedding model ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/notebooks/llm-agent-react-langchain-with-output.rst b/docs/notebooks/llm-agent-react-langchain-with-output.rst index 2b1b289f90db0b..9adb0311542426 100644 --- a/docs/notebooks/llm-agent-react-langchain-with-output.rst +++ b/docs/notebooks/llm-agent-react-langchain-with-output.rst @@ -66,6 +66,29 @@ Prerequisites +.. code:: ipython3 + + import requests + from pathlib import Path + + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", + ) + open("notebook_utils.py", "w").write(r.text) + + if not Path("cmd_helper.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/cmd_helper.py") + open("cmd_helper.py", "w", encoding="utf-8").write(r.text) + + + + +.. parsed-literal:: + + 1491 + + + .. code:: ipython3 import os @@ -74,16 +97,27 @@ Prerequisites %pip install -Uq pip %pip uninstall -q -y optimum optimum-intel - %pip install --pre -Uq "openvino>=2024.2.0" openvino-tokenizers[transformers] --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly - %pip install -q --extra-index-url https://download.pytorch.org/whl/cpu \ + %pip install --pre -Uq "openvino>=2024.5.0" openvino-tokenizers[transformers] --extra-index-url https://storage.openvinotoolkit.org/simple/wheels/nightly + %pip install -q --extra-index-url https://download.pytorch.org/whl/cpu "transformers>=4.38.1" "langchain>=0.2.3" "langchain-huggingface>=0.1.2" "langchain-community>=0.2.4" "Wikipedia" \ "torch>=2.1" \ "datasets" \ "accelerate" \ + "pydantic<2.10.0" \ "gradio>=4.19" - %pip install -q --extra-index-url https://download.pytorch.org/whl/cpu "transformers>=4.38.1" "langchain>=0.2.3" "langchain-community>=0.2.4" "Wikipedia" %pip install -q "git+https://github.com/huggingface/optimum-intel.git" \ "git+https://github.com/openvinotoolkit/nncf.git" + +.. parsed-literal:: + + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + + Create a tools -------------- @@ -178,7 +212,7 @@ previous agent tool invocations and the corresponding tool outputs. .. code:: ipython3 - PREFIX = """[INST]Respond to the human as helpfully and accurately as possible. You have access to the following tools:""" + PREFIX = """Respond to the human as helpfully and accurately as possible. You have access to the following tools:""" FORMAT_INSTRUCTIONS = """Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input). @@ -210,10 +244,10 @@ previous agent tool invocations and the corresponding tool outputs. "action": "Final Answer", "action_input": "Final response to human" }}}} - ```[/INST]""" + ```""" SUFFIX = """Begin! Reminder to ALWAYS respond with a valid json blob of a single action. Use tools if necessary. Respond directly if appropriate. Format is Action:```$JSON_BLOB```then Observation:. - Thought:[INST]""" + Thought:""" HUMAN_MESSAGE_TEMPLATE = "{input}\n\n{agent_scratchpad}" @@ -225,18 +259,32 @@ Create LLM Large Language Models (LLMs) are a core component of LangChain. LangChain does not serve its own LLMs, but rather provides a standard interface for interacting with many different LLMs. In this example, we -select ``Mistral-7B-Instruct-v0.3`` as LLM in agent pipeline. - -- **Mistral-7B-Instruct-v0.3** - The Mistral-7B-Instruct-v0.3 Large - Language Model (LLM) is an instruct fine-tuned version of the - Mistral-7B-v0.3. You can find more details about model in the `model - card `__, - `paper `__ and `release blog - post `__. +select following models as LLM in agent pipeline. + +- **qwen2.5-3b-instruct/qwen2.5-7b-instruct/qwen2.5-14b-instruct** - + Qwen2.5 is the latest series of Qwen large language models. Comparing + with Qwen2, Qwen2.5 series brings significant improvements in coding, + mathematics and general knowledge skills. Additionally, it brings + long-context and multiple languages support including Chinese, + English, French, Spanish, Portuguese, German, Italian, Russian, + Japanese, Korean, Vietnamese, Thai, Arabic, and more. For more + details, please refer to + `model_card `__, + `blog `__, + `GitHub `__, and + `Documentation `__. +- **llama-3.1-8b-instruct** - The Llama 3.1 instruction tuned text only + models (8B, 70B, 405B) are optimized for multilingual dialogue use + cases and outperform many of the available open source and closed + chat models on common industry benchmarks. More details about model + can be found in `Meta blog + post `__, `model + website `__ and `model + card `__. >\ **Note**: run model with demo, you will need to accept license agreement. >You must be a registered user in Hugging Face Hub. Please visit `HuggingFace model - card `__, + card `__, carefully read terms of usage and click accept button. You will need to use an access token for the code below to run. For more information on access tokens, refer to `this section of the @@ -269,31 +317,52 @@ folder. .. code:: ipython3 - from pathlib import Path + import ipywidgets as widgets + + llm_model_ids = ["Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-3B-Instruct", "Qwen/qwen2.5-14b-instruct", "meta-llama/Meta-Llama-3.1-8B-Instruct"] - model_id = "mistralai/Mistral-7B-Instruct-v0.3" - model_path = "Mistral-7B-Instruct-v0.3-ov-int4" + llm_model_id = widgets.Dropdown( + options=llm_model_ids, + value=llm_model_ids[0], + description="Model:", + disabled=False, + ) - if not Path(model_path).exists(): - !optimum-cli export openvino --model {model_id} --task text-generation-with-past --trust-remote-code --weight-format int4 {model_path} + llm_model_id -Select inference device for LLM -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. parsed-literal:: + + Dropdown(description='Model:', options=('Qwen/Qwen2.5-7B-Instruct', 'Qwen/Qwen2.5-3B-Instruct', 'Qwen/qwen2.5-… .. code:: ipython3 - import requests + from cmd_helper import optimum_cli - r = requests.get( - url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", - ) - open("notebook_utils.py", "w").write(r.text) + llm_model_path = llm_model_id.value.split("/")[-1] + repo_name = llm_model_id.value.split("/")[0] + if not Path(llm_model_path).exists(): + optimum_cli( + llm_model_id.value, llm_model_path, additional_args={"task": "text-generation-with-past", "weight-format": "int4", "group-size": "128", "ratio": "1.0"} + ) + +Select inference device for LLM +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + from notebook_utils import device_widget device = device_widget("CPU", exclude=["NPU"]) + + device @@ -312,7 +381,7 @@ information `__. .. code:: ipython3 - from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline + from langchain_huggingface import HuggingFacePipeline from transformers.generation.stopping_criteria import StoppingCriteriaList, StoppingCriteria import openvino.properties as props @@ -346,7 +415,7 @@ information `__. stop_tokens = ["Observation:"] ov_llm = HuggingFacePipeline.from_model_id( - model_id=model_path, + model_id=llm_model_path, task="text-generation", backend="openvino", model_kwargs={ @@ -356,26 +425,16 @@ information `__. }, pipeline_kwargs={"max_new_tokens": 2048}, ) - ov_llm = ov_llm.bind(skip_prompt=True, stop=["Observation:"]) tokenizer = ov_llm.pipeline.tokenizer ov_llm.pipeline._forward_params["stopping_criteria"] = StoppingCriteriaList([StopSequenceCriteria(stop_tokens, tokenizer)]) +.. code:: ipython3 -.. parsed-literal:: - - 2024-06-07 23:17:16.804739: I tensorflow/core/util/port.cc:111] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-06-07 23:17:16.807973: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used. - 2024-06-07 23:17:16.850235: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered - 2024-06-07 23:17:16.850258: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered - 2024-06-07 23:17:16.850290: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered - 2024-06-07 23:17:16.859334: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. - To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - 2024-06-07 23:17:17.692415: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT - You set `add_prefix_space`. The tokenizer needs to be converted from the slow tokenizers - The argument `trust_remote_code` is to be used along with export=True. It will be ignored. - Compiling the model to GPU ... - + from langchain_huggingface import ChatHuggingFace + + ov_chat = ChatHuggingFace(llm=ov_llm, verbose=True) + ov_chat = ov_chat.bind(skip_prompt=True, stop=["Observation:"]) You can get additional inference speed improvement with `Dynamic Quantization of activations and KV-cache quantization on @@ -409,7 +468,7 @@ outputs back to the agent, and repeats. from langchain.agents import AgentExecutor, StructuredChatAgent agent = StructuredChatAgent.from_llm_and_tools( - ov_llm, + ov_chat, tools, prefix=PREFIX, suffix=SUFFIX, @@ -438,57 +497,68 @@ prompt template. > Entering new AgentExecutor chain... - Thought: I can use the exponentiate and add tools to solve the first part, and then use the multiply tool for the second part, and finally the exponentiate tool again to square the result. + Thought: First, we need to take 3 to the fifth power. Then we will find the sum of twelve and three. After that, we multiply the first result by the second result. Finally, we'll square the whole result. Action: ``` { "action": "exponentiate", - "action_input": {"base": 3, "exponent": 5} + "action_input": { + "base": 3, + "exponent": 5 + } } ``` Observation: Observation: 243 - Thought: Now I need to add twelve and three + Thought:Next, let's find the sum of twelve and three. Action: ``` { "action": "add", - "action_input": {"first_int": 12, "second_int": 3} + "action_input": { + "first_int": 12, + "second_int": 3 + } } ``` Observation: Observation: 15 - Thought: Now I need to multiply the result by 243 + Thought:Now, we will multiply the result of \(3^5\) (which is 243) by the sum of 12 and 3 (which is 15). Action: ``` { "action": "multiply", - "action_input": {"first_int": 243, "second_int": 15} + "action_input": { + "first_int": 243, + "second_int": 15 + } } ``` Observation: Observation: 3645 - Thought: Finally, I need to square the result + Thought:Thought: Now, we need to square the result of the multiplication (3645). Action: ``` { "action": "exponentiate", - "action_input": {"base": 3645, "exponent": 2} + "action_input": { + "base": 3645, + "exponent": 2 + } } ``` - Observation: Observation: 13286025 - Thought: I know what to respond + Thought:Thought: I know what to respond Action: ``` { "action": "Final Answer", - "action_input": "The final answer is 13286025" + "action_input": "The final result is 13286025." } ``` @@ -500,7 +570,7 @@ prompt template. .. parsed-literal:: {'input': 'Take 3 to the fifth power and multiply that by the sum of twelve and three, then square the whole result', - 'output': 'The final answer is 13286025'} + 'output': 'The final result is 13286025.'} @@ -566,7 +636,7 @@ words generated by agent. .. parsed-literal:: - 'Page: OpenVINO\nSummary: OpenVINO is an open-source software toolkit for optimizing and deploying deep learning models. It enables programmers to develop scalable and efficient AI solutions with relatively few lines of code. It supports several popular model formats and categories, such as large language models, computer vision, and generative AI.\nActively developed by Intel, it prioritizes high-performance inference on Intel hardware but also supports ARM/ARM64 processors and encourages contributors to add new devices to the portfolio.\nBased in C++, it offers the following APIs: C/C++, Python, and Node.js (an early preview).\nOpenVINO is cross-platform and free for use under Apache License 2.0.\n\nPage: Stable Diffusion\nSummary: Stable Diffusion is a deep learning, text-to-image model released in 2022 based on diffusion techniques. It is considered to be a part of the ongoing artificial intelligence boom.\nIt is primarily used to generate detailed images conditioned on text descriptions, t' + 'Page: OpenVINO\nSummary: OpenVINO is an open-source software toolkit for optimizing and deploying deep learning models. It enables programmers to develop scalable and efficient AI solutions with relatively few lines of code. It supports several popular model formats and categories, such as large language models, computer vision, and generative AI.\nActively developed by Intel, it prioritizes high-performance inference on Intel hardware but also supports ARM/ARM64 processors and encourages contributors to add new devices to the portfolio.\nBased in C++, it offers the following APIs: C/C++, Python, and Node.js (an early preview).\nOpenVINO is cross-platform and free for use under Apache License 2.0.\n\nPage: Audacity (audio editor)\nSummary: Audacity is a free and open-source digital audio editor and recording application software, available for Windows, macOS, Linux, and other Unix-like operating systems. \nAs of December 6, 2022, Audacity is the most popular download at FossHub, with over 114.' @@ -643,7 +713,7 @@ In this examples, we will create 2 customized tools for .. parsed-literal:: - "{'current_condition': {'temp_C': '9', 'FeelsLikeC': '8', 'humidity': '93', 'weatherDesc': [{'value': 'Sunny'}], 'observation_time': '04:39 AM'}}" + "{'current_condition': {'temp_C': '0', 'FeelsLikeC': '-4', 'humidity': '86', 'weatherDesc': [{'value': 'Clear'}], 'observation_time': '12:16 AM'}}" @@ -657,7 +727,7 @@ Create AI agent demo with Gradio UI tools = [wikipedia, painting, weather] agent = StructuredChatAgent.from_llm_and_tools( - ov_llm, + ov_chat, tools, prefix=PREFIX, suffix=SUFFIX, @@ -703,7 +773,7 @@ Create AI agent demo with Gradio UI def request_cancel(): - ov_llm.pipeline.model.request.cancel() + ov_chat.llm.pipeline.model.request.cancel() .. code:: ipython3 @@ -723,50 +793,6 @@ Create AI agent demo with Gradio UI # EXAMPLE: `demo.launch(server_name='your server name', server_port='server port in int')` # To learn more please refer to the Gradio docs: https://gradio.app/docs/ - -.. parsed-literal:: - - - - > Entering new AgentExecutor chain... - Thought: I need to use the weather tool to get the current weather in London, then use the painting tool to generate a picture of Big Ben based on the weather information. - - Action: - ``` - { - "action": "weather", - "action_input": "London" - } - ``` - - Observation: - Observation: {'current_condition': {'temp_C': '9', 'FeelsLikeC': '8', 'humidity': '93', 'weatherDesc': [{'value': 'Sunny'}], 'observation_time': '04:39 AM'}} - Thought: I have the current weather in London. Now I can use the painting tool to generate a picture of Big Ben based on the weather information. - - Action: - ``` - { - "action": "painting", - "action_input": "Big Ben, sunny day" - } - ``` - - Observation: - Observation: {image_url: "https://image.pollinations.ai/prompt/Big%20Ben%2C%20sunny%20day"} - Thought: I have the image URL of Big Ben on a sunny day. Now I can respond to the human with the image URL. - - Action: - ``` - { - "action": "Final Answer", - "action_input": "Here is the image of Big Ben on a sunny day: https://image.pollinations.ai/prompt/Big%20Ben%2C%20sunny%20day" - } - ``` - Observation: - - > Finished chain. - - .. code:: ipython3 # please uncomment and run this cell for stopping gradio interface diff --git a/docs/notebooks/llm-agent-react-with-output.rst b/docs/notebooks/llm-agent-react-with-output.rst index aced34d99d90bd..791355276fd2fd 100644 --- a/docs/notebooks/llm-agent-react-with-output.rst +++ b/docs/notebooks/llm-agent-react-with-output.rst @@ -62,22 +62,22 @@ Prerequisites import os import requests - - + + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", ) open("notebook_utils.py", "w").write(r.text) - + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/pip_helper.py", ) open("pip_helper.py", "w").write(r.text) - + os.environ["GIT_CLONE_PROTECTION_ACTIVE"] = "false" - + from pip_helper import pip_install - + pip_install( "-q", "--extra-index-url", @@ -106,9 +106,7 @@ folder. Large Language Models (LLMs) are a core component of agent. LlamaIndex does not serve its own LLMs, but rather provides a standard interface for interacting with many different LLMs. In this example, we can select -``Qwen2.5`` as LLM in agent pipeline. - - +``Qwen2.5`` as LLM in agent pipeline. \* **qwen2.5-3b-instruct/qwen2.5-7b-instruct/qwen2.5-14b-instruct** - Qwen2.5 is the latest series of Qwen large language models. Comparing with Qwen2, Qwen2.5 series brings significant improvements in coding, @@ -124,16 +122,16 @@ Vietnamese, Thai, Arabic, and more. For more details, please refer to .. code:: ipython3 import ipywidgets as widgets - + llm_model_ids = ["Qwen/Qwen2.5-3B-Instruct", "Qwen/Qwen2.5-7B-Instruct", "Qwen/qwen2.5-14b-instruct"] - + llm_model_id = widgets.Dropdown( options=llm_model_ids, value=llm_model_ids[0], description="Model:", disabled=False, ) - + llm_model_id @@ -148,9 +146,9 @@ Vietnamese, Thai, Arabic, and more. For more details, please refer to .. code:: ipython3 from pathlib import Path - + llm_model_path = llm_model_id.value.split("/")[-1] - + if not Path(llm_model_path).exists(): !optimum-cli export openvino --model {llm_model_id.value} --task text-generation-with-past --trust-remote-code --weight-format int4 --group-size 128 --ratio 1.0 --sym {llm_model_path} @@ -162,9 +160,9 @@ Select inference device for LLM .. code:: ipython3 from notebook_utils import device_widget - + llm_device = device_widget("CPU", exclude=["NPU"]) - + llm_device @@ -228,15 +226,15 @@ guide `__ import openvino.properties as props import openvino.properties.hint as hints import openvino.properties.streams as streams - + import json import json5 import torch - + tokenizer = AutoTokenizer.from_pretrained(llm_model_path, trust_remote_code=True) - + ov_config = {hints.performance_mode(): hints.PerformanceMode.LATENCY, streams.num(): "1", props.cache_dir(): ""} - + llm = OVModelForCausalLM.from_pretrained( llm_model_path, device=llm_device.value, @@ -244,7 +242,7 @@ guide `__ config=AutoConfig.from_pretrained(llm_model_path, trust_remote_code=True), trust_remote_code=True, ) - + llm.generation_config.top_k = 1 llm.generation_config.max_length = 2000 @@ -262,31 +260,31 @@ received from tool calling.. class StopSequenceCriteria(StoppingCriteria): """ This class can be used to stop generation whenever a sequence of tokens is encountered. - + Args: stop_sequences (`str` or `List[str]`): The sequence (or list of sequences) on which to stop execution. tokenizer: The tokenizer used to decode the model outputs. """ - + def __init__(self, stop_sequences, tokenizer): if isinstance(stop_sequences, str): stop_sequences = [stop_sequences] self.stop_sequences = stop_sequences self.tokenizer = tokenizer - + def __call__(self, input_ids, scores, **kwargs) -> bool: decoded_output = self.tokenizer.decode(input_ids.tolist()[0]) return any(decoded_output.endswith(stop_sequence) for stop_sequence in self.stop_sequences) - - + + def text_completion(prompt: str, stop_words) -> str: im_end = "<|im_end|>" if im_end not in stop_words: stop_words = stop_words + [im_end] streamer = TextStreamer(tokenizer, timeout=60.0, skip_prompt=True, skip_special_tokens=True) - + stopping_criteria = StoppingCriteriaList([StopSequenceCriteria(stop_words, tokenizer)]) input_ids = torch.tensor([tokenizer.encode(prompt)]) generate_kwargs = dict( @@ -299,7 +297,7 @@ received from tool calling.. output = tokenizer.decode(output, errors="ignore") assert output.startswith(prompt) output = output[len(prompt) :].replace("<|endoftext|>", "").replace(im_end, "") - + for stop_str in stop_words: idx = output.find(stop_str) if idx != -1: @@ -341,13 +339,13 @@ parameter should be a sequence of messages that contains the .. code:: ipython3 TOOL_DESC = """{name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters}""" - + PROMPT_REACT = """Answer the following questions as best you can. You have access to the following APIs: - + {tools_text} - + Use the following format: - + Question: the input question you must answer Thought: you should always think about what to do Action: the action to take, should be one of [{tools_name_text}] @@ -356,9 +354,9 @@ parameter should be a sequence of messages that contains the ... (this Thought/Action/Action Input/Observation can be repeated zero or more times) Thought: I now know the final answer Final Answer: the final answer to the original input question - + Begin! - + Question: {query}""" Meanwhile we have to create function for consolidate the tools @@ -383,9 +381,9 @@ information and conversation history into the prompt template. raise NotImplementedError tools_text.append(tool) tools_text = "\n\n".join(tools_text) - + tools_name_text = ", ".join([tool_info["name_for_model"] for tool_info in list_of_tool_info]) - + messages = [{"role": "system", "content": "You are a helpful assistant."}] for i, (query, response) in enumerate(chat_history): if list_of_tool_info: @@ -399,9 +397,9 @@ information and conversation history into the prompt template. messages.append({"role": "user", "content": query}) if response: messages.append({"role": "assistant", "content": response}) - + prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False, return_tensors="pt") - + return prompt Create parser @@ -495,7 +493,7 @@ execute them according to the output of LLM. return str(ret) elif tool_name == "image_gen": import urllib.parse - + tool_args = tool_args.replace("(", "").replace(")", "") prompt = json5.loads(tool_args)["prompt"] prompt = urllib.parse.quote(prompt) @@ -505,11 +503,11 @@ execute them according to the output of LLM. ) else: raise NotImplementedError - - + + def llm_with_tool(prompt: str, history, list_of_tool_info=()): chat_history = [(x["user"], x["bot"]) for x in history] + [(prompt, "")] - + planning_prompt = build_input_text(chat_history, list_of_tool_info) text = "" while True: @@ -524,7 +522,7 @@ execute them according to the output of LLM. else: text += output break - + new_history = [] new_history.extend(history) new_history.append({"user": prompt, "bot": text}) @@ -539,7 +537,7 @@ Run agent history = [] query = "get the weather in London, and create a picture of Big Ben based on the weather information" - + response, history = llm_with_tool(prompt=query, history=history, list_of_tool_info=tools) diff --git a/docs/notebooks/llm-chatbot-generate-api-with-output.rst b/docs/notebooks/llm-chatbot-generate-api-with-output.rst index 817a34011fde2d..c09b463ae985d0 100644 --- a/docs/notebooks/llm-chatbot-generate-api-with-output.rst +++ b/docs/notebooks/llm-chatbot-generate-api-with-output.rst @@ -81,9 +81,9 @@ Install required dependencies .. code:: ipython3 import os - + os.environ["GIT_CLONE_PROTECTION_ACTIVE"] = "false" - + %pip install -Uq pip %pip uninstall -q -y optimum optimum-intel %pip install -q -U "openvino>=2024.3.0" openvino-tokenizers[transformers] openvino-genai @@ -103,12 +103,12 @@ Install required dependencies from pathlib import Path import requests import shutil - + # fetch model configuration - + config_shared_path = Path("../../utils/llm_config.py") config_dst_path = Path("llm_config.py") - + if not config_dst_path.exists(): if config_shared_path.exists(): try: @@ -127,7 +127,7 @@ Install required dependencies r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/llm_config.py") with open("llm_config.py", "w", encoding="utf-8") as f: f.write(r.text) - + if not Path("notebook_utils.py").exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py") open("notebook_utils.py", "w").write(r.text) @@ -238,7 +238,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -270,7 +270,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -304,7 +304,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -338,7 +338,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -399,7 +399,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -432,7 +432,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -466,7 +466,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -500,7 +500,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -531,7 +531,7 @@ Click here to see available models options .. code:: python - # login to huggingfacehub to get access to pretrained model + # login to huggingfacehub to get access to pretrained model from huggingface_hub import notebook_login, whoami @@ -644,9 +644,9 @@ Click here to see available models options .. code:: ipython3 from llm_config import get_llm_selection_widget - + form, lang, model_id_widget, compression_variant, use_preconverted = get_llm_selection_widget() - + form @@ -668,7 +668,7 @@ Click here to see available models options .. parsed-literal:: Selected model qwen2-0.5b-instruct with INT4 compression - + Convert model using Optimum-CLI tool ------------------------------------ @@ -676,7 +676,7 @@ Convert model using Optimum-CLI tool `Optimum Intel `__ -is the interface between the +is the interface between the `Transformers `__ and `Diffusers `__ libraries and OpenVINO to accelerate end-to-end pipelines on Intel architectures. @@ -749,13 +749,12 @@ to make it `symmetric `__ you can add ``--sym``. -For INT4 quantization you can also specify the following arguments: - -- The ``--group-size`` parameter will define the group size to use for - quantization, -1 it will results in per-column quantization. -- The ``--ratio`` parameter controls the ratio between 4-bit and 8-bit - quantization. If set to 0.9, it means that 90% of the layers will be - quantized to int4 while 10% will be quantized to int8. +For INT4 quantization you can also specify the following arguments : - +The ``--group-size`` parameter will define the group size to use for +quantization, -1 it will results in per-column quantization. - The +``--ratio`` parameter controls the ratio between 4-bit and 8-bit +quantization. If set to 0.9, it means that 90% of the layers will be +quantized to int4 while 10% will be quantized to int8. Smaller group_size and ratio values usually improve accuracy at the sacrifice of the model size and inference latency. You can enable AWQ to @@ -777,28 +776,28 @@ be additionally applied during model export with INT4 precision using .. code:: ipython3 from llm_config import convert_and_compress_model - + model_dir = convert_and_compress_model(model_id, model_configuration, compression_variant.value, use_preconverted.value) .. parsed-literal:: ✅ INT4 qwen2-0.5b-instruct model already converted and can be found in qwen2/INT4_compressed_weights - + Let’s compare model size for different compression types .. code:: ipython3 from llm_config import compare_model_size - + compare_model_size(model_dir) .. parsed-literal:: Size of model with INT4 compressed weights is 358.86 MB - + Select device for inference --------------------------- @@ -808,9 +807,9 @@ Select device for inference .. code:: ipython3 from notebook_utils import device_widget - + device = device_widget(default="CPU", exclude=["NPU"]) - + device @@ -853,14 +852,14 @@ of the available generation parameters more deeply later. .. code:: ipython3 import openvino_genai as ov_genai - + print(f"Loading model from {model_dir}\n") - - + + pipe = ov_genai.LLMPipeline(str(model_dir), device.value) - + generation_config = pipe.get_generation_config() - + input_prompt = "The Sun is yellow bacause" print(f"Input text: {input_prompt}") print(pipe.generate(input_prompt, max_new_tokens=10)) @@ -869,10 +868,10 @@ of the available generation parameters more deeply later. .. parsed-literal:: Loading model from qwen2/INT4_compressed_weights - + Input text: The Sun is yellow bacause it is made of hydrogen and oxygen atoms. The - + Run Chatbot ----------- @@ -1023,11 +1022,11 @@ Click here to see detailed description of advanced options if not Path("gradio_helper_genai.py").exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/llm-chatbot/gradio_helper_genai.py") open("gradio_helper_genai.py", "w").write(r.text) - + from gradio_helper_genai import make_demo - + demo = make_demo(pipe, model_configuration, model_id, lang.value) - + try: demo.launch(debug=True) except Exception: diff --git a/docs/notebooks/llm-chatbot-with-output.rst b/docs/notebooks/llm-chatbot-with-output.rst index 88dda48053d8ec..0d214f5cccc0fc 100644 --- a/docs/notebooks/llm-chatbot-with-output.rst +++ b/docs/notebooks/llm-chatbot-with-output.rst @@ -655,14 +655,13 @@ to make it `symmetric `__ you can add ``--sym``. -For INT4 quantization you can also specify the following arguments: - -- -The ``--group-size`` parameter will define the group size to use for -quantization, -1 it will results in per-column quantization. - The -``--ratio`` parameter controls the ratio between 4-bit and 8-bit -quantization. If set to 0.9, it means that 90% of the layers will be -quantized to int4 while 10% will be quantized to int8. +For INT4 quantization you can also specify the following arguments : + +- The ``--group-size`` parameter will define the group size to use for + quantization, -1 it will results in per-column quantization. +- The ``--ratio`` parameter controls the ratio between 4-bit and 8-bit + quantization. If set to 0.9, it means that 90% of the layers will be + quantized to int4 while 10% will be quantized to int8. Smaller group_size and ratio values usually improve accuracy at the sacrifice of the model size and inference latency. diff --git a/docs/notebooks/localai-with-output.rst b/docs/notebooks/localai-with-output.rst new file mode 100644 index 00000000000000..fac17b8d241d82 --- /dev/null +++ b/docs/notebooks/localai-with-output.rst @@ -0,0 +1,220 @@ +LocalAI and OpenVINO +==================== + +`LocalAI `__ is the free, Open Source OpenAI +alternative. LocalAI act as a drop-in replacement REST API that’s +compatible with OpenAI API specifications for local inferencing. It +allows you to run LLMs, generate images, audio (and not only) locally or +on-prem with consumer grade hardware, supporting multiple model families +and architectures. Does not require GPU. It is created and maintained by +``Ettore Di Giacinto``. + +In this tutorial we show how to prepare a model config and launch an +OpenVINO LLM model with LocalAI in docker container. + + +**Table of contents:** + + +- `Prepare Docker <#prepare-docker>`__ +- `Prepare a model <#prepare-a-model>`__ +- `Run the server <#run-the-server>`__ +- `Send a client request <#send-a-client-request>`__ +- `Stop the server <#stop-the-server>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +Prepare Docker +-------------- + +Install `Docker +Engine `__, including its +`post-installation `__ +steps, on your development system. To verify installation, test it, +using the following command. When it is ready, it will display a test +image and a message. + +.. code:: ipython3 + + !docker run hello-world + + +.. parsed-literal:: + + Unable to find image 'hello-world:latest' locally + latest: Pulling from library/hello-world + + Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966 + Status: Downloaded newer image for hello-world:latest + + Hello from Docker! + This message shows that your installation appears to be working correctly. + + To generate this message, Docker took the following steps: + 1. The Docker client contacted the Docker daemon. + 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. + (amd64) + 3. The Docker daemon created a new container from that image which runs the + executable that produces the output you are currently reading. + 4. The Docker daemon streamed that output to the Docker client, which sent it + to your terminal. + + To try something more ambitious, you can run an Ubuntu container with: + $ docker run -it ubuntu bash + + Share images, automate workflows, and more with a free Docker ID: + https://hub.docker.com/ + + For more examples and ideas, visit: + https://docs.docker.com/get-started/ + + + +Prepare a model +~~~~~~~~~~~~~~~ + + + +LocalAI allows to use customized models. For more details you can read +the +`instruction `__ +where you can also find the detailed documentation. We will use one of +the OpenVINO optimized LLMs in the collection on the `collection on +🤗Hugging +Face `__. +In this example we will use +`TinyLlama-1.1B-Chat-v1.0-fp16-ov `__. +First of all we should create a model configuration file: + +.. code:: yaml + + name: TinyLlama-1.1B-Chat-v1.0-fp16-ov + backend: transformers + parameters: + model: OpenVINO/TinyLlama-1.1B-Chat-v1.0-fp16-ov + temperature: 0.2 + top_k: 40 + top_p: 0.95 + max_new_tokens: 32 + + type: OVModelForCausalLM + + template: + chat_message: | + <|im_start|>{{if eq .RoleName "assistant"}}assistant{{else if eq .RoleName "system"}}system{{else if eq .RoleName "user"}}user{{end}} + {{if .Content}}{{.Content}}{{end}}<|im_end|> + chat: | + {{.Input}} + <|im_start|>assistant + + completion: | + {{.Input}} + + stopwords: + - <|im_end|> + +The fields ``backend``, ``model``, ``type`` you can find in the code +example on the model page (we added the corresponding comments): + +.. code:: python + + from transformers import AutoTokenizer # backend + from optimum.intel.openvino import OVModelForCausalLM # type + + model_id = "OpenVINO/TinyLlama-1.1B-Chat-v1.0-fp16-ov" # parameters.model + tokenizer = AutoTokenizer.from_pretrained(model_id) + model = OVModelForCausalLM.from_pretrained(model_id) + +The name you can choose by yourself. By this name you will specify what +model to use on the client side. + +You can create a GitHub gist and modify fields: +`ov.yaml `__ + +Description of the parameters used in config YAML file can be found +`here `__. + +The most important: + +- ``name`` - model name, used to identify the model in API calls. +- ``backend`` - backend to use for computation (like llama-cpp, + diffusers, whisper, transformers). +- ``parameters.model`` - relative to the models path. +- ``temperature``, ``top_k``, ``top_p``, ``max_new_tokens`` - + parameters for the model. +- ``type`` - type of configuration, often related to the type of task + or model architecture. +- ``template`` - templates for various types of model interactions. +- ``stopwords`` - Words or phrases that halts processing. + +Run the server +~~~~~~~~~~~~~~ + + + +Everything is ready for launch. Use +``quay.io/go-skynet/local-ai:v2.23.0-ffmpeg`` image that contains all +required dependencies. For more details read `Run with container +images `__. +If you want to see the output remove the ``-d`` flag and send a client +request from a separate notebook. + +.. code:: ipython3 + + !docker run -d --rm --name="localai" -p 8080:8080 quay.io/go-skynet/local-ai:master-sycl-f16-ffmpeg https://gist.githubusercontent.com/aleksandr-mokrov/f007c8fa6036760a856ddc60f605a0b0/raw/9d24ceeb487f9c058a943113bd0290e8ae565b3e/ov.yaml + + +.. parsed-literal:: + + 67e1a2a8123aa15794c027278aed2c258a04e06883663459bbeaca22ff014740 + docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #1: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' + nvidia-container-cli: requirement error: invalid expression: unknown. + + +Check whether the ``localai`` container is running normally: + +.. code:: ipython3 + + !docker ps | grep localai + +Send a client request +~~~~~~~~~~~~~~~~~~~~~ + + + +Now you can send HTTP requests using the model name +``TinyLlama-1.1B-Chat-v1.0-fp16-ov``. More details how to use `OpenAI +API `__. + +.. code:: ipython3 + + !curl http://localhost:8080/v1/completions -H "Content-Type: application/json" -d '{"model": "TinyLlama-1.1B-Chat-v1.0-fp16-ov", "prompt": "What is OpenVINO?"}' + + +.. parsed-literal:: + + curl: (7) Failed to connect to localhost port 8080: Connection refused + + +Stop the server +~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + !docker stop localai + + +.. parsed-literal:: + + Error response from daemon: No such container: localai + diff --git a/docs/notebooks/magika-content-type-recognition-with-output.rst b/docs/notebooks/magika-content-type-recognition-with-output.rst index 383fdc6eebf499..f15167eae183b1 100644 --- a/docs/notebooks/magika-content-type-recognition-with-output.rst +++ b/docs/notebooks/magika-content-type-recognition-with-output.rst @@ -41,8 +41,8 @@ post `__ - `Define model loading class <#define-model-loading-class>`__ diff --git a/docs/notebooks/meter-reader-with-output.rst b/docs/notebooks/meter-reader-with-output.rst index 713c4d68edae6a..0ac9308155d4b7 100644 --- a/docs/notebooks/meter-reader-with-output.rst +++ b/docs/notebooks/meter-reader-with-output.rst @@ -135,7 +135,7 @@ DeepLabV3P pre-trained models from PaddlePaddle community. .. parsed-literal:: - model/meter_det_model.tar.gz: 0%| | 0.00/192M [00:00 + diff --git a/docs/notebooks/minicpm-v-multimodal-chatbot-with-output.rst b/docs/notebooks/minicpm-v-multimodal-chatbot-with-output.rst index 7f64dd936292c5..c130f9e0c08d67 100644 --- a/docs/notebooks/minicpm-v-multimodal-chatbot-with-output.rst +++ b/docs/notebooks/minicpm-v-multimodal-chatbot-with-output.rst @@ -205,7 +205,7 @@ documentation [68 lines of output] + ╰─> [92 lines of output] Ignoring numpy: markers 'python_version >= "3.9"' don't match your environment Collecting setuptools Using cached setuptools-75.3.0-py3-none-any.whl.metadata (6.9 kB) Collecting cython<3.0,>=0.25 Using cached Cython-0.29.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl.metadata (3.1 kB) Collecting cymem<2.1.0,>=2.0.2 - Using cached cymem-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.4 kB) + Using cached cymem-2.0.10.tar.gz (10 kB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' Collecting preshed<3.1.0,>=3.0.2 Using cached preshed-3.0.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.2 kB) Collecting murmurhash<1.1.0,>=0.28.0 - Using cached murmurhash-1.0.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.0 kB) + Using cached murmurhash-1.0.11.tar.gz (13 kB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' Collecting thinc<8.4.0,>=8.3.0 Using cached thinc-8.3.2.tar.gz (193 kB) Installing build dependencies: started @@ -139,16 +151,28 @@ Prerequisites × pip subprocess to install build dependencies did not run successfully. │ exit code: 1 - ╰─> [38 lines of output] + ╰─> [50 lines of output] Ignoring numpy: markers 'python_version >= "3.9"' don't match your environment Collecting setuptools Using cached setuptools-75.3.0-py3-none-any.whl.metadata (6.9 kB) Collecting cython<3.0,>=0.25 Using cached Cython-0.29.37-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl.metadata (3.1 kB) Collecting murmurhash<1.1.0,>=1.0.2 - Using cached murmurhash-1.0.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.0 kB) + Using cached murmurhash-1.0.11.tar.gz (13 kB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' Collecting cymem<2.1.0,>=2.0.2 - Using cached cymem-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (8.4 kB) + Using cached cymem-2.0.10.tar.gz (10 kB) + Installing build dependencies: started + Installing build dependencies: finished with status 'done' + Getting requirements to build wheel: started + Getting requirements to build wheel: finished with status 'done' + Preparing metadata (pyproject.toml): started + Preparing metadata (pyproject.toml): finished with status 'done' Collecting preshed<3.1.0,>=3.0.2 Using cached preshed-3.0.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.2 kB) Collecting blis<1.1.0,>=1.0.0 @@ -164,7 +188,7 @@ Prerequisites Using cached setuptools-75.3.0-py3-none-any.whl.metadata (6.9 kB) Collecting cython>=0.25 Using cached Cython-3.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.2 kB) - ERROR: Ignored the following versions that require a different python version: 1.25.0 Requires-Python >=3.9; 1.25.1 Requires-Python >=3.9; 1.25.2 Requires-Python >=3.9; 1.26.0 Requires-Python <3.13,>=3.9; 1.26.1 Requires-Python <3.13,>=3.9; 1.26.2 Requires-Python >=3.9; 1.26.3 Requires-Python >=3.9; 1.26.4 Requires-Python >=3.9; 2.0.0 Requires-Python >=3.9; 2.0.1 Requires-Python >=3.9; 2.0.2 Requires-Python >=3.9; 2.1.0 Requires-Python >=3.10; 2.1.0rc1 Requires-Python >=3.10; 2.1.1 Requires-Python >=3.10; 2.1.2 Requires-Python >=3.10; 2.1.3 Requires-Python >=3.10; 75.4.0 Requires-Python >=3.9; 75.5.0 Requires-Python >=3.9; 75.6.0 Requires-Python >=3.9 + ERROR: Ignored the following versions that require a different python version: 1.25.0 Requires-Python >=3.9; 1.25.1 Requires-Python >=3.9; 1.25.2 Requires-Python >=3.9; 1.26.0 Requires-Python <3.13,>=3.9; 1.26.1 Requires-Python <3.13,>=3.9; 1.26.2 Requires-Python >=3.9; 1.26.3 Requires-Python >=3.9; 1.26.4 Requires-Python >=3.9; 2.0.0 Requires-Python >=3.9; 2.0.1 Requires-Python >=3.9; 2.0.2 Requires-Python >=3.9; 2.1.0 Requires-Python >=3.10; 2.1.0rc1 Requires-Python >=3.10; 2.1.1 Requires-Python >=3.10; 2.1.2 Requires-Python >=3.10; 2.1.3 Requires-Python >=3.10; 2.2.0 Requires-Python >=3.10; 2.2.0rc1 Requires-Python >=3.10; 75.4.0 Requires-Python >=3.9; 75.5.0 Requires-Python >=3.9; 75.6.0 Requires-Python >=3.9 ERROR: Could not find a version that satisfies the requirement numpy<3.0.0,>=2.0.0 (from versions: 1.3.0, 1.4.1, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.2, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2, 1.9.3, 1.10.0.post2, 1.10.1, 1.10.2, 1.10.4, 1.11.0, 1.11.1, 1.11.2, 1.11.3, 1.12.0, 1.12.1, 1.13.0, 1.13.1, 1.13.3, 1.14.0, 1.14.1, 1.14.2, 1.14.3, 1.14.4, 1.14.5, 1.14.6, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.16.4, 1.16.5, 1.16.6, 1.17.0, 1.17.1, 1.17.2, 1.17.3, 1.17.4, 1.17.5, 1.18.0, 1.18.1, 1.18.2, 1.18.3, 1.18.4, 1.18.5, 1.19.0, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.19.5, 1.20.0, 1.20.1, 1.20.2, 1.20.3, 1.21.0, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.22.0, 1.22.1, 1.22.2, 1.22.3, 1.22.4, 1.23.0, 1.23.1, 1.23.2, 1.23.3, 1.23.4, 1.23.5, 1.24.0, 1.24.1, 1.24.2, 1.24.3, 1.24.4) ERROR: No matching distribution found for numpy<3.0.0,>=2.0.0 @@ -499,25 +523,25 @@ Prepare image gallery .. parsed-literal:: - data/red_panda.png: 0%| | 0.00/50.6k [00:00 1 or self.sliding_window is not None: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/marian/modeling_marian.py:166: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/marian/modeling_marian.py:166: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if ( - Exporting tokenizers to OpenVINO is not supported for tokenizers version > 0.19 and openvino version <= 2024.4. Please downgrade to tokenizers version <= 0.19 to export tokenizers to OpenVINO. + model.safetensors: 0%| | 0.00/312M [00:00 0.19 and openvino version <= 2024.4. Please downgrade to tokenizers version <= 0.19 to export tokenizers to OpenVINO. + model.safetensors: 100%|█████████████████████| 312M/312M [00:04<00:00, 71.1MB/s] .. code:: ipython3 @@ -888,10 +919,10 @@ support searching in Chinese. .. parsed-literal:: - 2024-11-22 01:36:43.187797: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:36:43.213112: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:26:01.092495: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:26:01.118195: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/marian/tokenization_marian.py:175: UserWarning: Recommended: pip install sacremoses. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/marian/tokenization_marian.py:175: UserWarning: Recommended: pip install sacremoses. warnings.warn("Recommended: pip install sacremoses.") @@ -1123,13 +1154,13 @@ models can require different optimal threshold for search. .. parsed-literal:: - data/car-detection.mp4: 0%| | 0.00/2.68M [00:00`__ is a +“Model-as-a-Service” (MaaS) platform that seeks to bring together most +advanced machine learning models from the AI community, and to +streamline the process of leveraging AI models in real applications. +Hundreds of models are made publicly available on ModelScope (700+ and +counting), covering the latest development in areas such as NLP, CV, +Audio, Multi-modality, and AI for Science, etc. Many of these models +represent the SOTA in their specific fields, and made their open-sourced +debut on ModelScope. + +This tutorial covers how to use the modelscope ecosystem within +OpenVINO. + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + + +**Table of contents:** + + +- `Prerequisites <#prerequisites>`__ +- `Convert models from ModelScope using OpenVINO Model Conversion + API <#convert-models-from-modelscope-using-openvino-model-conversion-api>`__ + + - `Select inference device for image + classification <#select-inference-device-for-image-classification>`__ + - `Run Image classification <#run-image-classification>`__ + +- `Convert ModelScope models using Optimum + Intel <#convert-modelscope-models-using-optimum-intel>`__ + + - `Select inference device for text + classification <#select-inference-device-for-text-classification>`__ + - `Perform text classification <#perform-text-classification>`__ + +- `Convert ModelScope models for usage with OpenVINO + GenAI <#convert-modelscope-models-for-usage-with-openvino-genai>`__ + + - `Select inference device for text + generation <#select-inference-device-for-text-generation>`__ + - `Run OpenVINO GenAI pipeline <#run-openvino-genai-pipeline>`__ + +Prerequisites +------------- + + + +.. code:: ipython3 + + import platform + + %pip install -q "torch>=2.1.1" "torchvision" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q modelscope addict oss2 simplejson sortedcontainers pillow opencv-python "datasets<=3.0.0" + %pip install -q "transformers>=4.45" "git+https://github.com/huggingface/optimum-intel.git" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -qU "openvino>=2024.5.0" "openvino-tokenizers>=2024.5.0" "openvino-genai>=2024.5.0" "nncf>=2.14.0" + + if platform.system() == "Darwin": + %pip install -q "numpy<2.0.0" + +.. code:: ipython3 + + import requests + from pathlib import Path + + if not Path("notebook_utils.py").exists(): + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", + ) + open("notebook_utils.py", "w").write(r.text) + +Convert models from ModelScope using OpenVINO Model Conversion API +------------------------------------------------------------------ + + + +Modelscope package provides API for initializing a model and loading a +set of pre-trained weights using the model text handle. Discovering a +desired model name is straightforward with `Modelscope models web +page `__, one can choose a model +solving a particular machine learning problem and even sort the models +by popularity and novelty. + +OpenVINO supports various types of models and frameworks via conversion +to OpenVINO Intermediate Representation (IR). `OpenVINO model conversion +API `__ +should be used for these purposes. ``ov.convert_model`` function accepts +original model instance and example input for tracing and returns +``ov.Model`` representing this model in OpenVINO framework. Converted +model can be used for saving on disk using ``ov.save_model`` function or +directly loading on device using ``core.complie_model``. + +As example, we will use +`tinynas `__ +image classification model. The code bellow demonstrates how to load +this model using Modelscope pipelines interface, convert it to OpenVINO +IR and then perform image classification on specified device. + +.. code:: ipython3 + + from pathlib import Path + + from modelscope.pipelines import pipeline + from modelscope.utils.constant import Tasks + import openvino as ov + import torch + import gc + + + cls_model_id = "iic/cv_tinynas_classification" + cls_model_path = Path(cls_model_id.split("/")[-1]) / "openvino_model.xml" + + if not cls_model_path.exists(): + # load Modelcope pipeline with model + image_classification = pipeline(Tasks.image_classification, model=cls_model_id) + # convert model to OpenVINO + ov_model = ov.convert_model(image_classification.model, example_input=torch.zeros((1, 3, 224, 224)), input=[1, 3, 224, 224]) + # save OpenVINO model on disk for next usage + ov.save_model(ov_model, cls_model_path) + del ov_model + del image_classification + gc.collect(); + + +.. parsed-literal:: + + 2024-11-12 19:08:10.199148: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-11-12 19:08:10.212253: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered + WARNING: All log messages before absl::InitializeLog() is called are written to STDERR + E0000 00:00:1731424090.226654 1605757 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered + E0000 00:00:1731424090.230976 1605757 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered + 2024-11-12 19:08:10.246563: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. + + +Select inference device for image classification +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from notebook_utils import device_widget + + cv_cls_device = device_widget("CPU") + + cv_cls_device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', options=('CPU', 'AUTO'), value='CPU') + + + +Run Image classification +~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Model inference interface remains compatible with pipeline preprocessing +and postprocessing, so you can reuse these part of pipeline, but for +providing standalone experience, we will demonstrate how to use model +without pipeline. The code bellow defines utilities for image +preprocessing and postprocessing. + +.. code:: ipython3 + + from notebook_utils import download_file + from PIL import Image + from torchvision import transforms + + # prepare input data and output lables + img_url = "https://pailitao-image-recog.oss-cn-zhangjiakou.aliyuncs.com/mufan/img_data/maas_test_data/dog.png" + img_path = Path("dog.png") + + labels_url = "https://raw.githubusercontent.com/openvinotoolkit/open_model_zoo/master/data/dataset_classes/imagenet_2012.txt" + + labels_path = Path("imagenet_2012.txt") + + if not img_path.exists(): + download_file(img_url) + + if not labels_path.exists(): + download_file(labels_url) + + image = Image.open(img_path) + imagenet_classes = labels_path.open("r").read().splitlines() + + + # prepare image preprocessing + transforms_normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) + transform_list = [ + transforms.Resize(256, interpolation=transforms.InterpolationMode.BICUBIC), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms_normalize, + ] + transformer = transforms.Compose(transform_list) + + # compile model + core = ov.Core() + + ov_model = core.compile_model(cls_model_path, cv_cls_device.value) + +Now, when we make all necessary preparations, we can run model +inference. + +.. code:: ipython3 + + import numpy as np + + # preprocess input + image_tensor = transformer(image) + + # run model inference + result = ov_model(image_tensor.unsqueeze(0))[0] + + # postprocess results + label_id = np.argmax(result[0]) + score = result[0][label_id] + + label = imagenet_classes[label_id] + + # visualize results + display(image) + print(f"Predicted label: {label}, score {score}") + + + +.. image:: modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.png + + +.. parsed-literal:: + + Predicted label: n02099601 golden retriever, score 8.060977935791016 + + +Convert ModelScope models using Optimum Intel +--------------------------------------------- + + + +For models compatible with the `HuggingFace +Transformers `__ +library, we can use `Optimum +Intel `__ integration +to convert and run model. Optimum Intel is the interface between the +Transformers and Diffusers libraries and the different tools and +libraries provided by Intel to accelerate end-to-end pipelines on Intel +architectures. + +Optimum Intel provides a simple interface for optimizing your +Transformers and Diffusers models, converting them to the OpenVINO +Intermediate Representation (IR) format, and running inference using +OpenVINO Runtime, among other use cases. For running ModelScope models +using this interface we should download model from hub first. There are +several ways how to download models from Modelscope Hub, one of them is +usage of ``modelscope.snapshot_download`` function. This function +accepts model id from hub and optionally local directory (if not +provided, model will be downloaded to cache directory). + +After that, we can load model to Optimum Intel interface replacing the +``AutoModelForXxx`` class from transformers with the corresponding +``OVModelForXxx``. Model conversion will be performed on the fly. For +avoiding next time conversion, we can save model on disk using +``save_pretrained`` method and in the next time pass directory with +already converted model as argument in ``from_pretrained`` method. We +also specified ``device`` parameter for compiling the model on the +specific device, if not provided, the default device will be used. The +device can be changed later in runtime using ``model.to(device)``, +please note that it may require some time for model compilation on a +newly selected device. In some cases, it can be useful to separate model +initialization and compilation, for example, if you want to reshape the +model using ``reshape`` method, you can postpone compilation, providing +the parameter ``compile=False`` into ``from_pretrained`` method, +compilation can be performed manually using ``compile`` method or will +be performed automatically during first inference run. + +As example, we will use +`nlp_bert_sentiment-analysis_english-base `__. +This model was trained for classification input text on 3 sentiment +categories: negative, positive and neutral. In transformers, +``AutoModelForSequenceClassification`` should be used for model +initialization, so for usage model with OpenVINO, it is enough just +replace ``AutoModelForSequenceClassification`` to +``OVModelForSequenceClassification``. + +.. code:: ipython3 + + from modelscope import snapshot_download + + text_model_id = "iic/nlp_bert_sentiment-analysis_english-base" + text_model_path = Path(text_model_id.split("/")[-1]) + ov_text_model_path = text_model_path / "ov" + + + if not text_model_path.exists(): + snapshot_download(text_model_id, local_dir=text_model_path) + +Select inference device for text classification +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from notebook_utils import device_widget + + text_cls_device = device_widget("CPU", "NPU") + + text_cls_device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', options=('CPU', 'AUTO'), value='CPU') + + + +Perform text classification +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from transformers import AutoTokenizer + from optimum.intel.openvino import OVModelForSequenceClassification + + + tokenizer = AutoTokenizer.from_pretrained(text_model_path) + + if not ov_text_model_path.exists(): + # model will be automatically exported to OpenVINO format during loading + ov_model = OVModelForSequenceClassification.from_pretrained(text_model_path, text_cls_device.value) + ov_model.save_pretrained(ov_text_model_path) + # save converted model using save_pretrained for avoid conversion in next time + tokenizer.save_pretrained(ov_text_model_path) + else: + # load converted model directly if availa ble + ov_model = OVModelForSequenceClassification.from_pretrained(ov_text_model_path, device=text_cls_device.value) + + # prepare input + input_text = "Good night." + input_data = tokenizer(input_text, return_tensors="pt") + + # run model inference + output = ov_model(**input_data) + # postprocess results + predicted_label_id = output.logits[0].argmax().item() + + predicted_label = ov_model.config.id2label[predicted_label_id] + + print(f"predicted label: {predicted_label}") + + +.. parsed-literal:: + + predicted label: Positive + + +Convert ModelScope models for usage with OpenVINO GenAI +------------------------------------------------------- + + + +OpenVINO™ GenAI is a library of the most popular Generative AI model +pipelines, optimized execution methods, and samples that run on top of +highly performant `OpenVINO +Runtime `__. + +This library is friendly to PC and laptop execution, and optimized for +resource consumption. It requires no external dependencies to run +generative models as it already includes all the core functionality +(e.g. tokenization via openvino-tokenizers). + +You can also load and run models from ModelScope with OpenVINO GenAI +`supported +pipelines `__. + +This inference approach is also based on model representation obtained +using Optimum Intel and also requires to download ModelScope model +first. As example we will be +`qwen2.5-1.5b-instruct `__ +model for text generation, that is part of powerful Qwen2 LLMs family. +If in previous chapter we are focused with usage python API for +downloading and converting models, in this one - we are also considering +CLI usage for the same actions. + +Downloading ModelScope models using CLI can be performed using following +command: + +.. code:: bash + + modelscope download --local_dir + +where ```` is model id from Hub and ```` is +output directory for model saving. + +``optimum-cli`` provides command line interface for exporting models +using Optimum. General OpenVINO export command format: + +.. code:: bash + + optimum-cli export openvino --model --task + +where task is task to export the model for. Available tasks depend on +the model, but are among: [‘default’, ‘fill-mask’, ‘text-generation’, +‘text2text-generation’, ‘text-classification’, ‘token-classification’, +‘multiple-choice’, ‘object-detection’, ‘question-answering’, +‘image-classification’, ‘image-segmentation’, ‘masked-im’, +‘semantic-segmentation’, ‘automatic-speech-recognition’, +‘audio-classification’, ‘audio-frame-classification’, +‘automatic-speech-recognition’, ‘audio-xvector’, ‘image-to-text’, +‘stable-diffusion’, ‘zero-shot-object-detection’]. + +You can find a mapping between tasks and model classes in Optimum +TaskManager +`documentation `__. + +Additionally, you can specify weights compression using +``--weight-format`` argument with one of following options: ``fp32``, +``fp16``, ``int8`` and ``int4``. Fro int8 and int4 nncf will be used for +weight compression. For models that required remote code execution, +``--trust-remote-code`` flag should be provided. + +Full list of supported arguments available via ``--help`` + +.. code:: ipython3 + + from IPython.display import Markdown, display + + model_id = "Qwen/Qwen2.5-1.5B-Instruct" + + llm_path = Path("Qwen2.5-1.5B-Instruct") + ov_llm_path = llm_path / "ov" + download_command = f"modelscope download {model_id} --local_dir {llm_path}" + display(Markdown("**Download command:**")) + display(Markdown(f"`{download_command}`")) + + if not llm_path.exists(): + !{download_command} + + + +**Download command:** + + + +``modelscope download Qwen/Qwen2.5-1.5B-Instruct --local_dir Qwen2.5-1.5B-Instruct`` + + +.. code:: ipython3 + + export_command = f"optimum-cli export openvino -m {llm_path} --task text-generation-with-past --weight-format int4 {ov_llm_path}" + display(Markdown("**Export command:**")) + display(Markdown(f"`{export_command}`")) + + if not ov_llm_path.exists(): + !{export_command} + + + +**Export command:** + + + +``optimum-cli export openvino -m Qwen2.5-1.5B-Instruct --task text-generation-with-past --weight-format int4 Qwen2.5-1.5B-Instruct/ov`` + + +Select inference device for text generation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + from notebook_utils import device_widget + + llm_device = device_widget("CPU") + + llm_device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', options=('CPU', 'AUTO'), value='CPU') + + + +Run OpenVINO GenAI pipeline +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +For running text generation using OpenVINO GenAI, we should use +``LLMPipeline`` class initialized with providing converted model +directory and inference device. You can find more detailed example how +to use OpenVINO GenAI ``LLMPipeline`` for chatbot scenario in this +`tutorial `__. + +.. code:: ipython3 + + import openvino_genai as ov_genai + + + def streamer(subword): + print(subword, end="", flush=True) + # Return flag corresponds whether generation should be stopped. + # False means continue generation. + return False + + + llm_pipe = ov_genai.LLMPipeline(ov_llm_path, llm_device.value) + + llm_pipe.generate("The Sun is yellow because", max_new_tokens=200, streamer=streamer) + + +.. parsed-literal:: + + it has a spectrum of colors, and you are also looking at it. What color would the sun be if you could see its light without being able to see any other objects? If we imagine that someone had never seen or heard about the sun before, what would they expect to see? + + 1. **Color of the Sun**: The sun appears yellow when viewed from Earth due to the way our atmosphere scatters sunlight. This phenomenon occurs as follows: + + - **Sunlight Scattering**: When sunlight passes through the Earth's atmosphere, different wavelengths (colors) of light travel at slightly different speeds due to their varying energies. + - **Air Mass Height**: At higher altitudes where air density decreases with altitude, shorter wavelength (blue) photons have more energy and thus escape faster into space compared to longer wavelength (red) photons which remain in the atmosphere longer. + - **Sky Color**: As a result, blue light is scattered more than red light by molecules in the upper layers of the atmosphere + + + +.. parsed-literal:: + + " it has a spectrum of colors, and you are also looking at it. What color would the sun be if you could see its light without being able to see any other objects? If we imagine that someone had never seen or heard about the sun before, what would they expect to see?\n\n1. **Color of the Sun**: The sun appears yellow when viewed from Earth due to the way our atmosphere scatters sunlight. This phenomenon occurs as follows:\n\n - **Sunlight Scattering**: When sunlight passes through the Earth's atmosphere, different wavelengths (colors) of light travel at slightly different speeds due to their varying energies.\n - **Air Mass Height**: At higher altitudes where air density decreases with altitude, shorter wavelength (blue) photons have more energy and thus escape faster into space compared to longer wavelength (red) photons which remain in the atmosphere longer.\n - **Sky Color**: As a result, blue light is scattered more than red light by molecules in the upper layers of the atmosphere" + + + +.. code:: ipython3 + + import gc + + del llm_pipe + gc.collect(); diff --git a/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.jpg b/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.jpg new file mode 100644 index 00000000000000..97ae56df8a8721 --- /dev/null +++ b/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1745fd9f64ac9914621f7eee3668e86daa8121bc83d1a2c7f27963c85026f104 +size 66633 diff --git a/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.png b/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.png new file mode 100644 index 00000000000000..d1c0d309736c1a --- /dev/null +++ b/docs/notebooks/modelscope-to-openvino-with-output_files/modelscope-to-openvino-with-output_12_0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6235ab7dd2cb4318435320004320ffc6de773044c51cadcd581a7996faca313a +size 636558 diff --git a/docs/notebooks/music-generation-with-output.rst b/docs/notebooks/music-generation-with-output.rst index a5bdcbd8049318..2d63515872694f 100644 --- a/docs/notebooks/music-generation-with-output.rst +++ b/docs/notebooks/music-generation-with-output.rst @@ -124,8 +124,8 @@ Imports .. parsed-literal:: - 2024-11-22 01:43:50.913766: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:43:50.938403: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:28:39.145741: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:28:39.170431: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -165,7 +165,7 @@ generate a text-conditioned music sample. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/encodec/modeling_encodec.py:124: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor). + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/encodec/modeling_encodec.py:124: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor). self.register_buffer("padding_total", torch.tensor(kernel_size - stride, dtype=torch.int64), persistent=False) Config of the text_encoder: is overwritten by shared text_encoder config: T5Config { "_name_or_path": "t5-base", @@ -346,7 +346,7 @@ vocabulary. It helps the model understand the context of a sentence. @@ -431,7 +431,7 @@ runtime .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. @@ -775,7 +775,7 @@ We can now infer the pipeline backed by OpenVINO models. diff --git a/docs/notebooks/nano-llava-multimodal-chatbot-with-output.rst b/docs/notebooks/nano-llava-multimodal-chatbot-with-output.rst index 0bac7af3f39c32..9cefe7216f2076 100644 --- a/docs/notebooks/nano-llava-multimodal-chatbot-with-output.rst +++ b/docs/notebooks/nano-llava-multimodal-chatbot-with-output.rst @@ -204,8 +204,8 @@ documentation 1 or self.sliding_window is not None) and self.is_causal: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/exporters/onnx/model_patcher.py:306: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/exporters/onnx/model_patcher.py:306: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/qnguyen3/nanoLLaVA/13d60cec183a86755afed64da495fcc2c382ea80/modeling_llava_qwen2.py:939: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if seq_len > self.max_seq_len_cached: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/qnguyen3/nanoLLaVA/13d60cec183a86755afed64da495fcc2c382ea80/modeling_llava_qwen2.py:1499: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): @@ -530,10 +530,10 @@ image encoder model. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/quantization/quantize_model.py:432: FutureWarning: `CompressWeightsMode.INT8` is deprecated. Please, use `CompressWeightsMode.INT8_ASYM` as value instead. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/quantization/quantize_model.py:432: FutureWarning: `CompressWeightsMode.INT8` is deprecated. Please, use `CompressWeightsMode.INT8_ASYM` as value instead. warning_deprecated( - 2024-11-22 01:48:49.764790: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:48:49.789684: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:33:42.983675: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:33:43.008813: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -742,8 +742,7 @@ can use the same tokenizer and image processor that provided with model. Question: Describe this image in detail Answer: - This image features a cute, white lama, possibly a llama, which is depicted in a playful pose. The llama is surrounded by a fire, indicating it's being set on a burner. The flame appears to be a bright, bright yellow, and there are several tiny flames, possibly from the llama's actions. - The llama itself is quite detailed. It has a small brown nose and dark eyes that are expressive. The face of the llama is quite detailed as well, with a pair of ears that are also light brown. The llama's mouth is open, revealing its pink lips. There are also small pink spots on its face, + The image features a white, fluffy lamb with a big, bright smile, standing next to a fire. The lamb's face is detailed, with black eyes that are slightly squinty, and a mouth that's slightly open. It seems to be enjoying the heat from the fire, as it is seen looking down. The lamb's legs are also visible, and they appear to be furry. The lamb's tail is long and appears to be fluffy as well. The lamb's ears are also visible and are pink. The lamb's face is depicted in detail, with small black eyes and black nostrils. The lamb's nose is also Interactive demo diff --git a/docs/notebooks/notebooks_with_binder_buttons.txt b/docs/notebooks/notebooks_with_binder_buttons.txt index ce9cb50da47907..58f31aaae508c8 100644 --- a/docs/notebooks/notebooks_with_binder_buttons.txt +++ b/docs/notebooks/notebooks_with_binder_buttons.txt @@ -7,7 +7,6 @@ convert-to-openvino cross-lingual-books-alignment depth-anything detectron2-to-openvino -distilbert-sequence-classification fast-segment-anything handwritten-ocr hello-detection diff --git a/docs/notebooks/notebooks_with_colab_buttons.txt b/docs/notebooks/notebooks_with_colab_buttons.txt index 59b3348a4c90f7..2361fbe9a19c69 100644 --- a/docs/notebooks/notebooks_with_colab_buttons.txt +++ b/docs/notebooks/notebooks_with_colab_buttons.txt @@ -1,5 +1,4 @@ 3D-segmentation-point-clouds -amused-lightweight-text-to-image async-api auto-device clip-language-saliency-map @@ -8,7 +7,6 @@ cross-lingual-books-alignment depth-anything depth-anything-v2 detectron2-to-openvino -distilbert-sequence-classification explainable-ai-1-basic explainable-ai-2-deep-dive explainable-ai-3-map-interpretation diff --git a/docs/notebooks/object-detection-with-output.rst b/docs/notebooks/object-detection-with-output.rst index 5debc4e7ed88d4..fc055f6e7ae63e 100644 --- a/docs/notebooks/object-detection-with-output.rst +++ b/docs/notebooks/object-detection-with-output.rst @@ -84,7 +84,7 @@ Install requirements .. parsed-literal:: - 24717 + 24624 @@ -136,21 +136,21 @@ Download and convert the Model .. parsed-literal:: - 100%|██████████| 6.25M/6.25M [00:00<00:00, 26.9MB/s] + 100%|██████████| 6.25M/6.25M [00:00<00:00, 26.8MB/s] .. parsed-literal:: - Ultralytics 8.3.0 🚀 Python-3.8.10 torch-2.2.2+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) + Ultralytics 8.3.0 🚀 Python-3.8.10 torch-2.4.1+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) YOLOv8n summary (fused): 168 layers, 3,151,904 parameters, 0 gradients, 8.7 GFLOPs PyTorch: starting from 'yolov8n.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) (1, 84, 8400) (6.2 MB) OpenVINO: starting export with openvino 2024.4.0-16579-c3152d32c9c-releases/2024/4... - OpenVINO: export success ✅ 1.4s, saved as 'yolov8n_openvino_model/' (6.4 MB) + OpenVINO: export success ✅ 1.3s, saved as 'yolov8n_openvino_model/' (6.4 MB) - Export complete (1.6s) - Results saved to /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/object-detection-webcam + Export complete (1.5s) + Results saved to /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/object-detection-webcam Predict: yolo predict task=detect model=yolov8n_openvino_model imgsz=640 half Validate: yolo val task=detect model=yolov8n_openvino_model imgsz=640 data=coco.yaml half Visualize: https://netron.app @@ -222,7 +222,7 @@ best performance. For that purpose, just use ``AUTO``. .. parsed-literal:: - Ultralytics 8.3.0 🚀 Python-3.8.10 torch-2.2.2+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) + Ultralytics 8.3.0 🚀 Python-3.8.10 torch-2.4.1+cpu CPU (Intel Core(TM) i9-10920X 3.50GHz) Loading yolov8n_openvino_model for OpenVINO inference... Using OpenVINO LATENCY mode for batch=1 inference... diff --git a/docs/notebooks/omniparser-with-output.rst b/docs/notebooks/omniparser-with-output.rst index 28676a03a84ba7..e22ce49105f78d 100644 --- a/docs/notebooks/omniparser-with-output.rst +++ b/docs/notebooks/omniparser-with-output.rst @@ -20,7 +20,6 @@ repo `__ and `model card `__. In this tutorial we consider how to run OmniParser using OpenVINO. - **Table of contents:** - `Prerequisites <#prerequisites>`__ @@ -72,9 +71,14 @@ Prerequisites .. code:: ipython3 - %pip install -q "torch>=2.1" easyocr torchvision accelerate "supervision==0.18.0" accelerate timm "einops==0.8.0" "ultralytics==8.1.24" pillow opencv-python "gradio>=4.19" --extra-index-url https://download.pytorch.org/whl/cpu + import platform + + %pip install -q "torch>=2.1" easyocr torchvision accelerate "supervision==0.18.0" "transformers>=4.45" timm "einops==0.8.0" "ultralytics==8.1.24" pillow opencv-python "gradio>=4.19" --extra-index-url https://download.pytorch.org/whl/cpu %pip install -q "openvino>=2024.4.0" + if platform.system() == "Darwin": + %pip install -q "numpy<2.0" + .. parsed-literal:: @@ -89,16 +93,21 @@ Prerequisites notebook_utils_path = Path("notebook_utils.py") florence_helper_path = Path("ov_florence2_helper.py") + omniparser_helper_path = Path("ov_omniparser_helper.py") if not notebook_utils_path.exists(): r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", ) - notebook_utils_path.open("w").write(r.text) + notebook_utils_path.open("w", encoding="utf-8").write(r.text) if not florence_helper_path.exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/florence2/ov_florence2_helper.py") - florence_helper_path.open("w").write(r.text) + florence_helper_path.open("w", encoding="utf-8").write(r.text) + + if not omniparser_helper_path.exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/omniparser/ov_omniparser_helper.py") + omniparser_helper_path.open("w", encoding="utf-8").write(r.text) Prepare models -------------- @@ -155,21 +164,21 @@ API. You can find more examples of this API usage in these .. parsed-literal:: - 2024-11-22 01:51:07.385705: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 01:51:07.410345: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:35:42.631431: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:35:42.657651: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. .. parsed-literal:: - weights/icon_detect/best.pt: 0%| | 0.00/11.7M [00:00=1.4.0, which is not installed. - mobileclip 0.1.0 requires torchvision==0.14.1, but you have torchvision 0.17.2+cpu which is incompatible. tensorflow 2.12.0 requires keras<2.13,>=2.12.0, but you have keras 2.13.1 which is incompatible. tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.4 which is incompatible. tensorflow 2.12.0 requires tensorboard<2.13,>=2.12, but you have tensorboard 2.13.0 which is incompatible. tensorflow 2.12.0 requires tensorflow-estimator<2.13,>=2.12.0, but you have tensorflow-estimator 2.13.0 which is incompatible. tensorflow-cpu 2.13.1 requires numpy<=1.24.3,>=1.22, but you have numpy 1.24.4 which is incompatible. tensorflow-cpu 2.13.1 requires typing-extensions<4.6.0,>=3.6.6, but you have typing-extensions 4.12.2 which is incompatible. - torchvision 0.17.2+cpu requires torch==2.2.2, but you have torch 2.4.1 which is incompatible. Note: you may need to restart the kernel to use updated packages. @@ -250,9 +247,9 @@ True .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. WeightNorm.apply(module, name, dim) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/api.py:36: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/api.py:36: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. checkpoint_dict = torch.load(ckpt_path, map_location=torch.device(self.device)) @@ -266,9 +263,9 @@ True .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/wavmark/__init__.py:16: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/wavmark/__init__.py:16: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. checkpoint = torch.load(resume_path, map_location=torch.device('cpu')) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/api.py:36: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/api.py:36: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. checkpoint_dict = torch.load(ckpt_path, map_location=torch.device(self.device)) @@ -418,38 +415,40 @@ documentation 0 - No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda' - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:283: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:283: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert ( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:346: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:346: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! pad_length = max(length - (self.window_size + 1), 0) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:347: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:347: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! slice_start_position = max((self.window_size + 1) - length, 0) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:349: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/attentions.py:349: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if pad_length > 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:114: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:114: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if torch.min(inputs) < left or torch.max(inputs) > right: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:119: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:119: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if min_bin_width * num_bins > 1.0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:121: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:121: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if min_bin_height * num_bins > 1.0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:171: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/openvoice/OpenVoice/openvoice/transforms.py:171: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert (discriminant >= 0).all() - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Trace had nondeterministic nodes. Did you forget call .eval() on your model? Nodes: - %3293 : Float(1, 2, 43, strides=[86, 43, 1], requires_grad=0, device=cpu) = aten::randn(%3288, %3289, %3290, %3291, %3292) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86:0 - %5559 : Float(1, 192, 153, strides=[29376, 1, 192], requires_grad=0, device=cpu) = aten::randn_like(%m_p, %5554, %5555, %5556, %5557, %5558) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86:0 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Trace had nondeterministic nodes. Did you forget call .eval() on your model? Nodes: + %3293 : Float(1, 2, 43, strides=[86, 43, 1], requires_grad=0, device=cpu) = aten::randn(%3288, %3289, %3290, %3291, %3292) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86:0 + %5559 : Float(1, 192, 150, strides=[28800, 1, 192], requires_grad=0, device=cpu) = aten::randn_like(%m_p, %5554, %5555, %5556, %5557, %5558) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86:0 This may cause errors in trace checking. To disable trace checking, pass check_trace=False to torch.jit.trace() _check_trace( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: - The values for attribute 'shape' do not match: torch.Size([1, 1, 39680]) != torch.Size([1, 1, 38400]). - _check_trace( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 2. of the traced function does not match the corresponding output of the Python function. Detailed error: - The values for attribute 'shape' do not match: torch.Size([1, 1, 155, 43]) != torch.Size([1, 1, 150, 43]). + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: + Tensor-likes are not close! + + Mismatched elements: 38094 / 39424 (96.6%) + Greatest absolute difference: 0.7026380896568298 at index (0, 0, 4174) (up to 1e-05 allowed) + Greatest relative difference: 43899.56701030928 at index (0, 0, 2529) (up to 1e-05 allowed) _check_trace( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 3. of the traced function does not match the corresponding output of the Python function. Detailed error: - The values for attribute 'shape' do not match: torch.Size([1, 1, 155]) != torch.Size([1, 1, 150]). + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 2. of the traced function does not match the corresponding output of the Python function. Detailed error: + Tensor-likes are not close! + + Mismatched elements: 42 / 6622 (0.6%) + Greatest absolute difference: 1.0 at index (0, 0, 7, 1) (up to 1e-05 allowed) + Greatest relative difference: inf at index (0, 0, 7, 2) (up to 1e-05 allowed) _check_trace( @@ -483,16 +482,16 @@ documentation )`. (Triggered internally at ../aten/src/ATen/native/SpectralOps.cpp:836.) + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/modules/module.py:1562: UserWarning: A window was not provided. A rectangular window will be applied,which is known to cause spectral leakage. Other windows such as torch.hann_window or torch.hamming_window can are recommended to reduce spectral leakage.To suppress this warning and use a rectangular window, explicitly set `window=torch.ones(n_fft, device=)`. (Triggered internally at ../aten/src/ATen/native/SpectralOps.cpp:836.) return forward_call(\*args, \*\*kwargs) @@ -720,7 +719,7 @@ Load speaker embeddings .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/functional.py:666: UserWarning: stft with return_complex=False is deprecated. In a future pytorch release, stft will return complex tensors for all inputs, and return_complex=False will raise an error. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/functional.py:666: UserWarning: stft with return_complex=False is deprecated. In a future pytorch release, stft will return complex tensors for all inputs, and return_complex=False will raise an error. Note: you can still call torch.view_as_real on the complex output to recover the old return format. (Triggered internally at ../aten/src/ATen/native/SpectralOps.cpp:873.) return _VF.stft(input, n_fft, hop_length, win_length, window, # type: ignore[attr-defined] @@ -875,7 +874,7 @@ And finally, run voice tone conversion with OpenVINO optimized model @@ -893,7 +892,7 @@ And finally, run voice tone conversion with OpenVINO optimized model @@ -1082,7 +1081,7 @@ voice tone conversion online. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/components/dropdown.py:100: UserWarning: The `max_choices` parameter is ignored when `multiselect` is False. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/components/dropdown.py:100: UserWarning: The `max_choices` parameter is ignored when `multiselect` is False. warnings.warn( diff --git a/docs/notebooks/optical-character-recognition-with-output.rst b/docs/notebooks/optical-character-recognition-with-output.rst index 7dae2290312e68..764bad414c61e9 100644 --- a/docs/notebooks/optical-character-recognition-with-output.rst +++ b/docs/notebooks/optical-character-recognition-with-output.rst @@ -131,13 +131,13 @@ again. .. parsed-literal:: - model/horizontal-text-detection-0001/FP16/horizontal-text-detection-0001.bin: 0%| | 0.00/3.70M [00:… + horizontal-text-detection-0001.bin: 0%| | 0.00/3.70M [00:00 + @@ -375,7 +375,7 @@ may be specified is input data .. parsed-literal:: - + @@ -413,7 +413,7 @@ then such conversion will be added explicitly. .. parsed-literal:: - + @@ -575,7 +575,7 @@ Compare results on one image .. parsed-literal:: - data/imagenet_2012.txt: 0%| | 0.00/30.9k [00:00= 3.10. Please make + sure that your environment fulfill to this requirement before running + it + +`OuteTTS-0.1-350M `__ is +a novel text-to-speech synthesis model that leverages pure language +modeling without external adapters or complex architectures, built upon +the LLaMa architecture. It demonstrates that high-quality speech +synthesis is achievable through a straightforward approach using crafted +prompts and audio tokens. + +More details about model can be found in `original +repo `__. + +In this tutorial we consider how to run OuteTTS pipeline using OpenVINO. + + +**Table of contents:** + + +- `Prerequisites <#prerequisites>`__ +- `Convert model <#convert-model>`__ +- `Run model inference <#run-model-inference>`__ + + - `Text-to-Speech generation <#text-to-speech-generation>`__ + - `Text-to-Speech generation with Voice + Cloning <#text-to-speech-generation-with-voice-cloning>`__ + +- `Interactive demo <#interactive-demo>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +Prerequisites +------------- + + + +.. code:: ipython3 + + import platform + + %pip install -q "torch>=2.1" "torchaudio" "einops" "transformers>=4.46.1" "loguru" "inflect" "pesq" "torchcrepe" "natsort" "polars" uroman mecab-python3 unidic-lite --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q "gradio>=4.19" "openvino>=2024.4.0" "tqdm" "pyyaml" "librosa" "soundfile" + %pip install -q "git+https://github.com/huggingface/optimum-intel.git" --extra-index-url https://download.pytorch.org/whl/cpu + + if platform.system() == "Darwin": + %pip install -q "numpy<2.0.0" + +.. code:: ipython3 + + import requests + from pathlib import Path + + utility_files = ["cmd_helper.py", "notebook_utils.py"] + base_utility_url = "https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/" + + for utility_file in utility_files: + if not Path(utility_file).exists(): + r = requests.get(base_utility_url + utility_file) + with Path(utility_file).open("w") as f: + f.write(r.text) + + + helper_files = ["gradio_helper.py", "ov_outetts_helper.py"] + base_helper_url = "https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/outetts-text-to-speech" + + for helper_file in helper_files: + if not Path(helper_file).exists(): + r = requests.get(base_helper_url + helper_file) + with Path(helper_file).open("w") as f: + f.write(r.text) + +.. code:: ipython3 + + from cmd_helper import clone_repo + + repo_path = clone_repo("https://github.com/edwko/OuteTTS.git") + + interface_path = repo_path / "outetts/version/v1/interface.py" + + updated_version = interface_path.exists() + + if not updated_version: + interface_pth = repo_path / "outetts/v0_1/interface.py" + orig_interface_path = interface_path.parent / "_orig_interface.py" + + if not updated_version and not orig_interface_path.exists(): + interface_path.rename(orig_interface_path) + # sounddevice requires to install manually additional libraries, as we do not plan to use it for audio playing + # move it closer to its usage for avoid errors + with orig_interface_path.open("r") as in_file: + content = in_file.read() + upd_content = content.replace("import sounddevice as sd", "") + upd_content = upd_content.replace("sd.play", "import sounddevice as sd\n sd.play") + with interface_path.open("w") as out_file: + out_file.write(upd_content) + + %pip install -q {repo_path} --extra-index-url https://download.pytorch.org/whl/cpu + +Convert model +------------- + + + +OpenVINO supports PyTorch models via conversion to OpenVINO Intermediate +Representation format. For convenience, we will use OpenVINO integration +with HuggingFace Optimum. `Optimum +Intel `__ is the +interface between the Transformers and Diffusers libraries and the +different tools and libraries provided by Intel to accelerate end-to-end +pipelines on Intel architectures. + +Among other use cases, Optimum Intel provides a simple interface to +optimize your Transformers and Diffusers models, convert them to the +OpenVINO Intermediate Representation (IR) format and run inference using +OpenVINO Runtime. ``optimum-cli`` provides command line interface for +model conversion and optimization. + +General command format: + +.. code:: bash + + optimum-cli export openvino --model --task + +where task is task to export the model for, if not specified, the task +will be auto-inferred based on the model. You can find a mapping between +tasks and model classes in Optimum TaskManager +`documentation `__. +Additionally, you can specify weights compression using +``--weight-format`` argument with one of following options: ``fp32``, +``fp16``, ``int8`` and ``int4``. Fro int8 and int4 +`nncf `__ will be used for +weight compression. More details about model export provided in `Optimum +Intel +documentation `__. + +As OuteTTS utilizes pure language modeling approach, model conversion +process remains the same like conversion LLaMa models family for text +generation purposes. + +.. code:: ipython3 + + from cmd_helper import optimum_cli + + model_id = "OuteAI/OuteTTS-0.1-350M" + model_dir = Path(model_id.split("/")[-1] + "-ov") + + if not model_dir.exists(): + optimum_cli(model_id, model_dir, additional_args={"task": "text-generation-with-past"}) + +Run model inference +------------------- + + + +OpenVINO integration with Optimum Intel provides ready-to-use API for +model inference that can be used for smooth integration with +transformers-based solutions. For loading model, we will use +``OVModelForCausalLM`` class that have compatible interface with +Transformers LLaMa implementation. For loading a model, +``from_pretrained`` method should be used. It accepts path to the model +directory or model_id from HuggingFace hub (if model is not converted to +OpenVINO format, conversion will be triggered automatically). +Additionally, we can provide an inference device, quantization config +(if model has not been quantized yet) and device-specific OpenVINO +Runtime configuration. More details about model inference with Optimum +Intel can be found in +`documentation `__. +We will use ``OVModelForCausalLM`` as replacement of original +``AutoModelForCausalLM`` in ``InterfaceHF``. + +.. code:: ipython3 + + from notebook_utils import device_widget + + device = device_widget(exclude=["NPU"]) + + device + + + + +.. parsed-literal:: + + Dropdown(description='Device:', index=1, options=('CPU', 'AUTO'), value='AUTO') + + + +.. code:: ipython3 + + from ov_outetts_helper import InterfaceOV, OVHFModel # noqa: F401 + + # Uncomment these lines to see pipeline details + # ??InterfaceOV + # ??OVHFModel + + +.. parsed-literal:: + + 2024-11-29 11:48:51.975233: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-11-29 11:48:51.989550: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:477] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered + WARNING: All log messages before absl::InitializeLog() is called are written to STDERR + E0000 00:00:1732866532.005718 2314480 cuda_dnn.cc:8310] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered + E0000 00:00:1732866532.010517 2314480 cuda_blas.cc:1418] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered + 2024-11-29 11:48:52.027376: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. + + +.. code:: ipython3 + + interface = InterfaceOV(model_dir, device.value) + + +.. parsed-literal:: + + making attention of type 'vanilla' with 768 in_channels + + +Text-to-Speech generation +~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Now let’s see model in action. Providing input text to ``generate`` +method of interface, model returns tensor that represents output audio +with random speaker characteristics. + +.. code:: ipython3 + + output = interface.generate(text="Hello, I'm working!", temperature=0.1, repetition_penalty=1.1, max_length=4096) + + +.. parsed-literal:: + + The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. + Setting `pad_token_id` to `eos_token_id`:None for open-end generation. + The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. + + +.. code:: ipython3 + + import IPython.display as ipd + + ipd.Audio(output.audio[0].numpy(), rate=output.sr) + + + + +.. raw:: html + + + + + + + +Text-to-Speech generation with Voice Cloning +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Additionally, we can specify reference voice for generation by providing +reference audio and transcript for it. ``interface.create_speaker`` +processes reference audio and text to set of features used for audio +description. + +.. code:: ipython3 + + from notebook_utils import download_file + + ref_audio_url = "https://huggingface.co/OuteAI/OuteTTS-0.1-350M/resolve/main/samples/2.wav" + + file_path = download_file(ref_audio_url) + + +.. parsed-literal:: + + '2.wav' already exists. + + +.. code:: ipython3 + + ipd.Audio(file_path) + + + + +.. raw:: html + + + + + + + +.. code:: ipython3 + + speaker = interface.create_speaker(file_path, "Hello, I can speak pretty well, but sometimes I make some mistakes.") + + # Save the speaker to a file + interface.save_speaker(speaker, "speaker.pkl") + + # Load the speaker from a file + speaker = interface.load_speaker("speaker.pkl") + + # Generate TTS with the custom voice + output = interface.generate(text="This is a cloned voice speaking", speaker=speaker, temperature=0.1, repetition_penalty=1.1, max_length=4096) + + +.. parsed-literal:: + + The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. + Setting `pad_token_id` to `eos_token_id`:None for open-end generation. + + +.. code:: ipython3 + + ipd.Audio(output.audio[0].numpy(), rate=output.sr) + + + + +.. raw:: html + + + + + + + +Interactive demo +---------------- + + + +.. code:: ipython3 + + from gradio_helper import make_demo + + demo = make_demo(interface) + + try: + demo.launch(debug=True) + except Exception: + demo.launch(share=True, debug=True) diff --git a/docs/notebooks/paddle-ocr-webcam-with-output.rst b/docs/notebooks/paddle-ocr-webcam-with-output.rst index 3fae2e47d99b24..aa054a40e73a07 100644 --- a/docs/notebooks/paddle-ocr-webcam-with-output.rst +++ b/docs/notebooks/paddle-ocr-webcam-with-output.rst @@ -214,7 +214,7 @@ Download the Model for Text **Detection** .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-no… + ch_PP-OCRv3_det_infer.tar: 0%| | 0.00/3.65M [00:00 + @@ -439,7 +439,7 @@ Note that many optimizations are possible to improve the performance. .. parsed-literal:: - PaddlePaddle model on CPU: 0.0069 seconds per image, FPS: 144.32 + PaddlePaddle model on CPU: 0.0071 seconds per image, FPS: 141.67 PaddlePaddle result: Labrador retriever, 0.75138 @@ -500,7 +500,7 @@ select device from dropdown list for running inference using OpenVINO .. parsed-literal:: - OpenVINO IR model in OpenVINO Runtime (AUTO): 0.0026 seconds per image, FPS: 380.57 + OpenVINO IR model in OpenVINO Runtime (AUTO): 0.0027 seconds per image, FPS: 376.00 OpenVINO result: Labrador retriever, 0.74909 diff --git a/docs/notebooks/parler-tts-text-to-speech-with-output.rst b/docs/notebooks/parler-tts-text-to-speech-with-output.rst index 323959aa17e8ef..2be3c2a4a2c7ed 100644 --- a/docs/notebooks/parler-tts-text-to-speech-with-output.rst +++ b/docs/notebooks/parler-tts-text-to-speech-with-output.rst @@ -9,7 +9,7 @@ with synthetic annotations `__ by Dan Lyth and Simon King, from Stability AI and Edinburgh University respectively. -.. image:: https://images.squarespace-cdn.com/content/v1/657816dfbefe0533e8a69d9a/30c96e25-acc5-4019-acdd-648da6142c4c/architecture_v3.png?format=2500w +|image0| Text-to-speech models trained on large-scale datasets have demonstrated impressive in-context learning capabilities and naturalness. However, @@ -53,6 +53,8 @@ need a Jupyter server to start. For details, please refer to `Installation Guide `__. +.. |image0| image:: https://images.squarespace-cdn.com/content/v1/657816dfbefe0533e8a69d9a/30c96e25-acc5-4019-acdd-648da6142c4c/architecture_v3.png?format=2500w + Prerequisites ------------- @@ -64,8 +66,32 @@ Prerequisites os.environ["GIT_CLONE_PROTECTION_ACTIVE"] = "false" + %pip uninstall -q -y torch torchvision torchaudio %pip install -q "openvino>=2024.2.0" - %pip install -q git+https://github.com/huggingface/parler-tts.git "gradio>=4.19" transformers "torch>=2.2" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -q git+https://github.com/huggingface/parler-tts.git "gradio>=4.19" transformers "torch>=2.2" "torchaudio" --extra-index-url https://download.pytorch.org/whl/cpu + + +.. parsed-literal:: + + Note: you may need to restart the kernel to use updated packages. + Note: you may need to restart the kernel to use updated packages. + ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. + easyocr 1.7.2 requires torchvision>=0.5, which is not installed. + mobileclip 0.1.0 requires clip-benchmark>=1.4.0, which is not installed. + mobileclip 0.1.0 requires torchvision==0.14.1, which is not installed. + open-clip-torch 2.22.0 requires torchvision, which is not installed. + timm 1.0.12 requires torchvision, which is not installed. + ultralytics 8.1.24 requires torchvision>=0.9.0, which is not installed. + open-clip-torch 2.22.0 requires protobuf<4, but you have protobuf 4.25.5 which is incompatible. + tensorflow 2.12.0 requires keras<2.13,>=2.12.0, but you have keras 2.13.1 which is incompatible. + tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.4 which is incompatible. + tensorflow 2.12.0 requires tensorboard<2.13,>=2.12, but you have tensorboard 2.13.0 which is incompatible. + tensorflow 2.12.0 requires tensorflow-estimator<2.13,>=2.12.0, but you have tensorflow-estimator 2.13.0 which is incompatible. + tensorflow-cpu 2.13.1 requires numpy<=1.24.3,>=1.22, but you have numpy 1.24.4 which is incompatible. + tensorflow-cpu 2.13.1 requires typing-extensions<4.6.0,>=3.6.6, but you have typing-extensions 4.12.2 which is incompatible. + tensorflow-metadata 1.14.0 requires protobuf<4.21,>=3.20.3, but you have protobuf 4.25.5 which is incompatible. + Note: you may need to restart the kernel to use updated packages. + Load the original model and inference ------------------------------------- @@ -95,6 +121,135 @@ Load the original model and inference audio_arr = generation.cpu().numpy().squeeze() sf.write("parler_tts_out.wav", audio_arr, model.config.sampling_rate) + +.. parsed-literal:: + + 2024-12-10 02:43:30.030324: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:43:30.055592: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. + Flash attention 2 is not installed + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/nn/utils/weight_norm.py:134: FutureWarning: `torch.nn.utils.weight_norm` is deprecated in favor of `torch.nn.utils.parametrizations.weight_norm`. + WeightNorm.apply(module, name, dim) + Config of the text_encoder: is overwritten by shared text_encoder config: T5Config { + "_name_or_path": "google/flan-t5-base", + "architectures": [ + "T5ForConditionalGeneration" + ], + "classifier_dropout": 0.0, + "d_ff": 2048, + "d_kv": 64, + "d_model": 768, + "decoder_start_token_id": 0, + "dense_act_fn": "gelu_new", + "dropout_rate": 0.1, + "eos_token_id": 1, + "feed_forward_proj": "gated-gelu", + "initializer_factor": 1.0, + "is_encoder_decoder": true, + "is_gated_act": true, + "layer_norm_epsilon": 1e-06, + "model_type": "t5", + "n_positions": 512, + "num_decoder_layers": 12, + "num_heads": 12, + "num_layers": 12, + "output_past": true, + "pad_token_id": 0, + "relative_attention_max_distance": 128, + "relative_attention_num_buckets": 32, + "task_specific_params": { + "summarization": { + "early_stopping": true, + "length_penalty": 2.0, + "max_length": 200, + "min_length": 30, + "no_repeat_ngram_size": 3, + "num_beams": 4, + "prefix": "summarize: " + }, + "translation_en_to_de": { + "early_stopping": true, + "max_length": 300, + "num_beams": 4, + "prefix": "translate English to German: " + }, + "translation_en_to_fr": { + "early_stopping": true, + "max_length": 300, + "num_beams": 4, + "prefix": "translate English to French: " + }, + "translation_en_to_ro": { + "early_stopping": true, + "max_length": 300, + "num_beams": 4, + "prefix": "translate English to Romanian: " + } + }, + "tie_word_embeddings": false, + "transformers_version": "4.46.1", + "use_cache": true, + "vocab_size": 32128 + } + + Config of the audio_encoder: is overwritten by shared audio_encoder config: DACConfig { + "_name_or_path": "ylacombe/dac_44khZ_8kbps", + "architectures": [ + "DACModel" + ], + "codebook_size": 1024, + "frame_rate": 86, + "latent_dim": 1024, + "model_bitrate": 8, + "model_type": "dac_on_the_hub", + "num_codebooks": 9, + "sampling_rate": 44100, + "torch_dtype": "float32", + "transformers_version": "4.46.1" + } + + Config of the decoder: is overwritten by shared decoder config: ParlerTTSDecoderConfig { + "_name_or_path": "/fsx/yoach/tmp/artefacts/decoder_400M/", + "activation_dropout": 0.0, + "activation_function": "gelu", + "add_cross_attention": true, + "architectures": [ + "ParlerTTSForCausalLM" + ], + "attention_dropout": 0.0, + "bos_token_id": 1025, + "codebook_weights": null, + "cross_attention_implementation_strategy": null, + "dropout": 0.1, + "eos_token_id": 1024, + "ffn_dim": 4096, + "hidden_size": 1024, + "initializer_factor": 0.02, + "is_decoder": true, + "layerdrop": 0.0, + "max_position_embeddings": 4096, + "model_type": "parler_tts_decoder", + "num_attention_heads": 16, + "num_codebooks": 9, + "num_cross_attention_key_value_heads": 16, + "num_hidden_layers": 24, + "num_key_value_heads": 16, + "pad_token_id": 1024, + "rope_embeddings": false, + "rope_theta": 10000.0, + "scale_embedding": false, + "tie_word_embeddings": false, + "torch_dtype": "float32", + "transformers_version": "4.46.1", + "use_cache": true, + "use_fused_lm_heads": false, + "vocab_size": 1088 + } + + You set `add_prefix_space`. The tokenizer needs to be converted from the slow tokenizers + The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results. + + .. code:: ipython3 import IPython.display as ipd @@ -108,10 +263,10 @@ Load the original model and inference - + @@ -159,6 +314,20 @@ and Decoder (``ParlerTTSDecoder``). Lets convert them one by one. text_encoder_ov_model = convert(model.text_encoder, TEXT_ENCODER_OV_PATH, example_input) + +.. parsed-literal:: + + WARNING:tensorflow:Please fix your imports. Module tensorflow.python.training.tracking.base has been moved to tensorflow.python.trackable.base. The old module will be deleted in version 2.11. + + +.. parsed-literal:: + + [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + warnings.warn( + `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. + + The Decoder Model performs in generation pipeline and we can separate it into two stage. In the first stage the model generates ``past_key_values`` into output for the second stage. In the second @@ -193,6 +362,17 @@ stage the model produces tokens during several runs. decoder_1_ov_model = convert(DecoderStage1Wrapper(model.decoder.model.decoder), DECODER_STAGE_1_OV_PATH, example_input) + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/parler_tts/modeling_parler_tts.py:367: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if seq_len > self.weights.size(0): + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/parler_tts/modeling_parler_tts.py:1713: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if sequence_length != 1: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/parler_tts/modeling_parler_tts.py:916: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + if attn_output.size() != (bsz, self.num_heads, tgt_len, self.head_dim): + + .. code:: ipython3 DECODER_STAGE_2_OV_PATH = Path("models/decoder_stage_2_ir.xml") @@ -231,6 +411,15 @@ stage the model produces tokens during several runs. decoder_2_ov_model = convert(DecoderStage2Wrapper(model.decoder.model.decoder), DECODER_STAGE_2_OV_PATH, example_input) + +.. parsed-literal:: + + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:458: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + or len(self.key_cache[layer_idx]) == 0 # the layer has no cache + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors + + Compiling models and inference ------------------------------ @@ -258,7 +447,7 @@ Select device from dropdown list for running inference using OpenVINO. .. parsed-literal:: - Dropdown(description='Device:', index=4, options=('CPU', 'GPU.0', 'GPU.1', 'GPU.2', 'AUTO'), value='AUTO') + Dropdown(description='Device:', index=1, options=('CPU', 'AUTO'), value='AUTO') @@ -360,10 +549,10 @@ and run inference. - + @@ -406,13 +595,27 @@ Interactive inference demo = make_demo(fn=infer) try: - demo.queue().launch(debug=True) + demo.queue().launch(debug=False) except Exception: - demo.queue().launch(share=True, debug=True) + demo.queue().launch(share=True, debug=False) # if you are launching remotely, specify server_name and server_port # demo.launch(server_name='your server name', server_port='server port in int') # Read more in the docs: https://gradio.app/docs/ + +.. parsed-literal:: + + Running on local URL: http://127.0.0.1:7860 + + To create a public link, set `share=True` in `launch()`. + + + + + + + + .. code:: ipython3 # please uncomment and run this cell for stopping gradio interface diff --git a/docs/notebooks/person-tracking-with-output.rst b/docs/notebooks/person-tracking-with-output.rst index 653a9b376edf7e..6ac8ff43e05ab2 100644 --- a/docs/notebooks/person-tracking-with-output.rst +++ b/docs/notebooks/person-tracking-with-output.rst @@ -148,7 +148,7 @@ Imports import collections from pathlib import Path import time - + import numpy as np import cv2 from IPython import display @@ -158,17 +158,17 @@ Imports .. code:: ipython3 # Import local modules - + if not Path("./notebook_utils.py").exists(): # Fetch `notebook_utils` module import requests - + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", ) - + open("notebook_utils.py", "w").write(r.text) - + import notebook_utils as utils from deepsort_utils.tracker import Tracker from deepsort_utils.nn_matching import NearestNeighborDistanceMetric @@ -200,36 +200,36 @@ by the cosine distance. .. code:: ipython3 from notebook_utils import download_ir_model - + # A directory where the model will be downloaded. base_model_dir = "model" precision = "FP16" # The name of the model from Open Model Zoo detection_model_name = "person-detection-0202" - - + + download_det_model_url = ( f"https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1/{detection_model_name}/{precision}/{detection_model_name}.xml" ) - + detection_model_path = download_ir_model(download_det_model_url, Path(base_model_dir) / detection_model_name / precision) - + reidentification_model_name = "person-reidentification-retail-0287" download_reid_model_url = f"https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1/{reidentification_model_name}/{precision}/{reidentification_model_name}.xml" - + reidentification_model_path = download_ir_model(download_reid_model_url, Path(base_model_dir) / reidentification_model_name / precision) .. parsed-literal:: - model/person-detection-0202/FP16/person-detection-0202.bin: 0%| | 0.00/3.47M [00:00 200: processing_times.popleft() - + _, f_width = frame.shape[:2] # Mean processing time [ms]. processing_time = np.mean(processing_times) * 1100 fps = 1000 / processing_time - + # Get poses from detection results. bbox_xywh, score, label = process_results(h, w, results=output) - + img_crops = [] for box in bbox_xywh: x1, y1, x2, y2 = xywh_to_xyxy(box, h, w) img = frame[y1:y2, x1:x2] img_crops.append(img) - + # Get reidentification feature of each person. if img_crops: # preprocess @@ -615,17 +614,17 @@ video file. features = extractor.predict(img_batch) else: features = np.array([]) - + # Wrap the detection and reidentification results together bbox_tlwh = xywh_to_tlwh(bbox_xywh) detections = [Detection(bbox_tlwh[i], features[i]) for i in range(features.shape[0])] - + # predict the position of tracking target tracker.predict() - + # update tracker tracker.update(detections) - + # update bbox identities outputs = [] for track in tracker.tracks: @@ -637,14 +636,14 @@ video file. outputs.append(np.array([x1, y1, x2, y2, track_id], dtype=np.int32)) if len(outputs) > 0: outputs = np.stack(outputs, axis=0) - + # draw box for visualization if len(outputs) > 0: bbox_tlwh = [] bbox_xyxy = outputs[:, :4] identities = outputs[:, -1] frame = draw_boxes(frame, bbox_xyxy, identities) - + cv2.putText( img=frame, text=f"Inference time: {processing_time:.1f}ms ({fps:.1f} FPS)", @@ -655,7 +654,7 @@ video file. thickness=1, lineType=cv2.LINE_AA, ) - + if use_popup: cv2.imshow(winname=title, mat=frame) key = cv2.waitKey(1) @@ -670,7 +669,7 @@ video file. # Display the image in this notebook. display.clear_output(wait=True) display.display(i) - + # ctrl-c except KeyboardInterrupt: print("Interrupted") @@ -724,11 +723,11 @@ will work. .. code:: ipython3 USE_WEBCAM = False - + cam_id = 0 video_file = "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/video/people.mp4" source = cam_id if USE_WEBCAM else video_file - + run_person_tracking(source=source, flip=USE_WEBCAM, use_popup=False) diff --git a/docs/notebooks/person-tracking-with-output_files/person-tracking-with-output_25_0.png b/docs/notebooks/person-tracking-with-output_files/person-tracking-with-output_25_0.png index f827c9c1094e46..972cc9e5977684 100644 --- a/docs/notebooks/person-tracking-with-output_files/person-tracking-with-output_25_0.png +++ b/docs/notebooks/person-tracking-with-output_files/person-tracking-with-output_25_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5dffde5665ae619cc99fddef72befb32d1002becce56dfccf50e7577f1fab020 -size 218904 +oid sha256:1c04ed0e53cb210bd7853d3daa7f77a0a087b8e08099b837d3237b025c223b5d +size 218593 diff --git a/docs/notebooks/phi-3-vision-with-output.rst b/docs/notebooks/phi-3-vision-with-output.rst index 71981daac13be4..dc588206768c93 100644 --- a/docs/notebooks/phi-3-vision-with-output.rst +++ b/docs/notebooks/phi-3-vision-with-output.rst @@ -260,8 +260,8 @@ documentation 1 or self.sliding_window is not None) and self.is_causal: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/microsoft/Phi-3.5-vision-instruct/4a0d683eba9f1d0cbfb6151705d1ee73c25a80ca/modeling_phi3_v.py:444: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! seq_len = seq_len or torch.max(position_ids) + 1 /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/microsoft/Phi-3.5-vision-instruct/4a0d683eba9f1d0cbfb6151705d1ee73c25a80ca/modeling_phi3_v.py:445: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if seq_len > self.original_max_position_embeddings: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/nncf/torch/dynamic_graph/wrappers.py:86: TracerWarning: torch.tensor results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. op1 = operator(\*args, \*\*kwargs) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors /opt/home/k8sworker/.cache/huggingface/modules/transformers_modules/microsoft/Phi-3.5-vision-instruct/4a0d683eba9f1d0cbfb6151705d1ee73c25a80ca/modeling_phi3_v.py:683: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): @@ -374,7 +365,7 @@ documentation =4.0.0, but you have protobuf 3.20.3 which is incompatible. + parler-tts 0.2.2 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. tensorflow 2.12.0 requires keras<2.13,>=2.12.0, but you have keras 2.13.1 which is incompatible. tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.4 which is incompatible. tensorflow 2.12.0 requires tensorboard<2.13,>=2.12, but you have tensorboard 2.13.0 which is incompatible. @@ -210,8 +210,8 @@ PhotoMaker to generate the original PhotoMaker pipeline. .. parsed-literal:: - 2024-11-22 02:03:50.933677: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 02:03:50.958255: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:49:18.726948: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:49:18.751780: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -230,6 +230,12 @@ PhotoMaker to generate the original PhotoMaker pipeline. Loading pipeline components...: 0%| | 0/7 [00:00 1 or self.sliding_window is not None: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: @@ -587,15 +584,15 @@ original Stable Diffusion XL model. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_2d_condition.py:1103: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_2d_condition.py:1103: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if dim % default_overall_up_factor != 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:136: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:136: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:145: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:145: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:146: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:146: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:162: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:162: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if hidden_states.shape[0] >= 64: diff --git a/docs/notebooks/pixart-with-output.rst b/docs/notebooks/pixart-with-output.rst index 517191e17501ef..fed1f6b3dada41 100644 --- a/docs/notebooks/pixart-with-output.rst +++ b/docs/notebooks/pixart-with-output.rst @@ -118,8 +118,8 @@ directly in latent space, achieving super fast inference with few steps. .. parsed-literal:: - 2024-11-22 02:11:50.540718: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 02:11:50.565755: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 02:57:23.724286: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 02:57:23.749610: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -132,6 +132,8 @@ directly in latent space, achieving super fast inference with few steps. .. parsed-literal:: You are using the default legacy behaviour of the . This is expected, and simply means that the `legacy` (previous) behavior will be used so nothing changes for you. If you want to use the new behaviour, set `legacy=False`. This should only be set if you understand what it means, and thoroughly read the reason why this was added as explained in https://github.com/huggingface/transformers/pull/24565 + Some weights of the model checkpoint were not used when initializing PixArtTransformer2DModel: + ['caption_projection.y_embedding'] @@ -140,12 +142,6 @@ directly in latent space, achieving super fast inference with few steps. Loading checkpoint shards: 0%| | 0/4 [00:00= 64: @@ -452,7 +448,7 @@ And insert wrappers instances in the pipeline: .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/configuration_utils.py:140: FutureWarning: Accessing config attribute `_execution_device` directly via 'PixArtAlphaPipeline' object attribute is deprecated. Please access '_execution_device' over 'PixArtAlphaPipeline's config object instead, e.g. 'scheduler.config._execution_device'. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/configuration_utils.py:140: FutureWarning: Accessing config attribute `_execution_device` directly via 'PixArtAlphaPipeline' object attribute is deprecated. Please access '_execution_device' over 'PixArtAlphaPipeline's config object instead, e.g. 'scheduler.config._execution_device'. deprecate("direct config name access", "1.0.0", deprecation_message, standard_warn=False) @@ -567,7 +563,7 @@ To collect intermediate model inputs for calibration we should customize .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/configuration_utils.py:140: FutureWarning: Accessing config attribute `_execution_device` directly via 'PixArtAlphaPipeline' object attribute is deprecated. Please access '_execution_device' over 'PixArtAlphaPipeline's config object instead, e.g. 'scheduler.config._execution_device'. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/configuration_utils.py:140: FutureWarning: Accessing config attribute `_execution_device` directly via 'PixArtAlphaPipeline' object attribute is deprecated. Please access '_execution_device' over 'PixArtAlphaPipeline's config object instead, e.g. 'scheduler.config._execution_device'. deprecate("direct config name access", "1.0.0", deprecation_message, standard_warn=False) @@ -1625,16 +1621,16 @@ pipelines. Loading pipeline components...: 0%| | 0/5 [00:00 0.19 and openvino version <= 2024.4. Please downgrade to tokenizers version <= 0.19 to export tokenizers to OpenVINO. - INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 6% (1 / 281) │ 0% (0 / 280) │ - ├────────────────┼─────────────────────────────┼────────────────────────────────────────┤ - │ 4 │ 94% (280 / 281) │ 100% (280 / 280) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ - Applying Weight Compression ━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 0:05:31 • 0:00:00 - INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 6% (3 / 172) │ 0% (0 / 169) │ - ├────────────────┼─────────────────────────────┼────────────────────────────────────────┤ - │ 4 │ 94% (169 / 172) │ 100% (169 / 169) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ - Applying Weight Compression ━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 0:00:12 • 0:00:00 - INFO:nncf:Statistics of the bitwidth distribution: - ┍━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┑ - │ Num bits (N) │ % all parameters (layers) │ % ratio-defining parameters (layers) │ - ┝━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┥ - │ 8 │ 100% (1 / 1) │ 0% (0 / 0) │ - ┕━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┙ - Applying Weight Compression ━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% • 0:00:05 • 0:00:00 - + Traceback (most recent call last): + File "/opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/bin/optimum-cli", line 10, in + sys.exit(main()) + File "/opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/commands/optimum_cli.py", line 208, in main + service.run() + File "/opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/commands/export/openvino.py", line 390, in run + main_export( + File "/opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/exporters/openvino/__main__.py", line 476, in main_export + _weight_only_quantization(submodel, quantization_config) + File "/opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/optimum/intel/openvino/quantization.py", line 938, in _weight_only_quantization + return nncf.compress_weights( + TypeError: compress_weights() got an unexpected keyword argument 'backup_mode' + Run model inference ------------------- @@ -541,8 +528,8 @@ Intel can be found in .. parsed-literal:: - 2024-11-22 03:06:17.214277: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 03:06:17.240005: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 03:48:41.700649: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 03:48:41.726260: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -587,7 +574,7 @@ Intel can be found in .. parsed-literal:: - The unusual aspect of this image is that the cat is lying inside a cardboard box, which is not a typical setting for a cat. Cats are often known for their affinity for boxes, but it is still considered unusual to see a cat comfortably resting inside a box in a living room setting. The cat appears relaxed and content, which adds to the charm of the scene. The presence of a sofa in the background further emphasizes the domestic and cozy atmosphere of the image. + The unusual aspect of this image is that the cat is lying on its back inside a cardboard box. This is not a typical position for a cat, as they usually prefer to curl up or lie on their sides when resting. Additionally, cats are known for their love of small, enclosed spaces, but it is less common to see a cat lying on its back in such a setting. The image captures a playful and relaxed moment, highlighting the cat's comfort and curiosity. Interactive demo diff --git a/docs/notebooks/pose-estimation-with-output.rst b/docs/notebooks/pose-estimation-with-output.rst index e827bd19acfd34..112b6037d4907f 100644 --- a/docs/notebooks/pose-estimation-with-output.rst +++ b/docs/notebooks/pose-estimation-with-output.rst @@ -126,13 +126,13 @@ precision in the code below. .. parsed-literal:: - model/intel/human-pose-estimation-0001/FP16-INT8/human-pose-estimation-0001.xml: 0%| | 0.00/474k [0… + human-pose-estimation-0001.xml: 0%| | 0.00/474k [00:00 target_length: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors diff --git a/docs/notebooks/qwen2-vl-with-output.rst b/docs/notebooks/qwen2-vl-with-output.rst index d9c51a151e5926..ea0541fe1610a7 100644 --- a/docs/notebooks/qwen2-vl-with-output.rst +++ b/docs/notebooks/qwen2-vl-with-output.rst @@ -55,10 +55,8 @@ In this tutorial we consider how to convert and optimize Qwen2VL model for creating multimodal chatbot. Additionally, we demonstrate how to apply stateful transformation on LLM part and model optimization techniques like weights compression using -`NNCF `__ - - -**Table of contents:** +`NNCF `__ #### Table of +contents: - `Prerequisites <#prerequisites>`__ - `Select model <#select-model>`__ @@ -106,11 +104,11 @@ Prerequisites from pathlib import Path import requests - + if not Path("ov_qwen2_vl.py").exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/qwen2-vl/ov_qwen2_vl.py") open("ov_qwen2_vl.py", "w").write(r.text) - + if not Path("notebook_utils.py").exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py") open("notebook_utils.py", "w").write(r.text) @@ -128,9 +126,9 @@ using widget bellow: .. code:: ipython3 from ov_qwen2_vl import model_selector - + model_id = model_selector() - + model_id @@ -141,8 +139,8 @@ using widget bellow: .. parsed-literal:: - 2024-11-22 04:16:41.832996: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 04:16:41.858520: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:00:06.245590: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:00:06.272261: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -287,20 +285,20 @@ documentation target_length: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/cache_utils.py:443: TracerWarning: Using len to get tensor shape might cause the trace to be incorrect. Recommended usage would be tensor.shape[0]. Passing a tensor of different shape might lead to errors or silently give incorrect results. elif len(self.key_cache[layer_idx]) == 0: # fills previously skipped layers; checking for tensor causes errors @@ -442,7 +431,7 @@ Intel `__ .. code:: ipython3 from ov_qwen2_vl import OVQwen2VLModel - + # Uncomment below lines to see the model inference class code # OVQwen2VLModel?? @@ -454,9 +443,9 @@ Select inference device .. code:: ipython3 from notebook_utils import device_widget - + device = device_widget(default="AUTO", exclude=["NPU"]) - + device @@ -483,25 +472,25 @@ Run model inference from transformers import AutoProcessor, AutoTokenizer from qwen_vl_utils import process_vision_info from transformers import TextStreamer - - + + min_pixels = 256 * 28 * 28 max_pixels = 1280 * 28 * 28 processor = AutoProcessor.from_pretrained(model_dir, min_pixels=min_pixels, max_pixels=max_pixels) - + if processor.chat_template is None: tok = AutoTokenizer.from_pretrained(model_dir) processor.chat_template = tok.chat_template - + example_image_url = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg" example_image_path = Path("demo.jpeg") - + if not example_image_path.exists(): Image.open(requests.get(example_image_url, stream=True).raw).save(example_image_path) - + image = Image.open(example_image_path) question = "Describe this image." - + messages = [ { "role": "user", @@ -514,7 +503,7 @@ Run model inference ], } ] - + # Preparation for inference text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) image_inputs, video_inputs = process_vision_info(messages) @@ -525,12 +514,12 @@ Run model inference padding=True, return_tensors="pt", ) - + display(image) print("Question:") print(question) print("Answer:") - + generated_ids = model.generate(**inputs, max_new_tokens=100, streamer=TextStreamer(processor.tokenizer, skip_prompt=True, skip_special_tokens=True)) @@ -573,10 +562,10 @@ click ``Submit`` to start communication. .. code:: ipython3 from gradio_helper import make_demo - - + + demo = make_demo(model, processor) - + try: demo.launch(debug=False) except Exception: @@ -589,9 +578,9 @@ click ``Submit`` to start communication. .. parsed-literal:: Running on local URL: http://127.0.0.1:7860 - + Thanks for being a Gradio user! If you have questions or feedback, please join our Discord server and chat with us: https://discord.gg/feTf9x3ZSB - + To create a public link, set `share=True` in `launch()`. diff --git a/docs/notebooks/rmbg-background-removal-with-output.rst b/docs/notebooks/rmbg-background-removal-with-output.rst index c2e7286cc35cb4..0961afb2bf1ef5 100644 --- a/docs/notebooks/rmbg-background-removal-with-output.rst +++ b/docs/notebooks/rmbg-background-removal-with-output.rst @@ -112,8 +112,8 @@ it may take some time. .. parsed-literal:: - 2024-11-22 04:19:11.305790: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 04:19:11.330949: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:02:42.657474: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:02:42.682685: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -240,7 +240,7 @@ function or directly loading on device using ``core.complie_model``. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. diff --git a/docs/notebooks/segment-anything-2-image-with-output.rst b/docs/notebooks/segment-anything-2-image-with-output.rst index 1e938df4a9763a..d9b24bf720325b 100644 --- a/docs/notebooks/segment-anything-2-image-with-output.rst +++ b/docs/notebooks/segment-anything-2-image-with-output.rst @@ -120,24 +120,20 @@ Prerequisites .. parsed-literal:: - ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. - mobileclip 0.1.0 requires clip-benchmark>=1.4.0, which is not installed. - mobileclip 0.1.0 requires torchvision==0.14.1, but you have torchvision 0.19.1+cpu which is incompatible. - parler-tts 0.2.1 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. Note: you may need to restart the kernel to use updated packages. Collecting iopath>=0.1.10 Using cached iopath-0.1.10-py3-none-any.whl - Requirement already satisfied: pillow>=9.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (10.4.0) - Requirement already satisfied: hydra-core>=1.3.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.3.2) - Requirement already satisfied: tqdm in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.67.0) - Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.12.2) - Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (3.0.0) - Requirement already satisfied: omegaconf<2.4,>=2.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (2.3.0) - Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (4.9.3) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (24.2) - Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (6.4.5) - Requirement already satisfied: PyYAML>=5.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from omegaconf<2.4,>=2.2->hydra-core>=1.3.2) (6.0.2) - Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.3.2) (3.20.2) + Requirement already satisfied: pillow>=9.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (10.4.0) + Requirement already satisfied: hydra-core>=1.3.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.3.2) + Requirement already satisfied: tqdm in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.67.1) + Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.12.2) + Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (3.0.0) + Requirement already satisfied: omegaconf<2.4,>=2.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (2.3.0) + Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (4.9.3) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (24.2) + Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (6.4.5) + Requirement already satisfied: PyYAML>=5.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from omegaconf<2.4,>=2.2->hydra-core>=1.3.2) (6.0.2) + Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.3.2) (3.20.2) Installing collected packages: iopath Attempting uninstall: iopath Found existing installation: iopath 0.1.9 @@ -190,10 +186,10 @@ Clone and install segment-anything-2 .. parsed-literal:: env: SAM2_BUILD_CUDA=0 - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sam2-image-segmentation/sam2 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sam2-image-segmentation/sam2 ERROR: Package 'sam-2' requires a different Python: 3.8.10 not in '>=3.10.0' Note: you may need to restart the kernel to use updated packages. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sam2-image-segmentation + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sam2-image-segmentation .. code:: ipython3 @@ -397,7 +393,8 @@ Mask prediction will be includes two models: * **Prompt Encoder** - Encoder for segmentation condition. As a condition can be used points, boxes or segmentation mask. -* **Mask Decoder** - The mask decoder efficiently maps the image embedding, prompt embeddings, and an output +* **Mask Decoder** - The mask decoder + efficiently maps the image embedding, prompt embeddings, and an output token to a mask. Combined prompt encoder and mask decoder model has following list of @@ -488,12 +485,6 @@ Example Image image = cv2.imread("truck.jpg") image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - -.. parsed-literal:: - - 'truck.jpg' already exists. - - .. code:: ipython3 plt.figure(figsize=(10, 10)) diff --git a/docs/notebooks/segment-anything-2-image-with-output_files/segment-anything-2-image-with-output_92_0.png b/docs/notebooks/segment-anything-2-image-with-output_files/segment-anything-2-image-with-output_92_0.png new file mode 100644 index 00000000000000..343e5ecc49fc50 --- /dev/null +++ b/docs/notebooks/segment-anything-2-image-with-output_files/segment-anything-2-image-with-output_92_0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:520c7390de98864c4ae6b24b940230e83f2b5fc0b1723d58ed9941cc2d9bc70f +size 469439 diff --git a/docs/notebooks/segment-anything-2-video-with-output.rst b/docs/notebooks/segment-anything-2-video-with-output.rst index 20aae9f8a5e3f9..dec5f3d63f341e 100644 --- a/docs/notebooks/segment-anything-2-video-with-output.rst +++ b/docs/notebooks/segment-anything-2-video-with-output.rst @@ -110,18 +110,18 @@ Prerequisites .. parsed-literal:: Note: you may need to restart the kernel to use updated packages. - Requirement already satisfied: iopath>=0.1.10 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (0.1.10) - Requirement already satisfied: pillow>=9.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (10.4.0) - Requirement already satisfied: hydra-core>=1.3.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.3.2) - Requirement already satisfied: tqdm in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.67.0) - Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.12.2) - Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (3.0.0) - Requirement already satisfied: omegaconf<2.4,>=2.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (2.3.0) - Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (4.9.3) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (24.2) - Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (6.4.5) - Requirement already satisfied: PyYAML>=5.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from omegaconf<2.4,>=2.2->hydra-core>=1.3.2) (6.0.2) - Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.3.2) (3.20.2) + Requirement already satisfied: iopath>=0.1.10 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (0.1.10) + Requirement already satisfied: pillow>=9.4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (10.4.0) + Requirement already satisfied: hydra-core>=1.3.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.3.2) + Requirement already satisfied: tqdm in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.67.1) + Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (4.12.2) + Requirement already satisfied: portalocker in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from iopath>=0.1.10) (3.0.0) + Requirement already satisfied: omegaconf<2.4,>=2.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (2.3.0) + Requirement already satisfied: antlr4-python3-runtime==4.9.* in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (4.9.3) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (24.2) + Requirement already satisfied: importlib-resources in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from hydra-core>=1.3.2) (6.4.5) + Requirement already satisfied: PyYAML>=5.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from omegaconf<2.4,>=2.2->hydra-core>=1.3.2) (6.0.2) + Requirement already satisfied: zipp>=3.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from importlib-resources->hydra-core>=1.3.2) (3.20.2) Note: you may need to restart the kernel to use updated packages. Note: you may need to restart the kernel to use updated packages. @@ -174,7 +174,7 @@ Clone and install segment-anything-2 .. parsed-literal:: env: SAM2_BUILD_CUDA=0 - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sam2-video-segmentation/sam2 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sam2-video-segmentation/sam2 .. parsed-literal:: @@ -203,7 +203,7 @@ Clone and install segment-anything-2 ERROR: Package 'sam-2' requires a different Python: 3.8.10 not in '>=3.10.0' Note: you may need to restart the kernel to use updated packages. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sam2-video-segmentation + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sam2-video-segmentation .. code:: ipython3 @@ -601,14 +601,14 @@ Prepare data .. parsed-literal:: - data/coco.mp4: 0%| | 0.00/877k [00:00 - + Your browser does not support the video tag. @@ -840,7 +840,7 @@ Example with box .. parsed-literal:: - frame loading (JPEG): 100%|██████████| 50/50 [00:00<00:00, 52.72it/s] + frame loading (JPEG): 100%|██████████| 25/25 [00:00<00:00, 54.66it/s] @@ -877,7 +877,7 @@ Example with box .. parsed-literal:: - propagate in video: 100%|██████████| 50/50 [07:47<00:00, 9.35s/it] + propagate in video: 100%|██████████| 25/25 [03:37<00:00, 8.71s/it] .. code:: ipython3 @@ -894,7 +894,7 @@ Example with box .. raw:: html @@ -927,7 +927,7 @@ Run Interactive For Video Segmentation with Gradio .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/analytics.py:106: UserWarning: IMPORTANT: You are using gradio version 4.40.0, however version 4.44.1 is available, please upgrade. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/analytics.py:106: UserWarning: IMPORTANT: You are using gradio version 4.40.0, however version 4.44.1 is available, please upgrade. -------- warnings.warn( diff --git a/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_40_1.png b/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_40_1.png index 5721f78113b9a5..8b2efbd6f030df 100644 --- a/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_40_1.png +++ b/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_40_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dce79554325cf25434872511d2c96b1361ab4a3e14f23a936d227177ee98836f -size 193590 +oid sha256:bdf6f36d230ce5b74e070f0abb2e3672a1ae3f31094c2444a0e0623b95f1bf35 +size 193591 diff --git a/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_46_0.png b/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_46_0.png index e18f213004313f..65df892bd6e8c2 100644 --- a/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_46_0.png +++ b/docs/notebooks/segment-anything-2-video-with-output_files/segment-anything-2-video-with-output_46_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00bfe0191dd680f768ea740c00fc4e6d9054e72c250971fc8e12807159a26644 -size 190195 +oid sha256:6b3a974acb951d94d941f150b640a1dcce172f6974085774adbf06e22adeb386 +size 190202 diff --git a/docs/notebooks/siglip-zero-shot-image-classification-with-output.rst b/docs/notebooks/siglip-zero-shot-image-classification-with-output.rst index a38b7c56a2ec8a..a1738642568a2b 100644 --- a/docs/notebooks/siglip-zero-shot-image-classification-with-output.rst +++ b/docs/notebooks/siglip-zero-shot-image-classification-with-output.rst @@ -120,8 +120,8 @@ tokenizer and preparing the images. .. parsed-literal:: - 2024-11-22 04:41:05.723109: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 04:41:05.748466: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:15:56.596890: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:15:56.621776: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -258,7 +258,7 @@ object ready to load on the device and start making predictions. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. @@ -604,7 +604,7 @@ model are similar to the PyTorch model. .. parsed-literal:: - [{'dog': 0.99}, {'horse': 0.0}, {'cat': 0.0}, {'wolf': 0.0}, {'tiger': 0.0}] + [{'dog': 0.99}, {'horse': 0.0}, {'cat': 0.0}, {'wolf': 0.0}, {'frog': 0.0}] @@ -679,7 +679,7 @@ approximately estimate the speed up of the dynamic quantized models. .. parsed-literal:: - Performance speed up: 2.016 + Performance speed up: 1.907 Interactive inference diff --git a/docs/notebooks/siglip-zero-shot-image-classification-with-output_files/siglip-zero-shot-image-classification-with-output_24_1.png b/docs/notebooks/siglip-zero-shot-image-classification-with-output_files/siglip-zero-shot-image-classification-with-output_24_1.png index 611278a49d1583..6e5afc5acf92a6 100644 --- a/docs/notebooks/siglip-zero-shot-image-classification-with-output_files/siglip-zero-shot-image-classification-with-output_24_1.png +++ b/docs/notebooks/siglip-zero-shot-image-classification-with-output_files/siglip-zero-shot-image-classification-with-output_24_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f15546e58fac808ed62a6fcc29f2b58b48a974070a9d8c0b5c199c533b747d0 -size 580998 +oid sha256:3ebc30e695ed16710b909a552137d214ca9defb109984e4da59e8b684ce59427 +size 581000 diff --git a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output.rst b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output.rst index e9fcfb3f8baa9f..a5b31e15d97ec2 100644 --- a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output.rst +++ b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output.rst @@ -61,8 +61,8 @@ and install required packages. ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. modelscope-studio 0.5.2 requires gradio<6.0,>=4.0, but you have gradio 3.43.1 which is incompatible. - parler-tts 0.2.1 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. - parler-tts 0.2.1 requires transformers<=4.46.1,>=4.46.1, but you have transformers 4.46.3 which is incompatible. + parler-tts 0.2.2 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. + parler-tts 0.2.2 requires transformers<=4.46.1,>=4.46.1, but you have transformers 4.46.3 which is incompatible. Note: you may need to restart the kernel to use updated packages. @@ -121,7 +121,7 @@ and install required packages. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo/img2img-turbo + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo/img2img-turbo Load PyTorch model @@ -381,10 +381,10 @@ diagram indicate trainable layers. Semi-transparent layers are frozen. .. parsed-literal:: - 2024-11-22 04:46:27.445712: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 04:46:27.471919: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:21:48.209793: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:21:48.234621: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/outputs.py:63: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/outputs.py:63: FutureWarning: `torch.utils._pytree._register_pytree_node` is deprecated. Please use `torch.utils._pytree.register_pytree_node` instead. torch.utils._pytree._register_pytree_node( @@ -402,7 +402,7 @@ diagram indicate trainable layers. Semi-transparent layers are frozen. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/huggingface_hub/file_download.py:1142: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/huggingface_hub/file_download.py:1142: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`. warnings.warn( @@ -413,8 +413,8 @@ diagram indicate trainable layers. Semi-transparent layers are frozen. .. parsed-literal:: - 100%|██████████| 525M/525M [18:17<00:00, 478kiB/s] - /tmp/ipykernel_3576883/2531017353.py:172: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + 100%|██████████| 525M/525M [07:34<00:00, 1.15MiB/s] + /tmp/ipykernel_2241734/2531017353.py:172: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. sd = torch.load(p_ckpt, map_location="cpu") @@ -473,30 +473,30 @@ on disk using ``ov.save_model`` in compressed to FP16 format. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:88: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:88: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if input_shape[-1] > 1 or self.sliding_window is not None: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:135: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:135: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:144: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:144: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unet_2d_condition.py:915: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unet_2d_condition.py:915: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if dim % default_overall_up_factor != 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:149: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:149: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:165: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:165: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if hidden_states.shape[0] >= 64: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:433: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:433: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if model_output.shape[1] == sample.shape[1] * 2 and self.variance_type in ["learned", "learned_range"]: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:440: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:440: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! alpha_prod_t_prev = self.alphas_cumprod[prev_t] if prev_t >= 0 else self.one - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:479: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:479: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if t > 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:330: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/schedulers/scheduling_ddpm.py:330: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! alpha_prod_t_prev = self.alphas_cumprod[prev_t] if prev_t >= 0 else self.one @@ -676,17 +676,17 @@ Download results using download button .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo/gradio_helper.py:225: GradioDeprecationWarning: 'scale' value should be an integer. Using 0.4 will cause issues. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo/gradio_helper.py:225: GradioDeprecationWarning: 'scale' value should be an integer. Using 0.4 will cause issues. with gr.Column(elem_id="column_process", min_width=50, scale=0.4): - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/utils.py:776: UserWarning: Expected 1 arguments for function . at 0x7f22fbf5a550>, received 0. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/utils.py:776: UserWarning: Expected 1 arguments for function . at 0x7fafe0603c10>, received 0. warnings.warn( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/utils.py:780: UserWarning: Expected at least 1 arguments for function . at 0x7f22fbf5a550>, received 0. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/gradio/utils.py:780: UserWarning: Expected at least 1 arguments for function . at 0x7fafe0603c10>, received 0. warnings.warn( .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/sketch-to-image-pix2pix-turbo Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. diff --git a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.jpg b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.jpg index 9d8436d4e8894f..a054eb11c32455 100644 --- a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.jpg +++ b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c28978a7a34769c09d64918686fb69f0239eb9f6499e590a86af16ca1a416d4 -size 23636 +oid sha256:7f92cbd6bb14242b47d354389a04e3413c94c46d233e71b73e305bfb73085a10 +size 23649 diff --git a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.png b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.png index cacdc0c183ea23..336a9ae38fa096 100644 --- a/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.png +++ b/docs/notebooks/sketch-to-image-pix2pix-turbo-with-output_files/sketch-to-image-pix2pix-turbo-with-output_19_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5acfcf35473541de444c0a2edbfec36423f37335fecf6844a179c65530a6b54 -size 303319 +oid sha256:179009716266de8c220bfe9b7b3d64410061f8ae8bf74a08305655c020cde76f +size 303164 diff --git a/docs/notebooks/sparsity-optimization-with-output.rst b/docs/notebooks/sparsity-optimization-with-output.rst index 8d3779621fb2ec..038a8db6aec1b1 100644 --- a/docs/notebooks/sparsity-optimization-with-output.rst +++ b/docs/notebooks/sparsity-optimization-with-output.rst @@ -82,8 +82,8 @@ Imports .. parsed-literal:: - 2024-11-22 05:06:26.947305: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 05:06:26.972806: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:31:08.167081: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:31:08.192294: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -202,7 +202,7 @@ as an example. It is recommended to tune based on your applications. [ WARNING ] Performance hint was not explicitly specified in command line. Device(CPU) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 68.94 ms + [ INFO ] Read model took 72.79 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] input_ids (node: input_ids) : i64 / [...] / [?,?] @@ -213,7 +213,7 @@ as an example. It is recommended to tune based on your applications. [Step 5/11] Resizing model to match image sizes and given batch [ INFO ] Model batch size: 1 [ INFO ] Reshaping model: 'input_ids': [1,64], 'attention_mask': [1,64], 'token_type_ids': [1,64] - [ INFO ] Reshape model took 28.06 ms + [ INFO ] Reshape model took 27.96 ms [Step 6/11] Configuring input of the model [ INFO ] Model inputs: [ INFO ] input_ids (node: input_ids) : i64 / [...] / [1,64] @@ -222,7 +222,7 @@ as an example. It is recommended to tune based on your applications. [ INFO ] Model outputs: [ INFO ] logits (node: logits) : f32 / [...] / [1,2] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 999.63 ms + [ INFO ] Compile model took 1082.12 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: torch_jit @@ -254,17 +254,17 @@ as an example. It is recommended to tune based on your applications. [ INFO ] Fill input 'token_type_ids' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 4 inference requests, limits: 60000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 27.20 ms + [ INFO ] First inference took 28.08 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] [ INFO ] Count: 9176 iterations - [ INFO ] Duration: 60047.45 ms + [ INFO ] Duration: 60033.51 ms [ INFO ] Latency: [ INFO ] Median: 25.83 ms - [ INFO ] Average: 25.91 ms - [ INFO ] Min: 24.30 ms - [ INFO ] Max: 37.67 ms - [ INFO ] Throughput: 152.81 FPS + [ INFO ] Average: 25.92 ms + [ INFO ] Min: 23.43 ms + [ INFO ] Max: 42.58 ms + [ INFO ] Throughput: 152.85 FPS Benchmark quantized sparse inference performance @@ -321,7 +321,7 @@ for which a layer will be enabled. [ WARNING ] Performance hint was not explicitly specified in command line. Device(CPU) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 71.97 ms + [ INFO ] Read model took 75.90 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] input_ids (node: input_ids) : i64 / [...] / [?,?] @@ -332,7 +332,7 @@ for which a layer will be enabled. [Step 5/11] Resizing model to match image sizes and given batch [ INFO ] Model batch size: 1 [ INFO ] Reshaping model: 'input_ids': [1,64], 'attention_mask': [1,64], 'token_type_ids': [1,64] - [ INFO ] Reshape model took 28.33 ms + [ INFO ] Reshape model took 28.30 ms [Step 6/11] Configuring input of the model [ INFO ] Model inputs: [ INFO ] input_ids (node: input_ids) : i64 / [...] / [1,64] @@ -341,7 +341,7 @@ for which a layer will be enabled. [ INFO ] Model outputs: [ INFO ] logits (node: logits) : f32 / [...] / [1,2] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 1001.30 ms + [ INFO ] Compile model took 1011.04 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: torch_jit @@ -373,17 +373,17 @@ for which a layer will be enabled. [ INFO ] Fill input 'token_type_ids' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 4 inference requests, limits: 60000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 28.02 ms + [ INFO ] First inference took 27.34 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 9216 iterations - [ INFO ] Duration: 60030.33 ms + [ INFO ] Count: 9152 iterations + [ INFO ] Duration: 60027.24 ms [ INFO ] Latency: - [ INFO ] Median: 25.92 ms - [ INFO ] Average: 25.94 ms - [ INFO ] Min: 23.04 ms - [ INFO ] Max: 31.17 ms - [ INFO ] Throughput: 153.52 FPS + [ INFO ] Median: 25.91 ms + [ INFO ] Average: 25.97 ms + [ INFO ] Min: 23.89 ms + [ INFO ] Max: 41.37 ms + [ INFO ] Throughput: 152.46 FPS When this might be helpful diff --git a/docs/notebooks/speculative-sampling-with-output.rst b/docs/notebooks/speculative-sampling-with-output.rst index 4d5656cb99645c..868fbe9beccf9e 100644 --- a/docs/notebooks/speculative-sampling-with-output.rst +++ b/docs/notebooks/speculative-sampling-with-output.rst @@ -214,7 +214,23 @@ generation is finished, we will write streamer function. pipe = ov_genai.LLMPipeline(target_model_path, device.value) config = ov_genai.GenerationConfig() - config.max_new_tokens = 100 + config.max_new_tokens = 330 + prompt = ''' + + def prime_fib(n: int): + """ + prime_fib returns n-th number that is a Fibonacci number and it's also prime. + >>> prime_fib(1) + 2 + >>> prime_fib(2) + 3 + >>> prime_fib(3) + 5 + >>> prime_fib(4) + 13 + >>> prime_fib(5) + 89 + """''' def streamer(subword): @@ -225,7 +241,7 @@ generation is finished, we will write streamer function. start_time = time.perf_counter() - pipe.generate(["Sun is yellow because"], config, streamer=streamer) + pipe.generate(prompt, config, streamer=streamer) end_time = time.perf_counter() @@ -239,7 +255,7 @@ generation is finished, we will write streamer function. print(f"Generation time: {end_time - start_time:.2f}s") del pipe - gc.collect(); + gc.collect() .. parsed-literal:: @@ -282,17 +298,19 @@ stops the current token generation iteration is not yet reached. scheduler_config = ov_genai.SchedulerConfig() # cache params - scheduler_config.cache_size = 2 + scheduler_config.cache_size = 0 + scheduler_config.num_kv_blocks = 2048 // 8 + scheduler_config.max_num_batched_tokens = 2048 draft_model = ov_genai.draft_model(draft_model_path, device.value) pipe = ov_genai.LLMPipeline(target_model_path, device.value, draft_model=draft_model, scheduler_config=scheduler_config) config = ov_genai.GenerationConfig() - config.max_new_tokens = 100 - config.num_assistant_tokens = 3 + config.max_new_tokens = 330 + config.num_assistant_tokens = 5 start_time = time.perf_counter() - result = pipe.generate(["Sun is yellow because"], config, streamer=streamer) + result = pipe.generate(prompt, config, streamer=streamer) end_time = time.perf_counter() diff --git a/docs/notebooks/speech-recognition-quantization-wav2vec2-with-output.rst b/docs/notebooks/speech-recognition-quantization-wav2vec2-with-output.rst index 0b9b8db99880b6..27fad907b62fd6 100644 --- a/docs/notebooks/speech-recognition-quantization-wav2vec2-with-output.rst +++ b/docs/notebooks/speech-recognition-quantization-wav2vec2-with-output.rst @@ -57,47 +57,47 @@ Guide =0.11.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.5.2) - Requirement already satisfied: torch>=2.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (2.4.1+cpu) - Requirement already satisfied: filelock in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.16.1) - Requirement already satisfied: numpy>=1.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (1.24.4) - Requirement already satisfied: pyarrow>=15.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (17.0.0) - Requirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.3.8) - Requirement already satisfied: pandas in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (2.0.3) - Requirement already satisfied: requests>=2.32.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (2.32.3) - Requirement already satisfied: tqdm>=4.66.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (4.67.0) - Requirement already satisfied: xxhash in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.5.0) - Requirement already satisfied: multiprocess in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.70.16) - Requirement already satisfied: fsspec<=2024.6.1,>=2023.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fsspec[http]<=2024.6.1,>=2023.1.0->datasets) (2024.6.1) - Requirement already satisfied: aiohttp in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.10.11) - Requirement already satisfied: huggingface-hub>=0.22.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.25.2) - Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (24.2) - Requirement already satisfied: pyyaml>=5.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (6.0.2) - Requirement already satisfied: lightning-utilities>=0.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchmetrics>=0.11.0) (0.11.9) - Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchmetrics>=0.11.0) (4.12.2) - Requirement already satisfied: sympy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (1.13.3) - Requirement already satisfied: networkx in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (3.1) - Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (3.1.4) - Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (2.4.3) - Requirement already satisfied: aiosignal>=1.1.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.3.1) - Requirement already satisfied: attrs>=17.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (24.2.0) - Requirement already satisfied: frozenlist>=1.1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.5.0) - Requirement already satisfied: multidict<7.0,>=4.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (6.1.0) - Requirement already satisfied: yarl<2.0,>=1.12.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.15.2) - Requirement already satisfied: async-timeout<6.0,>=4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (5.0.1) - Requirement already satisfied: setuptools in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from lightning-utilities>=0.8.0->torchmetrics>=0.11.0) (75.3.0) - Requirement already satisfied: charset-normalizer<4,>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (3.4.0) - Requirement already satisfied: idna<4,>=2.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (3.10) - Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (2.2.3) - Requirement already satisfied: certifi>=2017.4.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (2024.8.30) - Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch>=2.1.0) (2.1.5) - Requirement already satisfied: python-dateutil>=2.8.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2.9.0.post0) - Requirement already satisfied: pytz>=2020.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2024.2) - Requirement already satisfied: tzdata>=2022.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2024.2) - Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from sympy->torch>=2.1.0) (1.3.0) - Requirement already satisfied: six>=1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0) - Requirement already satisfied: propcache>=0.2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from yarl<2.0,>=1.12.0->aiohttp->datasets) (0.2.0) + Requirement already satisfied: datasets in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (3.0.0) + Requirement already satisfied: torchmetrics>=0.11.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (1.5.2) + Requirement already satisfied: torch>=2.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (2.4.1+cpu) + Requirement already satisfied: filelock in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.16.1) + Requirement already satisfied: numpy>=1.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (1.24.4) + Requirement already satisfied: pyarrow>=15.0.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (17.0.0) + Requirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.3.8) + Requirement already satisfied: pandas in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (2.0.3) + Requirement already satisfied: requests>=2.32.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (2.32.3) + Requirement already satisfied: tqdm>=4.66.3 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (4.67.1) + Requirement already satisfied: xxhash in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.5.0) + Requirement already satisfied: multiprocess in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.70.16) + Requirement already satisfied: fsspec<=2024.6.1,>=2023.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from fsspec[http]<=2024.6.1,>=2023.1.0->datasets) (2024.6.1) + Requirement already satisfied: aiohttp in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (3.10.11) + Requirement already satisfied: huggingface-hub>=0.22.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (0.25.2) + Requirement already satisfied: packaging in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (24.2) + Requirement already satisfied: pyyaml>=5.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from datasets) (6.0.2) + Requirement already satisfied: lightning-utilities>=0.8.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchmetrics>=0.11.0) (0.11.9) + Requirement already satisfied: typing-extensions in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torchmetrics>=0.11.0) (4.12.2) + Requirement already satisfied: sympy in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (1.13.3) + Requirement already satisfied: networkx in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (3.1) + Requirement already satisfied: jinja2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from torch>=2.1.0) (3.1.4) + Requirement already satisfied: aiohappyeyeballs>=2.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (2.4.4) + Requirement already satisfied: aiosignal>=1.1.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.3.1) + Requirement already satisfied: attrs>=17.3.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (24.2.0) + Requirement already satisfied: frozenlist>=1.1.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.5.0) + Requirement already satisfied: multidict<7.0,>=4.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (6.1.0) + Requirement already satisfied: yarl<2.0,>=1.12.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (1.15.2) + Requirement already satisfied: async-timeout<6.0,>=4.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from aiohttp->datasets) (5.0.1) + Requirement already satisfied: setuptools in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from lightning-utilities>=0.8.0->torchmetrics>=0.11.0) (75.3.0) + Requirement already satisfied: charset-normalizer<4,>=2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (3.4.0) + Requirement already satisfied: idna<4,>=2.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (3.10) + Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (2.2.3) + Requirement already satisfied: certifi>=2017.4.17 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from requests>=2.32.2->datasets) (2024.8.30) + Requirement already satisfied: MarkupSafe>=2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from jinja2->torch>=2.1.0) (2.1.5) + Requirement already satisfied: python-dateutil>=2.8.2 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2.9.0.post0) + Requirement already satisfied: pytz>=2020.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2024.2) + Requirement already satisfied: tzdata>=2022.1 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from pandas->datasets) (2024.2) + Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from sympy->torch>=2.1.0) (1.3.0) + Requirement already satisfied: six>=1.5 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.17.0) + Requirement already satisfied: propcache>=0.2.0 in /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages (from yarl<2.0,>=1.12.0->aiohttp->datasets) (0.2.0) Note: you may need to restart the kernel to use updated packages. Note: you may need to restart the kernel to use updated packages. @@ -119,8 +119,8 @@ Imports .. parsed-literal:: - 2024-11-22 05:08:52.722966: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 05:08:52.748262: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:33:33.150578: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:33:33.175323: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -177,10 +177,10 @@ IR). .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/wav2vec2/modeling_wav2vec2.py:872: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/wav2vec2/modeling_wav2vec2.py:872: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attn_output.size() != (bsz, self.num_heads, tgt_len, self.head_dim): @@ -507,7 +507,7 @@ quantized model. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torchmetrics/utilities/prints.py:62: FutureWarning: Importing `WordErrorRate` from `torchmetrics` was deprecated and will be removed in 2.0. Import `WordErrorRate` from `torchmetrics.text` instead. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torchmetrics/utilities/prints.py:62: FutureWarning: Importing `WordErrorRate` from `torchmetrics` was deprecated and will be removed in 2.0. Import `WordErrorRate` from `torchmetrics.text` instead. _future_warning( @@ -577,7 +577,7 @@ models. [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 18.23 ms + [ INFO ] Read model took 17.68 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] input_values , 45 (node: input_values) : f32 / [...] / [?,?] @@ -586,14 +586,14 @@ models. [Step 5/11] Resizing model to match image sizes and given batch [ INFO ] Model batch size: 1 [ INFO ] Reshaping model: '45': [1,30480] - [ INFO ] Reshape model took 4.39 ms + [ INFO ] Reshape model took 4.15 ms [Step 6/11] Configuring input of the model [ INFO ] Model inputs: [ INFO ] input_values , 45 (node: input_values) : f32 / [...] / [1,30480] [ INFO ] Model outputs: [ INFO ] logits (node: __module.lm_head/aten::linear/Add) : f32 / [...] / [1,95,32] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 493.97 ms + [ INFO ] Compile model took 492.85 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model0 @@ -630,17 +630,17 @@ models. [ INFO ] Fill input '45' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 6 inference requests, limits: 120000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 69.21 ms + [ INFO ] First inference took 70.68 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 5430 iterations - [ INFO ] Duration: 120128.75 ms + [ INFO ] Count: 5424 iterations + [ INFO ] Duration: 120129.30 ms [ INFO ] Latency: - [ INFO ] Median: 130.74 ms - [ INFO ] Average: 132.58 ms - [ INFO ] Min: 66.32 ms - [ INFO ] Max: 307.29 ms - [ INFO ] Throughput: 45.20 FPS + [ INFO ] Median: 130.69 ms + [ INFO ] Average: 132.71 ms + [ INFO ] Min: 66.95 ms + [ INFO ] Max: 336.57 ms + [ INFO ] Throughput: 45.15 FPS .. code:: ipython3 @@ -667,7 +667,7 @@ models. [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 25.21 ms + [ INFO ] Read model took 24.12 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] input_values , 45 (node: input_values) : f32 / [...] / [?,?] @@ -676,14 +676,14 @@ models. [Step 5/11] Resizing model to match image sizes and given batch [ INFO ] Model batch size: 1 [ INFO ] Reshaping model: '45': [1,30480] - [ INFO ] Reshape model took 6.04 ms + [ INFO ] Reshape model took 6.07 ms [Step 6/11] Configuring input of the model [ INFO ] Model inputs: [ INFO ] input_values , 45 (node: input_values) : f32 / [...] / [1,30480] [ INFO ] Model outputs: [ INFO ] logits (node: __module.lm_head/aten::linear/Add) : f32 / [...] / [1,95,32] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 1188.53 ms + [ INFO ] Compile model took 1216.49 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: Model0 @@ -720,15 +720,15 @@ models. [ INFO ] Fill input '45' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 6 inference requests, limits: 120000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 55.48 ms + [ INFO ] First inference took 54.72 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 8046 iterations - [ INFO ] Duration: 120134.14 ms + [ INFO ] Count: 8016 iterations + [ INFO ] Duration: 120075.42 ms [ INFO ] Latency: - [ INFO ] Median: 88.11 ms - [ INFO ] Average: 89.43 ms - [ INFO ] Min: 71.74 ms - [ INFO ] Max: 270.18 ms - [ INFO ] Throughput: 66.98 FPS + [ INFO ] Median: 88.25 ms + [ INFO ] Average: 89.73 ms + [ INFO ] Min: 39.47 ms + [ INFO ] Max: 249.83 ms + [ INFO ] Throughput: 66.76 FPS diff --git a/docs/notebooks/speechbrain-emotion-recognition-with-output.rst b/docs/notebooks/speechbrain-emotion-recognition-with-output.rst index 23857ad92d4fa2..0f2b2a55f67169 100644 --- a/docs/notebooks/speechbrain-emotion-recognition-with-output.rst +++ b/docs/notebooks/speechbrain-emotion-recognition-with-output.rst @@ -63,9 +63,9 @@ Installations detectron2 0.6 requires iopath<0.1.10,>=0.1.7, but you have iopath 0.1.10 which is incompatible. mobileclip 0.1.0 requires torchvision==0.14.1, but you have torchvision 0.19.1+cpu which is incompatible. modelscope-studio 0.5.2 requires gradio<6.0,>=4.0, but you have gradio 3.43.1 which is incompatible. - parler-tts 0.2.1 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. - parler-tts 0.2.1 requires transformers<=4.46.1,>=4.46.1, but you have transformers 4.46.3 which is incompatible. - pydantic 2.10.0 requires typing-extensions>=4.12.2, but you have typing-extensions 4.9.0 which is incompatible. + parler-tts 0.2.2 requires protobuf>=4.0.0, but you have protobuf 3.20.3 which is incompatible. + parler-tts 0.2.2 requires transformers<=4.46.1,>=4.46.1, but you have transformers 4.46.3 which is incompatible. + pydantic 2.10.3 requires typing-extensions>=4.12.2, but you have typing-extensions 4.9.0 which is incompatible. tensorflow 2.12.0 requires keras<2.13,>=2.12.0, but you have keras 2.13.1 which is incompatible. tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.4 which is incompatible. tensorflow 2.12.0 requires tensorboard<2.13,>=2.12, but you have tensorboard 2.13.0 which is incompatible. @@ -95,7 +95,7 @@ Imports .. parsed-literal:: - INFO:speechbrain.utils.quirks:Applied quirks (see `speechbrain.utils.quirks`): [allow_tf32, disable_jit_profiling] + INFO:speechbrain.utils.quirks:Applied quirks (see `speechbrain.utils.quirks`): [disable_jit_profiling, allow_tf32] INFO:speechbrain.utils.quirks:Excluded quirks specified by the `SB_DISABLE_QUIRKS` environment (comma-separated list): [] @@ -135,8 +135,8 @@ SpeechBrain codebase. INFO:speechbrain.utils.fetching:Fetch hyperparams.yaml: Fetching from HuggingFace Hub 'speechbrain/emotion-recognition-wav2vec2-IEMOCAP' if not cached INFO:speechbrain.utils.fetching:Fetch custom_interface.py: Fetching from HuggingFace Hub 'speechbrain/emotion-recognition-wav2vec2-IEMOCAP' if not cached - 2024-11-22 05:15:27.494190: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 05:15:27.518517: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:40:05.072169: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:40:05.097896: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -148,7 +148,7 @@ SpeechBrain codebase. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/configuration_utils.py:306: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, pass `gradient_checkpointing=True` in your `TrainingArguments`. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/configuration_utils.py:306: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, pass `gradient_checkpointing=True` in your `TrainingArguments`. warnings.warn( @@ -175,7 +175,7 @@ SpeechBrain codebase. INFO:speechbrain.utils.fetching:Fetch model.ckpt: Fetching from HuggingFace Hub 'speechbrain/emotion-recognition-wav2vec2-IEMOCAP' if not cached INFO:speechbrain.utils.fetching:Fetch label_encoder.txt: Fetching from HuggingFace Hub 'speechbrain/emotion-recognition-wav2vec2-IEMOCAP' if not cached INFO:speechbrain.utils.parameter_transfer:Loading pretrained files for: wav2vec2, model, label_encoder - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/speechbrain/utils/checkpoints.py:200: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/speechbrain/utils/checkpoints.py:200: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. state_dict = torch.load(path, map_location=device) @@ -263,13 +263,19 @@ Step 2: Convert model to OpenVINO IR .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/wav2vec2/modeling_wav2vec2.py:872: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/wav2vec2/modeling_wav2vec2.py:872: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if attn_output.size() != (bsz, self.num_heads, tgt_len, self.head_dim): + +.. parsed-literal:: + + model.safetensors: 0%| | 0.00/380M [00:00 1 or self.sliding_window is not None: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: @@ -306,7 +306,7 @@ here, we always use fixed shapes in conversion by using an .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_stable_cascade.py:548: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_stable_cascade.py:548: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if skip is not None and (x.size(-1) != skip.size(-1) or x.size(-2) != skip.size(-2)): diff --git a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.jpg b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.jpg index c26f6d2e4e6256..a09f1e5356f98d 100644 --- a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.jpg +++ b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.jpg @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f1d0c9a1548ea1728d293d5e9864b85f3f438666fb647d5d98ce4a08bd9d494 -size 81141 +oid sha256:a7c11f26f9dc1eb3286c357bb147d12c812786f1796a8b62a5012075afe6de12 +size 83987 diff --git a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.png b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.png index 8d36ff65c9eca3..eece770ac13fce 100644 --- a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.png +++ b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_29_2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a807ec75efd8572779d2c5de64bec882d23a29b52449e0a2df13fb67b527beae -size 1575960 +oid sha256:a32e4037dd5a34d227f3ef5a892121797617a3becd465227678a6ef6d7f8a090 +size 1608106 diff --git a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.jpg b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.jpg new file mode 100644 index 00000000000000..57b41a7f8d9bbe --- /dev/null +++ b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb107211ea8c2d5b7f376c7896193df1b1b5c4b1ba4014e10734d5401848fada +size 92085 diff --git a/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.png b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.png new file mode 100644 index 00000000000000..e718da40df51ae --- /dev/null +++ b/docs/notebooks/stable-cascade-image-generation-with-output_files/stable-cascade-image-generation-with-output_8_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87b04c8ee319ce2d23bd4cf76666af100b2852bb0dd4ba558d978698f871f581 +size 1591012 diff --git a/docs/notebooks/stable-diffusion-ip-adapter-with-output.rst b/docs/notebooks/stable-diffusion-ip-adapter-with-output.rst index 7f23c866161568..d5cbb62354f4fc 100644 --- a/docs/notebooks/stable-diffusion-ip-adapter-with-output.rst +++ b/docs/notebooks/stable-diffusion-ip-adapter-with-output.rst @@ -193,8 +193,8 @@ Additionally, LCM requires using LCMScheduler for efficient generation. .. parsed-literal:: - 2024-11-22 05:28:32.243878: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. - 2024-11-22 05:28:32.268737: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. + 2024-12-10 05:53:08.894939: I tensorflow/core/util/port.cc:110] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`. + 2024-12-10 05:53:08.920444: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. @@ -206,7 +206,7 @@ Additionally, LCM requires using LCMScheduler for efficient generation. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/clip/feature_extraction_clip.py:28: FutureWarning: The class CLIPFeatureExtractor is deprecated and will be removed in version 5 of Transformers. Please use CLIPImageProcessor instead. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/clip/feature_extraction_clip.py:28: FutureWarning: The class CLIPFeatureExtractor is deprecated and will be removed in version 5 of Transformers. Please use CLIPImageProcessor instead. warnings.warn( @@ -288,10 +288,10 @@ extractor as input and returns image embeddings. .. parsed-literal:: [ WARNING ] Please fix your imports. Module %s has been moved to %s. The old module will be deleted in version %s. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_utils.py:5006: FutureWarning: `_is_quantized_training_enabled` is going to be deprecated in transformers 4.39.0. Please use `model.hf_quantizer.is_trainable` instead warnings.warn( `loss_type=None` was set in the config but it is unrecognised.Using the default loss: `ForCausalLMLoss`. - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/clip/modeling_clip.py:243: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/models/clip/modeling_clip.py:243: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if not interpolate_pos_encoding and (height != self.image_size or width != self.image_size): @@ -353,17 +353,17 @@ Model predicts the ``sample`` state for the next step. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_2d_condition.py:1111: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/unets/unet_2d_condition.py:1111: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if dim % default_overall_up_factor != 0: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/embeddings.py:1801: FutureWarning: You have passed a tensor as `image_embeds`.This is deprecated and will be removed in a future release. Please make sure to update your script to pass `image_embeds` as a list of tensors to suppress this warning. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/embeddings.py:1801: FutureWarning: You have passed a tensor as `image_embeds`.This is deprecated and will be removed in a future release. Please make sure to update your script to pass `image_embeds` as a list of tensors to suppress this warning. deprecate("image_embeds not a list", "1.0.0", deprecation_message, standard_warn=False) - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:136: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:136: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:145: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/downsampling.py:145: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:147: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:147: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! assert hidden_states.shape[1] == self.channels - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:162: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/models/upsampling.py:162: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if hidden_states.shape[0] >= 64: @@ -441,16 +441,16 @@ image in pipeline, we can discuss it in inference examples. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Trace had nondeterministic nodes. Did you forget call .eval() on your model? Nodes: - %2506 : Float(1, 4, 64, 64, strides=[16384, 4096, 64, 1], requires_grad=0, device=cpu) = aten::randn(%2500, %2501, %2502, %2503, %2504, %2505) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/torch_utils.py:81:0 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Trace had nondeterministic nodes. Did you forget call .eval() on your model? Nodes: + %2506 : Float(1, 4, 64, 64, strides=[16384, 4096, 64, 1], requires_grad=0, device=cpu) = aten::randn(%2500, %2501, %2502, %2503, %2504, %2505) # /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/diffusers/utils/torch_utils.py:81:0 This may cause errors in trace checking. To disable trace checking, pass check_trace=False to torch.jit.trace() _check_trace( - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/torch/jit/_trace.py:1303: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error: Tensor-likes are not close! - Mismatched elements: 10391 / 16384 (63.4%) - Greatest absolute difference: 0.000982522964477539 at index (0, 1, 0, 60) (up to 1e-05 allowed) - Greatest relative difference: 0.014704568038430557 at index (0, 3, 63, 59) (up to 1e-05 allowed) + Mismatched elements: 10463 / 16384 (63.9%) + Greatest absolute difference: 0.001137852668762207 at index (0, 2, 0, 6) (up to 1e-05 allowed) + Greatest relative difference: 0.006470232386295268 at index (0, 3, 63, 59) (up to 1e-05 allowed) _check_trace( @@ -496,9 +496,9 @@ hidden states. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:88: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:88: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if input_shape[-1] > 1 or self.sliding_window is not None: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/.venv/lib/python3.8/site-packages/transformers/modeling_attn_mask_utils.py:164: TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. We can't record the data flow of Python values, so this value will be treated as a constant in the future. This means that the trace might not generalize to other inputs! if past_key_values_length > 0: diff --git a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_22_1.png b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_22_1.png index c5cde5597bba55..475b4dd8ea40b4 100644 --- a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_22_1.png +++ b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_22_1.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:541f65736f11c59692c577b1d85c0f6b9ab6ab51e8a9fdf6abf15063d06e2036 -size 965452 +oid sha256:f41e9dd669351422cfb30a6a5458431b699453f0934b43e199a0d4684dd4da85 +size 975310 diff --git a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_25_0.png b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_25_0.png index 61d61f6001a527..ba0e885cf44c5a 100644 --- a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_25_0.png +++ b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_25_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6162787bd52816b379097b9ec5284c2b65dc1178be5be7936240895f9de5285b -size 956477 +oid sha256:c5f0746a06f6d81be16e808107174009b68510b2e826885fe3f78021079b2a12 +size 945107 diff --git a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_28_0.png b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_28_0.png index 937356ce2c1a55..baae1d818321e1 100644 --- a/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_28_0.png +++ b/docs/notebooks/stable-diffusion-ip-adapter-with-output_files/stable-diffusion-ip-adapter-with-output_28_0.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d9fe298508ac791d7d0901af522504878a7fd98675bad80cfd4b60cafd2a49c0 -size 592390 +oid sha256:76b9fd3519e90a6fa4b39a5749633ffc0031a5141f3698920b724205b304e9f3 +size 595645 diff --git a/docs/notebooks/stable-diffusion-torchdynamo-backend-with-output.rst b/docs/notebooks/stable-diffusion-torchdynamo-backend-with-output.rst index e03a4ab614c769..a50a47392fb029 100644 --- a/docs/notebooks/stable-diffusion-torchdynamo-backend-with-output.rst +++ b/docs/notebooks/stable-diffusion-torchdynamo-backend-with-output.rst @@ -114,15 +114,18 @@ script. It speeds up PyTorch code by JIT-compiling it into optimized kernels. By default, Torch code runs in eager-mode, but with the use of torch.compile it goes through the following steps: -1. Graph acquisition - the model is rewritten as blocks of subgraphs that are either: +1. Graph acquisition + - the model is rewritten as blocks of subgraphs that are either: - compiled by TorchDynamo and “flattened”, - - falling back to the eager-mode, due to unsupported Python constructs (like control-flow + - falling back to the + eager-mode, due to unsupported Python constructs (like control-flow code). 2. Graph lowering - all PyTorch operations are decomposed into their constituent kernels specific to the chosen backend. -3. Graph compilation - the kernels call their corresponding low-level +3. Graph + compilation - the kernels call their corresponding low-level device-specific operations. Select device for inference and enable or disable saving the optimized diff --git a/docs/notebooks/stable-diffusion-v3-torch-fx-with-output.rst b/docs/notebooks/stable-diffusion-v3-torch-fx-with-output.rst new file mode 100644 index 00000000000000..2eee517599af7c --- /dev/null +++ b/docs/notebooks/stable-diffusion-v3-torch-fx-with-output.rst @@ -0,0 +1,562 @@ +Image generation with Torch.FX Stable Diffusion v3 and OpenVINO +=============================================================== + +Stable Diffusion V3 is next generation of latent diffusion image Stable +Diffusion models family that outperforms state-of-the-art text-to-image +generation systems in typography and prompt adherence, based on human +preference evaluations. In comparison with previous versions, it based +on Multimodal Diffusion Transformer (MMDiT) text-to-image model that +features greatly improved performance in image quality, typography, +complex prompt understanding, and resource-efficiency. + +.. figure:: https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/dd079427-89f2-4d28-a10e-c80792d750bf + :alt: mmdit.png + + mmdit.png + +More details about model can be found in `model +card `__, +`research +paper `__ +and `Stability.AI blog +post `__. In this +tutorial, we will demonstrate the optimize stable diffusion 3 in a Torch +FX representation using NNCF +`NNCF `__ for model +optimization. Additionally, we will accelerate the pipeline further by +running with torch.compile using the openvino backend. If you want to +run previous Stable Diffusion versions, please check our other +notebooks: + +- `Stable Diffusion `__ +- `Stable Diffusion v2 `__ +- `Stable Diffusion v3 `__ +- `Stable Diffusion XL `__ +- `LCM Stable + Diffusion `__ +- `Turbo SDXL `__ +- `Turbo SD `__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + + +**Table of contents:** + + +- `Prerequisites <#prerequisites>`__ +- `Build PyTorch pipeline <#build-pytorch-pipeline>`__ + + - `Store the Configs <#store-the-configs>`__ + +- `Run FP Inference <#run-fp-inference>`__ +- `Convert models to Torch FX <#convert-models-to-torch-fx>`__ +- `Quantization <#quantization>`__ + + - `Collect Calibration Dataset <#collect-calibration-dataset>`__ + - `Compress and Quantize models <#compress-and-quantize-models>`__ + - `Create Optimized Pipeline <#create-optimized-pipeline>`__ + - `Check File Size <#check-file-size>`__ + - `Optimized pipeline inference <#optimized-pipeline-inference>`__ + - `Visualize Results <#visualize-results>`__ + +- `Interactive demo <#interactive-demo>`__ + +Prerequisites +------------- + + + +.. code:: ipython3 + + %pip install -q "gradio>=4.19" "torch>=2.5" "torchvision>=0.20" "numpy<2.0" "transformers" "datasets>=2.14.6" "opencv-python" "pillow" "peft>=0.7.0" "diffusers>=0.31.0" --extra-index-url https://download.pytorch.org/whl/cpu + %pip install -qU "openvino>=2024.3.0" + %pip install -q "nncf>=2.14.0" "typing_extensions>=4.11" + +.. code:: ipython3 + + from pathlib import Path + + import requests + + if not Path("sd3_torch_fx_helper.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/stable-diffusion-v3/sd3_torch_fx_helper.py") + open("sd3_torch_fx_helper.py", "w").write(r.text) + + if not Path("gradio_helper.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/stable-diffusion-v3/gradio_helper.py") + open("gradio_helper.py", "w").write(r.text) + + if not Path("notebook_utils.py").exists(): + r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py") + open("notebook_utils.py", "w").write(r.text) + +Build PyTorch pipeline +---------------------- + + + + **Note**: run model with notebook, you will need to accept license + agreement. You must be a registered user in Hugging Face Hub. + Please visit `HuggingFace model + card `__, + carefully read terms of usage and click accept button. You will need + to use an access token for the code below to run. For more + information on access tokens, refer to `this section of the + documentation `__. + You can login on Hugging Face Hub in notebook environment, using + following code: + +.. code:: ipython3 + + # uncomment these lines to login to huggingfacehub to get access to pretrained model + + # from huggingface_hub import notebook_login, whoami + + # try: + # whoami() + # print('Authorization token already provided') + # except OSError: + # notebook_login() + +.. code:: ipython3 + + from sd3_torch_fx_helper import get_sd3_pipeline, init_pipeline + + pipe = get_sd3_pipeline() + pipe.to("cpu") + +Store the Configs +~~~~~~~~~~~~~~~~~ + + + +This will be used later when wrapping the Torch FX models to insert back +into the pipeline + +.. code:: ipython3 + + configs_dict = {} + configs_dict["text_encoder"] = pipe.text_encoder.config + configs_dict["text_encoder_2"] = pipe.text_encoder_2.config + configs_dict["transformer"] = pipe.transformer.config + configs_dict["vae"] = pipe.vae.config + + pipe_config = pipe.config + +Run FP Inference +---------------- + + + +.. code:: ipython3 + + import numpy as np + import torch + + generator = torch.Generator(device="cpu").manual_seed(42) + prompt = "A raccoon trapped inside a glass jar full of colorful candies, the background is steamy with vivid colors" + num_inference_steps = 28 + with torch.no_grad(): + image = pipe( + prompt=prompt, + negative_prompt="", + num_inference_steps=num_inference_steps, + generator=generator, + guidance_scale=5, + ).images[0] + image.resize( + ( + 512, + 512, + ) + ) + +.. code:: ipython3 + + from notebook_utils import device_widget + + device = device_widget() + + device + +Convert models to Torch FX +-------------------------- + + + +This step converts the pytorch models in the hf pipeline to Torch FX +representation using the ``capture_pre_autograd()`` function. + +The pipeline consists of four important parts: + +- Clip and T5 Text Encoders to create condition to generate an image + from a text prompt. +- Transformer for step-by-step denoising latent image representation. +- Autoencoder (VAE) for decoding latent space to image. + +.. code:: ipython3 + + import torch + from nncf.torch.dynamic_graph.patch_pytorch import disable_patching + + text_encoder_input = torch.ones((1, 77), dtype=torch.long) + text_encoder_kwargs = {} + text_encoder_kwargs["output_hidden_states"] = True + + vae_encoder_input = torch.ones((1, 3, 128, 128)) + vae_decoder_input = torch.ones((1, 16, 128, 128)) + + unet_kwargs = {} + unet_kwargs["hidden_states"] = torch.ones((2, 16, 128, 128)) + unet_kwargs["timestep"] = torch.from_numpy(np.array([1, 2], dtype=np.float32)) + unet_kwargs["encoder_hidden_states"] = torch.ones((2, 154, 4096)) + unet_kwargs["pooled_projections"] = torch.ones((2, 2048)) + + with torch.no_grad(): + with disable_patching(): + text_encoder = torch.export.export_for_training( + pipe.text_encoder.eval(), + args=(text_encoder_input,), + kwargs=(text_encoder_kwargs), + ).module() + text_encoder_2 = torch.export.export_for_training( + pipe.text_encoder_2.eval(), + args=(text_encoder_input,), + kwargs=(text_encoder_kwargs), + ).module() + pipe.vae.decoder = torch.export.export_for_training(pipe.vae.decoder.eval(), args=(vae_decoder_input,)).module() + pipe.vae.encoder = torch.export.export_for_training(pipe.vae.encoder.eval(), args=(vae_encoder_input,)).module() + vae = pipe.vae + transformer = torch.export.export_for_training(pipe.transformer.eval(), args=(), kwargs=(unet_kwargs)).module() + models_dict = {} + models_dict["transformer"] = transformer + models_dict["vae"] = vae + models_dict["text_encoder"] = text_encoder + models_dict["text_encoder_2"] = text_encoder_2 + del unet_kwargs + del vae_encoder_input + del vae_decoder_input + del text_encoder_input + del text_encoder_kwargs + del pipe + +Quantization +------------ + + + +`NNCF `__ enables +post-training quantization by adding quantization layers into model +graph and then using a subset of the training dataset to initialize the +parameters of these additional quantization layers. Quantized operations +are executed in ``INT8`` instead of ``FP32``/``FP16`` making model +inference faster. + +According to ``StableDiffusion3Pipeline`` structure, the ``transformer`` +model takes up significant portion of the overall pipeline execution +time. Now we will show you how to optimize the transformer part using +`NNCF `__ to reduce +computation cost and speed up the pipeline. Quantizing the rest of the +pipeline does not significantly improve inference performance but can +lead to a substantial degradation of accuracy. That’s why we use 8-bit +weight compression for the rest of the pipeline to reduce memory +footprint. + +Please select below whether you would like to run quantization to +improve model inference speed. + + **NOTE**: Quantization is time and memory consuming operation. + Running quantization code below may take some time. + +.. code:: ipython3 + + from notebook_utils import quantization_widget + + to_quantize = quantization_widget() + + to_quantize + +Let’s load ``skip magic`` extension to skip quantization if +``to_quantize`` is not selected + +.. code:: ipython3 + + # Fetch `skip_kernel_extension` module + import requests + + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/skip_kernel_extension.py", + ) + open("skip_kernel_extension.py", "w").write(r.text) + + %load_ext skip_kernel_extension + +Collect Calibration Dataset +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + %%skip not $to_quantize.value + + from typing import Any, Dict, List + + import datasets + from diffusers.models.transformers.transformer_sd3 import SD3Transformer2DModel + from tqdm.notebook import tqdm + + + def disable_progress_bar(pipeline, disable=True): + if not hasattr(pipeline, "_progress_bar_config"): + pipeline._progress_bar_config = {"disable": disable} + else: + pipeline._progress_bar_config["disable"] = disable + + + class UNetWrapper(SD3Transformer2DModel): + def __init__(self, transformer, config): + super().__init__(**config) + self.transformer = transformer + self.captured_args = [] + + def forward(self, *args, **kwargs): + del kwargs["joint_attention_kwargs"] + del kwargs["return_dict"] + self.captured_args.append((*args, *tuple(kwargs.values()))) + return self.transformer(*args, **kwargs) + + + def collect_calibration_data( + pipe, calibration_dataset_size: int, num_inference_steps: int + ) -> List[Dict]: + + original_unet = pipe.transformer + calibration_data = [] + disable_progress_bar(pipe) + + dataset = datasets.load_dataset( + "google-research-datasets/conceptual_captions", + split="train", + trust_remote_code=True, + ).shuffle(seed=42) + + transformer_config = dict(pipe.transformer.config) + del transformer_config["model"] + wrapped_unet = UNetWrapper(pipe.transformer.model, transformer_config) + pipe.transformer = wrapped_unet + # Run inference for data collection + pbar = tqdm(total=calibration_dataset_size) + for i, batch in enumerate(dataset): + prompt = batch["caption"] + if len(prompt) > pipe.tokenizer.model_max_length: + continue + # Run the pipeline + pipe(prompt, num_inference_steps=num_inference_steps) + calibration_data.extend(wrapped_unet.captured_args) + wrapped_unet.captured_args = [] + pbar.update(len(calibration_data) - pbar.n) + if pbar.n >= calibration_dataset_size: + break + + disable_progress_bar(pipe, disable=False) + pipe.transformer = original_unet + return calibration_data + + + if to_quantize: + pipe = init_pipeline(models_dict, configs_dict) + calibration_dataset_size = 300 + unet_calibration_data = collect_calibration_data( + pipe, calibration_dataset_size=calibration_dataset_size, num_inference_steps=28 + ) + del pipe + +Compress and Quantize models +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + %%skip not $to_quantize.value + + import nncf + from nncf.quantization.advanced_parameters import AdvancedSmoothQuantParameters + from nncf.quantization.range_estimator import RangeEstimatorParametersSet + + text_encoder = models_dict["text_encoder"] + text_encoder_2 = models_dict["text_encoder_2"] + vae_encoder = models_dict["vae"].encoder + vae_decoder = models_dict["vae"].decoder + original_transformer = models_dict["transformer"] + if to_quantize: + with disable_patching(): + with torch.no_grad(): + nncf.compress_weights(text_encoder) + nncf.compress_weights(text_encoder_2) + nncf.compress_weights(vae_encoder) + nncf.compress_weights(vae_decoder) + quantized_transformer = nncf.quantize( + model=original_transformer, + calibration_dataset=nncf.Dataset(unet_calibration_data), + subset_size=len(unet_calibration_data), + model_type=nncf.ModelType.TRANSFORMER, + ignored_scope=nncf.IgnoredScope(names=["conv2d"]), + advanced_parameters=nncf.AdvancedQuantizationParameters( + weights_range_estimator_params=RangeEstimatorParametersSet.MINMAX, + activations_range_estimator_params=RangeEstimatorParametersSet.MINMAX, + ), + ) + + optimized_models_dict = {} + optimized_models_dict["transformer"] = quantized_transformer + optimized_models_dict["vae"] = vae + optimized_models_dict["text_encoder"] = text_encoder + optimized_models_dict["text_encoder_2"] = text_encoder_2 + del models_dict + +.. code:: ipython3 + + %%skip not $to_quantize.value + import openvino.torch + + optimized_models_dict["text_encoder"] = torch.compile( + optimized_models_dict["text_encoder"], backend="openvino" + ) + optimized_models_dict["text_encoder_2"] = torch.compile( + optimized_models_dict["text_encoder_2"], backend="openvino" + ) + optimized_models_dict["vae"].encoder = torch.compile( + optimized_models_dict["vae"].encoder, backend="openvino" + ) + optimized_models_dict["vae"].decoder = torch.compile( + optimized_models_dict["vae"].decoder, backend="openvino" + ) + optimized_models_dict["transformer"] = torch.compile( + optimized_models_dict["transformer"], backend="openvino" + ) + +Create Optimized Pipeline +~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Initialize the optimized pipeline using the optimized models + +.. code:: ipython3 + + %%skip not $to_quantize.value + + opt_pipe = init_pipeline(optimized_models_dict, configs_dict) + +Check File Size +~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + %%skip not $to_quantize.value + + + def get_model_size(models): + total_size = 0 + for model in models: + param_size = 0 + for param in model.parameters(): + param_size += param.nelement() * param.element_size() + buffer_size = 0 + for buffer in model.buffers(): + buffer_size += buffer.nelement() * buffer.element_size() + + model_size_mb = (param_size + buffer_size) / 1024**2 + + total_size += model_size_mb + return total_size + + + optimized_model_size = get_model_size([opt_pipe.transformer]) + original_model_size = get_model_size([original_transformer]) + + print(f"Original Transformer Size: {original_model_size} MB") + print(f"Optimized Transformer Size: {optimized_model_size} MB") + print(f"Compression Rate: {original_model_size / optimized_model_size:.3f}") + +Optimized pipeline inference +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Run inference with single step to compile the model. + +.. code:: ipython3 + + %%skip not $to_quantize.value + + # Warmup the model for initial compile + with torch.no_grad(): + image = opt_pipe( + prompt=prompt, negative_prompt="", num_inference_steps=1, generator=generator + ).images[0] + +Visualize Results +~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + %%skip not $to_quantize.value + + from sd3_torch_fx_helper import visualize_results + + generator = torch.Generator(device="cpu").manual_seed(42) + opt_image = opt_pipe( + prompt, + negative_prompt="", + num_inference_steps=28, + guidance_scale=5, + generator=generator, + ).images[0] + + visualize_results(image, opt_image) + +Interactive demo +---------------- + + + +Please select below whether you would like to use the quantized models +to launch the interactive demo. + +.. code:: ipython3 + + use_quantized_models = quantization_widget() + + use_quantized_models + +.. code:: ipython3 + + from gradio_helper import make_demo + + fx_pipe = init_pipeline(models_dict if not to_quantize.value else optimized_models_dict, configs_dict) + demo = make_demo(fx_pipe, False) + + # if you are launching remotely, specify server_name and server_port + # demo.launch(server_name='your server name', server_port='server port in int') + # if you have any issue to launch on your platform, you can pass share=True to launch method: + # demo.launch(share=True) + # it creates a publicly shareable link for the interface. Read more in the docs: https://gradio.app/docs/ + try: + demo.launch(debug=True) + except Exception: + demo.launch(debug=True, share=True) diff --git a/docs/notebooks/stable-diffusion-xl-with-output.rst b/docs/notebooks/stable-diffusion-xl-with-output.rst index 54a43191c229a4..7ec1c0c81eeb20 100644 --- a/docs/notebooks/stable-diffusion-xl-with-output.rst +++ b/docs/notebooks/stable-diffusion-xl-with-output.rst @@ -100,9 +100,9 @@ Install prerequisites .. code:: ipython3 - # %pip install -q --extra-index-url https://download.pytorch.org/whl/cpu "torch>=2.1" "torchvision" "diffusers>=0.24.0" "invisible-watermark>=0.2.0" "transformers>=4.33.0" "accelerate" "onnx!=1.16.2" "peft>=0.6.2" - # %pip install -q "git+https://github.com/huggingface/optimum-intel.git" - # %pip install -q "openvino>=2023.1.0" "gradio>=4.19" "nncf>=2.9.0" + %pip install -q --extra-index-url https://download.pytorch.org/whl/cpu "torch>=2.1" "torchvision" "diffusers>=0.24.0" "invisible-watermark>=0.2.0" "transformers>=4.33.0" "accelerate" "onnx!=1.16.2" "peft>=0.6.2" + %pip install -q "git+https://github.com/huggingface/optimum-intel.git" + %pip install -q "openvino>=2023.1.0" "gradio>=4.19" "nncf>=2.9.0" SDXL Base model --------------- diff --git a/docs/notebooks/style-transfer-with-output.rst b/docs/notebooks/style-transfer-with-output.rst index b123ca215cbbfc..c228604aee32f9 100644 --- a/docs/notebooks/style-transfer-with-output.rst +++ b/docs/notebooks/style-transfer-with-output.rst @@ -96,7 +96,7 @@ Install requirements .. parsed-literal:: - 24717 + 24624 @@ -186,14 +186,14 @@ OpenVINO Intermediate Representation (IR) with ``FP16`` precision. .. parsed-literal:: - model/mosaic-9.onnx: 0%| | 0.00/6.42M [00:00`__. It uses +`BiT-M-R50x1/1 `__ +model, which is trained on ImageNet-21k. Big Transfer is a recipe for +pre-training image classification models on large supervised datasets +and efficiently fine-tuning them on any given target task. The recipe +achieves excellent performance on a wide variety of tasks, even when +using very few labeled examples from the target dataset. This tutorial +uses OpenVINO backend for performing model quantization in NNCF. + + +**Table of contents:** + + +- `Prepare Dataset <#prepare-dataset>`__ +- `Plotting data samples <#plotting-data-samples>`__ +- `Model Fine-tuning <#model-fine-tuning>`__ +- `Perform model optimization (IR) + step <#perform-model-optimization-ir-step>`__ +- `Compute accuracy of the TF + model <#compute-accuracy-of-the-tf-model>`__ +- `Compute accuracy of the OpenVINO + model <#compute-accuracy-of-the-openvino-model>`__ +- `Quantize OpenVINO model using + NNCF <#quantize-openvino-model-using-nncf>`__ +- `Compute accuracy of the quantized + model <#compute-accuracy-of-the-quantized-model>`__ +- `Compare FP32 and INT8 accuracy <#compare-fp32-and-int8-accuracy>`__ +- `Compare inference results on one + picture <#compare-inference-results-on-one-picture>`__ + +Installation Instructions +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This is a self-contained example that relies solely on its own code. + +We recommend running the notebook in a virtual environment. You only +need a Jupyter server to start. For details, please refer to +`Installation +Guide `__. + +.. code:: ipython3 + + import platform + + %pip install -q "tensorflow-macos>=2.5; sys_platform == 'darwin' and platform_machine == 'arm64' and python_version > '3.8'" # macOS M1 and M2 + %pip install -q "tensorflow>=2.5; sys_platform == 'darwin' and platform_machine != 'arm64' and python_version > '3.8'" # macOS x86 + %pip install -q "tensorflow>=2.5; sys_platform != 'darwin' and python_version > '3.8'" + + %pip install -q "openvino>=2024.0.0" "nncf>=2.7.0" "tensorflow-hub>=0.15.0" tf_keras + %pip install -q "scikit-learn>=1.3.2" + + if platform.system() != "Windows": + %pip install -q "matplotlib>=3.4" "tensorflow_datasets>=4.9.0" + else: + %pip install -q "matplotlib>=3.4" "tensorflow_datasets>=4.9.0,<4.9.3" + +.. code:: ipython3 + + import os + import numpy as np + from pathlib import Path + + from openvino.runtime import Core + import openvino as ov + import nncf + import logging + + from nncf.common.logging.logger import set_log_level + + set_log_level(logging.ERROR) + + from sklearn.metrics import accuracy_score + + os.environ["TF_USE_LEGACY_KERAS"] = "1" + os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2" + os.environ["TFHUB_CACHE_DIR"] = str(Path("./tfhub_modules").resolve()) + + import tensorflow as tf + import tensorflow_datasets as tfds + import tensorflow_hub as hub + + tfds.core.utils.gcs_utils._is_gcs_disabled = True + os.environ["NO_GCE_CHECK"] = "true" + + import requests + + r = requests.get( + url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", + ) + open("notebook_utils.py", "w").write(r.text) + +.. code:: ipython3 + + core = Core() + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) + + + # For top 5 labels. + MAX_PREDS = 1 + TRAINING_BATCH_SIZE = 128 + BATCH_SIZE = 1 + IMG_SIZE = (256, 256) # Default Imagenet image size + NUM_CLASSES = 10 # For Imagenette dataset + FINE_TUNING_STEPS = 1 + LR = 1e-5 + + MEAN_RGB = (0.485 * 255, 0.456 * 255, 0.406 * 255) # From Imagenet dataset + STDDEV_RGB = (0.229 * 255, 0.224 * 255, 0.225 * 255) # From Imagenet dataset + +Prepare Dataset +~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + datasets, datasets_info = tfds.load( + "imagenette/160px", + shuffle_files=True, + as_supervised=True, + with_info=True, + read_config=tfds.ReadConfig(shuffle_seed=0), + ) + train_ds, validation_ds = datasets["train"], datasets["validation"] + +.. code:: ipython3 + + def preprocessing(image, label): + image = tf.image.resize(image, IMG_SIZE) + image = tf.cast(image, tf.float32) / 255.0 + label = tf.one_hot(label, NUM_CLASSES) + return image, label + + + train_dataset = train_ds.map(preprocessing, num_parallel_calls=tf.data.experimental.AUTOTUNE).batch(TRAINING_BATCH_SIZE).prefetch(tf.data.experimental.AUTOTUNE) + validation_dataset = ( + validation_ds.map(preprocessing, num_parallel_calls=tf.data.experimental.AUTOTUNE).batch(TRAINING_BATCH_SIZE).prefetch(tf.data.experimental.AUTOTUNE) + ) + +.. code:: ipython3 + + # Class labels dictionary with imagenette sample names and classes + lbl_dict = dict( + n01440764="tench", + n02102040="English springer", + n02979186="cassette player", + n03000684="chain saw", + n03028079="church", + n03394916="French horn", + n03417042="garbage truck", + n03425413="gas pump", + n03445777="golf ball", + n03888257="parachute", + ) + + # Imagenette samples name index + class_idx_dict = [ + "n01440764", + "n02102040", + "n02979186", + "n03000684", + "n03028079", + "n03394916", + "n03417042", + "n03425413", + "n03445777", + "n03888257", + ] + + + def label_func(key): + return lbl_dict[key] + +Plotting data samples +~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + import matplotlib.pyplot as plt + + # Get the class labels from the dataset info + class_labels = datasets_info.features["label"].names + + # Display labels along with the examples + num_examples_to_display = 4 + fig, axes = plt.subplots(nrows=1, ncols=num_examples_to_display, figsize=(10, 5)) + + for i, (image, label_index) in enumerate(train_ds.take(num_examples_to_display)): + label_name = class_labels[label_index.numpy()] + + axes[i].imshow(image.numpy()) + axes[i].set_title(f"{label_func(label_name)}") + axes[i].axis("off") + plt.tight_layout() + plt.show() + + +.. parsed-literal:: + + 2024-01-26 10:40:54.747316: W tensorflow/core/kernels/data/cache_dataset_ops.cc:854] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. + + + +.. image:: tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_9_1.png + + +.. code:: ipython3 + + # Get the class labels from the dataset info + class_labels = datasets_info.features["label"].names + + # Display labels along with the examples + num_examples_to_display = 4 + fig, axes = plt.subplots(nrows=1, ncols=num_examples_to_display, figsize=(10, 5)) + + for i, (image, label_index) in enumerate(validation_ds.take(num_examples_to_display)): + label_name = class_labels[label_index.numpy()] + + axes[i].imshow(image.numpy()) + axes[i].set_title(f"{label_func(label_name)}") + axes[i].axis("off") + plt.tight_layout() + plt.show() + + +.. parsed-literal:: + + 2024-01-26 10:40:57.011386: W tensorflow/core/kernels/data/cache_dataset_ops.cc:854] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead. + + + +.. image:: tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_10_1.png + + +Model Fine-tuning +~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + # Load the Big Transfer model + bit_model_url = "https://www.kaggle.com/models/google/bit/frameworks/TensorFlow2/variations/m-r50x1/versions/1" + bit_m = hub.KerasLayer(bit_model_url, trainable=True) + + tf_model_dir = Path("bit_tf_model") + + # Customize the model for the new task + model = tf.keras.Sequential([bit_m, tf.keras.layers.Dense(NUM_CLASSES, activation="softmax")]) + + # Compile the model + model.compile( + optimizer=tf.keras.optimizers.Adam(learning_rate=LR), + loss="categorical_crossentropy", + metrics=["accuracy"], + ) + + # Fine-tune the model + model.fit( + train_dataset.take(3000), + epochs=FINE_TUNING_STEPS, + validation_data=validation_dataset.take(1000), + ) + model.save(tf_model_dir, save_format="tf") + + +.. parsed-literal:: + + 101/101 [==============================] - 472s 4s/step - loss: 0.4904 - accuracy: 0.8806 - val_loss: 0.0810 - val_accuracy: 0.9840 + + +Perform model optimization (IR) step +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + ir_path = Path("bit_ov_model/bit_m_r50x1_1.xml") + if not ir_path.exists(): + print("Initiating model optimization..!!!") + ov_model = ov.convert_model("./bit_tf_model") + ov.save_model(ov_model, ir_path) + else: + print(f"IR model {ir_path} already exists.") + + +.. parsed-literal:: + + Initiating model optimization..!!! + + +Compute accuracy of the TF model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + tf_model = tf.keras.models.load_model(tf_model_dir) + + tf_predictions = [] + gt_label = [] + + for _, label in validation_dataset: + for cls_label in label: + l_list = cls_label.numpy().tolist() + gt_label.append(l_list.index(1)) + + for img_batch, label_batch in validation_dataset: + tf_result_batch = tf_model.predict(img_batch, verbose=0) + for i in range(len(img_batch)): + tf_result = tf_result_batch[i] + tf_result = tf.reshape(tf_result, [-1]) + top5_label_idx = np.argsort(tf_result)[-MAX_PREDS::][::-1] + tf_predictions.append(top5_label_idx) + + # Convert the lists to NumPy arrays for accuracy calculation + tf_predictions = np.array(tf_predictions) + gt_label = np.array(gt_label) + + tf_acc_score = accuracy_score(tf_predictions, gt_label) + + +.. parsed-literal:: + + 2024-01-26 10:51:24.539777: W tensorflow/core/common_runtime/graph_constructor.cc:839] Node 're_lu_48/PartitionedCall' has 1 outputs but the _output_shapes attribute specifies shapes for 2 outputs. Output shapes may be inaccurate. + 2024-01-26 10:51:24.539856: W tensorflow/core/common_runtime/graph_constructor.cc:839] Node 'global_average_pooling2d/PartitionedCall' has 1 outputs but the _output_shapes attribute specifies shapes for 3 outputs. Output shapes may be inaccurate. + + +Compute accuracy of the OpenVINO model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Select device for inference: + +.. code:: ipython3 + + from notebook_utils import device_widget + + device = device_widget() + + device + +.. code:: ipython3 + + core = ov.Core() + + ov_fp32_model = core.read_model(ir_path) + ov_fp32_model.reshape([1, IMG_SIZE[0], IMG_SIZE[1], 3]) + + # Target device set to CPU (Other options Ex: AUTO/GPU/dGPU/) + compiled_model = ov.compile_model(ov_fp32_model, device.value) + output = compiled_model.outputs[0] + + ov_predictions = [] + for img_batch, _ in validation_dataset: + for image in img_batch: + image = tf.expand_dims(image, axis=0) + pred = compiled_model(image)[output] + ov_result = tf.reshape(pred, [-1]) + top_label_idx = np.argsort(ov_result)[-MAX_PREDS::][::-1] + ov_predictions.append(top_label_idx) + + fp32_acc_score = accuracy_score(ov_predictions, gt_label) + +Quantize OpenVINO model using NNCF +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +Model Quantization using NNCF + +1. Preprocessing and preparing validation samples for NNCF calibration +2. Perform NNCF Quantization on OpenVINO FP32 model +3. Serialize Quantized OpenVINO INT8 model + +.. code:: ipython3 + + def nncf_preprocessing(image, label): + image = tf.image.resize(image, IMG_SIZE) + image = image - MEAN_RGB + image = image / STDDEV_RGB + return image + + + int8_ir_path = Path("bit_ov_int8_model/bit_m_r50x1_1_ov_int8.xml") + val_ds = validation_ds.map(nncf_preprocessing, num_parallel_calls=tf.data.experimental.AUTOTUNE).batch(1).prefetch(tf.data.experimental.AUTOTUNE) + + calibration_dataset = nncf.Dataset(val_ds) + + ov_fp32_model = core.read_model(ir_path) + + ov_int8_model = nncf.quantize(ov_fp32_model, calibration_dataset, fast_bias_correction=False) + + ov.save_model(ov_int8_model, int8_ir_path) + + + +.. parsed-literal:: + + Output() + + + + + + + + + + + + + + + + + + +.. parsed-literal:: + + Output() + + + + + + + + + + + + + + + + + +Compute accuracy of the quantized model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + nncf_quantized_model = core.read_model(int8_ir_path) + nncf_quantized_model.reshape([1, IMG_SIZE[0], IMG_SIZE[1], 3]) + + # Target device set to CPU by default + compiled_model = ov.compile_model(nncf_quantized_model, device.value) + output = compiled_model.outputs[0] + + ov_predictions = [] + inp_tensor = nncf_quantized_model.inputs[0] + out_tensor = nncf_quantized_model.outputs[0] + + for img_batch, _ in validation_dataset: + for image in img_batch: + image = tf.expand_dims(image, axis=0) + pred = compiled_model(image)[output] + ov_result = tf.reshape(pred, [-1]) + top_label_idx = np.argsort(ov_result)[-MAX_PREDS::][::-1] + ov_predictions.append(top_label_idx) + + int8_acc_score = accuracy_score(ov_predictions, gt_label) + +Compare FP32 and INT8 accuracy +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + print(f"Accuracy of the tensorflow model (fp32): {tf_acc_score * 100: .2f}%") + print(f"Accuracy of the OpenVINO optimized model (fp32): {fp32_acc_score * 100: .2f}%") + print(f"Accuracy of the OpenVINO quantized model (int8): {int8_acc_score * 100: .2f}%") + accuracy_drop = fp32_acc_score - int8_acc_score + print(f"Accuracy drop between OV FP32 and INT8 model: {accuracy_drop * 100:.1f}% ") + + +.. parsed-literal:: + + Accuracy of the tensorflow model (fp32): 98.40% + Accuracy of the OpenVINO optimized model (fp32): 98.40% + Accuracy of the OpenVINO quantized model (int8): 98.00% + Accuracy drop between OV FP32 and INT8 model: 0.4% + + +Compare inference results on one picture +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +.. code:: ipython3 + + # Accessing validation sample + sample_idx = 50 + vds = datasets["validation"] + + if len(vds) > sample_idx: + sample = vds.take(sample_idx + 1).skip(sample_idx).as_numpy_iterator().next() + else: + print("Dataset does not have enough samples...!!!") + + # Image data + sample_data = sample[0] + + # Label info + sample_label = sample[1] + + # Image data pre-processing + image = tf.image.resize(sample_data, IMG_SIZE) + image = tf.expand_dims(image, axis=0) + image = tf.cast(image, tf.float32) / 255.0 + + + # OpenVINO inference + def ov_inference(model: ov.Model, image) -> str: + compiled_model = ov.compile_model(model, device.value) + output = compiled_model.outputs[0] + pred = compiled_model(image)[output] + ov_result = tf.reshape(pred, [-1]) + pred_label = np.argsort(ov_result)[-MAX_PREDS::][::-1] + return pred_label + + + # OpenVINO FP32 model + ov_fp32_model = core.read_model(ir_path) + ov_fp32_model.reshape([1, IMG_SIZE[0], IMG_SIZE[1], 3]) + + # OpenVINO INT8 model + ov_int8_model = core.read_model(int8_ir_path) + ov_int8_model.reshape([1, IMG_SIZE[0], IMG_SIZE[1], 3]) + + # OpenVINO FP32 model inference + ov_fp32_pred_label = ov_inference(ov_fp32_model, image) + + print(f"Predicted label for the sample picture by float (fp32) model: {label_func(class_idx_dict[int(ov_fp32_pred_label)])}\n") + + # OpenVINO FP32 model inference + ov_int8_pred_label = ov_inference(ov_int8_model, image) + print(f"Predicted label for the sample picture by qunatized (int8) model: {label_func(class_idx_dict[int(ov_int8_pred_label)])}\n") + + # Plotting the image sample with ground truth + plt.figure() + plt.imshow(sample_data) + plt.title(f"Ground truth: {label_func(class_idx_dict[sample_label])}") + plt.axis("off") + plt.show() + + +.. parsed-literal:: + + Predicted label for the sample picture by float (fp32) model: gas pump + + Predicted label for the sample picture by qunatized (int8) model: gas pump + + + + +.. image:: tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_27_1.png + diff --git a/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_10_1.png b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_10_1.png new file mode 100644 index 00000000000000..71aa7443a92cd8 --- /dev/null +++ b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_10_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7b53b19fd375df2b53791482fa4f76ec9d376be865f1298f4ea5aa0acdb1f35 +size 224517 diff --git a/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_27_1.png b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_27_1.png new file mode 100644 index 00000000000000..38f050c05e472a --- /dev/null +++ b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_27_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:048e8ff7b7ac7fa5f9cb66251d618f1ae941f26255f62c725d6223abd63e6fb7 +size 335047 diff --git a/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_9_1.png b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_9_1.png new file mode 100644 index 00000000000000..a8d02fcbd58c16 --- /dev/null +++ b/docs/notebooks/tensorflow-bit-image-classification-nncf-quantization-with-output_files/tensorflow-bit-image-classification-nncf-quantization-with-output_9_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bf1b651f79891da47103dcc27259f890451c392325a712ff4c1b1cace7cb4be +size 296205 diff --git a/docs/notebooks/tensorflow-classification-to-openvino-with-output.rst b/docs/notebooks/tensorflow-classification-to-openvino-with-output.rst index 2e4f5ffe25369c..9ab3ae90d2fd3e 100644 --- a/docs/notebooks/tensorflow-classification-to-openvino-with-output.rst +++ b/docs/notebooks/tensorflow-classification-to-openvino-with-output.rst @@ -249,7 +249,7 @@ network. .. parsed-literal:: - data/coco.jpg: 0%| | 0.00/202k [00:00 + @@ -649,7 +649,7 @@ Zoo `__: .. parsed-literal:: - data/coco_91cl.txt: 0%| | 0.00/421 [00:00 + @@ -683,16 +678,10 @@ Zoo `__: -.. parsed-literal:: - - data/coco_91cl.txt: 0%| | 0.00/421 [00:00`__. -2. Run inference using the `Text to Image -pipeline `__ +2. Run inference using the `Text-to-Image Generation +pipeline `__ from OpenVINO GenAI. + **Table of contents:** + - `Prerequisites <#prerequisites>`__ - `Convert model using Optimum-CLI tool <#convert-model-using-optimum-cli-tool>`__ @@ -57,19 +59,19 @@ Prerequisites import platform import requests - - + + %pip install -q "git+https://github.com/huggingface/optimum-intel.git" %pip install -q -U "openvino>=2024.5" "openvino-tokenizers>=2024.5" "openvino-genai>=2024.5" %pip install -q Pillow "diffusers>=0.30.3" "gradio>=4.19" "typing_extensions>=4.9" if platform.system() == "Darwin": %pip install -q "numpy<2.0.0" - + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", ) open("notebook_utils.py", "w").write(r.text) - + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/cmd_helper.py", ) @@ -81,7 +83,7 @@ Convert model using Optimum-CLI tool `Optimum Intel `__ -is the interface between the +is the interface between the `Transformers `__ and `Diffusers `__ libraries and OpenVINO to accelerate end-to-end pipelines on Intel architectures. @@ -116,12 +118,12 @@ wrapper over cli-command. .. code:: ipython3 from pathlib import Path - + from cmd_helper import optimum_cli - - + + model_dir = Path("dreamlike_anime_1_0_ov") - + if not model_dir.exists(): optimum_cli("dreamlike-art/dreamlike-anime-1.0", model_dir) @@ -135,8 +137,8 @@ select device from dropdown list for running inference using OpenVINO .. code:: ipython3 from notebook_utils import device_widget - - + + device = device_widget("CPU", exclude=["NPU"]) device @@ -161,27 +163,27 @@ That’s it:) import openvino as ov from PIL import Image import torch - - + + class Generator(ov_genai.Generator): def __init__(self, seed): ov_genai.Generator.__init__(self) self.generator = torch.Generator(device="cpu").manual_seed(seed) - + def next(self): return torch.randn(1, generator=self.generator, dtype=torch.float32).item() - + def randn_tensor(self, shape: ov.Shape): torch_tensor = torch.randn(list(shape), generator=self.generator, dtype=torch.float32) return ov.Tensor(torch_tensor.numpy()) - - + + random_generator = Generator(42) # openvino_genai.CppStdGenerator can be used to have same images as C++ sample pipe = ov_genai.Text2ImagePipeline(model_dir, device.value) prompt = "anime, masterpiece, high quality, a green snowman with a happy smiling face in the snows" - + image_tensor = pipe.generate(prompt, width=512, height=512, num_inference_steps=20, num_images_per_prompt=1, generator=random_generator) - + image = Image.fromarray(image_tensor.data[0]) .. code:: ipython3 @@ -228,20 +230,20 @@ from command line: def prepare_adapter_config(adapters): adapter_config = ov_genai.AdapterConfig() - + # Multiple LoRA adapters applied simultaneously are supported, parse them all and corresponding alphas from cmd parameters: for i in range(int(len(adapters) / 2)): adapter = ov_genai.Adapter(adapters[2 * i]) alpha = float(adapters[2 * i + 1]) adapter_config.add(adapter, alpha) - + return adapter_config - - + + adapter_config = prepare_adapter_config(["soulcard.safetensors", 0.5]) - + pipe = ov_genai.Text2ImagePipeline(model_dir, device.value, adapters=adapter_config) - + image_tensor = pipe.generate(prompt, generator=Generator(42), width=512, height=512, num_inference_steps=20) image = Image.fromarray(image_tensor.data[0]) @@ -268,10 +270,10 @@ Interactive demo .. code:: ipython3 from gradio_helper import make_demo - - + + demo = make_demo(pipe, Generator, adapter_config) - + try: demo.launch(debug=True) except Exception: diff --git a/docs/notebooks/tflite-selfie-segmentation-with-output.rst b/docs/notebooks/tflite-selfie-segmentation-with-output.rst index 7f613016c47019..8691da62b77526 100644 --- a/docs/notebooks/tflite-selfie-segmentation-with-output.rst +++ b/docs/notebooks/tflite-selfie-segmentation-with-output.rst @@ -117,8 +117,7 @@ Download pretrained model and test image tflite_model_path = Path("selfie_multiclass_256x256.tflite") tflite_model_url = "https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_multiclass_256x256/float32/latest/selfie_multiclass_256x256.tflite" - if not tflite_model_path.exists(): - download_file(tflite_model_url, tflite_model_path) + download_file(tflite_model_url, tflite_model_path) @@ -127,6 +126,14 @@ Download pretrained model and test image selfie_multiclass_256x256.tflite: 0%| | 0.00/15.6M [00:00`__. .. code:: ipython3 - image = load_image("https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bricks.png") + image = load_image("coco_bricks.png", "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bricks.png") # load_image reads the image in BGR format, [:,:,::-1] reshape transfroms it to RGB image = Image.fromarray(image[:, :, ::-1]) resized_image = image.resize((224, 224)) @@ -274,7 +274,7 @@ GPU. [ WARNING ] Performance hint was not explicitly specified in command line. Device(AUTO) performance hint will be set to PerformanceMode.THROUGHPUT. [Step 4/11] Reading model files [ INFO ] Loading model files - [ INFO ] Read model took 9.66 ms + [ INFO ] Read model took 9.35 ms [ INFO ] Original model I/O parameters: [ INFO ] Model inputs: [ INFO ] images (node: images) : f32 / [...] / [1,224,224,3] @@ -288,7 +288,7 @@ GPU. [ INFO ] Model outputs: [ INFO ] Softmax (node: 61) : f32 / [...] / [1,1000] [Step 7/11] Loading the model to the device - [ INFO ] Compile model took 147.18 ms + [ INFO ] Compile model took 166.78 ms [Step 8/11] Querying optimal runtime parameters [ INFO ] Model: [ INFO ] NETWORK_NAME: TensorFlow_Lite_Frontend_IR @@ -325,15 +325,15 @@ GPU. [ INFO ] Fill input 'images' with random values [Step 10/11] Measuring performance (Start inference asynchronously, 6 inference requests, limits: 15000 ms duration) [ INFO ] Benchmarking in inference only mode (inputs filling are not included in measurement loop). - [ INFO ] First inference took 7.26 ms + [ INFO ] First inference took 7.31 ms [Step 11/11] Dumping statistics report [ INFO ] Execution Devices:['CPU'] - [ INFO ] Count: 16578 iterations - [ INFO ] Duration: 15004.17 ms + [ INFO ] Count: 17460 iterations + [ INFO ] Duration: 15005.01 ms [ INFO ] Latency: - [ INFO ] Median: 5.30 ms - [ INFO ] Average: 5.29 ms - [ INFO ] Min: 2.92 ms - [ INFO ] Max: 17.62 ms - [ INFO ] Throughput: 1104.89 FPS + [ INFO ] Median: 4.99 ms + [ INFO ] Average: 5.02 ms + [ INFO ] Min: 2.99 ms + [ INFO ] Max: 17.05 ms + [ INFO ] Throughput: 1163.61 FPS diff --git a/docs/notebooks/tiny-sd-image-generation-with-output.rst b/docs/notebooks/tiny-sd-image-generation-with-output.rst index 2c4126b8aefc4c..090b8ff5f63378 100644 --- a/docs/notebooks/tiny-sd-image-generation-with-output.rst +++ b/docs/notebooks/tiny-sd-image-generation-with-output.rst @@ -96,9 +96,9 @@ First, load the pre-trained weights of all components of the model. import gc from diffusers import StableDiffusionPipeline - + model_id = "segmind/tiny-sd" - + pipe = StableDiffusionPipeline.from_pretrained(model_id).to("cpu") text_encoder = pipe.text_encoder text_encoder.eval() @@ -106,7 +106,7 @@ First, load the pre-trained weights of all components of the model. unet.eval() vae = pipe.vae vae.eval() - + del pipe gc.collect() @@ -164,10 +164,10 @@ hidden states. from pathlib import Path import torch import openvino as ov - + TEXT_ENCODER_OV_PATH = Path("text_encoder.xml") - - + + def convert_encoder(text_encoder: torch.nn.Module, ir_path: Path): """ Convert Text Encoder mode. @@ -181,7 +181,7 @@ hidden states. input_ids = torch.ones((1, 77), dtype=torch.long) # switch model to inference mode text_encoder.eval() - + # disable gradients calculation for reducing memory consumption with torch.no_grad(): # Export model to IR format @@ -195,13 +195,13 @@ hidden states. ov.save_model(ov_model, ir_path) del ov_model print(f"Text Encoder successfully converted to IR and saved to {ir_path}") - - + + if not TEXT_ENCODER_OV_PATH.exists(): convert_encoder(text_encoder, TEXT_ENCODER_OV_PATH) else: print(f"Text encoder will be loaded from {TEXT_ENCODER_OV_PATH}") - + del text_encoder gc.collect(); @@ -223,12 +223,12 @@ Model predicts the ``sample`` state for the next step. import numpy as np from openvino import PartialShape, Type - + UNET_OV_PATH = Path("unet.xml") - + dtype_mapping = {torch.float32: Type.f32, torch.float64: Type.f64} - - + + def convert_unet(unet: torch.nn.Module, ir_path: Path): """ Convert U-net model to IR format. @@ -250,15 +250,15 @@ Model predicts the ``sample`` state for the next step. shape = PartialShape(tuple(input_tensor.shape)) element_type = dtype_mapping[input_tensor.dtype] input_info.append((shape, element_type)) - + unet.eval() with torch.no_grad(): ov_model = ov.convert_model(unet, example_input=dummy_inputs, input=input_info) ov.save_model(ov_model, ir_path) del ov_model print(f"Unet successfully converted to IR and saved to {ir_path}") - - + + if not UNET_OV_PATH.exists(): convert_unet(unet, UNET_OV_PATH) gc.collect() @@ -292,8 +292,8 @@ of the pipeline, it will be better to convert them to separate models. .. code:: ipython3 VAE_ENCODER_OV_PATH = Path("vae_encodr.xml") - - + + def convert_vae_encoder(vae: torch.nn.Module, ir_path: Path): """ Convert VAE model for encoding to IR format. @@ -305,15 +305,15 @@ of the pipeline, it will be better to convert them to separate models. Returns: None """ - + class VAEEncoderWrapper(torch.nn.Module): def __init__(self, vae): super().__init__() self.vae = vae - + def forward(self, image): return self.vae.encode(x=image)["latent_dist"].sample() - + vae_encoder = VAEEncoderWrapper(vae) vae_encoder.eval() image = torch.zeros((1, 3, 512, 512)) @@ -322,16 +322,16 @@ of the pipeline, it will be better to convert them to separate models. ov.save_model(ov_model, ir_path) del ov_model print(f"VAE encoder successfully converted to IR and saved to {ir_path}") - - + + if not VAE_ENCODER_OV_PATH.exists(): convert_vae_encoder(vae, VAE_ENCODER_OV_PATH) else: print(f"VAE encoder will be loaded from {VAE_ENCODER_OV_PATH}") - + VAE_DECODER_OV_PATH = Path("vae_decoder.xml") - - + + def convert_vae_decoder(vae: torch.nn.Module, ir_path: Path): """ Convert VAE model for decoding to IR format. @@ -343,31 +343,31 @@ of the pipeline, it will be better to convert them to separate models. Returns: None """ - + class VAEDecoderWrapper(torch.nn.Module): def __init__(self, vae): super().__init__() self.vae = vae - + def forward(self, latents): return self.vae.decode(latents) - + vae_decoder = VAEDecoderWrapper(vae) latents = torch.zeros((1, 4, 64, 64)) - + vae_decoder.eval() with torch.no_grad(): ov_model = ov.convert_model(vae_decoder, example_input=latents, input=[((1, 4, 64, 64),)]) ov.save_model(ov_model, ir_path) del ov_model print(f"VAE decoder successfully converted to IR and saved to {ir_path}") - - + + if not VAE_DECODER_OV_PATH.exists(): convert_vae_decoder(vae, VAE_DECODER_OV_PATH) else: print(f"VAE decoder will be loaded from {VAE_DECODER_OV_PATH}") - + del vae gc.collect(); @@ -426,20 +426,20 @@ of the variational auto encoder. import inspect from typing import List, Optional, Union, Dict - + import PIL import cv2 - + from transformers import CLIPTokenizer from diffusers.pipelines.pipeline_utils import DiffusionPipeline from diffusers.schedulers import DDIMScheduler, LMSDiscreteScheduler, PNDMScheduler - - + + def scale_fit_to_window(dst_width: int, dst_height: int, image_width: int, image_height: int): """ Preprocessing helper function for calculating image size for resize with peserving original aspect ratio and fitting image to specific window size - + Parameters: dst_width (int): destination window width dst_height (int): destination window height @@ -451,15 +451,15 @@ of the variational auto encoder. """ im_scale = min(dst_height / image_height, dst_width / image_width) return int(im_scale * image_width), int(im_scale * image_height) - - + + def preprocess(image: PIL.Image.Image): """ Image preprocessing function. Takes image in PIL.Image format, resizes it to keep aspect ration and fits to model input window 512x512, then converts it to np.ndarray and adds padding with zeros on right or bottom side of image (depends from aspect ratio), after that converts data to float32 data type and change range of values from [0, 255] to [-1, 1], finally, converts data layout from planar NHWC to NCHW. The function returns preprocessed input tensor and padding size, which can be used in postprocessing. - + Parameters: image (PIL.Image.Image): input image Returns: @@ -477,8 +477,8 @@ of the variational auto encoder. image = 2.0 * image - 1.0 image = image.transpose(0, 3, 1, 2) return image, {"padding": pad, "src_width": src_width, "src_height": src_height} - - + + class OVStableDiffusionPipeline(DiffusionPipeline): def __init__( self, @@ -518,7 +518,7 @@ of the variational auto encoder. self.height = 512 self.width = 512 self.tokenizer = tokenizer - + def __call__( self, prompt: Union[str, List[str]], @@ -567,7 +567,7 @@ of the variational auto encoder. """ if seed is not None: np.random.seed(seed) - + img_buffer = [] do_classifier_free_guidance = guidance_scale > 1.0 # get prompt text embeddings @@ -576,20 +576,20 @@ of the variational auto encoder. do_classifier_free_guidance=do_classifier_free_guidance, negative_prompt=negative_prompt, ) - + # set timesteps accepts_offset = "offset" in set(inspect.signature(self.scheduler.set_timesteps).parameters.keys()) extra_set_kwargs = {} if accepts_offset: extra_set_kwargs["offset"] = 1 - + self.scheduler.set_timesteps(num_inference_steps, **extra_set_kwargs) timesteps, num_inference_steps = self.get_timesteps(num_inference_steps, strength) latent_timestep = timesteps[:1] - + # get the initial random noise unless the user supplied it latents, meta = self.prepare_latents(image, latent_timestep) - + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 @@ -598,19 +598,19 @@ of the variational auto encoder. extra_step_kwargs = {} if accepts_eta: extra_step_kwargs["eta"] = eta - + for i, t in enumerate(self.progress_bar(timesteps)): # expand the latents if you are doing classifier free guidance latent_model_input = np.concatenate([latents] * 2) if do_classifier_free_guidance else latents latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) - + # predict the noise residual noise_pred = self.unet([latent_model_input, t, text_embeddings])[self._unet_output] # perform guidance if do_classifier_free_guidance: noise_pred_uncond, noise_pred_text = noise_pred[0], noise_pred[1] noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) - + # compute the previous noisy sample x_t -> x_t-1 latents = self.scheduler.step( torch.from_numpy(noise_pred), @@ -622,13 +622,13 @@ of the variational auto encoder. image = self.vae_decoder(latents * (1 / 0.18215))[self._vae_d_output] image = self.postprocess_image(image, meta, output_type) img_buffer.extend(image) - + # scale and decode the image latents with vae image = self.vae_decoder(latents * (1 / 0.18215))[self._vae_d_output] - + image = self.postprocess_image(image, meta, output_type) return {"sample": image, "iterations": img_buffer} - + def _encode_prompt( self, prompt: Union[str, List[str]], @@ -638,7 +638,7 @@ of the variational auto encoder. ): """ Encodes the prompt into text encoder hidden states. - + Parameters: prompt (str or list(str)): prompt to be encoded num_images_per_prompt (int): number of images that should be generated per prompt @@ -648,7 +648,7 @@ of the variational auto encoder. text_embeddings (np.ndarray): text encoder hidden states """ batch_size = len(prompt) if isinstance(prompt, list) else 1 - + # tokenize input prompts text_inputs = self.tokenizer( prompt, @@ -658,15 +658,15 @@ of the variational auto encoder. return_tensors="np", ) text_input_ids = text_inputs.input_ids - + text_embeddings = self.text_encoder(text_input_ids)[self._text_encoder_output] - + # duplicate text embeddings for each generation per prompt if num_images_per_prompt != 1: bs_embed, seq_len, _ = text_embeddings.shape text_embeddings = np.tile(text_embeddings, (1, num_images_per_prompt, 1)) text_embeddings = np.reshape(text_embeddings, (bs_embed * num_images_per_prompt, seq_len, -1)) - + # get unconditional embeddings for classifier free guidance if do_classifier_free_guidance: uncond_tokens: List[str] @@ -684,25 +684,25 @@ of the variational auto encoder. truncation=True, return_tensors="np", ) - + uncond_embeddings = self.text_encoder(uncond_input.input_ids)[self._text_encoder_output] - + # duplicate unconditional embeddings for each generation per prompt, using mps friendly method seq_len = uncond_embeddings.shape[1] uncond_embeddings = np.tile(uncond_embeddings, (1, num_images_per_prompt, 1)) uncond_embeddings = np.reshape(uncond_embeddings, (batch_size * num_images_per_prompt, seq_len, -1)) - + # For classifier free guidance, we need to do two forward passes. # Here we concatenate the unconditional and text embeddings into a single batch # to avoid doing two forward passes text_embeddings = np.concatenate([uncond_embeddings, text_embeddings]) - + return text_embeddings - + def prepare_latents(self, image: PIL.Image.Image = None, latent_timestep: torch.Tensor = None): """ Function for getting initial latents for starting generation - + Parameters: image (PIL.Image.Image, *optional*, None): Input image for generation, if not provided randon noise will be used as starting point @@ -723,12 +723,12 @@ of the variational auto encoder. latents = self.vae_encoder(input_image)[self._vae_e_output] * 0.18215 latents = self.scheduler.add_noise(torch.from_numpy(latents), torch.from_numpy(noise), latent_timestep).numpy() return latents, meta - + def postprocess_image(self, image: np.ndarray, meta: Dict, output_type: str = "pil"): """ Postprocessing for decoded image. Takes generated image decoded by VAE decoder, unpad it to initila image size (if required), normalize and convert to [0, 255] pixels range. Optionally, convertes it from np.ndarray to PIL.Image format - + Parameters: image (np.ndarray): Generated image @@ -760,12 +760,12 @@ of the variational auto encoder. orig_height, orig_width = meta["src_height"], meta["src_width"] image = [cv2.resize(img, (orig_width, orig_width)) for img in image] return image - + def get_timesteps(self, num_inference_steps: int, strength: float): """ Helper function for getting scheduler timesteps for generation In case of image-to-image generation, it updates number of steps according to strength - + Parameters: num_inference_steps (int): number of inference steps for generation @@ -775,10 +775,10 @@ of the variational auto encoder. """ # get the original timestep using init_timestep init_timestep = min(int(num_inference_steps * strength), num_inference_steps) - + t_start = max(num_inference_steps - init_timestep, 0) timesteps = self.scheduler.timesteps[t_start:] - + return timesteps, num_inference_steps - t_start Configure Inference Pipeline @@ -797,16 +797,16 @@ Select device from dropdown list for running inference using OpenVINO. .. code:: ipython3 import requests - + r = requests.get( url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/notebook_utils.py", ) open("notebook_utils.py", "w").write(r.text) - + from notebook_utils import device_widget - + device = device_widget() - + device @@ -821,7 +821,7 @@ Select device from dropdown list for running inference using OpenVINO. .. code:: ipython3 core = ov.Core() - + text_enc = core.compile_model(TEXT_ENCODER_OV_PATH, device.value) Calibrate UNet for GPU inference @@ -839,28 +839,28 @@ operations to be executed in full precision. import pickle import requests import os - + # Fetch `model_upcast_utils` which helps to restore accuracy when inferred on GPU r = requests.get("https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/utils/model_upcast_utils.py") with open("model_upcast_utils.py", "w") as f: f.write(r.text) - + # Fetch an example input for UNet model needed for upcasting calibration process r = requests.get("https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/pkl/unet_calibration_example_input.pkl") with open("unet_calibration_example_input.pkl", "wb") as f: f.write(r.content) - + from model_upcast_utils import ( is_model_partially_upcasted, partially_upcast_nodes_to_fp32, ) - + unet_model = core.read_model(UNET_OV_PATH) if "GPU" in core.available_devices and not is_model_partially_upcasted(unet_model): with open("unet_calibration_example_input.pkl", "rb") as f: example_input = pickle.load(f) unet_model = partially_upcast_nodes_to_fp32(unet_model, example_input, upcast_ratio=0.7, operation_types=["Convolution"]) - + ov.save_model(unet_model, UNET_OV_PATH.with_suffix("._tmp.xml")) del unet_model os.remove(UNET_OV_PATH) @@ -875,7 +875,7 @@ operations to be executed in full precision. .. code:: ipython3 ov_config = {"INFERENCE_PRECISION_HINT": "f32"} if device.value != "CPU" else {} - + vae_decoder = core.compile_model(VAE_DECODER_OV_PATH, device.value, ov_config) vae_encoder = core.compile_model(VAE_ENCODER_OV_PATH, device.value, ov_config) @@ -886,10 +886,10 @@ Let us define them and put all components together from transformers import CLIPTokenizer from diffusers.schedulers import LMSDiscreteScheduler - + lms = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear") tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14") - + ov_pipe = OVStableDiffusionPipeline( tokenizer=tokenizer, text_encoder=text_enc, @@ -923,7 +923,7 @@ Now, let’s see model in action .. parsed-literal:: Pipeline settings - Input text: RAW studio photo of An intricate forest minitown landscape trapped in a bottle, atmospheric oliva lighting, on the table, intricate details, dark shot, soothing tones, muted colors + Input text: RAW studio photo of An intricate forest minitown landscape trapped in a bottle, atmospheric oliva lighting, on the table, intricate details, dark shot, soothing tones, muted colors Seed: 431 Number of steps: 20 @@ -961,7 +961,7 @@ Now is show time! .. parsed-literal:: Input text: - RAW studio photo of An intricate forest minitown landscape trapped in a bottle, atmospheric oliva lighting, on the table, intricate details, dark shot, soothing tones, muted colors + RAW studio photo of An intricate forest minitown landscape trapped in a bottle, atmospheric oliva lighting, on the table, intricate details, dark shot, soothing tones, muted colors @@ -1014,10 +1014,11 @@ found in this .. code:: ipython3 from diffusers.utils import load_image - + default_image_url = "https://user-images.githubusercontent.com/29454499/260418860-69cc443a-9ee6-493c-a393-3a97af080be7.jpg" + image_name = "default.jpg" # read uploaded image - image = load_image(default_image_url) + image = load_image(image_name, default_image_url) print("Pipeline settings") print(f"Input positive prompt: \n\t{text_prompt_i2i}") print(f"Input negative prompt: \n\t{negative_prompt_i2i}") @@ -1039,9 +1040,9 @@ found in this .. parsed-literal:: Pipeline settings - Input positive prompt: + Input positive prompt: professional photo portrait of woman, highly detailed, hyper realistic, cinematic effects, soft lighting - Input negative prompt: + Input negative prompt: blurry, poor quality, low res, worst quality, cropped, ugly, poorly drawn face, without eyes, mutation, unreal, animate, poorly drawn eyes Seed: 82698152 Number of steps: 40 @@ -1090,13 +1091,13 @@ Interactive Demo .. code:: ipython3 import gradio as gr - - + + def generate_from_text(text, negative_text, seed, num_steps, _=gr.Progress(track_tqdm=True)): result = ov_pipe(text, negative_prompt=negative_text, num_inference_steps=num_steps, seed=seed) return result["sample"][0] - - + + def generate_from_image(img, text, negative_text, seed, num_steps, strength, _=gr.Progress(track_tqdm=True)): result = ov_pipe( text, @@ -1113,11 +1114,11 @@ Interactive Demo if not Path("gradio_helper.py").exists(): r = requests.get(url="https://raw.githubusercontent.com/openvinotoolkit/openvino_notebooks/latest/notebooks/tiny-sd-image-generation/gradio_helper.py") open("gradio_helper.py", "w").write(r.text) - + from gradio_helper import make_demo - + demo = make_demo(text_to_text_fn=generate_from_text, image_to_image_fn=generate_from_image) - + try: demo.queue().launch(debug=False) except Exception: diff --git a/docs/notebooks/vehicle-detection-and-recognition-with-output.rst b/docs/notebooks/vehicle-detection-and-recognition-with-output.rst index 30204d6bd11ded..fab72fb0725d03 100644 --- a/docs/notebooks/vehicle-detection-and-recognition-with-output.rst +++ b/docs/notebooks/vehicle-detection-and-recognition-with-output.rst @@ -152,25 +152,25 @@ model is already downloaded, this step is skipped. .. parsed-literal:: - model/vehicle-detection-0200.xml: 0%| | 0.00/181k [00:00 - 100%|██████████| 4.68M/4.68M [00:00<00:00, 34.1MB/s] + 100%|██████████| 4.68M/4.68M [00:00<00:00, 17.2MB/s] .. parsed-literal:: @@ -215,13 +215,13 @@ next cell loads the model and the pre-trained weights. .. parsed-literal:: - Loading model weights from: 'model/u2net_lite/u2net_lite.pth' + /tmp/ipykernel_2254056/1036642300.py:7: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. + net.load_state_dict(state_dict=torch.load(model_path, map_location="cpu")) .. parsed-literal:: - /tmp/ipykernel_3590581/1036642300.py:7: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature. - net.load_state_dict(state_dict=torch.load(model_path, map_location="cpu")) + Loading model weights from: 'model/u2net_lite/u2net_lite.pth' @@ -247,7 +247,7 @@ OpenVINO IR format. Executing the following command may take a while. .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/vision-background-removal/model/u2net.py:23: UserWarning: `nn.functional.upsample` is deprecated. Use `nn.functional.interpolate` instead. + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/vision-background-removal/model/u2net.py:23: UserWarning: `nn.functional.upsample` is deprecated. Use `nn.functional.interpolate` instead. src = F.upsample(src,size=tar.shape[2:],mode='bilinear') @@ -273,12 +273,13 @@ repository `__ and multiplied by .. code:: ipython3 IMAGE_URI = "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_hollywood.jpg" + IMAGE_NAME = "coco_hollywood.jpg" input_mean = np.array([123.675, 116.28, 103.53]).reshape(1, 3, 1, 1) input_scale = np.array([58.395, 57.12, 57.375]).reshape(1, 3, 1, 1) image = cv2.cvtColor( - src=load_image(IMAGE_URI), + src=load_image(IMAGE_NAME, IMAGE_URI), code=cv2.COLOR_BGR2RGB, ) @@ -336,7 +337,7 @@ Load the OpenVINO IR model to OpenVINO Runtime and do inference. .. parsed-literal:: - Inference finished. Inference time: 0.107 seconds, FPS: 9.35. + Inference finished. Inference time: 0.109 seconds, FPS: 9.19. Visualize Results @@ -389,12 +390,13 @@ background pixels a value of 0. Replace the background image as follows: .. code:: ipython3 - BACKGROUND_FILE = "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/wall.jpg" + BACKGROUND_IMAGE_URL = "https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/wall.jpg" + BACKGROUND_IMAGE_NAME = "wall.jpg" OUTPUT_DIR = "output" os.makedirs(name=OUTPUT_DIR, exist_ok=True) - background_image = cv2.cvtColor(src=load_image(BACKGROUND_FILE), code=cv2.COLOR_BGR2RGB) + background_image = cv2.cvtColor(src=load_image(BACKGROUND_IMAGE_NAME, BACKGROUND_IMAGE_URL), code=cv2.COLOR_BGR2RGB) background_image = cv2.resize(src=background_image, dsize=(image.shape[1], image.shape[0])) # Set all the foreground pixels from the result to 0 @@ -403,7 +405,7 @@ background pixels a value of 0. Replace the background image as follows: new_image = background_image + bg_removed_result # Save the generated image. - new_image_path = Path(f"{OUTPUT_DIR}/{Path(IMAGE_URI).stem}-{Path(BACKGROUND_FILE).stem}.jpg") + new_image_path = Path(f"{OUTPUT_DIR}/{Path(IMAGE_URI).stem}-{BACKGROUND_IMAGE_NAME}") cv2.imwrite(filename=str(new_image_path), img=cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR)) # Display the original image and the image with the new background side by side diff --git a/docs/notebooks/vision-monodepth-with-output.rst b/docs/notebooks/vision-monodepth-with-output.rst index 736e0238989f8d..cf232c30fc9c73 100644 --- a/docs/notebooks/vision-monodepth-with-output.rst +++ b/docs/notebooks/vision-monodepth-with-output.rst @@ -146,11 +146,8 @@ format. ir_model_name_xml = "MiDaS_small.xml" ir_model_name_bin = "MiDaS_small.bin" - - if not (model_folder / ir_model_name_xml).exists(): - download_file(ir_model_url + ir_model_name_xml, filename=ir_model_name_xml, directory=model_folder) - if not (model_folder / ir_model_name_bin).exists(): - download_file(ir_model_url + ir_model_name_bin, filename=ir_model_name_bin, directory=model_folder) + download_file(ir_model_url + ir_model_name_xml, filename=ir_model_name_xml, directory=model_folder) + download_file(ir_model_url + ir_model_name_bin, filename=ir_model_name_bin, directory=model_folder) model_xml_path = model_folder / ir_model_name_xml @@ -158,13 +155,13 @@ format. .. parsed-literal:: - model/MiDaS_small.xml: 0%| | 0.00/268k [00:00 #0:0 (mpeg4 (native) -> h264 (libx264)) Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native)) Press [q] to stop, [?] for help - [libx264 @ 0x556392e25840] -qscale is ignored, -crf is recommended. - [libx264 @ 0x556392e25840] using SAR=1/1 - [libx264 @ 0x556392e25840] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512 - [libx264 @ 0x556392e25840] profile High, level 3.1 - [libx264 @ 0x556392e25840] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=24 lookahead_threads=4 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 + [libx264 @ 0x55ec6513e840] -qscale is ignored, -crf is recommended. + [libx264 @ 0x55ec6513e840] using SAR=1/1 + [libx264 @ 0x55ec6513e840] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512 + [libx264 @ 0x55ec6513e840] profile High, level 3.1 + [libx264 @ 0x55ec6513e840] 264 - core 155 r2917 0a84d98 - H.264/MPEG-4 AVC codec - Copyleft 2003-2018 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=24 lookahead_threads=4 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'results/result_voice.mp4': Metadata: encoder : Lavf58.29.100 @@ -349,27 +349,27 @@ python API and converted OpenVINO models. Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s Metadata: encoder : Lavc58.54.100 aac - frame= 123 fps=0.0 q=-1.0 Lsize= 621kB time=00:00:05.06 bitrate=1005.8kbits/s speed=9.73x + frame= 123 fps=0.0 q=-1.0 Lsize= 621kB time=00:00:05.06 bitrate=1005.8kbits/s speed=10.6x video:573kB audio:43kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.827166% - [libx264 @ 0x556392e25840] frame I:1 Avg QP:22.24 size: 31028 - [libx264 @ 0x556392e25840] frame P:75 Avg QP:22.01 size: 6954 - [libx264 @ 0x556392e25840] frame B:47 Avg QP:25.58 size: 718 - [libx264 @ 0x556392e25840] consecutive B-frames: 38.2% 27.6% 14.6% 19.5% - [libx264 @ 0x556392e25840] mb I I16..4: 14.0% 83.9% 2.1% - [libx264 @ 0x556392e25840] mb P I16..4: 1.3% 3.3% 0.1% P16..4: 37.8% 8.2% 6.4% 0.0% 0.0% skip:43.0% - [libx264 @ 0x556392e25840] mb B I16..4: 0.2% 0.7% 0.0% B16..8: 27.9% 0.4% 0.1% direct: 0.2% skip:70.6% L0:43.9% L1:54.2% BI: 1.9% - [libx264 @ 0x556392e25840] 8x8 transform intra:73.3% inter:77.1% - [libx264 @ 0x556392e25840] coded y,uvDC,uvAC intra: 56.9% 72.4% 8.1% inter: 11.4% 13.0% 0.2% - [libx264 @ 0x556392e25840] i16 v,h,dc,p: 20% 23% 9% 48% - [libx264 @ 0x556392e25840] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 23% 36% 3% 3% 2% 2% 3% 3% - [libx264 @ 0x556392e25840] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 14% 14% 4% 6% 7% 4% 9% 3% - [libx264 @ 0x556392e25840] i8c dc,h,v,p: 42% 25% 29% 4% - [libx264 @ 0x556392e25840] Weighted P-Frames: Y:0.0% UV:0.0% - [libx264 @ 0x556392e25840] ref P L0: 74.2% 10.4% 11.1% 4.3% - [libx264 @ 0x556392e25840] ref B L0: 86.1% 11.2% 2.8% - [libx264 @ 0x556392e25840] ref B L1: 98.3% 1.7% - [libx264 @ 0x556392e25840] kb/s:953.36 - [aac @ 0x556392e27140] Qavg: 121.673 + [libx264 @ 0x55ec6513e840] frame I:1 Avg QP:22.24 size: 31028 + [libx264 @ 0x55ec6513e840] frame P:75 Avg QP:22.01 size: 6954 + [libx264 @ 0x55ec6513e840] frame B:47 Avg QP:25.58 size: 718 + [libx264 @ 0x55ec6513e840] consecutive B-frames: 38.2% 27.6% 14.6% 19.5% + [libx264 @ 0x55ec6513e840] mb I I16..4: 14.0% 83.9% 2.1% + [libx264 @ 0x55ec6513e840] mb P I16..4: 1.3% 3.3% 0.1% P16..4: 37.8% 8.2% 6.4% 0.0% 0.0% skip:43.0% + [libx264 @ 0x55ec6513e840] mb B I16..4: 0.2% 0.7% 0.0% B16..8: 27.9% 0.4% 0.1% direct: 0.2% skip:70.6% L0:43.9% L1:54.2% BI: 1.9% + [libx264 @ 0x55ec6513e840] 8x8 transform intra:73.3% inter:77.1% + [libx264 @ 0x55ec6513e840] coded y,uvDC,uvAC intra: 56.9% 72.4% 8.1% inter: 11.4% 13.0% 0.2% + [libx264 @ 0x55ec6513e840] i16 v,h,dc,p: 20% 23% 9% 48% + [libx264 @ 0x55ec6513e840] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 23% 36% 3% 3% 2% 2% 3% 3% + [libx264 @ 0x55ec6513e840] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 14% 14% 4% 6% 7% 4% 9% 3% + [libx264 @ 0x55ec6513e840] i8c dc,h,v,p: 42% 25% 29% 4% + [libx264 @ 0x55ec6513e840] Weighted P-Frames: Y:0.0% UV:0.0% + [libx264 @ 0x55ec6513e840] ref P L0: 74.2% 10.4% 11.1% 4.3% + [libx264 @ 0x55ec6513e840] ref B L0: 86.1% 11.2% 2.8% + [libx264 @ 0x55ec6513e840] ref B L1: 98.3% 1.7% + [libx264 @ 0x55ec6513e840] kb/s:953.36 + [aac @ 0x55ec65140140] Qavg: 121.673 diff --git a/docs/notebooks/whisper-subtitles-generation-with-output.rst b/docs/notebooks/whisper-subtitles-generation-with-output.rst index 5a3c677fc27daa..a2764b4622bf67 100644 --- a/docs/notebooks/whisper-subtitles-generation-with-output.rst +++ b/docs/notebooks/whisper-subtitles-generation-with-output.rst @@ -79,15 +79,27 @@ Install dependencies. .. code:: ipython3 import platform + import importlib.metadata + import importlib.util %pip install -q "nncf>=2.14.0" %pip install -q -U "openvino>=2024.5.0" "openvino-tokenizers>=2024.5.0" "openvino-genai>=2024.5.0" %pip install -q "python-ffmpeg<=1.0.16" "ffmpeg" "moviepy" "transformers>=4.45" "git+https://github.com/huggingface/optimum-intel.git" "torch>=2.1" --extra-index-url https://download.pytorch.org/whl/cpu - %pip install -q -U "yt_dlp>=2024.8.6" soundfile librosa jiwer + %pip install -q -U "yt_dlp>=2024.8.6" soundfile librosa jiwer packaging %pip install -q "gradio>=4.19" "typing_extensions>=4.9" if platform.system() == "Darwin": %pip install -q "numpy<2.0" + + + from packaging import version + + if ( + importlib.util.find_spec("tensorflow") is not None + and version.parse(importlib.metadata.version("tensorflow")) < version.parse("2.18.0") + and version.parse(importlib.metadata.version("numpy")) >= version.parse("2.0.0") + ): + %pip uninstall -q -y tensorflow .. code:: ipython3 @@ -312,7 +324,10 @@ Select the task for the model: .. code:: ipython3 - from moviepy.editor import VideoFileClip + try: + from moviepy import VideoFileClip + except ImportError: + from moviepy.editor import VideoFileClip from transformers.pipelines.audio_utils import ffmpeg_read diff --git a/docs/notebooks/yolov10-optimization-with-output.rst b/docs/notebooks/yolov10-optimization-with-output.rst index dd7106d7a6bb56..99674518b41948 100644 --- a/docs/notebooks/yolov10-optimization-with-output.rst +++ b/docs/notebooks/yolov10-optimization-with-output.rst @@ -107,17 +107,6 @@ Prerequisites %pip install -q "git+https://github.com/THU-MIG/yolov10.git" --extra-index-url https://download.pytorch.org/whl/cpu %pip install -q "torch>=2.1" "torchvision>=0.16" tqdm opencv-python "gradio>=4.19" --extra-index-url https://download.pytorch.org/whl/cpu - -.. parsed-literal:: - - WARNING: Skipping openvino as it is not installed. - WARNING: Skipping openvino-dev as it is not installed. - Note: you may need to restart the kernel to use updated packages. - Note: you may need to restart the kernel to use updated packages. - Note: you may need to restart the kernel to use updated packages. - Note: you may need to restart the kernel to use updated packages. - - .. code:: ipython3 from pathlib import Path diff --git a/docs/notebooks/yolov11-instance-segmentation-with-output.rst b/docs/notebooks/yolov11-instance-segmentation-with-output.rst index 6c71d614e519db..0c346bf08cf3a6 100644 --- a/docs/notebooks/yolov11-instance-segmentation-with-output.rst +++ b/docs/notebooks/yolov11-instance-segmentation-with-output.rst @@ -128,18 +128,25 @@ Import required utility functions. The lower cell will download the # Download a test sample IMAGE_PATH = Path("./data/coco_bike.jpg") - if not IMAGE_PATH.exists(): - download_file( - url="https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bike.jpg", - filename=IMAGE_PATH.name, - directory=IMAGE_PATH.parent, - ) + download_file( + url="https://storage.openvinotoolkit.org/repositories/openvino_notebooks/data/data/image/coco_bike.jpg", + filename=IMAGE_PATH.name, + directory=IMAGE_PATH.parent, + ) + + + +.. parsed-literal:: + + coco_bike.jpg: 0%| | 0.00/182k [00:00=2023.3.0" "nncf>=2.8.1" "opencv-python" "matplotlib>=3.4" "seaborn" "pandas" "scikit-learn" "torch" "torchvision" "tqdm" --extra-index-url https://download.pytorch.org/whl/cpu @@ -97,7 +98,7 @@ Prerequisites .. parsed-literal:: - /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/823/archive/.workspace/scm/ov-notebook/notebooks/yolov9-optimization/yolov9 + /opt/home/k8sworker/ci-ai/cibuilds/jobs/ov-notebook/jobs/OVNotebookOps/builds/835/archive/.workspace/scm/ov-notebook/notebooks/yolov9-optimization/yolov9 Get PyTorch model @@ -128,14 +129,14 @@ applicable for other models from YOLO V9 family. .. parsed-literal:: - model/gelan-c.pt: 0%| | 0.00/49.1M [00:00 Date: Tue, 10 Dec 2024 15:43:18 +0200 Subject: [PATCH 05/31] [NPU] Create compiler adapter factory (#27962) ### Details: Clean-up code - create compiler adapter factory class to create the proper compiler adapter. ### Tickets: - *CVS-158848* Signed-off-by: Bogdan Pereanu --- .../src/backend/include/zero_backend.hpp | 4 +- .../src/backend/src/zero_backend.cpp | 8 +-- .../intel_npu/common/icompiler_adapter.hpp | 21 ++++++++ .../common/include/intel_npu/common/npu.hpp | 13 ++--- src/plugins/intel_npu/src/common/src/npu.cpp | 4 ++ .../include/compiler_adapter_factory.hpp | 41 ++++++++++++++ .../include/driver_compiler_adapter.hpp | 5 +- .../include/plugin_compiler_adapter.hpp | 2 +- .../src/driver_compiler_adapter.cpp | 3 -- .../src/plugin_compiler_adapter.cpp | 3 -- .../intel_npu/src/plugin/include/plugin.hpp | 2 - .../intel_npu/src/plugin/src/plugin.cpp | 54 ++++--------------- 12 files changed, 88 insertions(+), 72 deletions(-) create mode 100644 src/plugins/intel_npu/src/common/include/intel_npu/common/icompiler_adapter.hpp create mode 100644 src/plugins/intel_npu/src/compiler_adapter/include/compiler_adapter_factory.hpp diff --git a/src/plugins/intel_npu/src/backend/include/zero_backend.hpp b/src/plugins/intel_npu/src/backend/include/zero_backend.hpp index 038c7c1d2d9bf9..358bdc93ce7a71 100644 --- a/src/plugins/intel_npu/src/backend/include/zero_backend.hpp +++ b/src/plugins/intel_npu/src/backend/include/zero_backend.hpp @@ -29,12 +29,12 @@ class ZeroEngineBackend final : public IEngineBackend { bool isCommandQueueExtSupported() const override; bool isLUIDExtSupported() const override; - const std::shared_ptr& getInitStruct() const; - void* getContext() const override; void updateInfo(const Config& config) override; + const std::shared_ptr getInitStructs() const override; + private: std::shared_ptr _initStruct; diff --git a/src/plugins/intel_npu/src/backend/src/zero_backend.cpp b/src/plugins/intel_npu/src/backend/src/zero_backend.cpp index 55aaad102e8b8f..afcf77d55616f0 100644 --- a/src/plugins/intel_npu/src/backend/src/zero_backend.cpp +++ b/src/plugins/intel_npu/src/backend/src/zero_backend.cpp @@ -72,10 +72,6 @@ void* ZeroEngineBackend::getContext() const { return _initStruct->getContext(); } -const std::shared_ptr& ZeroEngineBackend::getInitStruct() const { - return _initStruct; -} - void ZeroEngineBackend::updateInfo(const Config& config) { _logger.setLevel(config.get()); if (_devices.size() > 0) { @@ -85,4 +81,8 @@ void ZeroEngineBackend::updateInfo(const Config& config) { } } +const std::shared_ptr ZeroEngineBackend::getInitStructs() const { + return _initStruct; +} + } // namespace intel_npu diff --git a/src/plugins/intel_npu/src/common/include/intel_npu/common/icompiler_adapter.hpp b/src/plugins/intel_npu/src/common/include/intel_npu/common/icompiler_adapter.hpp new file mode 100644 index 00000000000000..6e585299d68a1d --- /dev/null +++ b/src/plugins/intel_npu/src/common/include/intel_npu/common/icompiler_adapter.hpp @@ -0,0 +1,21 @@ +// Copyright (C) 2018-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "intel_npu/common/igraph.hpp" + +namespace intel_npu { + +class ICompilerAdapter { +public: + virtual std::shared_ptr compile(const std::shared_ptr& model, + const Config& config) const = 0; + virtual std::shared_ptr parse(std::vector network, const Config& config) const = 0; + virtual ov::SupportedOpsMap query(const std::shared_ptr& model, const Config& config) const = 0; + + virtual ~ICompilerAdapter() = default; +}; + +} // namespace intel_npu diff --git a/src/plugins/intel_npu/src/common/include/intel_npu/common/npu.hpp b/src/plugins/intel_npu/src/common/include/intel_npu/common/npu.hpp index b34f2deee6c61e..9e4c59852151ce 100644 --- a/src/plugins/intel_npu/src/common/include/intel_npu/common/npu.hpp +++ b/src/plugins/intel_npu/src/common/include/intel_npu/common/npu.hpp @@ -10,6 +10,7 @@ #include "intel_npu/common/igraph.hpp" #include "intel_npu/common/sync_infer_request.hpp" #include "intel_npu/config/config.hpp" +#include "intel_npu/utils/zero/zero_init.hpp" #include "openvino/runtime/intel_npu/remote_properties.hpp" #include "openvino/runtime/iremote_context.hpp" #include "openvino/runtime/properties.hpp" @@ -47,6 +48,8 @@ class IEngineBackend : public std::enable_shared_from_this { virtual void* getContext() const; /** @brief Update backend and device info */ virtual void updateInfo(const Config& config) = 0; + /** @brief Get LevelZero structures */ + virtual const std::shared_ptr getInitStructs() const; protected: virtual ~IEngineBackend() = default; @@ -54,16 +57,6 @@ class IEngineBackend : public std::enable_shared_from_this { //------------------------------------------------------------------------------ -class ICompilerAdapter { -public: - virtual std::shared_ptr compile(const std::shared_ptr& model, - const Config& config) const = 0; - virtual std::shared_ptr parse(std::vector network, const Config& config) const = 0; - virtual ov::SupportedOpsMap query(const std::shared_ptr& model, const Config& config) const = 0; - - virtual ~ICompilerAdapter() = default; -}; - //------------------------------------------------------------------------------ class IDevice : public std::enable_shared_from_this { diff --git a/src/plugins/intel_npu/src/common/src/npu.cpp b/src/plugins/intel_npu/src/common/src/npu.cpp index 0969b200ea09a5..afcfa5b0bba271 100644 --- a/src/plugins/intel_npu/src/common/src/npu.cpp +++ b/src/plugins/intel_npu/src/common/src/npu.cpp @@ -43,6 +43,10 @@ IDevice::Uuid IDevice::getUuid() const { OPENVINO_THROW("Get UUID not supported"); } +const std::shared_ptr IEngineBackend::getInitStructs() const { + return nullptr; +} + ov::device::LUID IDevice::getLUID() const { OPENVINO_THROW("Get LUID not supported"); } diff --git a/src/plugins/intel_npu/src/compiler_adapter/include/compiler_adapter_factory.hpp b/src/plugins/intel_npu/src/compiler_adapter/include/compiler_adapter_factory.hpp new file mode 100644 index 00000000000000..31c6ca348a234f --- /dev/null +++ b/src/plugins/intel_npu/src/compiler_adapter/include/compiler_adapter_factory.hpp @@ -0,0 +1,41 @@ +// Copyright (C) 2018-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#pragma once + +#include "driver_compiler_adapter.hpp" +#include "intel_npu/common/icompiler_adapter.hpp" +#include "intel_npu/config/compiler.hpp" +#include "intel_npu/config/config.hpp" +#include "plugin_compiler_adapter.hpp" + +namespace intel_npu { + +class CompilerAdapterFactory final { +public: + const std::unique_ptr getCompiler(const ov::SoPtr& engineBackend, + const Config& config) const { + auto compilerType = config.get(); + switch (compilerType) { + case ov::intel_npu::CompilerType::MLIR: { + if (engineBackend->getName() != "LEVEL0") { + return std::make_unique(nullptr); + } + + return std::make_unique(engineBackend->getInitStructs()); + } + case ov::intel_npu::CompilerType::DRIVER: { + if (engineBackend->getName() != "LEVEL0") { + OPENVINO_THROW("NPU Compiler Adapter must be used with LEVEL0 backend"); + } + + return std::make_unique(engineBackend->getInitStructs()); + } + default: + OPENVINO_THROW("Invalid NPU_COMPILER_TYPE"); + } + } +}; + +} // namespace intel_npu diff --git a/src/plugins/intel_npu/src/compiler_adapter/include/driver_compiler_adapter.hpp b/src/plugins/intel_npu/src/compiler_adapter/include/driver_compiler_adapter.hpp index 82ababf21c147a..3fb0ea8937da60 100644 --- a/src/plugins/intel_npu/src/compiler_adapter/include/driver_compiler_adapter.hpp +++ b/src/plugins/intel_npu/src/compiler_adapter/include/driver_compiler_adapter.hpp @@ -6,13 +6,10 @@ #pragma once -#include -#include - #include #include -#include "intel_npu/common/npu.hpp" +#include "intel_npu/common/icompiler_adapter.hpp" #include "intel_npu/config/config.hpp" #include "intel_npu/utils/logger/logger.hpp" #include "intel_npu/utils/zero/zero_init.hpp" diff --git a/src/plugins/intel_npu/src/compiler_adapter/include/plugin_compiler_adapter.hpp b/src/plugins/intel_npu/src/compiler_adapter/include/plugin_compiler_adapter.hpp index 8d2616884e7d5f..96c71d9f80c668 100644 --- a/src/plugins/intel_npu/src/compiler_adapter/include/plugin_compiler_adapter.hpp +++ b/src/plugins/intel_npu/src/compiler_adapter/include/plugin_compiler_adapter.hpp @@ -6,7 +6,7 @@ #pragma once -#include "intel_npu/common/npu.hpp" +#include "intel_npu/common/icompiler_adapter.hpp" #include "intel_npu/icompiler.hpp" #include "intel_npu/utils/logger/logger.hpp" #include "intel_npu/utils/zero/zero_init.hpp" diff --git a/src/plugins/intel_npu/src/compiler_adapter/src/driver_compiler_adapter.cpp b/src/plugins/intel_npu/src/compiler_adapter/src/driver_compiler_adapter.cpp index 9d634656db109a..b17148c6411936 100644 --- a/src/plugins/intel_npu/src/compiler_adapter/src/driver_compiler_adapter.cpp +++ b/src/plugins/intel_npu/src/compiler_adapter/src/driver_compiler_adapter.cpp @@ -4,8 +4,6 @@ #include "driver_compiler_adapter.hpp" -#include - #include #include @@ -21,7 +19,6 @@ #include "intel_npu/utils/zero/zero_utils.hpp" #include "ir_serializer.hpp" #include "openvino/core/model.hpp" -#include "ze_graph_ext_wrappers.hpp" namespace { diff --git a/src/plugins/intel_npu/src/compiler_adapter/src/plugin_compiler_adapter.cpp b/src/plugins/intel_npu/src/compiler_adapter/src/plugin_compiler_adapter.cpp index 06d71fd1126c17..6d67f544db2c17 100644 --- a/src/plugins/intel_npu/src/compiler_adapter/src/plugin_compiler_adapter.cpp +++ b/src/plugins/intel_npu/src/compiler_adapter/src/plugin_compiler_adapter.cpp @@ -4,8 +4,6 @@ #include "plugin_compiler_adapter.hpp" -#include - #include #include @@ -19,7 +17,6 @@ #include "openvino/util/file_util.hpp" #include "openvino/util/shared_object.hpp" #include "plugin_graph.hpp" -#include "ze_graph_ext_wrappers.hpp" namespace { std::shared_ptr loadLibrary(const std::string& libpath) { diff --git a/src/plugins/intel_npu/src/plugin/include/plugin.hpp b/src/plugins/intel_npu/src/plugin/include/plugin.hpp index c3c2daa525aaa1..6b1b46872788e3 100644 --- a/src/plugins/intel_npu/src/plugin/include/plugin.hpp +++ b/src/plugins/intel_npu/src/plugin/include/plugin.hpp @@ -52,8 +52,6 @@ class Plugin : public ov::IPlugin { const ov::AnyMap& properties) const override; private: - std::unique_ptr getCompiler(const Config& config) const; - std::shared_ptr _backends; std::map _config; diff --git a/src/plugins/intel_npu/src/plugin/src/plugin.cpp b/src/plugins/intel_npu/src/plugin/src/plugin.cpp index da425d5d01a5c3..fa641dfdcd9641 100644 --- a/src/plugins/intel_npu/src/plugin/src/plugin.cpp +++ b/src/plugins/intel_npu/src/plugin/src/plugin.cpp @@ -7,9 +7,9 @@ #include #include "compiled_model.hpp" -#include "npuw/compiled_model.hpp" -#include "driver_compiler_adapter.hpp" +#include "compiler_adapter_factory.hpp" #include "intel_npu/common/device_helpers.hpp" +#include "intel_npu/common/icompiler_adapter.hpp" #include "intel_npu/common/igraph.hpp" #include "intel_npu/common/itt.hpp" #include "intel_npu/config/common.hpp" @@ -17,13 +17,12 @@ #include "intel_npu/config/npuw.hpp" #include "intel_npu/config/runtime.hpp" #include "intel_npu/utils/zero/zero_init.hpp" +#include "npuw/compiled_model.hpp" #include "openvino/op/constant.hpp" #include "openvino/op/parameter.hpp" #include "openvino/runtime/intel_npu/properties.hpp" #include "openvino/runtime/properties.hpp" -#include "plugin_compiler_adapter.hpp" #include "remote_context.hpp" -#include "zero_backend.hpp" using namespace intel_npu; @@ -699,8 +698,9 @@ std::shared_ptr Plugin::compile_model(const std::shared_ptr< } } - auto original_model = model->clone(); - auto compiler = getCompiler(localConfig); + auto originalModel = model->clone(); + CompilerAdapterFactory compilerAdapterFactory; + auto compiler = compilerAdapterFactory.getCompiler(_backends->getIEngineBackend(), localConfig); OV_ITT_TASK_NEXT(PLUGIN_COMPILE_MODEL, "compile"); std::shared_ptr graph; @@ -716,7 +716,7 @@ std::shared_ptr Plugin::compile_model(const std::shared_ptr< std::shared_ptr compiledModel; try { - compiledModel = std::make_shared(original_model, shared_from_this(), device, graph, localConfig); + compiledModel = std::make_shared(originalModel, shared_from_this(), device, graph, localConfig); } catch (const std::exception& ex) { OPENVINO_THROW(ex.what()); } catch (...) { @@ -772,7 +772,8 @@ std::shared_ptr Plugin::import_model(std::istream& stream, c std::shared_ptr compiledModel; try { - auto compiler = getCompiler(localConfig); + CompilerAdapterFactory compilerAdapterFactory; + auto compiler = compilerAdapterFactory.getCompiler(_backends->getIEngineBackend(), localConfig); auto graphSize = getFileSize(stream); @@ -821,7 +822,8 @@ ov::SupportedOpsMap Plugin::query_model(const std::shared_ptr& const auto platform = _backends->getCompilationPlatform(localConfig.get(), localConfig.get()); localConfig.update({{ov::intel_npu::platform.name(), platform}}); - auto compiler = getCompiler(localConfig); + CompilerAdapterFactory compilerAdapterFactory; + auto compiler = compilerAdapterFactory.getCompiler(_backends->getIEngineBackend(), localConfig); ov::SupportedOpsMap supportedOpsMap; try { supportedOpsMap = compiler->query(model, localConfig); @@ -834,40 +836,6 @@ ov::SupportedOpsMap Plugin::query_model(const std::shared_ptr& return supportedOpsMap; } -std::unique_ptr Plugin::getCompiler(const Config& config) const { - auto compilerType = config.get(); - _logger.debug("performing createCompiler"); - - switch (compilerType) { - case ov::intel_npu::CompilerType::MLIR: { - if (_backends->getBackendName() != "LEVEL0") { - return std::make_unique(nullptr); - } - - auto zeroBackend = std::dynamic_pointer_cast(_backends->getIEngineBackend()._ptr); - if (zeroBackend == nullptr) { - return std::make_unique(nullptr); - } - - return std::make_unique(zeroBackend->getInitStruct()); - } - case ov::intel_npu::CompilerType::DRIVER: { - if (_backends->getBackendName() != "LEVEL0") { - OPENVINO_THROW("NPU Compiler Adapter must be used with LEVEL0 backend"); - } - - auto zeroBackend = std::dynamic_pointer_cast(_backends->getIEngineBackend()._ptr); - if (!zeroBackend) { - OPENVINO_THROW("Failed to cast zeroBackend, zeroBackend is a nullptr"); - } - - return std::make_unique(zeroBackend->getInitStruct()); - } - default: - OPENVINO_THROW("Invalid NPU_COMPILER_TYPE"); - } -} - std::atomic Plugin::_compiledModelLoadCounter{1}; static const ov::Version version = {CI_BUILD_NUMBER, NPU_PLUGIN_LIB_NAME}; From 1be5963bc99e408904369cba4611a10fe2572dc6 Mon Sep 17 00:00:00 2001 From: Alicja Miloszewska Date: Tue, 10 Dec 2024 15:48:14 +0100 Subject: [PATCH 06/31] [Py OV] Add op to openvino module (#27902) ### Details: - copy `openvino/runtime/op/` to `openvino`. `op/` is not initialized in `openvino/runtime/__init__.py`. Update inits in openvino/runtime/op/ - update rule `src/openvino/runtime/*/ops.py: VNE001,VNE003` in _setup.cfg_ - For opset 1 - 16: - move `runtime/opsetx/ops.py`. - update opsetx inits to import from new ops.py location. - add `runtime/opsetx/ops/__init__.py`. - initialize opsets in openvino init - add imports for opset14-16 to `openvino/runtime/__init__.py` - adds possibility to import opsets directly: ```python import openvino.opset13 as ops param = ops.parameter([10]) ``` or ```python import openvino as ov param = ov.opset13.parameter([10]) ``` ### Tickets: - CVS-129458 --------- Signed-off-by: Alicja Miloszewska --- src/bindings/python/setup.cfg | 2 +- src/bindings/python/src/openvino/__init__.py | 18 + .../python/src/openvino/op/__init__.py | 19 + .../python/src/openvino/op/util/__init__.py | 22 + .../python/src/openvino/opset1/__init__.py | 111 +++++ .../src/openvino/{runtime => }/opset1/ops.py | 2 +- .../python/src/openvino/opset10/__init__.py | 179 ++++++++ .../src/openvino/{runtime => }/opset10/ops.py | 0 .../python/src/openvino/opset11/__init__.py | 179 ++++++++ .../src/openvino/{runtime => }/opset11/ops.py | 0 .../python/src/openvino/opset12/__init__.py | 180 ++++++++ .../src/openvino/{runtime => }/opset12/ops.py | 0 .../python/src/openvino/opset13/__init__.py | 188 +++++++++ .../src/openvino/{runtime => }/opset13/ops.py | 4 +- .../python/src/openvino/opset14/__init__.py | 190 +++++++++ .../src/openvino/{runtime => }/opset14/ops.py | 0 .../python/src/openvino/opset15/__init__.py | 204 +++++++++ .../src/openvino/{runtime => }/opset15/ops.py | 4 +- .../python/src/openvino/opset16/__init__.py | 9 + .../src/openvino/{runtime => }/opset16/ops.py | 0 .../python/src/openvino/opset2/__init__.py | 117 ++++++ .../src/openvino/{runtime => }/opset2/ops.py | 2 +- .../python/src/openvino/opset3/__init__.py | 133 ++++++ .../src/openvino/{runtime => }/opset3/ops.py | 2 +- .../python/src/openvino/opset4/__init__.py | 144 +++++++ .../src/openvino/{runtime => }/opset4/ops.py | 2 +- .../python/src/openvino/opset5/__init__.py | 152 +++++++ .../src/openvino/{runtime => }/opset5/ops.py | 2 +- .../python/src/openvino/opset6/__init__.py | 154 +++++++ .../src/openvino/{runtime => }/opset6/ops.py | 6 +- .../python/src/openvino/opset7/__init__.py | 158 +++++++ .../src/openvino/{runtime => }/opset7/ops.py | 2 +- .../python/src/openvino/opset8/__init__.py | 169 ++++++++ .../src/openvino/{runtime => }/opset8/ops.py | 2 +- .../python/src/openvino/opset9/__init__.py | 175 ++++++++ .../src/openvino/{runtime => }/opset9/ops.py | 0 .../python/src/openvino/runtime/__init__.py | 3 + .../src/openvino/runtime/op/__init__.py | 18 +- .../src/openvino/runtime/op/util/__init__.py | 26 +- .../src/openvino/runtime/opset1/__init__.py | 214 +++++----- .../openvino/runtime/opset1/ops/__init__.py | 109 +++++ .../src/openvino/runtime/opset10/__init__.py | 350 ++++++++-------- .../openvino/runtime/opset10/ops/__init__.py | 9 + .../src/openvino/runtime/opset11/__init__.py | 350 ++++++++-------- .../openvino/runtime/opset11/ops/__init__.py | 6 + .../src/openvino/runtime/opset12/__init__.py | 352 ++++++++-------- .../openvino/runtime/opset12/ops/__init__.py | 7 + .../src/openvino/runtime/opset13/__init__.py | 368 ++++++++-------- .../openvino/runtime/opset13/ops/__init__.py | 15 + .../src/openvino/runtime/opset14/__init__.py | 372 ++++++++--------- .../openvino/runtime/opset14/ops/__init__.py | 8 + .../src/openvino/runtime/opset15/__init__.py | 394 +++++++++--------- .../openvino/runtime/opset15/ops/__init__.py | 17 + .../src/openvino/runtime/opset16/__init__.py | 2 +- .../openvino/runtime/opset16/ops/__init__.py | 5 + .../src/openvino/runtime/opset2/__init__.py | 226 +++++----- .../openvino/runtime/opset2/ops/__init__.py | 10 + .../src/openvino/runtime/opset3/__init__.py | 258 ++++++------ .../openvino/runtime/opset3/ops/__init__.py | 23 + .../src/openvino/runtime/opset4/__init__.py | 280 ++++++------- .../openvino/runtime/opset4/ops/__init__.py | 19 + .../src/openvino/runtime/opset5/__init__.py | 296 ++++++------- .../openvino/runtime/opset5/ops/__init__.py | 14 + .../src/openvino/runtime/opset6/__init__.py | 300 ++++++------- .../openvino/runtime/opset6/ops/__init__.py | 8 + .../src/openvino/runtime/opset7/__init__.py | 308 +++++++------- .../openvino/runtime/opset7/ops/__init__.py | 10 + .../src/openvino/runtime/opset8/__init__.py | 330 +++++++-------- .../openvino/runtime/opset8/ops/__init__.py | 22 + .../src/openvino/runtime/opset9/__init__.py | 342 +++++++-------- .../openvino/runtime/opset9/ops/__init__.py | 13 + tools/benchmark_tool/openvino/__init__.py | 18 + tools/ovc/openvino/__init__.py | 18 + 73 files changed, 5243 insertions(+), 2408 deletions(-) create mode 100644 src/bindings/python/src/openvino/op/__init__.py create mode 100644 src/bindings/python/src/openvino/op/util/__init__.py create mode 100644 src/bindings/python/src/openvino/opset1/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset1/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset10/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset10/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/opset11/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset11/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/opset12/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset12/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/opset13/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset13/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset14/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset14/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/opset15/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset15/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset16/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset16/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/opset2/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset2/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset3/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset3/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset4/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset4/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset5/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset5/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset6/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset6/ops.py (97%) create mode 100644 src/bindings/python/src/openvino/opset7/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset7/ops.py (98%) create mode 100644 src/bindings/python/src/openvino/opset8/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset8/ops.py (99%) create mode 100644 src/bindings/python/src/openvino/opset9/__init__.py rename src/bindings/python/src/openvino/{runtime => }/opset9/ops.py (100%) create mode 100644 src/bindings/python/src/openvino/runtime/opset1/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset10/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset11/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset12/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset13/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset14/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset15/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset16/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset2/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset3/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset4/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset5/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset6/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset7/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset8/ops/__init__.py create mode 100644 src/bindings/python/src/openvino/runtime/opset9/ops/__init__.py diff --git a/src/bindings/python/setup.cfg b/src/bindings/python/setup.cfg index 7fc407ad56e7a1..89fabcb659c108 100644 --- a/src/bindings/python/setup.cfg +++ b/src/bindings/python/setup.cfg @@ -66,7 +66,7 @@ show_source = True docstring-convention = google enable-extensions = G per-file-ignores = - src/openvino/runtime/*/ops.py: VNE001,VNE003 + src/openvino/*/ops.py: VNE001,VNE003 src/openvino/preprocess/torchvision/*: N801, VNE001 *__init__.py: F401 diff --git a/src/bindings/python/src/openvino/__init__.py b/src/bindings/python/src/openvino/__init__.py index 57f03f00c2eebf..e4d1a247520332 100644 --- a/src/bindings/python/src/openvino/__init__.py +++ b/src/bindings/python/src/openvino/__init__.py @@ -56,6 +56,24 @@ from openvino._pyopenvino import RemoteTensor from openvino._pyopenvino import Op +# Import opsets +from openvino import opset1 +from openvino import opset2 +from openvino import opset3 +from openvino import opset4 +from openvino import opset5 +from openvino import opset6 +from openvino import opset7 +from openvino import opset8 +from openvino import opset9 +from openvino import opset10 +from openvino import opset11 +from openvino import opset12 +from openvino import opset13 +from openvino import opset14 +from openvino import opset15 +from openvino import opset16 + # libva related: from openvino._pyopenvino import VAContext from openvino._pyopenvino import VASurfaceTensor diff --git a/src/bindings/python/src/openvino/op/__init__.py b/src/bindings/python/src/openvino/op/__init__.py new file mode 100644 index 00000000000000..ee324dd76380f7 --- /dev/null +++ b/src/bindings/python/src/openvino/op/__init__.py @@ -0,0 +1,19 @@ +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +""" +Package: openvino.op +Low level wrappers for the c++ api in ov::op. +""" + +# flake8: noqa + +from openvino._pyopenvino.op import Constant +from openvino._pyopenvino.op import assign +from openvino._pyopenvino.op import _PagedAttentionExtension +from openvino._pyopenvino.op import Parameter +from openvino._pyopenvino.op import if_op +from openvino._pyopenvino.op import loop +from openvino._pyopenvino.op import tensor_iterator +from openvino._pyopenvino.op import read_value +from openvino._pyopenvino.op import Result diff --git a/src/bindings/python/src/openvino/op/util/__init__.py b/src/bindings/python/src/openvino/op/util/__init__.py new file mode 100644 index 00000000000000..0c946b115f451e --- /dev/null +++ b/src/bindings/python/src/openvino/op/util/__init__.py @@ -0,0 +1,22 @@ +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +""" +Package: openvino.op.util +Low level wrappers for the c++ api in ov::op::util. +""" +# flake8: noqa + +from openvino._pyopenvino.op.util import UnaryElementwiseArithmetic +from openvino._pyopenvino.op.util import BinaryElementwiseComparison +from openvino._pyopenvino.op.util import BinaryElementwiseArithmetic +from openvino._pyopenvino.op.util import BinaryElementwiseLogical +from openvino._pyopenvino.op.util import ArithmeticReduction +from openvino._pyopenvino.op.util import IndexReduction +from openvino._pyopenvino.op.util import VariableInfo +from openvino._pyopenvino.op.util import Variable +from openvino._pyopenvino.op.util import MergedInputDescription +from openvino._pyopenvino.op.util import InvariantInputDescription +from openvino._pyopenvino.op.util import SliceInputDescription +from openvino._pyopenvino.op.util import ConcatOutputDescription +from openvino._pyopenvino.op.util import BodyOutputDescription diff --git a/src/bindings/python/src/openvino/opset1/__init__.py b/src/bindings/python/src/openvino/opset1/__init__.py new file mode 100644 index 00000000000000..35ceec6b0d9892 --- /dev/null +++ b/src/bindings/python/src/openvino/opset1/__init__.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset1.ops import binary_convolution +from openvino.opset1.ops import broadcast +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset1.ops import negative +from openvino.opset1.ops import non_max_suppression +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset1.ops import shape_of +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset1.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset1/ops.py b/src/bindings/python/src/openvino/opset1/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset1/ops.py rename to src/bindings/python/src/openvino/opset1/ops.py index 54f32d404336d4..edca6c62a0b246 100644 --- a/src/bindings/python/src/openvino/runtime/opset1/ops.py +++ b/src/bindings/python/src/openvino/opset1/ops.py @@ -9,7 +9,7 @@ from functools import partial from openvino.runtime import Node, PartialShape, Type -from openvino.runtime.op import Constant, Parameter, tensor_iterator +from openvino.op import Constant, Parameter, tensor_iterator from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset10/__init__.py b/src/bindings/python/src/openvino/opset10/__init__.py new file mode 100644 index 00000000000000..659cb99bb8644d --- /dev/null +++ b/src/bindings/python/src/openvino/opset10/__init__.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset10.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset10/ops.py b/src/bindings/python/src/openvino/opset10/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset10/ops.py rename to src/bindings/python/src/openvino/opset10/ops.py diff --git a/src/bindings/python/src/openvino/opset11/__init__.py b/src/bindings/python/src/openvino/opset11/__init__.py new file mode 100644 index 00000000000000..2a07b9fab9f2c4 --- /dev/null +++ b/src/bindings/python/src/openvino/opset11/__init__.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset11/ops.py b/src/bindings/python/src/openvino/opset11/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset11/ops.py rename to src/bindings/python/src/openvino/opset11/ops.py diff --git a/src/bindings/python/src/openvino/opset12/__init__.py b/src/bindings/python/src/openvino/opset12/__init__.py new file mode 100644 index 00000000000000..1187f2c83e6a05 --- /dev/null +++ b/src/bindings/python/src/openvino/opset12/__init__.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset12/ops.py b/src/bindings/python/src/openvino/opset12/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset12/ops.py rename to src/bindings/python/src/openvino/opset12/ops.py diff --git a/src/bindings/python/src/openvino/opset13/__init__.py b/src/bindings/python/src/openvino/opset13/__init__.py new file mode 100644 index 00000000000000..ab3f541e8f831c --- /dev/null +++ b/src/bindings/python/src/openvino/opset13/__init__.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset13/ops.py b/src/bindings/python/src/openvino/opset13/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset13/ops.py rename to src/bindings/python/src/openvino/opset13/ops.py index a624ffb4f79873..12f0d06b1a28e6 100644 --- a/src/bindings/python/src/openvino/runtime/opset13/ops.py +++ b/src/bindings/python/src/openvino/opset13/ops.py @@ -12,8 +12,8 @@ log = logging.getLogger(__name__) from openvino.runtime import Node, Shape, Type, Output, Tensor -from openvino.runtime.op import Constant, Result -from openvino.runtime.opset1 import convert_like +from openvino.op import Constant, Result +from openvino.opset1 import convert_like from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op, overloading from openvino.runtime.utils.types import ( diff --git a/src/bindings/python/src/openvino/opset14/__init__.py b/src/bindings/python/src/openvino/opset14/__init__.py new file mode 100644 index 00000000000000..8a503a333bd3e1 --- /dev/null +++ b/src/bindings/python/src/openvino/opset14/__init__.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset14.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset14.ops import convert_promote_types +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset14.ops import inverse +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset14.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset14/ops.py b/src/bindings/python/src/openvino/opset14/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset14/ops.py rename to src/bindings/python/src/openvino/opset14/ops.py diff --git a/src/bindings/python/src/openvino/opset15/__init__.py b/src/bindings/python/src/openvino/opset15/__init__.py new file mode 100644 index 00000000000000..d5b93924a69e6e --- /dev/null +++ b/src/bindings/python/src/openvino/opset15/__init__.py @@ -0,0 +1,204 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +# New operations added in Opset15 +from openvino.opset15.ops import col2im +from openvino.opset15.ops import embedding_bag_offsets +from openvino.opset15.ops import embedding_bag_packed +from openvino.opset15.ops import scatter_nd_update +from openvino.opset15.ops import roi_align_rotated +from openvino.opset15.ops import string_tensor_pack +from openvino.opset15.ops import string_tensor_unpack +from openvino.opset15.ops import bitwise_left_shift +from openvino.opset15.ops import bitwise_right_shift +from openvino.opset15.ops import slice_scatter + +# Operators from previous opsets +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset14.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset14.ops import convert_promote_types +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset14.ops import inverse +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset14.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset3.ops import scatter_update +from openvino.opset15.ops import search_sorted +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset15.ops import squeeze +from openvino.opset15.ops import stft +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset15/ops.py b/src/bindings/python/src/openvino/opset15/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset15/ops.py rename to src/bindings/python/src/openvino/opset15/ops.py index 93aacb29572340..8e6b8bd46d5f7c 100644 --- a/src/bindings/python/src/openvino/runtime/opset15/ops.py +++ b/src/bindings/python/src/openvino/opset15/ops.py @@ -8,8 +8,8 @@ import numpy as np from openvino.runtime import Node, Type -from openvino.runtime.opset1 import convert_like -from openvino.runtime.opset14 import constant +from openvino.opset1 import convert_like +from openvino.opset14 import constant from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op from openvino.runtime.utils.types import NodeInput, as_nodes diff --git a/src/bindings/python/src/openvino/opset16/__init__.py b/src/bindings/python/src/openvino/opset16/__init__.py new file mode 100644 index 00000000000000..06fa9d2e7d0070 --- /dev/null +++ b/src/bindings/python/src/openvino/opset16/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +# New operations added in Opset16 +from openvino.opset16.ops import identity + +# Operators from previous opsets +# TODO (ticket: 156877): Add previous opset operators at the end of opset16 development diff --git a/src/bindings/python/src/openvino/runtime/opset16/ops.py b/src/bindings/python/src/openvino/opset16/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset16/ops.py rename to src/bindings/python/src/openvino/opset16/ops.py diff --git a/src/bindings/python/src/openvino/opset2/__init__.py b/src/bindings/python/src/openvino/opset2/__init__.py new file mode 100644 index 00000000000000..1306c89b5241d8 --- /dev/null +++ b/src/bindings/python/src/openvino/opset2/__init__.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset1.ops import broadcast +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset1.ops import non_max_suppression +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset2.ops import roi_pooling +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset1.ops import shape_of +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset1.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset2/ops.py b/src/bindings/python/src/openvino/opset2/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset2/ops.py rename to src/bindings/python/src/openvino/opset2/ops.py index 287232d114c6bc..45b33f5bc0288b 100644 --- a/src/bindings/python/src/openvino/runtime/opset2/ops.py +++ b/src/bindings/python/src/openvino/opset2/ops.py @@ -10,7 +10,7 @@ import warnings from openvino.runtime import Node, Shape -from openvino.runtime.op import Constant, Parameter +from openvino.op import Constant, Parameter from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset3/__init__.py b/src/bindings/python/src/openvino/opset3/__init__.py new file mode 100644 index 00000000000000..3a0baa675114f1 --- /dev/null +++ b/src/bindings/python/src/openvino/opset3/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset3.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset3.ops import scatter_elements_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset3/ops.py b/src/bindings/python/src/openvino/opset3/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset3/ops.py rename to src/bindings/python/src/openvino/opset3/ops.py index d3403dbbbd2be8..989f5819acb685 100644 --- a/src/bindings/python/src/openvino/runtime/opset3/ops.py +++ b/src/bindings/python/src/openvino/opset3/ops.py @@ -9,7 +9,7 @@ from functools import partial from openvino.runtime import Node, Shape -from openvino.runtime.op import Constant, Parameter +from openvino.op import Constant, Parameter from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset4/__init__.py b/src/bindings/python/src/openvino/opset4/__init__.py new file mode 100644 index 00000000000000..6096ec431c796e --- /dev/null +++ b/src/bindings/python/src/openvino/opset4/__init__.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset1.ops import hard_sigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset4.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset4/ops.py b/src/bindings/python/src/openvino/opset4/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset4/ops.py rename to src/bindings/python/src/openvino/opset4/ops.py index dce4879bdb38f6..4f6ba016852b02 100644 --- a/src/bindings/python/src/openvino/runtime/opset4/ops.py +++ b/src/bindings/python/src/openvino/opset4/ops.py @@ -9,7 +9,7 @@ from functools import partial from openvino.runtime import Node, Shape -from openvino.runtime.op import Constant, Parameter +from openvino.op import Constant, Parameter from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset5/__init__.py b/src/bindings/python/src/openvino/opset5/__init__.py new file mode 100644 index 00000000000000..202b8137093f57 --- /dev/null +++ b/src/bindings/python/src/openvino/opset5/__init__.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset5/ops.py b/src/bindings/python/src/openvino/opset5/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset5/ops.py rename to src/bindings/python/src/openvino/opset5/ops.py index 11e05aa1b7bcb4..20057b78c7c31d 100644 --- a/src/bindings/python/src/openvino/runtime/opset5/ops.py +++ b/src/bindings/python/src/openvino/opset5/ops.py @@ -9,7 +9,7 @@ from functools import partial from openvino.runtime import Node, Shape -from openvino.runtime.op import Constant, Parameter, loop +from openvino.op import Constant, Parameter, loop from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset6/__init__.py b/src/bindings/python/src/openvino/opset6/__init__.py new file mode 100644 index 00000000000000..315d80bc025a38 --- /dev/null +++ b/src/bindings/python/src/openvino/opset6/__init__.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset6/ops.py b/src/bindings/python/src/openvino/opset6/ops.py similarity index 97% rename from src/bindings/python/src/openvino/runtime/opset6/ops.py rename to src/bindings/python/src/openvino/opset6/ops.py index 3209d7a8a53c99..8020715f20dea3 100644 --- a/src/bindings/python/src/openvino/runtime/opset6/ops.py +++ b/src/bindings/python/src/openvino/opset6/ops.py @@ -10,9 +10,9 @@ from functools import partial, singledispatch from openvino.runtime import Node, Type, PartialShape, Output, Shape -from openvino.runtime.op import assign, Constant, Parameter -from openvino.runtime.op import read_value as _read_value -from openvino.runtime.op.util import VariableInfo, Variable +from openvino.op import assign, Constant, Parameter +from openvino.op import read_value as _read_value +from openvino.op.util import VariableInfo, Variable from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import nameable_op, overloading from openvino.runtime.utils.types import ( diff --git a/src/bindings/python/src/openvino/opset7/__init__.py b/src/bindings/python/src/openvino/opset7/__init__.py new file mode 100644 index 00000000000000..16703072285487 --- /dev/null +++ b/src/bindings/python/src/openvino/opset7/__init__.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset7.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset7/ops.py b/src/bindings/python/src/openvino/opset7/ops.py similarity index 98% rename from src/bindings/python/src/openvino/runtime/opset7/ops.py rename to src/bindings/python/src/openvino/opset7/ops.py index 7cadaa42b80443..59e09b64888eb1 100644 --- a/src/bindings/python/src/openvino/runtime/opset7/ops.py +++ b/src/bindings/python/src/openvino/opset7/ops.py @@ -8,7 +8,7 @@ import numpy as np from openvino.runtime import Node, Shape -from openvino.runtime.op import Constant, Parameter +from openvino.op import Constant, Parameter from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import binary_op, nameable_op, unary_op from openvino.runtime.utils.input_validation import ( diff --git a/src/bindings/python/src/openvino/opset8/__init__.py b/src/bindings/python/src/openvino/opset8/__init__.py new file mode 100644 index 00000000000000..e45c37863b193b --- /dev/null +++ b/src/bindings/python/src/openvino/opset8/__init__.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset1.ops import interpolate +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset8.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset8/ops.py b/src/bindings/python/src/openvino/opset8/ops.py similarity index 99% rename from src/bindings/python/src/openvino/runtime/opset8/ops.py rename to src/bindings/python/src/openvino/opset8/ops.py index f9176ecd32be14..05b97390baa780 100644 --- a/src/bindings/python/src/openvino/runtime/opset8/ops.py +++ b/src/bindings/python/src/openvino/opset8/ops.py @@ -8,7 +8,7 @@ import numpy as np from openvino.runtime.exceptions import UserInputError -from openvino.runtime.op import Constant, Parameter, if_op +from openvino.op import Constant, Parameter, if_op from openvino.runtime import Node from openvino.runtime.opset_utils import _get_node_factory from openvino.runtime.utils.decorators import nameable_op diff --git a/src/bindings/python/src/openvino/opset9/__init__.py b/src/bindings/python/src/openvino/opset9/__init__.py new file mode 100644 index 00000000000000..03051d46b58759 --- /dev/null +++ b/src/bindings/python/src/openvino/opset9/__init__.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset1.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset9/ops.py b/src/bindings/python/src/openvino/opset9/ops.py similarity index 100% rename from src/bindings/python/src/openvino/runtime/opset9/ops.py rename to src/bindings/python/src/openvino/opset9/ops.py diff --git a/src/bindings/python/src/openvino/runtime/__init__.py b/src/bindings/python/src/openvino/runtime/__init__.py index df2cab57bd0aba..e22e2be08cacea 100644 --- a/src/bindings/python/src/openvino/runtime/__init__.py +++ b/src/bindings/python/src/openvino/runtime/__init__.py @@ -58,6 +58,9 @@ from openvino.runtime import opset11 from openvino.runtime import opset12 from openvino.runtime import opset13 +from openvino.runtime import opset14 +from openvino.runtime import opset15 +from openvino.runtime import opset16 # Import properties API from openvino.runtime import properties diff --git a/src/bindings/python/src/openvino/runtime/op/__init__.py b/src/bindings/python/src/openvino/runtime/op/__init__.py index ee324dd76380f7..d7dd935d05f8d3 100644 --- a/src/bindings/python/src/openvino/runtime/op/__init__.py +++ b/src/bindings/python/src/openvino/runtime/op/__init__.py @@ -8,12 +8,12 @@ # flake8: noqa -from openvino._pyopenvino.op import Constant -from openvino._pyopenvino.op import assign -from openvino._pyopenvino.op import _PagedAttentionExtension -from openvino._pyopenvino.op import Parameter -from openvino._pyopenvino.op import if_op -from openvino._pyopenvino.op import loop -from openvino._pyopenvino.op import tensor_iterator -from openvino._pyopenvino.op import read_value -from openvino._pyopenvino.op import Result +from openvino.op import Constant +from openvino.op import assign +from openvino.op import _PagedAttentionExtension +from openvino.op import Parameter +from openvino.op import if_op +from openvino.op import loop +from openvino.op import tensor_iterator +from openvino.op import read_value +from openvino.op import Result diff --git a/src/bindings/python/src/openvino/runtime/op/util/__init__.py b/src/bindings/python/src/openvino/runtime/op/util/__init__.py index 0c946b115f451e..642434446c247d 100644 --- a/src/bindings/python/src/openvino/runtime/op/util/__init__.py +++ b/src/bindings/python/src/openvino/runtime/op/util/__init__.py @@ -7,16 +7,16 @@ """ # flake8: noqa -from openvino._pyopenvino.op.util import UnaryElementwiseArithmetic -from openvino._pyopenvino.op.util import BinaryElementwiseComparison -from openvino._pyopenvino.op.util import BinaryElementwiseArithmetic -from openvino._pyopenvino.op.util import BinaryElementwiseLogical -from openvino._pyopenvino.op.util import ArithmeticReduction -from openvino._pyopenvino.op.util import IndexReduction -from openvino._pyopenvino.op.util import VariableInfo -from openvino._pyopenvino.op.util import Variable -from openvino._pyopenvino.op.util import MergedInputDescription -from openvino._pyopenvino.op.util import InvariantInputDescription -from openvino._pyopenvino.op.util import SliceInputDescription -from openvino._pyopenvino.op.util import ConcatOutputDescription -from openvino._pyopenvino.op.util import BodyOutputDescription +from openvino.op.util import UnaryElementwiseArithmetic +from openvino.op.util import BinaryElementwiseComparison +from openvino.op.util import BinaryElementwiseArithmetic +from openvino.op.util import BinaryElementwiseLogical +from openvino.op.util import ArithmeticReduction +from openvino.op.util import IndexReduction +from openvino.op.util import VariableInfo +from openvino.op.util import Variable +from openvino.op.util import MergedInputDescription +from openvino.op.util import InvariantInputDescription +from openvino.op.util import SliceInputDescription +from openvino.op.util import ConcatOutputDescription +from openvino.op.util import BodyOutputDescription diff --git a/src/bindings/python/src/openvino/runtime/opset1/__init__.py b/src/bindings/python/src/openvino/runtime/opset1/__init__.py index ca7e1aef385b2a..35ceec6b0d9892 100644 --- a/src/bindings/python/src/openvino/runtime/opset1/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset1/__init__.py @@ -2,110 +2,110 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset1.ops import batch_norm_inference -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset1.ops import broadcast -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset1.ops import lstm_cell -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset1.ops import non_max_suppression -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset1.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset1.ops import shape_of -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset1.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset1.ops import binary_convolution +from openvino.opset1.ops import broadcast +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset1.ops import negative +from openvino.opset1.ops import non_max_suppression +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset1.ops import shape_of +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset1.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset1/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset1/ops/__init__.py new file mode 100644 index 00000000000000..acdd7d8becf465 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset1/ops/__init__.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset1.ops import absolute +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset1.ops import binary_convolution +from openvino.opset1.ops import broadcast +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset1.ops import negative +from openvino.opset1.ops import non_max_suppression +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset1.ops import shape_of +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset1.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset10/__init__.py b/src/bindings/python/src/openvino/runtime/opset10/__init__.py index 29ebcb27039abc..659cb99bb8644d 100644 --- a/src/bindings/python/src/openvino/runtime/opset10/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset10/__init__.py @@ -2,178 +2,178 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset10.ops import interpolate -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset10.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset10/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset10/ops/__init__.py new file mode 100644 index 00000000000000..f6c134d9ab563e --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset10/ops/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset10.ops import interpolate +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset10.ops import unique diff --git a/src/bindings/python/src/openvino/runtime/opset11/__init__.py b/src/bindings/python/src/openvino/runtime/opset11/__init__.py index b692741257d435..2a07b9fab9f2c4 100644 --- a/src/bindings/python/src/openvino/runtime/opset11/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset11/__init__.py @@ -2,178 +2,178 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset11.ops import interpolate -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset11.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset11/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset11/ops/__init__.py new file mode 100644 index 00000000000000..2ef74d4a6b58db --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset11/ops/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset11.ops import interpolate +from openvino.opset11.ops import topk diff --git a/src/bindings/python/src/openvino/runtime/opset12/__init__.py b/src/bindings/python/src/openvino/runtime/opset12/__init__.py index 381d82ce8c9be1..1187f2c83e6a05 100644 --- a/src/bindings/python/src/openvino/runtime/opset12/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset12/__init__.py @@ -2,179 +2,179 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset12.ops import group_normalization -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset11.ops import interpolate -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset12.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset4.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset12.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset11.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset12/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset12/ops/__init__.py new file mode 100644 index 00000000000000..b6ba8fe643b381 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset12/ops/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset12.ops import group_normalization +from openvino.opset12.ops import pad +from openvino.opset12.ops import scatter_elements_update diff --git a/src/bindings/python/src/openvino/runtime/opset13/__init__.py b/src/bindings/python/src/openvino/runtime/opset13/__init__.py index 7f330fbc87766d..ab3f541e8f831c 100644 --- a/src/bindings/python/src/openvino/runtime/opset13/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset13/__init__.py @@ -2,187 +2,187 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset13.ops import bitwise_and -from openvino.runtime.opset13.ops import bitwise_not -from openvino.runtime.opset13.ops import bitwise_or -from openvino.runtime.opset13.ops import bitwise_xor -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset13.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset13.ops import fake_convert -from openvino.runtime.opset13.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset12.ops import group_normalization -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset11.ops import interpolate -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset13.ops import multinomial -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset13.ops import nms_rotated -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset12.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset4.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset13.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset13.ops import scaled_dot_product_attention -from openvino.runtime.opset12.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset11.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset13/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset13/ops/__init__.py new file mode 100644 index 00000000000000..edc66e873e4779 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset13/ops/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset13.ops import constant +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset13.ops import multinomial +from openvino.opset13.ops import nms_rotated +from openvino.opset13.ops import result +from openvino.opset13.ops import scaled_dot_product_attention diff --git a/src/bindings/python/src/openvino/runtime/opset14/__init__.py b/src/bindings/python/src/openvino/runtime/opset14/__init__.py index 52ac785bd723e5..8a503a333bd3e1 100644 --- a/src/bindings/python/src/openvino/runtime/opset14/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset14/__init__.py @@ -2,189 +2,189 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset14.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset13.ops import bitwise_and -from openvino.runtime.opset13.ops import bitwise_not -from openvino.runtime.opset13.ops import bitwise_or -from openvino.runtime.opset13.ops import bitwise_xor -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset13.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset14.ops import convert_promote_types -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset13.ops import fake_convert -from openvino.runtime.opset13.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset12.ops import group_normalization -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset11.ops import interpolate -from openvino.runtime.opset14.ops import inverse -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset14.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset13.ops import multinomial -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset13.ops import nms_rotated -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset12.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset4.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset13.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset13.ops import scaled_dot_product_attention -from openvino.runtime.opset12.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset11.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset14.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset14.ops import convert_promote_types +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset14.ops import inverse +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset14.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset14/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset14/ops/__init__.py new file mode 100644 index 00000000000000..8f5d09b5d0733e --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset14/ops/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset14.ops import avg_pool +from openvino.opset14.ops import convert_promote_types +from openvino.opset14.ops import inverse +from openvino.opset14.ops import max_pool diff --git a/src/bindings/python/src/openvino/runtime/opset15/__init__.py b/src/bindings/python/src/openvino/runtime/opset15/__init__.py index c4dd48d9087ae1..d5b93924a69e6e 100644 --- a/src/bindings/python/src/openvino/runtime/opset15/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset15/__init__.py @@ -3,202 +3,202 @@ # SPDX-License-Identifier: Apache-2.0 # New operations added in Opset15 -from openvino.runtime.opset15.ops import col2im -from openvino.runtime.opset15.ops import embedding_bag_offsets -from openvino.runtime.opset15.ops import embedding_bag_packed -from openvino.runtime.opset15.ops import scatter_nd_update -from openvino.runtime.opset15.ops import roi_align_rotated -from openvino.runtime.opset15.ops import string_tensor_pack -from openvino.runtime.opset15.ops import string_tensor_unpack -from openvino.runtime.opset15.ops import bitwise_left_shift -from openvino.runtime.opset15.ops import bitwise_right_shift -from openvino.runtime.opset15.ops import slice_scatter +from openvino.opset15.ops import col2im +from openvino.opset15.ops import embedding_bag_offsets +from openvino.opset15.ops import embedding_bag_packed +from openvino.opset15.ops import scatter_nd_update +from openvino.opset15.ops import roi_align_rotated +from openvino.opset15.ops import string_tensor_pack +from openvino.opset15.ops import string_tensor_unpack +from openvino.opset15.ops import bitwise_left_shift +from openvino.opset15.ops import bitwise_right_shift +from openvino.opset15.ops import slice_scatter # Operators from previous opsets -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset14.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset13.ops import bitwise_and -from openvino.runtime.opset13.ops import bitwise_not -from openvino.runtime.opset13.ops import bitwise_or -from openvino.runtime.opset13.ops import bitwise_xor -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset13.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset14.ops import convert_promote_types -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset13.ops import fake_convert -from openvino.runtime.opset13.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset12.ops import group_normalization -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset11.ops import interpolate -from openvino.runtime.opset14.ops import inverse -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset10.ops import is_finite -from openvino.runtime.opset10.ops import is_inf -from openvino.runtime.opset10.ops import is_nan -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset14.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset13.ops import multinomial -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset13.ops import nms_rotated -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset12.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset4.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset13.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset13.ops import scaled_dot_product_attention -from openvino.runtime.opset12.ops import scatter_elements_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset15.ops import search_sorted -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset15.ops import squeeze -from openvino.runtime.opset15.ops import stft -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset11.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset10.ops import unique -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset14.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset13.ops import bitwise_and +from openvino.opset13.ops import bitwise_not +from openvino.opset13.ops import bitwise_or +from openvino.opset13.ops import bitwise_xor +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset13.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset14.ops import convert_promote_types +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset13.ops import fake_convert +from openvino.opset13.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset12.ops import group_normalization +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset11.ops import interpolate +from openvino.opset14.ops import inverse +from openvino.opset9.ops import irdft +from openvino.opset10.ops import is_finite +from openvino.opset10.ops import is_inf +from openvino.opset10.ops import is_nan +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset14.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset13.ops import multinomial +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset13.ops import nms_rotated +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset12.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset13.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset13.ops import scaled_dot_product_attention +from openvino.opset12.ops import scatter_elements_update +from openvino.opset3.ops import scatter_update +from openvino.opset15.ops import search_sorted +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset15.ops import squeeze +from openvino.opset15.ops import stft +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset11.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset10.ops import unique +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset15/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset15/ops/__init__.py new file mode 100644 index 00000000000000..57543286d31543 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset15/ops/__init__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset15.ops import col2im +from openvino.opset15.ops import embedding_bag_offsets +from openvino.opset15.ops import embedding_bag_packed +from openvino.opset15.ops import scatter_nd_update +from openvino.opset15.ops import roi_align_rotated +from openvino.opset15.ops import string_tensor_pack +from openvino.opset15.ops import string_tensor_unpack +from openvino.opset15.ops import bitwise_left_shift +from openvino.opset15.ops import bitwise_right_shift +from openvino.opset15.ops import slice_scatter +from openvino.opset15.ops import search_sorted +from openvino.opset15.ops import squeeze +from openvino.opset15.ops import stft diff --git a/src/bindings/python/src/openvino/runtime/opset16/__init__.py b/src/bindings/python/src/openvino/runtime/opset16/__init__.py index ce52690e919fc3..06fa9d2e7d0070 100644 --- a/src/bindings/python/src/openvino/runtime/opset16/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset16/__init__.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # New operations added in Opset16 -from openvino.runtime.opset16.ops import identity +from openvino.opset16.ops import identity # Operators from previous opsets # TODO (ticket: 156877): Add previous opset operators at the end of opset16 development diff --git a/src/bindings/python/src/openvino/runtime/opset16/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset16/ops/__init__.py new file mode 100644 index 00000000000000..d28ce61bd00d54 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset16/ops/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset16.ops import identity diff --git a/src/bindings/python/src/openvino/runtime/opset2/__init__.py b/src/bindings/python/src/openvino/runtime/opset2/__init__.py index 6624149e157e9e..1306c89b5241d8 100644 --- a/src/bindings/python/src/openvino/runtime/opset2/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset2/__init__.py @@ -2,116 +2,116 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset1.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset1.ops import broadcast -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset2.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset1.ops import lstm_cell -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset2.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset1.ops import non_max_suppression -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset1.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset1.ops import shape_of -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset1.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset1.ops import broadcast +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset1.ops import non_max_suppression +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset2.ops import roi_pooling +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset1.ops import shape_of +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset1.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset2/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset2/ops/__init__.py new file mode 100644 index 00000000000000..89d30e8521e6d8 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset2/ops/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset2.ops import batch_to_space +from openvino.opset2.ops import gelu +from openvino.opset2.ops import mvn +from openvino.opset2.ops import reorg_yolo +from openvino.opset2.ops import roi_pooling +from openvino.opset2.ops import space_to_batch diff --git a/src/bindings/python/src/openvino/runtime/opset3/__init__.py b/src/bindings/python/src/openvino/runtime/opset3/__init__.py index 5bd68912cae807..3a0baa675114f1 100644 --- a/src/bindings/python/src/openvino/runtime/opset3/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset3/__init__.py @@ -2,132 +2,132 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset3.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset1.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset2.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset1.ops import lstm_cell -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset2.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset3.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset1.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset3.ops import read_value -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset1.ops import hard_sigmoid +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset1.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset3.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset1.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset3.ops import scatter_elements_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset3/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset3/ops/__init__.py new file mode 100644 index 00000000000000..b8af66f9b514c8 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset3/ops/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset3.ops import assign +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset3.ops import gru_cell +from openvino.opset3.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset3.ops import read_value +from openvino.opset3.ops import rnn_cell +from openvino.opset3.ops import roi_align +from openvino.opset3.ops import scatter_elements_update +from openvino.opset3.ops import scatter_update +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset3.ops import topk diff --git a/src/bindings/python/src/openvino/runtime/opset4/__init__.py b/src/bindings/python/src/openvino/runtime/opset4/__init__.py index e7cef8eb216d17..6096ec431c796e 100644 --- a/src/bindings/python/src/openvino/runtime/opset4/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset4/__init__.py @@ -2,143 +2,143 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset3.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset1.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset2.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset2.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset4.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset3.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset1.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset1.ops import hard_sigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset4.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset4/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset4/ops/__init__.py new file mode 100644 index 00000000000000..d70649a6b1db17 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset4/ops/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset4.ops import acosh +from openvino.opset4.ops import asinh +from openvino.opset4.ops import atanh +from openvino.opset4.ops import ctc_loss +from openvino.opset4.ops import hswish +from openvino.opset4.ops import lstm_cell +from openvino.opset4.ops import mish +from openvino.opset4.ops import non_max_suppression +from openvino.opset4.ops import proposal +from openvino.opset4.ops import range +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset4.ops import scatter_nd_update +from openvino.opset4.ops import softplus +from openvino.opset4.ops import swish diff --git a/src/bindings/python/src/openvino/runtime/opset5/__init__.py b/src/bindings/python/src/openvino/runtime/opset5/__init__.py index 6d68b3e8d9f9cb..202b8137093f57 100644 --- a/src/bindings/python/src/openvino/runtime/opset5/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset5/__init__.py @@ -2,151 +2,151 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset3.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset5.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset2.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset2.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset5.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset3.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset3.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset2.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset3.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset5/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset5/ops/__init__.py new file mode 100644 index 00000000000000..610622780c6f01 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset5/ops/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset5.ops import batch_norm_inference +from openvino.opset5.ops import gather_nd +from openvino.opset5.ops import gru_sequence +from openvino.opset5.ops import hsigmoid +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset5.ops import lstm_sequence +from openvino.opset5.ops import non_max_suppression +from openvino.opset5.ops import rnn_sequence +from openvino.opset5.ops import round diff --git a/src/bindings/python/src/openvino/runtime/opset6/__init__.py b/src/bindings/python/src/openvino/runtime/opset6/__init__.py index 2b2babb00c5021..315d80bc025a38 100644 --- a/src/bindings/python/src/openvino/runtime/opset6/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset6/__init__.py @@ -2,153 +2,153 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset1.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset5.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset2.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset5.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset1.ops import divide +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset1.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset2.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset6/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset6/ops/__init__.py new file mode 100644 index 00000000000000..fb23fe96e5e51f --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset6/ops/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0from openvino.opset6.ops import assign + +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset6.ops import gather_elements +from openvino.opset6.ops import mvn +from openvino.opset6.ops import read_value diff --git a/src/bindings/python/src/openvino/runtime/opset7/__init__.py b/src/bindings/python/src/openvino/runtime/opset7/__init__.py index 9ee692cea75f59..16703072285487 100644 --- a/src/bindings/python/src/openvino/runtime/opset7/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset7/__init__.py @@ -2,157 +2,157 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset1.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset1.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset7.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset5.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset1.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset5.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset1.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset1.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset1.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset1.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset7.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset5.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset1.ops import interpolate +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset1.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset1.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset1.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset7/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset7/ops/__init__.py new file mode 100644 index 00000000000000..9517e795d355d3 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset7/ops/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset7.ops import dft +from openvino.opset7.ops import einsum +from openvino.opset7.ops import gather +from openvino.opset7.ops import gelu +from openvino.opset7.ops import idft +from openvino.opset7.ops import roll diff --git a/src/bindings/python/src/openvino/runtime/opset8/__init__.py b/src/bindings/python/src/openvino/runtime/opset8/__init__.py index bf6be68ca0cbc6..e45c37863b193b 100644 --- a/src/bindings/python/src/openvino/runtime/opset8/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset8/__init__.py @@ -2,168 +2,168 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset8.ops import multiclass_nms -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset5.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset3.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset1.ops import interpolate +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset8.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset5.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset3.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset8/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset8/ops/__init__.py new file mode 100644 index 00000000000000..053708521a6dae --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset8/ops/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset8.ops import deformable_convolution +from openvino.opset8.ops import detection_output +from openvino.opset8.ops import gather +from openvino.opset8.ops import gather_nd +from openvino.opset8.ops import if_op +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset8.ops import multiclass_nms +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset8.ops import prior_box +from openvino.opset8.ops import random_uniform +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax diff --git a/src/bindings/python/src/openvino/runtime/opset9/__init__.py b/src/bindings/python/src/openvino/runtime/opset9/__init__.py index 138ecdbdcd5d33..03051d46b58759 100644 --- a/src/bindings/python/src/openvino/runtime/opset9/__init__.py +++ b/src/bindings/python/src/openvino/runtime/opset9/__init__.py @@ -2,174 +2,174 @@ # Copyright (C) 2018-2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from openvino.runtime.opset1.ops import absolute -from openvino.runtime.opset1.ops import absolute as abs -from openvino.runtime.opset1.ops import acos -from openvino.runtime.opset4.ops import acosh -from openvino.runtime.opset8.ops import adaptive_avg_pool -from openvino.runtime.opset8.ops import adaptive_max_pool -from openvino.runtime.opset1.ops import add -from openvino.runtime.opset1.ops import asin -from openvino.runtime.opset4.ops import asinh -from openvino.runtime.opset6.ops import assign -from openvino.runtime.opset1.ops import atan -from openvino.runtime.opset4.ops import atanh -from openvino.runtime.opset1.ops import avg_pool -from openvino.runtime.opset5.ops import batch_norm_inference -from openvino.runtime.opset2.ops import batch_to_space -from openvino.runtime.opset1.ops import binary_convolution -from openvino.runtime.opset3.ops import broadcast -from openvino.runtime.opset3.ops import bucketize -from openvino.runtime.opset1.ops import ceiling -from openvino.runtime.opset1.ops import ceiling as ceil -from openvino.runtime.opset1.ops import clamp -from openvino.runtime.opset1.ops import concat -from openvino.runtime.opset1.ops import constant -from openvino.runtime.opset1.ops import convert -from openvino.runtime.opset1.ops import convert_like -from openvino.runtime.opset1.ops import convolution -from openvino.runtime.opset1.ops import convolution_backprop_data -from openvino.runtime.opset1.ops import cos -from openvino.runtime.opset1.ops import cosh -from openvino.runtime.opset1.ops import ctc_greedy_decoder -from openvino.runtime.opset6.ops import ctc_greedy_decoder_seq_len -from openvino.runtime.opset4.ops import ctc_loss -from openvino.runtime.opset3.ops import cum_sum -from openvino.runtime.opset3.ops import cum_sum as cumsum -from openvino.runtime.opset8.ops import deformable_convolution -from openvino.runtime.opset1.ops import deformable_psroi_pooling -from openvino.runtime.opset1.ops import depth_to_space -from openvino.runtime.opset8.ops import detection_output -from openvino.runtime.opset7.ops import dft -from openvino.runtime.opset1.ops import divide -from openvino.runtime.opset7.ops import einsum -from openvino.runtime.opset1.ops import elu -from openvino.runtime.opset3.ops import embedding_bag_offsets_sum -from openvino.runtime.opset3.ops import embedding_bag_packed_sum -from openvino.runtime.opset3.ops import embedding_segments_sum -from openvino.runtime.opset3.ops import extract_image_patches -from openvino.runtime.opset1.ops import equal -from openvino.runtime.opset1.ops import erf -from openvino.runtime.opset1.ops import exp -from openvino.runtime.opset9.ops import eye -from openvino.runtime.opset1.ops import fake_quantize -from openvino.runtime.opset1.ops import floor -from openvino.runtime.opset1.ops import floor_mod -from openvino.runtime.opset8.ops import gather -from openvino.runtime.opset6.ops import gather_elements -from openvino.runtime.opset8.ops import gather_nd -from openvino.runtime.opset1.ops import gather_tree -from openvino.runtime.opset7.ops import gelu -from openvino.runtime.opset9.ops import generate_proposals -from openvino.runtime.opset1.ops import greater -from openvino.runtime.opset1.ops import greater_equal -from openvino.runtime.opset9.ops import grid_sample -from openvino.runtime.opset1.ops import grn -from openvino.runtime.opset1.ops import group_convolution -from openvino.runtime.opset1.ops import group_convolution_backprop_data -from openvino.runtime.opset3.ops import gru_cell -from openvino.runtime.opset5.ops import gru_sequence -from openvino.runtime.opset1.ops import hard_sigmoid -from openvino.runtime.opset5.ops import hsigmoid -from openvino.runtime.opset4.ops import hswish -from openvino.runtime.opset7.ops import idft -from openvino.runtime.opset8.ops import if_op -from openvino.runtime.opset1.ops import interpolate -from openvino.runtime.opset9.ops import irdft -from openvino.runtime.opset8.ops import i420_to_bgr -from openvino.runtime.opset8.ops import i420_to_rgb -from openvino.runtime.opset1.ops import less -from openvino.runtime.opset1.ops import less_equal -from openvino.runtime.opset1.ops import log -from openvino.runtime.opset1.ops import logical_and -from openvino.runtime.opset1.ops import logical_not -from openvino.runtime.opset1.ops import logical_or -from openvino.runtime.opset1.ops import logical_xor -from openvino.runtime.opset5.ops import log_softmax -from openvino.runtime.opset5.ops import loop -from openvino.runtime.opset1.ops import lrn -from openvino.runtime.opset4.ops import lstm_cell -from openvino.runtime.opset5.ops import lstm_sequence -from openvino.runtime.opset1.ops import matmul -from openvino.runtime.opset8.ops import matrix_nms -from openvino.runtime.opset8.ops import max_pool -from openvino.runtime.opset1.ops import maximum -from openvino.runtime.opset1.ops import minimum -from openvino.runtime.opset4.ops import mish -from openvino.runtime.opset1.ops import mod -from openvino.runtime.opset9.ops import multiclass_nms -from openvino.runtime.opset1.ops import multiply -from openvino.runtime.opset6.ops import mvn -from openvino.runtime.opset1.ops import negative -from openvino.runtime.opset9.ops import non_max_suppression -from openvino.runtime.opset3.ops import non_zero -from openvino.runtime.opset1.ops import normalize_l2 -from openvino.runtime.opset1.ops import not_equal -from openvino.runtime.opset8.ops import nv12_to_bgr -from openvino.runtime.opset8.ops import nv12_to_rgb -from openvino.runtime.opset1.ops import one_hot -from openvino.runtime.opset1.ops import pad -from openvino.runtime.opset1.ops import parameter -from openvino.runtime.opset1.ops import power -from openvino.runtime.opset1.ops import prelu -from openvino.runtime.opset8.ops import prior_box -from openvino.runtime.opset1.ops import prior_box_clustered -from openvino.runtime.opset1.ops import psroi_pooling -from openvino.runtime.opset4.ops import proposal -from openvino.runtime.opset1.ops import range -from openvino.runtime.opset8.ops import random_uniform -from openvino.runtime.opset9.ops import rdft -from openvino.runtime.opset6.ops import read_value -from openvino.runtime.opset4.ops import reduce_l1 -from openvino.runtime.opset4.ops import reduce_l2 -from openvino.runtime.opset1.ops import reduce_logical_and -from openvino.runtime.opset1.ops import reduce_logical_or -from openvino.runtime.opset1.ops import reduce_max -from openvino.runtime.opset1.ops import reduce_mean -from openvino.runtime.opset1.ops import reduce_min -from openvino.runtime.opset1.ops import reduce_prod -from openvino.runtime.opset1.ops import reduce_sum -from openvino.runtime.opset1.ops import region_yolo -from openvino.runtime.opset2.ops import reorg_yolo -from openvino.runtime.opset1.ops import relu -from openvino.runtime.opset1.ops import reshape -from openvino.runtime.opset1.ops import result -from openvino.runtime.opset1.ops import reverse_sequence -from openvino.runtime.opset3.ops import rnn_cell -from openvino.runtime.opset5.ops import rnn_sequence -from openvino.runtime.opset9.ops import roi_align -from openvino.runtime.opset2.ops import roi_pooling -from openvino.runtime.opset7.ops import roll -from openvino.runtime.opset5.ops import round -from openvino.runtime.opset3.ops import scatter_elements_update -from openvino.runtime.opset4.ops import scatter_nd_update -from openvino.runtime.opset3.ops import scatter_update -from openvino.runtime.opset1.ops import select -from openvino.runtime.opset1.ops import selu -from openvino.runtime.opset3.ops import shape_of -from openvino.runtime.opset3.ops import shuffle_channels -from openvino.runtime.opset1.ops import sigmoid -from openvino.runtime.opset1.ops import sign -from openvino.runtime.opset1.ops import sin -from openvino.runtime.opset1.ops import sinh -from openvino.runtime.opset8.ops import slice -from openvino.runtime.opset8.ops import softmax -from openvino.runtime.opset4.ops import softplus -from openvino.runtime.opset9.ops import softsign -from openvino.runtime.opset2.ops import space_to_batch -from openvino.runtime.opset1.ops import space_to_depth -from openvino.runtime.opset1.ops import split -from openvino.runtime.opset1.ops import sqrt -from openvino.runtime.opset1.ops import squared_difference -from openvino.runtime.opset1.ops import squeeze -from openvino.runtime.opset1.ops import strided_slice -from openvino.runtime.opset1.ops import subtract -from openvino.runtime.opset4.ops import swish -from openvino.runtime.opset1.ops import tan -from openvino.runtime.opset1.ops import tanh -from openvino.runtime.opset1.ops import tensor_iterator -from openvino.runtime.opset1.ops import tile -from openvino.runtime.opset3.ops import topk -from openvino.runtime.opset1.ops import transpose -from openvino.runtime.opset1.ops import unsqueeze -from openvino.runtime.opset1.ops import variadic_split +from openvino.opset1.ops import absolute +from openvino.opset1.ops import absolute as abs +from openvino.opset1.ops import acos +from openvino.opset4.ops import acosh +from openvino.opset8.ops import adaptive_avg_pool +from openvino.opset8.ops import adaptive_max_pool +from openvino.opset1.ops import add +from openvino.opset1.ops import asin +from openvino.opset4.ops import asinh +from openvino.opset6.ops import assign +from openvino.opset1.ops import atan +from openvino.opset4.ops import atanh +from openvino.opset1.ops import avg_pool +from openvino.opset5.ops import batch_norm_inference +from openvino.opset2.ops import batch_to_space +from openvino.opset1.ops import binary_convolution +from openvino.opset3.ops import broadcast +from openvino.opset3.ops import bucketize +from openvino.opset1.ops import ceiling +from openvino.opset1.ops import ceiling as ceil +from openvino.opset1.ops import clamp +from openvino.opset1.ops import concat +from openvino.opset1.ops import constant +from openvino.opset1.ops import convert +from openvino.opset1.ops import convert_like +from openvino.opset1.ops import convolution +from openvino.opset1.ops import convolution_backprop_data +from openvino.opset1.ops import cos +from openvino.opset1.ops import cosh +from openvino.opset1.ops import ctc_greedy_decoder +from openvino.opset6.ops import ctc_greedy_decoder_seq_len +from openvino.opset4.ops import ctc_loss +from openvino.opset3.ops import cum_sum +from openvino.opset3.ops import cum_sum as cumsum +from openvino.opset8.ops import deformable_convolution +from openvino.opset1.ops import deformable_psroi_pooling +from openvino.opset1.ops import depth_to_space +from openvino.opset8.ops import detection_output +from openvino.opset7.ops import dft +from openvino.opset1.ops import divide +from openvino.opset7.ops import einsum +from openvino.opset1.ops import elu +from openvino.opset3.ops import embedding_bag_offsets_sum +from openvino.opset3.ops import embedding_bag_packed_sum +from openvino.opset3.ops import embedding_segments_sum +from openvino.opset3.ops import extract_image_patches +from openvino.opset1.ops import equal +from openvino.opset1.ops import erf +from openvino.opset1.ops import exp +from openvino.opset9.ops import eye +from openvino.opset1.ops import fake_quantize +from openvino.opset1.ops import floor +from openvino.opset1.ops import floor_mod +from openvino.opset8.ops import gather +from openvino.opset6.ops import gather_elements +from openvino.opset8.ops import gather_nd +from openvino.opset1.ops import gather_tree +from openvino.opset7.ops import gelu +from openvino.opset9.ops import generate_proposals +from openvino.opset1.ops import greater +from openvino.opset1.ops import greater_equal +from openvino.opset9.ops import grid_sample +from openvino.opset1.ops import grn +from openvino.opset1.ops import group_convolution +from openvino.opset1.ops import group_convolution_backprop_data +from openvino.opset3.ops import gru_cell +from openvino.opset5.ops import gru_sequence +from openvino.opset1.ops import hard_sigmoid +from openvino.opset5.ops import hsigmoid +from openvino.opset4.ops import hswish +from openvino.opset7.ops import idft +from openvino.opset8.ops import if_op +from openvino.opset1.ops import interpolate +from openvino.opset9.ops import irdft +from openvino.opset8.ops import i420_to_bgr +from openvino.opset8.ops import i420_to_rgb +from openvino.opset1.ops import less +from openvino.opset1.ops import less_equal +from openvino.opset1.ops import log +from openvino.opset1.ops import logical_and +from openvino.opset1.ops import logical_not +from openvino.opset1.ops import logical_or +from openvino.opset1.ops import logical_xor +from openvino.opset5.ops import log_softmax +from openvino.opset5.ops import loop +from openvino.opset1.ops import lrn +from openvino.opset4.ops import lstm_cell +from openvino.opset5.ops import lstm_sequence +from openvino.opset1.ops import matmul +from openvino.opset8.ops import matrix_nms +from openvino.opset8.ops import max_pool +from openvino.opset1.ops import maximum +from openvino.opset1.ops import minimum +from openvino.opset4.ops import mish +from openvino.opset1.ops import mod +from openvino.opset9.ops import multiclass_nms +from openvino.opset1.ops import multiply +from openvino.opset6.ops import mvn +from openvino.opset1.ops import negative +from openvino.opset9.ops import non_max_suppression +from openvino.opset3.ops import non_zero +from openvino.opset1.ops import normalize_l2 +from openvino.opset1.ops import not_equal +from openvino.opset8.ops import nv12_to_bgr +from openvino.opset8.ops import nv12_to_rgb +from openvino.opset1.ops import one_hot +from openvino.opset1.ops import pad +from openvino.opset1.ops import parameter +from openvino.opset1.ops import power +from openvino.opset1.ops import prelu +from openvino.opset8.ops import prior_box +from openvino.opset1.ops import prior_box_clustered +from openvino.opset1.ops import psroi_pooling +from openvino.opset4.ops import proposal +from openvino.opset1.ops import range +from openvino.opset8.ops import random_uniform +from openvino.opset9.ops import rdft +from openvino.opset6.ops import read_value +from openvino.opset4.ops import reduce_l1 +from openvino.opset4.ops import reduce_l2 +from openvino.opset1.ops import reduce_logical_and +from openvino.opset1.ops import reduce_logical_or +from openvino.opset1.ops import reduce_max +from openvino.opset1.ops import reduce_mean +from openvino.opset1.ops import reduce_min +from openvino.opset1.ops import reduce_prod +from openvino.opset1.ops import reduce_sum +from openvino.opset1.ops import region_yolo +from openvino.opset2.ops import reorg_yolo +from openvino.opset1.ops import relu +from openvino.opset1.ops import reshape +from openvino.opset1.ops import result +from openvino.opset1.ops import reverse_sequence +from openvino.opset3.ops import rnn_cell +from openvino.opset5.ops import rnn_sequence +from openvino.opset9.ops import roi_align +from openvino.opset2.ops import roi_pooling +from openvino.opset7.ops import roll +from openvino.opset5.ops import round +from openvino.opset3.ops import scatter_elements_update +from openvino.opset4.ops import scatter_nd_update +from openvino.opset3.ops import scatter_update +from openvino.opset1.ops import select +from openvino.opset1.ops import selu +from openvino.opset3.ops import shape_of +from openvino.opset3.ops import shuffle_channels +from openvino.opset1.ops import sigmoid +from openvino.opset1.ops import sign +from openvino.opset1.ops import sin +from openvino.opset1.ops import sinh +from openvino.opset8.ops import slice +from openvino.opset8.ops import softmax +from openvino.opset4.ops import softplus +from openvino.opset9.ops import softsign +from openvino.opset2.ops import space_to_batch +from openvino.opset1.ops import space_to_depth +from openvino.opset1.ops import split +from openvino.opset1.ops import sqrt +from openvino.opset1.ops import squared_difference +from openvino.opset1.ops import squeeze +from openvino.opset1.ops import strided_slice +from openvino.opset1.ops import subtract +from openvino.opset4.ops import swish +from openvino.opset1.ops import tan +from openvino.opset1.ops import tanh +from openvino.opset1.ops import tensor_iterator +from openvino.opset1.ops import tile +from openvino.opset3.ops import topk +from openvino.opset1.ops import transpose +from openvino.opset1.ops import unsqueeze +from openvino.opset1.ops import variadic_split diff --git a/src/bindings/python/src/openvino/runtime/opset9/ops/__init__.py b/src/bindings/python/src/openvino/runtime/opset9/ops/__init__.py new file mode 100644 index 00000000000000..a82d349508c058 --- /dev/null +++ b/src/bindings/python/src/openvino/runtime/opset9/ops/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018-2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +from openvino.opset9.ops import eye +from openvino.opset9.ops import generate_proposals +from openvino.opset9.ops import grid_sample +from openvino.opset9.ops import irdft +from openvino.opset9.ops import multiclass_nms +from openvino.opset9.ops import non_max_suppression +from openvino.opset9.ops import rdft +from openvino.opset9.ops import roi_align +from openvino.opset9.ops import softsign diff --git a/tools/benchmark_tool/openvino/__init__.py b/tools/benchmark_tool/openvino/__init__.py index 57f03f00c2eebf..e4d1a247520332 100644 --- a/tools/benchmark_tool/openvino/__init__.py +++ b/tools/benchmark_tool/openvino/__init__.py @@ -56,6 +56,24 @@ from openvino._pyopenvino import RemoteTensor from openvino._pyopenvino import Op +# Import opsets +from openvino import opset1 +from openvino import opset2 +from openvino import opset3 +from openvino import opset4 +from openvino import opset5 +from openvino import opset6 +from openvino import opset7 +from openvino import opset8 +from openvino import opset9 +from openvino import opset10 +from openvino import opset11 +from openvino import opset12 +from openvino import opset13 +from openvino import opset14 +from openvino import opset15 +from openvino import opset16 + # libva related: from openvino._pyopenvino import VAContext from openvino._pyopenvino import VASurfaceTensor diff --git a/tools/ovc/openvino/__init__.py b/tools/ovc/openvino/__init__.py index 57f03f00c2eebf..e4d1a247520332 100644 --- a/tools/ovc/openvino/__init__.py +++ b/tools/ovc/openvino/__init__.py @@ -56,6 +56,24 @@ from openvino._pyopenvino import RemoteTensor from openvino._pyopenvino import Op +# Import opsets +from openvino import opset1 +from openvino import opset2 +from openvino import opset3 +from openvino import opset4 +from openvino import opset5 +from openvino import opset6 +from openvino import opset7 +from openvino import opset8 +from openvino import opset9 +from openvino import opset10 +from openvino import opset11 +from openvino import opset12 +from openvino import opset13 +from openvino import opset14 +from openvino import opset15 +from openvino import opset16 + # libva related: from openvino._pyopenvino import VAContext from openvino._pyopenvino import VASurfaceTensor From 2d78f2a75cf97e15c6e813ec0a62b9acf4601388 Mon Sep 17 00:00:00 2001 From: Kelvin Choi Date: Wed, 11 Dec 2024 01:54:01 +0900 Subject: [PATCH 07/31] [GPU] Fix gws of Resample onnx kernel (#27990) ### Details: - *Fix gws value of resample onnx kernel with fs_b_yx_fsv32 format* ### Tickets: - *158837* --- .../kernels/resample/resample_kernel_onnx.cpp | 21 +++++++++++-------- .../unit/test_cases/resample_gpu_test.cpp | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/intel_gpu/src/kernel_selector/kernels/resample/resample_kernel_onnx.cpp b/src/plugins/intel_gpu/src/kernel_selector/kernels/resample/resample_kernel_onnx.cpp index 3b4cd32dc6b5c1..d6cdae39bda33a 100644 --- a/src/plugins/intel_gpu/src/kernel_selector/kernels/resample/resample_kernel_onnx.cpp +++ b/src/plugins/intel_gpu/src/kernel_selector/kernels/resample/resample_kernel_onnx.cpp @@ -84,6 +84,14 @@ DeviceFeaturesKey ResampleKernelOnnx::get_required_device_features_key(const Par return get_common_subgroups_device_features_key(params); } +static size_t get_vec_size(const resample_params ¶ms) { + if (params.inputs[0].GetLayout() == DataLayout::fs_b_yx_fsv32) { + return 2; + } else { + return 1; + } +} + ResampleKernelBase::DispatchData ResampleKernelOnnx::SetDefault(const kernel_selector::resample_params& arg) const { DispatchData dispatchData; std::vector> dims_by_gws; @@ -96,7 +104,7 @@ ResampleKernelBase::DispatchData ResampleKernelOnnx::SetDefault(const kernel_sel } dispatchData.gws[0] = CeilDiv(out.X().v, opt_x_block_size) * out.Y().v * out.Z().v; - dispatchData.gws[1] = Align(out.Feature().v, sub_group_size); + dispatchData.gws[1] = Align(CeilDiv(out.Feature().v, get_vec_size(arg)), sub_group_size); dispatchData.gws[2] = arg.outputs[0].Batch().v; dispatchData.lws[0] = 1; @@ -151,14 +159,9 @@ JitConstants ResampleKernelOnnx::GetJitConstants(const resample_params& params) jit.AddConstant(MakeJitConstant("X_BLOCKS", CeilDiv(params.outputs[0].X().v, opt_x_block_size))); jit.AddConstant(MakeJitConstant("SUB_GROUP_SIZE", sub_group_size)); - size_t vec_size = 0; - if (params.inputs[0].GetLayout() == DataLayout::fs_b_yx_fsv32) { - vec_size = 2; - jit.AddConstant(MakeJitConstant("FEATURE_SLICE_SIZE", 32)); - } else { - vec_size = 1; - jit.AddConstant(MakeJitConstant("FEATURE_SLICE_SIZE", 16)); - } + size_t vec_size = get_vec_size(params); + jit.AddConstant(MakeJitConstant("FEATURE_SLICE_SIZE", 16 * vec_size)); + if (IsThreeSpatialResample(params)) jit.AddConstant(MakeJitConstant("THREE_SPATIAL_RESAMPLE", "")); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/resample_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/resample_gpu_test.cpp index 99d6803e8f2dd0..13c77d2ac49bfd 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/resample_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/resample_gpu_test.cpp @@ -2371,6 +2371,7 @@ INSTANTIATE_TEST_SUITE_P(resample_opt_smoke_linear_onnx_4d_simple, { data_types::f16, {1, 128, 13, 13}, {1, 128, 26, 26}, 1, resample::InterpolateOp::InterpolateMode::LINEAR_ONNX, 1, format::bs_fs_yx_bsv32_fsv32, format::bs_fs_yx_bsv32_fsv32, {}, {}}, { data_types::f16, {1, 128, 13, 13}, {1, 128, 26, 26}, 1, resample::InterpolateOp::InterpolateMode::LINEAR_ONNX, 1, format::bs_fs_yx_bsv16_fsv16, format::bs_fs_yx_bsv16_fsv16, {}, {}}, { data_types::f16, {1, 128, 13, 13}, {1, 128, 26, 26}, 1, resample::InterpolateOp::InterpolateMode::LINEAR_ONNX, 1, format::b_fs_yx_fsv16, format::b_fs_yx_fsv32, {}, {}}, + { data_types::f16, {2, 32, 14, 14}, {2, 32, 28, 28}, 1, resample::InterpolateOp::InterpolateMode::LINEAR_ONNX, 1, format::fs_b_yx_fsv32, format::fs_b_yx_fsv32, {}, {}}, } )); From f7a69336eab21b11a4129d4a1905ade8dd58757a Mon Sep 17 00:00:00 2001 From: Andrey Babushkin Date: Wed, 11 Dec 2024 06:09:22 +0000 Subject: [PATCH 08/31] Add more workflows to the metrics collection workflow (#28010) Remove the small ones we probably don't need to track this way --- .../workflows/send_workflows_to_opentelemetry.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/send_workflows_to_opentelemetry.yml b/.github/workflows/send_workflows_to_opentelemetry.yml index ba38d6a9f90fed..31fd7adcd89ac6 100644 --- a/.github/workflows/send_workflows_to_opentelemetry.yml +++ b/.github/workflows/send_workflows_to_opentelemetry.yml @@ -5,11 +5,7 @@ on: workflows: - Android ARM64 with vcpkg - Android x64 - - Documentation - - Cleanup PIP caches - - Code snippets - - Code Style - - Code coverage + - Cleanup caches - Coverity (Ubuntu 20.04, Python 3.11) - Debian 10 ARM - Fedora 29 (RHEL 8.4), Python 3.9 @@ -19,10 +15,12 @@ on: - Linux ARM64 (Ubuntu 20.04, Python 3.11) - Linux Static CC (Ubuntu 22.04, Python 3.11, Clang) - Linux RISC-V with Conan (Ubuntu 22.04, Python 3.10) + - Linux (Ubuntu 22.04, Python 3.11, Intel DPC++ Compiler) + - Linux CPU Plugin Snippets with LIBXSMM (Ubuntu 20.04) + - Linux Sanitizers (Ubuntu 20.04, Python 3.9) - macOS (Python 3.11) - macOS ARM64 (Python 3.11) - - MO - - Python API Checks + - Manylinux 2014 - Webassembly - Windows (VS 2019, Python 3.11, Release) - Windows (VS 2019, Python 3.11, Debug) From 8659cd27792a5bb907c8d4ab0bf1b050f8a6a7c5 Mon Sep 17 00:00:00 2001 From: Taylor Yeonbok Lee Date: Wed, 11 Dec 2024 15:37:45 +0900 Subject: [PATCH 09/31] [GPU] Not to apply swiglu fusion for onednn (#28011) ### Details: - Disable swiglu fusion which was removed from the previous PR https://github.com/openvinotoolkit/openvino/pull/27831 by accident.. ### Tickets: - *ticket-id* --- .../src/graph/graph_optimizer/prepare_primitive_fusing.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_primitive_fusing.cpp b/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_primitive_fusing.cpp index 93f0905b3a1ef7..05f907dcd81f0a 100644 --- a/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_primitive_fusing.cpp +++ b/src/plugins/intel_gpu/src/graph/graph_optimizer/prepare_primitive_fusing.cpp @@ -171,6 +171,10 @@ void prepare_primitive_fusing::fuse_swiglu(program &p) { // Apply only for high performant GPU if (disable_fc_swiglu_fusion || p.get_engine().get_device_info().execution_units_count < 128) return; + + if (p.get_engine().get_device_info().supports_immad) + return; + // TODO: to support other glu types && other weight data types auto itr = p.get_processing_order().begin(); std::map>> fusing_history; From 9da62a48b534d8e3e21037b07e12b8a6adc6245d Mon Sep 17 00:00:00 2001 From: Mohammad Haghighipanah Date: Tue, 10 Dec 2024 22:53:07 -0800 Subject: [PATCH 10/31] [Coverity] GPU Plugin Medium issues (#27761) ### Details: - This PR fixes: 1562334, 1559879, 1559863, 1559854, 1559677, 1559879, 1559863 - 1559461 and 1559460 are related to ov::pass::pattern::matcher in `decompose_reduce_scalar_output.cpp` - 1559886 and 1559881 are related to ov::pass::pattern::matcher in `transpose_fusion.cpp` - 1559862 is related to ov::pass::pattern::matcher in `transpose_fusion.cpp` - 1559698 and 1559691 are related to ov::pass::pattern::matcher in `bcast_and_pad_zp_buffers.cpp` - all member variables are initialized in the constructors' initializer lists of `ov::pass::pattern::matcher` to address 1559461, 1559460, 1559886, 1559881, 1559862, 1559698, 1559691. ### Tickets: - [*CVS-153064*](https://jira.devtools.intel.com/browse/CVS-153064) - CVS-145082 --------- Co-authored-by: Pavel Durandin --- .../include/openvino/pass/pattern/matcher.hpp | 39 +++++++++++++++---- .../include/intel_gpu/primitives/resample.hpp | 2 +- .../graph/impls/onednn/convolution_onednn.cpp | 2 +- .../fully_connected_kernel_bf_tiled.cpp | 3 ++ .../transformations/kv_cache_fusion.cpp | 2 +- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/core/include/openvino/pass/pattern/matcher.hpp b/src/core/include/openvino/pass/pattern/matcher.hpp index bbd7e32b0a1802..7112ac9ff85e64 100644 --- a/src/core/include/openvino/pass/pattern/matcher.hpp +++ b/src/core/include/openvino/pass/pattern/matcher.hpp @@ -62,10 +62,31 @@ class OPENVINO_API Matcher { // Avoid implicit string construction from nullptr. Matcher(const std::shared_ptr pattern_node, std::nullptr_t name) = delete; - Matcher() = default; - Matcher(Output& pattern_node) : m_pattern_node{pattern_node} {} - - Matcher(Output& pattern_node, const std::string& name) : m_pattern_node(pattern_node), m_name{name} {} + Matcher() + : m_match_root{}, + m_pattern_node{}, + m_pattern_map{}, + m_pattern_value_maps{}, + m_matched_list{}, + m_name{""}, + m_strict_mode{false} {} + Matcher(Output& pattern_node) + : m_match_root{}, + m_pattern_node{pattern_node}, + m_pattern_map{}, + m_pattern_value_maps{}, + m_matched_list{}, + m_name{""}, + m_strict_mode{false} {} + + Matcher(Output& pattern_node, const std::string& name) + : m_match_root{}, + m_pattern_node{pattern_node}, + m_pattern_map{}, + m_pattern_value_maps{}, + m_matched_list{}, + m_name{name}, + m_strict_mode{false} {} /// \brief Constructs a Matcher object /// @@ -73,9 +94,13 @@ class OPENVINO_API Matcher { /// \param name is a string which is used for logging and disabling a matcher /// \param strict_mode forces a matcher to consider shapes and ET of nodes Matcher(const Output& pattern_node, const std::string& name, bool strict_mode) - : m_pattern_node(pattern_node), - m_name(name), - m_strict_mode(strict_mode) {} + : m_match_root{}, + m_pattern_node{pattern_node}, + m_pattern_map{}, + m_pattern_value_maps{}, + m_matched_list{}, + m_name{name}, + m_strict_mode{strict_mode} {} // Some matches should start on a node rather than an output. These three constructors // are transition until we work out the right way to do that. diff --git a/src/plugins/intel_gpu/include/intel_gpu/primitives/resample.hpp b/src/plugins/intel_gpu/include/intel_gpu/primitives/resample.hpp index 62d32a3619e329..f6e32661974cb8 100644 --- a/src/plugins/intel_gpu/include/intel_gpu/primitives/resample.hpp +++ b/src/plugins/intel_gpu/include/intel_gpu/primitives/resample.hpp @@ -15,7 +15,7 @@ namespace cldnn { struct resample : public primitive_base { CLDNN_DECLARE_PRIMITIVE(resample) - resample() : primitive_base("", {}) {} + resample() : primitive_base("", {}), scales_port(0) {} using InterpolateOp = ov::op::util::InterpolateBase; diff --git a/src/plugins/intel_gpu/src/graph/impls/onednn/convolution_onednn.cpp b/src/plugins/intel_gpu/src/graph/impls/onednn/convolution_onednn.cpp index a11ceef8b0f2dd..a2d3c007e29aa8 100644 --- a/src/plugins/intel_gpu/src/graph/impls/onednn/convolution_onednn.cpp +++ b/src/plugins/intel_gpu/src/graph/impls/onednn/convolution_onednn.cpp @@ -121,7 +121,7 @@ struct convolution_onednn : typed_primitive_onednn_impl { private: int _zero_point_mask; - dnnl::memory::data_type _wzp_data_type; + dnnl::memory::data_type _wzp_data_type = dnnl::memory::data_type::undef; protected: std::unique_ptr clone() const override { diff --git a/src/plugins/intel_gpu/src/kernel_selector/kernels/fully_connected/fully_connected_kernel_bf_tiled.cpp b/src/plugins/intel_gpu/src/kernel_selector/kernels/fully_connected/fully_connected_kernel_bf_tiled.cpp index d0f881adcd88b1..0774c62add1643 100644 --- a/src/plugins/intel_gpu/src/kernel_selector/kernels/fully_connected/fully_connected_kernel_bf_tiled.cpp +++ b/src/plugins/intel_gpu/src/kernel_selector/kernels/fully_connected/fully_connected_kernel_bf_tiled.cpp @@ -846,9 +846,11 @@ void FullyConnected_bf_tiled::GetUpdateDispatchDataFunc(KernelData& kd) const { // quantized input is char type kd.internalBufferSizes.push_back(input_size); // half type of de_quan_scale and activation sum for each quantized group + OPENVINO_ASSERT(quantize_grp_size != 0, "Error: quantize_grp_size is zero."); kd.internalBufferSizes.push_back((input_size / quantize_grp_size) * 2 * 2); } + OPENVINO_ASSERT(quantize_grp_size != 0, "Error: quantize_grp_size is zero."); kd.kernels[0].params.workGroups.global = {std::max((input_size / quantize_grp_size), (size_t)1), 1, 1}; kd.kernels[0].params.workGroups.local = {16, 1, 1}; } @@ -983,6 +985,7 @@ KernelsData FullyConnected_bf_tiled::GetMultiKernelsData(const Params ¶ms, const auto& fc_params = static_cast(params); size_t quantize_grp_size = get_dynamic_quantize_group_size(fc_params); + OPENVINO_ASSERT(quantize_grp_size != 0, "Error: quantize_grp_size is zero."); bool bProperInput = fc_params.inputs[0].GetLayout() == dl; if (!bProperInput && !fc_params.inputs[0].PitchesDifferFromLogicalDims()) { diff --git a/src/plugins/intel_gpu/src/plugin/transformations/kv_cache_fusion.cpp b/src/plugins/intel_gpu/src/plugin/transformations/kv_cache_fusion.cpp index b97389a7d18c76..8be42a1311094b 100644 --- a/src/plugins/intel_gpu/src/plugin/transformations/kv_cache_fusion.cpp +++ b/src/plugins/intel_gpu/src/plugin/transformations/kv_cache_fusion.cpp @@ -63,7 +63,7 @@ KVCacheFusionMatcher::KVCacheFusionMatcher() { return false; // TODO: Support conversion internally - if (concat_node->get_output_element_type(0) != past_node->get_output_element_type(0)) + if (!concat_node || concat_node->get_output_element_type(0) != past_node->get_output_element_type(0)) return false; auto variable = past_node->get_variable(); From 778011b0efe59ff4a00cf61f2162d3e79b172785 Mon Sep 17 00:00:00 2001 From: Alexey Moskalev Date: Wed, 11 Dec 2024 11:06:25 +0400 Subject: [PATCH 11/31] Create RELEASE.MD (#27370) The first draft to review. --- docs/RELEASE.MD | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/RELEASE.MD diff --git a/docs/RELEASE.MD b/docs/RELEASE.MD new file mode 100644 index 00000000000000..b345431f3f2bcf --- /dev/null +++ b/docs/RELEASE.MD @@ -0,0 +1,29 @@ +# OpenVINO Release Management +The process described below reflects the approach to managing OpenVINO releases. + +## Release Milestones +- Planning +- Execution (development of new features) +- Stabilization (Feature Freeze, Code Freeze milestones) +- Validation +- Distribution + +### Planning +This phase takes 2-4 weeks and involves scoping the backlog, prioritizing it, analyzing, and making commitments by developers for timelines specified by the release manager. + +### Execution (development of new features) +- [OpenVINO Contributing Guide](https://github.com/openvinotoolkit/openvino/blob/master/CONTRIBUTING.md) +- [Code Contribution Guide](https://docs.openvino.ai/2024/about-openvino/contributing/code-contribution-guide.html) +- [OpenVINO First Good Issue](https://github.com/openvinotoolkit/openvino/issues/17502) + +### Stabilization (Feature Freeze, Code Freeze milestones) +- **Feature Freeze**: This milestone ensures that no new features are added to the software after a certain point. This allows the development team to focus on stabilizing and refining the existing features, fixing bugs, and improving performance without the risk of introducing new issues. +- **Code Freeze**: This milestone marks the point where no new code changes are allowed except for critical bug fixes. This helps in ensuring that the final product is stable and reliable, as it minimizes the risk of last-minute changes that could introduce new bugs or instability. + +### Release Validation +- This is a continuous process executed on a regular basis with cadence based on testing type: nightly, bi-weekly, weekly. +- After Code Freeze, the testing team can perform final regression testing to ensure that recent changes have not introduced new bugs and that the software meets the required quality standards. + +### Distribution +- OpenVINO has different types of build distribution: Regular releases, Long-Term Support, Pre-release releases, Nightly builds. Read more here: [OpenVINO Release Policy](https://docs.openvino.ai/2024/about-openvino/release-notes-openvino/release-policy.html) +- Different distribution channels are supported. Explore different options here: [OpenVINO Download](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html) From 859958f4e22e76c98121361ec19ea8ddb7cb8233 Mon Sep 17 00:00:00 2001 From: Mingyu Kim Date: Wed, 11 Dec 2024 16:54:48 +0900 Subject: [PATCH 12/31] [GPU] Disable KV cache compression and FC scaling for GPU with systolic (#27988) ### Details: - GPU with systolic does not need FC scaling - GPU with systolic does not support kv cache compresssion yet --- .../include/intel_gpu/runtime/execution_config.hpp | 2 +- src/plugins/intel_gpu/src/plugin/plugin.cpp | 4 ++-- .../intel_gpu/src/runtime/execution_config.cpp | 8 +++++--- .../tests/functional/behavior/properties.cpp | 12 ++++++++++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/plugins/intel_gpu/include/intel_gpu/runtime/execution_config.hpp b/src/plugins/intel_gpu/include/intel_gpu/runtime/execution_config.hpp index 3e854e4c9c5ada..5e059b17da0e97 100644 --- a/src/plugins/intel_gpu/include/intel_gpu/runtime/execution_config.hpp +++ b/src/plugins/intel_gpu/include/intel_gpu/runtime/execution_config.hpp @@ -140,7 +140,7 @@ class ExecutionConfig { // Note that RT info property value has lower priority than values set by user via core.set_property or passed to compile_model call // So this method should be called after setting all user properties, but before apply_user_properties() call. - void apply_rt_info(const ov::RTMap& rt_info); + void apply_rt_info(const cldnn::device_info& info, const ov::RTMap& rt_info); std::string to_string() const; diff --git a/src/plugins/intel_gpu/src/plugin/plugin.cpp b/src/plugins/intel_gpu/src/plugin/plugin.cpp index 9f9c9692b57b42..f2fa9bcdeeab1b 100644 --- a/src/plugins/intel_gpu/src/plugin/plugin.cpp +++ b/src/plugins/intel_gpu/src/plugin/plugin.cpp @@ -190,7 +190,7 @@ std::shared_ptr Plugin::compile_model(const std::shared_ptr< ExecutionConfig config = m_configs_map.at(device_id); config.set_user_property(orig_config); if (model->has_rt_info("runtime_options")) - config.apply_rt_info(model->get_rt_info("runtime_options")); + config.apply_rt_info(context->get_engine().get_device_info(), model->get_rt_info("runtime_options")); config.apply_user_properties(context->get_engine().get_device_info()); set_cache_info(model, config); @@ -281,7 +281,7 @@ ov::SupportedOpsMap Plugin::query_model(const std::shared_ptr& ExecutionConfig config = m_configs_map.at(device_id); config.set_user_property(orig_config); if (model->has_rt_info("runtime_options")) - config.apply_rt_info(model->get_rt_info("runtime_options")); + config.apply_rt_info(ctx->get_engine().get_device_info(), model->get_rt_info("runtime_options")); config.apply_user_properties(ctx->get_engine().get_device_info()); ProgramBuilder prog(ctx->get_engine(), config); diff --git a/src/plugins/intel_gpu/src/runtime/execution_config.cpp b/src/plugins/intel_gpu/src/runtime/execution_config.cpp index 804ad81f2d3735..a698ec7eb6c5a0 100644 --- a/src/plugins/intel_gpu/src/runtime/execution_config.cpp +++ b/src/plugins/intel_gpu/src/runtime/execution_config.cpp @@ -262,10 +262,12 @@ void ExecutionConfig::apply_user_properties(const cldnn::device_info& info) { user_properties.clear(); } -void ExecutionConfig::apply_rt_info(const ov::RTMap& rt_info) { - apply_rt_info_property(ov::hint::kv_cache_precision, rt_info); +void ExecutionConfig::apply_rt_info(const cldnn::device_info& info, const ov::RTMap& rt_info) { + if (!info.supports_immad) { + apply_rt_info_property(ov::hint::kv_cache_precision, rt_info); + apply_rt_info_property(ov::hint::activations_scale_factor, rt_info); + } apply_rt_info_property(ov::hint::dynamic_quantization_group_size, rt_info); - apply_rt_info_property(ov::hint::activations_scale_factor, rt_info); } std::string ExecutionConfig::to_string() const { diff --git a/src/plugins/intel_gpu/tests/functional/behavior/properties.cpp b/src/plugins/intel_gpu/tests/functional/behavior/properties.cpp index 93a00262db35c2..4af05f30c6b4b0 100644 --- a/src/plugins/intel_gpu/tests/functional/behavior/properties.cpp +++ b/src/plugins/intel_gpu/tests/functional/behavior/properties.cpp @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 // +#include #include "openvino/runtime/properties.hpp" +#include "openvino/runtime/intel_gpu/properties.hpp" #include "base/ov_behavior_test_utils.hpp" #include "openvino/runtime/core.hpp" #include "common_test_utils/subgraph_builders/conv_pool_relu.hpp" @@ -43,11 +45,17 @@ TEST_F(TestPropertiesGPU, RTInfoPropertiesWithDefault) { model->set_rt_info("8.0", "runtime_options", ov::hint::activations_scale_factor.name()); OV_ASSERT_NO_THROW(compiled_model = core.compile_model(model, ov::test::utils::DEVICE_GPU)); - OV_ASSERT_NO_THROW(type = compiled_model.get_property(ov::hint::kv_cache_precision)); OV_ASSERT_NO_THROW(size = compiled_model.get_property(ov::hint::dynamic_quantization_group_size)); + ASSERT_EQ(size.as(), 0); + + // GPU with systolic does not support some of rt_info + auto capabilities = core.get_property(ov::test::utils::DEVICE_GPU, ov::device::capabilities); + if (find(capabilities.cbegin(), capabilities.cend(), ov::intel_gpu::capability::HW_MATMUL) != capabilities.cend()) + return; + + OV_ASSERT_NO_THROW(type = compiled_model.get_property(ov::hint::kv_cache_precision)); OV_ASSERT_NO_THROW(scale = compiled_model.get_property(ov::hint::activations_scale_factor)); ASSERT_EQ(type.as(), ov::element::f16); - ASSERT_EQ(size.as(), 0); ASSERT_EQ(scale.as(), 8.0f); } From c4daa2545b78ae68fd96c1a1858804a4e79413f2 Mon Sep 17 00:00:00 2001 From: Manideep-Kanna <72699920+Manideep-Kanna@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:31:04 +0530 Subject: [PATCH 13/31] Fix#27796 Added condition and test case for the getData parameter input functionality (#27843) This fixes #27796 Implemented the exception for the passing parameter scenario for getData function - Added condition to check if parameters are passed or not - Added tests in Tensor.test.js --- src/bindings/js/node/src/tensor.cpp | 6 ++++++ src/bindings/js/node/tests/unit/tensor.test.js | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/bindings/js/node/src/tensor.cpp b/src/bindings/js/node/src/tensor.cpp index 78785a10b2275b..14a68286e5372c 100644 --- a/src/bindings/js/node/src/tensor.cpp +++ b/src/bindings/js/node/src/tensor.cpp @@ -66,6 +66,12 @@ Napi::Object TensorWrap::wrap(Napi::Env env, ov::Tensor tensor) { } Napi::Value TensorWrap::get_data(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (info.Length() > 0) { + reportError(env, "getData() does not accept any arguments."); + return env.Undefined(); + } + auto type = _tensor.get_element_type(); switch (type) { diff --git a/src/bindings/js/node/tests/unit/tensor.test.js b/src/bindings/js/node/tests/unit/tensor.test.js index 656bdf9b122e58..2cd5115b5af2a8 100644 --- a/src/bindings/js/node/tests/unit/tensor.test.js +++ b/src/bindings/js/node/tests/unit/tensor.test.js @@ -121,6 +121,12 @@ describe('ov.Tensor tests', () => { assert.deepStrictEqual(tensor.getData(), data); }); + it('getData should throw an error if arguments are provided', () => { + const tensor = new ov.Tensor(ov.element.f32, shape, data); + assert.throws(() => tensor.getData(1), { + message: 'getData() does not accept any arguments.', + }); + }); it('test tensor.data setter - different element type throws', () => { const float64Data = Float64Array.from([1, 2, 3]); const tensor = new ov.Tensor(ov.element.f32, [1, 3]); From 328feb63d80bc0ebc4a0cfa5acc15ca623ec2bdb Mon Sep 17 00:00:00 2001 From: Katarzyna Mitrus Date: Wed, 11 Dec 2024 13:18:20 +0100 Subject: [PATCH 14/31] [STFT][PT FE] Add support for normalize attr in STFT conversion (#28005) ### Details: - Add support for `normalize` attribute of torch `aten::stft` by post op subgraph in PT Frontend ### Tickets: - 159159 --- src/frontends/pytorch/src/op/stft.cpp | 13 ++++++++++--- tests/layer_tests/pytorch_tests/test_stft.py | 20 +++++++++----------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/frontends/pytorch/src/op/stft.cpp b/src/frontends/pytorch/src/op/stft.cpp index b7e4858c2f8fcc..d1fe4f9f15828b 100644 --- a/src/frontends/pytorch/src/op/stft.cpp +++ b/src/frontends/pytorch/src/op/stft.cpp @@ -10,6 +10,7 @@ #include "openvino/op/convert_like.hpp" #include "openvino/op/divide.hpp" #include "openvino/op/shape_of.hpp" +#include "openvino/op/sqrt.hpp" #include "openvino/op/unsqueeze.hpp" #include "utils.hpp" @@ -66,8 +67,6 @@ OutputVector translate_stft(const NodeContext& context) { if (!context.input_is_none(5)) { normalized = context.const_input(5); } - PYTORCH_OP_CONVERSION_CHECK(!normalized, - "aten::stft conversion is currently supported with normalized=False only."); bool onesided = true; if (!context.input_is_none(6)) { @@ -85,7 +84,15 @@ OutputVector translate_stft(const NodeContext& context) { // Perform STFT constexpr bool transpose_frames = true; auto stft = context.mark_node(std::make_shared(input, window, n_fft, hop_length, transpose_frames)); - return {stft}; + + if (normalized) { + const auto nfft_convert = context.mark_node(std::make_shared(n_fft, stft)); + const auto divisor = context.mark_node(std::make_shared(nfft_convert)); + const auto norm_stft = context.mark_node(std::make_shared(stft, divisor)); + return {norm_stft}; + } else { + return {stft}; + } }; } // namespace op } // namespace pytorch diff --git a/tests/layer_tests/pytorch_tests/test_stft.py b/tests/layer_tests/pytorch_tests/test_stft.py index 832a624da65626..d0ff347e58602f 100644 --- a/tests/layer_tests/pytorch_tests/test_stft.py +++ b/tests/layer_tests/pytorch_tests/test_stft.py @@ -24,16 +24,17 @@ def _prepare_input(self, win_length, signal_shape, rand_data=False, out_dtype="f return (signal, window.astype(out_dtype)) - def create_model(self, n_fft, hop_length, win_length): + def create_model(self, n_fft, hop_length, win_length, normalized): import torch class aten_stft(torch.nn.Module): - def __init__(self, n_fft, hop_length, win_length): + def __init__(self, n_fft, hop_length, win_length, normalized): super(aten_stft, self).__init__() self.n_fft = n_fft self.hop_length = hop_length self.win_length = win_length + self.normalized = normalized def forward(self, x, window): return torch.stft( @@ -44,14 +45,14 @@ def forward(self, x, window): window=window, center=False, pad_mode="reflect", - normalized=False, + normalized=self.normalized, onesided=True, return_complex=False, ) ref_net = None - return aten_stft(n_fft, hop_length, win_length), ref_net, "aten::stft" + return aten_stft(n_fft, hop_length, win_length, normalized), ref_net, "aten::stft" @pytest.mark.nightly @pytest.mark.precommit @@ -64,10 +65,11 @@ def forward(self, x, window): [24, 32, 20], [128, 128, 128], ]) - def test_stft(self, n_fft, hop_length, window_size, signal_shape, ie_device, precision, ir_version, trace_model): + @pytest.mark.parametrize(("normalized"), [True, False]) + def test_stft(self, n_fft, hop_length, window_size, signal_shape, normalized, ie_device, precision, ir_version, trace_model): if ie_device == "GPU": pytest.xfail(reason="STFT op is not supported on GPU yet") - self._test(*self.create_model(n_fft, hop_length, window_size), ie_device, precision, + self._test(*self.create_model(n_fft, hop_length, window_size, normalized), ie_device, precision, ir_version, kwargs_to_prepare_input={"win_length": window_size, "signal_shape": signal_shape}, trace_model=trace_model) @@ -125,8 +127,8 @@ def forward(self, x): [16, None, 16, False, "reflect", False, True, False], # hop_length None [16, None, None, False, "reflect", False, True, False], # hop & win length None [16, 4, None, False, "reflect", False, True, False], # win_length None - # Unsupported cases: [16, 4, 16, False, "reflect", True, True, False], # normalized True + # Unsupported cases: [16, 4, 16, False, "reflect", False, False, False], # onesided False [16, 4, 16, False, "reflect", False, True, True], # reutrn_complex True ]) @@ -138,10 +140,6 @@ def test_stft_not_supported_attrs(self, n_fft, hop_length, win_length, center, p pytest.xfail( reason="torch stft uses list() for `center` subgrpah before aten::stft, that leads to error: No conversion rule found for operations: aten::list") - if normalized is True: - pytest.xfail( - reason="aten::stft conversion is currently supported with normalized=False only") - if onesided is False: pytest.xfail( reason="aten::stft conversion is currently supported with onesided=True only") From 5f3451583d64b060efb98a83f3b93d7cc457defe Mon Sep 17 00:00:00 2001 From: Yury Gaydaychuk Date: Wed, 11 Dec 2024 14:44:36 +0100 Subject: [PATCH 15/31] [Commit Slider] Fix logs absence (#27941) ### Details: - *item1* - *...* ### Tickets: - *ticket-id* --- src/plugins/intel_cpu/tools/commit_slider/commit_slider.py | 6 ++++-- .../intel_cpu/tools/commit_slider/tests/test_util.py | 6 ++++-- src/plugins/intel_cpu/tools/commit_slider/utils/modes.py | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/plugins/intel_cpu/tools/commit_slider/commit_slider.py b/src/plugins/intel_cpu/tools/commit_slider/commit_slider.py index 0a513de1c93c9c..2f5d6a68acc29d 100644 --- a/src/plugins/intel_cpu/tools/commit_slider/commit_slider.py +++ b/src/plugins/intel_cpu/tools/commit_slider/commit_slider.py @@ -96,8 +96,10 @@ if curCfgData['userLogPath']: permLogPath = curCfgData['userLogPath'] - safeClearDir(permLogPath, curCfgData) - if not curCfgData['clearLogsAposteriori']: + if curCfgData['clearLogsAposteriori']: + safeClearDir(permLogPath, curCfgData) + elif not tempLogPath == permLogPath: + safeClearDir(permLogPath, curCfgData) copy_tree(tempLogPath, permLogPath) safeClearDir(permCachePath, curCfgData) diff --git a/src/plugins/intel_cpu/tools/commit_slider/tests/test_util.py b/src/plugins/intel_cpu/tools/commit_slider/tests/test_util.py index 14dcf1dd5b3f9c..7c247f58073e25 100644 --- a/src/plugins/intel_cpu/tools/commit_slider/tests/test_util.py +++ b/src/plugins/intel_cpu/tools/commit_slider/tests/test_util.py @@ -251,12 +251,14 @@ def requireBinarySearchData(td: TestData, rsc: map): ) [setattr(td, key, td.commonRsc[key] \ if not key in td.testCfg or \ - not isinstance(td.testCfg[key], str) \ + not (isinstance(td.testCfg[key], str) or \ + isinstance(td.testCfg[key], bool)) \ else td.testCfg[key]) for key in [ 'repoStructure', 'userCachePath', 'userLogPath', - 'clearLogsAposteriori', 'clearCache', + 'clearLogsAposteriori', + 'clearCache', 'mainFile', 'repoPath' ]] td.patternPrefix = td.commonRsc['patchGeneratorPrefix'] diff --git a/src/plugins/intel_cpu/tools/commit_slider/utils/modes.py b/src/plugins/intel_cpu/tools/commit_slider/utils/modes.py index 3340f1f597efd8..6c1024ef1234a9 100644 --- a/src/plugins/intel_cpu/tools/commit_slider/utils/modes.py +++ b/src/plugins/intel_cpu/tools/commit_slider/utils/modes.py @@ -165,7 +165,7 @@ def preliminaryCheck(self, list, cfg): if cfg["preliminaryCheckCfg"]["checkBenchmarkModelPath"]: cmdStr = cfg["appCmd"] matcher = re.search( - "benchmark.*-m[\s*]([^\S]*)", + r"benchmark.*-m[\s*]([^\S]*)", cmdStr, flags=re.MULTILINE ) @@ -287,7 +287,7 @@ def getCommitInfo(self, commit): class AccuracyCheckerMode(Mode): def __init__(self, cfg): super().__init__(cfg) - self.thresholdPattern = ":\s([0-9]*[.][0-9]*)%.*abs error" + self.thresholdPattern = r":\s([0-9]*[.][0-9]*)%.*abs error" self.curMetric = None self.createCash() From 3015156807e609b6e091e24f514dcf2ae1f2ba8a Mon Sep 17 00:00:00 2001 From: Alexander Kozlov Date: Wed, 11 Dec 2024 18:35:55 +0300 Subject: [PATCH 16/31] Set KV-cache to FP16 in LLM evaluation tests (#27956) Co-authored-by: Alina Kladieva --- tests/llm/accuracy_conformance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/llm/accuracy_conformance.py b/tests/llm/accuracy_conformance.py index 7f75a8e912bbd6..4c6a1e140e597b 100644 --- a/tests/llm/accuracy_conformance.py +++ b/tests/llm/accuracy_conformance.py @@ -98,7 +98,7 @@ def teardown_module(): test_scope, ) def test_accuracy_conformance(model_path, model_type, precision, gt_data, device): - target_model = OVModelForCausalLM.from_pretrained(model_path, device=device) + target_model = OVModelForCausalLM.from_pretrained(model_path, device=device, ov_config={"KV_CACHE_PRECISION": "f16"}) tokenizer = AutoTokenizer.from_pretrained(model_path) evaluator = wwb.Evaluator( From ac89b432ec8df06417343de0236c0159c6be22e4 Mon Sep 17 00:00:00 2001 From: Karol Blaszczak Date: Wed, 11 Dec 2024 17:35:10 +0100 Subject: [PATCH 17/31] [DOCS] pdf update (#28018) --- .../download/GenAI_Quick_Start_Guide.pdf | Bin 3405623 -> 3425648 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/sphinx_setup/_static/download/GenAI_Quick_Start_Guide.pdf b/docs/sphinx_setup/_static/download/GenAI_Quick_Start_Guide.pdf index 393f0aa7eaff032d61cb80f753538a31942e5c20..90ad7bd6b000b476857100df15b8ed6e488964d3 100644 GIT binary patch delta 2693255 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 FJ3@ubTBN~igpXe9gcC_l3^FA?NmR3 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

9}$o(pU*E@O>9$jwPyMJb3 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 z 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͊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 nfm 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�^Sk(%?0a9HziNixudCc9xmxVM^%Rg28` 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 z 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 z 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

2*`4N+kE=MT?5eXIJ8nDeQ6DP`w_cmdgBL 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%0D%lzy(tA?oQ^w9Tj|-(wkQ^%_?|v9<9@5 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%0D`s;{+kvLEBpUId5J!h7lx>`$9IsVct| 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

-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�W3rcT3X_d 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

TR7~5Kt<0$CiL*- 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

@9eW#~RnRM!F;l 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

pn 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⋘L`fD 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

7g~8NU1b+_bs|ovFJ=|i}Ok$0~ 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

@5k#YL|4KLc7O@SE|h{|-fO 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

VBU>&lP8Ms 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

_LBvxG z?RP?Dc}#bfEEFz`q`wZ^vPYA8iiu zOVl)1k>s~Ykk&P!@>=7b873DQEo|qP#@IR~y!Y%3lw5K#K*ZzHxXe$! zjF-0kf`KEO^qXIzB4MvkO6#X1zAb*~^gMLMM_KU3U(0_isp&5#ah!naw@fS5bS<~_ z(KEvu2LP`nax=h|$MN|$=OidJTFr%m*_mmkKGgV1%x~*GsU0%Tt%@^$)!fjGZ4~2< zwi^;R0GHr9KHQ9@V8G@w;EqFTNC3!HNIchmV@}U z%&CK&=ipPYXW&*ZQ?#j3+Li$be95;oy z4=#}02CrsZDh(QaMkY-hO5oaM15# z-lj2mHnuL(1`o@gO)-s`Pqq9tZ0SiqSQnVrk-h=17oaM{+!lMH12o#rZU^}Zwa!F7 z6^W&LOxxkInQHujc08VdG)vLbmZsnJ0V9EV@ewse<@kH=EJ88l3w;+9{#1itMDK6` zUV2Es@B^?HIkFfyuhjqv;TI8-%ALINrJ!T$A(DGa*{WhIyui{CShvUI4Xd4ktw_e_7Y*kyoo zFb1ZV_mZVMGsH>!X~t~A!*dTdj&X<2X)Zl19jlvKS_o|(Gae8$fr4I0XdzmL+rK}=N?$9k<{ z1$w<3q2|ddof~s+A8Zz)Y+XLFn}h;M2fW`Xg?RHkSdteyVX41NI_BX;WC!SU&u)kH zOPUAbn%du;;H`7&;v^2lZ>A#Cd|(QKxTTY$5}A}>9zZ@%GEQ=nIvJLt^u|GsUQGdu zs^{}&{akL|8ohYhCH$3>{oHDXQ+;Z!#zA`T(8*Q=Hd5baO;@#BX6UhAsB|ND5)HSo z-JDIvhM2O(^wCjVMvY2!r^AcFj?MZL3Y|C2C8s$87Rpa_l)JmYVZ3vX4OwG-HRx3a z1bYw>j(|AM<$H)>C*rNZ5aS7k96A`H{nQ?6v#FJ8mPB}kt#iw_x`r6e?u7`L>wZ@< zHI^Y(?lDsC4rg(B=K#5J3*<>c^ddOHE|>2|h*fVc9C5*3RGtS?^e1kya2?)5OV*i( zZ@uUvCH$!`Q>ce50jpHP#?CmzOUviSt5Q{hz<67RVaL|mB%e)G!nnkFcSF2hqX>Go zEHhUiW&im?T6Ic5+B~|iwP~-l>BDu|e2H@&b{+XLd>*~9+`d@_daK61FXZE=z}Kaa zD;l_c@0Kap{+5U2$A{d_k(sP{dAb6$|2z*L!3kB`(atS;?1`Ab6FV;P)7$+$H|w;A zKvVPhp#VKnCfr>`&ZL8t<4@NihEg;$lLZ0IbuzCYaKQfl*9b$HW`-Spi*8uNP&oeR z)t^sk1xZm8e&-`IW{GkHKc5qUuQPL7KuxB90Rz$Sd?unSwc4+yU`%J^xs}UpDP2|Z zAI3{hqD^K?8&e+S+JBA&b^tzsgIdTR_o^8#o`t_;!owu zyN$)@Jtxc`Pe3z!#LeQDee-lKzv%t^V?8d`xAqW;{AcN@ibbyhN+sMK9XF#$l4cF< zL|qOn=09jbIdKZ%CQGROM{Pd~nqb#dut4Mfn=_teNuC*Yh%)@-P|Kj}h>013WIYcC^C*LviL26F@w3Zd`F)?<<#N6P&3E0s73T>V@|fh$bU zb4dRw>mJK^L5hpJvP3TT1j~yWcSR#N=ezzw$1ZJ00x&G5i)X97^i6p&k_f{TN}za# z+puI#`-AvG`uQTO#R>G;^x0M1t*G;5IHv#LSJpuPN%0G0=hsEQ)A>f-hBEUjEw5@) z?s70sZ=Of5thXS2@oO>vl#3#8k8QUSmUE%K3#FQ$rI}NdpJsEGuuI=0A7z9^#mMF1 z=9IXG%afz7sf(yzX)bYlX4zqMBLD;eArvMThshoO)3V)g&sleOewF$cL@G+zXl1)ETyFgxlGHQ_%4Q8l z9PGZ24;L^wB>>;_0OK2_IAhrHJDpi)v=LnP<=U5Ljbh3Q)3iy123yf1WHjhK?^Hq( zor??$UVqz$cM|`?NCSFRkTM-h2;DrNho`nH7iWzPyrr_0@LdC+9(94vd_IRGUlTfg zPZSw~ls*r;aKDq@|2%|G!YxV=u^G*pJz2^2yWth>G(ch3_X3$>rvV|4+1-AgHeWYZ z2aZVVjUH~L#rFSBUX0clfB{LL zP3vv_Ls`k|Fwi+FUF|uL{A2vD^b!JKJD&3tDVHW6jgwu`JUPoLZLYW|ey;~(X9n$HgT_qVP>gH!ay5$LL$pT-!g4EQozt6_@yXWbqzTS@Ax<_!jmrH0)Edty z?`#)0Uw>vz~Z9Eh` zw1h8mD`=?XiPd_o3;8BDby!C;YZWL_HUN_FXJ zmCaafhDk<$kD=FzI{$sJ#hp3-H#{Jg)-k8$M#(T!a>teR`prrkOr1yIE5>6fe_$U+ zhfqBStPMmC(ikXtM$)XX-Gr-8w&^j&)E0;L z;hzECNLb_jK)yhDaB(!}2TLEbChN3}boJ=*P^w3JL!xB5cB5+&kf3aWvKUfnDN9LcG=|(dfBK&^2_r7uT`PcACS$!=Hav{1NC9j4TN^K?05i)3|>Nj;N!X$V3v=cns`mY&p@dNj{ zBvvOKk})1PhbH|9GvS+zTrbq={=jLSBl7KKz;p(9*vGvh*%wOu8}owDSOXP{zU>`Y zNtSFy_QL>2L{isABkNH=?15elsS(%h*~SjoozKAI;e}QmYcP1IICt{bV8i^#9h1k< z+982KuiND5X>kKB9*H{rA0j2Io+pWh};F)>LZWA z;Rmql7n2x~$+580uDrrG{=`n#@0bj{Z!nZoNDgFGzcicz*(x5}81}u3XA{!6xz|Ne zt^W#qrPc8*rb?8L(qfdlQ2g(_8c&FHGAh3W7hQbI$UvIkf;M%+(`<#r{EEvSYLH&+ zsquT8Mp{GiKb}9?uaxk^c@0DHl@7X*oI<(sHhIAy`F5gvCD$h+W z0_1E+(DvQBobvPKE>2ZRxsnk^Dkyf_+iWR#cm}f6L8jm7Og7o&!dS2;FdnFz^k9g^ zxBoU1`q|Gc*1YskU+ow}vT`-@M~jHTBu&(x=-$s{Z5(KbFMsU1JT0)Gg)YcCF^v0{ zNi9eCS7-YAF6!B%zGyHDM*)Ew&=(p}7yYKy z2yu&lPR6&&etCz2Zo2goAjlpHc>0L-uRzaIrw zdaRlO2W}cU7e{G$V85Ydb4623eQxlR`)&lwzo)&Xl3z>u_RZy^S<1rSeNFn8fIIISs(8o>B*GdU*W$0#U(yc1f@fQFEz| zPI(XIp1f5)7ytLb*F|@TN9M6$&U>)4g1YqUqcDNfntX;&*;I;NMioiwsr(3in{(#u z$4-oe9sa6S$n!OEf&qmUt`xU%)gs~aQ(_eRCg~1F_AQifkQ5udUQWZ~s8)I0?2e)5 zZEN@1TnqPQXS?kI@IPm}e0}%e zddyIyB< zmN&m5Bro|cP7Ty87b6w441nCzgibgpbJHf-nlw;xnD+$unUGlJ$)DwyuP^%l3P^2R znNPc5{)sP?Pp6(4QWTg(dZnlRkA7tH+Q=xS3bR?%tSVh%5hcBvHVJ2V%bf;1`Z0tb z5h5^u^1m~)ojE#}Yd*1UG~(&(GMg6?BM`{CAx(V>kbpzbqy;>MH`$+ zVs5N}Z=|hkLWo?on`EP!{mp&rAqi1opV9h~>znLkIkX?h&_4(|hos!76n93q# zFU(SFK;d&w-^XzUX2xxO^_dIe+dD?cDU?k0ud$XmLKfboKfiCTd5&i2I3LGFQHlGx z=B;usX7&uNhR3Kf09>_tDFxA9okO}ZFfjW+8C>f9^=9pmf0U$QA2$CoO^0$d^(=8> zFiQ2>)2w2^kfl3i?0YJ&g67L8&H_o><#9T64@@-i#oqP}0x%UvtEW6!cgTDSF5_Xp8S58o)_Ik) zBjKCh`Zs)mXUh3!t0cXRsjr6$2Lvw0vueHryorPp-q#_biBrnarx> zt<3ulJJy*OYknhwZRSO00NU=LP5EdsZ;c0W=H;RC4&f@MOuN8GjwB^=(Qi@Bd63Fm-38A8uaxe-pVL3KI52>O5fW&>`*QN*MhGa;*Z| zNv(41)~2+}hTgWxCZL7Q(xFjokQA=p-~X?&#Lu(p!8XXX|B#N7zPcy;vkI$+6TNb4 zMhbr|E@d2sI~1HK(kK^rXmnT510ZWEG?#;<1vr;7S$5@Dm)W6Y&%+h$j{l}|nPSrw zOR3E#7BQ8!gsa%K-5g~CivILq5pY#VT#zptKMU+M)6|H#MQ3bX*PY*K#i)eMe)w(h z#DhpNIWCFgr3?>>MZq67d{3|x56sL-eM#L%IxsPV;#E-stP9`pSknxjHdIIz^Mgdf z2;V1M=&3MIT2?I-sv$_NX5V+c5u@CBnxEnsCzQ(hA9V@%ue`(={us=ZH6w_SC(bRK zn`5VhjGs@9&68y&@V_Sk?=FoFv%F-FJ2E7u=(~wF`6g#+R}~Y_TWf|n+3l?Au$q04 z`Tn+Qj0Pb;zxcf25|`2TDL%3-j?v5-xG&E3B)-R%gB}yjHI!wvKjSyMun98$8_Wfm znFjhFB}CCdTKxjL;f4Ip;cQ8mF4oto zv8`Mlwihf^$}h{-w&L85`Q{V8Jf_x5TQ}|U<2kC)1_;*NU-;RV4Vp{@^bF0sq?m3! z_pl6-Fg%G~;Jd`XWLR0wg_{3hBm;zOGA8J3uL^0OQz>L!K}{QuFNss#GG z`nvr@qtDcrNDQfMD#eNdEj=QYI$Pxog0$UO(4QGOhai_367%^|+5 zQ>!iFzoWn-OIK%BO6f4lm%PKZ%t+%eQOxC~>!q}ecc^K%CIWJ(D1`h5wB+6JW_Cs@ zRM!5he&aj$zI9q9qw)QIuhRxK{)z*LU;m0v;h(GT?SYX6{S(De16|83ncC`* z(dcnUm+95o1DdvggqloI1#cHB4H@BfY7!n1z99tFG1Y<vJ39wC!e`3QKaM9S-eHB zbe_R^5#RUjIQLj-3)-jB`t*X{Sayn%bNejc@90S>8#!Xo@3x$0M@3}&aRS|2w$7}q z;5c}-{1Q}BL?qCNhqF=A;G=}eZDSfp0q-%N1qGlc*^_>CX{q=!V><(p8;=P_e6%*q zyfP3ldv-SW$tb!eu(ortlR`^{Q z)J$ZiC0&Z2+x1BD`zYyE(u&!o7N`MMT2~pDn}C12?Rl+^x*?lLXyuNfk$i$#ba&4OK z*%j0QJx60<=jkROiRx8VQ#%jkW6XsSD4i|)Im%Ga!ynq z9%@ADyU8+Zson0Xto&T2bUAkMU2Lu=aSAk!b5i)6n48y?9);P7#CStEqGW={ z)9DtZ3*NYP!;AUj5mZw%8=)Y#c)EG7UC;GVAtr;6Is7kTsp?1tp$wk4yiNKh_E2}AGDb1>G}v5~-Z7-a+fn z^3WalAc4pBw$TYgQfXw&9n!j<6!6aQ`?UK}>xn=;lai~q)!Uv&4F)x=A}*9wY0cWW zoSddEoTlL~DTb2ZbJzz1%zhF-MxN`h9+!uX1&x1Lz9LPuHN#B?++@J-X|^cE-7+Q3 z;-FC{Q&0~#$`m?7VW2PJjjZ*SaLu^-_W%p@5J(8q^jXniw9+-l?fVn84B?b?huWJ8 z(i3%oVZoUavlGe0;th4~?Gm$+xBePsD(o7?Y9tvWLB zx&|maIu8?*hsdS`W!ib`C|9>DD=`I+AAciRE`av}3T#za;bde3l{i^yX%8a3VVyhX zPZAtw#;OK<)$$gpG0DM>~i8^{gT5J0cT&l$Q`->-`#`<5-ni<^Dvyj`}bP8Pf7@Y zfXtohc6p|jvrnjA%s7y{r4*+66#lorh+@nhF(@7@mQp7VNR@unx~Dik@@CI^QCP2i zcNLG#$38O3nX;l;ZKkcpu9{>t+m~oog0W3^AuitEPpXWFZRa>7`}H(&nL+O31${Fw zTro{yaqMlHb6c#Iad0)6;B$Z6rky)LV@kE~rxWzgX+uIEM=ZZ~&8%|ALql>$OKx($ zKRcgsCoPB1aDofcU1`r1vI(-c6(so{9n4Dzyv{7I`tTk)iU<2p96H!AzEbhgxvEFo z@4S4Xpq2NmdKb@yD_{|KwOns|ZHC{8QF3{4j6Bd{-Gt&?21@4VFK`~#IbnJTkXDyk zwX?REaW$1OU7QqhtgBgQGEGfzMGazcSZz-(-d+sC95qs&-h6ag+hmtJrZ1Z8ibl7& zOEAdsqPNx-ThQW@e8tBzz-jSKqA9LJ@-eb)CDy9Eoc9{({j0$8QzB^qXG&ZB`VFfP zASzStO^N%$JH!f2p%uk-`gRT|AuW$&Js*8h#x}od4{ZW)Cr!mv?)@@3RQ(l(_ti55 zt8szjlhlf6E57~U}@+BICC zet&Gcb1gG!dsVW7(;{%*25F9qU_Py8Cn^iCoFS-kvYOgC{r*9GdcH+mK&VW_?PghU z`^nA?9-r}CuMpQ=T40l z@<;Pa?<|L6Y;NSw06@nu;OkY>3Q_(oktBH__xbsq*^k?AS2nhB#iWTK5Y$8U)c}`W z%Oyb_i6zBCwI;1cVw!3dpX7ttFm*~b60E@n)p{%l(L<)7P+7Uy6N|%en#0&$7nN#^ zzkAiPlz9=6Xa%rcBU6Zb?x(~fzHWg0b}A5 ziakLu6XlaV%Nf8d9Kgv@4}YaaB$kbbuCEG$Fi5|l_U~XTmN-(C{<})7Y?xK?c`WKg z`b=v6IhF+WoqhLztbkZ={U#HOD?4)XVPrG6~;(c#@NQa{C#aDSBJc8F{-@dq)59!G35^ zxCfYyJ7ry z*6mLyLs`DlhMo4dnvlgowKNd}FzFx^qS|bx$0<*^AJx3nU{gIw;<^NWh<$5Uk=Pc> z^J|0O?lo7;2T0I|9Ykp(}O2Y^bD)F1H0x=c}(%*(`jf;&H#7$gp+O(!=6h2jk z%=2&Ad^!9b#uy~8i+;g6)0pV6+6n#Mv$z~tEf!6k3Vy2b=TTdYtPj9O>UFoy{%$Hm zGr6`ejd=UMiG0DU4Y$xQ*qhzp2;-pX(x$>nwV_GAn4eh_MEA{qK4%c5yM{bix>>=C z_tn*J+jtu~%Hz%Ne1sb&ZpMz1EM^(Jy?ao4_HiYNzb5iFT>%*W zAzab!)9w*(#TEMfXKOTBf%Rnk>C2b?A9K%X6x!Hl!Kmo=oIS3@PxH+7UF~jJgp3Zo zq5-q_Fnh0EbxLCC!5NV-1@-eIO$X5wtRKll6;SqCT*1&qMU8dfS-Mcnvw40h*OR1( zpoL}v6)gXxi8XQkkEtLF|5mS$_tP4casgMnbbU!>S85Ug%I`Jz%X)IgA!UjN4)=YI zDvjfPXNvkxv7MsvDk`*&}H z@6+R|C^TG9*ulr-DD@1kJ@iO72xPMZ&w39DN0gL*l z^vh*yS@kMj+mF2OEI%kqE31F*EhofzT*jv^Kmg&xBzfxSXagDLu@8o0npY?5qlIIz z^5;M>%j~vF+-S;?qwk{!!RtNl*h%lbQeW!B2?~_^*0>`x+EhtCG&V{eK0eI3*O$Tj zgC6i~Ye%h#Q(Q=;VQ#9Oyf{(Qjewn1;l*-Ze|*vOz?RW{-QpzP5;) z#V33G37=csxbMe?RIXXaeD^uf-@AM3nz*!7@F?=ft$5mxJd8x5i{`#atSD@)hLa%+ zJ##yY_RJ3*4TncPL&AkuLi}iSmhYDkTu5&Ci_v1bvUwMOkxNe2M;!cnA|b^<%H9t5{y1xs({uxImS09HZSgl5>#%SO)@7yYh1X9_J!)I zz?SQV6VxW9L=w-Bswu8z_8bfj!(GM?OPUUU(Z_Xq`a8viD2}LTHh*8ut@^~lyW*<7 zCC`8OlYSPJ)%)Sx3=%yS?K>f$ilV<&vUiw~eKZSbk*G@}m87nOuq{)v_O{icZbE8< z2qf3G+d7XM9G|6>&-jy|x!V4(WdcblKY=HNB1+@uS`*O1X7KSy(7-+)WCi z?>&I2zg^^?*V8SDH$i{LrEC1z($dUVx3V~V7X8D)#KjYFRo+e;4sD*#Yi7UdMy-Y7 zuqy8EE6&GC@$4u)=I}9?3fUY3hJI zJ|e0gHMlfgn=|Of?r9jxZfDT(heeT+)Y(l!7th)$>fxz?wq>O=6#cN{WSHC;IbKTuh^x~~%yKIf{saYgC{3di>i>sjjJqK^6HFG#<%j1-O^n9f>{R`mM z>QzEx!GA}_cE^FI`2G39?Va!>*&UDK@<{!|sVD7cCJxltYP7x%T%sxHi-nDfl}~rd zR0C=ns0W)WL-g#!6Gj(;A$Ol;C^EM-o@ZXHx+f z^9M!i*c7o)Z>BXnkQb`^no`-eDb5YJ8Sm{9Nfe7LjDOn-mt3L_r~kgok)oBM9J@4~V|SGmNZ$i@=^oqoJp#&(-zUj}R{93*LER{;hs@eaqn-e%eqYY?ip zWJwiKZ9M-W$k9YOnAIiBPu}mg<|B63a+2c#uozF2{?Vwdew1wNn}L9O6&eV*QA}D@ zh%?_Aa3J%(zcgO=r8t+xC8qv%>x$S7C#>GCN6!FT{J|qqEqEuP#>oaSUlKxlFpY9s z_3@6gm6=45c@gD&;xV2wpM266X5G=q_Y7)5RO{MjUc>wW`6eVJ)F;d=E>7o zEOH0yoq6!5WpFVQ@3W#e@1*qZ0Dmg|g?XbJ^-70#S*V<67{g3lMX|>V?i!&Q+@b~^g5wHs zkJS6fBYzf(;lNxg1cf5*Uo^=D!^IX6Qr}=1oJ>*~0Inn9gI{BU^`P&@iqQQhs*74~ z7*=!??-J?t`fr6)`cI8mL9C4L1U#PF48aX=ayOLgav2zNKuqgF^Vcc=7cYD9x=?}_fepacH^a5}_ zTKY0&26XkOr7JcLD2V*t?OXft>Z+W|Px&=*)xA1w@eQHPvDOjlA)9kfsD?a`L|*ml z#-}vJYfq_%Aata?0JCP_8V!3G3`F{6KJAxPoXS&iW)vpP1@!@AXd$k%Nfz<$z@e7LF7H;m7bxm?R@tx##T^TNPEhCti9aY=>NweiOQ zM(JiTZ5^!($JraZ|9AeZ>n_WfM%hP-BY{G0Ru z&u~AZy6sM-U$KAinW9ueWLG#EHOF7`W+FK_hiA`w~HApvY#KdOsJ?$in&nT&hYQ*#2 z{JxuqXFW!^21uV3b|Z{XKB;xI2hI$xAb&RX`Fgx&g8~n)E}T|`2@?jH$Xm*Gx#l5g z)r#9vXP*iC1)gvHA=071s`}m6g>00PR4nzlL+heQbCt$Lb01l?sYQPn&-%uZqQg^| z`e9Y8mA0j1UX36T+!QwZKyWN%)i{~#gCA=x;tqHhINmYfT-h_t9l!Z9UUxs;3ARHr z)Qt6q5M?|BC5)7Edsl-`ox)Y2S#0T-J{^{wTJ?+}6#;i~1Q!+>^Vfw+ZlfH=-o6x> z{wJS2yC+7NE(LG>xD{RTj+FZc)tsNJ#)=c=7WYNSg2)G7B!5TEp4IOiVuP$*ZXzk; zXk*MLaf%Wz1+68?^PUJ&<(hEyE81O5#puh+d_ z6+JcC;lsIMnz8H-SGm0S2~!tFICFlos0sNs^z1o<-_94T=T19+z zu>6oTV;OH+Bc75|*Wg--N^siUx`}zk9UPkne1FPVPg(K!%QO>>xO0(*hlhbM9AsrXPzGvDQp$O* zo}VWznmS$8V-1w}T$0z6D86{^MsVF5Wyb_p+MHkT_I2EL9|4^&ZEm<9-F2DkQNq|o z9XOwG*bo1p3)!pxZNv-1c|x3H_DY;G=*&Cep<9;s-s9hMjgAFU@W!q%02z}pHsw;w zvZ#23i3)S5>!;TFG90YgMb|Jf1foWtJ4B7Bieh%*E{GwkN9L4t2SXypU%}g3^Ubkr zZN^s^+$+`e@AFv;I(MRI1*MqaD`jVYu}Z9?Rlz*l?BiD+1iP4mlLN-TGS%brf40&) zD$J|**v+_~4o`@shK~a>lX*4;b~kUAxCtf?M2=mM&jro>-#&mT#0fHI~6vO!G@^ zDIjGKbi{6oVvXAQ`I?uut{kzo9^Xk!EGGtSQE?w_$W0x%klJr88^`-zKpGYCjnKgo z#ZEaPI18m?4<$F=|7sn^k=5r!Dr|jN!4jA`%%U@?+ArwC*Z^RQJM6!;X}!4|{2CWm z!Y%|p6s&&@!$c0dTC2haT+x>-8OibC0bTj!C`{J|_SWc=)@8zFjg{^(KS8U?(({eF zfrVj_MsU|b({ibAvrl5oi%?gpaH=@%NcIewIu4kmnBOvv(=5HSl*`7;=ZG~~F=!5E z|5~`6sJ!>6H?%rmaK8-Re)7&RfN3Rou%5t;(csj;6SapRPoX^c@SH}H?WyTmg>Kbz zp+@P0mQ3aDYIt^!`rSbqOnR^mg*Yv)pA&06c(xJbQ!R;~TKAGXf1EP`a&LJEYKmlJ z0Cr$Wz83ZsJB_;^R%reh{4}np{r-z%J@cwRs}l9jyAVw0)!`i|DWPQ$FVNC?^?v;) zf%S}o+Rfc9{kRbO7!zVrU-<$nPOKhuW^%> zJV^J)a7!<|#|WEn;FmhcNiycTM#(&@gu3v{h4c9iIbNCA;C;O$1gWrXa|+-eFTDf$ z2_p|dr#{PIbstJSKsZ2@oj4gE8t zS1e@)|I<9w(&J3%)%b;|; z3LU>$uB6HU^5k6njTyi85=LeqQ1I$dqX^^87$mx|~P+1{9oDM2~|NC$0(p6S>iPJ?h z9CG3Fu_WJk&+%`<7A3VAN7oL-g2Ew zg1($_3s7BGp1UY{?RZmL*}<{1)O|jaFQ0;mDxwe23llQAIV^mYbtQPSEMX`Dsy9QD zNJq|-+WV8L)$28N&57mm)ZvRtKi%GEnpt>K>5R#O|9U0pZA}8JZ9xW3>0_y}XKfTe z+%B`64@u9pPrp)mTOs~}_7cD9Fh}`dGod|pOfNY71menmxjMSwjCgnoX|d4AtKj5L~d(Uh)61JxII^j>%%lcz5Wkl z?-|up+is0M_68y#U_d~+Ql)ngsZvFH7YV(02#_VB^p5ln(gmb<5NU=UdhaE40-*jRG30s((DDI3Q7jzF%68}cMjO7elcxQ?gA~Hb zy#Q6y^o?O*18s+K;YNPp;-cr-LT2PsoO5z(HwfaASvBNs!1^lCRuEnBpg)ER8;dtG zIsyG>FoWeiJm+W?>8wn7lo80$zeYdz4As*zBO5VB5F}N7Y1zg1SnlbjwyED*zD|nIQe{KEoEv;ny}_@_gp&f zSFTwC9zl1aV1SDSbbo&9)A$dWZ%6h#JH1{A0W5dg%;UThEq%87BNc|rgZaSIt#t8J z)`Bv7cFJK(t2OaPr`NzSQ#IUd0Fvs@*O zhnU}E$RSMfZKn@ns`%`5U&XXZBq`f$M|;`rwx3&D@21ZOKindHG0?bh8d5KYJ(AEO z)I;tg2Hs4`#k~)+$l=V4l88{#`7V##C_+!OX``3yB-ZJR>$It}|2dHz`k~jkyLz%u z6qyl~+0S9NCt`2f?A-tnCQF>fgfe?#riAt$SgLe|w0u8_#+G9gA_!U{Fbxhu=bZAU?@4z&7OB!ktj28L5eAG zIh{?^H|pjwNlWPBo?VUgt>^Rxyv)#7`QP~EPCcE8P4mb2T~2rgrW&mtCJqR3IhfMNESb(XwI@AqvSx6 z&g~0Q>@+_xzjk@20cJ-ZLP!vv%C6);!SlhVuPwW21KU+O82a-8a5+x;+kxBOvC&2O zwmC(aE5SU=>&mAEW*Kl%;f5<^zrcDWmjPjjKc{b0tFpd&fN$DEqMi9%6#f9yY|&mc zdg-F!nq-9`UE#YmA*8tof2jS@{08UjwK)P4Yu7Ho4-?X_ry6fzEbL6!%Txk13E4Kv zkBeJ}q}#vEc>Se4llNN;cQj}qU}kYxDI^ZFFlN=;N4JLwM}G`-BB;d+2sU z_poYt#A+iheQUSaNY!~vpwb50#Q@vR6rPw&2u*sFQs}WHV_inYD>*{gv28d=Y*HVU zcNhaSxJwb#M}{Ef+jE=zsgs*g?<}{_t=5Cn>Df)!QtS}*)O|I#IcmxapwCR!L%cPs za+immrV);odv8fJeUvHR+ct|(3mA;2Dy14Qyv`)7K;gB~Dy`c8o8!=P80z6*2OQ?N z-8C~9!FOHRJKfhlDXA0q_R=@#=FIAZq!bMJ(I{Oc5fk)bYV~wXIj@MsB)W<)9=`6y zXmRTY-us*i92gYuM@r

<={^*1X=>3ER~qjettXZE1>N&Le9Ar};GQ9>nXNx*b{_ zDG-OTzgTNN6?Gka(zX7TR@t|VMUcI-<++BLJ#$vp?bp*Ely6RFGMIEQH(N8O<>lo9 zg)|1-jIidTFGH@yCm)7JP*He>6D-%7$G=&0$yf06UdZTU&b1!7?j6{tKCgR>1!Y>T7+hq5S)GLy& zdeWj-Fpm_dQl6+;jyEA970l8K1&+o7i*`~Hh1a-$uaqbTM;nhi5GwiW6PZ*1c6wej z(E>b@1NV!?ckPB@YVo&S{_NWMiWlY?=4%7@DVwZ|EE6Btvq4g<@LSnV#W2?XdBid- z3Bz5#$q4u)G1-8?S?D}-2^Fa)`}}N?cBy79XbEuDZr*j&Q!Yf^Len(A-Fz1Rr9UD& zha}KI{e{nANKwdi*Jcj~O9xQh8?WygII#Q3KB|D2#a-X*i&436$0m9(20$G(hea!J z^**roP4FPj7dAtBDd%U!s2X7ut`)e|Nx9!-@Owp<7QQ>l`v6p!j4Ft&y-@h8f(4IGUAM1UKX(=X-zS-`}@2Oln-+3+k)R&RE>dOq0xo5_; z?h@=p45-=;1|j=uV93uX!Q^1pF#NnR77vjymK&laH2EST9-EjO8Vq}+6sDOG!00D= z@kNj7PYi6)z#Bg2v5+_swPENtg*fF-`RFm0#=WVXUXRh};f;*EhuOM0++;=feOC$L z{k%Qxg*kUBs366gsH)UKm#WKyB`O{=*GzBt<}WY?mfkqNdzJ1HFy&EVKbYky(EV8I zF*;u_g3o%W>BY|h1UHP0#aB1JB9^F;j%qelmP>Ie@Nlk|tBu)Y(qAGb6GZ|2{vlGv z{`gqI?9DpEa`@@iah^pNH4{Po!2;8)Y8_PHPD5$SmA`HaIsxlbi5ZTA5SR(OtS?8m zLQO>Lnzc?)1vm?UA!clHStHSCl4U83yQ$hPKuKB!ZmGw&ckk;^dFL~f&RG@@mm!!7 zA45`HJE5zg(VjlFv`d#w@%xdW#kKnNckL&TKS8j%g_Q~f@#;zS&z6!Exb(UD#@f0U zTMO@&K#ayJx}}DdsaLHE3x6oxrp_w8zd%ZyFq=#Dd$bw2&{aXn26?G9C~;NWJ8m6e zCTUwWW^cl-`p8wCg|6|$C^Nj1qfTDB{DepNX1_dbDYZ*9&=A7d6B)CS6ti9C-9x3w z$E&TuTb%eHCa0>0EBiP1HB9dbuMg*?!%Ewm{?N2-7;p-w&Lq!d3!Q{4I`V5W0&pp+=eQl-%HJok#MCh$O#@}ezU z@W;d0l+?WWE0ZfaXVj78jEuJBljcKAa#nn_TIPr*!RB&yiKfQ4hOGj<`K#p-mB)aB z|IG-T)5*8X71_Br2U#c3pnx~rJq*jb*v>b61(iTp$5A^wkiE2b4z@cMtl1-=iLdHp zLa9Ut(`W@DRFCC!RKf{opJwk=o3B56|IlEmJRoIGh^ei5HT1Xi20EfaCrOae`tjo> z^-<7Y1Qiz0s4ZbP+U9;!hGi}lnbmMiLS1!FuQM0%qrz9VrAH&ul1{kdwR_j2;{7-i zlr_L!xD##*)@+s8W#KWsKaNxxrS^8`ZnHv0o9&mE8W$&EFg_ALIJa0t+(0v8E`_HI#32c8>4&!r`=1+1_ zv0ug+4VLF83Im6#;sJb+vmm<*CP|ia4&X{Wq{1rCgLnsOPFQ*kxiOg{=jN{3cNa{r zI?+>bn@>KA!(*CseY(MPETYYmDcqe^3ab{bgEm@y@m7|hv-+h%vUFv^E1`7r@Bz&F zLnCk2Fs(N(n+(jfyuh2C3#v7Y{Z}xans7e2tye&WPd&G7q|cdC*USU+4kE?I zDD@QgQQ0absV>WR7qT<^FC;a1Cak#r&{J`)o)lV1qJg`|(W7nt= zu+@}Ua}*ra9A)zKk|^B^K&rf3L0~*=z8H$Gv_kfVpxW$G?{U7}V0z4#{0W1vv7IgI zPWH&)X6EW!%##Wc$<(<;eD;V2L#fi7(f7HWbJ0kbn$%;6{#@U;qx<<^4Xu4wW3ssI z`RUKp>qb~q(4H;&$Ls-`U;+*xDS8UwCsw^r4-xyI)L0)dH%#J*-7Im;+r@SkEty}% zhg1nX=-rg6;_X~w;s(&FoAO?l&$yae9odg69qNl5Q2g)b}IHz+rw7 z*gO$SjF|NIo~JKi+G++v!jKOP5JdI$L%85lc|6oLp8aH(PWNs6EW3RkcBk}%CVgJO zN0)$^pk~(E@l2GcaUBojU~gji098K03JuX48hj79xF3$@i@0% zPW0SQ96R;64Cia7n85h>Z47&!RNe)LILqU!;5!d!3^voyhTlm0RDamsnc{4weOmlg zrN7i6^JFL|E`OLTr4m7mNvpX>#fs=1~MJ0N+Dp>4=lDKt>*wFRZ^b>V(+vsyfZ_FuAdWbx3h;HPTP&j(h>cFt)q zNe)s%)=4`ls9<|Rf&oXbY9+}O<7$<0JK zH}7^b-`9^zo0rM_WQrF}HJr_FlEj?|LTdZhsHvK+;-9AVWY0@!#`T*0iWfLf-mB3X zxjzd1Aq<=U<}vtW60ga%^I6GA6+`yVezVgO@%d)NN+N|-6syo^ph~^91ec+{t761j z79v&-NPUx;!tKSp%zNsBIT(obidk&bz#FYu;MG=c&H57fGboMsk!#i32Lp#MjDCde zI_74lsUe+_=mUms!{J*Xrs@`>Pc^4p^*yuRlyRAgrb0xjX;jNR4zO;wki8S526`;M zdyyc@KCn&zd|1OYa(;U%aLC_$uT%R)sA5HB0CGUq*24e z$jY21vCv5B%GOe*LX%CYpa2-2MAZg)*Z=CF(FYiIBPY?$ye$ik`G=Im%k9 zWAL-gZP7wu)i2yaQGWANdtcc~IOz0BMy|WXPoi6Id)!W(un88afi}9SQa*thp?A7iN>JtxZPM_rhY8rb?OYFL zXhxNO8$|kLS{5q=&OK@5frtR>e`?juo#8uPFT2T53JrM#SFJ(N-rb=EW|vWtVu~j_ zJgIP_JX~A7O1rv+W;ay~-Ki(=b4)W-M{BTw<-^N3DzCenV6{5)r&?`$0#>W;Z&zcF zEsVJxO&L_SD!o*h!jL&#cjkR8G4p$=vIKtXlCrWVP0o#eqjOJy#jKe4wcT;gxLXcF zHkA^(G)RMj81(m)tOiS?cpS&eR&$;RdjWoBKNu+ zlKuhfkF?!P#KIsvYP*N&;HG&M3&N})hK$bBm)4U4bM#o=z_k3;wxFE_4^e_f5-MaL ztAFg)S=irYjo1e&8d!+8=*gpwe&-KMmhODcE!v4EJIScaf3SL}MmEd}|YTyl_`sOyFaUd&IPK*-1riPOB z+ApXjWh_M6aPFO6*4n4Bm5?NWVR_;nxGlQ$=m!#;7DT4d#dku~D%nl7%(^~U_TBIZ z5f+vXdZHjJYSI2-WB$mbK0aMhkh(?nS*S_ea1&NtPr0P1R_ud(-a zlOV(T%7)4zb)qD-_yXXuhm8rq7a)#O9PFw85j;1#IH z+h?Ytf-)}7p;wDdhdoqIu&oq4+4tsB?D7PTi8+ZTOY%Te zx{*bHzU(6UaPBOoc?shegZmx%mnG9jZwpbEai+@Sz;nIMwj5yo-~n^UB zdp4VsUW8JNaV)?H>jC4|eOy(NQgc#Wo0H@F2Ven4!pH%a$rrlmyRE1`_J38SJ>lw& z)&AQk#FLR?S((1BUg?SCvFdWO2H0hFc1L(YK|5Tvn)DNVi!U6ZNX(wUh~Cc~MlK|KyYP z?wWCu^>jABb?@AQE0IM9(gdtbA*z-k4X&QPO5U3}MS3ZGMb8euIdiG|MAwjE&f&mw zYlofVln0sa{#IEOG6bIQ8XQddX-tF!M48g$3x3&0UL#V zdIu$BNNY>p1k2DGD9@~Ip0YL*xr_NozSgT8jP3*0^v9{54K#?n?i@qU-~mCM$%d!8 zyprx%{G$c)8AU0dv(iBCi)r~C83kag3%tX=viclU)dIO^uWaPFuKPVDrS^ED*0eib zU-URbAoQ>$c}g1S5bvtGT8(nTvcT6#fWEB`ouwY&*1|M3jyWxC4l8;rex2XoY@3B0 z=B5$iyeM}GI3zPikn{JG+L7x4t>Rr8+7WEcOYVl~@kT=t1%Y?O8-NA_@R%qXY8w~n zxJzwsNX2#r7uJyJSnj6Tx=~L{DPF{4$WnPu4mw*HEXr-s?@X zI?|mx71U$=i5h?v$sZjVIXWf%YN;C&KeH@JH!e`-9ds@Usvo{nbxfqZ=VIKt{D$VO zeI!s7@cdBfWS7ATPbKTuucK;!#T1{Lj+ssRtH>gv!AnAvpKq}d+wi@~k_$@0ww7EI zPo~OylRPq$CrO(mLrT&7Rm84Av!epO4BY`F>~V9x9*zo9o~>=56Di54>H7ROXB*Vw zcw2Z1x6qI#b;L8=Rladm+9q`ooPdx?ca}Z#sB&}DoFgepS&T!x>$(QE@)!80vW!6u z!2W=?gW551n|(==_nB7AJp4`AVJPMxGf(JHp*g827xO2R{l1A)wX4z+WyQ2OrXA;S zbr>Rumk=;GM(HQTq(3Z)l3}_Ha0V2Lc-?tHPFD8Zu_Yasfp2J+Eld^{+MrkVtG$CD zIi)bvt@edj7pynm@7Z9diWf`nG`;oA&GCs50Jq7DY^&b)(m- z8OPRbaOi7X5Jzarlr%_biX=@fP=&GbN2Y{o6-N#rETkB8J}dssHW=T6!zGgAlyjb`;L&f42HFrClq6;i+yZ@G!Q_jlLPP?wlS-#ow(DIN66-3?o`)Sg$CelPDCJD zl*KgSfOW1x$G>-ssFIg{${qF%?gHd7!Nw>`Y8^XX0>8}G8*U9xD3UgfO5DtGoodS0 z5UIzUE_g9L7QJ|8Z57?6hk5k2BR9C&eI2oXL&J+AB1G9Rslmv)!w|^MGs|$-_zkKI;=na(bfBej-9nlv)dLsz<}XGp;)?Icng>J{ zf7dZH0@|~^YGVFC2W*dIJ-;TThp)Ffcc%Smkx^St>a1+ep1Z1LaOZprtf9YIiJ zjM2HW%9*dwTZ2TVr42xpN-BA=ydcn=i#V{zsHiabR84Qj2kLSI(l_X_QMUFs-!0&) zQ1O&`RW)9nXbl;6*yJ~3Zh`pW} z%_{$mBla+OmPSw90Bh={_KLJqwY{z4*LzuWBoy|hmXYFetB6gy@WPOA7I)(9a?nNP^DNgW{Om^ zRAfu(o{-)92R=AF`jLMpOq=zx0j_v*uxj*llKBeFPmSHohWT8?q@|}gd6@<&bo?O| zfOl=#onb{*c1aJ{9$X2s^9SN(Uh@8%R(NefZ^w%s(!0nD3J@DDjS^D8W8>{~{hE)0Y2&{3>CXHRDvqAYgDBVQiq zaK=bjBMnWvgrnXUqY4oD$IHKge=3%;zbh6I;eS^w(5wircsvC6>^-|+(~>3rLLr+# zyRAzZqhk+r{E=a_Q5<{&y%--q#=+5ScDjfLRWnQt%~)%4xT=Pz$&7h1nHt9x;p)7G zI9+_Jk<->Y@2sb|wz-9d!c_c&yvh~b2TAE&9;T0U0qfVdDHb5m55tc`ia-aow@E2Y zt)S2VIiNl%0=Y@mD`QA0j?G+Y_Q|oe@+42 zD{Oxdw3dOLGgmAdn4s|18Vkx-d!61Lfit%Mcm+PvlnYiFyjVqD_GRc__TQ}Fe`T*P z3V8YP`|RP1dD?OU(zqY|as=0SN5iu)?;D_}zJ%czV&blgeMR)qZ+XUx93J^xrA6Zl|UQW;b z)mL78KVQ=cT$LaX%p^r%fcQ54;NOp3{C(l2KOeh>gTSKCrv*tFs{nMa4$S>UQq;1C zKWOq_-75I;?ffub9Dil>o2_khVQ=X+3A&T!$L0qmRv4CbX@kZeIXs>X%up<(99_)4 z!h5iw@xT3Qt?dLcCr#I2UgYtUE*r+H`|mYwihJGQaqLYyvePgyR>%QRMb~RPZa$AS zGITfE68-1fSi;RwWPsnHloEqNHb?T1{j{zWQRDYKkHcDM2-u5aQHHRd>(Wg4A!^0J zE43&zYXaL)J$gpl_@Iw5b{ikeEN|JtAJprk|JvnddbK?F7sJv?ldtx<`(?r|NPKBx zuOw|baR^ruU_9VrB!!w3iH#JCmvzptqz92a!M~6^4nBWzd53_)f%)syri7nVSL=qv z32LO6dd@$1$y4ju-#}jZdRAl1iZq4yl5c=P(rUCL8))&GoMK2YtFf!pF~8iypWZsI zPle#}bqaf88;N;!PuYn}o|Is<^k)AJi@mew2t}q&$VWl)Y$$Tk`Ulih=3KoGOCD)bjtck0kwDon|)z&?MGe zSSPEr4EhWWR408=g1&6730zs9pF5EmIL8e_M??+&)ODr1Zz?J(EBa%ij0Vk{+DcPV z=Jnf;ZDSVxUx2-d_21Q9Qbbw7k38J}0PGFx&qw1Pd;P^}d0NmyYt7ZUpn@sNd+kgp z8m%N=-o;(?<*6RAtdqvw**&l1v!bp!KBe0iiOVAnMW6}Yt#f+VSBky=0_%l;B_(iu zADjBGHj-^_{NM&11n}sa6-ike%^H35(yWry^?2^n%$Kfc;|=btAyW6PgX_tsUlm5# zl#?|gJ%Wk1gyh4DUB6rG;V_Ae|Z$#pb`WUJ-76k9#>Z!+{T(!;i*Bz<|ap$Wk4jCAJt37rR^ zsocJnsVVD4u1ze}asdB2HFGSOV6^=W_1gpUHG7PDvvPg^5G+N=`<2*Nn6P9uv(@4P{CI{JhLuvCpzS9EdVzMQ~S za<{Mk^|1h_e2iIIu_?Xp*;604>zD?BlY=#wmos9Hn}uOjZtc*7K;vsAo8*tv1ntHl z!K>)*F;2#w!XOG!!?Boh9s9|GC5aEmEIpwKR9r+F?+$1gDml`>4)j@1Z*=SomRnuH z-i!^t!?=rj{KVIbkhSKtw6BFG&`dQeVR!FBygVFEZWs2J1#C=x&RD{=|*tU;j~~FWl#fHe0Zd^deZVG?5U-F*m0h!esXA4rII>ozrvnt1Qyv7 zP~SR>9Bu(iQBne`RJAWX+3tOuw2q7veFk26=oM;1b(`V=o!|4h*6ceWNRbmYnM~e{ zhaW12DhwAEv7zy52Q*VOrIylqLY+g;r9*ToAExKThZfCu&E_#lmO_CyX`)Gs0aU}R zWg=HYx}TFnq8~MJt6wuhLs7N_UygsnbyNtK2FIRN-h0BS`>VIxdm|c|&ZBr#kG+^L zd@d?9559@l3v}jpDI?g3D^Xb$qa;?Q>MMC*rhesG7JYsu6O0-{$_sOu3o$pe3y0I0 z04>1PyS8(}oM_W$x`1oOY;>z8-{2{;y`Ie3JNF=6U31EiArq^*ALit9Q(Sz2Q@wtr zH=#DGcgN^BhLo*!z*rk}PYk1!7_8yyvGqWoi4+8uuhG^BcvS9SpcqO{n41o&hkt3d zuSw!%*RWCso9_#axz8AkOEg-)Vt9 zz1omf+n01*WKr(#kC?AL9=ow7I6}{O;xV*(8c(D6VLU|s^0<_Gq6$FYCR^)iDZ1qh zX`EWVuS{T~I51 zyFJE)JpedI>%`2@Fkh|Cm%(welSu>E+;LS*Wix<_5jS19Gk&kBA%@a%9*3yL7?V}{ zd=kiHN(;5BdAPp)8K*NHO?zwfr_$%_nU_q4N6P9mTu5o@gDyx0YK5siA{FQSqcGgrP8{uM))J0=jJoJG%ezL{4Wg(-dNHu z<=v1P*u}TCahKh@&zh3Wjl(g+OiC6N8)Q~q(TXJCBOrSjHRqlTl6Q~d@%%^Q7RX)C zwR$GM<$7}YdTu_7MoScB2pvLCuTj}8I!U)g^~!t7e!B;T{#kUE0(w#gJbTbV-LvGT zu!(SfP-8#5>~tLNaV)SGi=52_Nfif~N@Cj5@OwTxT~kD1c(duxUtA5w8__={%ntC; zr3)?)fu9Rn4nV$xV;zH%F~&~_-0p)Rk+?9^HoQKnzPGddrxX3Un}*d2{_i<`FF8KD z>cBHDnI7l1kPP+#BKE~^Uvwt%&)X&IhR)ao1*f~q=iBaAOeZ#EyE9pd9!r1-x@U8- zz6EzbYq@LwbSJQ7?V{Zp9dpN{n9b;6&iS^2jmfY#h;=uS@+nO>N>Tyw6^&>UZ}WxAWC37gh7&27f*G5r4gH6I8o7x22;L&o901E-HrK`np>3 z7jZ|u+iHO3jkw~y-bB3O2d^$+8iK;(P@Xgj{aStq5iT@8`fz3??X&ZV`l8k-ZkRkO zR2)4?d8U-9+L=5cHf^a9b=9kL=Wsv2)2-R^bGPo=>jLTd<4{zZX?D^~5a@aARWmM- zEACR-ij29Z`8m~7LFRaEySBrmAAYumrC`kWOa&|i)+aP0*1d_vy(}7IKggOYvx$GF zh6{V0shq1evDXOHwg=dGX^WqlpOax+(5T^^gpkL=>slnMI$aZzjSZo5kiy#XY!V`$ zV-AtGXoo<Bs!lK2(#eA{)AOb)#{7D8lSidYDiHpj=`Q`JUPCk z1FRkPR0*Wx$Myk3Q<-hS+hZbJV|X10kp3^VkC*PZ6s&$GEKG&2{i|fsXueB|_NGzHYH`8n0<)IpkobqQW(v;Q@aLZBpN_ zpd`fa+Z}m_=$J)`9MGcOKeHG?Jo{;3u#3ux)lttMPms<@6&AS5+V`~LMy0?bExyc? zrsDp-k6!H2nhuqpmZz{AorB`u+=|{Q6@CGXZC*s$x{aqNMxR)APH&0M<4F$mKk(_3 zF8)gM`Z@gExYDeKA8w`%Ds8dS1Blz_BT+^(rMF*t&8(6mWlBze%UeZR{;P9&KEmDj z!VXX(=?|%=t+ZJ}ANKuFIS&S-ajxhjuYXJZ>mc*!Z5a>mgpi5Nragop9^S)|&sumP zQNVfe@!!;TY!66nyOWxaZlHtR$}0k$g3YWeX?q}m>Vp#<1-&QLaCxrmYPu*R(vtty zwqzbR+=%&C+tMPD_+M>HZQpdG!CVHSXqtCA-)cL(!U`=pXwN*y9=dq(pBL67GfMIw z{sudjqUKvjjGS;29^~xStSc{M>3rfJo;%KlK*rvU@MK1z9ViRXbNjZ`;1!w{D)C29 zM--v-MfATh-MgWY?k7)krlLP^68-62vXnEL;3>CkwEjy`_lN2pEdMvvecM{PL9D-c zl-1>bsOnH=C{?>gttVGP%LYPubRg9YfoiiAPu9ExM9IY(CtGT#6c5k2F{eaqr%cJU zt^@yFRkshS>IC|Vq~i|P>atec^#AVw64C!1Kmz`M5EA99Qj0;Rcan+W{|7>Eq-N^<7UF=ja&13@J;6V7#tfAweO81sp&FbU1?8cgw!aWMHh8Z zJq~cZavuiv%%9p{36>n$51c9dyL)MbK5ct(fP~ZzS zg+16xc&}mkYBshO3DuSm?V<*Ty%mR0?)9TPyQ+WM?GH33qMgps%;?~ zlFXYv<%H|G?A1g5X4AJoHoYjsk}_9zOB#E6t5nn^PXylh{D!*OlLfb=71+}@6#pd|CnD%PnRG0Jb5HBfyzdL@-ZmZ9xOrRqL44;C9TVU#UgtUD8}OGt4}omrr@()4<}l!fQ+lFwg^d@Ji<{e|e5vuVv`D>s z0pg`4-7y<`lpEXh%W3AM*M6YfCOUL?bRd}lY>NsnU4pA(;JkXRxNeWXJ{#0`%+N-I zYMZk9=6lu*xgcL2Zu1|$T%}~sRTwy@?*Cs1b7mdPO1yG)55Y)}f2=2M8r7;qC4@aW z*n^SVxAwfMurN@(s$*7GhCdRC7Zy)t{g3#DxVGbEKuN{xzxnd1A5DiXKn`T@)pzDk z!hwdMJUrt+{M&!%H{cKdHkl(+bjERh&eFGdtaFHu9~DU!AL{JHWTpP8>ULIcbPh6J zX`{xLjrN}5m|CN!ez|lhUJOYd9;r|9qwQAc4E6l_O{97s%v2^Sz6O)!#ct6T)fE?N z!qjNiMKk6RvNG9qw?CV59_CP(`1xR>q_>LZ`_F$gH$afX$BO^3=Hq9pEu84(hJB$p z4aXQ9bqo5T#-rL&M-Ci%_O&}}Q8gc+c{XQBlw_JCe-gfXsxymnb_!)*SAQU?dXO8( zPWK=i>g{m8AKY*&`dVK1hSFpg;x%S!u&%+<4iYTIg<{GT63;ZMw8v=@BAb{JAiF?a z1_$JW((hi1H+LLl5Cq@9CbD5wJKkF|&Hh{>VtYT6j3?Glg=tgCk-AJ<3V}IQ4pY@Z z=g5@&HT{KukbLcsK;5C?=wd;)gjqbb+uYi1w7#BllTOZPL&Y*%yk zY?3*jJ;U*6+sU;{VOiKmD>aMr&#r%lmEjgIu5rb$h8 zp*RmjcYH0a1(aj5nGfe>|4abDX1$$sjDcHK2rltY^+~_|3PFW`MwL;@*JTHsGj1t9Do zT48afZ##59;bRX9jC%k&tElW8hPy-7S#RzP1tNp%|AHZ*`74;7KNJ7qWJu8ul^r=& zeqzEEOJB#l*e~e0|BsRXWDl{Ht@mFoAID{0xCp@9+&fyM8=)yDH$9T0VZs=xn7|o# zoJ@M!X5Z1HtY4K`_c2)f8S*G9u1cY;TWi|p9`7D^qKX%b1OZBBqo11k zE~S|WJ}i3tNuJuISwFOXGE>95KQK)jOjj2P9GKx4;BHb+;@7g18(1xUH|<3215W#o z?(8}T4!2~f3tbi3>{-ChibnVhxp-h^cJ=7Z>6HpMdIZA4n5ph`^mS7Age38+2o}G_ zs$*v&NQJzo^QZp%**gL-zUseYnxan*Hm_f~6> z=-$a6xixHg`I?&mvhiU)L8`gch{epede6?rZ>7uY^`gJ5|B2gl$>|aPNlsV2m#jCB zq+*|}fnD-%PQP*cb`^CYG1BVP=H>?V{%l!r+8ZDGQ|?Mt(WB7)An-Qxpl z@tecp_b?;o80f?L!_-|5cmjzp{xah2=TL3FjJ_;LCa>$T`(dJj=9^B?;6qIh*{^Ri zRWy)Soh7R6oqb|3@1UA7qn@rn=bc}7cb?gifZXx9V=?as=K%+V01TU>?tYT;E@`=p zx_Nxl10ffF)@}fhJEI+=?*2O2tQ0WS)RJsQ#EPSIQr{}HVm4J{5_F#-DV!&R*>86< zdl;z~2+0IxYgYE{YCp;WohajN_9xQvJhDf6=W~oj65#NUOfB|GM%b~|$rhI$04hom*8D`?tUvB|Dg-Zbj5uvQooht-ztbblj zn8Rai1imMa=yyDExZK?Hd63MgH!n}T>Hx5BJ*7vz8$zMOAJ>)Nua0`;vi|I1CzT6(Z4Tg6PU2JTYXB^26b_nnMcrRruHm;M?kwPQG zMV-(>6S($VAEom-@$YLuC=^XhGH^HOT zwp@6I>(%Nt%3ptvd(RLZUBtMLa~uOUR{o&ID5Zd)&C9Y=8ktNP&IpLgZOvOSC!T@#x14Jy4U-! zC7hGn=edvK(ERc1bx>zpmxDVe-Qk!1do!WTooYLnPDQaO?3d{G(eF_SN}5K+OMqs!1Zm&tT59MxIpE;wR(?CdL4&a6-P?1GusJ#> zQr=)*Ob)fOcqUa#g~SHG^^)}()}pcOC?IuzDX*@gP;WnTh8MSVmmougn+MSs)e`N9 zv6vp(wP{!2ea6EkYk$}d~w3TQb!T2fJqcD@kt|Q znW5#sNHnT`yyV)P`m0Qg?kxG&o)CVYIAVF(sG5BLHy=>*h-}pQ;B=51a8aDlH$1dI zc4dg`>vxlsvT#!rw706D!4i;BbQlq&;1+(Gr(vgouxzveXAA3J-t~cF` z!kbR@{+hFyfjqptg&D*1smhZx#1(8bzAIJgkwOvjvJ%YAVm$)GN zmUYAhXpgm%Hw|{XM;;N_ao8BHq|`*9`Y|Y<02Se-?+S>wdbRe=JMXVsf~lK|ooSh` zQuf+1Ax@YDBgv3FsJ8EH)8XzmH!_!ZYSP$qFi;f+BO0}+ciRK!af{-ty}kEQVNW~Q z?Ln%)>H*(f0HM&isw`G7%n{w2TS3dhw6%+x%*hz@N)oBzNLf%b$4K6e8&RI z8VoUwO9s=5E{FmO*s zRsu>ex{|&BOh`BKta>EK3J=sH=B$2{nRU6_J2vM`w&E`wYWK-eq5G4-DB>7jpAaM1 z@2l1`+#Y}|Zz+`am_oR_14TZMYVxNt`9F1uj4)z7NO;ZsYkCce2`PFh>2=Q$+a z5ZKO&{2p$&m$=~yQ5pl+;tQOS*$;lN`{VQ5WV-KR*KZVU-|SbGFyr|yx6!RZJWs=N z{O4)u0++AAu$dNDdX>=B%y(I`Un6mOZ2lEwq8{3a)j2yY*vziO=Pt|-2v(80&g>sjpTcT5`jKS+i*97;TH88AJ=wOD(Z6ZoL~>I{n=)ryQ_ zceOuOz+x&R6b+I48)Z*YxTLljy!^=GXJ5&tKiuGF*bST>czNHJ-)8B~5qrAYpYu!N z64CKw6v)SREJp-{W|Hs95vleBf<&n{eH*?8pYu|FRdJqDYOEUC7uoXKdgy+z|2q=r zj=zp~7-m3fY)r(?R#kyL&AbfJ-uT>d=>JMURveg5x2*bY^uQ_AHnl#!XC046x=6nG z_3y2bPeWrSE~&b)4}|duf{cWAzWDmReZ4%Xx$K0GV-o}ZrKX}-t?-4tx3Hss{=__m*hEN_t{fLLJ}w?~BbM1Dy{Yx#rX=;mIQ6Q@mPqs;!8EZH znRPvFHbp(2_^HcLN#XSAxIYWT@O3)`t6UFKRq>xpMGUxI3-G%V*FkE<&l%+PscbC1izT3)_!$@9zSCSN%HM)Qk46;%*g{U0c#35wIhs zudD1E*4#7MLc!lihf%-yEf(?Yl5CG8=%3+_+r3wgEhj6;MEnh?|1l;)%_I|GtkvBR z@A{ThG5mm&)A@eodK(lpTes72T=%u-NNf9`1%<`y@Y?O}t4FfC{7n9-b@k!hjoRJu zOK&6KDl2RRrAkpvM<>-Nt?VySZdb3X&HMF6(>_szmvAxr)tig2Q8C*rCNLS-`KL

@P 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 z%0AIy<$0}kDSr?&$m0?v1#Pp~sH4Eej@h;|KVt)L~^ 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%0Dd{BQ8kP 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%0DEp|ppAO3XEvSDk^rrRm*^NF1Ts8qW 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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 y04F)-i*^rmKYR3@5|5=`?QI92-sQ+W%^?7n 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%0AkzsL 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

4uz(GoB~hwKtgmDY^gU&jeo$uQ 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 delta 2675037 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�D=A6LorRVcu+kqt_!$6~|nl2JhoUR8_4!4FZk(WnQ2{ajj z(eWV}N)f-%D}`>qdcV-GLUHB;FDa`g?+gCqQw7ULYFA%UpM5KG7iJmSbm_eL~&WMuZcA(3Ae zLs#jZ?4$^A=QS(_w@0WD59;7UbWv9C{d#;v5xzJ_5q@0^?0FyLafaXCJ&;*7F!%zU zf>aV#Wf2N14Z+x9$)^Q@bbkW(p;_+@7`Ptb`4Owxz@rK(J@-Kr-I`@Z8{iOCS9QVi zqno*$!ix262wv#hllI?ArDMH3sk4Ixc>4EWDu1ZU7@S9 zcu+t|`zT0zujE-AGf{^y6L;|Z3_SFh$zpJS48;gBIhYsfe{;&81dDIZab~{{;=2Tv zB$3F>Aa`%XNB9~7`x|tR3|SOU%D$iyCKhwHEL70e&I4Ph)qmaKe_Z(Y&?6_dRm@+P~3n z&m$00Pz)d0Ln*>f7I_uk!uJe4^sy$(yUMHS7v_L*R*36n^jU&V3H?m~Y$N%y>qjAi zF4i*5F{C&h8tvelmOvu|aNIa}z)5J^(v7w)XWD>eM z;2i~jj+cPu+2WMIlTDt^@3~W)N#7zo-F2!e(nJPdrT0eES-ooZ}kkkW6>UE6B> z5MeSmiZAJ-Z1*{QEiM?UNygnYyywy7^Yi$m=&#;lV5>S;1mw_sFB9df;EID~=yh^|DzL<`A+VGIED=c5V@nrPEO!Z;M0`kI zrxe{w!|5WR^U@(fKVFtbBu`L7=r0iPML9Zb$hb-|CzPUTpR-8MM(!PeNOI0&ejaO0YSE{^&zfo?BH4!6^=GM$yf0$U6Kx+!pC`%A#G{$eXKXHmOd%pH|Aq}6H~ z>wlzGM5`G$1r6!!)pDTN4(u5Xa~ud(@Q7V5LUwkhX)P8$P%O0I#AnWlML5vf%wA9R z9q?W1P^*S2tYqhI3GAgc$N2k((x!|B}aLE?W|xQ#&M2*SDk6YkZ0tl^^5C$?M@*|XMQ%G%U0 zX=_;1XbThnmfBm$s<^%AqMpSK!mNn({tX>k{=z>UvIXX#)mD{Kfi?}ctv%~&BM{pB zfB4mq5 &gX?kR}+^1qcB%fk8AA8i*OFR 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�y_hP}_UvC~_@DEX=$XG8xrKOiHldx^aBp zc?-tr?u@0JMBtl6=34^DgZjQ>mZ{22M68`1Cl-^UMJs+qmZy2fM-aM0QvQl)hUAT? z3boHI-(f36wB;5=2O@bx8AcCjjLPBwW*w-6lpAbb9iNkq5S&&+I_$mngtb0c$-U8K z*&QoV$>SkY=*?S$xUZ&%R|XT#YPJ}#(l??i$q28zGYGBFjciUTeI6kJM*whsO!nY$ z;5QdQ`I5;T8<1`%aF0E^N}GQce!q5W7!~aE_`2CZ+u{pg0fs~|1^tF(S5?P5SbBZR z6fIY6I~Ovnhaa~D-7&B3xcW?;TPQ)W3{8aq1GUwI0C{1Elg(YHVLpo;dxM|$@DTA> z9F>qC>eDM{?n;YnWmc?EZ5K4Cj+GM=TCFB^b3faOMJS$nC^jh?`CD8SV;oudhNYW7PKE8pz_XDCX5#97G5;*0I~y%$n8AK%P&WI4!OpA?GF{Btk5$xTo86!@v?cu)RxTN@C9%ClTfh|w;|^qONPeLHc(NIa-{3WcdE->3PU`Wk z)9!rVi85}d!1?G~u6r$q@F1@~&}z4h=0yy62g9Z^lZ z|LXR%p#E3HeZRY_;o_6l6j=9;Jta_D5s)3QN6zlR9tq5Mrsy~{8KAo!6^z8Qv2l}^ zwuT@HFu|V)l4HULuf@)gCs+v2U-P){=SWhF+5mm(VOOi+kh}}!({$?-0>W(?`C?qpgu;z3=3gdVRIOHibd}3m8}lX8h2eoI;8v|AxaHtKau;r|mUvQN%g$ z=q#8Tl&(!iezN*R8OVK*kFVKU7PF)GPGG&2;%3bHaTBAU|&e!(M z3VP%ayZ+w4-gbIP%6@N6;)vMQ#jyGri+oH>cQ(G?20apbz<{s7lfVJIk72f^^w8!T zZBwNSljMj)hn+bqqM-CHtMrYcD34K^Iyu1;t|UjXx5EArDgYZ^KAvf8=2A)_CV8%E z8rbe&CWdL=puV~KxTFpj= zmm$Z8=OyFai`!;VAE@{zU*Vv0N-B!N)Q)%U8Tph%H$7o-8c4#Y{Y3@gl|533{O4 zIFh!4ewnjua@_?znEw1QDrNO)^t|Bb&7qS~^h%+sMTS^WM6Ub0X^WjEkR@Ws_#EUT%JCbAN*>bMT`-g|6$vn~f?sAD?~ z*U_J2FRWerw>Lm}E)Tu;gmMHJRGTbSI zvB(nj!y}KxLiaO?S4`e`5X%iZ1}uQ~orvZ#1^a@zfloK&yc1mR(S$M-^b#jVuZ1}1 zcQ!NrSYEZAE3eR%F^mc?#hRBr;_Y{P_jm1

&L-m8uyB$xk%n8$?@R{6BrdFe&^y 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

MF$K7d2u2w7oo~ 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 D^Gb-{nv3f@nm#?7aBm=p6664)G_N|I}Xt> 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

    t=7|jt~$@r1bVYI(XQ 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

    vyzOifdo)DCA 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%0AX(zvNH>QLtpN!pg2>&6PnKwJLG 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

    h*U!ggj%KjZMM}`g$L-fz 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

    maz3m$-cRj&MC&(3_%LR4v(IU+5$I1DaWgC=< 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

    a)w78<@tVtWAkiDvBRxC2XBk1X&g2jy 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�B@6TzhhLh79!4JkSHgx%C@PH%X_^|Ncm<|N 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

    V(Ef>1JP9CG(0ql}5{_YiClg%@vzz#P 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Ök%ptP~=w z$E4e)4!2M*d_k%1AlgEOlqzJSk#vJ!g)jin+wz@x=QIlC%u-}4SF477t|gEV|7|b713=BD}vU}f%!QBlyke0u0KQBO*h!-nD0xlfD+-HJ9B$S)%Tnt_HXS5zFO zG+LcXe$%TU;WRNCj4KxK>Qz^WW?@D4f>3l=yR9%sfohy;pLM83proAw*dR~o!gYac z)$PO<$;ttGK>tpd@R!pV+f1be>u;$>6zr2N+(J3G~4juk~XOMHt+=J zVs_I+<%8!di4`pZp7$1k1;orV6^jWxDMScQuk;+jWyOP$>(j%+v={^QEWoJe z>0zT7@0K^acOic^b;l|bNN>M@VgC;M#9;>ior#3plBBMBE?0M0>-Dv0%$Y}NT9a&^ zf0&1rE?4>4l@>Gu^#D`v7vAC5Og$mdoLFyr3*`Ti7w8$1G*t|6dNIRUpA`uw=2=TT zXQdXUP`V5mxtpS49i^k6QZL(h|& zaHr#_ML0V|66q5&K4RaCXT0l5gSsa|q(N~MiHTtyHzr&rNW>mP=&A34rY1Q5f2MP6 z6x{B2o=Du1Br(yG)h`Gvpb?jc6xr|0a+L_1f);TmDAUK*qDGZRcj9C_F=kZA?sp-w zpv-897Ly^Ev}u+d5XR+#0tq;_7P+ZL@hvD;Feq$2!PiJJPI|gc!+9nHE>z9hCTd@5 zb+W`f>g7Iyw6z-EtToAcY>zu@f52W{Dg%+1>wRLSF!we+u6fLPC5^X-(Q(Z2PA=aU zOjpwr)aC-G_%3~}7%z-kY5IVg9`vqa1@j~mh>@f80wRz?l2ZjH#0;pTVqqdMMMeD< z)P*w9Sov~=CZ?fVLB=}i6{7Y8R~bz{IWiPKqf9iM0iDiRP@@c`-h50=f0#7lQn-6i z@VVZ>t=+xfuBosS){VFoWp<|+JDTEwhANKkM6FD&i`BQyoaHwfW(USW;3-L9U5%lf zOYI7O5-;k6cpC7MXaOQS1^iA7J2Up>>rmJDA|fhLU;RiPPCnUTRp@eKb5Mkf#f%H~t}3@~B0xSt-Y zyI_ZED{Uvx$(zHd?_bcPM}uJ>LmNCK(uogql}>!rsb#mG%%!ofe;g>ILSG}6Iw$+J zu}}MnPtU`7zq>h=YgLtXQ_|XC1_@6r8rgyyFG0?LA|Yo=c$HL6=c5lusAT$Yx>9Il zeYds3B2kJa_X)Hi>&obZP)*vsJ+t}{#hSg_n|f>RP-B4;atJj+^hm0A$VkP}r(AEe z%i2~SeD9!Ys!O8Ce+22Lp>o(i&8;RJx&^;w2(>%PmbiUI1)dHFd#MSQUtPiBMkAvl7#S(oxhWOKjf(^a8k&Vp^9NQIb|k(y_vW6X;>y4YFJ^Q9 zc&VBxl@l!QwXD+2+mr@!QfThhdb!@c-zI0v8!N0LW`5Dc)*KP!(mz~qj5R#Te{Fp& zrnv|KA5QhnfAE)d1+qpy%W)ycc`ak+7Y$mgzK+qx1T|!-B++C+-7b>sSy?n&SKBZ$ z4fzYRn^sQz>@GA)K|N}>U(E}uCQU^J$T7D-^!9W$^|C-zsVbE&7a>rvu{Ei;blAWV zVUhHC%TF{*ehqIHX1}<(y&GATHu>LdZSf;r3lRvDf4&_9WZlz@m=os5`9!YafC-|T zPf}dawW46>Fj@$BiCLFn0X19Qs@Y#CUyaZp7jq5Mu5dz$qW1^+onEaEZ;?de+eQ19 z``JLR4^JkeT0Rz`ZZ^RthH469kC#H{%p(+ceDYIt>R!j3JK>#nWMFnbod_{ZTAYDi zpKM`5e@PzMtT5sel}22YjM;5dXfFD6J-_K2J$}&rgk}srY7h%7FqTmwgp8Q=D$X5( zs5ZSa_&+@L3XJ4f>Ir;xM=&bLp*%tI>AxR(mGfFp^3?kr*5Yp52o_L_*w4c3FLdfb zE)NowyPPE7z}k$Sk0(?TP!Z+)$tQ6$8jH~}e~K7afOeWqkPM9Q*4ucPG~pO*tW`u( zhIxNt%iUl>PqMo4-aX?c)i*GM4gUn5{#juD^sKYh%&(5#3`C5?lA3zUF^x6}p7306 zpvCLgd_a38bB2{zU6xV^&RyVP$lzqqt$4m+^_EM<#htmO;wYP&>%p2@z4DVT zf39T{R)0*Ch?W+5#PWizE%ZcrWHh^>`O3%GQL0eeJajo$78w4@##0&N{(_^`!vvDD zz*e|{EO7AvGRf^UNzSJST;OS4hMCq~;drAAsbXdXldM}%gK1jPE>f`b`%Mj@&=VnQ z+*1#FWOk4gu6yt7Kd&XHv7Is_G7~8g7N)RbpY4U3JVn^7M6!F4Ws^eQ#QheRcbh0F ze~od!Vk}n&!>P3G6W)x2kxto>&>@cD#Fm&@P_`P^u0}Jgn#;%W6aGTI<$Hk$>>9@B zW2E4KH@)ja=iaXf<49OQ0@wh{{z8eGqcSVe46Al~K6JwWH~pK%yrI8JC6OSB<?3 zO0m4g^GvI{LR13vaaYH(^e!I;ym) zLVDWf+mCSn6acn?+XOvKbv-g5t4XIr($xZ)FE%IkU6~jw3#7HqT8eLO!4t+sG}{Qo zY+7=HL`l%}{e@D0)D1K*8~zlQdrF9I7-J_Mbz9DO5zzj~`gAjBr|N*C)es7p$CuKa zC|G~*`8frLQGxbPIVViQLm_eB8-NAFzN_9M*F&6-!`jXD;c{<-NLJ}#z*ZB*Z}jRc zj>`LX%r`&6YdkMRzJZd_Pf z{2uWyLt6&AtZYfM!0JlQ)=0k@piB1#?=B*3^`=MHabK>z(003ThU%}|0JbbvhB5S6AMb%jUfyGN$gFeCZ#4`UE?-x^+)z8cwMe zaaC;wbN82(OxdSijPvv&l@(?mC& z>cz|X^e*p#rTOlG{@!B!BfJRX{LU?3#C{87nP}-mgb5f+iJk+iFP2D#8IL^s_=HYf zz*CnMrn~hl;%j-M8O2><=RCf1)bvMxD{QhSr9C~)hYAL|yNNta_};lR`Ib|5*ScL^ z*75w23JQ&921-QVT~E-m_SWx+uK(i+S{RuuhXA?8ttB#DRGJfrtZx3YtAI`C0q-8c z+;ex1RHLa~u%&rgP*xvTxzHS<@{qF7H5FR!p3dzFB9L3d&DxfW1CFj7c)3V_AZI~p z?Fp1HnMC&e3p!4qhIyKzp4JnzU?~uq4C9+#=Ith_XHl7@7Rsp5cfVvi%frcj7qK^A zw+||o^L}@88jMv{0iP>UD+@@t$mNzk;l|4az+tBe%}EnpB~?8ui>wNQ!s%2iG_qz} zTbnKlP43$j-Y)CP=z~yAT3t1NV%8@D)+qLd$Vd+-Z$|~9hIak=zPGljV1nqj+*#6> zRlgrp`MK>*iyVa(8AE%DPgies6zRGQ*X~*Rq36Vsy8u0 zq$s3-EU3qZy{v_zyQ#7S^H{rKhCc31c{(jiBYE4s>95&|8>&=)-pmahHW?Wy$;$8< z(`5+^@?>|RPE(`Cz7$XDI9SzwPue?3bLKR1njiuM6*rAQ!MB}jfG$potF3A8azTQWc%__7OoTC08i$ZJxyAMXp!8q#G#^S#fe)u?mit zUvFN1;x%sT3+8lxb`W8d?F(uo+E+SYS>TZln}8i-l^zdnZryiw)5#S%p3;lwpd&o> zO^ve>nRxGnsm+~Bb{8se9d|kUV^S6G`4G*FE7V1Exc`6d9W!53#7PFpa_nR z6GnH!hAcBgJWa3N3n_U!Eh-;AQfe0yYMC=#{LAT`p^wa8iERp~{FZ{RX0cp>r` zo_+~jmiq=i6PeChV9q6rR#TWPWSZCWYfwDnab`@}d3}Mivl#&WyBSgcG`eEm?sr1X zxNOT>3hCH?62HKQ()Ko>X6pi3P|M-*fBRHL!RSs{_9Y`bs=>xhR;{S&ZIq(@?teI}V^W@DYVQe-&l zjnT6+vw_*ApDh!1%6o>~%ANzKr~ZN|5l1V(pxixwTKUktVwGE!AW4N~jHkhxVx(c1 zAOcU;FtzK74EUyrx}l=Lp?Vb92@=2tnEewaYCkzb^Mw_!EjoSDzm=oBk$pKI$D;{$ z(GHp?rN$Q;x^g$QPp~9;L$7vvS`4xG?b=Ro;G@x za+rE7VAxNu6iU!zcadBaD(;0flf2Z8L{1BeHHb{)oFC_~W2^;6G5$)@laZXBm*u1= zF&I46KGcN3QE$_C#{DZZHyNiH0!n3pzkZi4r6@dqkC0fVz!*VYk8N7u4S2B(f254Y zFolsi0oJz{y2={gyyEkgWS`(gg#|4YZf-v>7EdEL#WLG{zA@v50?8nfo=jl>gcEgb zc9D{Ms4%frg^8YIHM@JJ9si=jg!y~~dEgo33;g#VZm;=l*6-P3CZ-BdX1%if1$MoC z@Q3VwESQ@oOvlj_f;F4@D;eLzCn7HFMhg-08+eKsxQKiME9AYXK&O14(G!WO`Zw?@ z9#fe&r4BegGeNU*>H^<2RQk%C*jm2uI$`c> zxjnY+6P1vy4PeemlZB3R0{@4bQ;Kwf2$0o!*Z&2MR&ECa9A{+=@IsZr95kZ`4uJ`; z?l2!i#zFBN%(&XHsC$O*IyW#gY6v!eX7t#9egGh9yvdsn78DpMXm6!hpD?-$Y~LmY z8#~W{t;tpV48M3*Q?#y*e#7s7qlj+g3s^CdW+iV7YY49%$vt)k`a1H{Kb<&A4u6D% zrBo)^CaKd-6d3JvPL9`cmUej2Eq6o)j$DOdAHVhOh4SX;5Ehb}S}TK1?gy5C-BZv5 zT@7)=Fs(oDHC~lawM8ZahiUINx&m{ zJc!E=8D7Owfz)`qmMOxvO*pc-3uUH06K!H^qD_DeAnTo4 zua+kRMqCo0+Q1{x7~q8}gPjt8ZGmZ68Ks-alNSH@24>uuXba5QftgXm>t?R4TaqVg z@IgKfI6+cS*#iah{sl&Nfh%>uFLP|BaD1HMX9myk1&)5h?@OXBV8uv_DsK#HRJ8Tj z8R$$jt&$s-X;?fbKod|AO!ViW#RO^Ru3;{ahfxz=bVFUV35W&5K7MPL;;1Mof3}Cm zanZ6%)4cCnF5}!uSz>mk8bDGna3?e1DSO}| z@(sKa`TGx9|M^MK!_~)wCIiN0$6qJd6RYmW{GhvMf(F{+(`q)&Y8Nu6>eclt;7H(y zZSD>lj|KeoL$9Oj@PMS{>VO|+e|;AO($AE(50C8?p@x)OPBQ4Cl*MCJXFbFj9=jxY^;50Cy0yZ#PWca zTFnF#J<00+Xc{tl+D|Zp;Ta-rh$Y#lR2Gh2I40vHl5W+&WZNxDJ(v z*}Oc`b}R=))G$8&+P!H+e=__}gEC=s7r2gzz`9d|-84{NqkBtFC9u&W52G(MwKoxr8cH}I+q<*B2C zK9gxyX>-*_4vF=R6*faoooLdy_8?*kxt5Pydrbe;T_nbjvzTf)5L_RdfCJ=R9eaDe zFBJ-Q9IItQ#-XXI2K1jUTtJVPjH@Uaf9B)0iAE_;FS%MkJJW;8`>80;DNb1$qVFr~ zHZKnlRjPWJ&nPzB zGXHDv!;Q}aP?)KD#s5#gM8u51#WOOA9(`5)i*ocdgF}r`)r|T(9KDDh6eeP4g zB{;pIGfr@`fQyL+&;x}97WzhIfBVL}xQrS-F|BI?v57HJku)sx(2!p;veBAN-{PO2 zOZXZGu23QHI>mwB+mp>U#+P5?B-f_CUcfw>6HdYUe!XEH88E!o1}Y2;p!JcPITh2# zwxn_|dt69`lUL((C)LOs8C6Z<` z4jI+<*quzv=eH+j_Y}0ysCl(g8znKsLc?^^?s5j|sXJ|5cFW9R{3C>75Qq3(TJXL) zF^+RYhnTDHS%m3upI|$?5H?i$y-GjRR_2plnW2u4z5NA!rYlc^7y8uns{}a0oVbzA z1J$&-Im_58u8I~*ye^fjv{1atVsB&+3 zEMOWZ`!D)mFIp8V=l$;H#Ko$r6DIMR)+HpQtVc`>+;}-6T-BASREzK`sk9ae?a)oA zxHqI`78+TleqZZF&fU0L;v+=XmC*;GBJDr)8$F$UzWMsYv97u6G5@RmLeE|GZeNo^ zz4-8+a2wk{|3c4ye}CQkuk75e`Q{mWzWqo4_y6?Y|HFUY+WzSeH#L_~-umO;{NEdR zz5Djx`S0JGb>v(2Slh_7E&t~K;=cwrGLD*j8>>xH+P7=}*8lY%@_(Ij+Xrv2FPBdB za%tbL?OPW7zx?;#5zbNnR?Z%S)u5Uc|0n5ol@ z3gNx|uF|H@f9pR)hb+(ky5B#V(_26D*68wRE&ct)`S*_sgT5)H&*_xU+QLl&e0%4w z(@jw58C9v#LRUt%Dbsf-WuXYHpelDU%)yOmckk!vmq(KB+%VJ5v8fMa{ezEFJlMWs ze9_HhccH2>D>4d#t|=XI;su(VL7ZZo-jsP|UE0z(4@m20hnxk0Y%Rz+(;-_6bki9u zOrg8MV$BZmKpG(+?A)w-Fg! zpl5$_WtU_Iw%W_kO#}xw?Jz}bs|$6u85B0me_(82Xz50F!zq?OxEWb#6B^1zLGw3D ztaV`?oV*b0P!mGU3?VE6=+D}`w;;)}%l1X-bb1HEgw z_ zJPEl5(T^Lmbpd%*YaQ?fXD2~xu|H<&FW$#VW*KW?g> z3DVsxr_f#akCpu2(_~_x$QcVyP_TA6SJBhz2IA^2R2aXo&_5i|uOBx>{|3BH&^T#DR-%+bu>Ttn<(~$uBT;%I>oz=o_?v{0dq!u0QE2t zwt;GIXJ!x)&|_T{#d9e)aJGV3clXK#r!g6jhmq!u*}AMVW*wr_jX_Qj6LnGCISUjk z!-IFDl(2<~i=Nu}?mKK>FpTd9ftvwwS{Wkz-&QH*2%f-<_* zT>`yoSCY*OjEA!rGubgPC1YT$A3?Dyi~tVkpjZ{kmiLHnrK%WF8Kf|lJ3@MbRPXYH zUO4B#AB{#BcWnx?m4pG~>H$tgDx@b=3MVLe%rhvLz1Ww05jsI>I=lxL!~~~J!zWtp zi*XGnT)zj2+<(IZSld5>hQGC4tlohciG2Xq?GD8^@JzG7RixVf5v1pc*c0j?h*czm z9y>I-SKrK3x@otvYh)K3g~@{AK2bC$O5@N>hk@!VD5@*!6bp)fq0>&n>yT+;<)!9T zk1U^tPmWzHvNqn!_=C6M`O%&c7a4vWpj~Ab#~SdKPk#}A0Bd{39LM$rBtohPIHhIy zrLlV4&tM}kz$q+Vwf{4^5TKXt?%h6uI2Sj4m8&~^Sx$%o>j)r(tHBkR^W)uDJ~=lK z(;tfEH&5)K)ZYP_{+L0A-nz~p*IeB|k9#|{%$~EVg=B|*U@TGQuY%OYS z>J3tK4}Zv3w~t7-i1H#G$ksXtCM0HhZLqb#X{|r==h{r~Bj9J$wWkwU!D^Tck%tGW z2oZZ|ToB$o^#x>^H;viPMQIqJAl+bAr9@6}6_BYvC^OMT> zoh)B5;qI%MWrB-VD7xf-3u?f!{S3~^=Q)bUpsH208KW7Jd&u9kDU9Ui|T;-p!sd@ z518GPqVeE`qUU;cHAwVW0D*}rzkF-uQh(7FY$<6AI*rF1h+YX#&~M#dlV9?)P{b$dMU0d2#6saSx=_H+@am#l(`kPZWQ)nXp^6-_8$k+P zdMHn7O;Dkyc56Y4LeQeHpy7x822Y+2ONF1V^#MIq&jp=A2lkIn;v0CO5sv;T#DD83 z+aEmeqzic~`i6*7sKo7Ph|}T?b$>59I`FH>&(q50^r7O_KxW@z8r%aDVx~^mzCHae z)N?3L)?m4qV)F%a9spt4UFcMRNQgc|bd9YO>=f%XPN-Yy!A)kMD<;Is3(tkZXH;`g6!J@U9?;x6K2*JBP+U#4 zwjBm{cXxMpch?MVL4v!(;O_1o+%;GjJh;2N1PB%g5a65VoVUKJ^Ltm#?CRaUtk=5k z5@y)@>{VDlp-BAyLDt7>b+Lsr*J%yQur1I@WzFGgi_EyN`9T$>V_;w(^)n8IOM4Gm zy@0b}Ss823-s+^hVHz z#TvJD(5ztksWe=ZYS$UTL9Cdys^OW77WYu>uNP$G1qrp6E92P!Q zFo{25e-XJybpHhCj17B35ptPt-T9PG&5hXc+@21v(}V}E)^hYvf1R@u>8&aU)3B%k z8F#hLzCx}jW;g`|sRNM>sEKAzX$H;{a5EQ{V7a@iQ8WaTFcXEG7E0~=4`N{Ih$ZQ7 zaLeV1>$e&wCc}+~R6w0|jylfae*tdU-@q6Qz-{I930Rq^CZ;WpaQ)dUv`Ouokabm7 zbnN;9+qO_4YhR<1n4!zc^Wthe)UYx^4<;1VT(m_zKVH4=!maJGY7Q>owwp?2{pn_4 z0-?s``4?kagfL<|A(T{WjMW@`2_T`hCalPXD8mMZ_upx_c>ElLImWBey8R@t0`AsX z|LD_HtDv2iQP1KGZRpZKPHgfM1nHmflOKRJfV&_kgovw zrhU}&KtW2(Fo9S+ixHt^^Ko(yM`)V!Ra%gaS2BD(VRdL}vlmk{8WZ~6`1If4ZNdHY)e(;B4oyGU9iS`caNy4d;TTPY6&X5F#}i)AS=tp5d%H2~M`%C;_ zUw(kT@SM=|;Q!kIZ$WpmMVjr%+bEu6zLERI0-U-Oy|33&UD4bJmQ<8NC@q6j(I{bg zF4tQy7{~#l&!x*vrUe1Wc>GTi)WZO6x-Bd$aJioP~=~h=^|ee#p%C^w+=JdS!Ni5t}j z>z&5Qc%eOoym}(mcj`~>EWdKNp|a!QZR?a5S1Uj#Sd`gdfD2|J<<~AqlErm5b2Rfk zqWmWj=yYH(Fcd*WlD^kA+%Ax#LjvGY(yf_~btRvJwUwVY!aA;!(|Bd0Xfet;YR)!v zzX`ilC%pHMmaZ?U>xe1Rl`o};-w$Db2z@hgKQcI%UKzTRq1CTbh*#a#Q($W6ERyil zW1nh`miaS=@uCfO$UlrZ0gT%ze01ANhek1aYBk^!ty zM(Z+|=cr4QsPQ(%-Q)fc@VI-X&`ewUxAm_gL1RYKVd3p3aV*NA$MzY=K2v77M8r!@ zVu0MLg&;&-Fk?`$gp@ezF%MO|gdS-jEFHp$R8Pf?m}STq%Q!|s?#qt04A!F6CfoCI zXxgS>qxI0oKI;1ao#($xPY^?q8Rm(nvr-=t#C?9s{ErIhX_`0H<9M1tH6P%3;s5y> zLguRNrwq}D+5)2aaL0?qGf z<_lhT&O>5`lIq`lj^5UW+d|vnFS*f#soCDpBuEkdS#F`zM!sQeFEUnJu25DPQ||+} z>H{VJToLIs164W*($?3qs-UBxAVCjiy+MZQ;fWLUIt=XYjKsV=U!jGNZ z^0%vLA$&pWWYNx;3xHMqZ0A46T4u(hZ`DnURq|{%t15(-%Vua?DpfY?5+`uBg@5@a zLFy3vJp!73{Ja)4D$2ax2gdMWLNp68aN+Tjr>30VaFwrmY;x%W*HkbyFU>7&2!Y|^Qec$|mlCZxo0aXT9fotA4X9$3F@N9c%oZVdMtx5` zh=5QT(G5i12~ht7sV;}3%QvW~p#JV{1@+9O6%&qn-v>hf2W5mh&VW6ZF5BcB$(6}< z?<>*reciCgczj1Wqt?#6 zM9m{AQya23sZY|XUBuz-o*`3q>wzWI-Jz5&*`jl(txUq0mtU<^K2vm`n6bwq)FaCG z(9^!Spv?bl3RWost8B1WwX83)^6UaRU1>Ef)#i<-%Lk@rBVpGcU{Mw(8b9Ys zEd?>`mOa&ChBCXy1yeJjxLk2 z2;S{r!q1YySF%t!=jhAOS=Ix>CT$r zh50&Vqlb?LnqKX(-`pmyrGbEI2b-~}#tYSs{rWImR@|XEY?A4HDWU9B2^drUqO?Rk z&o{t5jQW8wuXT0)1ey+fIfRnK{11D>V-wLl9^M}{dZ}|= zHfP_CMWC0qvcBJBaqYYDR?{ZCw?qR?l3ZEm9QMmCQXm{SS~q&fKqe zTCE@$ZBR||suQZ3;?XtPPT7>JtS$VUNA0pgVGU$x#h(CWp18!yZctsb4)y01cf}oH9JL`$duumb zo6yPeNM|Hn&YUlwy{Z~uOg2xD>~b)ogs=C_eUp&UvcmLS`S|3V6^y!U!pnb8z8D%0 zr;SK_2=m*M51Sh5%6N3wNSI#eGQ3n^^Mt^we_lN=Fl8$~OS{rJ*&b-9~0kSbE zYcA_AJWHYKmYLxeeUt>fbEt{6E`U~Lo;!{ZYVh#%#5i?)}#4wU7o zfG~|X!h?=&zUrL$8%d#FO))kK)Hsaw1*|hsiQSP{6#nxgG@nu9-wYkAcUZzDSpwf|u?(H`Q2kxmZ8&j!1kANvlweugSkB zao5gyb7z^HbD$Q1up_-!P>a9F zuu9O|#`@F-iVXy%^T?!xg@W~BahM3*kIoG(b@+Jhb>0`TXJfbqN``8_AX_%2GW5_h z#iR98DMtTr@MOojemO@ufNV`aOqeFqo4M%n8p65OS!j`}+(;Y(0CJ(VRl3y*=}BbW z6QiKYo)XB^1ZYcAbi98iHCG(#7OZ9rkUvC}LwSPSzh4k1Qoc|k)C6idQb^BKnKE#v z1H@C(+wW`3`XB7*vFA=K8@^fy7r+>di6XfTo1i{pE9#6yL({rPq z@rtdP@zm`ZvmBI`R6k&Lc7N9LA?ZiDvj)z7R%g8J2n%R~ND!Q{`Q(ZLog^VT z>tXwAx528-qMBOTy8L^40!2&Iy-uGoQRkaysZ2n0Mwxs>)Lbgzw}?&fod7{v_(m%kYBf* zmJz0th6BqiV&yfa7H58#1!N!la`}GTJc3&c0mapdM$DdGHN$Vz@INKzhc$S=C*AF4 zZ=VF)fgFQWol32bDozOFKVv7To#!byUq)guDacpy+afG29P6o`)lI~HSn0Q>)$M!6?-6Xzz7HYSH{B%4dFwn&$-{HXaf+Sxd-iUaKzwRyD& zqK;W*K#KWpv?r#*#jYW!9(^4FXl0`0ig|}B%!M(@b#UQ1O^bq>UBx~a;uw=wn#Gpd z&Ho|hf}4(Omcwg~9@Osc{JYZG*$`W+fUm4iUNjzeCElEeYe;U3fL-~P)bdm8*&NR+ z=i)&{;?_W+ibny^OB_eI=kP?X?5pL5`G2WPtg@H0ZPXBW?Yvv`4-vsmy2}(i^Z0tN zmpTs|F7AAkWk%Ex{f0Es2)&Ll7{5^MDH)wD`&_w~(HtAfRzlFF)O$1VCpvU2%qn9%ls$#+zkGZ$KASlUVk>}`owLVwF zyyT|}rI?D)wX-)m+lslfluft`{n}lvVqwVm+rK|vX`j(aPzat7IA|>rdX7xx1*Uq0 zp)aG}rk4>^pS$XDqB-XKH6J)ZvZ8g_Kre2)a*Ad8gX*B`~rKO-LP{tB_+(`mFi4MQ$qLnoR(+o}Gg`HD(4*j5WXWp2G}cnM!9xT!<^m zB+fllZIS<6;dO>IOUpUnXKp`RU|*MY;Jw^RH0vov-3Xfd*lho2ajQ4bIa7vvQ8;i1 z`^t^>s;HlXUjUknpi4#dx&uN5v&z$O>1RAD2H{mxBQnl(!1$EbpHR?a`C#sCJiVu_bbUSIJZtH2hW*a1t#af zZ2JNGK7zoBN_ZdO8*My#zK)qRDZgT$V>##?Q#_^m6G{5HR$p z#cOG`s6#!M>D$=2UY8^`=&3MD-`roMbLh8>tBq>;Ibd`)xc-FlCuscHFYcBAq!&Xx zEHN)$e9@;SzBp!wZ8T>w3>cK$xe0jk$j@@e8`-Fj5Bej}7ksj(P)G@rL)3pLBiE>i zQ&gklsU5~QmNyLQ8>jo7!>;EyEKWdPBH5f)i1-6LY)MHXfEoBL*=P?(&OSW|6 zJ9zm>eejx1=&)LV4v#9NWEg)-lzReQh~<3y%+njALJSG;zu&*Ol+3p^XAmP(tGkY0 zqh5tEX7@DPhe!Ugbqo{ziLDalt`H>brJgQXa>7)HyPUMLqVeZO@p5|)SsnD*L4&tp z!l#5-5i?j$*rk+H=QSJ`-658iXObrT*aolzb0>p18K6#O6n}1QGw^KiUBKh;-nf*q zdfzMye`dFAZLfB6hY8LDcw<1$S#Dx=kA6di<%6}p&*7;`{oI-FRxObJBw0CZYUT>0 zY&YvM28KxELC;_y9#d0V$fKGaFP(~uWs`%dPb>_x&gLM6P$n5lj{T`#{pdq8QYSl; zIy{HFC|v}bP6NwtRmHj`3cgieJ5RgYwRBii5ZUYE7tUu$?3)LrmK(ctbd*>@N0c8JMhCK)j_HM}JO2~fwT8BR-Te&vG2zscPoZt^>z^tbUb z)$bq6pmvOzBr2Z2_^{$HroqBuwW#w{qZ5tZr?aYi9HZ~_?O`<6Sx!iW(cnC9?aL9> zzk8XqR-KRfRsYyOhU}gV1K%F797jiYd}udxc3-uDYwv%i&rS8X@$ZHv^^2!SLBN|L zVUgW`T?|wF#2wDNcQ#ooTcgD6@u)gU;+N$AK)&y0=TE0OOG)IHs*A@qeFY9VJi6Px4&yLD|ml8<#u-+djXxt$VZf0^AS2@LWXU>*WEF#T0us zuRtHrTL>KAT$`Uv@)9_WZng-5+<)79q5{^Gk^>f++cvwKnS?e8F;$Y&Ju{fhw zd-EQ%xHWr^>#Y5;O;lmKsVXjb5pfV??B*)_F??j?^x}N$r*rY@hS+ZY-7AQ@xLWnR z!IKgUCTr{E6_KQmfd?0&zdcVnte=XTfvBv_;qtss6}y!JgW$BCv!1-Ubvo0TX;w4Z z#2zt6pw-a-1btZf&M!z24U0?jsP0LSwa>aaE=fH6YM*7OsItda)v3R;rlMVTR6+N! z!JaqiB1aRXKiNO_q)7ZnK^V@Ci1hrHKv87KL`Dvd0)oq$&$@q~hvf!{$l|jj=Duu~3%~s|Y`4QhE zFI_ZGmn(}FZTC&D(eI)PE&;U9@Kn=(GDlO)jt3tKI-fT0ok*XlV9$Izc@OMydKa!- zZ3u>ia<*~Kj3ta&EJ{X+)D5{qNkMUS2lGhXyP&UvhC;@^V4s#N^o2MZ($4@jjR4#Xhy2-?py&371oynQpy*+)GII9J3GuVM%7Rsi55mW+Gdg-V zSFO+OjqtU1_=016SN@kHGo~TsZta4*Q3ANUVzeC>VXwwB!|lgC1Qj#8@R#!Ts%;rn z)Ng4eEW+!0ySvi!8OeVIaZ@1+_!Ys8W@dOvLLHtK&A|7V%fB(5qnOeCyDcpglV&49 zN_?}scam973vh%;GIg&t7?d!KDDDa@nW@bPM;sbRy07KgzWd7(gES7Le}yq$$MqsV zXMtn(q-=MFDa0T46vxtmIe{gHl;agnUT6__}VE~;?BC|`n(J#62nJz`&4JqFYe--ik^MY7FB#{M2tYixRRr9g8 zZ!oEQMk{$MhoXw~!Yms@%0zJ^G-y^&cM93I0q^EOMX=b=>HsaL#wMd4+k@|ON4UWP z_t>>R7AddMWbbq6c(4QQHk23=OoCmedowYn#xEgC!|6G+22`5Rd<{+UB_#~BU=-W4 zIYU$gtdMeK1OA3jyYdjScyKWQ_sb|GC z7SKnV_DLM(e;W!XSr1w8XPfIPc8?u1-|e2gA(h04*U*(HNi1pB8gDEF$j#9rK&Sb2 zz!EzaeJ654!|xdZvP4%%muLVlr-GZVCG`z1{Ss{Jv%aq}(1HY-*bX^JCBLuLQ^@{q zZrNlGS=UF>ZXmMMZnWj@(X=h}mLd1E;jeAhP2`mC(4*>sA7wHbNMAhZ(|BYar(K_# zC(W2=M-wBQrc<>nZJN(OL+oa@Iz-c1OO@bido&2Mr7ino<0w4lr}omkSt(67K=hHg zy`6i&ZK%C=rkZ8A&OiYhb!Qx<0a&$qk-?-fhdEn#{id~T_08}Q6Ii{rKI2S zzEK(agTDrx$Zh6XBlX+976~iIqwkq~J$8~0zMr(6!R+2dI5nS*CrPjW;$@heh?Ni|A>^X!`|J+q zwjxs|;Ga)YESBpkcIkfj_ZHx1O-@H4--};`%%boa7fyz;p=082O~p(|DSS8VMA>}@ zHABCVTsz|WMZ6lw`{)oF=9nJ~E>2zE_&eH%Pl!;Kqo`#>7`7+oXw z%UI(pdbL6z{$vbhrG*rBP}r_M!?K*RfM&MM@24>VL7rN{p5G3-K_PwGLqgm#Y)RX2 zstI2WX8paXET4!C&xy@yB>(M&`;k@tE}+fL3eaOF2c5F#zifqE$P9fg_JeLLe#kzv zUCx!djlwJxHb0U5Ivdvh;3M}$DT+hz?$hz0MO*R>cZ_pEn0`dISDvcKsb_tF`HVH- zY&;i{HuL_gr%{t7|8}eYS%Y22^`l5#z^Hwh?LI3_8Fg&HPOAEp6C$oyFQ4XG<@7C0 z-QS~4PF0}LFLNrP?Cn(HfI6IobyfLgPEDRRS4^T*W;|fj)6$$%1l>Dn&+;uMCmY91 zg$$jt^%EjCZHf)hQNBx%Cu{_dDtoNIcXh9< zi@fKV@|K^0%;c!~r-GYr{xvGA4LE({Wv7rYHI^6;#i54D zUz`y>H_Kt%8stN4QLob5PYnO2Jqub|wS^ghQ#9iqI)Q*zPZ!x|;Az>MrQpAN<|-88 z=&)YmM%eWWt)d8}8>mnk^99T$fcmZ)T*nSNKY;oM_=M6fQASA_y%*O|=E#_}vco_L zYHo;<7aZxPhEWx-OP&jsOD8!*Wr|E|bd~1gXK=?(&=N4)=nD3*WI}VEp@?4=jj)%R zaDITbvUktKEU7G>^6XX7#MqB=&WZimVsxVtnA4_I8%v<^27rgl;OM zQ!62$u)UwZ&a|P0CS}?RzUL~)1R6Sjv)AithilO#Rgu}o%~=V>?upTeuP_y+0jAg0 z5q(p2(Y{P!|2J{gtm|zQTOBgS$kbua?(o2PD1xzrh}3SX+8~5JIao(yt`{_*K<;oU zrcvo>$3>{w7VO8-T$I6az_lm<@9y;A)VcTFl|8lkJ>kkzY?B#nHIGnfBaCzbPdZ4K0ZL5Og=H9NO!1ksu4ZUX1`_vKAnXcubBF2KiU7$ccAP^;cX!)kV2{Xl9E-cf6piQeR5 zNnMm%TADCx4n*Va$2?WUG>b}QE1~*3YrBZ2mDJ)E+>i|AE=>NEo!%d;(9(Ama{xVT zKn>pPV%eXTzpe1j$RgWkAlF4x9o582?$rJn#gIrswHVGlSU!MeA2@+VXCF1fK`0g+ z(f)IRWVrUI$id7SJOCNX&wgUoVNbqfgdJnfE=`LMZAUkwR!i-g8~P}vVi3FFIdhlE zO4(u*# z_n|I*Q2@h1N>XvNpB)Uh7m4sf4Mp$+SGB;DChY#XSV|uuCl4g}qFp%db>iqxvZ_=f ztb+ML&IcMXb1T3UkW3~w3DG)5;IhQWF&@)vpJ#I9Z-QN+rt_e3;YTZeWN-b8Z zak=uUNU}!{s`WK<`!{3Lb7*HGOVX(1_Lr~<7NN0h+AMl?+|h1*aS~izcgd7QSP65E z_{tZV%yiX1fq&&&WZQk_yU6e;o(Ck5TXfgs7!0$F4jHgO)DK3Ja>?V8kXc)myJ4m# z*CgVBGvlV_JYEO^8=XJ~ppKNF-X_jF*iUGSgYe8+`mCN(dJL2mWO8T#&80@!1q z;Lt%5R@35=%cJaKh)dU7h(F3oNsc04qvEsS9mi)A5oZ0``A?Y$r8b4XBRm1()M|DU zXwR>Xni)5495hLKmM3Ux7|z_0JE$z{Xr70|4YWK#RictO!mV?0Y+al_0SvX!h%W){w`NU(aKdv$DLgwnCnP3e(xsu|lqP<3yObR-L@RFqv0E~p zl+qF10&4i7gK>s5+#AMzr>N%qWHKCAY_>l;H=>Fapn+4A+?c1lVflB^p|?H(4<((X z0I{Abu6lP=(DBVVt6yZxCsB2fxz6^LAP)<0+VH+jU!zn>@{j!GhMNn)HN`+|GEA;V z!F7ojMEYVWZ_-UU_Yh9TZ8)E8G?GKapcJ!^wPwOhk)?agzzeeMWfk-|Z+>9-w3bA5 zEI=vXKVan5LJXouGPgzL?IHN4QzPA?<%&o?7R3&@+^M$2d+)Nw-FlBrx+PXr>*$-XX()U?j&SzAQmPY0t?ZDgnUMseGD1jwkn}1-px`_ zcQw53uwPCa)j`ZmI3{H?&oXAIP$7JK$~W5m0F~NjLFO|^s>Mk8C@!U_^*^cB%NYBn z3Gu<*qXlF*)5p@!x3!|}9ct$REkW-eZ}-T5=Uo2lkvV$&EM6Q4n@h?MBvQhUn-) zN{eR){N)RBKD+~sn3IK_+?gBz-h^RGo6v~m6bpN5V~C4N3JM_H%^Pend@Z_oH>z^? z&Yx#WY)L59;?Ex9+W|B^te5kkDz_aO2()wZ#szA9hsP5jV=opcXIkCyArf*`9i{3#gG6p^jJLpr6(y2KOYhb4EaUy8k_tZmIsSI} zz<5SRffIr&ApMmIeQVHZ<1707SB*WCldrF^iSa%k=Qlq5cwkPq==xOs8WsW2h+X#J z`h%LJefY9{x`%MCf5eX{Eza)0Q@`I|$Yt9;uH=B^qcCwpQIo}iy36TlV%H&Ech;rF z(?VXG=|EII|C3@e;15u|l<{=C@SlOryi_hA{&S2~=Zr?2;$4i%&NrD0^$i#8&>O^# zBSw~WZS_TRAlcWhUXmW; zNowCxo9lOxhPDc5CD4S(RI<>aFkr3NblB5NwhGE)vkTW@ogGvQAl!#jlr8OfEywfS#(z;6aS;*l1%)3~H`|@j+Z}{7wu8 z7yVjiUdkr36BgXmq%9D90t#_H(jH~3xU%V&ZtHTu&xB+`7Gkus>&9?c4@G91ZsT?K z)Q~(9ExJsXm7GSIew|O=9em%AR=1(%PGyj)sz_l-K4%AFOoe^wjan}MECDn8*Bnva z%t6lT4N)o$JfM<7=gGuB$J<%f>+DX9U^p(IX%pV?m4-Ukgx^Rur%QV(qF1H8NNBDQ z&K04jjBv_T0R(w*=a-q&p?23DjOR0T z?OXu_9L(IX+Gan@w$5y}fSc>|peHuqNW)(wReL!SjXnUPKaeSUs!D(XV7xTY=}{vq z;X+C5f|U$~C=_!6RA0h_y5ROjqBHIS!ECqTBrDcNf|`9Lm{6dSs*Vf6<)kfN&;*P^ z?dXt)(x2^uB%o5iLn{qP12UKw5(i6%&`9Rq*Kogo;_ZoZdU-%at0<87h-8nIZ`?U}Pmhj3q5#Phi%MCPZ`p9dF~QHnN21294Ij#vqOWm`A| zmQ(cHmwIN{i!=;|QHcGXIJ!Rn^$yUmgP(u8?TNsEK_`cw3Mqq2wW{U&rPsgV@`_+H;KG*i<#S_6kh(BY%*In3q}Jx zP3QRGS|h$!kHaFa4YMLXLsY&qNQvw_O@FPoqAj+&Af2BXL5gI{G<5G;C-^K~R9}yG zBb9QCp_NUJjzow?*96Fv3WJ6VX+x-JhaxMUr1hqin&PjF8qw>7DexF~+IuXqiLQq7 zR?`B<$Itl#YiF%?hg%HAC!BNVV&HzsA&wki*BRn-$ql6%^&0$ieh@6jS+@&g#_CHV zDw)XKF>26~ zl?XOYE5#I;0khF=OD_6th7u~Rxj;K9>1PpPxZeq(_%}1YFIG(_T+Nqy{LEQwHw>(N zZYmrN_MMxF_zpS^gF@C#%&$w=*Y$s|qCZ=!;*AV(Z_uA~{7~LGTbI25zG*&osJ?sg zLqsks<%U5ToVPHyZ}d{_5+N{u(7pTW`qK(shCI0`If-sTzX;_u(`%+Wcm; zj`R|Z;dWH_6h>%_A8@2;ODdG%79bNP1~x5=8~zNeBg0$VPhk!HGtIPT4jYS4KnNp7 zN@9$2k^**3%;cpGC~iY&4Q6F^2{Pn$@pdrd?*v1E{F`vo$P?3@ngPvojReS0?>3?l zgbvy{Mrq;JRThR9a5_1?d>k+&c@odPd%Tf}!3o8tx1gno{J!ErT5h5?Aw03Ug}lQ) z^dxwpGxbPh69{xw#R>6cyS;cbyN`D(UPO{?tIBVkKfK+1;YX%i}4a~k#b<%Bg|JaFV^cTx}KGvAEX@-$o5K? z#r(j412R`+GhsdAe<9I|b!gxB5KM!r?{qJL7~EbkymO$QNdETy#J6$v_oeI6$H{f6 zSu`R~*7H~BIvp;+bAR#JF$*v~_TOL)jflvdb8e(?*70Gje%)8Od5_i=9J?yLW zMDZ?PPs{?pDorO8#t>T3`~tNY7RNYO3Psu;DC9*IKv0kodGlsw>oF5-7iOqn1LZlDt|hw z6%l^-2rZ(E*sHU?S9Oho@W&C0bb8spxGBe$j{z}V9WPgYgE5TQ*z?9aaQiz(16jqB|3h!W`iIMW)@zJomp zDPPLcpij$%{V`_4F(gwBwYm)RZWHvfw=780DA5pNssO0J2&pgugW9|D^G ztICOTK^@8{@V0Q!SrE0=5KO7)T&X0FIF*x`F`-ny#lf9^Cv)ZGA;{f;VT>pW${Jtg zAR76Fydj2mV$PG64DQkqLY%z~^`w&ncrlSz8+f|F=8c(XmQ%6`$tM(r*k!|YNe1zjcQe@%oo?AJ?m&w{gU zbGmM6CoUOQS!ri)&9mE(tZ(}Q67WzF0{5z(;mYPQG5_WATXmXYV_Y|CK$UimA{v-98p?#RCHm(mmhH(9BT2 zr<&t;bZ2BF_X*a7;vT9o5S9>f`~8?uTFe@J$?(*|0ST~~BvV-k$#vRgP`cw&{gpA$v0g#q(Jm?;t3~&4#iO-sdR802m z;ova)6El_$LPW5?nbI&uUB9MBU(FN8XHPRw8N*&m(n0$mD~v!J6(&BEWG07NF5F}M zAoC51?>71Uulb`aQGMbjOYF77{<&|%KCsv3=1W(HunO4#)AB%s-r(A-+rN-H)sPY@ zyb5ZpdJZ+kVxMJEmDy{6h(vCfF!Z_!A8OGLWVzmaA~4w^+|+ww4dfjOvsORDES-SO zD=45y!z40ls}>07hc5~V_I{Lw88)qzIOcdLf07MF^t-_-OV~1DkV0EnN|wd0Bwo~d0^Du=JnIPClZa{EO#rrA{8XMkDfh5URlWax9s5hq(6q*~v_xL&Q) zB*t>U-lOamQh+h5GGT+J%$$Mq{6NsZnNW~%8~AxW#_GwTklrsa>p8_{YWf8u%5wv` zowf_o|GtcJm#pPw<*m1ok}>dNptRP$893@X+kbGFY=n2;6{k8_#%Q+ya==rds$p2U z)(P21{F1n>+!$ zT7?q6tIj-S)MyTQGY`NBM7LXZ1S&QNyu=QemO9y>dOHiW}*5rgFd zFGOrQ^oXt^MFligoRzi_C^py()q&NzBu|>+ zX5TnhHs=WmBOkTqTuQ7)U#n)u21icwe z3AW%-j?q0zYKO!k3{dfH&G@G(dZ>xQ%?N4GoaJ(~;~du1;b+I#34_EneS`@_bp_Th zsqa5H`gE3XKbS>9zLiSS5G{<-Oycp2<`9YULLHO}EWd9?Iuq8N(!v35Y1ghM9R6vf zD#jz+*>>R!C>dt!jz4s;5Cc;Wou7J^16VqK^m+Ci>)(UvhN4!64_O+Y5wYiG%MN z{^5H>%QlhE-S+IJ2r=}JMs za0nX%=IVu5e_NP(oaSfW{9*fi7~Ntnq3?!YEns)tC5eowQ57l;c9*=-oV@NW9I2_+ z`0a&Rm7#tLm2ZkkdDx3DASKO@Ws4#8Nmmt0aRy|T==Vs{)uJI-9H`I$&aJpuN&El! zI_K!RzwgaA#*J;;PGhsNZQE>fV>PyIqiJIsP14x5?PP90U(9c2t(iaa$IV(7XRY%- zXYXh4{dy7ya>y`qK|Q#X9V{UZbj9t83}aT4ay^m1<{W@BnxIH6%?}s5-xv+vgO9?Ext|hiYM@HUlAn&nG=;* z&Lp7oEdjq4wE0qvti>n3EFGyTT_VJlPZP$CU)qudv7xbfnW{kfY7pW$bQ zkdy3U2w^{~g*}YG)Cv?>4y?N8F;uUL@hBhqTp2KOXKO`9wfmt3rjhov#X@2*DM{sb zPQ7nM5oo*A``S!u)3cT2XJrhHS}PMF5F;34c{4J!dDE!Gcw6W9tbPTZAQ;(w_q@c4 z?N0#d3whbCkOFq|8ObY*vQ(qY^(;)m783=4HFdf4#l+tQ|Fd41O}E`$KaXb&H+|%| za#W|#KWaqHA!|Qohze%%x^c&6?g0e2S2LRGwa8Fl1U$DJl#OcIPLXpgA&o~OBDOzN zYnA_;l_}7m3n8jUF&z_OC6VcH;Ps={Iq<+@g(0VkxEog?apvHpKE8v-Ka!GqT89-G z+T_!s;B!lpi8_ZrJY7=^TM{3&VrNAqWYCO7 z#GKJrfVgi&{+ABhb_pbbjkCkF2+${A?LzA$SMB{SS9I#61TwAHB|mTv9ca1LGG_n+7*m+9_^(Y= z1qw@^JbxZxPBKcY!+t;|N?fJgCbE(1Yy1M)uQ9I6W({y$Zycbq5%wI4(w1}%SugZI z5-dP6$Gtf+SU6xz=NlYS02I4rdED15+>XBTPm&t%4Bz69GUDM$xV6so3_+?eYF>{y zk1H{uor^SXidQ(nufjuWtpL{Ia%?3ABFL`_MgD0-f2CJ_9#yy)N)yf_s3^*RNw2V4 zK(x2ax#qoz2c&BSNE)BH{#A6V@jQ+p|gIHUF? zAS;?eNP(eB`j__VWDKmCINxSWC`Q~87oqg3%I#VUzyjZ=iQL9<>_N=5#7Yu6pSB_r>@RoVV=UA0+-Lg!jno5!+*6!i8VV?YbGWtpzF4Hm$I8 z`brFFwU9#MaL#&F)$`m`)M>|Ib|l}%;f94N(w&4UP52Edt%P0pY1bB3K!FQe(3-kZ zIEBK7@jbQWwt9$!CFT_n9LX@je;g{b+i4u9ym6v*r7>IVl7JS2?+bAy?V7!bI)Bj0~bJq7Y^1vTiFY-qU`Lf&!> zV$9=cXt9eSun9jA)D7=1N#^(h1md~>NDypM^6n}vg!`L#suAUDrW!!d5(0VQt6|Y2 zA2P@LxolPSFvy^j8~_Lb95gU%q3AwZ{cqi780avkLF`5vDUiKCBWTW?sdjRJ);0UR}QvVlw?7I zI^Eh}{5ke{l~u*|U>>vx`oO?^e4*idH--A@S26XyPw=f|c`ZMc;=z8Riun&%rJz*~ z6WiWVP@r6ck=vgR@Fc1Sxz~hC{={0UFiJ4yUm+1^&b7i=SL%2;#5FqOkaB2^>jgE1 zYQEOq?q<^=UIivc=r}}G-QEw%-hKLSNP>$YXhA1?p{!K~yrASuYmKz5>m0I*6|MIG z^d?9jeh;qq&45fv-eRmf+YSRM!OQ%f*m&bn!lO{%84D&p3!wws2}W#x3B_fFNV{E9 z)mSuF1{|>-@ZK|$Oovm;Q~&^30w-9Gui3Z&Hj(5WRTS?;FBsSF0uS? zV3K@xa!{tix(>=*`Bb*!S-l=9s0fQdWxQPStMGb7n}*)Yn=5;zG>g5ngyf-LBF1`5 zUQ=0UhC+MOULr$sDGn@0hfsX2hG{b&Cvn>|&J{QP77bRa5fm*35ZZAG zOoa+_-=-5=DAt0~r&7n`J8NfcGXCJ? zUc~a+p^Jr{h>}P=)f;D&d^Cw(n z4$bvtesjnSUOGo5?XK>91+^L+EJrJe$8w#Got9)|Y#vpa{f|6VysfoAb-K;N)k9`v z-^KheTIq2YAW$eFVPVX>9T^Pz%}X8k1Jb@0mULUQ`RWEMK$vo<3rDh)laUr++?{yM z=Zo-1^kXB$g?Mkk9z>FBXStU9Ak03r7l?~tDIz|uTK4;g=*rFv-g|08YCXAb3U#3S zdqh*i)P)DW7KsdBOvNi;KkbViEh%Pl&vLBl`zcpqqo$o42O92Z1mgCR;W}apeee*~ zqgp#;W;~}Z@F?#|%2!XYzn`Tp96F4BN9W&4(s_gzXuLsaZh8g#PhkYx zkLUZKrWyV3f|dsR`m_uymN17BxIic4@BwBSSp(x&@Z|SiWIBW(I@B0Wt9NHETI%L~O_ms?zNEIn z&{6^aUqTENPhcm^@No3WcO6<$to9+BciF4QT|IKFj0R*v9w&8JGPwLKPIJx01tyxs z2d3d~n{laqg<*^==6!&9eWg0}u}Du3;6-2{Pox6q<%NEn>G$*Boz(#N!Bd_lTrEoc z_OKb15Fp&&jXZ$(cOzHqs5>QHl&h;io1S}3g5fb0?u)EUA`Ql%X+3cLqqh*sc^7za zw`SpLqNq(zExvv#RBrFgJKHf@%P!lQgMw-t13c!Nr46ovtY3?D@GEq9@1|8&CVTQ<-OFpZPYV8A=rQn zm5XrDWzZ-00e|*B1Z&wm9srmc;+V7xG&?vS!w;qSb!RBsjNiXwqCjcE4Bu2r(rta~ zCtW(Y_{cybZAo7Xc#U>@In6AD{!g0z~ZgmyvgmLGxKHAo%<@<|maKv=BpF>kdmYagxI`Yl>gR zB~k>>2|+m+mIX3c^@j$_7|?PQ2~)nCcHtD*}{C-tfA?j$6-6>IF!s zR?6e2at7EK`25Li?4^!1C<$4G{(l7R|KFHBWJ9Q^(&sqKz>qbWj#$n4M=@o3U7vMO z_S7`Xjn#u(GBm338=eQKUrsVM5c%ck%CR*xNJFVX=UHT-zqC>{;$ z@Oya?dV5yvdg}vrcCNj1`F)*@eV=LaL%6*5+6~JqBffZY_Fg?10xnJo*=&652sz^8 zR#F$gK6bq=IDRmHR3m4~d%Whp2O;1oa0zi$ylwTxf*`|F(Zcg@7w{k&sLO+J*KzY*(uaPE-hkp&uLHFYSNrvzN!mTg2_pVK*Cxi*j_`|tR&-;m zq#%)xmG(r=Mm1%`jjWv4q3Pk|hJ7!ptk`XpGN^{wX-_l=NW{N`$e!>(?N;T$;kj28 z91U}oU&n&{=Zlky!W8;B8evDQ)8vLgyd-{by)5w{I$Mle(duL#y-aPPh}K~pRj_S! zgL@!qEL1qQi}9D;a_CMm-V-V;2q?#7=DrfANj5G1G6>6pvh_@G!a(Z_s-NFEL@aGu zY^QHlX_x(3fHA*Y=(+ntM~|_mZu>e5xB|_>oDez2g?hp@L$!9fI4`4V__z=PcHW-K zhFW!t4tWUL4V_C@hgNRl9q;AUxIVMxm!v==nIq-N-MwCnsbHTwp5`GX>dO_MyHSp=`Scfm%v9EoaX6rSVzJ4IYf_JLXJ~(P-X!Y4XLSvZS#!Z;UwFE zZ2e@v$^#t5moSM!QM!n8LRBs>XpxH_;XRY=A46@VRNm1tkwE|pncA_~AF$6#6oJul z%@$oe?JfP9QEO`czY2J!+g_wJkRq*3elN~~?%@o_{$rcw9Y8RNwMps229cnfI?F-U z)P)#sR0O+7>*cmSNuC4O=5q;7OF_^p6acQ)uI(rnTfTsCIJh42R9 zbE_fb#vh0tYH2KXtbb6k$*q&b=C{r4g50cw(h>YZwkP{l$XvuIJ#enRDyZC2&@l!@ zFki`y>nz}G(FQi^bSM?Hc~XjAdaJE=FW;$(W_F#hr5d2n;saf8koy!9uZfkG)Rd7h z>2kW#)g!+};N6yUoBez?u|F7|aU;(%yX~jBdiu5(BqtwlA)Ui=g}$XKhh;UTjU`-b zZWdZ~6aHIS4LW`5qAMjBJ&Fu94uZaH1NePV!u+(fhRYpb6I<-HrlGLhJKCvsQiS#yD3Dx!QRG+do7q58f+PxQ3^m z4RtJ2`l3YnDc^yg_-Q#;sdDylcC2@C?Hwsk5$QGZ?Hzcc3g#Q6VpLG%;%pbG-^?AQ zGB9u+A=_5Ar!u-qBKlm#uaNQU1-BuY4F`}0hoqmQNUv%mgU9}j7v}pq!|-7f6}qV6 zH%3*3%NdA?OL@(ikjz#GgDu&MD!hVbiX@ia8!lYDX}PQ!=w0#!)RSs$eg&7 z#Y|gdx6{-|R9X_?z!z;A1G11_;S5ETSxHslF3~INZQ21}G0UrxmNxC#V0RgdORlNj zQ@>?X$}MWyTT6|Y#iMOR+XqEB`}dkJYVGYKPsoVdHNJm#uLt`aQ;}nX+=cgy6Qe@V z_^d?f4{su+BXu{bnH+I+cHS>OhAO@4& zYZJ!ljEYZ^_Xu=v(_~?{p}$pmIdtb42l-#U{L)*O=d;a3k+j@l5KbD;1}+nAWK5Zy*y9oH|36ZXl0 zeSz@b#0HUsQXA1}DS)z5S*tO6Qghj2=${B3$?XJiTRWbNC?qyC(#LKtb?4E|da)C$ zOsoB$pto_jqx`iG+ttEKU_6ocv7q@?peGFb~fCZBTObDyr*8e zRpNPmOmqdm1(YN!j9w}nhnB#MBP$XQaeD_Ej6<)`DQrQIqXIMR1nQ^c)|ax$)~s$@ zR)L5+&H5GzB_Z0Vnz8d&vL%^Srb+!*_pPXYGATE1=~#1oTF=R~O!oCUz_g>r^3tK~J( z+hH|-`8kF8{ri5T_UXnUGe1?z8j+Z=KweH+A@WnbN{{wys5g2Q|2A@nCEG1q+17Xo1!X3AczA7<3p@*n4=T_hE)HaSkPO1HGW4{1U9Bv5?l?DE}K#-yKw21^U{Y=q!1=T!sUgl_bs zTE1E(=1)w({PEZ97=(FR__e;;m*oSZmzqe8SR~+-3O{&N|7sgbkGMwHi0Y3son%ei%ks7g0w(e|a5F26)Lk!^-Yj?XplMH`x8_@XU1)bmbHWm#2m zDP!b;Uj(naeX?|uhVR?3b{ghjrEHrI`4CTq6P+c79a|Ubp81Q-d+rMzjFcQLl(iEN z^%fGC`3*xp%zL%u*#q3R|24oKyS&}5c{u1=c!`I}oX>(ZI$4A^E4N4KQ?SY4Bkao1 zDe5_b^%o@7_MNBinv+V!TJEqWztXRTxWqR(2-@H|%~n9lChj8z0f4jywSwK+2c!`K zCwB?VUI~z4-SW5Rd=ik*-Mn3urevqUwL|(5A6{Dj_3^}4i)Rh!7bxB zPoC!NL^rn9(a;zpr~$N)mY{Zj*tCn5XxA#^F%|vH3Xfa*Ve$bw=GY>&WHp&E z!jj}Jp&>E~#!I8!lbHmei!kV~hW^RV`s88*HPKP_7kD=#1MJ)0ht#>Y z2t$Sc)t^LwKtr)eMk2%}q{2D}F4i3%0t^LSqQ|I~zrTJ;$TOjfWR-@MlW7FenZl2-StTD{$27rL7He5L+E{{Y$gX=i+-ojkpbDi8BXN|3R*6(Be=yw4*EY`aF=SlMWOxv)Rz1 zkgn!0tRLn(;~Yb~sT=Och}214Ll=M>C9R#+xn%kfO?|};4|Ry_CdJ$UPFbfWL6RNZ z0Ps#3v2fSK$GYl3q^%q%d0WI3yIRnsthQUw@9=e{D@U(V)e(-bsJIcvG^Qz6TQS=~ z4qN7-&WR332)=0o3$iZ+eOXuON#(PJC@@4mikY*0vdFn zw91Y%lS8{{?zifUy%t(eLFiC%N)xhjL#uyauQDy&1j9QJ$0y$LhqPi3xP*#5U!>2t-pfh zlX5mj60D-!=_d=)ibg0b!^C@YWz#8dyX7_Y0;XnzsA;`5#CpL+RQors&8@_e!7md( z6%WQC#e|FRU`h-wOHeD`HccSl{0~t4m7_Aw7rqa1!1?2>Z^P@(5E%b%6dmh)CIRxa z9^^af{WMxT7Fxd`5{fjRUdoGKTO&-fCW9sii?BO4jk!RWYD-gCC`oCD&-q< z4%B7Oq@)S7E)8!DILw$#7w`O5!GYenj+2I_2*M%{3j)j{`-j4JL+J7eCWQ0L-*FEk z2gn8Mx!WTD9^c4y&YqL$Rvh+rdxO1?m48p~Z!A#k5_8Pmak)6Y{6W!zUr)KP#~r}f zm7ytpN7cwIVsvW;o4%q^YU65X_-z4?A`vTGFcT}vDecIFX(a1bGw=}`AA<|Mwz^BS zj;+#z>t0Wn{Y2pace~3FUN5n~MT>9)ebhQ`o|vZNZfgJ(pVL1ZT8W3C4ur-=K#4R* zf)Qf1&r2aJMI9d~>_ak>1yIKm4&IWk3)DU`MaSn{WgqZgMNFOqAdim0PUS z%=&HJPK>$WYn8d1l)}HBf4qO{c=gYr@nW)g?_aN-PBcsGwM`oRmXc+>MTjmVw^>S? z5(jhN-@~pa6S;&GSxDIzDCXHSa~nYE0%G{dM$eT?ps!a^5tdj1cKxqc!}%e)=Xg0I zwrmTPwF|!P2KB>%?bwECJcp^)cW$BZ%*$@!(7MPuF{=XfJ4~(o*q)k~lJ;O;E;RApPbCHLb2)@tkd!T3YbfS=B&bFYwJl%#@)V>FVsx;b*2YtxTQL+~LV7>^2 zQRK?BxelZPxw)@#SZ<+&u8dxaoN7983x_$q-+OJ{m=US`Y+O6fZ}0?^S!_FvbLgMx zZz-0FF7b+8eBTgi1Hts5&&ZtK+ys@$<~)IctN)v9xV#SHxHcruy|Qji*y#2wb|1A| zH{B0RJ3sVLD0gD9IX_9dr$M|}z}EG&s>GQis?fqe+vW0{~xyI4fL)tVi;lGtcMV)`>M-+~i{dtLk? z2ci}R@I*9S(gBYQhj$+B@)7sC$g@?|yj? zvKyTHHF>3rn<)2Mc`E+#x*yJhigMTUh#xN41Mb`V^gV_m7*#T`sgN4zn7n@c7U4gR zvMD^s62Q9XS6lmMG8D*Lsh>Q%K6Mt#JDz6Df{ufF4(4{Mqm8;`bjZdg!4{Y6^uu)6 zGX=TP-vMOj6Tm8QydBC*YSs6cPwRVK$w+@$cTjuC%i5;heR=TK*|a|WgEd~oVS{C$ zsoCry)B_g}hmYq}rqjdsLC~){e+I<-UjVh8&f75s)Ux|V!v0K0)VCQ3+sE*@rgd^1;L`bxkxI<8?=;PYadv{5YPT`2 zh`z1a!_wSCu@RJdAyki0@KRSCX>=G*Dj|e!_j;598IqDF_%KEaryU_SZdzo}_@CX4=ij8ceY$r&rL3iiEf~8VJFw6{U%LF00IAOzI zzxvbh1$^0oCWjUZ5J=H+LO_MismRYb!XxF1!(+e1q9f?Y0|85aHLpDB;IO9{fKFfX z36K?+DrJjn@IZgbHM!LU@|yV21w&TQ{AM3eJ70DXyy;!_ZETrIwcX;5vNCKZ7J`7CyRJtrT>Nth<>HL&WH(lL zO+X>z36+6xuPh1=x~Vz$(g36vWs3RlVQd+_T<&vcc7+Jg4L{AQz27OwU-L zFBP6VzHZA8mU!^stltT$A<4WL{}{k$dtEX-vfvT z$ipWet?z}EHZSezmlpQjp;_n-LE;NB>3mr)y$!Yh6@@4OIF8iXe*uE!7{EnJPEBYQ zIy6o^>dGgD%9wp#fH_xlL|%)4X2Xk(bf}}^MZW+@uJ3L;xSJS?2Fum-UqDmG+;CI> zwr;}xqG9SDD9e#V7>+>&g!EB>*f;w#-&ceboL<>FDUww@0H5k>XM*h+HG7 z%iw9lOEPpXv?s9j2qXCC@~W@9j(AJ+$f*<*v_3!)cDA~NGNi*8^!HfqpbkXw&4~b8 zd(56t`6V?;5=y0z9FZPF@9e)0(*0yMR=p0Voo?_S(yb@CZ0+ARo6qJyhdOs5qr!{_ z3+YK-NaE`dym|1L_Ib2mRfNUD>7$D!)SMO|PK=%oc8r6jSo~&`b<(?rs+C(E=#(FF_pUV`c(6)EU z3V|%t-9<9dIpD#@B@t5Rj`t@BRX%MAb_1gg}84@x@n}Mo+ zS`zfk0E1b0Ph?H>y|6Ccdu`kNn{!gp{Png#?UPpqA;HyYBk%3`Uv7++7_$2cQCJRQ zF)zEr;$p4^4t|*SB5MhORAOAWHLC@g2Qksmsu8`wABX++(R~z@cj`YjRP^$ zAX<4WkdT4u);K?`tOKn3xpgmTmc||XSnHVkG7#yF&D#g&yg-2-KN)MhuJdx0hiTWf z?8k5C)96s7Wjs5U=*@9-A)im|AfiZE2rWnLtu$+6sjs)9>~GtG6g_g89`Q#qn&j>)~&3=q0)N9$W%8@sR@I$2s1C_2&_>FLR4|lABYWo z5hN*04!CpqY_jy$%py&NFnHC=e#?IxwN|r)$7EXi@Zy}lNH_odlt?1VWK^K2DXLeZ zLjs;lMfjMx$M{*{?T5y<9=U9~xQBp$XW+%v?QD@ibj>k@Wa+>u7#HHR-#8vxb!^1= zVG3pZ8%i>s*YE>H1yqNi_;U^zCMwY&a{vRME0l*1qN?Gtp}7HUN>NJHNe$bqakP9DuZ_p=z!3gD@-S zOQQ#n{egAoYFWB}fxC~IucLF8WSOTHMlW6O!J^5BZKg-4dj}*eK!uL6NnCzVUU=wOwW+pjmv{AHC zhwc}X8=jpeZs6jyCYLO<`O{ceu&54goS+h@oD|Y9MT_R;6yNxiTERSif zSg}#7K?Q7mW9^>xNuRY#gJnM(*$_3}6`0Nh`||Dp*HdNz>?4pX&R7HJgXS+VzSW_h zaGru|gDl;yXI5)!h9Ab(aDvFf6hZ+5wk8yLZ)e^-Z;Tk3*{i0(qqvED1AHKQDwgi- zRO$EwMEmMrFs!k|*Ix!Va@!IXkKBg4%`MF4zh@*5)6h*u=EKC%gk}($R zn?yZlO((Y+G{17KV@4V&~q`$!)-n<3po4`!))|dNQZKGxJTrCkY*V{;1H_kRsVE)QG5cL z@Qfe$hSBkthaJ&Tn+AlWVe+`J3X`q#^l*ub|9Zw%;@b{&;$y*0dvGpks$@~5=o6=% z?MMu70@AA20gADO6EL1+(l+w8aG9`5-~WlE8yN)COEv4T#xmJtf+ywKJGa~jTCe`*tFu#3h1~z(u-UN+`3id&S-NB7u2hBvX;#-CA! zuutZS;5Jr8n&1`w>~1O(=!pnbnc7UZLTJH=-&ioRD4W?%ji#gqrD z+ld+Sy{{y0@@yJ(k^WQuE}P<}W%na=NRU?bkfQ&j_$)4>Oi6X)4-|pQD|AR%weUm# zPCuge*41Heoc;of$4}2h42k8|4vm1PZf|OSkf*`vvh(HNMC0(0lvp|-P!|gqgU{Z! z#l=3A2Ob&U%^i=AX=0e(3v-X7e0SnEmNvIAjj9L99DE(hyBxZ)9=SV7BgcB?PGL`k!P4l&h$dg@^z#xkicAWRyt2@%bn4 z3Q?lU)7-;$pt%@$qR0y_tT?df#AA~<3wXtWDP)L$Os!W*SPxIJNRhZc|4beywnjxD zCv&M{7qMBK3eBR~@fLxRf6cZyF~PYnUg$rKDVjpXiFTlC5%thwu%ipv}sZ9nm|Ex`c;K@d$Cd?HV1MQk? zG1K7NgZjIPbtF7JeFZyCZ!h9Bw=9t0P3=U&^*bK6bI?_|r_qx9pIZ7t6=jV2E96Mv zbj~He@n=nCy9ZJ3mGxQ*x-Y$kSOG?1fJ(>Zp&$_ewhD>1u2aLmkE;Wj9N$m zXARNgnCUU!zE9yys7JxBa;FYXDzb0qeDz8$!o$BEg+)beQ7@7$YspGqd8TYx-vhv| z&ZCitZk{_lXON|JbRX>VhiCfneoY2=@kpiic=@~cl8I?aKv@c5Y;YT2=Gqgz-PzCx zWaEb2ZXH}E?x$UQW*Y(T+(;;C4tAjCKXv#!jCS(v^pY(Z0HRt9w5l9oNZ9R zk$Qyaj(natI6R)bMlL#35lM6f&bxn}y4weS^vVP$K;iPD&C&|6NUSgwv91KBUiZHP zd_ppugA$I^-u5Z4*7PG9t@SW;|+nVJ+tx=zNi0B0F-9l4H^KSEqn1q~RtqKj8;#_Jx)tz(>T2Yn zP!+F+u=>ZP;UcpAI1w6jz8km zDJ^5chM^M?;ewkA|$LHSM z3~}U|Y89&MPpM!tkbt4~l<~$^%Pj`Lev-@S z_}7ym;1GZ7Ci!}yZav>BYs#C4yHGG|`?V@L9%!?H17}rnz?1*Co)LYFdj+azsFnR+ z^$hN(IZwAI$RHiujjovyIX@E$6rM>S^IuQ?WyXai6sd=bAOMVwiyRAORE(2)7YfEM!ZDIhO z2H&CN=O*`*M^r;{g)1MXF4r~gq+iGNIcYB2PjD7J1(9EdOPPHC`nP1FcL6rTses`W zrQEoKSc9Jxr?O(~tk4JYK>8JWAD@=DSpjNeb%V46e8`LD-$Jtozs-FQPdFQX3!Z%& z`h?H89>Cya;L!3K4#;2ij^>ecoU~NG$&EdfHD&VIlII3bRv>3SK{qc1l7$`XRBatf zWi<~}oG##;GrQLOYs;V?-R~k7^)F|J#Zo4GUq|Hs^e&iV-!b)&CK)T9@H=?i!D;-h zY~W|2l*67n5%h#oLLkz0gW4D16BHy(E0A@7M^0uw)ltwTg%^0W5%E3J$4GPB@*K~G zaCw9%Xa<)5_Ci|x*8kkgL;;ti;NGOU^}FPWY84VSJkRLgg^gc~4kTc*Q>Z_4b?}DH zex1aI#cXfojD=01Y2O8S1d+^xnqO?WAagyO!>1XGsk0nzgdxL~dG7eY(Qx)3awMH5 zhOo5Xw$eq86Qr3^ow#UmfnMHZ{&W^#rnzuz65FQY*P_W&k@ZtI|reXGlLcmb~wPlSNoJ;8uXxoEb+*%H7_9aj1%O&)5@Zvs*kKBSpi^4rqQFv|`yjW#E2Tpn0c`-?;DkJMw$kn$%s?Dmk&G{@ zynJwOCi~(~nw{3W9M+@=3g~gZqeK!ACq|A9G$?E|MXWGoh$(1Rinni#>uSQccJkGwtG*g;q>z{ZgBv%Kp3{*6#=Mf~p-g zF9qZKxit>sOz+~a`K_)g^FS1NFXKHoUqr<=NQuJJhWsiV#+qkcR`v*lo6feX7z^?M zrpFTqSEi(CQ z@nL@edDHy%6F6dSTWblFfoVLpL&lbxSy&AbDithCGDN42Fp~VB5 zqxG`Q&Nx($iNgUp(0i2rpsG6)ADp0VPeo69MuZj(I)^%J4;h#h{V4rEhsR^R_F`{$2$vp!Uw|&>6=5z^lN$XxOj#E&6$MZ%-1`CCs z?m!MzeQS8hF)G@df{GayT@v`9h5uG3l~P`8d^OYD_exWOGg7Z)@1U1Cf8v}-q_pt3 za9D)mrm{G7sk)J6Y_r9%IdI|O+E9GXp#$W=(-(!wq44v!=d%hfG-FSVR6e-QZ(Ujr z!`0BOv*FZ^(#eo7RcZ~wSRQto zY6g&eZg`H@UWXJC17Cv;O{dTyX)XDQy|eZTejgmtZT7R*7J_vEfCG+BrTN4x?g$Kz zbWGRuTYl_I=qDE_yQ{lSkzK#z!Mc3pA){^CV9{6p`}ASY2F3PUbg7oZIi~gJq^(I7 z;tZ*yM{{YaTvv*yTsapII%GhRv^l~!V##R}Ie)p?H-q(?Qv0qYZL$KKqKIE}u`$UX z;ZX9(Je(Rjml`c^B^Jb&3^8i*1&T?{sI^6-3aTS#i`AWa6kuUHHt?;P-CEN|cw8!U zE@ijT9|EWlo&kWRP9p>Q&-0HA8M?EkABJglN!oh=$MbG{1cJ@~ij=~X{cRRC*% zA^jWVxvdUKYN*44y8K7&x2r9tOsG3Xi@1=x(#=$L!FOwS} z`=-?Ci{^N)XRm9YYQ56;-pd+y4`vRNlnYdUfFm%lsLE^a)^|GC&j&Db095H@U z;x7~iZFcsXG7ahxHLBmHlZdD3aqe$FK$Jye4_~~gE@=Mguu^Ex*7bx0LgT;v0@uUh znpi(_l!tTx1C)ou7&{Z(GF$1<8b4EE1Zc^C(Gg>C zt~+oS%b?=or+AbOvS-c#EQY+uLAYcx819hc>=N3aQp(goA(}K$5c45I578VksPJ|h zg3PChH3;>OhJrS$3Y|Eb_D@gZ;q7QBsQWqB@9n1cKMg>1PjHN2!t*@Xupn^tJDu089)BP*oUv1iX9!@_0K1kzt%N{8v1WXDA#9R zHr}@k-|sVx2jqiJGtPHnW9yGQuz>9gv1GGy&x#B0RT@MLjlhn9YID*pnrU{~zSov{ z$J}S<2`=C<@lNAO@!}fOjua5<%6%!d?Kj_TO=^H4bI|Es$A_9Ovgi)GqSjz6bnP%6 z82<*p*6o2Xvmi7Hdnx=%ZW) zxkc&Id+Nsf`vvfArR!soI`Q1AbB>Gf!aNbIp;Uy3=^OB71C%fb((0P}w8QTD-wvKo zyPZEz*JWDH!(8orAp<$vK;_u_1s=39%N=B1W&yS6f=6HbkS|xU+}@2l;f9{Vp7v`e z6wp_rf34dO`ojI@rdFu&^Yb!pifGzQ{L!}dKD4RePa8ej{;-_75{^I){GSdp5QfH5 z(YWgS{s#xO*DtM2q&aHM^ciI8eh?k=_fPvt8_#ePE!Mcn?~lb_2y44}3j^1*i7vcT zI)#7PpSf1g3NwRCsqVX|TL0r6bB&7i zG!~%)gYNUDq$Q^>a(>n1z6|-;-}`Y5@2ZWK8ldBf3kI1 zdyAC)*_tf(p-8Ba1o|rW3>2o!sxq-=1{j-~nO?x?oPCc4e}HQ?=O58HN9;ofE`tDm zJy%0W#EH=11=+u7Mgk+~U+1^Mog|Wig^&CN$Vt8yWuz*hk(2!8myvhtbvVx%Szb`r z6urPzo1nDQ%~s+2pUH0DGc@iNm-W0obR1=2zUmFmmj_9YJix%p$w`YiEDnIyd$@hS zB`Is&uZ6T*o`cIjj8=>ItbaB9;Hi+8fGILKU$UQJAzz)Lw-H@&4ZrwjB&3APeX1HM z0zzJ&Qo3G?s~oJ|J@4mgAQyny$;U)F^BtI>=h>xjl=4xEloyjwPH!bS^J65k)tX0X zX#dA$Alfqa6Q2RxQ+0;n>P&vm1fQ%d%z}7wlt;u)xTIK3u9Bs~ly82{Pj4vuY9=~O z>rXc%Kk5;FHm<0y_f=25+JuyjOzHBV&X)wa%k8d^nVT-s5T}QTU2KtCIDKtIBlZBo zg>qLF1xLFu#8F#t4|x^1KFC=Y5WV{T=B~4aMl4UQBaL0#g~R${n4qcgCv#W5%qV9X z!5fVSG@J$W!An}G8<<_uYq+y$x@H}3l&Upyv>&0y74hmam%6!MU7`BgfAJaRQX_PX zuMYLa!XAJ=8xp++Q=tc0{7Yb3@~jAGuiEbmDaE4rEt8ve$B`a!mz?rqii(RmmY2vr ztL*%e(tF$Wm@(Gm3x_}!BL-GtBSq8&^u==m;tNG2z0TRa5s8WptwW&T_R2j{RU(qQSybGfI<;DdZeB1vbyky`ztxD_LDD$YmGvH?OItBFwIlw^c~j!) z{d*Vtjwsv=nw-Zid(y|brWArE+;q>z>Tx7feMHZkKTnYrO6XY!#Js7n7zpSDh%P|= zmdqSBI>@|Rx!F69_DXvu9ANx_d7<+UuUOFCFYwu+cY*{Zq+UUB<&(rQ=GxPS)sPn^cfDr#)@A1&qd$y%gnd(FVl1jmVD2n35OHG z?waq|cO%{5`Hz2}jHq4|&PHTbVInK1k!p90Utl_;r-Fs8o7^af78&y9I;>QAS0?jC zX3RPV4zzfz+xb$yqgTNW&ai0>r>09ed_7>q_U_x*@ou`dxBWaP zoceuJXmler*S;Ks+7T(Shc7fN8$1ar=qmmv9Q#ki0Xy<*crM;m=!E?g@?F^a;r64b zSZdL}Ug06S*0sf-q&nioOn_0naWJnyKGpe!+|>0Lp9Zt%5ojAdCuHXeeofMynpfmn zg@Pm=Zg}W7bQW{F#>Vuz3NM}r>ZppXT_)Ge8gGYbLG9YHG6%A?tx(~7s~;@}-=;B0 zr0*9O6k#Lm7=Cz=v9V1*=)hNH!dn zMp*v}lb*eGLJJcdiKd<2q5>tYk!mVQ!wSGYt(jKfZ7uEcc=yY0sg($bfio;nLpqu@ z5j&>0Sj#5NE9>?|#YFe~S?a!9s3Jzmbt&2GTlF0>GAHl(pOjnVnkdLbur(7FsQcty z-DO$;=DyjM-YVNiTq(<2_%~NmJhK4fYdj)*jKYw8SY_vW{@s}c$KZAkn|Ks~o9+NfpRY^Vk)z;FEGn4Ow?@T%BG+>Z znedRDuyg$H%?Ey^(jToHXCMoE9bm29gWMn_ruSIu7%fuCh&RoB>cx0nfST9bRITa8 z%1ui52z|6|=!W_XNK4;=EFnS4f)S2cue)9Zo#>O#-1zj~3Dg?BqE-ndmD?p`LLFTZ zYL}CpsVW8x#Jb(qU9f`P-hBCM%2dl+RR>T==k-`_NQ2u*RO8e5ILKB7fSviaT5p*K zO|O(K?6X{IjKG!7Tem)m;lw1~9BJQK$&{eSI7cvU-!gq%RIzj5%c!xPOmj|k1SWpF zf;Cui(SMfj*`IEr$fehHwP>tS^W{7(G`hOSel;vt+P;|ie2y>~RE)YU;O4Fb>r8~I zOI~cl6}1lTr%mD}PG~m;Ec+0b8l8ZoGTRr_r7-9_RxI`wSM`s^1X~k{wg7(l(@wr3 zStNP*^qTo4p60x0jy-(?bjL!X&R0t{vNZ|porxJZXXx^kr|V`)#uu#yy(u79oA8M` z)zg2646%4$i4B}%VZhVdS-07Hxl?8NC=B-U0P0i`rs<4Phd~}NFddpyTic?Ehv+OO zeM$C#+PNtX1c^CmqYHXu*fs(dK;pn#`wgKP36d;V8z!r38IE721U`!xuAIF`x?;gWi~O zn0hXBvhs03(?<%R<$j|$T}^nFR#;5OVyz&H!5W2-auaP573{lZR{_!N)uM-;$G>s> zDTxpf^L77OB@sR(T(5d2I;35S*}hdW;J0yQV$QM18Nl|?zuF{&H5zO=Nl+VAr6YH+jlETv#1R3-xD^J&|0~+Ig|MD~21A45(B(2agGb?|2oA^<`A8 zp9PI8j7;s!eaw$nY=!^B;Tv!^Ec1?`kJXi{c;1x2$at+#d@*DkdcoV= zcZIth1c-^&2p4@8RZ4#fL5RBYZ_EVFWT6~;VvlD?9xEoI;mlQsVCNVKk(Z5OpHVSTxBQBaq{rHd2@MG zl-O}JU`mkZB;#^UeLX^7dO>dAHEblf9LW8?j^30;2qAwaPSidK?TYEZdnKCsO%9Ci z7jg-uq%(*3JPsu-3pa6_3oEJjRz9mnTI>R@W$8)>KZ?uj4McIt+pZ5_IzIG+r=tuU zK5DOtJG(hxaUUzVZuymuZv4Yi#!btXA6W3cx6fPImJr-twl+p}78Vm+YhH!l9;;W& z$5L<;7G(L);YpkbOJZU`E0@B(9+6j~P+S0`SKcN)zuspa6CGPgYq)D$fZRQxnL~@= zZ)|f^7TrBMS;+lLmJqGI8|tX*-nJO2Ho-<=62~a0_6GRfv%hE&I~7)*hF2Ih;zX~3 zFxh>hICs-t4OmUr+xLnd1#X6)uK9D4ro{C9cm5X>O8#YQb2BS zpaD8A)|#2LxwStpXM&D}EAbP=>{0@iLoUF9;S_a&j03=hHzPR8?PPP#=whC;?ubu& z*(IrB$XO8L$|%J8J|v$qQ(8O&GARY66HgY_V`{<^T5o-IUsrsE8>M|MJ-Ks z58HO7(?QL&2sN;;3sh``PIUu5y*aPnu5Fditnqt~C}I$f^PkJ8Q@AZ1Fjw1{1u2k9$#xSee}QhP$6UPJLZV6 zmU_T#XeU^XXCMu?-M(Cpx)3Yy%m|1v@bn1$47u=_72xS{+U|Ec$?e=`WociS_;(xL zH-Zx#pn;p_h0hQvcWmm;I&ra0qO8cW+`NWW$p-)|k8!vPse*yu83Fg6aD3%B6C2|3 zrHrpp|J`F|p^*PyAOO6LT~0GIn8?36vkIF1ROa*uXG8=a znUMNVxFZr%qN8NX19R#8QIqRHkat6WN3)pVD<-B*fT#o@ls2cSRJz#&hzwU5-?8rc z{(e2@Iq_BeqILMKau>15t^U%ZX!pBPt&s2dW;b|qRDiXb#UkeCi`7DndnBB#I%z4N z;v2jT;IvdqFAHc<7|jVjqTagp2rNM$8Rv+Y zS{kSvK+kU3#4xxxlNi3}k-%RLATQy1HGAA*V1>KQmC_8$x<*{o;87vGY$Gert6c^E zzL;7}g(@K-fGnTX+^I%0o7pS?ob2%WaFH8gd6LuR^rCE7i>&lr&```fvau#`*4FU; z8cIy|sPM_HRC6}T>CFhHWzDT%C2AG{aXSp*T;x0~+S7Zvw|Uj5TuUm3%WC|iM2EIP z>P2D1tZ#q8a1RLXn-_dRp-)JZsvL}@{N5sdlgEV*C_GzM$X{GL=X@WJdz( zI3$6(Yf$%myiJAc2%IY*3H&2l9J%l(-1t@(Z{H6VYaL`xT*k-zysAd$p%OAzG&AZ1 zi)a=Jq>%qJ(QtJ?nH}9j-rv}fk;DCc&FQ*K)tn^skkt4VW=c!HPGB#N71rMLb^WrY`9g)}Gz{=LyxM&> zl1_haeBh%$NR)uAJQfwjuK*(rH3|JDj4B?DXmr`j2pROHw!Ow+%H~&2yA%;Tf^u#- z>mvSz8>h4LE9p=D1!Z{uOgAh!jx#UGj)$OIa%43#sj#HgA3vjhQ+>A$a5G++v{%+) zoaZb`=Qw$3>11O-W!(n7z>5Jm=EH);Yw=BchcJ1ApW^F)*Fo7#3qT5Y^n6pCLbN+s z+&tw%Xs)~?WO~F|U4x*EW|J^@%3WOCt78IcquI0(jou zYy62U{~A;I_we0B(6QkT&!o^A-=cp|i<37B=9cbF<9I95m%n;Py~F^LX&X!)?F!0Z zZFbCCWm(9>ICu!IT}~1$BDWQ_a8i+~1-HF%T!^gPGwkUUWn_q$f`DCt-zR%}dqPoF zGoxmC*(;dqcUKYibf+wU0kNeDwpbV;B}~T#^!1tYhXPaiTz5tG>aZLn@at&n)^7#v z!zVv=Wpuy6%Cc&lnap1|u)L7eE2E)pSF<)}6zg?OGfNfsDO%oDfst-^<`vKM5c(B^~cH@gD_;8|J9djFsdyBcN&@M!2$gjXJ7C^ zezMn0qX9&X8alTyT@q3EP6)KECK zSBFWk*h@4Fnotx#lB>!a9)-}u%C6=t~Dw9()+}-g3!Kxr;IN< zT|?NiEMVcq=}`D4y`km2R_TP|7JD1@TNDx2)$6&a#N&gIypi;pzHc^QnQ~pmZ`!fO>${8LtPS?i z)kGRh(d!%voeFo;RxrM_Rsufpt28i+4zx2oi=sQ&48)@Eb^8mNo#tP$wIPXYC8u@w zzyXjocAJ^Xx;tpljRZeXgJgTh;oyA6-Vbc+BvU@4+T5U#r*cn=_t>dzy0qg8a-azR zG3y%XKrykGj2kH&>5aSoc;gPPr>NsTk*;m$ zKDRFK8J_SYU8e@7>H+s8c4gx=GmNAY*WwYVLxZ~AfGwbXXqNfo-#4SLI5fdaL;u!p zB-fVdGHbzc(FXd#lZ@sTnQH2^3t zARJ&~Um7Du<){J`0g&D>H}oP3MxCBv;K%g@3YmWex79b|D3Prv=Qrqi1a&9~`E_o0 zE<8v*6nAFZmcH;kerPP_c+RbPt*wUdBymK+2-0%E29>BESYc3Kgp8=dBC0RV~6ok zq}rYP@lkP=>ie-)$jL82aHu` zuGBFn-?b%Xah!(Q7d7wMFMw%E%~MbxjDv<>=ykkYFDYs>^;a6d6^7#T#k(>RyU4R9 znYKAy(~h4p!SWD+64}9y1v!qU4u{EiG)CC%yL9YT=xjv(v4Dr+23FY<~6zt>~MdTPOvrBi$84uJX(ISVaJymr4) zjF$flOL^vFIFXOV(D4+UmI&&Mv$XU6Vm~;43pz#o`tDK4HYpbXv)HiLyov7Vi7URf z_j26}A@?$%qEEE35*+xM52;YD&kZv@Ignc%j-SBo&=JK zL@{l;`#pbjJk-|_5+G(g1?O7vYV;FUK3e-~9L}NEC<1}huEOukfPP=fTJP)AP48&H zvMmPxS11FZ&N3yz1FfZMFVs)ZP+%_#7cdKP>y*=8|$c=q*4Gz0Sl{pw` zXq5$sbc@B9_C*ee6jW$b^hG3`WR&OV#MAiVnI}jCC?hg91%N1i8|v)zmMCWv^y%a4 zwJ`sf6%U}`H}PhP|7T~s5?!>l)WXD$*XdM%22CRsFXc$la^fd9W_k)5ToFmfN7$%M zhsmVDm;PHV*nUrbrwMc(SOz7mMN?YvPJhSNn3mC3!3}4eAI&6hoO32S%I?8OEG;^YGRN1upGqd;5EncT zaPt^|`x#&{{l-jz2bdGOl7J+=+sW=2ZLhUxdElrJ9qh=3a#AA}Q%1WESnXj$bNd|OMz zr*)1X`iWxTVY;~FkhO@Es%+UAw!a+3yEtuiJU@Mg)s%L4RLrqCHK5Z%vk7h}pC3%-a2ts7qkGBnH98NUPBTbk#X~xOUMx`^>3Klx_4MQ zvTOh!e|9`c*wD$_55OrEy=vtc)@J~#1gV&0PAMkRzNYyH>`D*OV~^M~M9M}~VG6Sk zqBhYgY?kJL)kNiL-K%pbU7I4vk=Ztr1Z^juR!8~ZAt1dmu2l1;Q7xl#)o6oO{_*Aq zz|C9Hl&OM=9m7+(AoWM~JA!yGLI!P+Qnhbh+1FKDu1)d$Vn7)pFDTL*!dZiLvm=jm&Qw4m;u zNa-zwJwKNB^H-B+;lE6x!*FnCtp=p|EnP=~c}ahSfBMN4jQDLT$!E`eW8C z@7O2r{yACf?pC_g4@X6>q8cH374Q zQO-mzq09->;RgE?A|C@MQkrBPC+J&Z zl|!pa9iI2{d8q{UT{dxe&iWW=2;Ex&TOG4E)2f@>im+1L1|3fWe;&LJqn~V0Yb6>U zsU-%fX{R&}5JIW&XEXr-`)5+$eINQH7r*@glDqVLg?xRoaWGaj-QgR%YTa`(9el9T zkPOP+@?#JCe0WfbPhKoo03ylD*8VSOv#Zkek>LBu{Z%i5Gi`v;oxqI-Oyv0#v)CX8 zwua?I_!Aqgw`p`a6%qav`18w%J#kofk6dz(ZZcHN$qxC#Nhu&>M$bf-J{b4=*%}Xm z7=0@}O@IcYFbsUND0W1yyVB<2-C9XcxW-x1Pp-D9(fp_V%pjSKfr44|${lpxe^X_! z$PSL5_nAS_8%X2!f9GH5*_YLemC0kllF>g`_I6&6nbw82>Z*p=$}}CewLrK|R2NGk zEL1th4OC7;RU*KK_A0-JAwzMseF($ z8!&=gJPdxArO>dOrIPN~-q8UY`mhW6J{&Uot)r@ zpIXh^`So*?sIik`{q`AYrykLJ?_0LPp=H-lHgEh4t%2VMty5}*r?P||PYM>SVl4xflN;GFgkG8n<>Gp+K>YN(-lD5>O z2nN@U1cfQ*k3Py&emWWcM|%kY4nA}j33l6|WyF!jc2bh-dK0ep1z29E%)rcYb!m2^ zzfABwUgiKGPadR#UyehOn%Y4*`=UaEhwf|@{SV_ z731k+muq0bekPH$G&zADuXh6C9JIzDYp*a2)H#Nsa9D)Ze-p5=1CxixS+W;LD3)5` zDsMPhd#gdAce8}v7DAupw#T~xwV`DYGS4PJPrzOwd60?Rlq{*FlhvH~FNr7&G{I++ zfe1}~DVx6~+HPD9e?n7tS5hp$wO24|bswItew|BD>${liTVYsR8$wbbV0O>W%%yJP z|A{~ue=|s>LGAU^98;H-1l8UnENS16#nRoXK)Z$cdl1)aL)1#uWZf)ec29{%|z!T_JPc4VCU(cN>qL;|hOnD9pyD|LP#_M{)4IvrfDkkqs-cck9mRuz7@3iUfW ztmv=ph=-pv(6yxNAW zo{~%=h<$f)pz3ujZh8;V$!|6I!pBkTbyZhc19B5xDtDZWTIN4Oc}Q$hGABQj4MG9J zN2-0Z)8=oHerP4yL$zanlET_{JgW$p!AWcd&Fguj>m#a#OvgkTIFL_3B8*PAdTW8H z$>k!#^0?n^No5%_$*+BUMAIK+YI(u0K46Adxr!SbDt-6uc(7j94MUbuLAnWcMDp0Q z25oDHJ3cU>pM|8;In(U1&&6J5A3!Tgbz(7X)R7~m6#bVqU_42igR+AzIS*WXf$!Io z9bmB)Ao;1JLv*Mr$GBV9ey>?9@g|VkPthtkDQm!5*LkOjl#wq<&dTW^f(~x-heSB} zy`ROCo}6-kX`A2yCfJV86h4aX4hLT-!*_^o2VwHsbdrZD2+=wXjNr111E47lTa+2u zdDqo{M8oSAiG;mtj*ai6(BEj{k#h~tswV2&zmbP0=PB=rr`cjD0{b;9$7Ze5S=|Q% ziE@+k=aRND*HTxa4+iR3Qw*>OSL3M?m^Rd-5BUUBlTZxcG-BqeqA}U&$ew32Oat}3 zVuJ~WcJkcFm?G7wXxxq`0SC;<;PO=GTm7_$N!~c-{^ZmqZ4hcPoq!PcR`Pu*0Pzi0c0rk2OaPuq* zzM7<7mGi3fckv+BL4?oSSiP>h4dQ{~n(UdX(dnR`O{y^|7PTnA;|a@&^5-{wtN=zt zxQLuX8|9js0FNQE$rH+ki=X7R*;fW7mgH0hJG9a3#E4FQI37LUx>9I#*5fPi$?}(E3;?SVE}E zmG>{SVZ$;pn{RG_G$@0l!yl9~+5HVFv)p&Mn2>EMM;WHVtyz@)txkj~JtSASkV80I z>yoY1zZXw3u#=j7qGe8s(meYzoVnnFT(318mLli=4KB}3lZQNol$AN;%q&aL);BKU z28TYqU@|H_m0-bU)k!_AYxGIkscg-w>uga`8VC&b^$8)OUhpyo9;5~tuvukhNC5Fu zBW`J=02UOiR)k{-9g!`FIUt7C0EIDKP~s|PFRQx8*f|wfR^9i(^vAxsHP;|wm|@Yt zmCPEE9!3CLuB#KwT|rm&(M-57H9HHt z@*BPy1G{%~&#CJqU@TLSBwpBfaj$Y97o(r3k9>KrU=5BIthpl}Zm0ZCxA;sj@YUJ@ z@Wd=i8j=!I9c<3Uv5fN^OsOMM%NG%K(mxjNwaqXVZL!yrkvnusC{<<5zP!;H*=ZA#c~FJQvP@&|%${izWMt$TKLAcdvAo zv4MYu;dVu%fp$E*av%1hd!R#@r+@`=>~N!|+L@?Wq6b2Xb`ajy7zJZTTF2%dJD&go zH{Z|HgDSFqi&R)m&ipC_bLfpBNxF60k1_Qx0D8hzD4?|@#z;7cpeb*BQU7%W@MFRm zgi6gBrn^PKprj(r4!Ojo4wa!+_}ifcrrqca((uLr7_bOuZPb+S5;JFL6pu#g%=r26 z9_+*1Jo3(fad-pqlW#f5;4;K_*UxZEg8YiosVD8@Vc>})c7@mMk8t8NRkVfqa}_5^ z%l6OMcJ))PzmW5LgGLbdbK&N&fV4&bNr54!gc3i$P-9`5zsKLDIv&{f7ZR(+H#R)k zpz#)Ua5sYN(`4Ybuomuh?cjb%nRfnB-X=L0*8$SF^0gW#ex?1!(FTp4geN0mVXMmG z)P_P!FKJe$1JooMPlEWCrG5sApqeSO0-_0SGaL_8oMG%~)9|hMrjG}k1GrL1W!)IS zY3~NI|DM8X)JTCIT4s&oG3#H@MTCK>xD4{8)+FS=dG>fGS<;CGy6Av_w)-YO;mk6b zYfRemT+tsa)rFGzNLgOScGK&>5jCi$i-uC>Zx`RZ>c+6?Q^*9;8(bL8+>?89le`eX z#oS{A%SVAUs;P4hLfA`Q0Pq{7(}Vq>YHdZv#X4u8`I#P82??U))uL)M)_=M0$O3t9 zl4^}n>K<04-Hq}#kZ-PGDlauUc`pUym(=xv^EKrvcvaITl~J??_FH86E4_p1+s|EQ?OtOw)c88Lx?&k6xtc2`no96*f)-#j9qk3}wRpjpVAdV`K?z zT$paqWh+j9!uq~Z{yXMNp%@R5u67&sFRm2m1fgp9(L-q(=bR@JOu}9?nm`2#W50t0 zP&o_BWvdYyfPsCSk5t1OX8dAA?UzgnJvfK3*w|hRrVM~AV;ZvsYN?Jy%AD^cP_@HA z$BtSIS!_07F=rv`_G{jKcWUZxB&)T*)C2=RoGUp|D*_ZMX+l#MGJ$9Po3d7J?!mtY ze1F@~Ue!98=p4rD(1~*v`*@?JKovF{{^sCWQ2OEu5U~RKW#ej`LXv~-$=NL=FsIFc z@HqdHpR1bu)}Nnr?I4o9KB2L^d2B_6(=qjA57AB`+@GP2WFgc~`{=jGUtq#>sVQ#NpuF-L$fpO_gM>o+aD$(5?eKy6^sJVCrc0{MQA`BzyqF1Ewx4aNyPF!Dfs%1T|0GZ*!vLDNufjj-yL{!B9 zKtv4ifQ+584a#~%P0wFGj{oSrU#5q}a7&E*2geQg{@1Yf9%o6DwcbQ0txqVHk z7C_&i)ya78?*qtx8+{o~7#D#bv2*)Z1hrOC$UVht=1+&}A-K(SjDrU$)I)>$c{~O9 zxb1#>W&+4EG2z@8)@b#hG9BC-)&Kzfn=S1IpB}!QdCTc<_m4TB+nXO}=zEV`LOyQJ z^8@h?pHI!*pKp(!Y6;M1_pyLiCBVlL;H~}hv-@+n`!%+?Wa;C2R_NmS`YoIIQ|R;G z+Gh>mbNBpRKq!0DLQ3#z_h1-sUo(|+BBf%xQ{!;IOPXEuE>cydKP7Shc?DoAW6?E)-x;A`ALax=;CH5s#N;rJ8gj~w8ugUXQ|2*FFeV5@mB`y-Fp;xhg zq(5!$|NK}K^4iTP`dkzGI0t-mpK@4CaKBsB1e~|#G8)oQzmpN)rN3NtzoZ(( z+e{?FhE#e;+BvII*#Q2;2~EP0nEgZ(Iy#n$w{@zy^u=oZB~=;tdd~5M zn|fz#Hk9BNrUb4C31@Ef$(Ur7jyo@AQ$N=v#}Hc!84(}nLB3;4z_}3GOedD=x-1pW zhtb828*7Q<-&P1W-UBkCO=hK6bau|AH0wdLe+tYDODRhbpa?A#o}fXDIzce1Z)_RP z==VR)!P}&4Bu9|7b5^ht7Xthpx;tC13RgZHYDJ03=__J0(BW+Vf>5o(6PWPYh~D0Z zp;%(=hnw?f#yCS40tzAR;fhdxiSQpblSS13Nx2{ z3n<3!6$kV^Fkp&zu_0n`gn0#B%BH+a&97stsh^dm>bq#97{q)#Z zr;QtsF@m48L-o=Q`H+`1eGnXm1J-4e#B{v6g@0CQhknOFMXT2IG(ClsS(*v{E(XJ! z)YBBaru7$2(b&dLbk0pvxz2xs2~ENMsZtlcHV>ed2~!QfHm^w#Lib0e{>Q@{9Ym+0 zk#981SgW$ZpsQF*!0$R&|3Xvft>PvZ_@4n!zeQO5PfOr9u@&T(i)DgZXxhqPe>Rqy z7!FC|wgj>3b0M^0TN+qUOxy0^l%5FJu<^8Sintna4H#gM+?7|eKT*mF3a{w=)QAfj zDgO;1JgO0LAkqslXhC^8V24kt!sSr-cAibU@x5+gl<@dw-n55n7DhJo`VD&)v6gmZ z5ysx;SPaI>>;qYYKfMQ`n(Yfa(QmvvUK6HhxV|;?PZ($ciQS}=ad@QsHjOt;T{s`K z>6P#1C&r7YM>G$Rsmnekc|K^Nu{i}Y+3~1=f#H`{KbCVpgaW*6G;gucWqf`Z_Dg1_ zaC)HvIs<=rX!$t$s~o@ve~J97yW39qv->aBjWRf$`nO9ceiNdn2L$=i^fUn1I)V%I z6CaXbV4rVp_eaMZ&)q-Qoz?!iDHjz})ahX)Y9%w+I*sOgy)A=bB>(au&c;}Rnp|Z7 zKKS|>{T`*=%~s*$06M9x>@3}RWCvU=Rr?zzq6B}FSBO>0x%@HpdT-;~6bKOYM6OA$ z!IzrPqVxyi+cr@FWgsINeORgHbw(8uKaANsani~W$pdWaa&C#%E0$FG&}!|Du!r0N z(~qN3D2MM3wYV-3ojq_6`-W#%5@&$mY7ZFFxF_BKZkEryKizy}iiqLQQ&>Me2$7a` zJ|1(Fw%@l)OLq%;l>&L=-cRjsWo#$=Ebe8Prwsvu*N(A|rKv*xcW+C?beomzNJDzv z_y_QUWMRXCi3qm|t^wA@ka1LGZ9#@dq2PP#W=iI9y)o^`X&=Ys8P7e^83K^;4YXE; z*u>YSZvK&8O1-S=;GgrhIo-BqJ3_Pm)mEVATI7ct$w=E8^MXYS(Gniy>5rN!sIec< zibyy{KZcs0cW+rg+-BT=9t6Q{S};iAe9J?;DvA)9C$QdS&T^9tDC zKD-jV;0!pL`z6YRBNV2J!AlCTpHh0SieTfsS0uhtuVX1#*2}Gf5$~VQ?Na#~UC%F% z`0`d*@Ndj$x95W(3e~Q1lyc!4r_F&9u-Md=s=m`lh6RN_sHp%bT2{ae$tDk1mK5DItpT!G_AD=9 za!Q^(N=gInbL2KGm~@~M<0_es*5ZaRhyejlR%vWVM4tZ2-IW`(MQ0;GFtXGYCOi~| zCOIdLILh;W1AW0pr^IZQ^?uCvkH!e=H3|$W4Lb2>5jAacNQzF2Qzzk>TtgZA9V=Z1 z6}Y1C`W?`ay)8G@>n3V@#?3-JO+yx3)Gd=X@mE{R11{s1rCnm8(R+G%uHMh(_ptQU zirFniN+d_hW|w!1D5+NnAjXfUddCwhfbty{x#T)@*TIx5vBTb5Tvf`NKZlgxl3atH z?0Cjz=(^^7A`slYdNyTrV%2f;Ohbzm!0NujN#!DSV;zES+cCRyu z;OcyjPt@q>Z3jkO8eO{qw>zipG$~hp2^iZ0ec!~OaDs08B;9K%ehw|$7Ny;dSze*r z#}1}|8JKj9_CJg85TT%|@o8i98^0o6J6HJgth6o1$o?6?WH zHYCz2BYSs`Zck6-2!h&3kW>C;Wbrqxy+Eyt2y8(5_lk+_CgZ!wCQ5qFH(RH>l*Tk( z-u^oXEOizcdEeZaFdM#fX2tdVU;v7D6sP59id+A{>J?7Kf@H`HH#e1slzu~Eq{5$m zlKQRs9^3C!)+rpSOm{0CwzB?wa5O|LZdZNbMELiXz4k{Uj!3S|n?}La$J^tfF-tS; z^eO-pjxTj5VmC->JU(S-35>jgTE6{L2VwO%(QdQ;qsf}2kWBM`*R8Qe!<4b@+(KV7 zTo-WO@EY>S)qgI|Hdqgo%B4$KM)K#^T(%Fd+RiZf60I zxus{*bq_r`eJd>R?dypdKedmnvCAfrIWu<;%Vr?|Ob)$z(a_CfYWv3fQ?9Lb*Uimw zU_-T7s0^3aKh&rn>)laKRg?a(f80Qw=H`1XeLIOnHNZ;zi8+Hr*uWK^VL+bk*1R9Z z+n4|1*X#e{7ovww)R9~mErC!!VEAoIn8wNR_6kkEBokHy*hkv!Xnv=c1}uK3s}dwV z&8?jy9BjrSLU|1+d-doC&(D(Fmx8+nmQALs8`^|4z1D|-KxrOoAVz~ z{cCLpohqts(m^`{9cA4M2)8&+fn~1u5c|lln#fTy{2QT8ccKnctk4MkVj9?z0Z`s? z)_D~V#8^Kim^NIfj==yJ{O4TP0&Dh%4hf~$T+I{vuMW#s2Gp$dkOI_1t6K`$YL`t? zyogivU5hkIvY^#JzZdONR58;;yTZCu{41PTu2>8Yv95EO~iyW9cZ=sShxuu9?!{$p81hWwKnO#am)LSfr_I zkoNz+jjL&;@Bw7zi|m$&6f7*q(rz-l*QL<0(ql30)XAy@8PfrcHHRKdOM=attz()o zjq|P#Ei_Nks*M%Pu;{}%S${pc|IwLJf_Qv(6hc-;*jue)du^#8t}v+Y33>E#a~bEF zewl81gG7Q4$#qo5)lYo?@TT}RBEqeJ(MNrTk`|I*^U?V2ZlXPF?=W*@4?OIYz!#Ni~72 zy~#T52eaJ)R6#h0iT;|6=d(T+G<8J!{pxD?J&jcgR)XI0#$$RdQaJj{H`;%3yFFL- zeCCg$OK|`)tSoEd$90b5+4g$~dM~hxkvH$GV_FQK<2u2@*n>+GW;3oo@A~ZVIc|NI_QW{94H($$?^U?Q+ky_|mEZ=@n|yIG6jM(|3LCXWB^oxA#dn zH?+r>t%vdt^Ue^f-sacCM$P3I9xh2wJTexLq&pzTzpxNRrgtPWSVd9AyW)%8#Kq4N zVYi>pws#LFjIuu{Bv2QB!9Ng1$i!F$*XtJM9@piAyD#Yji}_jtS5`+5ILO+fcD7oW zAK)jUkQ8W^Fc{ch($)@^QsR2w(fO)sRYb&yk3>{>d#$-_w5XQBHM|hAcvfR>%LbP5 z@E8DP%p{dpcY>b5_v<*g6wvs!Vz*+7R)6R0M>8UvvFe3{OQz#fru^Uo=B~|teS$k{N8L_ZPWwg9e8(l zm7Y@qs}Ek9DSFyue{s8ixb0MH7^ zP2D{x)>&Dy_B;J4Y(ZbUeV@Iee(A=BE|!|ve^Jv;=C;YZK-WLa%qy}K>JT?=#B%xs zLZd4rqijO%h=}WYB*!XtzyORd5UNiM9s-knXnwp_f|eaEgr=oLTI(ktkvcjsTs-%M zpQn3{tEYKUx#FFwQ8%*0slEaJy-$k@iV(v}R(tU7ybjBeS~xM5j>F9|#o7q5G&Je8 z&cxoa4m{=OudGN(`&_T1f@M~ge7^)LxKmPDe^C-ebwtwUO)hdO5BUtTow<+E-#r`~ zs{oT+)1jS<;_!IS$iSt5TaySfzy{&w7;i&z)90Md3Ho;1jq%>I0v_O874z>#rB4~% zreCH$8SVtpl8L8E5AE z@_T+}RONIzU9-I1ls+w)b%Y*Mt_@!ObHa(XtER100n4*+tUq`2oY$f6T(>3H!`sc5 zMAbVmOM`f4Bm6K-ue$*73T|;EZ)PWm79hPH9W9U1a*i$o(*){s$ctBxCiRyoeJA%D zy0#qn3kOE2OU!ER-|BDpGSo9EU1U7BW5>+Dzl#5qdB#CDsS!oy&WKAn89QPcDF9YLEMBfBrZgIVS1_tM z*d8;ev;qwKdBycu`Okml#xt#@f|4%tx=X2gz(G5E+5#KN>^1>=0HT&qR4e5@uLdo9W{GYHn>`^xJ3R5}&k^dV! zI~XN6*q*C@{^2n_Fy^*_(`sWg`UGcaGUHQJ4B(u%cIJ<)-ZLWD_fPXGqrjmzbkuKr z66wF8TUVAx$=)uP?o;K<_)&e)SH_^uwE}XuCIq7;QJ@NxW$JmP{zdw43{%ltc@z4> z^0~J=l(7fa25k?psV~(l$NtW|dtQL_0Y5~w1vCQFRS@wLk%H)hC%8|RvZ(6e-7VJu z^0x21FzJfHRz^l13{lYR_sl~55y3;GrX>qWL}_|M_$eTyKWOZ81DxOmhnw7%#9mPA zOx&UU7m*!>;x`-19f-Mpo~ces`bR2DQ7>iGxrTCJeIi@VjCrwh9GWnm#zoq(uqzY> zq>iZBd1NDMmLA@pkkYosw)&AmD#b$pP{b@cowe8P$zi!L8TndPRe!XZC0fUHrE7X& zG`O(qF)xws0{yt>thn>qfj2c+5}dJ6HP_ZB^3Bi)1lJ}6YN)xK4ZYST&aIw<0_&*e zZ(BkYFZKuZ0tDY2pU&Gu>Grpko@}%=HwSL>(C&`*Op2~U70>!oGF zwaN)~AUK47ii|Pt{!wgPImBSZm0_ZN4u`$RR|Dt5W+mc6lPK*npo&=vT21AfwSCgu z5ZP8P(*d6(k5YB~S{bF{qx-T-4fQYnJAcXqrg>VSq^^(^F;?-o7cLUo=>aJn?>35Gtyb(KSO7564UUn6yagj4 zhFjP(B0t56OP{!|Sq`XU%xhSFh^Z-YF)r|N&O&;b?rHD)l}{2kdzdqOQ$lx zcjDmM*AcvKq!I5U>R^A^>W55{lxfD?q$Uc}+~3kk>M zoE-&s33KBW!W7NoXuSCXA)=7r9odKAZDgAbdP=pcdM1PD%W2=49@+}+*XA^1DF?`Q94fA#&M zs9H=7Yi4!#*?skSFaSkxid7|ZYr_G>s26wUoV5(phP2nnr&Tr|reUpUlp%cd%RpLM zs!v;GKx%}Zm=ZOFFmA`X74m{;($31U)vDsOvT2M;XhDaDDL->c{`d$*Mr7B?1_wOr z2Rv{+G)Tg#BTjhHbC~H)Ki&=2KaKhp@mBNLF+}-NBVu6DIe?5jHx3l13>MrQP^@5c z4?#%U8JA;K=hL%P%g$ldjv(>_v4?}>>*(}tuG}(oZ|j-mgN!k$!E~-1sV3fm{t4ka zO`T~bos0tS=%QE7Hy(4~?h?Uzw00XI$j$=PlskJl1n=@r*QM4k0k@4bCSxk{NU8U= zK-=PFADCDn1<`}>`HyAMofq;LJA|pe&&aZ!R0SR$rDqEpR=lROiAZ8H84d#l z_y_30S6^H*Au(jjPcUun6pwx3T--u6w&=)p#NpP?jFTcC9YpN^e7=Pgei+{QT|>-p z8c2#vx53Pn(N7jL3Qiu^E#Tzg?(TuS9wMXB7Y~zW`z#L;y>rm-b@|AmPIafUtECp1 zK?%J0(4wyMbLHs$0rBGQkx1Rr@Zf^=5=4WwNR~E;_^r5-rhfJ70ab zMr1*#U4G_DOIf^jk>vJ&YCT1~;B>Nqx_P!{^zq;jCL$C5s5bp+S}j(`E6e@YRP=!3 zMEmsK?YA;Vf7o{k@JgsFQY&iuK+TCX?l0C&bvCqF?&cXvE?F&9vvko@kf?~T*xfyN zt3;#e^Ccc(LAFfKv|c{qM_U|{v>%_(r(CrR^la_Om#dJqi(wlRmxS}a0aUAy&hlxP zTB+3)^R2fXJgL5z*=fyL`hM=UDI0}v7sV>Cegxzc`--hEkt@ouXbYI_1#Id(_o@jcfAxdxqzdy* zLZDY4eMQ>L!p4>z6KutA!6lFXxB{O$VfxZ;wqVX>dlz759=gH|>PBn%U=`I(@jjE_ zE+5b>CpJTC;8oKyS))m3-PHST%H|Tl%hZbhL|%kh!EQYIPbG#Eo&BwHxY;_lCFc1- z!J+W_@qFk_|Jn=W+3O>GUC1nh&2&vvW@}<}(a%;n0ZiJQ$rt35=EB%ACPNKfcTrSe z`7W-s?5{UssqD^u1n=R-56`eYKm_gx$$qt}u{SmrCaU#8Zke=oqoplHFl|H5Yjt04 z(BAwTP|MhdI8G1;Q0E&_xB%k7wyH@I!QH3)L=)MlJJ4{e*$TE}VHPrF@YFJ=7JU6= z>*E;_q?^|^k@Pev!Mek*QXUKd7t^UnH6s;jYySfw{6@^XEc zgj{TsMoL3_;L0k_3|Ws(?59)NMyA9}+k5Jk(4@BqJKKLAw_m)fe~137LSk~!Z?g|a z1LqvuYFW0}^gNI=~*J5jv{ar9p@uhcQE-aK!JPkj#TnVzm59RYr)80t>>9Kr18i_T%A23%pfEzGCg zp~wXS!ZjRJ;hVrkm!M~x*Y`Uf>qf+-0nUANMt9+MENNd-_O|lB(R=SVX~YFk_O%>@ zwokbWH=-xT8x(2h`z(!%y4p&>=Gv?k>xrv0;j>JX( z@5p!DI7u*5fhGrg$f!Dq8%T-ZbOqFJ}^*$I=dKi|1pMzXLx(Ozq#9cd@ktbyFOZiKdyR| z6)8gO3Pl%q+%WHiRmOYyT7eMke@va8Cl_jv{?1+{nNAsn#Ou7(QBi|0hzD`?zG;~qmZnzhbsc@1kV$`3jl@arwW z5TE-<;~NYYb*_AORDyf&N{D7&H2#7)Q6vy~-?oBXY>O9r?a8^-8%*BOYLQ~fjEh5ei6hpPU@)nqvp+UFq$?^+~O-pl?!$D@Gea5{LA8T_KnOHh*efF)M0NZTe^W$;c7Xta#Pp%Z$(n5a(#4I_Z z@_Pq*4QdA$2D4663b(te?3q^ZOXNR4gzgHeTxkC+LkVpy+|2_)H-pVaCsxRuw0{zg zy?1z5Y5zov`jn>VL3Y?gy~xQ3^2?7I(<@?Yi;k@d*033j=Uvd%kT;e{FgN?b?<+?r4Cw?6l6R|kMl7@&L^f^0e~e?JNsQrH5iY3T{*cZfv%Ek*-MRXQ?+MUD_0>bXSC;jWCE-k#Q$U8IRr;-Ga+g!k zyfGw6#AAf0F*65fe!@y9Fqwb5d`6nu86x8Z4^FzTL@WaVf={5RAJ-PZnbn}h>DsUJ zS6w*ft>q)LY$<%uOE%YS9Iiw*h#ql(npAP)3G%zg3)xeX1*O0qp^?@>$7caC>{*+3J|Gib%*MkP+a5|bFeXb-i#T2e0&uyYwK=n_#JX6Zev!=K{Ra#z5l_y$D z{c7Ife3@ya_t^b`?e2@2N5XYTNRw^Olr?Gog%XEqp~7mgo9mDxZoXGm>eqee<GiOR+Q()NyO)J;;&?6DVfvE4D`#jqvfgmUNkmzd;TjtXgXEwH_lZHJy7eda1v$ z#|nBxQ`Wf1=sjtyN|cBiR#WTPOO_psJy_jrup%ke_~pv_>R|ZAVXmK2O8C)HFcgW)6ZWSpC*F$3PM(-KCoe$Q?b-J8<>yf6kN? z$_+($pao5gr&@gLHtxNLQ^p|u%&4)7NUA>dAk}H4?kj{dO8pq>hW=TZW(~wS!2h>> zuUxXnnmNgK^#*R=U;nukPuyu8Roa^<8RiK#34uee`f0)o8b#Yz zZbUSt4xXelBgELo@!VxaIAvy%8ahfJxphkcpXz)sVG&t#LvSU_z4O}6^Co%@$eN=x4*p)B{aEcC`+ z=(Tuw6Dt2ebi%E}4@8E3swSK>E_fjz0k*I&xh3LizsD9)Ku#@UQf_!3&6%?IB$}U4 zZPe^8Pg)aVTLsnOcMWF%(ihT^bz5OP@_jcZK$4WaY*d?P8EWLc)eH1^!D8pEh$^;L z#3w)M=(JpDXt0)2@j$FnSp$;|%ocSM1}7Q@C+N1)W}u(Q^u9d~dpiXY7Xd+t4}Yiy z;yTMayTh_QPwdy64;}S5>&)sSFlV!6^_p{CR_izA*w1N}HD9K4Q3sbuJ|rq!(r=IO zlCTF?uu$MVeC6PAZMFE>6BZ&G$;wpXBCHjte^~mB-N{(5K>dcFtt~xrjVRIj%3R9; zN86a-2z?#7)<>}!+?Bq!6@dqZdXCK8J6o7>J|K(x70!PPyc`%A_;tImeutK{T=mE9 zhw12sI`0;?yk@p3C)g%rBbJY+G1kOxwg2!k$L8B{4BnGn679P1bw50~!cIVOH~{~@ z^W+rtIbr5^$Qh%o@??{U_mVb>iI z+rl!~cnLX0JKN+JgOwf^)b3vQ&d#tudMABs^2}RZ$q5#qcsTGKdBneEB1;E1$$F)D zJ>#6O1u1uLSTCVbUr%ZM5o@w0;g|42vXcEN81O-iVDZqzcE0k0Pnd?hW{u9|oPJ8l z8GPB`eVa(M_GmcH1QRupYb{$8a2av~#ukZl*p7o8grm<=} zBOAC6KH4mLvmkHSxrvcl53*%L&m&0@bKH?S3Tg4d&eNfghd~$fT;Fk2uvDr7g9JP_ zL^d2>6QgCq{mZ2=vt<7>`W=F+$C7T#d((lx!Tb_z#YE<-X5#a^>M*wpyu^N?Mqj4} zGJkAL_pX83|J&K2yTXE7YNsm^Ojh}t+d80wT)U$80_|O?+cIZ+>hExhDR^IfEx6--Lh z?d(G58l5lxlWB2Gdn?``y=9YZL(Ra58)<9u_jYK5J#OE=;6?EUvl7CS%$YbE^ zIp&H_!~fuCaU9>8IKWS$VfY9_er|a54{S7qVx^!RjrO!C7@bo&-rLYUxqcDk4N4{W zQW>6wY4Yth+iCw7D_3PD`J7gNrN+#}>nG(vVcRX`<|X#A_91`{Dm z%09R=d4tj5?k87Y`9a_(9dJoQcK9O`z_P>(-}+STnT}$O(d_Nos{HhCH5jfvKFf{m z?=xmtL$>}h)SGxch5df;<2bde|3(RUul1io(9#NgXrpBQo}8Z1&->5ebfa3l#D;u{ zW_=dSB;R^4XpztL=21L1el~wel0kI|i{IvwFxUJ1{@Cu?lr1Njy*8z{@&9CF#@NY{^bB0jZ?wGB zSoL`FNa28NXDxJW5zi^gMbb3(BzS1kJ~v%a^~jR=vvB(O@K9cQm=S-zzjtiBI*`~H zU2^>GJ>-e{cP<1jT5Q1b3Q9_1_ExOz9WHs4mVq6THTjK}fe~c9+|h?Cn)B~$z}fQ$ zDk3Lea$2kY3+ttPuk+>E(T?Ng6Q}oZ1N}?XHH8};liLDt5xzubsMNum^TVytoeA`I zH{XA!14y=UegV-jrrky@TfLTDrQOTqKJ^PFp&u}b4$>p6uGHvwpEoNG)cr?g4EP<_ zIg2oyIDWH*-Z~F9-ERSTEnJzs*}30Q=X=1_Au{Xve&Ms*xgEVp_RBc)@t(4!%`tPI?%G zLo$FmmeH`_znU!WV@OK5COVuSh@*OD

    HFIck^%xwq9JaShph^E-k8&Xq@kuED?? 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 g)YJ@Owp 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%0A|r4_GVZ%=`KdqqpK>7dJe_&XWuB2=a!4n(Ji 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

    4jHO!gyr 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�AV)K`WxR{J%gUn!s}fadj`r z;HY<*J&R%-2({X9jVSmAwSe4uE~{l~_FwHe`wvC5>T|_XnD|7cBcFR2yCsuD|fRi`MuC0A*6*1Z2a3`Y zU2zinEL_0p;yF6z8{vJhsCQQ2!6+h}wB~?oGpYD@BO(H@1Tt27*O|KN8d7D782kn% zAT}lnR~so*dWL|7k}t+gx$&|xE9jr%CWJT~h#o~V+TtI{L`Zn)Xz9-&W!T1xM@W(= z;^HuEqH7FM`lxiP?#*>|bn%ROZgkzhWakl%R>iz*y#^UL1pnZVi+6yW!X@EHyB6TrD=Mnt!)ZDFM)fZ5qD9L5y} z9noW9Wwn?=BU)N?ASNwg0TcugBAp#BuUL9CezSnduI$V_jmM0aQ*YY3V#rjns2V-{x|e-So2@-Fsts38R@0>>XceY)J%Ix;gn@ahTZKBT9)`!@W*x%BD=dvMM^- zy98a+0t<2W_7KryhKD$l2UGvE(WZXIk)JjL_jQk@bE0fmk2gephaPnD>IXz#2(Z8Ni29CX2HXbzgAEsh?kgi=GL_JN`X>wrPm8^ zKuXN-C(0B<%7TJowpx3sjChB(7LIz-mp#*|lT{lEb{*d$noc&VFDuq1P+kRLHopy>@5CxZ;QNb{-GYI@>-G39NZ-if8yq)Lm#@Hfg zXw2_)vmB|QX7O8kWnPE9pey3sN45z>t#u)JTnZ7*Uus7wzyn2nR$5)Apkvv*PNsuL zs9sIJevIWl?O~6hnW{#6mJ!O>0kn9Pt)>|gu z1}n_x{Uyl5y)_*Y{6#*(^hS_XHW#pKqD|GeD%uAAy-mNNPH{S4v1o zl8|93nW|-?7yvuX>W=hKm*s?|Av5II`cjLe?qmo=#>|R9)uX zmNuk&=Lr7}nTo-%PtIssM|5?6rWZurKQ7<$%k%Mq}?lzp;=deoPl zN<&Wpv00N;`&i;Q*vFFeP8Q?6=Dk3(a4p&PH?n#a0i-~I zNJ9KXk&fPlXgw#GC61pVOqgKV(URnqHZ4K(j&D7y07sZ}%hQGQNu>RG!)iy;%_dug zmEx_^jKQ;<&QvPbhV#dBG+=2HoXFx7F@J2aD*NXy16nTdeBhfpm&p3kDC!-9O|+8E z#aH_4qlkq(pL|1r9aDx4z7bq->Jq2)N03ow;+8(EV8+nHW!GTarkS4Z#4JGo9}EMt&&{xmFf z%Jt5;0MKsps?!fPj3pv2XqLnvpVc&{uF9(joENfRd9eJ>`N`bPByx83qhKnLQ8t4s z3)RA#gWvoFhUL@mFNec}{`^s#Q(Acg+IZPq+N8Z#1Q6Y5A?`0Wxh?tkR*0FjOLZQO zmapf6Cwwheiu42a!>NkQn6AjiA-D~eZnk2Lw?eGX!-8ivYa#BEw52`Fl{PYMQkAWQ z2VTVV&5ObGKA-C#hw2l^gK~wg3KfT_dVBU}Y5P0XrV3#}GGrwS3?88-W6#@ZnCnI; zyrh5A0KxQyn_m4>dg8$9xo{39FvjtwN=M;jbBi-MsKBNZj<33P}yfn*5hK$xVVZhJ<|-l=_$B5 zZiq#NaiJ=C8u#HrWE^#ns5K=8B6rnpigd-dRp=a{0nT7%kdFGI%1#rF-^P;e(55Jm z9}g;7jVNN%pI}%miBWKMO1LK!Ux_|Y_#vQ34q^gB_`&>&v3}9atPpq|gudgfY(mZW z_LNW|B9#A=IAfLG>E{~C)f0O8`E701bZ4i=y)MTKSFKJHnm~wPXI>v69|m|->=1{+ zUXIpIRj6_uS>->!O4kI`wd`u976wSLhaLx5+?<@Ar{ljiSNBk?m5VCpeYB4S%LyRq zi6@KNHPh-NPBYL9WTi?MXUP~X^JJp%sCcdx%0Zf?jc&AVrq)o-fB%{92@q)LnOj^$ z%^cNg%ouT@4C;Z4_N7kLWTJP+9T`SD&bGewNTu2)$XVucDQhw&qkV>n?_H1)(s9Am!+dr zjix+G*%94O@WF}L19SRAn)qfy%=Kqp<2p`tvcVtD` za}v4mVqW1fQ&V5n%2cIY1oC>wmqN*4GXCVOX#)Aod=I>rMCmhH6nfEW^@-V@!p{iq zIoh|H^D*B0PF5^XEL%$*m*oV=D~NlnAkQ02v$J9u8Le)>Zb~_#)%=UaYY$XcDr|cc z`GXtl>T>M|z9~5^e5$l{J9v&%C?EBCB&_v~C6FQMT`hejI3rXPfZiC56_y^@6z$v; zHR;Lg-bSr2ISDf4`7GJrD7&iR-mh35>Q05@;3*gvoS0;Y^9&W`k5IB+KH7X4&M07l z>gY}@w_zFCqUmrP?8R^%C6q}pN2X%1XL!}fKQii@oiGXG!$5L(Q73~eCcXz7gdV*K zl_-CM#Ke{tln4-IW%XTomVM23{r5rIG(Nr}3Y%T}sV|0!kd0GQ@h$U^K)G7A%g+xS zI6t}QrB$}d9aOf)kc1=%BDa`fbRLWGvN)I>95W?@GmmHnIMt!l>f?)RCHdxoelqAb zB|!t3L_l#}Vo@|#l+`It1Qyk&!-Pujy0wwnsDVY`SU2!}`w!8b-)K|MR`W!mS*~(7 zrpmHW`s}Pv##!p_R^r^;6HtCqcG)|;DRiy+o@Jukh6djN%|GP+D->{0Pt824wqed7 zek7G^3emy$Wv8St@m0<8oJ~|;q{!wkv0jbrj!dr7Xp6G5vw?)T=A9;)?W#&=Hr|d+s`{b;aWnzrs^}OL zig3h*4x;~Exi40tf~+fb4pK)}o9tDD!p~C8-elDSS)wi~$j}!#(wA?>>C?Gj7`&sMJ{MCM^hp4IG$&qQygz# zQ6+H=BGa)hD+r}Wx>9DxxS3wuQc+Ml!?EfaQr=V#_tU;#%n$-#$f^dHgWZZ~FZU>i zM;r2WqPt;tJ)(WwI#+5_IBH@XMf*dU$b8cM`RsiJRyIO^ejInOXlN)?q-!dFlC!$* zCaH;!lUZ=9D0O=^eLSH?l`V%c#S#$a>k}^XnvBtb=rjp~W0qBlhb>kRLzyvA(K#zV ztQJrv6*o$^FyznOBe`|6jvV>S15Q||tb(@l31piC404V~lE1G{UfA;ovWWKnX06%4E#!jto%@=GFWDgyXn>#X(e@#J%PQLTVw zF`4z$p`)`LZsP1AMWwn`;8bz#)@=J)A$F$IkG9asasj@Hk;B8!$ox8Kqo!{-h>HH| z1muVi2#`Ad+)^Q_HlEvvc&*~`{>{Kxi22*@F_^e&Syr;qxli}cGtHwbkYj$n22+j= zl}i@sh3IB?#eqgps$Z)d`m>xa7h4fro=#N!l47p2VjhTaGoVYh^9ejy9Snj zXS;`1qu?GpNcL8fD+G%)*mRvR-Gen8i(q*BYyPdadnT|hXB>+z<)5GvQ&#+{JUN)( zREL3lvBk|cD3-w9`KHw}J88;eUoRwKs)g(|j|!bly;t!#4~Nd}Rq;M#@o=-@yrt%f zY0247-&r@623WlJv=a1cYA{~UPFb>eh^`w^>tD3n-!3I&{{DmY6zr0}!e{n!kjRo& zzh!yIiDUAp;~(W%gDd~Cv|O&ojg!S|g?#QI4R$UZHK>#SCy#~U1@B#)tu(dj%iYq; zU7Rbve&GZxK}vG6ae26nQU?FT%F`CgqB_-(FYkfsoMRx!xpmyuO7b1az27%4qcn1>QH`m76(bE+OAv7hUH_BkUBxirZQ%20IzbMLXTZ zA)o-)+B`&_Ue5{i)SUCv#Zo!tpCG@*Q1g@;c$Swe)p4thO|ga@o%)gJ3nIPz0==5` zClT^_!hGjZ%eV`RO8oEx3gHVWB&YOdPZTk|h;-VIHtw%9oVPUFbiW+j&NVc3774k9P@CgvT|!Mwk+JD z(Mxi$_F74I9nsccWp7?b9@<3Xx|Z((H=>hy_kP! zzSR~Bj7H*XP!5f>qr#UgGGr{yCaawczbt4J{q&*25K@O7_*Wsr8P-$To>Bh?cBz29 zq{DRuoih=L>x4_VU4>Omng{?B4BDi*EM(?S@7*6x=ykgW+xRLsY`urnB z;x%>>5K&o20+U3A>9LSHR<-1ocdrkUz+B|k-8;oN?YJ9S$8nRL?*=~X5B?`gCm_k_ zDHZ9!P~(td4Nnf0r!AN|K>_r3cLfMXr7M_J>0*l+1P*_=iq#pB*HIKxG?8%}%tIK5 zG-p#g;B{D`a-3u@mginNJoq*vzxB#%LW73Arzbu*goo=2mxb?OuJe}5~zHeB82)GZmA$i%xTtLo6N_Yzbiz%coPX+TrId=0;BT=`nv zo`!7JPQfu8tB1UY;aP>#DVtsh=RFGDf2;_usicP#{CJj^emi z-Txb_4+X_jh`9Z10MS3hlOgooR6u8&d#b0Km-L#67vnTXm#(*miUoGL?`QM#1%1Fn z&zv30xc|Vfkoo#uo}LKPXF`~G`fZvi4m|-y_VIEL@B>vmLZ$*;I6@R-!5u(QMJWlu zt0(2MB&wPj#|N&4gJE;zDdPS*6sszpZ^-Cl zYP^EL3%E-MV2dW4my9o4zf+S*qclNf+SUSVl#v8SjlB>yp%HQ!xWDZp>7eBaxlqMz zFixa!LhXVpuHNu=U^0RENkC*uR8-oiVY~Y2=SH#sk*BH;C7(zwQ;N8_m0ycF#xy_s z(rtIB-+5U35U|TM-pw4kugeDow0)Qu+JSo`m&pjyXCgPdAo@(beEUK7K0>3!#m=MU z;(qyG)%L7uHJfvWH{wL_FTq4QdLQK|Bc0Z9^ve<)Q zK>$!My<-;?p&N~%bv%8Vu zwJmbsXGp-H8)vM3kW9KRO$#eNx^k6;7bdR=@B);_@12#=zj| zQq<|{e8KJ&#dt(f3qN#Q&@}Bb_**MgCE%2gI(4n>WmVBLu_WfAW0?Z&-AA&U95HkR z2jOH5MeXkwvN7$~*YiUi}cS7`xJ05e1y~veZiPjf3GdAfw?4 z=)5q4eALoB*sHJoFNQ;7)nQ({A&8{GbQY6ZKzoN7E-uGm5Gmj)8|B~>T$oR4gc|ewXy$tIhZoy`^}Q7|Fi~27UyUxk1!CbzyXb>BL?vj z%xvjj?!GM$#Xz@aIfzn9SFg2`gh?A;T*8C#Yp>%&^U^E|P4^U|k=@Wsi?HbYH`$Y9 zqO_9lGh1H$SYGn0%-pQnKZsFMEu`-Z$@6GSk9&6d>MeCJS+fq0w!Z)tWpJV=3ijwU zDLmr+@^#AOe?)Cu^yQse==XIu-#t|eb@KJGM%KsOQQImlU5Tg`ISimx=9r(Zuv})< znp(mvV2ySQil2FU_9>r<@~j>bnsJx`VYm(^>}h+m{T^aQQ*)aCFMKH^<{uP3IfU#k zUTaK9DM5@3p4+J@phffhUkj;LV?lDLzE1aCmTu{H-jr*fn!KwV%Vo&cdI~%`MOx4? zm*{l;)Q3SVoY6XLHefi2Rqm_%Rj$ry+HCt)LUJ*@O<$H}NtL|!`|u?1-*2`g>NRf_ zSKRlV`XJYdS;xvIS1VQabySC#An1ED^5#rQQnVfro<9G(j5vOrqbXC_=3i?A?L!Ui zx6AD7LoPOdf}-}+EwqJ`?j${HcLf#&>s7t`w@H3MC57|RTkj6c^KxjxYnqTtoU5p2 z-=XwiWV?zX#o!M0S4i3eaclM@%8DEFAKGI}Oy}723~S6AN|e<-+-H_n_oqpp3RuDK zupkra%ekIM?%8E#FKxuR1y2yFMH|(pp)Z`3B3HondfodTisgH*xOeAjVfkV3e}0LB zbm|v9-KWvg<5G1^a0ziYt%c5aQSUg+S~mPrJSeo`AJ3rIZ3AOcuVD0Xby4G>4EZ)~ z$~Y4)9M6wUfo(`$!%RgS0Mhh^_cYOBty6D3*qXWnh{m2@8@da{T?DUzoBnuour+0R zkSSp-CTy)s{X=z}`t(kejXmdW7HK3)z+yJSVxB%_0N|;5m#f?T8fU$(JJ2M(-|HQx zKFz6mwlfVIsF(xf|DU`ivR+}jvp#Y}+fW_0nrR+H6tmCJsSln6!FYZqfvqsB_UvS7 zs2=Gr3S#j>EuGT5TBPF7e$2xi^TESih=X6Cs5lDTC#+hkK{G0Oa`SKYLzX4q@Rqmf zr>({{auh7NM6reXc|?wuLRRkzhNz5??8j-eX%u5Wj16eY4AonZ6*>y=2@XvddoKM% zfw@6l7MUWBWShyc*gU*B9Xfyps>r_CY!)B7V&0pr4cO7++U%e*8!4sMmK6|znB{Yi zvsdhysBrI9miA-G<1=Od%c%wRp%Ew3JnWz%o@7KB!nFIGsC zMeJ3Gtk;xDZxpN$D&m&E<5F?i_)(}rjU2bIm}tr0g6Mu}V3lU3)7ePuGTtY+LKP?u zL}xBxxmzpOnwW2^<;W+fzxz_ptyKoSJH(goNe*%4_!xNxYdZt0J`u)eiCr&XRlSfw z7FJ_cY$Ff_Slw|ugMD+#<`lQK7dKG zP|%(}+Y8SqGt)n#*P}z}XYa=p8SHP`?QuT;tB3c<>*ecYGupm~LH1j*Tt8<>sVq>3 z7)*i8ZaFdUR0QW0O(lIhre}6e3SG-M!u}ETLO60I>fu&KB4Rz=bJT|xv&rRtQ=g0$ zZkj%j@yr&Nyxx@Zu(D6hwdrCi6B8B*P%3R<*QA~@O01IR9O^}r12ePp57)*1* zR4(i?##^5$mW9}ezRxn^fy?iQTKa)^Ohg0~zj@j7;)f;wNZsrM_r`5dsTj>87ECa3 zx2gXabz^4uw_wc-f4L%F4FL$hwZ$|^-1@JRnRwgzn(ySrdtnecgRn#ImClV ztaZ`?K0Idnf$Ss`{HsgG>&U6)W(dP`lo5seVlqFm6%<{6<%ZbbBli{CU4sQN;VOBE;Q9A1oOYv%6` z4mmNJ`|CfPEPShSq}gMBv|*8Ma0NB8r8(2Xo4;b=5sJGycseb0EWz>}^8?o#)92k> z+03+e9{Ci1yl-wkMirJMhy)8K~hn*p$D- z`b>X*{45t@^y}V~@Qsa9(H=cYu3@9`m$}c$-?SIEA`NbKFe7lVn{SU#AZILjRI$HAgv zw)|CuQ#U-4@;HyqccJj%j>Y70f06C=r)GGrG@l2;AiT%!**vMQA^S_?$L8|3taS5x zSdN3F(|YJGW3!Qu=o?V3j~R9OXG6}W7;cdcW%Sd!K93|^fBvjB#)5eZ8L+M-j0rS8 zwS9Qm^+dT-Ih5*;0~)Zr4>bL$GK-(H)cWO5od0KBbE}P}%|~SEAq*3Cy_ERS6HYP1 zGic}DccenO%W(EM$JDZqv19Q1F$%}BPQjXoi=n3hknvdd?QsmbhbRMz$43`~9um+W z-6PHM$7V&Gt=BbIsCb`9EG7&|#yp6v41~>4nEi;8z1R%#GewN$F97C>YmaGzQvA{2 zU-yOVLwlA#WTBCI=#6%#^z(Npj^Og~EZKebTURw~;}u^=Jg1s!CS!X+^!*hF-iVqf z{07u@ak3bKK3;`)o#z)WR@pQY?g35oxodhj&Zid*|4Z*E|mHjYltFc9(NfTJo&Nsr=cbU@Utgi zM665|8DxAGayioj(D;sIzCBk>aQ18L@VWXX{rES|GiJWG2{sbFXy|2-mHeuKr^A1q z9%kpy=)(zrFtL2QQLK1}(qFEAf0yn{)lGmI7f+3|UksbX&Vfd>;5k#j{8fv`ag1m)&*UN7t*?A;33$h(W8l60u@HxizC-bd z`Wx8U`z%i>9^D*ZLt#PT_`>wUs|u%|;C-Rb<1P&U!ebYqUI^Xeak+jg@~7G4t@V8yAj>5ripE(D-n=jX~AX z%ZHY>I`}AV@!?NgIh*}%uYI1t+hza&J_i7ok+jLblcoR`>;5wa8q$iQ*YHI{63-OW zn@rzO(-UkND;eI-Uyc!J@laoKnFdwK!3P}pfH#W+^X}qKn!XN^wa{FQHRWk0<&y=R zbJ*|!KMAd6QJ9ZXPrmEFpD$@q0_<{?JD?-r!%pmF2#qWRG{BR;pRaer%xmG*f8#>R2h|dFXugG_(_k8c$}Q zPJKVGVeYtvCtMkUlyRbxNMY|Dz<)PBAdz|H2<7CezFTawXR9$9qXaU zl>NZ;wLIsuK3y(#k8~fr#z$jLe1D*{#VIf_+=eq*AKOyp^Wrj5P16JVP_g?V%YZR` z4B6W=;FHo3J)-Lg(wg|%sex>Mj*j;8Do6Z=rmc;XAqvt-ERIO!y+HuJqnsLX{)#~5 zxBH^>Cw!l%eo5txsuFmpG{5h_VG}4c3`(g3e^L1LM8{SCotXKX?EKIT&pnKNY6F3@ ze{95*ThZ^0+ML!t1QYYGqJj?86sbxrus;KCYJZj&Erq6R^fKr5ZZc>iE1{X#j2)Fv zxT#$MOvPnF2fCQ)Txv0t-7wU7jHDNs!z+#DZ?HCSR;tk1*Sdb~F*W^)u@8Q<08dq% zjsS6gqEe}Ue$I)}`Izr3h#?e$`v)Z={*g`PUlXxB-)~JB-#qj(Wuc11Z=g8NEtG(P z&OKN9;31g{1tY&EcF_WR$*+7ysn$h})*0c}Qqta5vH@!lBh1PfO=`gKoL&Iw)A+MC zoGNpjKBhBg+K-Re8#5RBglc|rGGuOIZBfZ5#&{m}A{7g(^uU@=@W0IOoY z$l##3KR@CLrQmdpred5tZ_;(l=2@}AXkm)4wSDiF^D=iDdV^bnD(35lww4wBfzLL9 zpq&}~b6)nC!UGu?JJI8+&|UCzml%wbh#8q;M=#qj`>!4adY`%_Znqu)$?td(7MDoW!Ym$InwhZYckZh zH)MRtyYZI&QS`L><9@|z?`O&koj8?L-eB}4#iumHT=9H__}AL>E|KORZ7qJ;W#&B1 zw9-nkl{Wh*tK?nj>C;rCC!h!}VL-VxF4u=XGLm|5jekx*RE?k3QvOQ4~W7o(u5;kHF+)4WRk^5lPwLCxqXEt z-oenmlkuBW%kN1inOWclU%D}0?J+aIl!W1;yvm z2bXvO)>lRoqH!P z2ZKr}?|`UyAc$KJvA4?2zu_&yX=!-MlU(3K6xq7O!hsBR#gPxHQfw>S7>3(ULERyQ zHY^69XY5v8%QSs{R{`Zi6br>~>KC77O4gGL__ZHGB2}TYg+2Q11xKhrrQT##f2a_V z7^AM1B*MY6RA7t!Ob2hNU4M10BqPQzhmB+J#OU#-*WU(V-L+crE`QZt&T`!vEmdH3 zRQsb!1rlEI??c^?#yIv-&2rJ`bKfZ3IWW@znreY$u&m#&4>Y8ix~mrdlr6igqx=H$ z^8>fQi*Q+3(FZ$P><-gPJJ5Z+WtP?Yi4|5vc9yV{MInZ3^T$p*Q(V;AiM*!6%>s`v zNz5gUP^NK|;|hYViW<-dx)~xq-MzmnIMPDDNKy-oy=uU9$}QQ~%BN3K8|U zQ{yYwQDhB&J+5fvv8fH=qBgNW(#=C$z%8xkZX7cj7D{D+q~y1$Wi;8J#2$mpvikhw z{^+l)GD3-}xRoL(!<7QVDGCOU-L`uhpo1i^cE_kfMq(R(_=ON1WR3AP6>PkgzFV5j z)&1I7kw(?*$on@h(&or_2u0wH1(GZIQ_rt>K#zNB|MmyU3}GT#qwdX(B%6FFK()cg z)W2l(Cl-H9dZ=x)h@okV>25u{AG!Scp|LCj%5lGPZm)S`KGVI9YMq?>RpNtmB32j9 z6>2cuw;vI7Smn8`4m(E}xzQRL;m5J|Tzm1rfd;%%_55SnUDcEBzT`H{(}o#FG?=>- zD{=^~HE?iJ;=m`YIdTX*pS1!3_?K4M0wTR+5fTzMSca?_5yO(~1?!eu-Efq~;n_>H zv=~9_W9_j+D=+XgX(CS43;Sb#NSff=_Et}-yoCu#%o=LRo-v{oWq!O|%`W)w`DN_a z^1OBt(O<6lD8VInHBg8dYhn>U6zj>yTkyi-;r8as=OEJ8wfgmsH>t)zl0oa)dZ%WvzIBYvVm;4x7Gl%J_m<03sNRGk-T}s|`RkQH%jI9Q z{mL(Jq48*gyC zWzTT`YvO+>ZFRPssKi=I_k38j*95yDqOE~i>{~#w4j=`+xB46&kKx7vqB3;SucE&y z@2+W2`hRLMl2CT?~0R=N6_Wae-h3D^&#B#I7kJNug!!+0BY zliy1T7m}3QH8HfX9^b5|LwkL1hWFO3-84HQ2O#RwwMqs7=ZmEc69q4BVozb19%>vt z&Sg2%O+O-<5OgBMYUlL>`RvPOJ;!IPWIQw1_1?a}2HMb1$rc+&{tibT;<{ZKCiC&7 zF7j)>_cDZqTQsFfRjP#yw0*F7aYfhUXw$hJ9!M!hwWwz`1cF5Bx>Rf__%#tNds;*{ ze`4A{Z8K!*{~*s=gNZAicde7;>jUlZG=QOAeJaa!U;aGb$_*di@N|&1_ZLq@=WE$O zTe3{#fi5#8fmaEdJAFd2dNGtqrQRP^)}A~(SYct)cx*gpHhx?!e&H7 z(_ie&To7Ah*6c3?n^hr&ai2*dWMVr4<&+jT{9rr1rkDq?J9ECHCo&h z9dSlcBV{uAoAUCSc;$b)W83KR5~qb!*hK&kz|>?)znRf9go4@~Yi`_4-tDoUNJ0spq4 z6aA9#cOnB1tl(?3y;~fkwZnzhlT%&vw~eM?48`}cA5X^*2b%eXUPU^vg+(p;gl)v|V!}ql;4!t=j+dHk*a~Kj!0iU$Dd6Y0Y#) z*^T{u!D}_WJ@|=qs!!@oO85~m3_$TAc9pM_6ao(5T{Ab%^uX%wONAXd%bg=(7v5GH zgEPwBg44c}o|1-({o=S$kSd+AkD6nBke6lmH0b;6blXLOE~Y?jSm^zRJ;+{_0G1(9 zqcAk}>#zC+ocEpPB65DQCyNu&AO%Yo^i$N(i#a!R?MX9)L1aBMll3nFbHXr*(doHuW44BMj~m$HmfTeB8MtSsHg#>Q#nr$L3BgfrVqtfR;nc-Brc^1yxS zPMHR0K1zRVpH8NTkU!D;K(r~t2S+}#(jt|&z^iXp&#;6c(aXd!O5DSs{{1|ZY8uIl zu)GMC9^d`lCFf5WAEW^e0juj_>h-mLIym-Gu$iW*fCQ9`(-LJMz;P6*-<_)cANFx# zH8*P*JDX-i%j*tHapcL!(o9BQYMxh}w_3!qT$BS&ef$w|8gYoPPMq*N0XDS*AsZiw zhlLKR$$Xh~zlZO6uw;3FhzV^zr!p%{_|bjan@zPXFAO#V%4OaR`AB>mnb(D5Az_u7 z!zZ9hf^vqP-qE%d|It=vCPMsc>6>{}DTjfPw}(pLlV}GVXLQ4kE_H-ztAx>}lhVK2skiDEJL{W5rVJV!CkNsq3%#PFMDJ zYYu>8XbmbQdj~T*p(;1U=RbK!sEt~Rji;@7l9{F~CoRARO$Qu9Rhg80X-on|#lZ24 zY~Yr8ddAi~^ev6FD6NClwvO2><0pl=lWD&947Q`Ck{td6EAY}v70mJ0^``fF;#g_7 z;lT#}p*-!AWt))T&~cWZU1!dIQ8SJ>F{YefyH>o?jhATZX`Jn>7uH~dJlzH$L&|2{`x5Q0% zwpd~aMXN(c3GXpCKc2pxk_K+Lq092AY+TC9lW<`?8Rz$_EpN=MfE`7^**0{*%5fyl zhxdiRT#)KLKj6PBtWmZ7BwWMc4BSZUI3_($s!t!d_#8xaI8Z( z9m;c;oGC zd5(2Gen`~w`C~e1x@3UbUCc18taJQiyW>~I)Li6f7@q0&Sxw%9RBDfHD|Oz}2aSd; zA>_G8{JAkcb!hs=ZAQl_&*?g#De#G`Nv)Sg@)76>`SiWr6^r9QV?{LObRMIDo7Kh> zO>vV+LFehjqkz2HL1=WOPb!X^JSIimYK)TA%gL+&71Y&$#S0=&Mxl1tag(mO9-=nA zQ{u+ll8~aZAEB2F)nQ)G{2%J`0fl_9)r+STlXA2)hLwby zWNE{t(<>Vl04I4YrKH8I?(#>@^jA-KE;~2MKX=vp%q|E{-kh>UZsT7F;$)LvB{_P5 z8oj-&wkqcLXfw7vYd?T5 z3M5L>Y#$qSGA40HVAr25JmJ9}z8>*5LtpS4wmKt~rXxTN{c@4|n+wR+OHtgdJ0s}Z z9gnC?yXCO!&C1B*0W8tHKrKi$+h;{YxQEH~$oYIz z_&!g+MXah{npwiLbiDJ&JYG=|Wqhcusk@1=KE^zW@?nTsI#$!QLPT$0f&V7dO`+66 zJi0o6Ef)tEz-0U+fIGVf?3j_x`#vWoRPB1ntA~#_(ja!1fL!kI>1gxx2LgW_$Dre; zmE0Vvy~}u&mxW``>S)*4a8}%glR+1?DHB0DS1f88b0@a&oB%<2=)MehG8kF`YyG#r zCQhpZ{m512&0AHCP8iLL<)PTgCa+2Bk(5nJ1`xV9R_$i~RKh6O6JH{tq~u{OGk}0$ zqZXp&d^fl3(h>?J5RkWI_{Y<)!d!Zbv4r61_4M4z2oE>W>zXEOvrink|8@l{FV9el8q{YyZOPR5`0xrg70U)^|8Hx}tXZz~yrQ}1Z6dN zwGAFxlzbGiRJ6FgK&tU4B7ErW*;~cCt{GKF%0;pLKU-`2NqlqLDs2x%e=Z`lva|NA zyu3=<8Kt2s95LbM8*aze@aw)vxK)73HFG>T*86DG3+_nczv?PGOqfKBYeoh#3Z1oXJgWxzOU}*Kqbb-G*l8e zk2zzIgAuo6!IbD;-8TyPs^PGDZvRD1NR!L7qrW}(UrBkgyk2#TxtcUO*~;8_S(Ucg z&@EoxjO6K*z7;p0nx`z(M)4`dpG1GEVg>_$wn|z(F4c{^%!c^VS#Azc#sxfDY15de zn58)rfhlkO6%T1$1K}`FkZk@{0vsh&HEHaa0R{eZl5ytcW5|K=Ak>a%;|&&N$XN&q1Nn zRDLbrQL_DpD8CJXsm918S|@&5HvDI4yEQL=V;XL49c%07LyATs$a4ey=$_8D0d{ua z@3uGw(fwFqc)U|#bxR4x7JU=8;zbrSXph|_Z;2qTw9zv8-l=d>WTJ-KIoD)ytlVc8 zR&B=a=LhN3TPrn;p9{Iw3wfH1D!65OO7nhuA<3gl?rJ+xYxr(CDP{}4v<_wce+`S(mQ%EeVj#uUbBm~26x6MVE;Y05jz z&1TLIWUN*c!xRq5hzL1X`5Ct&Xl-ettjY;^>&2~Bh{Pn$lE?RV(?5?z;>~Y2k7ju< zOe8>tRrMnqM?7{`Vu06;#Xs;e8j)4>+Flotlv*Cv4*K0^er# z+-qQVG5_xd0gRzUvD}7u<}fNQZFG2-y7Qf^^Ext$pwj15#ekf*xuTv!`H|zMmo(}M zV&-P^1-N+}&Wp+hXFVkZfZkM#wb|F(oqF#oi(@{jct!j736^ z+)25*a}7bx-_>5+Oriu7Hk#)#l7qjdnyK*FZ{Dm6P(oz&vF-(MHt=c1ygC|6Qf zxkDn;YQAU9stMa#6UgYb5b-t!Sec#d&9-?{tb4WFQQe9;uSmTS1pPENQ<~aflv*Wg zp|ch(6ni)M>Bo24D1{f=%mUO3WyOu~jxtgAS+^(PO7KzJ_p9bMv60mv6JT`;ZzgeD zb)ZWr9O=KOuJ<5VCHuc&lN4#zjHf0}7u8$3W#?ft+w$B%3X1bTbw>(i7tJ~H=QaK% zlPl)`L22_?Bhzb6Y_kp7edo1xFg5k`R9eh(KO%4&kJcuL-NY z|6yruc>StW*hZaMQC3uo4rJrRw&iW#K9z1x4LDjQa`?Wz`jOs#yt1fgaH?Z=dgxf2 zBy@hLJM7-zqyORiy|Lir?Hl*5LdCeTsy*xmm0F6hyN+SfqCl|<=YMPId5 znH?|{WcQ&e-1L!YMKk8cUtM4~LG56~O&8yU#h?l&PY)cEP7Q7A^^JwF(NbSlI;i{Ng>uY2X9io*TEDH4#VdX1% z^mWX_Kfp7bqcNl?55?p7))mNc?B#Pkevd|*9hYt-qG}8ikeDrvPy4jR+1*CT>KLEY-0el?#mB^~69P$#GfJ_j=%EWh#FLOpA zLla}2_7OIN*+^dFSI>zo4}_Ag__Y)G%g!!M0&Px=;!jHTR)cz1gDqeCi+2$~<&yZS zg6&rf)IZ&43POereL`tWXeLKnmwzQdEEUP-_$Rlt_?)af+N_}ay;nEt+_P5Mk?6ii zfaAPT^!Dy#xp%@wMw}I++g$e;NVf7DV{V(7AGG!)Og1Kg+|NMV6YAF2MK{uwcHDGz z@<8G9wcM|MEaGTMIZS?tf2T8bb%YxXy4~_P9jU)>UJ*+U{-aGmSBQ83a2clv`XpfRwCi{KCx24(?ZHqQxYAxX72&Ze zCVua713$$M_ERpDm6zu{)um)(xP9b;4115S5d)b!-xBP?9=_74It3vUBnDWdl)P0Stqo2eIrs zL7x!yZpSoSLU0rn>`YOeQjv&lGYOMA{F<=sNrIa3SCka-GHY)Qy(G1qcJ7};WG~w* zO&R8#f5Hm0UJi3b$+cc04pq|QTNxk7Pwu?k##`)oGi}jq(hyVQKU+u7kcsaA;6CQDz<)%JylAF5OCAiAw~1K-Q<%D-|{MKIBzE<%(JV5*K!6Z3zPVTSz} zM{8`nlDdeb6(~QkD^5w=v_Ht56ECo)8}J56 zC|9_QTEaTA9+LN-Ph-TIGzMYK%X+tc80En}kJoypnW@IUc9z&3y}uLa-<-)Q1g|9V z*-&wjE*7$O+;It>{nV#L9N!FS=4&wCoqg34I%}>mSlvVNg+}aUO2q*kLOwzXiYIfm z==q=D{&FGi1!%tW@nHb{XmUt%Dq0%RMW8Po(!B_8MZ8ZCHRP{C;Ft-_-N7wbn!#l} z5@w|MCx}vLUc7RWg}<mw&T4~7#ue0Kqc4|6qt6`(=Kw_MQQ)4}V$ z$B33Z!h0TSIvdF(Nvi^sJsUnjeswbM7KNi+Ul)8dXOhHs@c#{%C`XfZSbbcc#lg;T z7e9Kr-6hy4O4q#B=f8)35K18w4elXNE;LW5U@=N5_!Y{|193xOk!8`KqI!>@<1mRa z&GhrD0IVJy_x9atDCKvav~(g#6ta)vx{|MA$r0CH(&DvEVZqGB;73+(Xt5P7>rcQG z(rd4<;vZIQP65V1^ntwCM2?;y@I{o#uFPQbm7&P;U)isyH~MJjXq1{qbfoPKCyYBN zvbnKKt0bI5eo%Q{T0MEH1&FsqdSfRNlqYxzp`-10%p%+N8+|7*hkVJw3lgX+Cx+YI zD!A~)b zUwV3&nz<49brI`KuB)qG1yge9zt%;JL$(pz5~$_K?h1wKmxbjDyS4h~q)Hr}riFjo z_=?(F9nQ!D+-SakFAUa?=6G7=_Gc$3EcBK2pX#_7)yF*&c%^Z#hloTK!s9iidn|^; ztt%Pw`dk0+m1i<54V}1EZPO%F?r#X@!ToZPW|HBDY>nB2lWf+QJxIH#S72NM3@^0z zJ)st;1TARlvH6-$j)NX|d#Q?YoSSw9L8pXC!U1AAWmJg zY)6kLFj#|o0T?HG%bf{UPAa7YAVCW{+Cq@7oy>`i!s)4XzR#`qT@kV^3fYACBM@@0 zj)}KsJ)mLdY%3Vf61b^p5u;eGyWf9LU5Z0W>76%SZS!Tww7j)51R6jv{)ivXf{=>9C{)n$Mxp&>D+q=J&RyFEoOTE6{r6uFJ0SlejY(7V`cc86eG-)p zo?qCGeLlY9N-i@rBYU#Wi=M`6U+U8AkAWGf&*1DkzZU3*yBfr0T=)wL$;(>7_2+j%P zK#045Q=NDPpWy)!&WB{st~`=d5|s_OHc2UF^Ftmu6}d^$?}WC3B72m0Uqb>rhpwr$ zgU1~hPi28sZ@g`IxSYV_ZE}!$;hI}o#NE)AkfABsxV{_}rd{-k!4s!LqK09CpyfaY zyxT0OtyTVNJp_H;Y0n32k8?53?Kd|Ccn<#^eyKE)utaTi^!mml-l~G51&@Z}wi~j$ zUC9t7i#gA`m_>X2V&p3b=!`jehoRLQjQ8zKcUl?5CC9)+$0&EkF@?{u^ym*sCSpsRiUMzBgsi9H?k z#d~IqxlKvL&yu>BLk4?O@XTO1f5cq z6zB=I%MVMsG*pf6{1x|Qg@~CZ{Q@KyMI)bH#BXWO`YBm6&yJXuZVOGeQ04F?YVkj4Gu`M`J4)g2K^Cfon=2m$X1N;7hSR z!rM)-6#@?G5FHVfD>X5KSDxE>Nt-c$N3~o%hyQ0 zHz#wJ_PF^d2YyP3Zgm~h9nV8zPNG%Zg^62{_p0lOML+QmAcQr5a!LLMrqwo0VBP14 zPZkTPO!gerGDH==uNwR-$Ptz~Qti=)@ldarFdZBdHc>oMUeF%-88d64Ph=h%xg$V= z0uRe+`2`xjc#6FM^i|?5nK6z&>CJ<`j`xTMzfnKY0(F&0vniuDFDy*MH7f)n zDz&bDa!@Xh76qH`(IF5YzebBAXV&_#Y@9Sl-y$f1yq%<90sjKper3@7DSN87Z|o0y z-tCW+-;LY|_i;#aAJT*982w60g+Nz`PrH_)!qR+q@R9n(!40<2-9SYvk{j^CGGndliGXm? zll>1q+0Uec>M^`uay@uX_}MtFHPn9*F7Fk7p{)p~b)RabHlI8{?kC+|HUSBBr`93C z`y^Llc>O2OPx})GEKDlBvd4+JZ(|ny&GoR zKKj>-j{_-c@GOkZkXlISmxal?LZ>|V@#(q4p3ITT^T}I?0}lgxlNilv?UZjMPK^-a zoEDgefO7Qt)$;B(YS|2{$;@jbL;&_$Dcu)$5k5P;2AxC8m)|19Q!n0gWYcJQ&J+eFwpXQ8L+AoP7Pp&&2! z9nDN*Pw2={`d&u@T~h)UnNt=AZ4>EW_VjBH-z;KFr5FwU{>~}#-}b@Lu$y8%)8`NI z((=(fF9Ro##7dr#XNjX6SXt!%_GIF7X?&EV;|6Zs*}qA(?qWODqRxgKU3~HfWe$ohuiMR)UW93}FQ4qlrwHG*iQ~ zOH|jiPVM*Vj~E96XF^G*bPZhMBTxFxg;#=lI?U}Ky~P=)o+K;a@A>Z7uzw-&F)R6KVJGs zG4wWdjpuigZLA@yWTXC=dmdoy)9_0Tf36ovGVeyIA_q40W*E)}OwizFU2G@;?UkiJJuV0r zD|Xz^A4G|#$aEF9S$UmBn{mc*xL!`phAZj^5ad^xwDe&m^l?#*?y|rKXZB`Y+xEp3 zeZS2Z?m*g`u@+Q(YDKh@aP5YN1ry=rX2}kDw+4T7PpX#H+Q`H*0nv&|^2ov;>O7{O zpwb9W%neu0xaSjacjqOXaeEc&yBt3hc|0VRA%4E)#*!L-ZSTC}HyF%2s3!O}_8ay3 zhPYegqh1iOJ-1T%I<`DD{BbG-E;)KfSzGUHKaexI<{KCn@S#7W$`#P4yvcO>m;HL* z#czAhRQz!C!;57KcptfpDrzb3yiZ!^2CGkPV?26EZ^A!x=L10aXE~ye8oE`@N*V}% zEYN!GlMvnXuI)^VmLsmuz`1O_(RRc9{Lh1FF+GXsvNNm$!52nEEWtZQ|Q$IPUW za^V5+^?08JAm18wElrVnOmet~Sneb7U--Kt7x3=YK~pPn{=jJEinA9(Q^RV2y73M5 zHc9)2*6l;e=9sislJ3-Po9zeKsF)2|=kCRlFr6*i#Yy}zk*?KRuj7UV+5Pg0n6%i3 zTK;B=FxeznIh_AN;ovf6Nu&^}XjAeFBFxT8+5!mvj5Pb9^VDZbXZ4FHd2C->x42|I zs_)BNaa%{VFpsPL0Cs54UIb!h(;8TdyKeRdv~Qn4ox;0 z_j;5etpNgSoJzmZQD8Fsp<=c}>ulwZz8MQw@7?Za*AM@YK<>2C-<}yd*Oa}F;R0GG za)G`6_?;`krUx>@LF%R|xMqO%7 z-|P1&#*1Zk+C;3rVW*_Lqhx*f{vU50j$8NgT+U6F?UZP?40jpw(U67!|7hz683o+N zRauOxguWxFOKs~!`z-XVNAvK4!oiVu1_C?_@pvz7Kp#FmqcvT<4fof|>|VM7@zidTvf1kH7A5dJ*q1B~XW-gSmt-eXrz7kvr*HmFY%$wdVBk^tn^&~9A{AeF zBv{d0>DOCESFBK%3|zL1qTz0>E%w7uipss@&a*5s1v{PvCSDFp=0j@=*7vCIU{Z@? z7V6iMm3&4`zpA6Xac%D?JgR2gsE%T1d=Hw!pVARZDJVJC*bUL zW#!&NoC;?qxTtR~?F0GIXp{8=q-JlEiyf8$LU}flK$K*;?d0>0=eda>ea7EjI4OCD z`L&v3&^X#r_mav_@R@H!lC~DMFRkvTDC9yvt@Fun(vb}4>s-dUd7;^&+N%LGz~l8N z-HdsF6e|f|(Am6~5sZ&nH@q?%>0b=z{WOEGGqx+evw<}4D`Hk4=R8modF_Yg<2~Aw z)fYAlcDFK{)t)Ddh*(|VySMRyo=qM z#x&C=uCufWnV1`GEZr!q#6IMYMklo+Ja98k8mSlAw)@Z@BCY49z-)CqC@aBP5HSBj z34mlt{hFkcG+WtgfuNtjGy6Vdkt)asaLiq284yJPYc0-Ai(#u?qom|yD~ z<~%+T^a@G9=i~qUT_GJuv<(OV!~s)jPKzV>F0jK--EE6`k|J_5@wD(~)#rum^dEYW ziuMUBly4uu3Z_CWB}7J+=?wTR54Xn3&w9`CbVe)%p|C^~s!B8E*x;AZ!*7FiEH08l z)@=og65UKEt!j=?3yP-9+J&i)qh@Ni@n%}v%)2pt{$_?alu~z_{RuGuI0YJ2ti ze3BVO@NJy`-65{pTFhQ!<3t^QuU@R?SnB&F7T7s@$fs{(u4;BtOY{}zBwb5s!TTwy zC$~wI2FL9Rq;2mo(uPe~#=5E_aV?`q5ZE+YplBo_iFuj%Vc;bkX46bgm{@pqa))*v zDa9s6!g7XkDsn9#(aaC%KE6&{yN!O?30DD@MJA-J5lv##uWiXvw6I(pWZi(#)~zZErNuHniqHabQ6LhVY$HxS=zI6Ct{I1-Ka11Vs0x=H9*}?E1hn;*r^ zDG`pO2vy=OKxX_RE+0@!nfG45*6|@WYygVLTQ~c3l8G(ii|+cE^6l*t>cV_ZM6 zZ^Uh_W?%>2irEV0O6T{h=5;2JYwxLNVi#_YHn4Z^A^%Z!eH0b;+m?<)KWwCC75m7^ z`tg78{LIuHANnH^2W=dbq$=%Nv-W?)*`t5#N{ESO_So<>d7VLy;R;)q4pl!uFdF)^3wtVSbW zNbbEyewf19INl3`E3HB}zB=J6ne17gdtGQL+CI9s2{99Dk`Picei~JewkvGl23UO_ zFC^3?${Hq}>flU>q*Dfg*w}veUCqf(ciE4pd08mni@^%TfB~s@O42B44zR0H{gF9( znAU$LFaLLKY~zsy=ChtxaXqr9HJ3{3BZKls25Js=zmwz%F-FrblwYZ5gQ#@Geu5+O zMt8{Tnshjo8_svFsqf;@Hjv)QzzzfLObr- zsqtY%F*GNzTaWb$xX6+PMHt{^#&Q7tBo~RVbFTBd(vOd1YgEELk6x zNlHj6#0-3w&qb+U`G?S-kJ`EVe`@({&7!Bk90n8)16nW)#={&Xi9GeSWj;cy;0K` z6F(j*aPc>rRLB#PldcS2TV9(NA0jW4AB=D&YO3`pN~5gB=l_pvpVmy(tpAb6JlFxW z`0Ag{i#H!C8*gfS#(*brc8X#H3;}Q75%&6eJ-ZXvLq%tzAbIDI1Z7jr!}16yk!2kk z3C!c@;MIF^W{{nWw-0PqXJKtab!agytgfN&uR+aBbj+X*-cPc&R!b>|Qpf*ao_^)Y zaLYR8MgPP)$j|cflzsj`X_$VB*{z*75it;d(UK~oGL`-+a^rA$ip_ry;b2fIMm7kS z4PF*izBcX3xZt5E9>;2RFqdOWQs%WfxOikmzDOetB-jG#34R)`zvRZ0Az0+%oyvfn4CeoFA|? z`rZ1_gN}=FKP|_$Kr*4xOEZC#z3w}_z%P2}k9=8YQ#1#AJrd8^V`hA*>30Qcc}yYG zulFtr$UHihjMK%*s3##zE!1=-3r@~gI}2Lc8|&E=-7go6W+Y6jkFg6jSiR$SRM(M> zo5e<}{nhui0R==D;EFn3DOPVrxdJ3qUSb{WC_{DqY)jX66OOl*@R|^6BDR-_NdT%p zwkEML@aK&#*0yKDDw|q_mg(#=(K+|4F3l~`3^(%AowRLDF~ejl}&6gn?~qxXSM;Eid8wFW5LgA7;7a zZAO4W`6RN^#77_J$>Ii4VY}x)DfT|7lvV;(KH0&7&c@)j)JM3d?>2t!<3q8ZMUBLvC*XEI;jh1JFLdkDM)%ARf zbzdg1pH0~tek%2*a%(z;013u#s*HTDS7Dj-oL8N4Dv&`sAV<@WB*?pbJLHC!>tmIQ zcI@W6RM+=So_O}DF?;%}D>4ad&3_iZOb*27(lc#R*Cu>`y&Ml#Tp+vZyuy(j)@FHM zg1&mePvVTv;YbQ1)qB*QjNg&s>??ta)|1{1MR}R&=@4sgNXCL006CY-!MZ;bs2%Ia2-6@h(Z;$!jb%{-bcErus+&6S>!Ae=n5FaC&O|?DPar`{&p30 zuWUIB5$vi9P=n9`ABhD`o6o5~AB4(cdh$qOMyfMsl4@59h@Z3sm84qekUK_#npSb3h5@TcVs z4Nrn7n*{Zpsb%8bHR3kS)R5s5n2bL{uBORk%I)R%3~t$$=17MR4Q4mrV4~d^$x{(y z{@cvO<3RI+m#V!;jQLcevoqORU#kyql2|NDfEo`6)~G@SD_agGK=3Y&G$4kw3)1B* zs@!QgMcCAQ4)0hBDy0ZAx_TA36b{GxEX6L%_bfC+?^LVq;n$o(c zKeEe2gd!RL-b@9A7}io)WrgokN^5(gHYO1cXkese$JoH61aqtFA+8QW_0LQ1BqS8* zS9#3UB#ww)U-odU&XMJ1ah(+!C8tfM<~JYz6`(5BC&?z(aPxV&=U=$nv|i#<^PH#>Okq5s>N)?kewCjhLSpE zd$#6p_97v=RjGiP9q4F|bVcXK<4yv}O`VeFp`TDM8BxP0Xt6}kDXBp93fgch;&%oSMJR!TTw(M3syVgbGSPDKNN1*qrWu4^X zj$qWV-LquI1pCO@c={pe(WS1}aQKRQPrYUT0BuA=5np2Tq1%p3266-c*I)zx;owz4 z-I{vxx@qgPpy@zAt$VADDQp%8kMDBz;cMIX!)_xQ*<@du5xKWlSq-Gwa|QsFeZ8Tj z@5QEFyyb7^>ej(V6Sitlf5{n&PxlO5j5XyvhfSFIkv?Tgi_|#%a12DeR1JDEsgvA2 z2#YFffWIOVE?qARCW!z&oCYj;35b#TYv{K1nuE{Cm15ZwLlc-3#tFYt!sl7-??9Mh zJ^8gB%z{<*5MPz?gL5}Kpb{GLXm=054~^Pkz^<|BWt58*d;oa4WuET&I%)dn;;CAYelhRd7#Pett6u;bRD~?Y(_|#S25HIS&in=+; zyO|3bim*ZVjUVvY&0p1KSyAn6kT4#B>i24vLnVhy;Rs2hu&1=zUS>wX6d?YcI>nQ_%|9Tbe9cL?B|fM0vRjc# zJ%VZWl;DvM)P~t~kLGh*GZgrmhXL_U0tE6=NV~FawCRZjH{A5tT+Nv6P}uxhMLlM? zgE04n=3k;@c+hJyKlRh*V=EprHyF6xWh>lmwnv^k{)pvy)Lp+Y2VD`{o|kjO#i9V$ zf=Eq_dvpcs=0ZJ=;>9kg;oHdP$Oc@rCM>QdE}QqZCIQNM1Q@&E82pvWkJ>&l!%J>| zhAuJG-VIq&A741IvS-#XY5G}5?>~<%ZI8Lrk>EM#CZ}5ZGZ3zunEI*GNZ^q*!epVr z9HkGCyU|oty)jy_pZ}9bjzErv{2HLFE6`1wwS501pG8e|_*Nc1y9E6T?raCxU|7m& zWNHpYY!^3VSx<_{u92j0M#U1^eNh( z%|aJ7Rvf`Cv=KY00r!yP$)dU`D$=D~RqIu+=PO1!q#@gw9!8kgz9-Wse$>QxU@(Yk zXxPA@*q?Wi$OHl%K0=?4-oP`W*_kB$u*8@E)? z+NJhkjnDP#pMWWCt821A=|Fy8`Z?A;PeuXnd3~3QMahAX&))q`>1-paYMb#i_-aO$ z@HY4D1&U4P^-ZF4L%QuYyv=RbQ~l$KQ4wwcYB9^Uh|UDF4lCH#Ux&+R2b^_wjb3o? zmNi<$U3_nqPQU_`CDv9-x#>iCoFolIW~6fo9I^%22|qN#d2rg**CdlUEdF#(uQXlT^4g#=zXr3s!J`?6qn}IT_+@TML-aN{V%bq+2He|&Sz6W;Iz$qY1I1%mz&@rta=F6-CNt~Ora7g|2uV4p zJx>#(Z)L0WvuU=K5}h&QcS#bK` zt0l$DewfGDDkyoevXgt-5oB;t)E%8|UFxNO`-D4Fw6^XSO<%SuoXLEct>K=5|AWQR zD(>JN@M~wTJ%-oMgi9Kq_+6ywcp?Ez%9R8~Pf^$RNXmvrubq=bfb}323@g8hj3rGY z^_HPX6yEJ6o;jRzolJM%pWr4?bBv`#cDPB)Zau_-0$54} z;h4i`mi|2-9`xg%L(c76IL-pObvr+B-d3suihoAVx0~7EBTE$yADWMiDYg9P{_I<; zFTESCkOVq#kIPJpYtqC$vn6@*n)?bq`e4}nUu3;?SXAM+HVjIrfT)zTh;&Kk5F#Zp zQX(;+0@B^N5fr2x0RgE&24QHVyQG_;yJP4Ya$xwz-#PC&@AbX^adFM;y`MGvc~;!_ zS~q20I>*YPfZudk^2}=k>tl<;TBRJ==e<<<3D|eicrHiHl=EbAcp|aGtP+3iSwR?k z>pjC$ZqFmH=$5U#!Tzw<>4XLQgTl30${2A3Jts;?y&F z{gMDiODX4L?xrV%bJD3ILo=hPPdP`ixQAY^_V?N7 z+H{pFJ%@(7mzetk@xf^2BZyA|DU*rNl{RN_FTZpJG04L<==b|LJSvwn=@YdIzp@X{;HKv%*5VhFW9;-9;B5!EK;=Fcf)|A50-@0z3Nc9vbBE`|NC+0}bisF9|+ z&U9P;J<_^WU=@R1=2HoAfcREA4g$ z%v|?1~8Hb9^_CpR2eqD_DPLd zoK^X(K9X*w6QoY<2pEe{4_>|%Iv+1MTY`N_)M}vfJPNz_(pc+3X2%cFo8uEnyIhTv zX{In(4e>uWq5JgN|8Wz(gG&p5tn|V!TT_)67;#rg*P+cDi|2``7_u-G0g{vlHR~8~ z$G3^!7v^Yre~~?#m6CQJPC&zWoPZv5@oC@+Cd2^1fHRu8i_57MXOjN<7B$+M&XyAt zZhZa`d*N8u@y-anVcABegk3f7G{AK*10Qv=eW{)zH~}BeJo(|WMJ{k=gftb@F#F-D zR%!5{B`A`;RY7DXa$>37AFQBF3m<|bYQN2O4{iAQ7O9R2j=|Gs%YNzD$n}a!n-18) zXMm(v4h6zCxIQ1b`7)f|i$bxHh;=I~&Chm3n&Qy*dYjrG&cI)ZU^D-IjS!t8T|V2K zWb7X%XtY&4Wu7B~ba3yuwcE3Dr^k8vU5&<9rUjSilb`WXbdUBm=XsHvcR^)xMj!;E zOS@%J)#c=Wdxj>QXR!M(&j2tdM{Vp}9F(rVj9IPufZk!Iw9HV7Wf>~R!p;~bri6Td zw;dgPO_0ss($Gf6{Ri373Y9W|q^TZObSl-XuYgE=Kfd;P&IYFax3pW*WoobigxqV^ zubqiet&Cw_-(vb+te8q8TGXoO(cazVZPbz=OOayk@l&&KQ7r()D|hi;cDq1&vq;kK zT$twYgyW1ir$6**$X*JC;H+$bwUC7C=9x2mpfO~xn_T|@GgZ;_Oi}00RVyg6fc^cO zAhm$G@4sT-t!GNMm-Qmn3v3;yt<{S-My(j%`XFFIW;*58(tNfld=X0W|F0te{>Kyi zuOs-kj#rp70jzv6-S?(#k>LF@nO9lNa#oZTyHopYZ?@T5lhko-JrLQDKe5*l_`)t`&W_d?1*m^kG?*3`#2=S`Eq{RBWZ*{JoE{)Mu z$`$Mbb*{-e^SDQ2oR<^{tqmpA5GSqFPbsARv` zjG;~A!lgR8Ax0AS>;A-?<8v7`A&I6a9E5cNqVv(0@v8;QT(U)JbNX}U&XrEW>}h>Y z*8NPC!Ji*L`EWm55qgMIe2!6gLVH3n8zet-SZ>cC8jNLa68(&VHNB3c?B&W_5Xz_f z-PsfGZyTA~#A=D^VICQ|7QZbabh%Tw+%74MgRwTn|G`+v~7uuSS%agqxWw{bb zABHGa%kKQ6go2MyGo$I;cYAel;?M67DBQH(iR)+P_rN>7YDfFBEeF@NqKaz zf6d6Smt&Xt?eTR3E=23Jo+!&?UecNUC|wQi>k$<^8vgnQ`}ScK__g_t&)Ix<`lh;? zr8?I64aFx$KHA*Kz+Y{JpsW5fM)e<_q+hYV=yPMYqZT12HJFe|!!;^hv$@I2CqDlg zh)|bR+U<)=R{88d+W5nJ`7iiQd3>AY^-pb|%d@hlO4~1xb0ti;`2Bk|=S8GS1`t?? zFl;RS*hwAm5zoI<3>L*}a8y3>9gflC1q9I_#WZ=?!Z0k2Su|YJE}oj2omJ z0Jn2g3%&D92GsQj?mcEDsp%ddf&;OPT3ZU`M3)ePEO7xJw3;lUeCQT1Y?^eC-+J_mbej|i?PedLVr&ddO!YQ* zm@by9q9T4#?PkCdc9FV+yYUu%GL|Iio@SrZqtN}wvF{forRfB4VRJMf=jXUQ!fjx= zXgP8Q8*gzirPI+6v-$XJEoXarh~uCv{|^)uM?3RPfb^^gigO|lfC^(r7DCrmqGumi;uOChyrwiiiv41fc(Vq zRRYTLXalEXNz-9IMQ%;*|0TLpI=Y>nc;tknO2S)>C@{PVD_{TH-YID(j-YQwktPqpX! z^RN5#x6y$0uAYDjFZNTTg~^qBje6+}VQjn_8nwiaN^mJ3=K_Jy-n_hnrO&&ea<4IV z(l3RW_LqRT_o|H`#xx$~ssVD%j>mO50mpeIQ(EfG?&_6p#Q{tW=s(>))0WOx)((+z z;O)w_x7LyQG2q&9b>*@Ii1X13NbzX+UpmkT;BJc(!S+|W8eWNKP8>H715wW>ot@uq zI6@yX1(seOiqyV|VoD=V!$Dah_8V(*!+d&dHI~PBTRrDbmpo6h!JweDIgKTqcO6kK zs4gNu5X8O!nJ;cuCB&YXhC{ME*PT+<6!~Cj?299jLt|WVOH#z+KXL8UaP-JMO~6|@ z`g~Jhourg3F(g@7QnEImr~#c>70|GM?LvQZjwQT4HhUL|-E3N#GK+PuziK0m58WQ$ zNu+-vX7jN)9UcBsG~kcEr-rkbA)dr%yQC+6#Mt+om?X5`Udvlq9ivR<{S_HNeX7RX9 z^&l(~k-nyB79qrS&sLA2mP1X?6gu^QYM3P?kYi+J`NTYxHDIU+R3IoEE2FhzThpLk z`J0(V_GfwmQ@6L&Dn%6SQyxYa2xoZ!pk zB~p1`D0LoQ=a>e|8tyweui+ZkLVdbHRn3jmYIvQyBnXu%orx2B((osPp6~fOyh$9& zc?}WwU03=dR@WaXh0anbn~$6+nK3NAiYYkNHx;&W-~N;=$qWK2$1i)fuvK3w&CPW% zR_>VFAaQjUKEPl1;|kUH#=6I_as8-a?G)uWMfU~gc&CdZrd35kn^j@QL*_~(s<9@< z0V}~Kz3W{rrPNQA28%n?pscjcs&`HLG1q$Nq4J#_WKzYx7U9Fi^-B>dZEB?{&ULZx z1SVlDOktd~b_4jfGcm@#vXF}yQa=tEi=X61C8%)|?dfoMiKX%(`~!?n7aD2&u~${d z%vd`i{7axLs>XpD-U%*e5=i9(rOCa`c`kL6i{B5oc?w)jO~keMjdvq#k>d-n7{uT{ zVfDU%u2ns@;CLM`-B(0%SjFjF;jF=FQuw;fxM3*_coBy6zK>@HA7(RXe(B%%{7g9BYL2tk4V%$@kfmr6kJD2Ua4b*q1qZrc zG(+-y=KQTW_c2VACu@NVNX&6&Pt^*`?K8&D#~OWVq#TM~j!ieu@G4i8FSvpruf zdXsBp$)RY!+Q6#j-_7)65vgvWH$N`mv^8%Iba-{YJseZX9Su+wGc}pc-IWs0vy7e| z_c7V{7C<;h3zY>uSP-|bO)l?UkOeiK49R3x_G%xZ8aI_E0?dU>Wd9%~jG78CB%bkA zUV83npv*d3T(}ZoyY1zTyP(f7I5B*t;!R;=&Az{dz0cJFYT(hht~@t+UQN{eS6KjK z;hDFAO_8tu91{v#uPjs>u&|63;1+C~OB?;cGHhN<)oWGc>z3>|czL8S48Q!PkvAKr{s3w7i?zH3yE_%NGTiWpD9ngO7P{^oaO6>?)dokl1dLa+;6kpok9EFL8Fs zYW!s7^Cir`ym@wSC+kzy6r1=R@A8xJPFu=E$h@t! zX83$`d~Dv4{QIYihly3PqXZs4)Fw)R($Xga)KrDdOmE0df&!&eI>GedP%?g-jo{{G^Z$lr;{3+1$o^0j-HcyQ>C=j1?krk3VBv-Y!$UOhNyKhu3lBMy!%~_s6o4!a6m=38YxrLg?iU2e zknCLr!Vj7wRyPcc`@kP`o=r`V%M9Y1*1us6Nr?fDlzf&qX)39uqO|LX>(avgF29WV zzwn*5h)QuOav{IUK)2xN@;nGHlq2)r@zy#6fCXcH zWxWnl-RAMr?$F+Uk9P2P#!Rg}_R>3n=rLgkn9@4MlACP)q4~u4>9^g(mQSp1FlHGp zQHoXQ_$};|(LLyAbhr51~}J2RTv*sw3sSF9XT z@w*hgQcIs!+G6pD0V3J&YXsF>>&04ewnW7$ zC(EAH+Lpj3D?K^^PVUlX-6jL&&`$$Q2g#V0%)-W!7uaB^r9grC{e{?MqNL`w#pf-E zdLno8B#JP+he;EQEN6}1lfWOAVqO(U0{#-1F$W=Dp4`9n@~->&37vDm z7v-RrcR89(bvJpkk?#n-nnm}5Hj0jFl|Di5id8-*YcAIe(iE$(J_x4X?dDo+nK6mH znEa#u(k8{qvi4+?(Vswd`;hLf`Tn-qbLP{uhV85qai`{opHops@=w+7-jeXIx_gV4 zUBW1fEJGg1{<;0l@^g7n>b;us--<;KQ(3&_&saaEu5K}Pr`_@|ktGN^!Q?s=4qxFL zjoURJH`rIpuN#Y-!T2Pe%!ECRm@M-hruX#|IS4e5uc&txc@Q?jjj0oBt@_AT#1fAu zs~Ym^rB}(y&&Mr+Rlxb1ilCc&HLisnuB58XA_|rX0F%uVkbl?i!<=%2-g5^f4fPoq z=sVtY`6R|L)QN)hqhzX{tX9aDa`5`k7^V-Mgsk@xx=h%+?%peSgsiH=+!nwGhgS!_ z==@;IOA(4E72O27^Q!iWFmT$+#CENXx=dQDz4?&YWz(=oolo0a!4es#*!+bV-+wm}MVJg+4Bn*)jt7E^K2d{3Dj%UY*lvQzqV_1uk@F{Hq;mj26Yzt*~S z{rSwcKfCV^?2URxT@@UADpTV?i(M|erBAt9-vUl!k_qAEc;u+g6S{-nkMAe<{cUC7fc-CClB2gOL`dP);+vz0~@{4H9 z%M=&q^uA3os-wV%HofbXs{Gqo_O5P3{4fB1Ab*QegIqlu=LvyN^JKX~EM%jS=hnX* zG64JfiZRl=h372}iRJ3@?6b1ZrH14k=CO}9U=AgnWi<7f2a7x(pnA@or^v;4Vrb>_ z323U%&MhxbkgT`m@``}B)$WR+^Trv)7vezPShE>1C3wzoAzbR`Do&mH&OmO>c1*lk zo{iPA{7HsU6SJr-L|kWE($)U%jN~@hnL-4rrry_D%~ry=pyft0=oIh~lc2c`EyDFb zV{|Kh4qNi<$&Fjs#;A?y3z?kA+;3pOmeu~7aC$#@hYy>gDtr0K%e?p_8_U6Lv+bS`S>tpMMK3UA`Kf95@ zz^PXu%nm7{#N68jnGC#>tnypJZzsc!%sT=b;l$|}Qn&U2dWY{GO3`ZMv%9Y%eFzEy zRf6`9n?H$qgj(|gl*jExK1CJH(@Nsnt9xbsLtPto+6Q_B_$q>zl{W)cyMqDZcd&hl zTp!=41_d4`b-J#doG~Ul=s3*tUwb;|g!0;ahM4CsI7n^W>;qR04f^W`@tGnpjil&6D0?CIvH{|0N(KNaOaU| zl-Pz8!C3_huB~{eF~vc#d5^X1%yYkw+$s?3W#&2ix|%29(Lu-4nGXv__UeUy);}zc z(U>3Lm-_us*WsZJ6oP9wNLUpUeVb_#$-!Vjci4NUbHGKXrR~hwk&&24^a=7 zR~FY~R@>G(k7kQ*Joi(4)_YAF!vuFEcXm~u1;AxchGC1g5LavAapsO>w+$LH#pdU{ zK+VWTo2xSB?{Bjb(H|afy%m!t?|R&+KG2fVDT~yTGzZ4Y$sz*hZ#6)|MdqCfilpA% z=WMtjS&jO5{f8Ek;@!a_D|iDZdo zW;~;noS*3jt}6f0`#|7bw8BV_(7RQ%ETDVme6DQ6;#XbJ-tMzG{)Y$UV&@Eel)$D! z(9DC6V{Qt-Ck^8Rdtu^7@1Dyqyyf508X@>jl)LtzA@dy<*p`!^Yi5@&!m{YfHEOUZ zx21@_{{*K$u`W*nHA#&uye6L=!<$x1406lO|NIK7{q*mR%r=Bk!M#8GmL$BFCF-Dp z1~q4*L9CBIAM2N9Wsv_Y@dKZDiNhbVhXufxj=a}3aQ#=(%_}~nH=N+$Z9>1*1exP~ za0mnckgVRa+py_YbIE>Jhm`RpmfBVh<&=P2mI0o}F&F4zEHll5Z6XBPuJC$xiv*j? zbd$db`K)F>*u_au6u=+#iR>8)zZuUpI}V&`-h8sXy+XhlLY*?WhZCVF{%xy})uqa@ z_gM5UAiMdDu<}EX?x;VhjHk<2s}cFvXF51@Yy=SSlD_&YC{8Gu{ra9h_!Y;&X7#ra zL-wBsT7h4T7+m4uKbl@Xo~3GeyVq635)^HEyEx_Xr@pY=jbCK;XqOZny5ITzv3ddF zcryu58u!VH6|-6fPS3K9$laZRmeHftIO4VbDqvfHrw24hnNF18bj?AKD7>FOJF8W8 z?*ceXP8E%qH%L7xo9R4hs*i=6v;$lGwZ_l$7TsRCFRc7hxpBHiFn8J=OlLh&hID&p z`1c9SmHkrwwsadk>luhq-&o#oDH-CA)TIImw@-b~tXsn|iv}Q?NxB`&$cBuJ`yc0U z(xe#mv`kbSNau6t5146Wc!wuID8h$lDF>KwH2XU{;*gMNQbY1UcJ zb`7>$=R98K*lSnk`5M`mXyO>qQCNG#vh}gAQ8K6OBZbnxCiH@I$yk2JLCtpH2b#BDSzWec+Ljg?ZBDhBo>-|Ir--O34^AifdA5-)czkd&>wgXz z_>}4Jxv9P(R}a24X)Na~ZDRf=_KT-C^0$G*c7t}f?DdB`55?6v6dxEA3%~8z&o0eb zIZk~@xi^a!`elaNJkKhTG)3Mg6|m=kT&@Y33Q1{!QWK6A4@H`tZdIg4!62H zm@95WAp$*qQo~hP9qSjvdqWmEspY3FVF2c13OoE2qu!gl4}GtoS~nc6r{v`Hlg~LcB2)4rEE8UoO}z2;x>MR_kqerY-@!FPHI;`%$6-t)A^| zdHT-pzz9eF*n78FQGQIM89E;y$mHWKDE`%3lUs4RWC)b|t9Q>L>Q<_cgUP8pcSa*o zst;?vU$O+6;e9IC1rS1#O{&u45>O;IT_$AkCcSGCZ%p2S5fnx^X4#-0St;)g+NI7F zP|38a)y@!(U`DNt&@42_ysGiMJKAD@+3G7J28%z;ECf8BD^oA`J*5U!NL;>+Mc^7fOq9RT0e=uOVEWQh8DHC*Aq$BG z${Aj{`U1(cC>$BYeP10VtQe250i~O&AW`At=kF+#(H8TE?n0wJW0tfgbl)J1Ysn=m z8GgXaLD?1jSdg@(dyKGeu>CSLn*?nUCv$=xT2XSaVlorDFHW<|z$!`N(_OUr{W*`e ziYoaad<_k3m7Ne=EIq`Ox6%25dV8UzL>|%=T;^dnDKx|8r|kNBOG1yTTD*dzrtL!$ zhddeuLT3=JPT73vpIOBTreu4FbvwyMs-R_A zYHxNrB{=yl!(0t^$l}1(#7L&TtNL`t3eR`Xn`@VEB@h3?PA8Y>AYe;ASL9^qPDBmy z5Ra*W)9~~BVjMwmBqGk<#dKEyc1B$&N(MZ38|aIo=^*_cw+nCe;~$jIGg?HhC>0yk zp94wb5fgFyX0B-h^JWClI)Tn4yrCefb~suSeW9!%{sDjYF$uIDYg{7eV(6+|6Hi9=7#@*S=ldNWgh2xli`N|{2h&()2(gszTph+a<7z{OH)08_Hy z)e^TAKjK#X{c$6TRD=TCms337D;FH^=lzVgxBGrA3if1ZMS5+6j08bywhN8aGBHu{ zx-s2g4K_p_&Et5pE6Z(ct;C#a3v{LCT!4elmhHluXRXSyQ7})H zyxxkg6xq1ll>HqAsKwd~WiJa9vNcpXT@y$0hhz<;GbMgGo%9%g0hPP28M?=TFKsL% z^Qw7|OQrN@#XPg`<9NQe+KVc77q5BC)=CeQ1c3VUL#A%tD#Jz@K7@BA`; z-OPF({*Iu)p66TFVy$@b|WV0lfvM>;bxul?;n+etsYCx_&hwA+wqFAkf)^`Fq^ zgFI0!f8!-ld1t7@&J3V?(IAu@U|?cQp1Y-x6BJ-@XX^ zvv5a)g$BrT{g(mJ8S36FPlzVB`E+ORqTsVXf2>auSj(IP56)MHVk94h+Y87oy=(b3 zic$vT(hrAv#3a8sLFHs>Geh=dD!KOG!h_S?Yge#~(2#vP1)!?4*w=RiaXIfl!Hv7W zM>G>?kKftu8cm9Rdyb|-<1T7(P#wjMV8T7(DkbhCl3z@Hzt$7>a$Q+pTXZ`tMVey0 z4_833hNfC`ut3*)YkwGNjLt%sYT#Xe3r~2KacWHislI_n7BfAma&-?c)x^0!lnNTa z!Qy}AHUVYSDNk)3QgeUH?--KLsdA3`MG#f1?6v+2OryGO@q1xJcqmO0wI}e;TK|7z z9gi#e^SxbPTpXQdZFiY=<@HDQGSdLH4{L>q8-%J=NEj}A7QwX-w{|-n-7){nBiFQ} zEEfF;xqV}H<;{yd-{#RuS)pOV9_`zn#kojt3ZH=;1ADg?-pmAS_FG(G30*UJ1#i^cx4+i%36&L>zIW`!y$+pliS!# zMt9jl!YH8Y0R(Z$iONJZ93Sg8^^CCb1lqe~_W3j@UD(b3g=2Vkl?OyyYqhCAxp3Gj znbe{7G1TpI@k13KMng9|Ml76P+&k)Qjl5_F@3p1R*7!`F`UmfM_SKqBvFBqK)rRvv zHv+)W$V^4TM%E<1bX6KmOn4G1F|8=b`TJfA_9d^yT2>E*&$&uf$m6G?E_=y2~5;UMk?U@Oh7Ve%&}Up$rZ+o zDDiUbM+y50Dl0AjvXNdZ^z$=w|EBJ{Wr`{(M4_HUd*$k-0qJ+{e=E8M(Xzw*A@(~j zcEuJtM=+EjMGH^E_sX0Z#Q}}<K#ntQ(GH*YO94u?IPV zepoCa_upU$rDsQGqL?jjao300ud|L1K`^#&FQk0ktz`08dWuZ7;o9-z@Yzbg0v!eDzC0xp!Btx?xz7pbN zbI0XTg9#SZD*cENYCbX0FjTIfOH>=j%K|_Uea2^sq{#f+*7c&K*awN*o4cTL=^qad zBW?A&e=_2U+nj-&SBgfmnbc0psVw_1`@^mI8Pjr{nbMc9pU~>mFv6qC52+4IjpVDM z@`t|&13({Ru-wa-JQuUyTE; z&`So0?kgdN7sEyb&MAI^&_{xx=mDzUEICZ)Pt(Q#$p-(-zeOI56JU+Ez5`X2_}kf- zC2joFCego9C^=3{H^WKJin0pB!LgrtUzafm;QLGc!xJgmuS_9W`*aRzb0bcu5`ta9 zueR)|z;$ZKM%?c%dY6egJJa5k<-uhwhcO(P;}8lh3Lly34Nl4WA0jqPV)bv` zHWI8okq@xN;E;UQ{ait0k+{lW^zW(^S?uc(_jw`z!cqf0N_39-hRt4%ZF0Cpep@uK z#}t)74v#0z$On43>PbhR!IRHqE-rtO7MyjHoBvHHu@)k@&2-6#ZCJQglQw;E))r)2 zZyI7+iK^tOI)s>`&KuHTZ@QlKenvI=C{BP3gfzUt2(;(=&xEIP9pP&G`K$?|j^$q; ztfRIrbd`5MwD*3OF1wp`{8M}O3}p$kb;!QF{L)*X83MfKj{H*xPNE<#eImg}bh9a{_O>j+WxCb`aMd|M8aZ003d1wK)vDt)tqnVpQDcMS&l02Z4Su|^Kv|(gT?&8&9X?hs z#tbmHZHBdczB-@UVP?crC)+(jUP-(#Q>>=26W;wtoua`)z%<)*B<{VHt(7@yDfhT+ zVW|_0?mcoHOo;n((Yh?;>fODAmgzOql;~dcOtN*4q_>M@oTCb<4B?{uqvc`a?L97M zqAyxG<*2u{;)}ZMt6L`C2`R`w@kQ&pFV)}7-ih2sw zYs}ItiM`8=BmML4TEI}qof95!T<<4j7Og_)?k=o{9a|v2W_40l4!EFCUue?hox3=| zc1Pxy`%g~oV!V|8e7K?VDsJ!f_v>?c287 z+pQ>acrJOd%oDg1Vde>u0sDK}{p1kQ@qT%Hkh6?&&SyAjF7Lqx4QO_~ox1=0SYY#CW^{^+h zW7zTM((XY@z@dWbRbG@(`mteYU#(Yzo44k4mvIzg$KL*xMtzt}Er+XnK>jr(VmIj# z1j0tk&X1!cm1QLff%;zg%Qb3x9>6PXzusGpa+Q{n@_c)>+UC}%7_ED3gNUr)fs7Ub zqmpj0e#gLN)A}FElD!=QHFLYdj$`rU+F8x|A$xwB|0;Bw_3=VAf^&pt9Em-N!9Duo>{B^6C zJz@*d{r!W;V=Lmq$219?F090&#{tvIUJjZ0)Y(yPM%vU2o!1u@UY4UX+AQK8L;{ZH z3pE#RH*RXwnndLvaBRlQ(Np3=FN5PdrazG2J%As$Bc4`8>R?@LEs?Eq@&i$`(t1tq zyQLOes#G4!;(k)>`ubH$GZ62s7Y@|l#4snX{_k0Tjd=H)Q6MA2GL;W`%`B`UV2oxI zl?ZVWV^O0p!wOEuPXEu-cm_AE z5Sl0~qVe<^$~!alIl;0ZeA@kE!(=65)xx9!PWe=kTJV=mZWtLK_2kB4?_V~L9j+J^62AuOu0Ag^d;l(pM#k6BRT_H^A5!ZMty^u z3Un92nH)L}rp@vSYB2)cc}S}g#GMOtsglG}z0^DJxF+vy54_n!AK3_Hwo!R4XSlb7ca;Hb{LGgfsu=fPWdV0W#lu~_bWG_EsbmLVWunGPB5cv?~Bwdl-uQB2QRq<&^o%L z^O`4QC?iZMdmI_(fIAFAj=Ig5VV>+1?X`ln0D`!oJaaf%6$|LcTbw@?X_O|I-batJ zysd5m?|JoxFD~Yc7jKZ#p87XBrmxx&N}WC^H^lnEs6Xx6qzFpc*Bs|9C{``!oN3|o zg~WVgd-sLDjtgBVIdmXxdLwzhZ<5CvTJze0L9v@G8I%T$bDQ=5onv&Y)Olr0m?E*p zawcz^7E4?-^%55Z4 z22=@?#Ai$lOEa^AvyxKAZ5!&r6aU3?rZR;s59ms8xgQra!k=q4^6(%l@a(Km?N@RP7iw@01r(UPRG=>gnNHIoR<3(lZ7Gmb?b_qzgXG zobf{Cb#jIDhMtXH?%h~d1uUp3SM&kp1Iz|ijd=zg#v4|%_d5}|lmaac8YAY8&t?i% zASWm7d7+j_N-Myh>}7J34AB?bn_u4KQ|uTS=%BFt-<+b`dwL3Q*!M<@+*UeWyk|Ye zU&;abVN;u?|6@&h3gl^$GcYP0e<&C@OEj+s7&=|S4HD6!AkKBQu?qO5ToA{_H z`~y&NFM&3L@3X0q@&r+-mhuOduVBgo>BCMJM#^GJHm|hXCD;YgUDezWiQ~>$mUBhQ z=)A*#`Ios;^#+z*G7-v9zPy}jd)gWBIW`UUpLBvuPglA`zc4dJjSBm{wA-2X#r7dt z0XK(YU*=2yDyM9k{|a%=yefMCG8Hh^X`E@+K`0KmofmYz&yjY{ByQ^S3#8tn`hitZlNQ? zugRZPOgCz+!*+x}z``JT zE=&KbE^OE$oh;DIN2!SxW6|}5hu=@*lQ|8>!AUXf|CAm6RUNv?twI*osr`Dw%J6+{ zRI)t8&iPonhhDGTGe-kf=(w_$eSra@a}KN9xWDmhIoPC^+{DfuGRu}Ho6>RrIPTG^ z{uo2kFi7O&$P2?hN%~SbbXw1v#PsOZ!wO@N)$LS~naM@Xg8siK+%or3c`4d$A2OUprQUelhjn(Ej!M zCIt84oMqa&hdnc!sie>Ym1EL*0_m&wI&j<`r;F>H!n;P>2a#;0KDKYQa2LyYv^&yK zz627oA3(0uy&q5Ra0 zum2zeMD3U1CtJ->y(aT@cgK|wE>p=?TmRb>mzz^~ay-6meQf=iR?~@a8wiIlGCm%M zst!)!#pg2*5}{5RYqwl_7E6~v6^(;LIU%2J#B&mo#xGX3`V3BbythS2w*RY6;O{CX zF9)Ju3_dxue-g%au)_zN7qXB6cI{=fE1isc&P_uo#4!m`h%~Y%g=bTEAmRQ1v1U0* z`d@9@gaHFYLdMhIl4u&Ff;#fwuadjez~<)_&!!f$jr4^+5;xz-(EmzLC4*~pkD%6c zFZs-Ry8^`Isa876@JVO|dH!d&%B7OM&b$9F`G>-h=8@do0Kaj^DFyD)l_D+Pf7`>o zAhk()OXOTBQQ$!$&WE@qx^50)k?3V(3YVQV4qrB~8a$hZ=EMq7v~n3F#Fe8XAWG-1qO<``P<>`F}ab%!_rbW7fK^>-?VQ=L`_OA31i_{A-G< zrO=ybm_^;b`_;*Q_Hlz1dF(&c{C(_atrLRF4djMq3RhaqWD=y^yz7MjLW(g0f@j%k zBlND*!YXmD@*tzTlOFI$18otSpm9&Ws4qqS+a*ML&29OqqF$z^Rp_O=6|c|jxb=7+ zrDB3LYHk@XJmY3HgOPbQRjPicgwI#&cd2Q zHGv0d|H))koq@}X)$346cM~ZNE1G2d26naB3OdL|6(^K-V-G*)^@*#1yA0X>oz|m5 zWpI7^5F=jXdj*&5=H8jB7K3c~Lmse9ioaAHdi3y^0Ugb!oC}I8n1Sm9vkCKaMEyiI z6{$uoGQQ2r9+}#)ajvyw1hrXNd5uG|BUSfPf1Jtg(f*I77 zhxj51MkZ48z2BaXv>t~*_zO!BX1ftDW~6&sbY=gu`Agv77I#_^cK1PEhbqfumQluF z9&}ZRE0jWOKSP`t(3Q>fdwW%t$5n4$<^)^p+AMsP?x3h6wm)2Zs2Jz#XY|me3{A0c>eB-8s;AqPpfK6LM0XL%vrzx-<_Wl^HkkHN`i?S2Y+oT zm|ZmLJ!h@QOH~>R_c6WqJI?b|z*rlMZF}{f?H{23@qcgs@~IY)9lKowl09H|0nU(8 z52VsK?cL*}s(@|>V2Zi9uc+HMOj>lMUv@PR&aT7Q>}ye?ij!!C{ixI$dYb6%KAZ~u zKL`CgTgKbmaiY(Sy!`5QuAP)CKsOKP+@G?E?l3F%gx-hV*yM{1dHD}xTCfP&D+J3k z<^}4a0r=Xfl||;+duZglJ5eIgL%t&XAV1%VU<76NYTp@i>8AaMg@N;BX7ibSYElq5 z<{jlIv+Bp0Kd$>ad0JIJ*o{+yGkXbc14hcN2Y+E6kMWt35>;`So~tb-18K6soEgeP z1gUghW~~n;Au%R5U8uIMlkwP})N_TTQS`5c*@r%fYT=yRgDWU^czx0i)^j{W3sR_L zewM0==WO}&no3n5!kHWS!&+j@UJ5~uis6gQ33# z87{Y;hYR?2r)8HubOnLb;+(tfJ#DvUk448K{>_1DrH0LhvXI*1ZGdWGe3n#EtCh*4YqIs{miD>5lT<8Qx z7n-|)JZ^4hHkikFKkV;LQ&c<#GWEFZ^EN~nCTH59hk`Ja(1iZHWAqoL-uuaGK-2{* z8=v(_V5IgGUu3$f(0A+ z&wNy^8~AnCL5+d-^2D;fjO*(GPvv07_y!J2K7;!sV7H)eU8r?G6J8!87N&2+a5IJo z(1Lt+z^$m36`RXu#ypHS)6X6<+ZMUnO%O`O8*vh+h1B~8*d6C9!}*B^cpDM9z3I{> ziJ~e_@$4RQSxv9WPZZGy2ttGB)o#pxK;%9%){2@zf8H1DnvNAW+paN{w&m6(Aglb+ zLS+{L@7sfGfGd4?QxbxOZ}bP&~E!Rw6dOUVdiYOBX8# z#I(08m_q#-c&K_Ieso!0QPfOaQQ{-fzNM0K;x_^F zjG9qS%=A|FSz@;-R#fAqlBXRahSDZQx)}!DOI9Z)|X?zYyfp+;63Fl;s)CTv<;0e1ANY()vWk8gHs=NEd^C$hA>=bQTiaF)nl zb3&B!6uREBW;IWpivj%<0AA~07fet-!;Q!Ab2SeOc#d|V<}6^4is|-Ov|tw4#^6d! zEC^?E{9A)Q+0oEL|7_&eH+Bstkva<4)}go=G3~|O@P6&_u+h?+(a#iX|uw~TLtK#9RhSC+33CKiN-A0vGAHx6VrVfFquKv{zAPQ$I8(f7?Y zq?ux3aFCL#Oj){Z(Df3>cPDINf)Hue>4{>?y#Brom+GDNCM~;nuI>dR)8m-}pE!+Zk=(2R3Ds4K=>!!Jqx1Zv^J>7y;|Z%w4fu?%!@osoY7UOTedg3z?mf3Z(nmNRpj!3FV`S2Y=##AE4oSkJ6F#x-PC zc=}uZx-N&k)q&d!LCdmiMx#3_dU2a^*SnPM<)!u+zy1kPq-I^QcNo>zSY&<&f^pNF zhlNL*{Lr%(jXv+I_J>3*LDOq4jqX1NRrwUkYdere%gF*iiH}Qg!jjJ%WsIT5uBuG7 zR%#=8W#{qKWAXkiOL@3fW%czv?{#51s5QFhN^e%qlilS+CC89`KFBxeSM~-8Sdcg{ zo>?z)lf@y_=tUw{qpOsVN>k4f_W!G4Y zog1mL<@B6$pCHFrlRJtj4Wt87--63M9o4fISa`2*b70B1n{bOKk!l$fMh>Z7w=QDBIsSV#5UI80pDrny_Pg4}4 zB+t0ECa+};<@+FPNU%V*yO8k4z~IzE32$ilGi5RE_C#y14kG=qW1O~;sUx(U(Q2T7 zWl3h$wHH4Lk(-4hHdj-%wx}n?0)dG`0l9(8iV8xKP<0!_ob=&a zio7d;+3`Qq3)POhpIRMG+7a%`(Z>U=`aDeQgT3yozf)77%F8!7jil=Pf)#t*^(mhF)oqNSX2B99$*_%)f@5BTN5k=nk~~TZ|QFwHuKq6RtQNnaN7r0O@}{YF?0Q z5!9?`K2{}M8^e*r%-G)B(*AOh~9@*nU-f#I`p$4Po`%QQpn<}FE z=M7^o*l85iBUVUvallX99fUaL?(#?sgetz3KboW;M=FQN&stj9*0BSe_SwRaQSz-! zeICcrU-!x#yQA{!y>2~qBzyU!lk5Di<}H+EiP39q@E9y97{bn>z}$+)cpzPj)+8Nd z-Of&RD$o`Y`4ROd9Y2eJ7?S=&4>@CnWbQZGYH5fcW*kDPn_8COr+#oM%R#yKuA(O5 zVT?3jyFMNiNKsltd06VPg^Z>7n-cx!nitU?#dgN&WD4=%IFQ-eZCv?ZntQ%RWdGQX;=}fU zm7DNeB~iUwohKk3cR4n)sKFcTa($Qv09a3`Cad%XtJF@E^;^>>mdVRF&SZwT9_MiR z*5qy6iDb5#Yy8g>mqV!|Br?k8BJhVlmcpAxBil(L-b;I8230W)Im4J2(C`9*A6gr& zVw_m6^NQWkm#-A}_PnA(O%>CrHexC;hILj1w1}_M^Hv!GVT3H4h|@!LZHsc}$aw zvBqZaTg#TM;=j^6x5odH-i^E&3;v_LPkM5Ca0GAZ3PA`O-4d}7dK<8{8VUds{XUl% z^4&(r)ztf6@qOXVoYOGY@MSSKq((uLgd+6`}zv<`r_bzg{9sc<)MccaokoW`wM+^)^(PL;aPVp5BcWWFCR(z5?bRXn+*)btd#N zO`-f6@!^an^cw)V=$`&nen1!?vt~s#sNQRLKNdajPE$WKf~RFx8pTQfT}Y?9{Yal~ zABb2b&I$qOG4vbRCyP;HyKJ&(eP^^AYkMY+rGzCvXxlLw-9QFzwqVAlraIDEBC*Mk z$q;r=<$QMOv*^=Z5X0W;5Z0NFokaipJkr*vvo;0QL0vN#G-iG0@x`Xd0xz9$o2fe&7>IT*6cJL(a&ZM|v{g zd^M=Gab|4iS;n|UX5SsmcPYT0>*JMk7i4&1fVLdOy|3UxE9BzBrK5YfS$@#O;6Lbv%BdBI%A&&jEwuV)r&t~hLo%_odfU4#X>r6nJr@shals_An>@+XN5vmb_Leb@QM&M&_rBGWq})#VOV9KkoLqvubV`vy!%hGFWY!& zjn2AM?psQwC|wji+@b%mN9?>%9}EmGqlmpa`y+YQET=61u{|p$1?^ZYy~Y=f=%Dp{ zOYC;|#x$Rx9xy-_2sG!5wd+-RH#czcc|_TNSGLy;EltIrqPUdKu2xa$9f3Ap`hZI~ z=Xh!7U(4f&{EyiHkVgltRtSQfYPQTns25IGID=BB?>9gt(jxly?+LbPIZtx`V^cg! zty8b;iHgW;SwfzX`8L*Zu19YJ*8zi!I#{^P&Bo~P0@6N-%tZ*I!&wjH!^(rqxVTZ$7v6X*rx%9N2u?AH?}O6$g1 zw{@|vJ90&t0tSlye7*^M0Q!{HUt#Z5sGfCHJTrr=+M~hm{B0g^erwA6E<{pZXbfGL z?nK>_Q=s44cu*GA+)fg1WuI&$PZ3=|HsNYs3J>>J@I`Sz{!>*JEKA6mrE%Z%gkrLOro;jssZ#}=friJZqmvSw;ROPLK{M&0ZtR3H$NXu| ziOh7t`mn6V(yU(^{)UD{*%l3qTPEaug|ofYp^`y!K}A2Zmg>QM|A2pwp2sUpi(LOM zl`tCM(b!?odMHwNTDb`vw74Z)acpaAyI;s2{*-t8@G0u=2u$aCc#hH*Peo|Do&4j@ zoJ4Cv8^QpEF$H-3O;m3<5&$+TwzS~|lx{QcEEmiegOtr<;~MU)Fg?=2!OO{#DGpgL z4HwnZKhHxB8by4z#)MB(0Q>>o3>N=eTf=*D?n!zv_!zm7B2{r~?3R8p2boRQ_~<^( z(N4;jO#T(QC6i^QZl{N}$H=u;bbFFUW!LKH4I3Wv5&-k1+F`Vf4PY-z46eJH(HXsH zQGzGZXe09Dus~$`yBQ@S?p~zmnwrdzv^_c*->$~n{kvH|qyg^<)VzR1PK(U-8OT^W zREGG6$#yo*_&o8+v6bKlyBNF46AK}i2_)iH;9>!Pbic`+R3x@-8jngaW*KTtMXh@c z9sVH(6gu0lJk8iICIlhsylM2dF;K6C8T(YQMcl22^z$8s8oAO^3zXvqV#lPc{oc;} z^)5T6$duFw#2J`2Rm-MOmj#9K_EPdL41&=hf2LoMWh7(PS{zgSQOJDL4{pK)XYw}E|F7qLx& zrWH|ia0Q2dZXwq_mL$57$jl4#fpkVa^f<&(X72>j-xao?`NwsTPitOF}jTQ5$_LABZVAuxW)~ij;j%3>P^= zej9rqZxX7IW=LWu^!GD)@FDX19AKqS+O?4cvg-2@1}_C_?mC=lfM{4g3j8Z6;1Igq@+52{md4ZQ(aEX>h@bdB5wFT=-R7tOIsF zo7ZbW^P2|`!BHX18`YtX0wU}X+Bbklv0DEvO1#_MJn%+gY zPJMRAtX0$YYm6$!#+IpIe?%7|2*UJGM{#|bfrnAjL(f=%z>TcbAE}{u(lR>MKaCc| z4-2!RJT=gp^c4Vt+JF6`w_^Ni!KugkEoWxF;p2qh%zek<9a>Q1>O1{W>bdm|pEKMP zBf-@jvUN{6bh<7qfLcw=GvDbUq*k~8g_gHq9?ktVbZuOJ;*Y^8h+4!1lxfhnP4}wF zm|YRCBuS0(X!J4}fAn77{MjUg!e21YD>9noLH0#!o+#Xn(AfNa)-KFy=L@^kE*j-`g_5^49mtX!8?2zA^WOZke%V+}W6j&0**OfH`rmbvD33uS7-j1-^Ug zOeF@60#ajH8nrjWSyiL3Dv!WlPFoROk%sho z8t;Xv6yd(rR0;&q`wJ3#RSJ;PSGTKv>*v(!u=Tq?IgVg_*nRMAUu(e8glCv$i*!zq z?he~x+OddT zJtGE0j%hufz>d`9BUMT<$6(y@kk@fo*h4`Lr%`%)TdJq_JT)=kDpGe_Y34wS2h=!* zjbx3b0kkj?+EE^z46aJHv~(4#w$=*6*u16`kurQ2Cuxp+G)niU7r7u03)nL_T^YH*epXj%q5ble7AvsRRX@+<8tA4OuM*h&tIBu*+>?&T}+xK^DgmouB?Nv$>q%>_Y8Q1b@qqojJ zn0ZG*R-tG+$xob^)9RH)MfL>jIPG!-o;-pZ2kfp``9((b#p?!>pTF8O?^W=I@B^lJ zF^ALyk`l8jEbB(vtJ;;sCBhS-)1qp3lO0%wl=-QZwx`=iQ+3SfTn(Vcbh^66u#1m^ z>jmDY(!3E^w*>)g!u#fz@8kUC^}1mn^0&uD-YmJ$uB1Msq-p4m99us^%;gzUFS!P^ z_3}gmNFy(LZ8feWd?jP8YZL0pxydCh5Dn|z+Tn=tVXkb@Khc^p{x|HGjZC=1 z{+YaVc-{}e?(le^9Myaqh~oi68kQjRXz?|c^4BkGba=%;hYc)f|hCOVwG}+Ih9=;mZ zssKGv91b__1vOcEkCDfcE8!Bl( zaJ@;uCMhO3(-*Q;yDtG<4TjlC`6u@`e*5LBQGL zhqpPa?RA9LIJjS%squGiFN~h`!TMII?79LyhqA8iW1atnZ<)47r_xotr}Mw-cztgu z%TxIj#>7qYx2)`;6vgASCz(YGgPUJL$;>Kr8t~1(^`iGGNp~Cc28m12%hXw~M!X5z zHUV*yR)?=u7)#R=Zu3#wJUv2&B#bYSEA!HAi$K0EZxHl!!zwx$xe7}@g~NRRr1aKJdpCeFzFx&k9w&zP!EG9MVPd;9yqoQF*n^cmiHq(?3i26#dqun z3YgBBOaG3fOuiGj6F3=MjgOS_;Gl8$aFMD`7s37oHN>-YV`o`+9BS^bYip*pOI9ZS z=6gup2*$rm!QasL?@s(^y%xGaWk7eRU)M6|?h`eZZuH~Yp$EgNm%NUItL01|5Nv7j zKhoUGr0X}DX=z|Oyo7xOXa>KWpT!r9m0&;+my*a)@Jz6ZLRjCoxsA?}6;ULpIGyPX zx(f2KC}IITex4q??Y)808D!p}KQZVoR%G02I?Mj>ay&VbJiKIfC`=M=^CL=0ywd9& zmY*a5$_>>2^ih2?BnUlc>ZT58w($?=&PwfmS7xZE_k_^5_j3=8N`Nt&{7<#GT1w{CSI31 zWuS(-S%|9A5oEQc-^qRzE8YD>{6Dy+jd60QP24Aa39ozr7LehP%Lw0%BC{#OM%`;? zwL$9FN{a@2!82(Nf{?Dbww3*}N4Tc;ag*4H9|X1aDuc4Myo3CC4-xCaN5T~?k%qK) zlLH(I2!utT>ccDdTXIV;A|o-4B4Rs^#Ix9uaZLlO+sVx&1(RezK2CEZ6)k6MdZXJf z^TuF*4RQ)>SRJRQ$XkTUrx7`k<;(qLm_^-X+hZ7nUY{)RBgNbn?;}K*V1sWHR%#n3 z^`bs}3D;C=h3RNzxnUQY%CND%l;emOLIK6aQd%F&@?)pbyMd3Z(HB$=Si-sci}PP` zwW6-!Jma{PYIvCKe4(!xb$#3NkS}9kE2vNY3RFncFj-^{~ys7LZ>(3VqNh)ZnAJos^ddM_`F<82A^ z4KR6rfD%^c&{!j^yt_%00zw-89`;x-;|bKG;O2F7w+GVoLPG$4*HVz=53jM5D85qG z@dGx>-GpC)C+<;yD4>q2>@;?8m`+sU2;IiGTA#ecl51Aqw`GsUiGPyC;Y3uKZY&hE zUxbO_-<1`oN%`8~;n)OkbFatLWCuzC(~a8y6CT%!9D~;jlms^j=Vy`CZhSLip9h`b zi4s_rXulCc@Yw4QSGnBhQ01OfxYW~AweYT%Rmi1<%Nx?H6FR<8X`JWN`23dR(yb~B zSC3)Vz~Scyq!7=T{97n$sQ_`yw^kBz*Cr%%y7E~68X-+umyl+%!FSIASO~_XaLr7u ztCMm&p}DpI);edjDp{S#70V(z^FfN#L+@{wb3V65J%1EMDx+hZ8RF23_B+mr#(bx* zdI;fVOrts5Z+jbsmve91nLYDwqnFPQhvw0&pYpx6`}*M!JAbvb)oOf9ce!dVix}KWAmbVS>bkw?o z^runCq~V)sA3t>S#UC-cJv|s7v)f0N(zYxQlb>j}9Afchyd@jVDZ_&3xL!!&e~Try zmeCV@c;@lKWqh-De9tA7jVUQ-ss`54?JpZ*)o7xld^GXQPYdDc3+&#OhYx(tJtuF} z?bMTzU44^YRhnGCN{%30ZZOoUEu~hmPWjp%6~pB&b%<3;>O_dm?-`2a_-?`E@T8q3 z0v()rEmtn_q;?zY@n>e>Hqi#mLs^gVDGNQt_x7zb@0-iczB(URql25Sij=keie5gQ zZi?D4QsLSzAyr7a0(`z2u(f8=(>QtD?L0O(EZ{#S8Bsq&mbc$gbQI{XZs~FV=!(s@ zedDA?m>o9q+YRLvQ7y;ZIF$y?4HR)A8esJAC(m;=9*_79i%b!K!+>@NllZosMn=O6Y?winaTFC`ty zg6Y(2p2E>r=^4XG44!QtFL5Z_e^yx`Aye`~k!nd}dF^=4SId297=Hwob)PPkfA@@4 zxvic3-moW5k*wwZ4&~B1jWUq@;I>E`Af*d8MUA6Rr%s#k40}=8S{QG8(f2AZ9WRgi ziE-3>rTz|^o+%)Tkq4y<&8AfIU*J^sE$eL6Fm|scDk#3B>nDh&pa#>KD7GzFHu>l9 zEXt={6?1ahy(z0}{dLT!7Bu5gt#pBed2~_0c`#Yskr}Uf<)`MW2Pk zJx3>Obp-8*uAS%#1F`bkF6*8ID$Qn7KIn=T`y5=BM6ma_}3fX zG7=7s%rn(Lec{Nb`jmj?OPSdJpiTwqiK1v=@I2i-bj0pqSMiv0sWdY!-}lYmkpNf{ zn_dXm+OX7e8C$EMUf(^xj?u$?S0sg`P9;vC7dttijX9{(hEq3Y`IF3iJ>J&k%YS(i zyXd>QWQoNQB~)?)lvMHWfPjltBrTQ51bMR5eP?@rU1pOrJU% z1FNYZIz>};ZEDW%k1JB--#x`1pZ_F^{xfWeXDgkNE%hJflw-_CJZWcuUWhbEShkw} zB<{I)6BW@Q`5Y%&`Iy=21wa1N1e}GDucWiE4X&oo-&KU@m9(kaYqvJ2Vat0`fVz3N z<)vFi3jORa(~C{0_u2OC@|QiA?32%B^^nCGCj+%KnCa-!#&Rpg!JduLtM~ha(H=FA zULb};*Gk&86uCl+0`VXKgyPA<&2j5n`@S$l1JHY+GDCgwnd=8IME3bg5eT($zpw z2S0uxSLW}`KgtpgzW`6A4H&qX)qmPgwaok>EA{G_APlWQGxlF=AZl62`?9l>Kv7w1 z#H*nP^(`n8-gp@b&HSP!y8SXKQV-j+c>wGIwkuXKqsZ{@ii0G5RwnoPra> z?&TAkbzQoapYc2F zcQae)$SO%>M~e+WVEqHci)PPKIG{5(ca3wD9AOViLT9aiwI$r%!J?#06_Kb(rsr3= z68cilnFOBgZ`gT)La*dZWyl{bm_iw^P7zI(uCVO&k?hEFN5*^1NU>C0im#qGSm>*3 zw>4J1um0)0tlK-3Wvia%l%KZMnm@Vf5#ulF>5Z%pG12k?vF-Wr@yh~INeeuL$t>0C zyp?_-eI6d?>`8PJ-MftrP0?>R)!?HyhR@dqT-UNFEA{efUiJwjvv@(J{?Loq z#9l%7UT1A!OIjnV@VgAAM2e-o%H;8oS53kisyZijE)E%5gXeP2((-vVcW|J=;q>aW zG!oZxHop*TIj{5VbCsX?f0`tH|Bjw_io0xAt@VRmzeZxt`H7iqY5Hj`P^-)1B4R05 zjl8Q)JYtjff^`i&$UL6R2!8Wy8N!ol5B(#TgR4_b4Ubx7 zQ=3`Z1u*QU>et48x##QA2^~a_OHDcZJop-=HCJ$bMGd6o>{C=OHc8SW#11Ua`C`Q$ z`(*ydFSt1AduefN3f$ zAB@+c4+)?Cx*2b%nl06Qsd4ctRd4h++Rv}CTipPL_dvT@r`x;FVtt$P=Il<079e&+DD45f&iGL!6JECRdyPc1pl zchjHtcAg|_ix^a#h!u?Z^NYU=mGM&R&VK>fAsNe= zZd9iBJdSoq`Y@!?l4F!}m@he+G*&8I#vklq$skMfg<0MFMyj-i_IF-bq3FnfhJpKM zo^a0*>y?V@j#6F2VwZl$^h_oK(d%E~TUw~4E2BES+MIe&oXQe8wQvdklwi^`H^F^f z14rPTg$PvCVXG($M(s=L6wGwIse|uOjGWmU4jHAD9}DNUvig{^pk-gF4TXpXg>)|@ z#SMeI&4rNH)CoXTBnDN1q7p^p?l?bZ5gEJFi0G2~QkJqlhPUnu&(8 z(w?%h=v`ABc)ES&>G9yXSr|&$Dz?OkO)FKBiw-ti01@tzNw=E5Ub|{ydreal{Wmzq>q=SC z&Dn(&3=2RDi53!ojGq((q#zZbk&N-rBZt2K!zj8ocANCfVsmp&DeYuukXFbM>dZTS zK3V8xvV@uBI9DO|&_%X!HG9Z0KZaXMe`aW9){Cqhg!3vgCJy~nYJtpa9r5ET9v3NR z^*M3s?#Jw&u3Y#ke|GD3y`7^T-D<&spY`>y9&1Ljg0&&d>$ZT&KM}1H{L_svVSZug z2H4hAF)l4xX8#uYm-$lP<#Fw1`ns+D_4++$!!f@2V0+7M&@^l+WG0qi$;nb*i1+vL zK7#q=H(-Jon7cwTN>3^0JKdk)TT3>HhUe zyHl7TNv2twKXAnRtj6iDuxK-X=4p)AJ7sFY>y(B$q#q+qlm%ki-Iu9=GZ-!auhLxa za#fT(bAzPBqyIgUPyxvhi?_{8Y>zKdhv~a4dM#%n>%#9oUUjIOap=}&lcU!9j9C9c zrt9fm8Co1mTvXDP_@R^#fmF2oWQk`QY)`FL$g6hQfZJi(2D5hrkS8thPl*X~d^)Q| zj+rwI$mwjSsHU7bYXfSOu&^(O0>l|j+YUflzIRK4)vy=>wJO}N6(*+EXIK0VwQZ6{#_#@dfU~fpGrtV}!dt?i+nvrs zpbY_#!JpFoJGw2CmZW`EClc*RjIoQBpOgK&oF)+IHdB8ULnKBg{Vo`VrZW! zH8tw1cNAwlOmrEGV@_(@xITb#*9ARZ+XBZ{4B26fyUocZ?s`^F5>B&wyYBeWRd!}M z#=|ahKDo}WCGl(NbulNAr8gmv`T_!J;fuIn!nzEn*Rp5+?rQum z1`FqTOjqMa_@1Bhs?cOb;XMFuqini8R1nAcRt?$&*GlU-FD>@XFaeh8lm=MbpmRan zyCk8}rM%JDjX$t~8T}8Q>l@zJx3~O^*dGLU;ab4VCd|#4-4L*DZFL5kL@7dmPv&wE z=OD{R@m;nZ+WVnkKk=&awx2|ryw_a_eyynOunNj`&fjCKrxr-!AAm;ZP%!UwGnPU* zb~{=9Yz1*5!^P6J#b%jNz?~ZMEpQ;ZLBT%`Kh6U^=%KjsZ>)Y(4WqK(cp+2M7CmbNP-a2ddUr9))u9A*WG75>}qjqDF})aoO9M!ty~UwN9L_FZDvk26kmh51YbgJvxZ*EyE@*!$1*AD&*rzWJ z2<~!EtF{Z)Cz#$m{1d8Bh0Cks@pAL@9VWz7cJ*I!r>qEZ z0I3kt;`8C3YVRu(b*wrt@|gf;Z(aCZRP8RwBkRBniNQAq^V*RamUUZ#-`kW}X@XyV z(R3d=ay-<;okP~SlGt-{TU66d0(g5>+s~H^=vU+3GD9w{jS@3|qD^9sp^5zi?i@UJ z#@-2biP_TNLW~PaY9QAG4ZxV)&3eJZIbv7ksc#5{bEY$5Jc25tFQ7qcK_0c$0au7FR2^kr=!5U$YhgKh3I5~?P&P{T{$#P7W)#UQ2Z zA8Yh}XjKpr3Ps*KTXEq$RzyH)nTp$xTeE(#c^9XV(cOnlh1g+zzS#k?3a1)wQa^aW z+)8zfvbULjZzHXyk%l#x9=ifoZz@$IBS#puaX|$ByWjgH2P0-Q=2Sj(mc4mNP+kvd z4&LBr!bb4P0(m*ElK9QGf9m~0U6BD{E!{`cPC@Q_gGsX`8>hfyyX&sII@C)8q1!=0 z`M?YjT)qz~AD13upEnwF-pAQq+8b%u&pdB*y=Z1{Y|G3Xj{9Pen%FTsu{}+O}*XiS(srI(LPuVGG)^1 z6~i|I+E6GjYC3~wV#>Vt1y(>_Wr@KQB@TlrFIXXS*Xy;ByJnHQW9zys486(Tx9KzK z`{ry0&vEh4h1iT5jKqz?Wkfx@kQ7ma{=7;CVz&}>+o!EX9>X*WS=4z@KvB8Ie~(9mMmaga#Dpt5 zQO5H!dl1`wn{CTpf;hIW_0W%#9&aAo& zY5h=@8>|;p1zuc$Ek7esHjV=*SS7PkHQ6aVKGtP|UtzjeiS4hMJWOU``D?Mm!%j&S zk50fjA=~4DQ*cY^1^41|Ykhda-@q?i+w|eTW;W|QO>k( zf=$Ep&}pk5&2F{?a}Iw9G<`EJ=314$F&}ZlIMlmEot(R0Oixg28AAY?xi8x$DF>*B ziVpDl`lpK&y!0XwF1N*WLax~ypM)Zku@LFv93PLyXQAB_vgplEJT0aWmRSdyE77n)nhRKd49IHR9z(qve(cuUd16a+nJYAa}pI1sXO?3 zv@))1^a1;&>HVA?UR}|mPEd%Q+207RvIt7t?=dQ|qCw9?$$%N!dDvUy7vsb1!`k#n2ZKQ=;rVBY~ zH8-UPA&eas!uiD|LZVKw87%jXoQ;lKhi>co26Fq9*rBQCY&H_x*GVMy&(%{K>tnNz z#5lDg!RDFbI6#ya_e;A09yPnUMw}Mr&Gq{|=EjFLG_&HBT7l)Rtur1_#==B?bdljv zJ<_>7KD|M{^nZ&$q5mWhYZd7X+e>N=!$}SwU=?z*bY1H3Ge6~U3Nja0u-275lU8ag zjERMCXPLZ5s^l;4{JXduY!wI!0BS#Z3Y(Pxk$pr<466M!7?zdH6OKi>VT z|CwebRct44EbAN@FKlL5LfoDd+Kf1kF(;rLK6@+53aZ}yCxSUWU+reP-O4=a9M#bR zQ)4Cmt48oohHF?~eSa|S^*rlaz+TnafC4r0D;Z>KcdLb|2zlJVw?=Z9RVBpyY6X%g z!-`!>B!5i(^?JK{SX0F9zK3#PPScyy9-J^Huvc=_=TA(kCs&lKGo!3O^gU6-QA~o* zF*NTl6;6#a5`n)kd)q(Ckkk})dMC{b53fUZev(q}@no#t4jvREJ3sw^GC4cL5_FJ~ zaBmi6%fd{R72Ik2Q&H~`Kr64I zD+@i%gO>X_bAlC3d!R z#Fqfl%cLsR1uHu7E5RUO{&}VCz-)@q<lgS-E(5UJrEQN+ zh;k115il2NY@oRTgx;y8@0$$30W?Cv=jy$gP&tB=(c=>rwz@w3?}&*bHkh!HDjc9twLAQ@ zUNggQf23pUaHHh2i=(L1`DNSyy?@#Vl3{0{NIGXsTEuaN%8B$ zgDZv<1+)L9`XF9SNYgbv6G+h!w6#LaELEu=?+E_nVwuFk@*$?)C(CKxCt zNKT~`1f+9Jq;qt4cjt&lML}|slN=#k(hVZr-6d>HtRKb%NSg~gb5cClOvovLb)bv_xy_KYw-|cAcAqKgnqKtH+<>-)uC(8pd1or z{YXFj@ce^^3tTTpOiy{0*VWbfsF@JFEdOBvh*ZtdKK~CB%55dE&Vt4hsL%Nj;Sku} zR5Os#wA|O31HpL;H(e}?k(uNB-q#$J?MKIrHwfGGTu$LTUkV5{0TxM81);-?#e+1& z?INK*3qLVTp&n3GODuP2YLw9=ocUm-1!)mTo!WysKe{`2lz)u1)^|In;`vgfwUoU^ z=~-qz8qS0CcR=UnD-;1MVY99F9{D|s_t|?v_0S1h3*`u#iT8*JVud5$I3Eq+{gHM1 zxvks<2?mM8=d}(Q89sTUpeE*7lkpHrbCxV(N5n!>FlBv{``dSL5|I}H%Vw_zw;!{n z?Yv7m*`cCyTj}bIwCjQr#-5#}&7lB0EzkQfANrWb7Itn|d+q^sJXyJ}oHu4dc&L08 zgp?5srg@^5Ft-dO*^Bqz(h124T3L2`(*7z_Scsb@!-kR75PsN)_@e9h4OyR0p_Pag z@&1+W0t#KeqjiqMFn=LO>eOY!ymZD2=SK0&ZFI{UVejq3&o4#JK)7hu*c&^;78r$=C9Qi%|_=5;GJ;l8+;=LCOuYa15 zPaihoLx#{{$Br0b$Dc!qG?=Yf7dmge5LZ@w#fHKTn|YzUE>?#6BLq0R66g#EbF#QodSW-X!#SdeFko zzOT(=94Itd8S%L03m6iEqZnQkN-;2xZ>tWa&mH7SD%IyOSB6gHgA}&1fBf`2u#}8+ zIdybqqwr@4VoL_6t5IYtP<)A?Hufo9E0b%JE*^zFS0CJFt?Egy(b^W^T(V?&wIGS>laF<^hQTfIN2t~^!8DQRXfMX_}8OT4=^ z=MA&9&OgcxW}C_q$M3xTutwwk583KqTS7J%H|jV9-KR4dbC*p8!g#C3)H8QY$%krg z6Mm1o|2lI;o|2SMl~iPoR~!%*x>uiZ)~55nsrUPu?Fn7EkrkHP$DcMVB$vAFj*=7; z0=neL)>N&|S|o1e@kXVE9`=7L1Z9C@&E9jVGkg{NxplFKi8mG8_T{Cp30}D*by?)z zCg8HDd;BDoo<0b2pzyc{DX$_#w|143IL`PC7eBT4i5d6EuziF}_3s67OB^TLH~%c%9x`_oplCn7x4enbeB_hs{rM7zFMB?jnOX z*(WZN3?tq4aqg1ZK-U3FcM{lFBCpuKM0F)J2zcgb)W%9c>EJ=sOm`tod2k z#xL*Rb2s&<+2PY)+xbccD;!3zk1(^6kHtz5LB{wawp9b$wc-@I{PpWa(654QI4D5A z$kafy6?y7uf$F*Ya|8Uy4T1UmSchbl7KMNWg>C|P(*);o>Ci^WF0)4mPoJopl?8aspI?pMxw*%h&88%>x({KTfcE3dfvB|2k(`|8{jXRG#}g~1 z!RbK|{-~cSB<^0{p;U1b%Lgjw7WQ60LteVx)DF_lI}>$UR8Bj_(=dV28+%7Ib+c!RI)R}>DVm8*L9ksI^D09 z#9fe=>E%TsLw+hv+!T4;pSH~r2<1AcRA@2r;0?<+)7ctiGJ#TCCz&q`!{49+L0ELs zzFLr;{Z`B_lV)H3sVU~&YzOrrEgY#;gcR2giKtTmLe$;lJy zNzInkKmOs)DUzdLx;C|ftXWLMRIc_AGR`7zZEaz3St5rO+l|vHrFJ}H{rLO-JEr&X zXPP2wZ4AUK@#qMuTG$^vLrY~}&1RipK3fxxC(0rzSh+4p*+MDYy!%`2NL5$onir>= zxd8CWG~-;{_(%sSCf+b)s}w4pO#-40o4Mke?8O{?>Q<>W)QS!-@CA zU^KZHxq#HiYLs{Oh3Kh`n^ejit+?tBVQzqsPu(R?!E}77wFC7LJn%7x-oyRznO`Z6 zWeOcB36J%p@i{B-Q>q=kC;tAiJyX~YPn&{McYkgu{7pOlm*6~WL@U)eoV+`r%pya` z0o`3;W_9@_+s=2L=4KFq(HX%`h_@fNRjf?{ z6&Ahj?WA(#i%yw@7NJ+cx691mB!n&OPXW|N7baWxDdmRG>#!Pg zyVb&>v_-++T0{4x`jIDe9o-BIUckNN&sDRO$pZmDCrt$DS{He;3 zw*GUo^}4c5)P&bHXrNJqbeA5)U;R0%X*hj#5Ig1S28@V5A25qq^|8@pk%Ei7v9PW| z({ht`t_Agjs%TLlgX-5UAs!3pIC*6s&BxRE#HNTZUDY}$73NEWy8`klEWnJYPfWV< zy(|*xb}VgG{`$^+187F&H|sy)p&)XFz=YTpmGeJ_JnZ()DJHaCt4U8})=0tSOZKP? ztkd}kPJjSq)=_Tki6aHVjO1}%P$9We8`MwKdQgPYR<#~Za$i>RlApC6=DXT)(lL0} zmu33`#<_cj;(`_*@0p{3O=}F=8RcS~{T;r5hF@ku2bVs>scY(az#BX{FEY+At+F(m zbAGD*rGr!vTzTWQcPWl0**Y4!to#)=l`|o=M72xbNy7PGcz3UnYFrrjc5sqWmKdud z<1c~^>Xg_hf~d-h!dSK0ggGl|(WveGim<4&ONI;E7iTROC&0ju;7*X$;q@Q}6bwov z)E(i6-RHL1KQkl%Lf91oGiZ7O{ez_RmHKONk#=l!&DZfm0awLI0AZbcd|0Fay2OdU z`7RB?!;7&ld^)nbpMtvcumuFq2Aw@bkm3kfl7+AEwuV9Y1>vbPB|cl6dL!;_WHFEJ zuuL)7{lf(07iSNtUgcv$M97{Ub8Sdk8oL@KhAzO;ex6T{VrFXlsn8vnD{Io zaTN?Rvw`egy77yG;v#a5iL<`rDYOtKez_9DiRJXd+rw*?QWG@Jm{#c`t=X9ql7*3* zQWQfS^&vYH5A~5;631a)+cJT0kTKrN>+JT=!ye#dK5)OZK9(H4W0%t+gLD?>YNHx) z^t+a5M>CH5QD_ma?50CUA-yBSlj9lInCSmzbG9EU2RBoTug-Ry9p3far+(aX3|al< zS!O3AqGwNdzax8YeIa0BJ%@gSt{Dr2#J^!|e98*I;8sCu5vM?Zc!87!=W3xf)|wI~GfiMb zwfuw6rwH}7H2EX+tPu!lgNl$H+F+5&XN+bIQcFc!YJu6wj8Q`)HnC>$59YXT!8X_H z_No*r(wEJ8IyqQ1{jET!YDOLFH~)64GC()~rJ~EhdM9H{ziAa_DyDW71Kr`aK=gMYdAo{19^7xMm3Q&5%rNiEQy1$=F0bM2|a7W`OBiOmc>c~ zU4vpnes@E68q_6s1cCPx0zwp=u~G^0d$4-5*L0c16R9k4>eip3%9} z49v6X_(Yi3Mt%Rr|8Nn;q{vqPt7qLQyQnx~sh6iwC3Nmx5j!EG=lu&&#*dRLrO*FD ziR&WY7cIbW#(*+EO?$? z#C(pkh}%v1z=mWDz)$kSs`Xn&-t)cuMyq|e^`EA-m!s5i*MV6c=sfet%m1^Yjd$vc zSygcU*RbzIQAUu{_3}-Z27ma;A7J*iV2H(>%50eYTx5RPbS%bj`r%eAdI~0|AYI zP*Q$-1L$UL6!8nYgGO8ATqK?gpUKUKg`MqpvV%90X|Xtcb`VZBG{`)rVi+93A;I+>E=fp zEf&yTp?f5hQ~;~>b>qnI(c?MXH|v*rS%kHcl<#?$Fw_v5!QzuH#HK)_*&hDVfr5N2 zh0Hl+tF9(zCOIWS_J?*hVRkDNI$PW62yBP?+j}FdPaDc_PuWz;(I2R(wUZgfR;iRfeoH&QH$;8>{Wde zGzY1yGUAfED!o?8JUZmkV%!uN_&?c}UyDin=N{b`80p~mZ$9^&q?lENCY`^ z?Gk4_eJTM+m6Uf%fSNrdLttEQOi_IKL?=dVD$H6Vk`s*G*l!*~O012@mG%RrDG>yH zt!N5Yt+NST;p@V%)f8vGz@ub-T`^4O+u+Q@m^6vh zq{k5TJR@^jDM`d}`T&d|r=J%i6sAI@uo=o%bMB7kaWkh$MMz97b-YILmHpH^?h2OV zM(+m^cPG@h{;o0Lya-qU{I1?}T>Zv8BvP@d>rkJ47=Ec7zS}_Shk1JjCwGX~pk}%~ za9r5ch#XOD156%Nm@4do>k{}%^-eNaAW?HveoiTNY_@#_ZYn32xOUW^b>GWPgCs%? z_pRn&< zj)_bSs7s&%kn$PXTzT@^GbB%*w(R>+teYuhMn<@mSQs?tPvi-8Yp(F;nPm|xhe(eO zK(m}>70xeTbs)gFt8n~|W8HR(XWzj@cXZo2e{I#WDfD<&xz=h~;=O2ig2Zvc5+lF) z+Gv~cRufX*^3p3!c=AW0ng1N;!4rxM#FCK1$*>S`2Uk(sJk-+6%FK&k6f=A|vwE^u z4B4*m&wMJ8iNfTAu*gVTOeeqvGF)*XrM=@n20-URo^Iwcn3I4SU)GyZe~Z;diyQBE`}f>FE?~pVE+PhS zfGO%p5=W-Z8yQeGasG~{UWx?igt+ul+X)?^YmGErX(Cjr_ma)bYIp<<@wP`O9{;j> znQWZY##quj;fu|M4WQ%mLi$T=Rod@T^_$Ex2b9pou08m}*YR?*6HR?saM9|ZUw+^Y z^s|J|_LnXvFk^JPq6JFE1IBMhPuB%_MtSAf9HPceFIw(4Ara}irKcU*p7OzPTE-l6 zW6q-SYQC%m+cfD;S92jN_$sMeGJBMB1K*OVgg3^EQs1?M3LzJrX2G!h-HQ}|Rz+g| zk^3ucm&0on`eX=ZFr+FRK0e#HZknc1Zti;`_O_Iv2efN#+0~g%sM7@BmjEc2Q>r!= z3h=`wLY*1}5Fpczy!v;CqP-_TNN-p}5IYrNp_76WuF_H1d`@*)vJeK9cly0H_v=sL zx^l7TJqpw+(cIIpJ96%VJo5XTA=uRo=lO2hnH6+H#%Z`UNd3%Jhm-Gc;~+*-kFSeq z)s6*bO2F97gx*VRkKYEOb#z`K!dhr%ivMq+igKOlc<+WB9THzAEkFI(Lbz?F0Kf9L zM`Il$Ic=MOGAXQqkg02I&3euTrzAd_+Lz`7U+Oh>X@repc%EYO!UO^DqrfRdRA>_U6pXN#W}d*vBA& zss*3&lA?>#C-s1ni3V%qO!} z3mhLa1Z*uyRPxI%@>h{d#CN@ZyD3TyZdwW*X_NZ6zni5lww5Yvj`}Lt8j&D%?C^0O z7Cu8BBbrq1d_8!lSL#^d36zFqJJ&=EZnpQF0yUc1Q-Dx_y`=?QRtZ##a{?droG?;! z@AKQ^Kjv!3UVb8$Y`&7^Bt1H#K`y%_^KYzG^)MTa8)QY{2^Eh5kl zDt5}r2vfnFGfOir>IvDF46iEzA!x>M`Z^y4*;*M6O#$IC-8WlSrJFs%5QFPZdNzgI zY*(kYg#dz0E)myO6+Cl!P}1bN7os)ZVn?*=I6jRJb!9H5QlnMWx85+Oh;We_!jA)P z(FrSjFc+>A5`0c}QO(+nA<3?DiYS6K-O`0qd_O}X%6ZMCu6?M*BRY&8slA_isXz!-(qtNH8mHTla?%rdBIuBHeI_|O|JaQp#S`t1JuvvqE>$Yt%^kE8+CeK3l7k z;`vLLObMn}yvMG0>ZQ{n!i4sstnj*I-w-V(EaeEO?UbiCW-AG9rptDl_5@BVdyN+7 zRo+;}Lddwd;SKh91F4+HbR>uFqZ%v&{SmAdZ$ZF=ex|?Oar7ABvE_as+>jIl$JL{Q z#DTdGAu#{3(a==WX}iSE$g$;lD1Lycn0;ycE64@cnyKYdt9(gn==n)`pO)4&baUi0 zPVR=Xf~jJ-Ft7REy&byyw)b{kRt8IqIP(Q>$mB5i*QSKq1fkjwLK)-zPgixjZDc-C z0SgZ$2J8=-G)u{(?gfImDK;E;`GTZQKYSBCUrj9;mEvML%Xy-E8VG?}W}v=i30n+t zNWtFmTqHwYb;p$q*o+@2ytJc`t2|-Kc+J=!>zbZ!Q+aIo2M!WQ$>tLXb=+Lh^VYRf z%6m+)?P%1LcMB7)RaynU)^Zw9cORr30i0d&@SphRlXvzSQzy5GY#sN@iE>W3Ux zgFV=ym4~9~%FAexj2U#%KaxuQW`_!>Dq{P0SvYy`M!(Q3hWb6Ix98B;bzc6;?*JeL z9rBXSV7CI3xri?vvki<={cKK$jw%CB6!m zmQ31b0B&`dGo(k^uoB0G580GDq z*9l6Ff9uL0=#%1Qz9mig071uSnsQ?mhpuvXoDx)=%YefJTL02B*jeG(ReRZ{ST8g_=mQcWm?Yaa*I${B404FVSC$HnTVtAOA)X;p$M-+%(4^pZ z*goOKFyA%sE`X%=LsYJr8dZCw%L^8QkWvyP#1>_|dGgK9sIyqLt}v+A`5wpa#geYA zub(AjEo+P)6BFUa(;dWQ+Oa7lyiT5`2QW%^m#s=V*}H__Fd$E3Yox!&`uWO*LpOgE zQhP&;RFl;r#Q84Pst^b6yA2|9q2F$2Q_M7z2e>r=pEiQ8${T7a6S(CAzEoOr(4)nP z??+yU&r%_1k*CfT{$=YrUqjk@>o?&8!VU8+g`8yx+C3xa$mZLG10rP^!tAE5UzKh2 z^!*9PlaM<$y+ZxrCF?wM9py*Kh8p((7eqb_->K0y+L^J`VmWs0&=E-nocAktS!OpPQX|u4b4`B%I0~D7)?Us|zWZZ6+D>=oV!Xj4Fw``LU*T5l zTYAs@03F{Xmm!~x)&Yaou{%)8m1zAE^t6;go=N85^ooH9*)DswL09cnP`Sw{A^Aw{ zMSK}kYE`O?2OB!&A(-hQ zOiy=%D)(N)Pmz?<+AzA%!m&mklZIJm01t9EB;>&_`x$o3pTi^iHug zzf<#a=EGg&0RbLDNC4H9LImptlEkNnUC;6Bp^as0N zkeaJYqa{^gX^yMmvt=ezpNrmvrhxm^_!*c`>rXcXD316sy>Y+cfQRD?I)o6V3tJIWlBUF$29(fR{GQY^%JntQMBFEx5SurZf-N3nS0l) zarghuV!^19J0EM~Y?|Z(r8KgZY-`~JT}J<|Jw@RDx~jF|-<*JnV{7QBXh=;!J(`Uw zRtFGxibVlAwP(edQjA(j{=;0%;(zl1Bf&3C8}p(ql`s>O132mdH!hrJnn>>~&sy$VjaPgv%*m%6otnI%?se$;a>$uSVpqW;AN5Vie_ z3wW#9uKC~4%IfN{bGxLP!!V8u2+(&i<}q zZ?;}|6J?fvrW%E-;vM};g$Zed_o>vU4RXM-mU_by;hd(FlHN6z(SIH`dI0-m3sq$3 zc-4#V%jK#O6GsF_DQmUrDH8$6oO1ciOh4<^Wk&xm!ACHmXGKP<+|6-9R z6#S3SjKY~;#3!oQ(o-aFF20 zukEpePnHIejJ?pbCt9id(5p8FI_Q{`aJs&7VR0W)l9Z=BGXT{0jla-9Mg9WjcDVSvwB3Nq$x3Y(2(O#9fE&xdtRrcvOBOkF zT<eN%vc}?0>!uEMdMTFa2DR2D{0Dy|8`Ad{@P7Dw(9GGZ5zKKb)OV zrgXkJd8rJN)xk8WIXEEwo%(WV`O!t(YY*;NKOcIm3wo8+(aUufIkb?yG_NIc+5|8% zGd|H}N)j%t)V7Kox~j|yVP^<{Os3N>Z34!0%<9tAqd{Jmi0uqZNtH#jH@a?`cU|89 z$GXAblUS>KKk*^CZjH#<=wZ`OWk&QIsyvYWvYXO0W+FA4()}H5nbgll-ITLe(PfLJ z$9c(30@{OJQFTK$5!@SRFUtWx8`oJDSjL5sgBy}>5NlsUD$Bs32lL&-9)}M3p&YZ{ ze%{(?jm!Y0LmP4|^=&(yn2aPQ(uR^7vTkcCn6@v%=Yj^MNE6Y1u&(|Q9n`4U*Yviy z>V23sXT7s9?!d}Z4bpuhhL!BJlhko@$~yG$SO1M9R!Ug8Zfc{#XJ9;lBxp(LU5D_e zvs_AOph<z;GW8Y1>gzW}FZFCE?4|7+iP$D0|l zy@cJ6daTR#+79Wvpa(PPUTJEhSeT;OP0CCrk&SiEXUG_gq_fjp8x3K*m(AvbZMDuP`nF7_^6xT{!36n1drP!QwDNxjeCY(vCdTZkaZeEDM9}~K!jzaf< z)B>y;UZeg**iStJt7f7P#20Ku1)6Pv!H(=tFFZ0V>~h@;FGOu=6uTufp9FoWBHhRA zAqdw^mnoX+Jl#JC6Hfo2sw< zEWP1#a@=J0-1yTYeZH6ld=&6QgG$8Ay8JAhsReQ{kx<$MS=f~z9IK6X@|_tve~*L) z_83eJB{y2pf@?=5qU|ES5BcV9?f*x=Ldg47Zc-p=)Y}R>8z0w1yYP0vN2;gW=mnzkh z``04NI#PiOYy3t!-pBs@9|`Mqwb}AW#|SA++N5*MESxDs(*;s#!dXP??|aY!i4wK7 zNVcmbJKHy##}WsD2}0IdhdJuM4_rNsKusmDj}jGAoqu=C`*_>JMs1Z8>QDJ=fn#1Z zt-O(3;}C>0iH8e;FX`j4F!XYhqU$-^i=*pqZ5$L9SLS-&#u!d8T~|H}V`Jd8+vwc~ z*;uFPao+cIYv8OjtJ&+Egr&l(ipM!+H;$9%Cf<({y9#cn5)NC@8!cVc^U=*BuMVe> z*~Qt)p;Z&&U^Ky4HFbymi)f#* zf%`wNNOAH9lU}qa2lqB-Ix;n&YgFAUEVFnq5*1>_qK*a}OPwA%f3QpIQrQ*Wv>vq4 zn(do8p5eDnOM*XXcPY`mAL1j~bEkXgCtTgHuWY(n|C+FMUMstF_EOWO9(lL{FgtJY z8vf`Q(-th6Z3S~WQcbDYm9{+?53%kz*tVV^Or!<%VY5hPM!(yM8z~sHh1xmC{Bm|+ z=Zsc08V}%y`L~g0hwg)SLUIm|{-a{0hW-C4){ZT~;Wp$>mrUTc9;ub2NpX68Bf0M4 zaW*$up#%^H`d^dE&gLwAFNxGy=WuOpU)3feNg=lMr6ID2=xnTkN9&MCu%ulH2lmKT}G7Ts)nic%e{Xo3dnh zZ{iEt~PgwNl9A zmxLI1ih(U-L+|#c9&^?~lT$g;bLKyqMEbOI*~~6S^oOyB8ii?VZsf$XME7_6l3z9g zh1jmM+|Vaf$ux6S`slvh;-^B+@r3^Z zG{N%yxf$bouBtS6Y!*x@;!!7hV+am(zzBx2b?l<&;g3@LbJUi_?yeF1fIA zeB-FAEK_9y+p8?Ntj~?0rSN@E)YbJ3x$m3)qwmfRYiKd=@)gMc?CN0&dkJc!a1WR! z_0ZT&LU`44lWr@+RKlJP%!E`TPv*%74IT5EfQnnOH(%FoDF&LG1>|S`$yT>T7ZHtW zm=EDqYHIw>nvXG{xu=sDcAY7c1{z&maagZ#28aU5H>S+Tjq)Ilt(;S{Oq1}h$&GNu zS3{a76x{#XFVVHR5h<54AEQg`oHc$vXKH2mf(5hclzPsBlYzty^t$1If_wbp%MA$M zn0a6PgIOef&DI$GdL#r>tRCLwbP!|u_Y#35$n+w4?s`$r2y4^9quc<(kO|cav1>;5 zISbLlVq{Z{tVuQIWN|LsntF(EJ3+LZHU3}!W4L_L^4Um&%GAxWIHJxW@4x((;pZX^ zz<(PqhfL&Vy$JI5JU=bqjhRTa8JN4+t4v9*E%&7tRJgw96@w|7WwT6U^3dv*vgAUWG*N zWC_}|o)exCcZC4!*@^g*am5eC;MX<}sKNA`YYOg|R?SD)ty!+V#fw_sws=;L^#^{#X16-~BU>_HUE>)cw0_bChTs(HKc)FWCqBD?mrm{0Ew%6rc0lPK z!GIPPwChcCiOmxHAA2Q_sa&D$3aQSflM37awpYgQd8^Xc7jx-J@#N(uPr03=YI3sz zj2*jy2p0F*i{o9rC^|?iY5i4t1g0<$8JQtM>JQRS9OoZROn$%+s z4=YV$uznE)vlXh^-a`0v+;sgt(da4N_%^brY!Xo#Pj(BT;bHc>4Yq1TdBzc3BDFru z%;v&eW;rAwF`$$6rL(l&bHd-SGw*NB>EF>YYo|$5jNf(4TRMQr_suI|mwtcrneQzy z`)=CQ_=Kgp(&W)mJy39W`3HMRqOpojvyAnqZWc|t*wVx^RZGB5D$RbYzsprVh4Z+v zKF|!BpwfMNt`jF*`)*6}y(IK(pr#|2NpSdHJbFVsfOq*Pjh}_-cCU`yrwt<}$y3J# zQ}cKlFmFZ2_>Q^XlcY^5HxeE2l=K$UmRUKk)q2_xHtDvJ1khqPDmcE{H&kP~qEz;_ zX~5IelW){KdmEh+@}%x13z;w?{QGyPqu%PA$ISTYky1g{+l9XAKgR;NeszbVhzkSg z&XguYjKqSeKc9yS>u(?Ld%9$>D%Kw-IB>l&`I?_y%=F&3hixjzEya3veRrB3F_Zkq zQ=bw&3QJ!ydICB=W??Q{bEvMlE~|JRhzX}-Z%t*{I**+~R6z*r+;A2fsjBzNQETT>9 zD%EA{TdVikVhN4nVwy(r=*rd%tYH*f$I(|#Exp1k09zWJuT|5{Y9*QlHKj5~rJnx2 z*5?+gZ-T>0DzLHd>^#E9l7A+yU8u1Capfq9I5uLzpOvPA3)f>SY-1muR`B-pN6Rrn zH&hKu)O${S>uFc#vU>N?VkMFqPbo75rl9o$%=3k9#gpmWRq7_DS~LYagM{SS*u~LV z(y??;zz4dCem{kl+2y5^Xl72m+>L0$*YcbV&~q5$wFI%t z^7O18?CfNubhj(r!invcZ~30ynGsm#rES2tNN?SCCd+D&iL76t{`RT8xA%A>hi0AS zHrSJr{_tCcwMMV{dXEM<)o!C2s~Kq}QNKy$YM;hKm$Ulp1TMSuBcgWfGTO61`It)( z(2ic+;^pd)bSyhms-G=o&+W{TXMwre!bNy6+H{O{+cw_|jvN}7Zg7Yqz$QYB4;qao zf{**jE*(VH=9rD9tdM<(a_-PKRPHsLTDUGe*161Y3JniKPw%gX3Og046te>7{tOtGLHVNkoW9s6#$}O>Rw@jAf_TtBR z)@Hw`9s`lSeW*0SQf8OFo_ay89A+)JsBlbL5VC5;8{_-TCD zX8Tk06?sW^NLxG^(&2SH5o_2lcsO#dmC*CWg9fS?x0)x*Iuyx+nzP*o9_nu9XQohZ z?#9Y{aCNkw;opwPf8hnix0SipONL>el9Nn^+^Q^Xufw9Pg=#UaaXXU+y2Zy&nhaOx z80*xHgK%0jR&TX=ge}RtclI5$%SzJ{=AavlMA`Ua{5p{|q;0h2E0A!XTeIu;g#r0H z&vs8up;v~m%CQDRxVE!uE@jfODa*!WrS1T#XGmMAlO@kHOn#jGTbD+!mz8<1`TQl7 zAS~eYSw&vF8P*#7LE~^;ZXL*_i6BXNU;KGtMCv#G90I`)hWdBszCJ%H!iN`aG+?rm zv(rp5FD)Z+BGf1*p!hp7tHXa>U_@*%LePLt=BioYP#zRTPUS>f`<(i-atxqX}#M3jUDeQnkx5BZuiU;uVK3l zb?%AA)-_vvOVI!p=D0IwUc%%p{bWYj?cHHICC3Y+%cfIwB(j$l6+@&dLMZbh_!4=;} zGtu{0OMOm&i$TB}7{;GMAS+t5xGzPd^*CwGDk`^?x3x#bT6zBP!lrMny`}~wdB26M zzQFbfcKF!hq9bCuA;BX>1Lj8dk=@PM!#UNgJ6dj5Zq|*OWhG0z4y4PYL&I|0XRpII z@`pIBdx;%l1SdM`brp?kt>Zt38*n}A(6~C!dYvBN1`K5B8rhphcjLuP+WhJPckFk* zKF?wr|IYfu{)Bg?OFKG`TwNEA158e>FahQ$-{Z7ABTO`+u=dQT2Z5T~ln;U(|C|;0 zwhFtRwItOz({m8G(>WqTy{l27zL9D-`U-Z?kHq28LPxz%OHe$!m32CnFlj;elvWR> zdf@ViFL{daLrVb@L4))^t!(n(iLdjo3oWEQb8RrOWzV|&{t@E=Mj*udbZi_~!h%J~ z2AF{5n*AR%<*Iy@rCLk|6`b=87r{ll0(Ag z2r!Jd?@X?R^ynx?K>;x$H#t3m**bavG~6bf*4*zMb>Y?|%kT_uq^;dr`5QMd6W(9MqArEKYttSD+?MAne2|}sh?SYYeOpVM0Y5-;(qZ|c-nZJ z_o-$5%>1`FyC=#zaV-}1;ugcDK2y8tlZ{JrZZY8+e?Yq)WltGK^g6}bW{Sl3f!eb8 zVfuBoz+ATC$qg#hoT9yfa$yN`hZ;iDS!+S^!f2D%qTWZBi7+^smSkOu&y}H=7&Eg_rf?jRXf8_ua5N4AsN2e zQ!G~EoXG5=nQr|w{qivff;IA$_&(vBH65&y-JEdO4-08^wKw!nli$X2**vR6HFU4O%=czwu z4J=UGS(JcM`G_wug<)P9)mx1P!bVgZW9MJWxALH!aoBpK#{7k&n-4|_Vn1-c-7DVU z-gZk!AhgITou#g1Wk~lXXlt~GSU>iQeQ@@*l7=JIe2rP1l)QGJk|+DDgmBOEeHo=0 z7yM6VPMsM-l=H(p7b@0mDNa8+utG;K%m3%G9R@VcM2`n96MOh6_H3n5*=o9Jm6iKu zRBwyeEqDCkbF`qnsDc_bVS-IwZsVOEYHw@cvE7Kl z+$KEVqvhw^ez?^|cE4+fBbLZ&4?_)F{uk*64TjP^MQ5!|zH3NV9*F$TdM{sq0N`q; zf?LC1*mle6Qk)EzPKR1JsFTJ{7`qtiWCD>rvf9t(`eXx&MmV?U1h`F)g1+2K5xg$L zwOay4kb?R~IBOk7)Up$ocXUepCS)pu68)mHUU8HhTu5~DS%{%t9L4Udv zwQHmpVV>>!Gt=sqq}PQ})WUO~vV@r@Um1Q?S7>sOV(Y^*IVN<_X|6_o-#mVy(x}@+Xm| z5Q$1BRnN!6h2ql#1f6zT#iW25aaUet-g}i(rt0fE52PQ=WL>$;J%6Yw+$Pwt7UYh- zQq&5hQ9ww^k>qkMWSdlqn#_*9ZJz+$>;Bgfq*l6Yor>Z&+=nQ23$mAx6QN}v#;K}o3Z3{qk)m1VZ}ML2IO43U$i)Ime}^B?M?B4k!SDq z$BWN5E?;~6bS<>J{awX!>?Vyv!zcJ{w>KFe5&7UesPwh~0cb(K{YyF0V2(+S2kCXTr}Ek)&Mv{eqz1`*`%?KSLQC zPv~iKrzG-RcSb$l{Ta|@yVG4{{|R_gP;jPZ_I|z3(9n;ci?Z#*Snb<8;K$WMSMTTI z+wfe@4l#xdTx}r%0bG-0fATUcqk)-6H=L?3`byU+bvR!v2oBri_P&nw=%2i_V7@tV zluc=`B%|<))n6jvL*s0F23UxBVnv_)EyEo1!##OgW6yxu2Su#sCqI9%K-^88ZgTQR zjEVjFbX!RrP0U7Kku85~*eJ(bBT@Ov1cl($1CLrFgKZxE9kxKCYzO*1@2DVPwfzxo z4L_Ogv1haTJtO>3Bf}z+n(j`m<~oO5>z5VpaZ>ls>9)WF>7g%UO2{1IOMbFw<~zTj zUHU>ds&&j=UXQz6FJ>>lv1zDt2Yr-}KQLJ>VkSmBe*71-nxenJOno1E{XXD9)T}K> zGbyYbSa?rnyTEp;5|J_87Vis`tjd}qv_-`%R6(yQ&PQKNE?nznnox{te_x*Pg)B9P zTfimf1}rY2;LvU`V*9C?ub=Q$NjMqR02v=jb8sd|jWy><{5OcCg3Xjnvf>0h&Saj! zX8!4{hqXNcSy}4K>TYyx>$%jg-=f;pBKiDj%NZ##irhxOH>w>HO69A7G<(V)tbF9e zia+>(U?(T_8>ZfLby-&=VP7VQCvS3srUyjNC$>=2+LVK1ClYy$F;^72XYQUIJGh)T zYAWqX4rCu+$PRqSU6HwyCCb>D$POfEHilVUr5k}sF~$CTbO>`=ATk`jJ@kNC>(Zx6 z%V|s~*_f?Ybnnb9uh?Q2plGE{JzTr}Q;SnaU*wwa7N3DJsF#G;&pG@1(AJ0?`xDLL zMM~IXBiWL;J_)$T&PF-;g$fToyp0k^fd=BsxuRA7JVrEh}-O<@ba={ zX}5mvTBM(9#km`wRUQLQT6gkXil0L)U7YOyEXrQI{*?`4A@?1B%lKyS3*P4QMj`2m z%c;i?J)=EY#*_`G%z1aFYraVaqa>sT*Hz%;pCH3VA_B(OCQVuAHkTePOPYjRiH?(i zlr{rZey_2+#J~ISRJMMu)a=_yrPv4C$}780*LI<<;>~3l9$``_K)p3)$1SXt9Zik0 z>kjTAZZBGfX*BNE*UUL%7DN{OUnpw^kh^}twwLMVm9_fvR`V#$QkVHURk$a-CbhBM z>i!cl@G;kN+iyQ_!0 zGoMK&|Ka<1Y~Y740l*m@{>f6ArBI{|^Wy%;Q_~Y6X+)gthuSW^ z#Jiwd8OTq^8B#QMTb3Ihj$J?l<+H_hma8oMW!-bDm|*>xyKrakL0(m-U+Qqy%12N1 zyuaziDa!@6O!v$#Rx@6G{`B^qUE`(sjQlUhy=wMqpi7~2Iu9reyFAXnBa%>{Q-=Q? zNK;GSqMMVPjqb*<<>Voo*VZOo(NXuk;5>HoErC z{s?8nqQmBY(zD`{*|JclKWhjxTDvSOZ2W&;aJ(-J4GMz7tJT0{QQK0 z$81auEooN@6BWAv_iP=Fu|z&PR9fGy9)6tAZ~a|vb%kD+FVn(_kN+tXI~DYk%(H7| zuCb9W<(*cSqV`SGy{p<+DX; z6Rpz|XZtf~rv5bgs`GrWxv9p@6%%0}8xm$_7x|3l>AZScam-7u0paBP;?Fca-o|1# zto)NJSNdiY9P)zz(c-=7PA*SRcV@=a+6#rp(uB9O#aKx{J8e-o)@VZ+lQ>|Q^n(2E zRgMd?#`m}npciD9N7-Z^c+b!alT$eFg4^>kOsp=chO5wxRNp-6Cf~9N6Ms_KK>4cX>Ve zN_SXpb6cf7-fsR%m0F=DU!{E$Wtd=B(G6;Qk>pGiTt41k;WAvl#ynK1w~U~uyAODOWIelFCmmPh-D_rdda$bXh+^A!Qv)0wmT;d+Xt?(X^q z30=kSSZphwXnuCz?%v|JR*FIY=ne}?s7&3Ac8fkvJR7^3@7_u+rkh8l(+PFS1>+N~ zo8dXT02c5}nR^}`)B$~*cC!O{Te}FV`dtn;CZRk)VI={C${TyfAM~F5)h3>6vQc@ zA?7)t!k_}Yp7-z3+H1J7c(-9G^N7yYwJf(xIxS|$1Qc0QRN>gh83@jxi@a=72K;0j zi*ap>1>c^Rl3GS0_wbv_3Aso~V7}2HdBQzt?dN_UWPlgeenEHh!}n&X}&>dbfnX!6&HD>3E(;!t!#b^ zsdSx-lkO@{S{Z)!4X$OfKU*$$5Q-FO?1X;Tg-Q=R&t-@M3IK(YvxmRJ#GqTkzIZUc0kOK7_=IruZj) zeQ-`K<*!=wE3A7058;*dOS*H|vhpA0Yk4Uq3Lbpk*Uubo(UxuKd>#U8J>XEom+<&5jns~uj$-kR}*rc2BrA_k$;lN0D6S^xm zavAgJ*I9r}(R%dzH2zq){i(S{u45N&%s@E?h(A`S%&xvv)Y049_v8((l@dDw)nHaw zQ%@eLlsNS2NU03}$I|_SZkW`8$!xu%DN8nf*+K1o+&F_Qbp3LjuPr+5u!x@@0B&fa z_yCgi)uxLp3YpwNDjA(}=tB2H)7p%1#%ajQ5WGI4S=O%Fd`68+u)$eNq$@-JMzQ;N zcVMenYK@NW_3yq;ye;$b2H_hHC=(+a_rA<8^wr%Jo-61*##IN`-#gdOxGN!n8Hp%M zf_n@UCFwLaJrj2@e~~f7o^~D}Nww;VS`S-dZ+i8xvG>J~tRs=g-LHhGm9o^5>KUKm zzM250uk+hdIT2+Pp_2agXeC^osC!mF+dN8+nf<@LpPP!B?*81`7&YA65=MZ**k!i2 zKP7A&)hjOqNCJdNF9{#~Nu{h%KsPCJOd%?@#(Q2#qHU*>;A!aD3)Xd^BViQrbt3SsoCvNNbyNH5oN8$^ z3|A@i?zUw1^v}D9tE%KL633Uva5x=qmqp~wpGX?^3YB7^1BM5x6$}(!!l{+6SEWHP zQv-&8w5QOb6&s9ZOb=_h#T8Z*_cr%7lx9K#H59_3Ou=nLo`3xCyTY7d5CcBDJ5L50 zgPW#kyI%)#_JHUGiTh2r;S`B#2hFYjnmZ*I5a7lWPe_oJ;T`-|*O_I2uM*>~v5}OX z>S}cs^>NVzwyEsdoC@x=y9n{e4z0NALylmBVHgT&u9*@A5pRfsJlO`^C=jRcaBPI~ z>?yog;SW9bsj>|AX=#WSvd9OUpT0z=llBAtxrpB8#($=j?PZ`=GAy3-zOfM!e5dKs zA`7iSfBWX{gUjFdU1&ECzu`yDc+b7#)P^+)6Cc49;SxiB!FZWTC87W<_j%myBcwWX ztpE{CbzZ_39DM)H@tw3n&^pCnT9GA`d%IOaQkNVNl+RngKlq;AvcdKj!DPJ&!lSh;MQocT z(!98S|HaNiqgCcXLSmR)XfP+4#SSHFZwm*AqI{10_V)r;irAJ7yb{zEG6ZgzalC#_ zsAu$n@d>h3k_zO_>hZOFThTr_aIBwQiJI>y zo}+D_s9&u3{b))q)wPqRQzq?6jqHY^23b_pJwQ}jX36P9+bU;QNQLXM#_vUX&1F#eSwBYLb&bWSgWj?d~ipCtwHCcUqq2okIVG_Sz z8F9u;IPx0e*|KAU*)+y11}y`bt-9g0CJmtH=)3s>59k9+#{vJr6!j$kVhZ3p@%j4v zYGKq%rGYUjdeV4dW!_!`+T_c|`yQl_i5Fz2a<> z@VR*8cA2>6l||Lu{TZh65?PR(dPi4q<8qu~fbUO4v(2{g!cQ7mA#B;J5J33&4eA@7 z?beL&#r+-m-H4o)qjM6snKbML^;_;FNdw z_lAKgU)Is|5;7T#p3BQ4qRxLrlu39rj<)xD-54Lhcnpyh;}jQ(1+QXJ(30_m^{x@7 zKl%C?)grf$0oNLxAc0+A1Ht3o7Q2CB_d!kHisimT0YSx@FeZ=1)h^~d$*bSy##1^| ziBTRr#gaob7);KA0NAPgO<16x6hCOX)&Q*=z8Nb?5(UC7!UVG>M_PGH{KckBTfCP5 zxn0Gey|0lYLb>8*%=Q!#;2jO-zm}!Uev$3w z7Qt&?1NJ}J)pN>(P*hckVQ}A3o$DU*&C+$=m%5#s7o5Tk{6yK^)-xa8M39U}hxP5{ z%JsQJn>#!(59*fP)dVq0qOETA>V*%~3wVO39P5xx^*{UM=ZlO}z! z!XU%yhKp(@Z_h@+ZhWmZC>_<0=@{FeHKuaf%RkCHrWA$MV4rC&XyvyPea1DHP_QcG zM)ei$oA%oxX95xQ$f;B^HsVt&WXt!vp5v6sKRDIx6SJ?~{MfHceXY)5a zmzra$n@`&o?dSDL*>g}{J5jxJkxbll5ojGi6U79`It*(xF&;UDDV%G5Hwp)w+(^|} z0pFTCbugKCc6r&0Nwl7Lu|ycr8(`$q8V05ZIDw?A_ zal&y~3j=}PazzD=ThlN8aHMQ%S4r@L{B~1t!QhKeMGAI%b4(ubm@x}2d6V&&K#>CK z(eQJ)SN@mad^NXH4ulOxk{w)T4SS>gkf81t*R}YB9+OshqJT(Vki2PSSznprJ@dL(5!kE_T7sWzoD@%8ikk9Q8{IhOssoT7wwUsd!;Xsw8+U2@kp z&BQ;IXzAaS&)(8o9d?o?^Bi4C+k7mPb;N1zpRDi6&EEEzF%sqsfayz#Imvcz^5M%& z?Jh1{oByI5;D1<7B#zvJU^%P4?K|nfH6>EsU`D?p+1d{3pbhxM z5A&k#?b-69h|El!z2O(*-Bt#onX!r%7HpQo!%}OM6X(4j{tuJ`55$aUZffGC>5tzH zTgf#ydvkW~}j27*dDp~iI;ejodAqjq`1?YMCHIj_GRNeWCU!gLN0d9ly}x`4vP zCmqXwbb3xvA(kdGcMI7Vb3C4~xdR(@5t^#sK&B-(pdJw%a!a1SG zUe?KDZnx3tC!F1p&1=P9j)QL=-VV&t{EAR2Fw~fA2(B47nt(8_W2JlJ0taS-eSr%} zvvE9#&Nn^?;c4pb(8aHY$M$1{56UPlsv&97bURwYaT%jBb^QS}8=kMxm(I=qus|fG z<-|UIr~+4yU4p>Er?Ca=$N=QWDI5+LX@*oS^zoi3no6}+IkAKA^@J(s&2&t__zoCy z-pvl?=G>*e`kET}W`j{c00oo)gq~pPIbeR9D^pa`kB!mf_qbnkOcIbzZtpPPI4ItY zDWNn5ro(@|uKykl##`!ApfYEe)aS>S;OXHQF>nz)mczjFL-arEHg7CE7%- zrSJ}az(G)m{X&VE_T{A2R_MFABvQiddaA+VV=o1*?M`yD$LJY=f)ysGY_-w585?<* zsZO5!ONh9~s~RDB&jL|OL;3UVP??oO(gHrZPfEMnUiZmC$a*XEYxTt!F8fpaH&u-J zl`Nc{(o)fH7)+9J@wZf-pJd2=6bsr@cv;NDR4?{a8dO25X>>?Jxs^3x4Y!oyhJL67?6Hpb(T}M>KWB0bUWIh| z8I1?t1XBb^aXb0WGc@QA3x8*a?bpu?h9U=eIB|)%Sg)ot5H&ORZIQG_^?A;6w_pv= z<{nCLm-hIT zzTVrbL6Fsy3H@)_?TElsvbthzK`p)IxQzf;&?~+C`t*RC*lzkUs3rGfS86h3!Frjd zr-WYb4XU^{oyS<`v7gbS5fqTs@w6Ar<~;=u|DEPdE}*-=E%7_&BMFFec-#ujNLeKM zmAr4VW%KNp2GVZ(u!+MdKK}$ZtB?Lj9sIWse{A*c&^UvZv{sfMeJ*@<4#*ZM8AY_- zsKU~I8Ii%I=HQ#}k3H7Aq`LBiHZ3O~JVwI!cD|t8FWbm|2wfhHK?P9e3^`#JZy#~> zrIph-5Wi)n!=&g3i+9aci{JtHe=I<U2Q$=LLV{XMAN=O85QL|)vC0unobXA*%TGj)j_W?@jArjj zQ}YJ5>p+Hoz;yggHo&Rt-`PY<>}gE}wjUQD$E&Fq7)1`tkzMZI*e)*^F_x4k#h{Hd zt^Na+*G8AWKa`_Xxfo55-Mw7^z0WlCbj#O;BxuP5eH#MD6fr^f*q|Ln>z<5!Y!Htj z&s3E*RZcha@1b{8dVg*_JP-BiW)D4So}=zzS!_7Jc=-(2r3XxA33U|4ZhXi8o~!~Y zGW;MMMb_`#(OnNN=Dg$6FktFwTe?xCXS3zi#xx{tZ;NzFl&fQ}mO4HECzz`#NE6gX z8qh2`Ujh-0JXT?buOE|r^-a70MJ~z)yv>zWE(MjoeCr9+`>2Fmp*f5WD|D>R| zt9zc&YoKZAPQmee&NF|WJYPBZ$$~)GR`s^W%Pp6EzuYx;)|O`tjYqk+YVW4L)!d}s zP|W_`MxE<^5XX$qDdnk7hK)EzpMs!7V{24S_QuG+XS(yI$v-!JzvF4fBreoyg~nt4 zr95zF81O?6h<~CGvLRh#u%PrV&$lC#b;{hfMt)JarO!cHNF3QqlM!0&ESHyCh51lh z)4gahPyM;aE#=;SZ2(nHGCO{i4(J9J-WK|f8!bA>Kkw|iL(|z>ts`f)%CNHeLZ9;a zeBh&GDAl**42h(smuj!MNJRG0Nb*ihhKVV_X#n=qF|u0K)qGdI7W5GTA(;a~`V{#Z zuB{exM`mHqS(L^@0o71Lm@eaBItqPdpP)5P0<|1To^r;JC4BXgifkxyreOIkr)b^) z)S+^!$Ur+Fzij6x3rhAinO2l(jF>c6Mp&D&NOMMxE=0X?jB+i>hkAq9ijYI*H9=g) z41h(gb}8M1{1Np$m63X0e7xvbBm%{9ebJUwdrjc^uc(UTM=rEVh7>3M)Cn+L`DC4qS46;bhDbBAmI_j3p z(?_5iw+>dQ4t6`6CG`Du1j>-tMss_)CP_u_`9oo<2!*6YLTi?HZKSb6EN7ceOJvjC zlZKsfn7an#r!CI>;$p$$EGjNbuTze>tm|N6>C2PGWUsY!JJjBZJC>7k$q*d(G07+P zY5kr2KKhioA#lv@6Pd`cq;?aofx+FZsZVg-VCytYb&=yP=X-~hO`uGD`+zSatUNl@ zr4)TfY3~uYWpc2={s70_P5lR6(*fJv6VDSTLqkqmWqnk5We9FsVi&(Ga8XMX)Ij#c zxaX?cJk*eZ-jgQ@(3)MD|+; zCNhk~P&d?2$^E(=0Rcv9w(1IS(2>wE8JC9-$!x5{2oBgpbf5Ipi92W7s38`e(oDPdv#As_&a0sdKnVaC1AsbIth*SD(MG zK)M3B4Ht#QOXkwublg^WCDhz>hq?F9AG>P2@^j1&f9Ij)0kw?Jh`)_6L47di#?Juk z@ytvUtbyprT`lW=Y zl1{LykRnHh#&Tw$b|CFSH2>$;-nypo4c-nbbO`k5(Dv%*=OKgPB5sgnatMcQNn}Aw z8he;>?C7I}&dj;6HO{!*>~Z~91(iz1z7a`w0s;v*P`Mw1jd(&N+Gpl!Mz5G%KmzUD zrZ!ubfy&Y=qtJ2iizL)#ABJ7w!fy8QT0Yk6upYbCyrOXTzRTa+Wh5~pLDye(Z1j_O z=Afpf?H@2TGq!e!oCiENIvT4l#XV$LZEvbDt7gM&9yOURFY4t5P(QW13&RL0v|p`6oDm zbd$k6@(2w-gDxQKHuO0Sn|>S{Bv6r*yXw>ZkQHSJXFQ(;k7q z*3Evk?>4rir!UEqWcR`H-+?COq=~jJ9w|3fjiLTE($b(cS};V6c>J!R@qW$tTj=FS*(}gp#{J>&;g8g>s2_jave0o~>cS4MH%JiB zv*&*}aOy!F^Q227W?Bi;K0o38Qvy!`3aAK5TCFZb)2vN5%_sP)c1?&2%?FZgGiQve zNYzndSUUQ+HfQE?;l1P(##LijG~@2B(cYsg1H@%p9VJ4u7m;EKC!;>*n6Mm_0Cm9& z?z-4pPReS>Yu{O`X;}Uey=guT1Ws(e4u7qg2_~YhDu>_G-+q7J2<1} zr9>Y^xLc!p8IDVyTnNcrgR?@hsp?+?J-jpaXE!{ueG%0sgj*GI_mQ4mMywr3RH^RU zn{-#*RI*tmXH`VF|B=LB@lO)ih%^2bYO8Xglc&D5r<>fy3IVQ*pM~{>xV^9z$+bNz z$Q(81==5T%Q9}u0pM&x)I}^YZty(heuRq#+EK*Cr%)vjhqDx14*HLziKs*dD*#z~e z!$l-RS<>}#P_x2=HQdZk{8}nmedUXg;oGgkxX2jvf0>iaeHfMPq!K80H3O=|QhX`-^EuT8RCMTIi0MJ9mefyD%kaXUb z_%7*Z5@zM0=kB$L!ByN6h;Mq!_0rsFib<{xKIf_YLr6U47SnAA0ao=9u~`I_mbA|h z$Pic$^LDUHx%@3Kp}Ofgwx@?4#FQeY=J*1C05$uG8QUX=l{$@Ra?<5f5-5S0{}I|G z8Mv3 zqrKcTW^`mhjL(pVGx)hl<{x^tPJ5Jpi4D@y<>(9^L#Gb)2d2ZXO4Z-~si6Tl*-?iv z%VKzQ`ThAAXz!?mlBmiiA0gPrKOZA~v7DZdfP_XvlZRtmy?4E-A+pPkIpj^UaR<}g z4#PV^`S?esOe-$6h19$qT}8<7E~o9L8x9Zb^SYSgN$`<~+XzZ69Yc5gbLUWjb>%86 zgvXMC-9W|)tSgQ$copsFrd$#)K2Yv*gPKrkPjPaB!8(vlgs$EzSFe4s=N#EexX`wY z#f6LGZbB0BhnR&0SxeWp`>EAmOT0&3W-N?V$=?wVDHc%ka(q_uZTF3uo^A9ii-tswaETL zY?^|dzTtu~vbxbU0F_>$2-R|=U6|p2RxY}H5 ztP@y>>T`hw@r&|9k-0s53B9ACj+%A6EqVko7-l8o@D*kMjxN~jwENWXTQ@ls28x66 z-y*vGZIO5I+IbzBlE`_hmB}3G3sL5aymE;2|;$tf7$bFV!Ga13kl~0cbmh z*Q*s($g85P1~;hGsRuTKPwPckl#ei{6Nj)f-gM#@NepfvoF!W-ov~@De5uCCeO%$Y zUMD}uosol;nIesr%LZY>4ZX5tt$E!}{FKB=N}d1LsD?i$#d(#0K!{XZoC8Uo-%P9q zx>$ICVS-czl`w0p0#!T3^BW^gKm+tDLLhvAO7=+`Vw5UlXCWVstA0vvfhszSOG-wXy2*~sMZ-SsDIGz-`u?dg`WMB0c-^5*| z)15R8c&*a>jnyu-K1(^mB9S=WC(Q;N_-BDvd0At6-3f7pSfn7%qfP@_eDdeZFicWb z^VZ%racs)!5;W}i{g!x zZzk_|PI%hg$plV;I)A&-J(<)NdwbXTh=lAz&X?fY)wUMI4%AsYdqlxBevMMi+#Wsl zo<7S96*RklAt>Jp>udm3NPc*Wh+kErWr1>b%NJEhcbWSaXDn+4+3{Q_`F)P3wTI*W zO{m%YeWOoDO~WW;Mf{Nc)g$q>Fd{O9Tpm99)*M4+LdPcjs!)VV)ep;|Kv^s78-%ooy>*<*T9dGohE-n)k8Uqj`Y?0o+= z-&hHo6C>VF+q^UKUh}&W1mH3i(V}iVm(PEqPTJu>1O5=@kxSPNC+k0O!i6cT*Os|p z8)}egND4krfBn7}iqB0(oP-+|GtkF#Hzc;={f+sX^7!VxPt1KTi80#BGzl#MRbZL4 zX6@UY^M6=@og`f`*2}Us^edzq$dr-fixkstj8G2VQ*C4q=8 z?7`$>M|PLy*W%tgsSUm$?!a0ZtD96kY9m7*3}En+k!0wi z;v!~qvz`pwsTb;X6P`mxLwVukEGhb_gJ%k-<5wf&HosDI@p984;+o9VjJ(l%zb@G; zu+09P!qTOq0+}=-c*S$bKC<%EY&o+~>|H>bW2Za~Mi$@*e{(}ilWQov`kYK!VdDbenqb_>d zCmS^jORnpLo?BQ#`+cgi0yU2NCU?qT$ai$l*j`#WD?nmdY~}3WaD%j>2;Kh-S(BhH zWM^NG4pUyu$FXuh`bqny!-cx?zx{vy4#M#8K8bCPdnOt9w=E#tN+Jvn^ zy(Wwz0*KK45?1TVpyk^b$uUDEklivFzP+CMT(MZPUGquMX``dvXtn8X77$t9Ya8SvHaj93+d!YTfY2_=r~#Wl@=XW@G)!1^&ST z_5Z;FyTrVX=GBPh`yN!MsSWD0OFV!;8Lb7Ys$iMzd};?)Nb~z+o2dXf2wl4>WlYpp3}kcv zANsMQNGi52WSX+Rh|!K0zyOvU^tjm!;{Ezd=OK(!AItwgaeyLz+RI9QVPLrH7`uQ) zm4JGu@SrZeLL8aiOAIVBl>Gn5?ysgiFUB3nQa1-Y-WjqPMep9L@VM{__ayzlB=-O^ zyPqRlvo&;}A1fyBozoc%w@t++RXR)iF}07*363 zRdi4x+h#~5&s>t!e<}+XArN5F*Y5X48p3;IU~zwet;>Uy;Lam4-Rt%x^6{g=>K_?| zt5{T$z1j2`b?QNIbREm(T%aE$wVc2ygsy!g`b!%8`ap&h7;`$<%N^gWs2#PbDdyy09QH33NOK3se<85|{@7)j9X5Y) zXAZ_TQa6LlGY6FUtmUAbF7uO#VWymOm50}gXzrI4E?C!&TuL?*jF-w2G`jSx9*e@sON2cEB`xz*c`>0<+b-01|_(R<5K?> z7lCqxLdq#W9Cm#`WghzRjY|eNR_Y|htw(}Uv6#E+{!d(w=M3XFmx_z}icN1zfUX*G zhR2!`QysB3aYuIJ9zD7arYXX!@90sO0VZYv%bh)>`WQJpppH)v8QhS+UvOi+n?D6Z zjjdPjIxEONtt-@hnjqjV3|?0qZ;cg1$eh61;$y&l4wZK`+YW)X0~5ezxFFPq17vw{ zH)nIYmN-b`U7LsT3G)tAcYq!#b+|7Fyeg#_Zl1!)2%19wTSg>t))V|S@{Kzmp?IH#S!Ein z>fr55QnU3d(gbTEagA~zhYbctJqlBy1##{m7#oRY&=+3zj?yAB4L5MIfFM~rT0hvp zU>!oG_mr%$EDyv$$ZnzGfbjB19p-rKrGA}GV=f!_rr7B1IG_j*auMHM*l0q>$Mo@> zugYiPlSGteeQ0Jvda1;1M)hzOaY?mjpnaX_zy47v)x3t>z8P;s_nv}*roz6V2-@Eo zC^OSunKlU^OOib zjonnh>_PzW0qtr!7F|~Jbe!68EhYMR@iDZVTApT?9HE>-^3I@9B#2FZCCA~uGfvAV z`xf2Hr1(=G10E!JqQksOm7~JmGwZj8Ro&b&Xb+lc zSKUK~BC!zysWYKG`wOgY1eTGHM|h$2sgj;YQgzyZ_CAKQL$=tWMVvE*!)fnVuGnm+ ze}zi)bCie`j*;gX(r4QLqf^T0qsA36-d;e^2fm6fk7t9uu&(W-Uk?>Xnu0L2bCN{r zN2v`k6s-U2sY;7~E%1j}BvAjqrAl7ZP@@iH89#x^YAugDIUCIj7{+2@c&F0@iE{Bb ztEVIRj+VQzZI4~41^;ig(s~n#{Tsj+^e2-tWTQt0es-|4zDR{XITN7%kEd$+lTkQ& zn=fs1b{-oxbEYdZkw%7?7x1zae7udxIh6uj6dx9cyM>`RHD~z z0Nzam*mm$*t3W};Lm4Zajr*LD}yH$g(rZz^3za3>sO7+&5SHcyUOf-MKKNS zJtqiIXH-bTmvkTJQ*!xRx~iqG46}1Z^B6KHzN~ z3aq!>uoDvJ{XMSugnIMKI|viyNR;^>xy(FUMX#69api$=KC)96UqZCKYq&P&99AP5 zssZZ_7h;*hVtGxdgWy=iH0wL>*3Ox&r>9?E- z-{jxQCMdrrsmn%++$haAKr~@4&6rXz+LYesAF*4!4x_m0n#v|$id%g$)fXB81!DVaZu$jGAuOQE++VY;x3nmxx^nJ>6YZgY?bL^?+4xwR!- z!6J1N57R98%+8)4t}$1Q6 z`Te)4GY)hve(ay$G-;>jtyVfpvXltIh9heNL+5 z?XM%_6OPGF5o0e8=kK;Da-&r#-e$<`B|d_suXJc3k4E7%Q zf;73ok7GYBYPC~~GR)uoUM|#E50LASBiA|Rgu#f-kV(qu*6L$xcxmL5r?wA#AitMJ zXOPAQKj0S8F{z(_>Lf3+M`o7s6@^1V-Ya}q!{HKJwMhVTcW}`B7XQ6w22N^nj0%cx z1Ljrv@mHy^IR_Us0%w(VTr{Nai+BhO1{<1(>^B|VTGD;SqHL{lR)>UEqarQ40_?4} zZ)}b(E3%AqQYOuuaXgtUjXkf+=0X*#(sw!d0X~X|$V!j!-q%Nrfk&$TG>3*kx-> zrC5442PcfZu^*>f`24X_5NW8{>CY()5YHXaT4Z^}i?w%93(p=!Uh#j)F6eq#0IixK znm+Vu6yL8NB(Q?l5dR53<|I{}H$i|1FS|IAEmiF%XqU-f-GA&hX~ z$cHRfDx_9>0fndU7~uz%T*>*cmeIvv#=s#il%YZK7cI5zKgIoBkJ+v(r4{M^`sN51 zCClruw4&8s1we6W+kxTLQ`P_*N5-TfzxO?TUc}v1EMIjx0f9!-XdOgrEe^rh6s(k# z_ICY>@1|7m@b`!@iM?JzMPe60O5v8ocxypu7K0P4iNk97)MUGVEl zT)MQ=#er3Dri_W&F+*v)00pjzl_SgpaSC!HdyN+P0{G|~Wo7%=@4ygGxWT7w3R!r= zQ@k(%i{Y0Z!WbFC8E!I{!km*qWtVEkt~+fI&p3$9X-xW#GbfF3Hr)&nrZ(Szp|f*O zX9b^J@i}uhz6jCN*A~O@$DTxdl~)p(gqCMc&L$A~oX?upxx~JJcg$oQ5%a4jRIAqP zs|^WS1I%A6Oz1shwu&qEY>{g4W4z2YyiEAQ4Cd+me6#*{nb>%_wWLTsSrv-pm1!?7 z@kTnWz5%^s_b3J<<5*r|y{DKw34D^c_{acD=28F{HMEbG&S!oc{yC`AMB255a^{fK} zOLieU&QseakMNHa8$9i@x9qzc4*f5XR(0ssF)qo|2c>^x;2mE~=DOfBH1Nhp*8h=! z&osex#fYz^e=25E5kJjv;O!3VL^TwFEa&rq%G1s&oXeg56IKEL#8o4Es1iK7igXU4 z!4+A1dE|7@#LjiqFhhSQV*V_mZ0S{K(PQpakom&73~$oR{qUxWeJ&Wb`2+o!a>yB; zdQstR@jp>jjnskQLE6yaf4S6=CiQi{*Pgxj$&1VL7+1b&G~d;7{<6O)H+BR?IiJ4* z;A*z9;s1ElJ;$mGdT07ctP<+e%PFDIzXwe0ods&l1{{LVfS9;)J2qcQb6MWr_Se$~ z`f#_j+1Yxhr$bKTKRo}JO`Tl|ypc|%DtlV!3L=|3g0f<=YJp{cj*SqT5c z%t`w;u!K&}>f=#=MtrKt1MXce-yX(b?m81Q>RYNp+!ZUHht47Y6FAL>$d$7%cCg3d z{(;Quf4u2?Oe^{4gAFSJahmsuat@1~yblkJ4?D);EOR19O=H!ET?p}u9F`uge7z-u zcybq16muhj0zSQ7|J)lGDV2Hr^vvgTb3^)j{r6hTN;G+|Eoef32>-ndOsj99k9*-& zpW$@T|H0Q2o+bIx;`JvnNnSDZvY+%Pw$Mn7`5l~i5QDYoQ0PxEDG9!@!QYTQ$Ug}C z!y~7FGP^%=J6}oohhndHryHupqD{&J=xJ?X!U^%%TETcEm(gK!RlX%B_vNyp7HC^x z+QBs&q(Es%Gxn>rL63C#KSxcWT!f)y7s8;~rEP;iLXVo4ukK;S2En^(qSYEnF@&Hf=+f871nAat&Bb{jH7^j@xvZckPUdIo`EUdW zzfcDiH@_X?_+K1bmNa2aM9tG}5TR@9^8&ZkYxBiip+c|N`_J8(M7JN~Ni5q>h{{XRN&40{Vpx$tJhhbL!Lu}{y|8ER?M_BI?KBz4ZD-_=6Yf{fhOyAK-ZW zyeBOp4HDbfovmD0w=ad?=O@Lb7Q2mBYR1HDbt9j`CC!v^sC5~0hURTZ4(zq zWY((XI)hp{=rR7`!BuzgLou!61aSC*VzqqAI0n_ag(7 zt@Zs6sQnWM_v93X!3xAqYrQc|ho)z;OK&oYBCfZ~ff-ZRtHiI}N&f(B;Qt`l8p`N+ z0M%c(ALiQ?>h|N(+OSv&HCG6y_;8l-8CykI_-*-l&9hclh{Tw?gTid|#}LS8p`GtO z1~v2>iA^C5{FTJpb!fq&&^jksml;W00n=R5P!|Rj2zOT8M@{B8*3>Z$hR?yqV|Hj3 za^C@ZR!XdHsgvpE2W#>V$OZvzODT-u3igGB8oJf7<&4_p#-)x6GlX)SY? zx#C$n?BvY_V5@Amk~orZ4(8=@Do6rTWz6Ahh{juti^5I6@;DILG~962vW!LE(5!ga zlbEalF<@DunZwQow-XL{Xk{8UTvr_Yqz|}z)ZQ9L*bS+;KSKO-gKC_MLA{^!;z}#f z^W1pb9G_yl3g$iL)?(+m5i!CluyqBXp`{hHwjWS2s0Hk!Aa!mt{0F1%+{HX4hd~C* z0kPdxq09~J2LzS)#?CL{ulDbq@=kf|QRr&T+mdG)Ro=YyWC%mn{FuITC!JD&X8;9% z8hDVFqbr5lm?=&zTYvjB&>2EffqUz8pp$pxNOU*2t!H z+CyjJ%#XE(!9k_#^fy->{E8cxSgt_b2?red<8L|(` z`f-QCGt=zO)Sv|ec2lj4D!@n3Wa#XoB9lxMocY@BrRQdgd#9>1&Oq1W_v^{r!1o3o z>=$^xaq40Rw+W@8PI)cN@0e1WhNmS=>_V)!3F zjTfE@G*Vhn8m^e7qnwEX*ektovRbR?%@?K}VBbK`Y-D1XnP2%kOf!`xEhoyaLnv_JHcWOti(VuDC7BGw$Shb)wQ&9usHta{R(|F+C# z1IQb6-2aLy${N*D2e1v$6?JUz3#zqcF?}!Vf-sIIx=Q(vVBdYMk&~@-5!`$kFhlX9!B3!Ax~nE&?XE58EcyZU zPj6MsWT8jrhsUZc+{qp0u3jbOYn*pAFM&IiOomt0CpXu8~?l`8${{4(q>(ZT- zh8I|wg`cy)t*bWb9a`u4r&kQbO;&^VtLtMd7pepapMmcFtYeXFc!tNTET@w(Y|E{3 zW6iVmUbs1i!%swKz_hIbHZzY^2AfciOS6FcoN*e;W0z!5p7HO?dBO^zc*XsMGHCzf zrRq?IK%L_gKSOV|TT@)<`vlKe_53dWJd#si5; zDtv`U7*4gyD&@&;c& z(SGM8P<7n`&%GiwJ0qMAkS65vG}P2J1;@O-m=;6N&~kAwT#TZF;y`SV2=JAB?E~mu zhBX0^7vPcGC*;FMz0Q2Oni?R}+IR>2*76y;QeqK?ntesI$@Hc4vwsvIdb|M#|GNMr z#^Y&+DYqlLg^Vwp1CgUi@vuT6AtJUb8vM zQ&lI;@r;A23Slz3Z)J!|`Tubso;|&4Iw>*oMq94;;W*6uL z+-5?AvE1asr!3RmLfyj5cFMEyP|M|O1g#E9(Orft)d|)+nWK ziSsb}+6%w$6S60a`c}i5(ux?UqWpZ8!yyDf*RFFGU+u!(ZDHVrn@)Hb(Vv}EU_$mr z>^~d?xR?5m2gx+Q^TyIZ48PHr#$Fa-d&r;B*foL0V-OEEql!WUA->j>1|W0wFK?OI zyk5@0jrKP?p85Zs*4^yr{+j_?3WSl=@|=D8Jp3*|DcNic3q{JT!BWicy`A%reeEH( zJ`ucW113?jC?$HwBd@;-fFowE@;~v?Q@G=kh~J*xy167{Eu&p);&@%qMjZ#yY@=&( zOvsS`r9sH&+uNO{28ArolBZyoP-m#Sm)Tfw9mLPUMnpaP`~ri?)b~N@hB`SkW2uvT zX_1tu_74Y!cwaByo{`*-9)jr3M5`t}`3QkW4c;mv`8I&~6Z~kIIIC3m*vScgBgFRO z?0kw9ii!gR=%qg7-Nhm*WL(uzL~~ou2`#AFyk{~4;&@*UzS(NLeb~tmT;<;AAwAO& z_3`rk&@}`jG&R1OT_|W}RvS*ChA%I+g+@n6Og)EI@mAfHgxoiX-09LVa+x0TwCj~l zVBcMVn1GM`zfe!<*~RUj#_H=-yH@F7h3cx&n+{pmbDhg~`hNZ@R;!SJHB9B% zJC{g0_w#QP(rYXW&46D`l4xv1g!KC!AJcS1ydGvz45`fu8FULB2%EByj^#QFe*Xtt zR|iY~Qb(4pt-@|Yw`+!IM&RzJeU(>{48`XOeE~#c>gVP0V$NB#D^K}9B$Zm5pxhJ` z8-B#WX~Br2Dw9%I{$pR>iHYqVO=2sOp+$XAvXE_ zUb?S%^AvxJ|ZB^^!4&fWRhq%C@3S2;M_?*=A&Ej(?Vb@4>1y$T`@-Ho8kv#72BWtl~^J| zqHrV6-mHPVeS2-Eb(^EfnfNhtnkfB|f8New7j=JflqR~NufJ9Ry;%`W;-#2tkT1C) z5|%C(WL=SLDgP|uj4M*Ne>15m&O5EXn*bf~L3+S3VZx>y2 z7tGB6F*Q$pq?$bX$c5=&m(1g_?R9i6Pf=gUUrHXwiH{*amD39F-TzLZ`zaVJC?#IJ z&p8=&5+IN9>N|G|8Pwj=H8jHs6?~e4Q*90+15CnOt0;#d z){-IOOhk)Fu5QL@F*Z?oN_tz~$s344d+>%I(ajD)fb1L?lXNKi$(V7wA9Kt&&S;0T zTDm_rs-(TMpk}gMzst(o?Z}%+1%rzBWpI`<)RMM;R%26s(qjfTMN%0K!3jn_m%c0u z3TQ=N|2v=d26CMkgzP6^S~ksC&;G1_efuc)o(+zzd)lS z+QmT}p|+i$DK;=`d4;*X$Swi+zik0GWFU6^XuOrZ|jD(<*WGy7)W)jAuZ+<9pGg&A%1H2ba zjxf6Q_-U@LVWC_I?PzAd>Nq&zgO2Qwn)=xeR#o2b|B)keeN<2}o=7w~(zvvg2P!*V zk$3S|9R{<>TS0@ln=4X>RT?dPFdXwdIB@rASb&<>4Z=uP))7k3MNjuTXeb-g?(~ri z_V~N(Z-S3m<*k_Qm6RoI6l5Pr6EA(6IVhBq&xs~kL`jfh=|ujOpYnbgB6DU%U9{DR zB~E(grVSfv0aXmIDxQ2+hNFcgqcs1A9T}jPLx?ZPab?-Lu@*vESy2>Oxau&_QviST zq5~egSc8LxM@9|<_&y7M#!2fX>Yh60}2bu!^F&=ynw#m z5{SZx>_6#mW@Q*S_~tkPlB)kO4!)@36)Q4BJG@1Krg|^*z1bd(S**mm5sqssU zthb`t%n~FLAwCavMR61beR5qgH^qbK^koY)(< z2oBO~3^W2YNqSLLOeziv+>(6~Gn4m{ixs@Cuf5g)eP-Q!6_NdtO^>wy!7JOhY%Y<> zaa81#JLrz=a1t^x6?ad=SZ#Q0uzjFLgKP~{f$>^D1;I074Vtu-?JHh9xA7n3LvSI# zJ|0EuNqD*iEg|wzKnf4*Q;$n7RGrt0u6I_K-=%mvaVS#QOuzEhM0C(4P?pVuvI&9+ zKK>P5A#(a6fnq88Tf5nSWnawTh#=Xb_`@Sl@+tF6h_!(zh=|QDbNTntD{_0CDp40o zD7whQRQ)<}IQ|-6c{Hq}1kPWqwQhkTe_^6XO#2;;n;5T(1C(2sQ_LlDyb~-v`)D=E z$8LPxiBRzQ1A_T4A6L>u5DZm%x&*3Z#szx9CHbk1%HQ`fPsSWIkOgF@MXiv&@J0RU z#3yZQW?!Lh1!wFclcvLjTHD@(p&I>Uj+MKrYizSe&$BgNf)~;;;=9S*t0!{LDIYP! zm}U5uYVbrH0A+au-Ol73!~+%|3nw9Z$iq^C@cw~MV)!J<7=#tcJG}Hh+f!7E{k^!yp5M=%D|z{?#uT4h)(cai(w59X;PCpzGUk06OTl~)f7@3g(FcPA zyhGuAt9=tc|G+2`O*Zlowl_QX`O`B z567K1VaRW!v`)e3Nu~RCU!gEVR16*`Xf?;x1KSo+4dM&WYo=WOYIb2 zu_s^1XOX(wK7zKcDy+;8e9Lk*n4VhN5n~JXkd7@Cn1zRqyO~0&-Es+0nLdcZ=zg>m zx0l2&XfjeMn%C_?h#HWHcM+CxKTF7DuH$R%LS-K^0$YO3;Z}<@EPu0imcm5Od_YhWh(NM(7J-PXb_KB-eP^k4VOUQ zzB070spL@SS$IjWbL5K^#{dH=Qd8K_N-T+Fk6!^!k9*} zbHr*AI`a2m4?~I&QtknWQAgrrI9Xm^BBd~L1+%kni?Dtn1H+>iuncAWN1hO;JT;&n z*M_!=q*nu?4KB|@Fd68ho$PxeiG2h&=J&Ekmp?yQ&(X;?Xa3aNC3D7#WNTy5fbpV9 z?~roV=BhGyQcp&&E*dN57>Tt7B?Z6s!%sJqj{4L7g- zdww1nGd|+>@l#BnCR4EO6VZX!b}RQcW1M(?ypaH<-y<<h`94?0skS%=i-a zL|=2&cxDonfzcc|dF4y_ZBz0bvRbK5JRnyFI;rt24xaV=hn_sd0sX(|iRV+5h>!pl z$_04&)kcG3L2BfbUs~~Pv1@)VkL7p zPyXnxhxV@uBXP4vv3}imd9m`uXzT{NBF9apA;jklSU_Jg%SUeCs2@Q>`O!# z_~(Ov3ndU%CgV>4k9?08XZcJtWE@itO`d#6{Ejfg0LA=UDOs;2@Bj0!qtHtwcEKAn zMJv7khdXIZz?cX#`h?}ZBVLyw-=5Z}cyL>y1;5XK*(~tlHpu+433xb^MHHFjaF1I{ zTKw)T6nxr!#rG(!4Y<$ORW)w{Z+&6EW5WDw0C);3RfJa_9JD>mk@O|353fdO$RIsl z-ke)p`SBCIu}x!@hnT&>o$uW`W8yqACqWdR3fN zN4%(50Z9e>Uzczb{Slj`a`*Q|oKQ;DWHGUMw{L_k{}4A^rqw=KlYW5v_YIOpLQe=( z3p_ccctpuJxyLBJ*lBSdFYj?s#{_xsi4~*%KLlm^{>10od>yy^VGPNy(6v+oHmK2@ zg?+tyw&;?@1opn?DQ#i%%)s*P(d%)18WxZ!V3qO(L?bbq_RmF0pQJmJ!MG<&|3f_$jyq%k8GiNtPrJHyG-d?Ww<=?7 zrC(8*!D2GKb@MHwGuEQ)SIIr>^hJdXZb~f-=RSu7NQ|KQldow01Ov^VaO(SD z&y&(MW#)8L74mMsQCMWoAL%hC4}dQ8Jf-@+&Rs)TFo!G2sx42B@RH6+hS#C_lNd>P z_7A^8p0jkmD^rIFTb7>(LutLEKV5a30+fQ$FSS%Eu^(!d>RFL9YdqL0slhjmsF{(m z9dc1#>7xs{nkI9%3{TPTR54p$G^eendxR37ve)ZD=i;Gk5_s|(z3 z?$q@g>sYAG(L@Zt4O*qS?Y6Hv9$eGL^()YK>`-}0enU>2Xo44WK4EWrD3#|RB7LzX zQr8GaJTI7vjdga9bpWiT70(`I8hde4-a}I`@Gh70IOZlkNk{t3mIeTL$i;7bjla5` z7G#w)XU3r&duXms7El0tRuWq$lG{JFz0*Nsb^P8a>70AG^B_#Bt? zw@(Gl4Fb;A#Z+P0b-UROfFmxDPn)|H7z3h zaH-L`52}H_XO1Y+(3d7C@}J%1L({HIrtYMQPe&gFwE_>G-C#aBO((#m_0jtkvv(5q zuPx-H`{iln-Gs-vjT;Yf{=ba@{v* zMf?+j~K-Zl@s8#nz=T23OyodRQb?UZ`5UCmlp zo|Fs-IRCV6JxU?)s7M#?BBlG(J^nzX4ZnVa%T->{VNwIOBbfNDJL7Y1_#uhRG_kC% zFhk`eX7tDRo^WohkX6Ph?d8H!j4X*(;F+3 z$`h_e>YurJlqA!y{!ZN@`IvraKT_VoPctZonI-GrXjvFM_EpJrzAq;rz;V4@Q4kau zV@GH%hi)>h2pRE_X`%`!#M?SOk))Pmfsm609?NT=5q8oGg^$Ugv);D*BZ_GnXgRPC zOW-}(mAX8}Jn9{+AxY--h+_C27EqM}rmb}*@)m~G`Gg!~uTNULj>62DV!|83!_7Rf zGc`q&^rB-h*2#u_6;#SK3o$dvhri5~;p#U(CQ4XwCd@l!qnOS!tPH+?l+DG34D!PB z6n2md2q95H&oMw%t=b#pm+f1@2S6k!21k+-bMBL&$=7e&A6pQCkyv_>eutSP-VGm{ zSX{`(-$F3_ZK?y9@uz3JShStL@VS$4P^-g&St(6nrs5UnzPx$xAZb2X7`?^Y{KV<5 z->k@3%_f=Izf2zaoT%zfYP31I*nG(@C%LS^Q4$8jI}ETK6!={E4D2+UjOcP+z4v3f%+%tXD5J7%QIFR+Vt zSwFn_(B_UrCpMa{JNNwMQh^n}@_ICZ!s*>YdORbZuhtcga*{q}a&Oyv4dQKHszBRt z-K4_^TWL8yIoW{9Yq!H$+JR++HT8jQk|?gUtPcW9dgUk-OhjzYc%iKCRaeeLt8I$W zyatk+&B++}u;DUA7jTIrlDj*4=+QR2yJk#VF=2@0!mkc3QAM&_?as~y{XV-uVm|r9 za}D%;XRWWydN3af@J*E+$cR5JxAh|mdX@aR=oPDF8#Z-i+a6mC6iCi+YN>xulG#ma zu9_>`3QWZ$_)CE1LWtBmgt(l=c(tU+=e##|Qz z37gr!-kk%xCsT zXPJ~%@cR)f^za8ME z^=fCZ#0X_5+VMNUf2CbI%5U#^A8x41ms??{?gP#wnMvM(D9@AXalf;f{&1SAE+^q` zu-t9Af}iLQ87e=&##`wDx{}3TgpIkZKYV9*l1ZEkkE8=f02%(UwMUuG-jukhb2cwO zYt8vTT=_jSR;8oyk&ZvUIF&TacTLubm``Ln$LK!ztkdHfw4A)$P%c&p>nQ`76#&lYPXSpISz4DH>1soSWOu zgL2ts&Fz2Le%8meOlvRxAY)M0C>vF?8Q*OUh*m zUv=Ip4a;yubXoDLElrnO9iJ$zDV!nZ9f|Hcom=vOu%DCcyM7vbQ$(Fq>Df=61Rm#ni5@JZ9*A5kiyx~Z zyRfrpz;{5JN@%xCvXgmfpSv4~XXEQ1YkRh_m*DFr`-Cz&Wgt2S$?})H^>{wzd2{VK zV?y^3i#&+%In)lFD`~VCQcU!V??+U&j2X2I!1X1j!LsluS-rANJv7s2n{C1{XnbM? zByoi!cdjeYueJKoRLc(7Tu-{(p6739$(C?B`Dnn)Jz(=SNcH7p|Cs*)Q=$L%g;>+L0Zt&os2BZM8E6|+sWrbjaND$Ybl zUUwc)A6NId+D(TP=jg(5eia|4`=u=$1HzNeq6t-Y`HoiZy(Z5lbPE$4B?k1eTL=h_ z{q-^Y9v+0+t3Tv5p4-nn-}mg+$k#>sEjDoSTp}kGH~3o9dqLQjABq`%y*UL{Rxk)L z&VFu4E(Ag}T@WJnO{wN_l67I#vn5Okchvf8e~?c%zoPt4SeNhb<)$I0DkQ%n0QQL- zCh?j#OS7lIHz|LrXY0hcy$!Fb|ZD*F(8+xPbI{U4h_q3faK?jJQ!mUk^8h0Ps$lr;U5p z;n<62=*5`5S85dJ+G~hZd{n@n{lm+UBgFdb{oN3Wz8J}U@P1^aTu#$0QKJOm!YvoK zzV9S=azRK+cR)ukzSc0l<2SBd?SRubOMbGwCvrYT7p(%Pt*;w0%>```FJ9(GuKP>S z8O-x*;(XmZQC4FzpFAD=-U!gr#`_F$=UrJVB^SQMFG%fTnI2DV7q2Bm3Clh~M@%NX z2w-ZfSWZ#wh`2__K=>txPmVSHis_d+*o6qI&$oa>8ql%hlH5$o9o8#;SI=zP$K%Cn zkGH{dt?7kBDXy7}eKvvv6FAAAnOb*je65Su@0x5fGbOWYKUBW@W)G}o$lV@{Gst+n z+&xS!^fJ8WCi$kjp)y_m;fLRKTJP@GQnv2Wz$0xk`?jWXN!J2ylGVwOj^rKkT7Q8( zI~*O02~%^l#7m;cdGNcHQM18a#)fS^@oW)Yt#K*YfoV!%jNFQ7jM3Anu^@xRi@}*M zipCCZUpvM)<WzNmG6UX7oa=sfOXPZK`DsoXDYvgQH2TD@f%edRhE3P_j5 zgvIq3O6xUyu|^nX_;#YhC2``-(4~fJ|CpwW>^D_wV`B8@&SkgE6VN(%u1?_iM%m_V}BR?mJ6?9#;@XhOroq1J=@!4Wo;0c3)!J!HxYv$!bi5my{#V-c-d~+GH2bV zO0@L|Xx-!R08j3}EF3=_dVePN))&*OQYpwdX6Bw+5}hr{NKvaLRdIXvmuX|~p_CSv zw8|}T54KU|o6cqnbHv|WWZQE+h0DCXmw!*(9<8Xp?Z7v)zeqwN6Ie6eR>Gcp`Lhcm z>(m;~(8Sa~CXP5g+<9i{@h@D`>IObA_TH_*HqEvQD9NX>;W(;Yk1}go+C0=Id&Xj} zHA_dau_#+;bM_~Zj$zW7XX%x+x15n%BCk1X_nTX{!|c?Z$@OQJ8|#ol11d^_Jk`Rf zRU$82T3}PX`n@5ZROZ;P$zJM$!u8zb8+h-IYdtg^SFj*LP>YFi6SMN8qSjbt;UOZR z1*n?JI%zS{CrANKul5nG;`~5j~O3so!fg zl13FUZjT)+&^8s5FFxNtO%l7O_LIKKu2{JY|8&3jutl6eW+Y&mNQyDA5()M{S_3bn zU`vr@5q`*Mv1qs&J?e3s{<+>0H2w3sU3wsQnpBRF!u#T1a%5Bg*n8k0XG=(niN|gH zhltzm?Cpz~@Ho83hkm1r*%yar5+(sb+Zy(ef=3Nx>Yl*|m7|?a9z1-7DY`RtX z#`T5wAu@JV)Q(5&y7QJVb9zpEuXcG1%YNnhUfDZuqrG-p$ttHV`3*h z$}+Dn&yVury-Y8}b}#1329HmoqMIm3F0I^Nt(LNl?L(nUzs?{it4srv*Pp^kuEw@( zfu98HHv*I5Ez(*CMbl%NoI0{@^{?z%e+<;^^F!IL->tC+7ELx5+LjkS-^-;sV$HgD zYYrOm$ zGeC4s6FG5QU9}qB5N}e*m^?N%4oUqa0r2=-_-OVUH$2QWF!Y#UG)GmZsgO!~fnM+> z{u zZ@CO?zrkOnHI=3Awy9bpU!qqCN_iUtmYe&W`dsa<-n=dXxq6HH8z(1DNM84k;Q}7A zz*$gkf1N&8jN;`_gO0&PXJn+!`NXJ1txt(&X;0g`h;)NllPpk~*Id)_iDlTJeBaq* z{1J9}kXF6pv6J&X0Ns1CeuX4Csr6~62& zmHcwYE}5;j;{$WkQHQ~Xq1sJ;sldWRxqYHsr6!-(FW%((RGIt^2w9M#{rcTRxWQ-N zdi|#5+<<3&Y)pzQzRquP-f0sO@cS2kndRfR{9@DJfq2fIW_eDNwoh&M;4aFma1L!RfiphI^ zxRgLS(6+yXr9ID_plQ2drLPiqw|Iy>xby;i3x)4t$)+RWu+=%!K%TnD#Vrn@og(6z^$Tqx&Xv7IFkq-8d`nyr5*c$Uh^l2<^T3`7f z3i{7U621ow6SPBv(Qg&!j5od-_nwtG< zP6t%>57t65hsqUcFsP=FRVZ8VDj#~^=KpzJf@+oFx^YP)aiw77$6SYbUz<7+D)VR@ zvFaaKm-s!oD}why?PYx&xbhnu;4x;i-?#Zb$p$iOy1dx$vrtwq8TU&hg)@b(;RYM4pARdrj8l+BO$QYZ4ioCoyyFixkB??JX}* zoGin8?dnW^O4(3Q9SQ8Z*cJka>&8JB20lNNgQ<>3?*UG5lAy5~Nc!rX!xy9I z->Toc5$n18bfBmVDKagNg)E8_QdIwsFI)6>N_*nBGG(rdSUU3?*lYks860~P4&IaM zCe9wvmPGkP9{+$4i)*<4!lo88`w(#X*RvwyBc}j26UT=b$o0oKjKWBbz-ASBOEKcn z>}4aXjTw2ncrq)4-s|}c*i*e+c)Of9Q9)Xa*}RJ5r(4iv6wcfy>N{vu7k$4q0Gml< z^6Nf^$eCg!>aA3DHvx!0za>Uvs9N)}>j?`&-{|`aaGO0c@i42e8|8lGmUtw1$vO$N<+^CmoVf0oS4#t zbrREdc`5Rqzz6Dj@a7QGMTZ|0?7T%$fu#%^fw|@CmOuN_%nvx7x0q%d`jV?UVh>8= zwYITu3EEsD4j&g`p`PhbbJ*2k#A&*xrr|xDQXbT=@Z7O;c^~zc{$q$NTxTbldC0l8 z;Ah*J;%iN^u(bmNR9dY-)Orc-Mm!!@#DQ??4;^>*MApAu_E9(i;I?HxiwxtfZ%}Z? zQN&xM*H8goMmtcNS~o?H#faH8BT7!-46T0dhD@lNwOa`vM@N}d@ z#RM;psCsoT?u#D@bNoDc7)Gh*YWeVMMjZP)g9<7j`2#8Q%f9S{T%{NO@llheJ?!B1 z%vS?%gDwe^(ca-BsaC%}LASBe&P2;}`}gpl7~w81o1%)OPA~~J!g6aT*vM@YaNrK# z+}}DoB~jTmZKadCJB%n@O~JX4e?-`Z>=b^a25J@0PlMhOW5#D7)#A(CphijgHyHFp z{VDuFbTbrW%X#XH4wl@edTWOToqv}{mPEpzf#d5u@;gv@&vw#}PSE9~q>sR;W{Oos zM6l^DaIp3>580Rkf}M-LKj+Wil!-0*4~-td5`|h>h=DMKhF&(U@i#5rC+p19zg_lC&UnU3 zrPU(2+->%$kL^M_|A)ws9-#f^310cv;00ys`LF(v6y|1Vn)##Rp~X14B?aQot1&8k z7q8sat?;Hd+Smkclh~8rOpM&Rj1mN;DgOCyqjrn($UnYR7B!bgeZwKncDq%l547G` zGcY{8Tu>2v))E%ft|+^FcN8;_7zYG1NQHE>xVLE+U1aMNic$_66}lJm9KB@qP!wUn zF20h5Hx*b*8mXlG{mZG``8JqP+PB9BEB3x~?))-p0rP-`z{7ucZaI zpuHsml=&D1gTy*zR&|E9-B@og0Iaa_Q&j;}aX!oBE3#}!(rhBw&?)iojilq#qoS{R zTkF1z*pBEK%rD+eNui_IIuk#=jS4D6yfG8@7MYUS|LPLj+bP%lrmA0rfrh;6lV^Vw zmN+=C?C}YxJSa&2xW&@ zGc_2I5siIJttzY}V-wTBBV??$ebf$d`!_HLfz1dWZRA$P=o>SjU{P>)B7&)ywK>rw z+oe?mOk$sc$YDauJApgF;bvX=On;tjGupt&tR=J5`%Hwy;Gy13*n<$JuQEc$U0Bfq zN!a_Ar1d0EAnrICDSmKswHghX3udfeF8Z~edHy)xb*}Tjd zV$AXPFoih%k%ul`YewKN_&(v8@WC5_V^ATJ0KWr4%I*{q2yg z+SP2Dnu&qI`7FaK;)#~KBQ*Z!7p#jFABA_*$vw)Azgn@<2PlAthLlG1n>@#szOx1f zi%7ObGI!_(_AKo~aL=yX(vu;6|E?#-3^DnW;YgB>Q5MRd;SY+{lFV#08IP9=X;Msr{IN}gK(3pr7C*mk^rsCT5d)`BT zj1>!$>&bXBCk9jYl9~SvC9r1v)ax1hPpr~B9J<}MQJBDEHb(fyzJj;a)U*=V$R>1h z>J!o(WJ;$$|0Lr_CzVr=9LV)dc1jh(tnnK~;*4j?W(ok`WV|){velW%S(IOigQA^S z$Q!ysAVfuv@ptKE9U<1VAIqFq!M>Ro8^5d9+*8zGn>chB zcV5P#Susq_%P+}8HR@Mg8}?=VGi^HvEt?jI{V{K=L>Fqt@3Luj&Y zsDk<-t-yLSvj2UD+EqHXn2V4_+%w8~0^Gkg_j{(uMZw`AA)I=G;8^%XPSfEw!*^2KZMgpGj;qHcAx00x)oOpn=0Hul0BCR9h+yAt-GARAgnlL4I#*5~$0s=_Hb_czMUihM z+d&Ww)%uYZ*~RqY3&&v5R9>doRI~9ogO{8{H+eoPl(fvcAp1z%8Viy5TB1CJMfkgH z^!Tn;Zn2+lRdX{3&Yb8+|in6RN`L z>$kjFEC9^<;wj$v$1xF1(3ZAqF0rz{H4~2M$e|B@ znE38lW3xH}yrj;jB7>Lzi>_SorT}6{!=h?s+ed_ZCz;@J_2?v=v65XYy9iOG^^HWj zT#xwuGaN<*u5=(Y@Nk6CPACH_;~i@u4ti(snlsyzE#hl3cTrvFX9Xkr?}SW=g)TO0 zM6Q2%FmVl19pbrx7%s-^I<`9*=SkNBCt*dT*NA_*+P$D6+;|F?| z_s=E%e+MRj9+|@jVegP-(B`-5+Q(xss{m+K*gIz9+)0LBfphiDgKzZcJAqjGE~4$I zG@&sY?S{iu)ZRw8_OGX*vZbZNSCXXkny^pb{xWU_@YEWq-I2Oioy#PI0O)JoZDAi{ zHYUhH{s#-9LlF&Iq3uz0eeV11k-j3_jsrIb=;MDSing=SLZBOwz0qBTs4@P0na?O} z;+~j%S|nJ+YFB%4m8A3Ys4iy<7boi;oTOTNa}*3#a%$t@yluU~5KKiJsgDr$@3mj^ zKc6M4XZ8nWlc(ameE}5_oIpvDly8l^U@dz1TWE$~P`lKEko2h&}M^W8kj%$oM*N za`3>8G~0+iR>Zp(H*WUc6?1*ECFM*VO!*#dLSgg40h>uc2&MNb9wCC+#~GY#jo%?? z%=G=@jL8^hpO%W`m|g1^3A?(m_uk{#s_ zDm^s_)q6yePF+ze=#5SZ$j+8I9jsGg;X)y{K9F}-yrA=$&NpJMF{d)U`+-arrnZB5 ziYR>C(_;M?BiBw%zJz+-DF3P=#W%=73hMt#&AY4Ix+64SpVc2h_MzeLGXSjQj&RoI zT$LuTm%`j00haI0_{Hu9>b|5{buRB*)C#CZIl8=KeF4G|#%7rM9;Ih=aGH>;M8YL% zSG}*4k1$C&bN&iTyNMIVl(XAofSmn!uhba-I4%^nXHt6{ybU>fY&272uw?zLs;RxO zCjX-X<+CNU9<(m&u5kec}3rpB{ZpP#!khW0pf;z(>b?9+=k3qWAy(RD*7s^Y>^ zWyxUu_4cVCI*B+spUOvo3`iZN9zzqr}nZ*D6nCCK65>b|7zYZ8%zz zEt(PAhj~R2IwefotR^)rKDA2gvz_!#<7XTA5^-$Pu#dpfRL1~fewLDzE}C$uub_mD z0LlTO=K<};CT9P5%lT+MmBgN!q>@>%-BD;{_Nc-9_#lIruEVh^sc5=OyvFbUgIiv( z6%~l$vqd?btyT@r%2(xRF|U-YKu`u{1GX-2#}dIZvJN>|N?)*ZDBIzl5}IP`&Yi!t z#y81)b^)FG*J(ILt#y8AQxa06E;u#uZ-rg@SZlU~8f(ypa2)k%%BlJ<^CQSdZHoG) zN#p;amIB{7ghgeP9>dQ=b+VBfW@K}x zNhCNod@^BTz}45j9~Sj?E;M6)IZ3nabH4!e`QTe^ztEtf+=iymh%OXWK0Yvx366cMJpl8b%+@R&9NjKrSTn-kg@yt59PzCO`6FQfB-FpK`MJY33Mk zJJTk*IqHZ*k^OgekMzMD`%)|ItwAfM8wu7y8#j(DF=)HR2HGCv77$Hm7 z)ri`AD*7aDLNsNgHYB22zWCy>uiAp?YUD3S@SFf-wp|zW&=`D4g<~E56LLM z7izhif2KErTttY-IbbA`Bg%MCkW0D%|*0OLd5h5zGVqCcq zoAR%V=!CAsYNGi?&?2Vzl9hO0d&c#uQuf)TjV6@mDcXtT9pRU1EgeI(IBS1KaGD?W zv#827ks^7gTXFZcNC1sjB@n2`hEj|2$a=NgqRV6355h-g88h55A~eo((n07NBE9h`&^^SPrg57xAt3Qmd>tDE&NpodPOFm*VJXN+VbqMFdFkwCAy(sWACxNF)%aZC1YVO!S78+tfA?D8Jx^;5UGwZ2b13k!q3cZW}%?@ z%vu^hX?LUmroM-d&cO0f8FzOk+L=P2o8}9??AY~`<0B&5vPzjkG9)ERmDFa)T>3Q- zZPP&pqxE>ptAY-Rfwz?jjeQ9S&U#HyJ#KH5uU3|W!Z~*eTCJqL`S4R{P!aQwhYOX2H=xvrqWss9!7 z>>e`#elM3X$&qZsR(9VAa5Jw?<02ps=u|k)dGA_2&wK4`;@e7sJu-eS3t4{2Jh*V+ zC4rlXlTc2y9UmH6B4|U$@U>d`i(DY#Je#Ste1oP<=DUru7tp__Q;{`OReV899MVW2 z{A?^ z`c4`^kdBv2>GBB{{%eHcL48>(CYebBpw<0wl2q8P($A!}RHDRMzM|gX zNiO+jS`Pi1H?P%Ml%1Xz-;T3Fj9!s<4A9xcdR0x9qF}WHjXx}8&hWGkX#L5NB-;96 zI3JDC>K(gMAK8ef)FqOs7=H$2B==l+2~dhvO-pVZzrBB|YJxwGM!8rsuJDR--oLrB-DKm>U^oDA zy=`x6eYq!R;=m__jp|oGWNuLWQ|`ERDW7>ckE^#!Fe*KX9$b7pVBqrVS1t8$K;0LGwdjv;8N#odLm*CxS6WBb%oOyIzu@B zvob;uvxzcCK^9n|`cjGj`yxJBiJy}COtTWjN$N_}Cm6NAeQlPGIXdy3x7M~&f;#}l z$JV+W?g`I<3gx^1S4-~5{I7C{70;tH1ZUt1KEr?dwn+-}#qawLd^LVC?+ogH!kzh4 z%$)>$52tu80WyAMODbj-n6cm~_w#=>BtS1f{S{8D>Qr#$rgH zdn>=!QLKDW5!mN#&ffvoKa+U>m?7v2YhNBGQ}h@H`5u4y`Ckng=tiv^@~UsHA~CwW z*BP4?Q~9Ua^Pl}u7K4g2ow(}qjc*AJWVn3oNve_co2g{Y*A~d0u$xmn_dHs1VAcP` z=xK0Wd(~tTr^3ht2&;0lSmN`h4CnBaLm%gN4ffS{Fj=Mc(}c}Y<_3znx9}G7tS8RhO>A2{z&y!cT&CC zh_u;;72A%YP-;uSdPH=FJE12sMxi<~)a^gn&gk?fjEgrP6c{qZ&A!{0?z13HW^Jo# z>rdJ6{vXEPGAzn}ZQEu7hVE|ZZV)6KB&1uE5(Mc6r9@^1L_$P5Bt*J91!d?C5d;BY zkP@k(q~X2vzt+9(^*rypZSMy@@!?_^xaN1A=YAaf&pk~lZoX(C@(O&?{2}ikM~K+J zPm=$C4wBwtEqNU(AyK8xA|3W6_nrvbi2;={knGu^qf*2I&V(Oqv8mvAdUtj^I27TZO#Fmu zIgxaMXk>#iz~h2X9RdVPI=m{07^{6!KcO6Bnic5-qPKuJax}f5ZY3S50!fUCT3$di z(JfrLhH^_D9U1Iqnt`$&WCyc}5dV?h4EY=qYF$cRty3L36Kn$u#Y!4jy=~AMA-y6> zlEN*@-Fx{Ca9r1SVSZp?2>P%PSSm1?F`$yYtBZ3>Z*&r;ew6pQ=a(@@c^3ta<*SjH zqzDqvU%S?nHjrOyRvs>8s~SR!8Qvys@nX4tXYz54Ml#r84}pxt%j9w?Qc14mRsLht;z^)i*FEV;va(rOob8`z;Xw0sigFry%oRj(DeLnDNFlp2&WscGu<@^T1fveLa2^BgtB zb7`B3B*XS}-@J$uAqQ%$_l4YHLUX5>=fkJSf~lkwIKjmC@PP3gJH4EMOL@VjRw|4_ zqI2E1mk9f3VmD>*?>a=&z!D*1i={>tx|Q7;XymQ0-n#c*kV0+VN=O}6hmv})vHBw4 z_N?5ollK}Vf8e6GuRQ_fdx8FfO6IfyUidrecp<3UVr>>(3@OHUc*)`7kYFA~JbB!N z$E1Ta(%edDU1~nr6o&=8yk%jwVF8Y_ZGCB*j$mpx@$$QrH+t9BQR>J|w(S8{vTW;P z{^t%Qt7h@(?we$efb;UB1K{=~%|rCK?Vd0F=W*P_rxTjE4I3{kNezf0sDJk^E&)Ge zQ3(Gu^=4X^rD66>;SUfhS#gj;Z>?5!kY|P1>n`VeS$ z^S9P;di<|;5-F+GX#3d?IIITre))WeBDpz;zegqgQ2;wr;ME{QQax|_>7f`%tGjUv z_3uO>!hSmqX}EdM8{t0;x(XTw0rw=}mb3&N)_4c}8YwiCR$jm_U8nXI*?iF(-0|r3 zGzfKDiMDMk?|1a|gk8V^WND4+sGLthvg)FEt;2mI*g$A)S`A?dl$N{?P2YZ$;c-f& z#Bg^PQ+L(|?`l!t^+WR*=aI%W^qg+KnM2%fNyI7X@)F}ArymZt_rau}bKe^4(PWP} zhc4*tL3r^sDn0l|xpBscqAnQ^Tz4jwklE=;_F^EQT-G$&sOqS}fiW@wbM(!F4W*tH z!nPMmK>mF@3`VLTonXRf@-(FS;`7l2nOn~xH4k-^j?Lo?!=a{Sv)hYCEU&+sY9o-E z&qhrql5u>9NLy@qn9yyO%(QO18#}fRN2J_<)EBopY_SP(z!2wK?}-U~12T!GiA2l4 zhaDKg^d8-JN`3?PggaiC3{sKP1%GekXW&o{gT|>Nb4NZ%O5=Q-z%s;*iAfq{08N4H zUf#+DjR`+GPTj(5xuS{aO?&yF2(-#Nu*$DaME4W*F(r03Ip7&_-?Rf)A)V>vCxzAoRmRJU`%X#3jK%r{Vp?9t z&mVlQX6S;v>DmAchj__tc^%VQ;d_>iZ676gorcZ-ijbuBrEv4=hwJ=adc@#MpH3PzCQb zNP>0ZIBIpXKoid%J_D1HAq_p#aZDdiqcF58)w+dyp>;wb{79o`h%COV#&4!NcXpF+ z*3f&OaRco>qZOQRbNMA)+G@Sqa0_QSZ8ZOa&4mkk)$6965>dXXk!KMwEt0jhuf`~N zeO7d*=wC9wgBi%^n}HUS*wjOfz26FBBYxg0fsBn1lRtX7q|T$n?n2;|mYMonwZV-4 zhene54`ed^!{^X!#1*fnTR0zqms2S1llnE))Vruf0`ekCPqi(oV7WaKSGzHDb7x^V zi{B~QE;FA{<9Q4pQ!0-3decc}d)(=6@|%d?K4~p?SOeO)7u|c(pnN718-i3OnVo4k zSKw%;9ImW8t1p$E2F34jkpSagQL%}qEPS>_Z{{oWkv zzkp@|9ijiU_Q>|>VhCOvnNbtw4HuYh1p!T&ErOmV9A0@zMc@{dEPMq=KTNtZG}A;d z73r%RCK=4`hl-F)bJ}*o;z{$oYC=Nl_Q<15{8|_$&+9)YKk`vv1G;?oL_t%$A=)?|w+pArPAqZ|WSCK9SaR z$>j*~3mY+h(LvhDk z`Kl!^tCg(=9f#r_*~RuB15HCMa*FF!3PwyCuPCD|=W z&p+n^eK_&sdaln!T_%;*kTH%b2Xx6*Y>&yP81c~&0kdz{mzS%U8%X&zt(2($4sF=4*XrZT6|obc~WW|saG zJ?s$+aJv+C9ppq{8=ewD4!xsP6^LalPq$0?1>@y|O+T>h z5nFqJCK>WpH?(G{Au8IlMO>mMlago1aNn+^vfy6}!^L_)_t9(IzTLNs0gcAlbf8pP z5w7)=;ccG8c!aA?_SlPuojH#%1V*DbY7gZz>nBcobKjT4P13Ubw0+G8a1kLgZ49VY|H4?{nSvoH8A%GVZjfx(zwAH4)Frk z;Mz_xDmB`%@{3GC|?T^mtyQ{BMOmOTIff{cgrpR10+6B8^oOX1Acq zA@AR>1k|q(p>EV;U2Ao)QEMd5tbc86Fk>~akU8Fw&~*L6u;1lfq{&ZP@D(>bYq}8c zlMSp}CXq$7q!80!mP4WraVKwn4!7WP`+*LrCM0)~xG=mc#mS02LpS5hgNb#Y)eRE! zy0izT5GgIHgY`MZHLa+qY0dh4u<1@H(q7VO1ge$38=`p+_md5{-n#gvJ>At=;%W&u zVZMO4l^$3>udqW}nRO%lqmsDh=SBi>^PFg_A058JI^#eF(*Di`53+r2jw69)4{2A3 z)Cq!+wZ;f*W>G>$t7$TQ194Z*HK_wjA=o|M6Wbq5AsTd%3zHKZDUA?Y;zF>iojf7J z^MSdpCTS8o4d>oJ)|GpjiJ(8bn6=&O&RWGZrdG3xh7v9H!GK|t}v)3Ha5wG&NH_8vcy9*LVF4Bp?S zg!!oAJeb4ojcKvE{L;aZ@Dy=r*7o?<6Ev8GxAfs>y8`?LCD+TgXoDxO$-yl`i7E#& zl&NEP#pw`!_Y)d!3&iI(I8t_&Pc{!O+clCZf;C>6>ob13T+%%n>`86ur|FUEI- zv?x_}X0lm4`$)k*z^g!t>RPH@d!RS2#a&dkmydh@ruyT)#z59(mKfFH3G(-vIqAo22Y9IKn$GdoSsDJPI zd9HC-{BEm6d+?1pQ6YrS+#Q8;pTt!%F%GBin!8}%E+eQD4aboa-4 z5(SDtphr7UfGsE_1$f?2!bk4F+r7*OlusJA<)d>$sBKt*?`Tk{YLxT@u+6l9e8FkGPZ31VPhqX0BJ>2@gmFA~B^Ic?CXY!6ppnpH^jZ48MuirK^) zq;z0$g}6i5+xO7k+qsN`JlYujTwQ=r*e&1nq}GR$C^(m$BGlr1Qb8_Xt2-SXV1lP; z1NOoj9ie0O)4XrbQPR2(;qHyekr4Kr+7Amiy+^PxJ!NQ?#56ymHRlW|_q z;&Or>aGNJny!S7u{*4cJa&e|dUz2~(7c(q_-jHhe@NFg6#W!2+XQ^ySTRc@Nfr}DJ zDPgdUWSADaSyI2XzI`{s2mEVGMALV85MNpyw;%S?f0`B1V;yL!WmPTy4w*cO`98DkwbDyM{P5!`5wysF95&$>7rQh!m*vXH2z!@?4fLdbd zjA*;&RVb?OKbS?OLiTu^KrX!KZ9$5dR_Ct-H=w&TQwO<8I{Vw7*j@yb%k(qwz7wQ! z#CBNp$VQLSnx_5KBz>W-=YFBbvD2X9XT|c5tW}EDcc?R$Pf6ClJbsCfm1`A*bvPao ze0h9DJc70ksrtP1VRAk1h5*R2+e=J6IZzT-dWMYEVwx?uJ7cfq_~h8LKRo zJluqFlD54Tc!=Joa|^#FSSZ=npGv9b zc_>0k)Oh?jKF#c-3PGWodlEUpazi&V(++`yw`09VAVu9@iMG%UqX7rv@i>!;!WEws zDuhddygR1dGahMiImO{j;ESQEcZR>CC09YG#F7w0p!PEq-Gf^&rxgubucH}ERHHY2 zos#iikIyQ*>$}o;4?(T_yf}M}I4Pg~`d{Q85J*Lfj^+M+c1CpmxRV^;?lh#{#;~T9 z;9j{hR41sJ|Jkxk7V#N=0Qf9vZ%!E=-p&wLz{+MW^woKeKX@wDTz$*Pi#FYZ<`g1S zLP?o!lI4jIxO>Sme|i}9vBGC^v3%8D?RVz|GAhNk+FLkIzWuw1jRX<%84B2x5H2(9 zwYOBbi+i3lk|1EEDaJpX#(YcVj+N@Wr;#eXB6R+%W<5pCVNqL?k{)io=9mPkrP00aqQH^| zNd>fZVD3_jTtv?#pG9v^{aGhj>{WmBTAMwx{ku-$*E_g4vfVz~dbJ2#M0VujD6D8G zm21rs^fP$|(v%ghgernTv~6L0IqXRx+6~mPH$4VSU{gWE26X>y^=mihC7{*)&%&L$JTETKbl|I55=G&wHjREgd*Nc3WD^ z^Ugts_MCjrr!5!12FjBqh_{O*LG;IqRr=o9U~KZXxG>`Ckc{>)%vUV<5<_yo4}Bz{ z6U4Z|X5&kpwobcs^qtv1iLB0w{M>J|+aAxiOBecf&{!o1fC~tV$7W`4SXlShAA|oa^~QIVRL`0NYRZ z5`5g~h`bTxI-SBr8V-LVPRbW}LTF3f4pjh8$eaKkpk5Ch#Km0&*8vaw!$u2EHW8q7 z^i%lrxKvsV2qW0~Q5!a~cr{I>i}Z}mrpIgJoB(LuhK+#~TVhq`r3&~`=_F6#iz}5e zh(j2}$iKB*dl~xE7;cRsJvsP_8xVa%j3kAVAt-$a=+RR^^g*5K2)If34Z;B;iGDM@ z_Iw*gY7)((JMGX&qCk^S8S_0J?x@`wZqMo7w^6+NGcO4zt9;E|CBc$yE8``!pC!ZD zJXkPTaO-6SWi$@wYayU^JFT?|z+ey*lE*CL5|?CR1A*n%hXGw}5j>O3V#^w|#l!tF z?wkBLzYag?;k;V7N_G>u3BYv?@9; zp2O|>+NQt{8-CW7blyk^UMS-G&0+Nwf_PrGx@qs#@R$hh_^D!_pXq}d6&rTC$sFC~ zmp=&m(!Et?6YV5cmrAvv;iCGv@XOa12Vg5#yiuV`5L0*xnTGxSEZr0YYl#$`iJIo@ z`*$k1g@QpkTDSJ&XHd50*XM42!XRcTmN|>J!PU7rGU{YL6biEL+|=)7ai7RFNg2cm zmlNHZeqR^Bg z>)WJzn1t#DbiAr;dts#rR@_`(D%rwZT!p+BRD!%lVjx21X(us^uXf+N9hRc_13J)I zFlNuxP9F5-j%cvtN3Q1*mn8QYLVRCY*~jskJBENbMI4rCx#^(sh!Glgorj7d?fuRO-U&IB2Z4DsLIyMK}FSTKnze}|$vfpPw# zAKDw4768rGwqBRsVr)eU_1D#Z(#xOuU7?xx2S}xv(|fqW2D!5-* zE_PY8z7HWnh{yWBVDSBbJ1V7-;4J!7^G-g3GVR)UGA{|x!t!_{=lfx9_!EfY?Fc-e z`n31Lh-@upu}XZTXz(ywIK(M?-j4J3%tlctQomFQ+r&0nmX_y%qpyymfA#4~%c#0v zukiASYmh9v+N{Qa4R_(Z6m4}d5r_ax53G$TQewCCgmJ%e&L2efG>ZPgyZmv8)j!Tx zhHeeA^+TV>Tq{gDK-T<>PTy2+nS&egZqGN@`|-W!JiS`1syMCdUM2L^+HCzZpY||*}t(H{^^*Qv0j% z_}S@^Wraqk+-QVA#FWPS@+x)yBic0*8iR>)1I8jP8Y2b^uEIMgebZ*DHyp1VO~1S+ z_zHg->img1f=Bm@#%wPWcLq)h#B&vr_=~D7l4U zpxrKXGVrKEV2E3)*HnqyajkD4kk)tH&d6BS5@j^#!U_>DE|-Hm20U+>>yP6N(}{m` zM^V8a-e9v-St7zZBjD-EgBOKMXZCiED!APtD?u<7Se%&S0R?To-biRshO%)eZkI<2JPMk(5(o4hMtQ@Ie`#)Bed-E60|_K4PJC!b z^q`exK2#g7auIqRT+EHhli$k6jh#jVJzRI{pI$|I3DX8FVn6q|vwv|Yl_6LExFqtr z;Bq*GXKAGnrJ#XRfZ4L;s(h6lfjRV@mw4^Re2}MaV)n{FP;3>_PR>YdsaB&=lA?uGGB!+O7R_; zs%WUtODhC}6=8Wr!Y2j63mL;cu<+l8%-9LqE}%P-AuD4f)g)_dIRr?kQsBKMdpLV* zC9c#8=z=4j3fLUp+xT-L1rDSIi#0NAZ3@pi-te_8r2@fNnz^zL7+Gaw_N`P9jW{hL z;f3iKnUeYNaeL%@eB;I2PKsnPpQpsVIDa0upKxT8AAsc3;%2yR$1~ zwp;9kCg;dm$QD-bw=#{jcc*S>`VH|+{Bp)b;p^r5cBx|1H=nwP_^}d8>29o|Do=H< zA=!yDcIsdqBG%&wqN23i?`r7C830zmPVzC!xYENR`WM4<)RNxZbVpBSB{4Aei;QIPj&oyaCEDAOw@IIt`jPBL8 zuoHYKGtssc6ebD;hWe~EaVIdVW}+(1IC4nKC%JG7uqmD*h28Ym-<*woFf!SvKd#U} zw-o3>Hvv#|=9Nd;w*c=98|_RXj77(y8XnB`Ur8$8EbLlwT7 zty1|VZQGl&Z$_}ka{Kg`Qw8AvsOO5%(8X~lh-5G9&Z8%_um`1jr9D}7)5Fs!?DA16(>j*`Vre83MtXSI zz0G|jv91zk+m?1P@w;}({@<-=S^{x+qGJ!&f>lwC(BKqWOjW_^Y8cFNI55PEzky(1 z+Zl9aZcaGnsYP@$JpopTZ7W#C{q*G*M2R2&@g?~Rk06$OC2Pi68xCzz1CBaAL%3e& zKp!GT`n{*{={#*%YQE2*;J21rX29wC<#|3&fghyZElYI zbX8Pu2^2Hp?~jBXXm+>O2TR@+X=;`Ih9JWCMK9)5Hj7?d&iPuvhRLTjP+_l;>o`}J z8G%_rY0D{iRr5fE0Q}?k)cuk>E(2#H7cMg%5MD$DT7zY4e&H1X)|=dGtRMZnmGLM2 zJak=MbD~@xt+Q~Q#UXZmL}vwl6E>Vt-|&q|ssOxE3$+Y*r}C%Pxp1;l{BGE3jDHo5 z5Ifq6_Q7ucYPmG;*emIXBR#AtXzW#NeESdD`MLR!fqv4Cm?hP|+LpUFZnHfO{X)iD zi-%}7%f@LU&Y0Li7`eqlOy{^b(dQ%@nDjON6nob?$z#bIE!yIAG($}`*OJ^sKkr>! zwDz~LmqZfIpAK1*al#%tl3~-&Q5F^$s{NZMwOb^+uj0^Fv#R&8y!TM72Lw+(Cs6&D zaza3L7SF>I^v)W?xY+B3u*k9EPi|ab2Osc`$M=7h^kR#u{!L3O*Z4*i1M~=fL?O!V z7f6rKh7ixwtb`I2+lVVuDq@dAJhO==?xd!R`$-?JV{ zVBo8!%xEo3F5#K*7e|*}45v7m&xP)a;Zd>6qGG=t1erxkbO^?!1x(F?^l`rKgTP_m zzI%q_`5^Ualo9cA15ZL=%G(btxZ&-PJlKOkB{kjfENh+d9}-m z)Qb^^Mw+ILC&Szs`#-LU*-k(;!Jz>Fw??nPY52jw2gVvzdG$4)6)L!x^6AIPjB)`8 zIf<4$#=Z7Gu8FNCnMeZ~UEw|i{;&F@pICrP_j|&hf@C1;X#I#f7M&#Ki_3(So5&z= zwl}Go7e|CZ>o;+?ZMLB>jj(2oqz0D>-k)<*Xf_$4npnD6JOE2y4S5B=D1Ne#)fz*p zM8%1f?>kHYl7GKK*zFyXa4D;GvHRqTS`>%}Y-5d`j4KPeEWiH)xwVDf-A~KrV$m|q+#A?*! zD^mVkvv{CZ@F+_4k7)wMfnKSBGP|n!KS z{_aV4oqlCC4P(=3y9%oL!)xyX%^nw?39|ghVGrkUned;nA(pt_P5dfZ&a`-`d$Z^L zA<@;exgh%X>e-t%S4{q_&uGgvPPV|TcFs3o1}uDi?sy(4QNhp(@aZ0iO$N6)eXI&P z{GE?|PfF=oq5v+yJ@fPd!iS0=$89Hgx;vdjO_>Xxg3>tU!jjyTktKnX&htRpW*H)d z4@v-bb6J1Mvqh$J$;u?33(dWlrBzda+r4}c^ z@q}%|gyy$(pYobr62F{(tTAO`I2P4@bwo&B1tw}u(RmdGbuKtUR-F^ym~S)0GrQ?J zLP+K`SDv`9|ER|3k)aIbKXiI)b$%K`G9`YqDEGD8IZw1@LnsFHIyjT@UwHb_V#xX! zxaQ|~cI<92KdnPJ)WkDnxyF0dpSSjO*e%iJ+;5{bCsieQ^>7y^v%b80$N9g+63=fw zp?V<2{1;C@o=)QvAS!>2RN}+{e0uOecyCLF%HnH8{MP1Tg7p7VOFU!(Z_n{T+IU&9 zC7j03&ckmNzJ1~T68ZlHsk@6YI&uCq_ToN(IRk?}aZ z*S^4d{R|h{O&P#U_+N}V!i(uIq#nfySCAbB_G18}Zoda%^4BWhhvW;WW?iAyk8YDx z64Xw>zbRXTCuH7&j|-r!GP)3b)4@on5LLCs4WBjGd1K^bH3ba)7kCS+Tz=BJ8g+Bu zE;oCZsaK{co#PgfROzdVbT?8WHq5Ii&yyQg>_Nub{Fbw%h)D4?!Zt`BOsHZF$-t+q zJ_V{2br!njyCYzxR`H#hHYgPp}(0&l1Q+05kRPuw{CjsGMc(<7~p zD0$ew%i@(~Co9y$%&|+kC5QnMg>P}~te{wvWz{LcpmOStIme23_bH+)Y1!k3B;+O+ zKN9`F0HFxL#N8p@#Klj#A8+ym_Tks=yMs{x3*FC?7ei4|q3wjqpk>EjWt@Fac&=I{ z@keKWg_iBw8-Jvq5zO<6YTqt=mPb}L~VZmjv}Y)qivujX&@cpHO#`K8(f2JVr`8a9Zg zSl_vSZS6z4LjLliRDW<$zJ~!0595jYlB?L-9@UxMcx(MI!I5|Q3P&OvttV9}ZD2l*XI7%{UbpP!(UX+xAo03d zM4Zs)_IelwP7gA?Yy`(SP=UeGJLtg)tg@uUjA&l}=2;@q_>g5I3P z4sKCd$w}y_Ar&$<5g zV)A~xe(`>JV;6WeA(-^;7_h+2*}!r#1pn3i7kJ zHd75wH+c|jp84+J1x#fSP|JQhG^Fklw~X}mm5EFUw&#ZmiGcCiv}g$5)5DZLz{APZ5cF^E^8v@vu;?B3!H@Yc zj{TE6;dESUyl9~Woah<~9g`d?Eb}uadW0s;+14yinjWB}qV`s$QLkLw8W2}+fAr#9 zO35pZXxJ<{#y{@lw}}Qn-@RY6@a@D-hzQ_DM{RJaCc<=ZSo4M16vSS0QSFPAL`L`h z1AXR(>W>8efj;YgTRyvP{zf_s`_j-MQ2rPBB&u-(oQ|1us0bK3?Gr)=XSe%nX-5K$ zVTVk*Io@dPNr6a;>5QPP%v|*IK+^^4$KB3r7{H6}6Jr~#&t6gX84WgN0M8CeH9<3P zfMTo#%t`OhKBv{F$QS6O4cY=uq%S2Nc(DR87P?@(73?fAc4frQ4a^KfI}sHASdkwu zyLF(7;TML#V0g*ojsUbx-01gJO&pQ!OuFTY-e@gi&rxu;*~5hyLPJW77ex4{lkUSR z5tQR$T!5hMJIoMp|4jM;H{ZAc=Pg`?yzx#DU_TPib+ZHuWo1yUb3OKJBv7bN?HZ=p zM=uMXdI#6tqp(Y7 z`WY-^5`u;nGf-0{5Z#TX5;vN5Kow<(p{#x+<#&1BvQ?5Huv1X zE0t}AQE1ZW8JCLT@49*{%iqozu!k@Z@6;eS#SsQUr=kNoZCyqo=w?35Ec6eiyD|i{}&MrMZKguQdnQi4iQ1z>p4qf+#WxX zahH=3H4({MbXiGGh5pY}CIcp`3f#8*j@wHNsV%;%b4ZM?Y` zZ989GSl+Kn+wWUFFerVhp_v3X8uhw`#;@|xXRZxq`I$tfYySVnJ^@wZU+%NT1pJku zdL1BQt>yfd904;r75dQ#n+=Unz^I{(Nv6Eu>Ej$ z{T0Ev^~}5*A;!qH30lWLFKVy6x@6ONH`YhCP+hA@bz^n-95DSrId$ho(aMp%Es2{= zVx8*SaX=pH)pQ^-Y4L9nCqrz^-s8ddN}ARtecuyih@+`1SGW^FPL5M^$T!kM?g z+qpqrJhu~v>Z#HQ9aFSKY|45;PZoJXZx&~*=ie|Mfdy9ztCz~HKC@A&QRH zrPtf=5jsx0Ne#j34Z^3&hkP)VG=OdZ;E?OS{)r~|zk+6qkSQ!khzYf(;CObI(b(L` z{4u}CM~5>-_)lv}d-mm}HMNFM3ww>=Oolc;68m?kA#kO|wM9j`<{%BRRvi zHmVXoi%VH7Hs+R}S#o~`5$cb=KypU0fZt4>@q%nY3XD$ef2-xsl%GCJ_u4Yrt|Mam z=ZCS^vH#`I_-9Vjs;*#!+i$vY_8ujf_7RJFfp8MU3UV&|jne~?imH6DGj_lH$1tu7 zN!%+vYA0>D@4DcB+U4ndv)Sg&+X!+=2vsE~F0i!TH^JQKPwYa? zrLHQ9b0U8K;s9xfsgP%Xq_*!MS1r;fK-G1^)h*e?}`8!P(78 zoy^!hEU>(MV3~W>=KU-Y7{gI5XW*chmofy{FuG-AC;9AHjgJF_3XE-3=LOrsV6@$| zFdce147fFud9EpVn-`z@-P(;(#k(D~b~!fNr?}{LZ@6Tp{|< zHtoMNtHYz)1*>P6P>SyHgY${~W9xQ?7uUOx5WIqG+{KnFGOTN*KECL%^Az1T*q`KUFK;!!-2#*wu*<#%P%1ahGWPs_JsItM|;dUV)0r@ zVEoz?zJTc(LqOY>6n8{RiceUNAqdGG*tNtC>djJN&w0XN9*`qcUzzQXQ(OJ#xyLZuTnucvcX z`ZQfPb8g*gcZS1y=IuW(S`%_^5BP+sqW76+hTfe z_QTK%7-_l3v*)0B7O8Oynzy)q-oG9`CXj6k+4-!6Be2s>cK!6L07p1KAb9Ny$eT7r z5Ew|mw@PUC2e1WOXa(LAtBLat(2z9ahZ%Dq9*{TFH~XtGg)lguLttE(7+Zjnf8Q>x z?`l2!YftBaVZfHpm+tQ^%U!U_t;YG(c1zbAePq_w*-vZuW6BCWya>dCCo@GZj_G>R z@HTI5v6kp?<)pr6W5g`7(mG|}$m8fE?y7#6S!FWlidQ|&X&N))0SOf;`wyz(Hl+xG zzYf_QzcHQ%n~iU?3nQFs(68XtGi3w+|Ihw*Al!Ad7juRF~R0X=4i#pi%#Y@ki*+YIPQu= z#;QyjZJ4?*WX5S zt=EKz?vWg@zRl-BV7Zdv_Afo*#zP`Fg?mrQScQUa2g&z44vSUY#~Tw(I`GIi#Z#~V zz`{vOd+e^-H7@MK(Pc|>H6qGI>$e7e63bBplyCQ9eO9));S;E)Oa3+7gVh{#j3`rT zO{-=pNgZ!o98v8M#FVL)ILj_Zc2CN)<31n_=AO!0dO?ZEDuT{?@c8Q~wRMnDkzP>L z%_&(|`<)jd=2mvA7B?>B#GHhWkGa@6Vms3``E?jyPGuX#A=T@`w@s=eLiy~Q+42R(8E^NX3BB7dqm1zHxzHZy62N%td< zq5ey7ze~OV^hn)RSQGUTz#=L@!({ zBsrA%Vb?CVHG4xssT(DxhKL6}uUhl_IVN|`d#G#~PI_MoqQ9Wf%Y*(2i=9T$av`J9 zA^t!5kgdOAtS`$-g5i^t2HcmM9vI^SWZ5O)aM-NhXZz%8zOa~fkS^4MS8SjNDjLQc5M7ZtK@M^B= zVU(t5y^Ja>!7-#-R$_j7w;`;fHn|OX9ZXUK7HtSz=Cs!l8u_(DOzss!9rnP%vq(9% zd>GQbQ?R3m|BfoW#Nmqg8PBcq}41 zLcZ#hNE$+{@aI_W#VKp9!I?|p-EV`0<4VRU1Ybr0PfKf(w8;V%YeZ$bWd?C35IKdtK( zPMJ-I??*g8i(766sr%o2Rv7SO6w*5i;6UuCPos}af>W3)L1yt|sOuOszh>dO{57?J zow#p8_Mn?-EBJ|b^s2^Lwg#W66rbYjD1yjGc8UlB$iv(HtUOZWNV2_p>7y{@aed?? zDfCyO(X8<%)~&=yQ|!0l+{GC6q^|VcVb7r!U8t*Y&rav$_L)t78KqXRFTK|@aQ{Wc z!A;F#>RUAkHV!RbS7{+K4IE6#_~IeYVI623lA(yvb;UBsAWLnhn15m?Zoi}{=1ESy zv`4V2f8hpsRJx~xQPX+sUV)n_Z5;gfd&QfGQ4)+`vBPO7vUl8_RCktDsQd zAc5?nnM~e_#;94A;4^B2gi;YyAw+};i>O!S;qvD%d`mg{XQQ*OnIj>djwaI4p~j}F zj8J0LSe6X2qYeM7Sm+43YGIU0kSlm18HRJrK+z04Yg2MDVnH~l7jwDc1CFcM)i}5!E zmuHiZ>r34?7%(?$as23e=4QvZNte|LIHO=xB{{lywh?iBKU?mlJW|fdwye4?Cn#se zB1(f`T%Y`qmn7eqX9aRPxFj!i*{a&}n}qUdF!tqG6nmUGHS9y9JY#0fePKaDNv+T< z{M*+E@p3c^Bc>^mx;V}|_X*yPu_3s**MX%d$v@-B|9gOGN76O-NYC za6|Zdt#;*SKLu@JLK_Y&H(W7Izq)e)_(STC5HL)v8`v=60`d2u{2vZ3r4{RN{Z)uR z`AX3rXfWJJF}YMly1Zso+bbPfm#19=9nK_M*d__?{f2dUaZ8ss(uvpw9QM3Ji~#l+mzRAU+ZHdldpruUG;#t9n0 z&NKU$G!gfTRo^3R^kdBqf%Og}N=(>S_{3EB@pN&4+t?{?0B)O+>Nig0-Ju#CEJ-Az zq=lBz+Wviv=jQMeu6LNCuS!%NfJFS_1Tuejj~mk|3Tg`7b*=xO&CWI@{r~h04bbP9 z9A5t;5LZ1tQKK?=`lb>0lZ)&Fl2kZGj0Vwbw?a;ik#zYLAQ2-?XBk$0)ohZ;)%r%N zii1_K(2!Yne7YWIN27ZWa0iXbh-*umAp>5k0-Kz-o-QPhNt?BBO8{s1drG{!arPM; z1FfrJpR+mJ&2W-r>daWeCl5aXEkl2-;s0qFs^4&8H-M%oqyWne4aBZsXR6gnBBvrQ zu-k}{bI9y_V3%?GKH_m3hl}pF6S79Ga&n z&icSebp9H{^OP-~pP+xjzb725Rt305jYQu1zi{csnb}YOvV~*9qNc4yzak!v>BZ6h zxyH3FWl?v?c)K!{8+&F(GE8ruzasnAXp8;K6Jutrb_}Az9oNw3Bc1gy#`wc3v#0ZY zi^p>!p&}9*`@$egt1Ggt>;X-uudMFh2gL(^o&4FWEEQRr)fALo<)?trd8mOsKo?%N zU?$IK;4l}iv-LL3lFdn%U>D1b;ID+z8!u+#2KE0{c+DwQ4^?p~M0~mSerO5z zZVJ~<>0|r5-v19-Z{ZhJ+jo6W!O-2^-6icHA>Gp8(2XM?B{~BrE!`y&(nw3{P|__S zAPyiQg3we$oexE;JJ~OlD*t3sg{l06hdA^EY$uTX<4<|!atZFSWA+%OY z|A`Q4cC6Y{^&2s8=3K3C{{JF`6w4kHC1esMG^K*jm})7R*qkC=Np}%$%V4dX=BIVy z9oO2;z>LPA3!6>}vm4y4`R5#e7?{!MlJB0?e?YVCW?9WJAJQkk5Pq+eI^ph?Z@%(Y z?+f0Ow+}1Ow;L4L(e%2ud2n$S4}nkp=CnQBbHVDjA~gGt#2TpR!~MRnz6nyfNy^M} ztDZBNbfJ>C@BixIk8R_BJZOF^$}v&@H%AD2r@Az>_(_Ezm;8~BEyR#DcUkGD4Ui;+ z{u?EfT}l6cM+yBOQ<{xehOiGYSQT=}l-mAQ6xTHY?oAIP(`<2Gmiv~mw4@VZI16Os zQ$}C#Te?Pd6?&KL-e_B#Ae111hgX4(WgFmGS~}~Npn5M%Jw^EMaeAGCij>Tmj9v3N z(88n{tf#yjzNLbw`?~)-NhrO#KipQM2|{j1`mlt-@CnS#dp`|dr?85pz)@J2R3zF-7|5F4`N6w^Q4r_Wfms>In z`(cQoJbK@N?xPxiVXvy?77v^u-rdWw&9{qFL%bU*60xn9bUiN79w`WT8>Jf~ZPigp z;=DRO$7fN zD}u5zffUl#?ce9G-GzxU`6IBS+c*LNa@;T;onX8|9eF9 zJ1@=M)wVwv;)Un#t5eHGV=s!}NT|>2kA3=?boYB%I+52LVF$~SZ~uQIg}C3!%Wr4# zyaOBEnAQu*!OUAlM8+P$`A|-fkVMx^xjB^m;?+la9UN&`@2@MV!qoI-m)>Z{Fq$=J(TUKzQatvw@k(2KsV8U|6JI zeM~A{ujK789DKyWldXu0x&9wZ`Gc3m40}?L(?3p3F>~~GN3D@^%_d2-N zt3n4K@oD}OEJ6Cpl-}fC`z;n@bnPEKJLVElb@2j;c5+DMB=T9!YXR|PRZqp5bQ0Z1 zRQkBGA|Ga-SkRNg)sG&zxr1DYGh|@eeNLdIz2NNu`aV0g#Kv~EwOofRpSj_MYqs-= z_TC)k9z{3Vs`CKGm)`sZHuNgL>FdF@n-7V9T~~LZTjkBQgwqbad3BhO+<5GdwGw}S z)t^rIygh~7aC-ueyQX(B0|{!Mp<`Va!d{4g2L~XG8R#|z!V6Y#Q2I~v2H}>n>$=J< z&8O|tYW3DgSk8h-7H4QLxb;#oj8irtG$wA&Dl>SO32YNNm_oRku8oKx^_M6n?{Cew zlYlP{HzvLS33Ba!+Xafm&9YUZC2yg1wSugRLu_TalHx$B$UD)Z%pHeVB@SJ4M%`4$ z>|n&q8!4VI1Rm6)N)Mo+c`0~5E zApHzyu>0F>g~kc?2-f0|SW9nI-_O0fZ0|uk!FV6tk;?R>E(TN@5y_ZT;wBR?(R=-9 zI^iBkO@{v4%owpZ;Sve)M@o=re5cNO-;SeNB1@+IS4Bz`lixwyi0}Rn+iHo)R6GQULh(U;j&Dkb8lN8UT0flzM)YQ$@)wwv8W{^ z#p^h1gM{tQPCUnhn={))m3gKqb=xz=e)}4!f1hdG%m!BrXCEh}=h?^0wuzNwLkn3R z+7TItBW%lsMg?fNom}auH>Uh|Y7@K)QexmXY5NAxVM03dg&WQZ)(b1&psv&c#gxSa zC)!r^wVIM+O>RkwcJD*6Bbq>~w;dz6WNP))^r!*zM88se+TJQXb)6AKG@W5zHK2u& zxeR|2=Sq_7v<9}f>B-pf_oZ1yI4#NJ`j;)6HIfw$VUfjaN`Co-gM;MxO@4q6Eg)|`BESQfGF$|1=nmnDZN z|3?w^dc|h=>u6&*LzNH75-)YsQXWPN^J(b&U~6pV;D*+Dw;m$2rXsqhG4XvgAdUvMqdV#Pln9%DUVu#snGvq#uUR-&`t^%9aq${7 zFfuU)m1k&s1rnB*q5NJ{NeW=4WQd`nxCG?cO&or`6)L2Ela>t_@5euj^B~-nNdyge zgGEYxQwcS{Z~6KbjyCVI1RS3WJj8Xpaphj43EyZ)fz^U+ZR2kzt07aw|d78&QN?fd!YUgvm*5K z^aOa-8dhWnluSl23Ycz1Txa4};s3Px;Iad9h&apD1tF)Phz~A})EP5~P7*M4QL-?G z6-{1jQd>l>85Ncp{1$Xm@jc3{?*fa5rRnFv7(RQy#jpcb&Sw?77mM z7#4I{9B)SDAZJZsQcx5nyY>o!gvF7sl_yJ*Q|ne>t7dgxqhviJ*Z2n}cSP=#E8gVt z)U#pM`1MbRqD#ru71+z10{R>V6U3=L`q9Q4dpn4*hB8snZziNSu^s2_-u@=)qPy+b zwKs9~xJ6}9L80yMc#N({LyED=VZ2y?ptl=1=npVUw|pp1>CT0DAh}9S->@z#{Q&Xg zmhCspF{>~%sG`qiWmx7JfduVQ?N|5|C4~on!2qzdW)W#lCF?;^lqsKIHXnRPw=xOP zS9T(zj9F_yUB5Ky>=a~DK2(PWQIEQr8tto=@eQHi5@gj<C|fmFdrRaoUu{tQ?h> zgx#?`_Z7O;=T0v1c)YG~&jR!*b@9sR1|v?a=}*`U&PUgf#16t2 zZV0F&uwN$qA%V|_KtaOxF1Pf)=Csf6VeVo8+Xf}H8EE4~y{=qVL-5b7o>sFuR}m~3 zF_>4BsrEz&`4rw;aU6OEo|X7ULbG(5%8AS?cELLr!&Tyd ztMpx8nS95ZKbC;_AmrdZwH}D@{u!@72Ya=~r(k*fTv{DO+9tM0hzrv%X_6ZYN+2}U zEhlY6Y->sXl8IEj&ZKs#P<6@lhE)I>20^7D!Ri62^4(bAV=5zcUAsvNxMeSuhOm$- zPyZKrDv?kZbU47KdfzJ$-u=9Q6(`lJ{r0>nLVn-0O2d+VU7?;+7P6}yMOn}>4`b4M z{L_{C-V_NYqpAl#1tZrh6Tuc0BtNKB-#VdXWX&M493RUf{iHk_cpNDwH(CYSp|GA1 z!-4hGYU8*&kVut>Hp*b2SBGX4Msx4m_;$Haj5Vnt)gaw@sd0d zM0X+}YPiY%{K%wT_)dtntXdY#4`e697~2HXy7R*uzT<}X5fQVm>GbY$X0E|2f2Ax> zerh=9eI+#3_K`LYLnlfKiwC6-QAnU$X}|qxI&-A|GmzTh{Tm^@og?S?8^BW)BZ%Zx zx{TD51Vn(#>H3{|2oGLx_B|z@P|-SURukI$da=RBbBt9+Vg{6L?{POum$u)vnvdvD0-kPF#gW7kpgSI)2?@*&kvs=!p$h3zcQ zVx<1Uslt+ALv{~B_mJ1<_cWG}#HtGS2)`yPY}I!NH+IQrh2^=pytQ16C@$l#nqmAM zpi_fVdI~?McY>UU zknaycDUqXAOvOG22NA#X?*#0eR57*?DlSFl)Gn;PCsUt5gAHU)_jjEvVG=W@M-?PV_`XX#hJ@OIrCu(=)!!*0gE4zbC>q}Xj8qE?Z717)B2ieXWvsho#`#E3r?CGS za8o;4#<%kanfflEA3vY4YxMU_T5IP=L+n8NVNe;Dg=l(ta)JFHI)g_9IJP3~hyXf@ zY%97-eskTi(7ZA*^f$^x;4`&-3~0hUfOtR9Ln=6nXhKnTxr=ydoe{z}{x~8I(igw= zn&d(C(`kf&sd>%>yjuw-kZ!PhiD9ZVEA^?o9o!o(G36KQPwLEt_5EDrx_XYbd>IPy zt=;1R#rn+(kMNVakn7jn3Fs2?qf5KA$}$^{V|4#>LiY43cFjkGBDDSPU|z>B=VLiEXZ zKd(bkNd~^D&A*+v8#a95bc$Mbd=q-HTiam|t0yM)@jIfI!ETXaC zhtm;tIAtVxf7ETPiNqbLuGN=3#D33WZ)3+UuqzkP?b@A}-Mdk8->z}bUVylZzOw(L zyHAb^6Xca%gB9_gUZoEhYeN*ZMe6rl`-?HnH@ji4T!nma9k*sV`@c_hT2NNL*LekX zs1YOU?RWcyr?EwILV(74yOnt{iuHMOvlyRBd*PQwcte94^lR*`n3Z4dQ*Uxp)Qaq97HEh9$IW7wgaLkysUAx4^;UOqZ*(w&lJM=N^A!}ZzvbRm^kO&6T7GhapG;=Y2CvH zEL%-fAoyHL(Y0s0MP9xU+D7U)$`7P(Gz^kd#9(lr62>bB$0os@SGEy+Z}$J`xL-k8 z=^qM!8{EMzW%o~?HPW6BJM&~L0B#vQ;_cxJ&L&jEJFJHU%gFSE-P49Uh=;Y4BrR6Y z)1qm#^TZ?|BwTlL>v|)hLYmVU>+vSAyJoqtvl7)VdViLOhS}5B@a_|Jj47mLX6$1o z&nH!@Qa@aWcj*{O*9i4cdXF2_S}R+aA^0u1TzFh=Q`&r@0RV3dIbTNi5d!dru{2I! zC?cM*ae`%pycBfm!6w?GnsnL#O&t7mzl>zkjC*auDYZKO+>|&GBx}hyF1a5GW%}WD z1zSePaRg`Xr%@OOmEG3B98aPdg|QuSs(Qrtm~#=fSCq6UHj~B#!UOG|XKk0~a3VkO ziDbFXJ)Y_{uprhSmueoQr(77uov~}jiwu_TkUm+5iSy}SP&I#6CAaE&a#=-w`)Ww^ zY@I$}H}-S%PjSh75}TFC=e;dYkCw#wviQ)2M>MdhP0rscX6>uVbT0SYTuK}rVLpeh zd={_*3C$*@q>qdMv%$JX=3!OKjh`+DARDkH`x!YgA?D31OtYw>CGLX9ao>x2Kgs?R zWV-AZ!?%1K0pi`{Us}U70ApUa?48Gym~zCx_}sBUy@&BqyHDr}l*09kG8C6KsfGTzB- z80ee+`+-!a2Yx|lGoT0p*~o8t}8h}bZAL22RuGi6s~47E{vjTt&Zpp*~Ndb19FJA

    QNLR*f-e>^r-k&amYw>b3@uLC6opCL8L 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

    o1d29$OZP-T&Z0!tk5sTbC<@v(I1 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 A_y7O^ From bf8be26253fec1682093cafd7f62edf084409d6b Mon Sep 17 00:00:00 2001 From: Alina Kladieva Date: Wed, 11 Dec 2024 18:07:08 +0100 Subject: [PATCH 18/31] Workaround for sample failure with OV built by VS2022 (#28021) ### Details: When OV is built with VS2022 and imported after datasets module, ov.Core() call fails with access violation error. ### Tickets: - CVS-158167 Signed-off-by: Alina Kladieva --- samples/python/benchmark/bert_benchmark/bert_benchmark.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/python/benchmark/bert_benchmark/bert_benchmark.py b/samples/python/benchmark/bert_benchmark/bert_benchmark.py index f81eac29387182..11055d7a70b163 100755 --- a/samples/python/benchmark/bert_benchmark/bert_benchmark.py +++ b/samples/python/benchmark/bert_benchmark/bert_benchmark.py @@ -9,8 +9,8 @@ import tempfile from time import perf_counter -import datasets import openvino as ov +import datasets from openvino.runtime import get_version from transformers import AutoTokenizer from transformers.onnx import export From b61a685641eff3f46e77036330d34c6f987907dc Mon Sep 17 00:00:00 2001 From: David Nam Date: Wed, 11 Dec 2024 20:32:20 -0800 Subject: [PATCH 19/31] [GPU] support fsv16 for output of group norm bfyx opt kernel (#27906) ### Details: - In group normalization, there can be a case requiring input bfyx and output fsv16 in bfyx opt kernel. ### Tickets: - 156608 --- .../group_normalization_kernel_bfyx_opt.cpp | 1 + .../group_normalization_gpu_test.cpp | 81 +++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/src/plugins/intel_gpu/src/kernel_selector/kernels/group_normalization/group_normalization_kernel_bfyx_opt.cpp b/src/plugins/intel_gpu/src/kernel_selector/kernels/group_normalization/group_normalization_kernel_bfyx_opt.cpp index 806fdfa77755d2..ab65d1ea192c22 100644 --- a/src/plugins/intel_gpu/src/kernel_selector/kernels/group_normalization/group_normalization_kernel_bfyx_opt.cpp +++ b/src/plugins/intel_gpu/src/kernel_selector/kernels/group_normalization/group_normalization_kernel_bfyx_opt.cpp @@ -20,6 +20,7 @@ ParamsKey GroupNormalizationKernelBfyx::GetSupportedKey() const { k.EnableInputLayout(DataLayout::bfzyx); k.EnableOutputLayout(DataLayout::bfyx); k.EnableOutputLayout(DataLayout::bfzyx); + k.EnableOutputLayout(DataLayout::b_fs_yx_fsv16); k.EnableBatching(); k.EnableTensorOffset(); k.EnableTensorPitches(); diff --git a/src/plugins/intel_gpu/tests/unit/test_cases/group_normalization_gpu_test.cpp b/src/plugins/intel_gpu/tests/unit/test_cases/group_normalization_gpu_test.cpp index 63d7bef3f8b948..e877d06beec83a 100644 --- a/src/plugins/intel_gpu/tests/unit/test_cases/group_normalization_gpu_test.cpp +++ b/src/plugins/intel_gpu/tests/unit/test_cases/group_normalization_gpu_test.cpp @@ -4,8 +4,13 @@ #include "test_utils.h" #include "random_generator.hpp" +#include "program_wrapper.h" +#include "pass_manager.h" + #include #include +#include +#include #include "openvino/reference/group_normalization.hpp" #include "intel_gpu/runtime/compilation_context.hpp" @@ -156,3 +161,79 @@ INSTANTIATE_TEST_SUITE_P( ::testing::ValuesIn({padding(), padding({0, 0, 1, 1})}))); } // anonymous namespace + +#ifdef ENABLE_ONEDNN_FOR_GPU +TEST(group_normalization, input_bfyx_output_fsv16) { + auto& engine = get_test_engine(); + + auto in_layout = layout{ ov::PartialShape{1, 3, 3, 2}, data_types::f32, format::bfyx }; + auto scale_layout = layout{ ov::PartialShape{1, 1, 1, 1}, data_types::f32, format::bfyx }; + auto bias_layout = layout{ ov::PartialShape{1, 1, 1, 1}, data_types::f32, format::bfyx }; + + auto input_mem = engine.allocate_memory(in_layout); + auto scale_mem = engine.allocate_memory(scale_layout); + auto bias_mem = engine.allocate_memory(bias_layout); + + set_values(input_mem, + { 0.125, 0.125, 0.875, -0.125, 0.125, 0.750, + 0.875, -0.375, -0.375, -1.000, -0.625, -1.000, + -0.125, -0.750, -0.250, 0.625, -0.500, -0.875 }); + set_values(scale_mem, { 0.125 }); + set_values(bias_mem, { 0.75 }); + + topology topology_g( + input_layout("input", in_layout), + input_layout("scale", scale_layout), + input_layout("bias", bias_layout), + group_normalization("group_normalization", input_info("input"), input_info("scale"), input_info("bias"), static_cast(1), 0.0025), + permute("output", input_info("group_normalization"), {0, 1, 2, 3}) + ); + + topology topology_t( + input_layout("input", in_layout), + input_layout("scale", scale_layout), + input_layout("bias", bias_layout), + reorder("reorder1", input_info("input"), format::b_fs_yx_fsv16, data_types::f32), + group_normalization("group_normalization", input_info("reorder1"), input_info("scale"), input_info("bias"), static_cast(1), 0.0025), + reorder("reorder2", input_info("group_normalization"), format::b_fs_yx_fsv16, data_types::f32), + permute("output", input_info("reorder2"), {0, 1, 2, 3}) + ); + + ExecutionConfig config = get_test_default_config(engine); + ov::intel_gpu::ImplementationDesc gn_impl = { format::bfyx, "", impl_types::ocl }; + config.set_property(ov::intel_gpu::force_implementations(ov::intel_gpu::ImplForcingMap{{"group_normalization", gn_impl}})); + config.set_property(ov::intel_gpu::allow_new_shape_infer(true)); + config.set_property(ov::intel_gpu::optimize_data(true)); + + network network_g(engine, topology_g, config); + network_g.set_input_data("input", input_mem); + network_g.set_input_data("scale", scale_mem); + network_g.set_input_data("bias", bias_mem); + + auto outputs_g = network_g.execute(); + auto output_g = outputs_g.at("output").get_memory(); + cldnn::mem_lock output_mem_g(output_g, get_test_stream()); + + auto program = program::build_program(engine, topology_t, config, false, true); + auto& reorder_node = program->get_node("reorder1"); + std::vector layouts = {in_layout}; + reorder_node.set_output_layouts(layouts, false); + program_wrapper::build(*program); + + network network_t(program); + network_t.set_input_data("input", input_mem); + network_t.set_input_data("scale", scale_mem); + network_t.set_input_data("bias", bias_mem); + + auto outputs_t = network_t.execute(); + auto output_t = outputs_g.at("output").get_memory(); + cldnn::mem_lock output_mem_t(output_t, get_test_stream()); + + ASSERT_EQ(output_mem_g.size(), output_mem_t.size()); + ASSERT_EQ(outputs_g.begin()->first, outputs_t.begin()->first); + + for (std::size_t i = 0; i < output_mem_t.size(); i++) { + ASSERT_NEAR(output_mem_t[i], output_mem_g[i], 0.0001); + } +} +#endif // ENABLE_ONEDNN_FOR_GPU \ No newline at end of file From 45bf77b842077a058e60f1de47626397c1d1e8e8 Mon Sep 17 00:00:00 2001 From: Egor Duplenskii Date: Thu, 12 Dec 2024 05:39:06 +0100 Subject: [PATCH 20/31] [CPU] Introduce clang-format (#27944) --- src/plugins/intel_cpu/CMakeLists.txt | 3 +- src/plugins/intel_cpu/src/cache/cache_entry.h | 31 +- src/plugins/intel_cpu/src/cache/lru_cache.h | 21 +- .../intel_cpu/src/cache/multi_cache.cpp | 4 +- src/plugins/intel_cpu/src/cache/multi_cache.h | 40 +- src/plugins/intel_cpu/src/compiled_model.cpp | 24 +- src/plugins/intel_cpu/src/compiled_model.h | 4 +- src/plugins/intel_cpu/src/config.cpp | 37 +- src/plugins/intel_cpu/src/config.h | 22 +- src/plugins/intel_cpu/src/cpu_memory.cpp | 188 +- src/plugins/intel_cpu/src/cpu_memory.h | 79 +- src/plugins/intel_cpu/src/cpu_shape.cpp | 28 +- src/plugins/intel_cpu/src/cpu_shape.h | 41 +- .../intel_cpu/src/cpu_streams_calculation.cpp | 36 +- .../intel_cpu/src/cpu_streams_calculation.hpp | 23 +- src/plugins/intel_cpu/src/cpu_tensor.cpp | 19 +- src/plugins/intel_cpu/src/cpu_tensor.h | 10 +- src/plugins/intel_cpu/src/cpu_types.cpp | 8 +- .../intel_cpu/src/dnnl_extension_utils.cpp | 230 +- .../intel_cpu/src/dnnl_extension_utils.h | 25 +- .../intel_cpu/src/dnnl_postops_composer.cpp | 5 +- .../intel_cpu/src/dnnl_postops_composer.h | 6 +- .../src/dnnl_postops_composer_legacy.cpp | 42 +- .../src/dnnl_postops_composer_legacy.h | 8 +- src/plugins/intel_cpu/src/edge.cpp | 94 +- src/plugins/intel_cpu/src/edge.h | 55 +- .../plugin/x64/debug_capabilities.cpp | 94 +- .../plugin/x64/debug_capabilities.hpp | 46 +- .../emitters/plugin/x64/jit_bf16_emitters.hpp | 19 +- .../plugin/x64/jit_conversion_emitters.cpp | 363 +-- .../plugin/x64/jit_conversion_emitters.hpp | 46 +- .../emitters/plugin/x64/jit_dnnl_emitters.cpp | 56 +- .../emitters/plugin/x64/jit_dnnl_emitters.hpp | 56 +- .../plugin/x64/jit_dnnl_ext_emitters.hpp | 147 +- .../plugin/x64/jit_eltwise_emitters.cpp | 967 ++++--- .../plugin/x64/jit_eltwise_emitters.hpp | 619 +++-- .../src/emitters/plugin/x64/jit_emitter.cpp | 81 +- .../src/emitters/plugin/x64/jit_emitter.hpp | 72 +- .../plugin/x64/jit_load_store_emitters.cpp | 999 ++++---- .../plugin/x64/jit_load_store_emitters.hpp | 131 +- .../src/emitters/plugin/x64/utils.cpp | 52 +- .../src/emitters/plugin/x64/utils.hpp | 16 +- .../snippets/cpu_kernel_executor_table.hpp | 32 +- .../snippets/cpu_runtime_configurator.cpp | 19 +- .../snippets/cpu_runtime_configurator.hpp | 5 +- .../snippets/jit_container_emitter.cpp | 18 +- .../snippets/jit_container_emitter.hpp | 8 +- .../snippets/jit_snippets_call_args.cpp | 19 +- .../snippets/jit_snippets_call_args.hpp | 28 +- .../snippets/utils/debug_caps_config.cpp | 8 +- .../snippets/utils/debug_caps_config.hpp | 12 +- .../emitters/snippets/x64/cpu_generator.cpp | 309 ++- .../emitters/snippets/x64/cpu_generator.hpp | 18 +- .../x64/jit_brgemm_copy_b_emitter.cpp | 40 +- .../x64/jit_brgemm_copy_b_emitter.hpp | 24 +- .../snippets/x64/jit_brgemm_emitter.cpp | 55 +- .../snippets/x64/jit_brgemm_emitter.hpp | 23 +- .../snippets/x64/jit_debug_emitter.cpp | 26 +- .../snippets/x64/jit_debug_emitter.hpp | 48 +- .../snippets/x64/jit_fill_emitter.cpp | 18 +- .../snippets/x64/jit_fill_emitter.hpp | 23 +- .../snippets/x64/jit_horizon_emitter.cpp | 38 +- .../snippets/x64/jit_horizon_emitter.hpp | 26 +- .../snippets/x64/jit_kernel_emitter.cpp | 61 +- .../snippets/x64/jit_kernel_emitter.hpp | 51 +- .../snippets/x64/jit_loop_emitters.cpp | 139 +- .../snippets/x64/jit_loop_emitters.hpp | 58 +- .../snippets/x64/jit_memory_emitters.cpp | 49 +- .../snippets/x64/jit_memory_emitters.hpp | 46 +- .../x64/jit_perf_count_chrono_emitters.cpp | 33 +- .../x64/jit_perf_count_chrono_emitters.hpp | 24 +- .../x64/jit_perf_count_rdtsc_emitters.cpp | 35 +- .../x64/jit_perf_count_rdtsc_emitters.hpp | 28 +- .../x64/jit_segfault_detector_emitter.cpp | 38 +- .../x64/jit_segfault_detector_emitter.hpp | 29 +- .../snippets/x64/jit_snippets_emitters.cpp | 78 +- .../snippets/x64/jit_snippets_emitters.hpp | 51 +- .../snippets/x64/kernel_executors/brgemm.cpp | 56 +- .../snippets/x64/kernel_executors/brgemm.hpp | 41 +- .../x64/kernel_executors/brgemm_amx.cpp | 148 +- .../x64/kernel_executors/brgemm_amx.hpp | 82 +- .../x64/kernel_executors/brgemm_base.cpp | 155 +- .../x64/kernel_executors/brgemm_base.hpp | 130 +- .../x64/kernel_executors/brgemm_copy_b.cpp | 177 +- .../x64/kernel_executors/brgemm_copy_b.hpp | 140 +- .../src/emitters/snippets/x64/utils.cpp | 63 +- .../src/emitters/snippets/x64/utils.hpp | 27 +- .../src/emitters/snippets/x64/verbose.cpp | 98 +- .../src/emitters/snippets/x64/verbose.hpp | 23 +- src/plugins/intel_cpu/src/emitters/utils.cpp | 25 +- src/plugins/intel_cpu/src/emitters/utils.hpp | 13 +- src/plugins/intel_cpu/src/extension.cpp | 57 +- src/plugins/intel_cpu/src/graph.cpp | 493 ++-- src/plugins/intel_cpu/src/graph.h | 83 +- src/plugins/intel_cpu/src/graph_context.cpp | 9 +- src/plugins/intel_cpu/src/graph_context.h | 13 +- src/plugins/intel_cpu/src/graph_dumper.cpp | 139 +- src/plugins/intel_cpu/src/graph_dumper.h | 18 +- src/plugins/intel_cpu/src/graph_optimizer.cpp | 583 +++-- src/plugins/intel_cpu/src/graph_optimizer.h | 81 +- src/plugins/intel_cpu/src/infer_request.cpp | 72 +- src/plugins/intel_cpu/src/infer_request.h | 7 +- src/plugins/intel_cpu/src/memory_control.cpp | 46 +- .../src/memory_desc/blocked_memory_desc.cpp | 8 +- .../src/memory_desc/blocked_memory_desc.h | 10 +- .../memory_desc/cpu_blocked_memory_desc.cpp | 112 +- .../src/memory_desc/cpu_blocked_memory_desc.h | 16 +- .../src/memory_desc/cpu_memory_desc.h | 35 +- .../src/memory_desc/cpu_memory_desc_utils.cpp | 67 +- .../src/memory_desc/cpu_memory_desc_utils.h | 44 +- .../memory_desc/dnnl_blocked_memory_desc.cpp | 190 +- .../memory_desc/dnnl_blocked_memory_desc.h | 40 +- .../src/memory_desc/dnnl_memory_desc.cpp | 46 +- .../src/memory_desc/dnnl_memory_desc.h | 19 +- .../src/memory_desc/empty_memory_desc.h | 12 +- src/plugins/intel_cpu/src/memory_state.cpp | 90 +- src/plugins/intel_cpu/src/memory_state.h | 30 +- .../intel_cpu/src/mlas/thread_pool.hpp | 2 + src/plugins/intel_cpu/src/node.cpp | 608 +++-- src/plugins/intel_cpu/src/node.h | 270 +- .../intel_cpu/src/nodes/adaptive_pooling.cpp | 105 +- .../intel_cpu/src/nodes/adaptive_pooling.h | 16 +- .../intel_cpu/src/nodes/batch_to_space.cpp | 67 +- .../intel_cpu/src/nodes/batch_to_space.h | 18 +- src/plugins/intel_cpu/src/nodes/bin_conv.cpp | 473 ++-- src/plugins/intel_cpu/src/nodes/bin_conv.h | 49 +- src/plugins/intel_cpu/src/nodes/broadcast.cpp | 49 +- src/plugins/intel_cpu/src/nodes/broadcast.h | 15 +- src/plugins/intel_cpu/src/nodes/bucketize.cpp | 214 +- src/plugins/intel_cpu/src/nodes/bucketize.h | 8 +- .../src/nodes/causal_mask_preprocess.cpp | 27 +- .../src/nodes/causal_mask_preprocess.h | 2 +- src/plugins/intel_cpu/src/nodes/col2im.cpp | 43 +- src/plugins/intel_cpu/src/nodes/col2im.h | 2 +- .../intel_cpu/src/nodes/color_convert.cpp | 577 ++--- .../intel_cpu/src/nodes/color_convert.h | 42 +- .../common/arbitrary_order_desc_creator.cpp | 24 +- .../common/arbitrary_order_desc_creator.h | 4 +- .../src/nodes/common/blocked_desc_creator.cpp | 49 +- .../src/nodes/common/blocked_desc_creator.h | 23 +- .../src/nodes/common/cpu_convert.cpp | 499 ++-- .../intel_cpu/src/nodes/common/cpu_convert.h | 14 +- .../intel_cpu/src/nodes/common/cpu_memcpy.h | 14 +- src/plugins/intel_cpu/src/nodes/common/defs.h | 12 +- .../src/nodes/common/dnnl_executor.cpp | 16 +- .../src/nodes/common/dnnl_executor.h | 119 +- .../intel_cpu/src/nodes/common/fp16_utils.h | 6 +- .../src/nodes/common/permute_kernel.cpp | 157 +- .../src/nodes/common/permute_kernel.h | 8 +- .../src/nodes/common/reorder_prim.cpp | 9 +- .../intel_cpu/src/nodes/common/softmax.cpp | 105 +- .../intel_cpu/src/nodes/common/softmax.h | 24 +- .../src/nodes/common/tile_broadcast_utils.cpp | 116 +- .../src/nodes/common/tile_broadcast_utils.h | 21 +- .../intel_cpu/src/nodes/common/uni_simd.h | 618 ++--- src/plugins/intel_cpu/src/nodes/composite.cpp | 4 +- src/plugins/intel_cpu/src/nodes/concat.cpp | 210 +- src/plugins/intel_cpu/src/nodes/concat.h | 16 +- src/plugins/intel_cpu/src/nodes/conv.cpp | 638 ++--- src/plugins/intel_cpu/src/nodes/conv.h | 97 +- src/plugins/intel_cpu/src/nodes/convert.cpp | 43 +- src/plugins/intel_cpu/src/nodes/convert.h | 31 +- .../src/nodes/ctc_greedy_decoder.cpp | 22 +- .../intel_cpu/src/nodes/ctc_greedy_decoder.h | 9 +- .../src/nodes/ctc_greedy_decoder_seq_len.cpp | 43 +- .../src/nodes/ctc_greedy_decoder_seq_len.h | 8 +- src/plugins/intel_cpu/src/nodes/ctc_loss.cpp | 53 +- src/plugins/intel_cpu/src/nodes/ctc_loss.h | 12 +- src/plugins/intel_cpu/src/nodes/cum_sum.cpp | 100 +- src/plugins/intel_cpu/src/nodes/cum_sum.h | 14 +- src/plugins/intel_cpu/src/nodes/deconv.cpp | 518 ++-- src/plugins/intel_cpu/src/nodes/deconv.h | 47 +- src/plugins/intel_cpu/src/nodes/def_conv.cpp | 379 +-- src/plugins/intel_cpu/src/nodes/def_conv.h | 108 +- .../intel_cpu/src/nodes/depth_to_space.cpp | 62 +- .../intel_cpu/src/nodes/depth_to_space.h | 6 +- .../intel_cpu/src/nodes/detection_output.cpp | 412 +-- .../intel_cpu/src/nodes/detection_output.h | 74 +- src/plugins/intel_cpu/src/nodes/dft.cpp | 77 +- src/plugins/intel_cpu/src/nodes/dft.h | 6 +- src/plugins/intel_cpu/src/nodes/eltwise.cpp | 1854 +++++++------- src/plugins/intel_cpu/src/nodes/eltwise.h | 77 +- .../intel_cpu/src/nodes/embedding_bag.cpp | 25 +- .../intel_cpu/src/nodes/embedding_bag.h | 42 +- .../src/nodes/embedding_bag_offsets.cpp | 53 +- .../src/nodes/embedding_bag_offsets.h | 8 +- .../src/nodes/embedding_bag_packed.cpp | 56 +- .../src/nodes/embedding_bag_packed.h | 8 +- .../src/nodes/embedding_segments_sum.cpp | 44 +- .../src/nodes/embedding_segments_sum.h | 8 +- .../nodes/executors/common/ref_convert.cpp | 11 +- .../nodes/executors/common/ref_convert.hpp | 11 +- .../executors/common/ref_opt_transpose.cpp | 105 +- .../executors/common/ref_opt_transpose.hpp | 27 +- .../nodes/executors/common/ref_transpose.cpp | 20 +- .../nodes/executors/common/ref_transpose.hpp | 24 +- .../intel_cpu/src/nodes/executors/convert.cpp | 3 +- .../intel_cpu/src/nodes/executors/convert.hpp | 9 +- .../src/nodes/executors/convert_list.cpp | 9 +- .../src/nodes/executors/convert_list.hpp | 17 +- .../src/nodes/executors/debug_messages.hpp | 36 +- .../intel_cpu/src/nodes/executors/deconv.cpp | 7 +- .../intel_cpu/src/nodes/executors/deconv.hpp | 12 +- .../src/nodes/executors/deconv_list.cpp | 7 +- .../src/nodes/executors/deconv_list.hpp | 16 +- .../src/nodes/executors/dnnl/dnnl_aliases.hpp | 2 +- .../executors/dnnl/dnnl_fullyconnected.hpp | 9 +- .../dnnl/dnnl_fullyconnected_primitive.cpp | 22 +- .../executors/dnnl/dnnl_matmul_primitive.cpp | 16 +- .../dnnl/dnnl_shape_agnostic_data.hpp | 3 +- .../src/nodes/executors/dnnl/dnnl_utils.cpp | 8 +- .../intel_cpu/src/nodes/executors/eltwise.cpp | 4 +- .../intel_cpu/src/nodes/executors/eltwise.hpp | 53 +- .../src/nodes/executors/eltwise_list.cpp | 7 +- .../src/nodes/executors/eltwise_list.hpp | 28 +- .../src/nodes/executors/executor.cpp | 17 +- .../src/nodes/executors/executor.hpp | 65 +- .../src/nodes/executors/executor_config.hpp | 2 +- .../executors/executor_implementation.hpp | 20 +- .../fullyconnected_implementations.cpp | 16 +- .../src/nodes/executors/graph_emitter.hpp | 14 +- .../nodes/executors/implementation_utils.hpp | 35 +- .../src/nodes/executors/interpolate.cpp | 332 +-- .../src/nodes/executors/interpolate.hpp | 106 +- .../src/nodes/executors/interpolate_list.cpp | 7 +- .../src/nodes/executors/interpolate_list.hpp | 23 +- .../src/nodes/executors/memory_arguments.hpp | 2 +- .../src/nodes/executors/mlas/mlas_gemm.cpp | 3 +- .../nodes/executors/mlas/mlas_transpose.cpp | 246 +- .../nodes/executors/mlas/mlas_transpose.hpp | 19 +- .../intel_cpu/src/nodes/executors/mvn.cpp | 48 +- .../intel_cpu/src/nodes/executors/mvn.hpp | 29 +- .../src/nodes/executors/mvn_list.cpp | 7 +- .../src/nodes/executors/mvn_list.hpp | 14 +- .../intel_cpu/src/nodes/executors/pooling.cpp | 4 +- .../intel_cpu/src/nodes/executors/pooling.hpp | 12 +- .../src/nodes/executors/pooling_list.cpp | 7 +- .../src/nodes/executors/pooling_list.hpp | 21 +- .../src/nodes/executors/precision_matcher.cpp | 9 +- .../nodes/executors/precision_translation.cpp | 4 +- .../nodes/executors/precision_translation.hpp | 27 +- .../src/nodes/executors/printers.cpp | 20 +- .../src/nodes/executors/printers.hpp | 24 +- .../intel_cpu/src/nodes/executors/reduce.cpp | 4 +- .../intel_cpu/src/nodes/executors/reduce.hpp | 12 +- .../src/nodes/executors/reduce_list.cpp | 7 +- .../src/nodes/executors/reduce_list.hpp | 23 +- .../src/nodes/executors/transpose.cpp | 30 +- .../src/nodes/executors/transpose.hpp | 9 +- .../src/nodes/executors/transpose_list.cpp | 19 +- .../src/nodes/executors/transpose_list.hpp | 39 +- .../src/nodes/executors/type_mask.hpp | 46 +- .../src/nodes/executors/x64/jit_transpose.cpp | 14 +- .../src/nodes/executors/x64/jit_transpose.hpp | 11 +- ...xperimental_detectron_detection_output.cpp | 74 +- .../experimental_detectron_detection_output.h | 26 +- ...ectron_generate_proposals_single_image.cpp | 179 +- ...etectron_generate_proposals_single_image.h | 26 +- ...erimental_detectron_priorgridgenerator.cpp | 30 +- ...xperimental_detectron_priorgridgenerator.h | 20 +- ...rimental_detectron_roifeatureextractor.cpp | 169 +- ...perimental_detectron_roifeatureextractor.h | 24 +- .../nodes/experimental_detectron_topkrois.cpp | 31 +- .../nodes/experimental_detectron_topkrois.h | 26 +- .../src/nodes/extract_image_patches.cpp | 254 +- .../src/nodes/extract_image_patches.h | 71 +- src/plugins/intel_cpu/src/nodes/eye.cpp | 44 +- src/plugins/intel_cpu/src/nodes/eye.h | 39 +- .../intel_cpu/src/nodes/fake_quantize.cpp | 947 ++++--- .../intel_cpu/src/nodes/fake_quantize.h | 170 +- .../intel_cpu/src/nodes/fullyconnected.cpp | 80 +- .../intel_cpu/src/nodes/fullyconnected.h | 4 +- src/plugins/intel_cpu/src/nodes/gather.h | 11 +- .../intel_cpu/src/nodes/gather_elements.cpp | 45 +- .../intel_cpu/src/nodes/gather_elements.h | 8 +- src/plugins/intel_cpu/src/nodes/gather_nd.cpp | 83 +- src/plugins/intel_cpu/src/nodes/gather_nd.h | 10 +- .../intel_cpu/src/nodes/gather_tree.cpp | 56 +- src/plugins/intel_cpu/src/nodes/gather_tree.h | 10 +- .../src/nodes/generate_proposals.cpp | 182 +- .../intel_cpu/src/nodes/generate_proposals.h | 18 +- .../intel_cpu/src/nodes/grid_sample.cpp | 172 +- .../intel_cpu/src/nodes/grid_sample.hpp | 47 +- src/plugins/intel_cpu/src/nodes/grn.cpp | 16 +- src/plugins/intel_cpu/src/nodes/grn.h | 8 +- src/plugins/intel_cpu/src/nodes/if.cpp | 84 +- src/plugins/intel_cpu/src/nodes/if.h | 31 +- src/plugins/intel_cpu/src/nodes/input.cpp | 172 +- src/plugins/intel_cpu/src/nodes/input.h | 23 +- .../intel_cpu/src/nodes/interaction.cpp | 97 +- src/plugins/intel_cpu/src/nodes/interaction.h | 32 +- .../intel_cpu/src/nodes/interpolate.cpp | 1714 +++++++------ src/plugins/intel_cpu/src/nodes/interpolate.h | 347 ++- .../kernels/jit_eltwise_call_args_ptrs.hpp | 18 +- .../nodes/kernels/scaled_attn/attn_memcpy.cpp | 62 +- .../nodes/kernels/scaled_attn/attn_memcpy.hpp | 1 + .../nodes/kernels/scaled_attn/attn_quant.cpp | 38 +- .../nodes/kernels/scaled_attn/attn_quant.hpp | 1 + .../kernels/scaled_attn/attn_quant_kernel.hpp | 14 +- .../src/nodes/kernels/scaled_attn/common.hpp | 590 ++--- .../nodes/kernels/scaled_attn/executor_pa.cpp | 662 +++-- .../nodes/kernels/scaled_attn/executor_pa.hpp | 3 +- .../scaled_attn/executor_pa_common.cpp | 28 +- .../scaled_attn/executor_pa_common.hpp | 34 +- .../kernels/scaled_attn/mha_single_token.cpp | 107 +- .../kernels/scaled_attn/mha_single_token.hpp | 3 +- .../src/nodes/kernels/scaled_attn/softmax.cpp | 26 +- .../src/nodes/kernels/scaled_attn/softmax.hpp | 2 +- .../kernels/scaled_attn/softmax_kernel.hpp | 362 +-- .../kernels/scaled_attn/transpose_kernel.hpp | 460 +++- .../src/nodes/kernels/x64/brgemm_kernel.cpp | 48 +- .../src/nodes/kernels/x64/dft_uni_kernel.cpp | 10 +- .../src/nodes/kernels/x64/dft_uni_kernel.hpp | 5 +- .../nodes/kernels/x64/gather_uni_kernel.cpp | 513 ++-- .../nodes/kernels/x64/gather_uni_kernel.hpp | 36 +- .../src/nodes/kernels/x64/grid_sample.cpp | 487 ++-- .../src/nodes/kernels/x64/grid_sample.hpp | 93 +- .../src/nodes/kernels/x64/jit_kernel.cpp | 338 ++- .../src/nodes/kernels/x64/jit_kernel.hpp | 785 +++--- .../src/nodes/kernels/x64/jit_kernel_base.cpp | 157 +- .../src/nodes/kernels/x64/jit_kernel_base.hpp | 158 +- .../src/nodes/kernels/x64/mlp_kernel.cpp | 56 +- .../src/nodes/kernels/x64/mlp_kernel.hpp | 108 +- .../nodes/kernels/x64/non_max_suppression.cpp | 62 +- .../nodes/kernels/x64/non_max_suppression.hpp | 30 +- .../src/nodes/kernels/x64/random_uniform.cpp | 247 +- .../src/nodes/kernels/x64/random_uniform.hpp | 34 +- .../src/nodes/kernels/x64/rdft_kernel.cpp | 29 +- .../src/nodes/kernels/x64/rdft_kernel.hpp | 85 +- .../src/nodes/kernels/x64/registers_pool.hpp | 163 +- .../src/nodes/kernels/x64/rms_kernel.cpp | 75 +- .../src/nodes/kernels/x64/rms_kernel.hpp | 54 +- .../src/nodes/kernels/x64/rope_kernel.cpp | 40 +- .../src/nodes/kernels/x64/rope_kernel.hpp | 32 +- src/plugins/intel_cpu/src/nodes/llm_mlp.cpp | 157 +- src/plugins/intel_cpu/src/nodes/llm_mlp.h | 3 +- .../intel_cpu/src/nodes/log_softmax.cpp | 29 +- src/plugins/intel_cpu/src/nodes/log_softmax.h | 8 +- src/plugins/intel_cpu/src/nodes/lora.cpp | 8 +- src/plugins/intel_cpu/src/nodes/lora.h | 6 +- src/plugins/intel_cpu/src/nodes/lrn.cpp | 77 +- src/plugins/intel_cpu/src/nodes/lrn.h | 8 +- .../intel_cpu/src/nodes/mathematics.cpp | 412 +-- src/plugins/intel_cpu/src/nodes/mathematics.h | 15 +- src/plugins/intel_cpu/src/nodes/matmul.cpp | 264 +- src/plugins/intel_cpu/src/nodes/matmul.h | 17 +- .../intel_cpu/src/nodes/matrix_nms.cpp | 104 +- src/plugins/intel_cpu/src/nodes/matrix_nms.h | 34 +- src/plugins/intel_cpu/src/nodes/memory.cpp | 297 +-- src/plugins/intel_cpu/src/nodes/memory.hpp | 56 +- .../intel_cpu/src/nodes/memory_state_base.cpp | 1 + .../intel_cpu/src/nodes/memory_state_base.h | 8 +- src/plugins/intel_cpu/src/nodes/mha.cpp | 410 +-- src/plugins/intel_cpu/src/nodes/mha.h | 71 +- .../intel_cpu/src/nodes/multiclass_nms.cpp | 204 +- .../intel_cpu/src/nodes/multiclass_nms.hpp | 59 +- .../intel_cpu/src/nodes/multinomial.cpp | 13 +- .../intel_cpu/src/nodes/multinomial.hpp | 2 +- src/plugins/intel_cpu/src/nodes/mvn.cpp | 588 +++-- src/plugins/intel_cpu/src/nodes/mvn.h | 81 +- src/plugins/intel_cpu/src/nodes/ngram.cpp | 26 +- src/plugins/intel_cpu/src/nodes/ngram.h | 8 +- src/plugins/intel_cpu/src/nodes/node_config.h | 20 +- .../src/nodes/non_max_suppression.cpp | 281 ++- .../intel_cpu/src/nodes/non_max_suppression.h | 78 +- src/plugins/intel_cpu/src/nodes/non_zero.cpp | 150 +- src/plugins/intel_cpu/src/nodes/non_zero.h | 29 +- src/plugins/intel_cpu/src/nodes/normalize.cpp | 457 ++-- src/plugins/intel_cpu/src/nodes/normalize.h | 62 +- src/plugins/intel_cpu/src/nodes/one_hot.cpp | 34 +- src/plugins/intel_cpu/src/nodes/one_hot.h | 20 +- src/plugins/intel_cpu/src/nodes/pad.cpp | 105 +- src/plugins/intel_cpu/src/nodes/pad.h | 22 +- .../intel_cpu/src/nodes/paged_attn.cpp | 94 +- src/plugins/intel_cpu/src/nodes/paged_attn.h | 5 +- src/plugins/intel_cpu/src/nodes/pooling.cpp | 308 ++- src/plugins/intel_cpu/src/nodes/pooling.h | 12 +- src/plugins/intel_cpu/src/nodes/priorbox.cpp | 45 +- src/plugins/intel_cpu/src/nodes/priorbox.h | 12 +- .../src/nodes/priorbox_clustered.cpp | 18 +- .../intel_cpu/src/nodes/priorbox_clustered.h | 12 +- src/plugins/intel_cpu/src/nodes/proposal.cpp | 37 +- src/plugins/intel_cpu/src/nodes/proposal.h | 14 +- .../intel_cpu/src/nodes/proposal_imp.cpp | 183 +- .../intel_cpu/src/nodes/proposal_imp.hpp | 15 +- .../intel_cpu/src/nodes/psroi_pooling.cpp | 226 +- .../intel_cpu/src/nodes/psroi_pooling.h | 58 +- src/plugins/intel_cpu/src/nodes/qkv_proj.cpp | 89 +- src/plugins/intel_cpu/src/nodes/qkv_proj.h | 5 +- .../intel_cpu/src/nodes/random_uniform.cpp | 185 +- .../intel_cpu/src/nodes/random_uniform.hpp | 28 +- src/plugins/intel_cpu/src/nodes/range.cpp | 50 +- src/plugins/intel_cpu/src/nodes/range.h | 16 +- src/plugins/intel_cpu/src/nodes/rdft.cpp | 622 +++-- src/plugins/intel_cpu/src/nodes/rdft.h | 137 +- src/plugins/intel_cpu/src/nodes/reduce.cpp | 2212 +++++++++-------- src/plugins/intel_cpu/src/nodes/reduce.h | 110 +- src/plugins/intel_cpu/src/nodes/reference.cpp | 26 +- src/plugins/intel_cpu/src/nodes/reference.h | 14 +- .../intel_cpu/src/nodes/region_yolo.cpp | 156 +- src/plugins/intel_cpu/src/nodes/region_yolo.h | 21 +- src/plugins/intel_cpu/src/nodes/reorder.cpp | 129 +- src/plugins/intel_cpu/src/nodes/reorder.h | 25 +- .../intel_cpu/src/nodes/reorg_yolo.cpp | 19 +- src/plugins/intel_cpu/src/nodes/reorg_yolo.h | 12 +- src/plugins/intel_cpu/src/nodes/reshape.cpp | 20 +- src/plugins/intel_cpu/src/nodes/reshape.h | 10 +- .../intel_cpu/src/nodes/reverse_sequence.cpp | 45 +- .../intel_cpu/src/nodes/reverse_sequence.h | 13 +- src/plugins/intel_cpu/src/nodes/rms_norm.cpp | 26 +- src/plugins/intel_cpu/src/nodes/rnn.cpp | 557 +++-- src/plugins/intel_cpu/src/nodes/rnn.h | 91 +- src/plugins/intel_cpu/src/nodes/roi_align.cpp | 193 +- src/plugins/intel_cpu/src/nodes/roi_align.h | 34 +- .../intel_cpu/src/nodes/roi_pooling.cpp | 384 +-- src/plugins/intel_cpu/src/nodes/roi_pooling.h | 61 +- src/plugins/intel_cpu/src/nodes/roll.cpp | 136 +- src/plugins/intel_cpu/src/nodes/roll.h | 16 +- src/plugins/intel_cpu/src/nodes/rope.cpp | 31 +- .../intel_cpu/src/nodes/scaled_attn.cpp | 405 +-- src/plugins/intel_cpu/src/nodes/scaled_attn.h | 17 +- .../intel_cpu/src/nodes/scatter_update.cpp | 499 ++-- .../intel_cpu/src/nodes/scatter_update.h | 60 +- .../intel_cpu/src/nodes/search_sorted.cpp | 2 +- src/plugins/intel_cpu/src/nodes/shapeof.cpp | 26 +- src/plugins/intel_cpu/src/nodes/shapeof.h | 18 +- .../intel_cpu/src/nodes/shuffle_channels.cpp | 60 +- .../intel_cpu/src/nodes/shuffle_channels.h | 10 +- src/plugins/intel_cpu/src/nodes/softmax.cpp | 74 +- src/plugins/intel_cpu/src/nodes/softmax.h | 8 +- .../intel_cpu/src/nodes/space_to_batch.cpp | 44 +- .../intel_cpu/src/nodes/space_to_batch.h | 18 +- .../intel_cpu/src/nodes/space_to_depth.cpp | 46 +- .../intel_cpu/src/nodes/space_to_depth.h | 6 +- src/plugins/intel_cpu/src/nodes/split.cpp | 108 +- src/plugins/intel_cpu/src/nodes/split.h | 26 +- .../intel_cpu/src/nodes/strided_slice.cpp | 159 +- .../intel_cpu/src/nodes/strided_slice.h | 22 +- .../src/nodes/string_tensor_pack.cpp | 45 +- .../intel_cpu/src/nodes/string_tensor_pack.h | 2 +- .../src/nodes/string_tensor_unpack.cpp | 28 +- src/plugins/intel_cpu/src/nodes/subgraph.cpp | 356 +-- src/plugins/intel_cpu/src/nodes/subgraph.h | 26 +- .../intel_cpu/src/nodes/tensoriterator.cpp | 269 +- .../intel_cpu/src/nodes/tensoriterator.h | 65 +- src/plugins/intel_cpu/src/nodes/tile.cpp | 21 +- src/plugins/intel_cpu/src/nodes/tile.h | 10 +- src/plugins/intel_cpu/src/nodes/topk.cpp | 661 ++--- src/plugins/intel_cpu/src/nodes/topk.h | 106 +- src/plugins/intel_cpu/src/nodes/transpose.cpp | 42 +- src/plugins/intel_cpu/src/nodes/transpose.h | 12 +- src/plugins/intel_cpu/src/nodes/unique.cpp | 69 +- src/plugins/intel_cpu/src/nodes/unique.hpp | 34 +- src/plugins/intel_cpu/src/nodes_factory.cpp | 12 +- src/plugins/intel_cpu/src/onednn/dnnl.cpp | 224 +- src/plugins/intel_cpu/src/onednn/dnnl.h | 2 +- .../intel_cpu/src/onednn/iml_type_mapper.cpp | 34 +- .../intel_cpu/src/onednn/iml_type_mapper.h | 192 +- .../intel_cpu/src/partitioned_mem_blk.cpp | 1 - .../intel_cpu/src/partitioned_mem_blk.h | 24 +- src/plugins/intel_cpu/src/perf_count.h | 26 +- src/plugins/intel_cpu/src/plugin.cpp | 26 +- src/plugins/intel_cpu/src/plugin.h | 6 +- src/plugins/intel_cpu/src/post_ops.cpp | 17 +- src/plugins/intel_cpu/src/post_ops.hpp | 29 +- src/plugins/intel_cpu/src/proxy_mem_blk.cpp | 1 + src/plugins/intel_cpu/src/proxy_mem_blk.h | 4 +- src/plugins/intel_cpu/src/selective_build.h | 4 +- .../custom/adaptive_pooling.cpp | 17 +- .../custom/adaptive_pooling.hpp | 17 +- .../shape_inference/custom/color_convert.cpp | 21 +- .../shape_inference/custom/color_convert.hpp | 10 +- .../src/shape_inference/custom/eltwise.cpp | 17 +- .../src/shape_inference/custom/eltwise.hpp | 13 +- .../shape_inference/custom/fullyconnected.cpp | 12 +- .../shape_inference/custom/fullyconnected.hpp | 13 +- .../src/shape_inference/custom/gather.cpp | 24 +- .../src/shape_inference/custom/gather.hpp | 17 +- .../src/shape_inference/custom/matmul.cpp | 36 +- .../src/shape_inference/custom/matmul.hpp | 20 +- .../src/shape_inference/custom/ngram.cpp | 12 +- .../src/shape_inference/custom/ngram.hpp | 13 +- .../src/shape_inference/custom/one_hot.cpp | 17 +- .../src/shape_inference/custom/one_hot.hpp | 13 +- .../src/shape_inference/custom/priorbox.cpp | 21 +- .../src/shape_inference/custom/priorbox.hpp | 24 +- .../custom/priorbox_clustered.cpp | 20 +- .../custom/priorbox_clustered.hpp | 18 +- .../src/shape_inference/custom/reshape.cpp | 58 +- .../src/shape_inference/custom/reshape.hpp | 14 +- .../src/shape_inference/custom/shapeof.hpp | 17 +- .../shape_inference/custom/strided_slice.cpp | 57 +- .../shape_inference/custom/strided_slice.hpp | 18 +- .../src/shape_inference/custom/subgraph.hpp | 16 +- .../src/shape_inference/custom/transpose.cpp | 20 +- .../src/shape_inference/custom/transpose.hpp | 19 +- .../src/shape_inference/memory_accessor.hpp | 12 +- .../src/shape_inference/shape_inference.cpp | 2 +- .../shape_inference/shape_inference_cpu.cpp | 3 +- .../shape_inference/shape_inference_cpu.hpp | 14 +- .../shape_inference_internal_dyn.hpp | 11 +- .../shape_inference_pass_through.hpp | 11 +- .../shape_inference_status.hpp | 4 +- .../src/shape_inference/static_dimension.cpp | 16 +- .../src/shape_inference/static_dimension.hpp | 10 +- .../src/shape_inference/static_shape.cpp | 7 +- .../src/shape_inference/static_shape.hpp | 19 +- .../intel_cpu/src/sub_memory_manager.hpp | 8 +- .../common/op/causal_mask_preprocess.cpp | 7 +- .../cpu_opset/common/op/leaky_relu.cpp | 20 +- .../cpu_opset/common/op/leaky_relu.hpp | 18 +- .../cpu_opset/common/op/ngram.cpp | 10 +- .../cpu_opset/common/op/ngram.hpp | 12 +- .../cpu_opset/common/op/power_static.cpp | 32 +- .../cpu_opset/common/op/power_static.hpp | 25 +- .../cpu_opset/common/op/sdpa.cpp | 3 +- .../cpu_opset/common/op/submodel.cpp | 18 +- .../cpu_opset/common/op/swish_cpu.cpp | 7 +- .../cpu_opset/common/op/swish_cpu.hpp | 8 +- .../common/pass/align_matmul_input_ranks.cpp | 28 +- .../common/pass/align_matmul_input_ranks.hpp | 6 +- .../pass/causal_mask_preprocess_fusion.cpp | 36 +- .../pass/convert_broadcast_to_tiles.cpp | 14 +- .../pass/convert_broadcast_to_tiles.hpp | 6 +- .../pass/convert_fq_rnn_to_quantized_rnn.cpp | 114 +- .../pass/convert_fq_rnn_to_quantized_rnn.hpp | 6 +- .../common/pass/convert_matmul_to_fc.cpp | 32 +- .../common/pass/convert_matmul_to_fc.hpp | 6 +- .../common/pass/convert_tile_to_seq_tiles.cpp | 22 +- .../common/pass/convert_tile_to_seq_tiles.hpp | 6 +- .../common/pass/convert_to_leaky_relu.cpp | 12 +- .../common/pass/convert_to_leaky_relu.hpp | 6 +- .../common/pass/convert_to_power_static.cpp | 66 +- .../common/pass/convert_to_power_static.hpp | 6 +- .../common/pass/convert_to_swish_cpu.cpp | 7 +- .../common/pass/convert_to_swish_cpu.hpp | 6 +- .../common/pass/decompose_integer_divide.cpp | 41 +- .../common/pass/decompose_integer_divide.hpp | 8 +- .../common/pass/decompose_rms_norm.cpp | 13 +- .../common/pass/decompose_rms_norm.hpp | 8 +- .../cpu_opset/common/pass/fc_bias_fusion.hpp | 4 +- .../pass/insert_convert_after_extension.cpp | 2 +- .../pass/insert_convert_after_extension.hpp | 2 +- .../pass/move_fc_reshape_to_weights.cpp | 22 +- .../pass/move_fc_reshape_to_weights.hpp | 21 +- .../cpu_opset/common/pass/ngram_fusion.cpp | 59 +- .../cpu_opset/common/pass/ngram_fusion.hpp | 6 +- .../pass/permute_slice_n_interpolation.cpp | 36 +- .../pass/permute_slice_n_interpolation.hpp | 4 +- .../pass/rnn_sequences_optimization.cpp | 135 +- .../pass/rnn_sequences_optimization.hpp | 4 +- .../common/pass/stateful_sdpa_fusion.cpp | 62 +- .../common/pass/stateful_sdpa_fusion.hpp | 4 +- .../common/pass/swap_convert_transpose.cpp | 15 +- .../common/pass/swap_convert_transpose.hpp | 4 +- .../convert_to_cpu_specific_opset.hpp | 49 +- .../cpu_opset/x64/op/interaction.cpp | 27 +- .../cpu_opset/x64/op/interaction.hpp | 10 +- .../cpu_opset/x64/op/llm_mlp.cpp | 6 +- .../cpu_opset/x64/op/llm_mlp.hpp | 2 +- .../transformations/cpu_opset/x64/op/mha.cpp | 68 +- .../transformations/cpu_opset/x64/op/mha.hpp | 40 +- .../cpu_opset/x64/op/qkv_proj.cpp | 6 +- .../x64/pass/convert_to_interaction.cpp | 7 +- .../x64/pass/convert_to_interaction.hpp | 10 +- .../cpu_opset/x64/pass/mha_fusion.cpp | 312 ++- .../cpu_opset/x64/pass/mha_fusion.hpp | 14 +- .../cpu_opset/x64/pass/mlp_fusion.cpp | 70 +- .../cpu_opset/x64/pass/mlp_fusion.hpp | 6 +- .../cpu_opset/x64/pass/qkv_proj_fusion.hpp | 8 +- .../x64/pass/sdpa_fuse_transpose_reshape.cpp | 12 +- .../x64/pass/sdpa_fuse_transpose_reshape.hpp | 4 +- .../x64/pass/simplify_fakequantize.hpp | 5 +- .../intel_cpu/src/transformations/defs.hpp | 91 +- .../intel_cpu/src/transformations/itt.hpp | 16 +- .../snippets/common/op/fused_mul_add.cpp | 11 +- .../snippets/common/op/fused_mul_add.hpp | 4 +- .../snippets/common/pass/mul_add_to_fma.cpp | 25 +- .../snippets/common/pass/mul_add_to_fma.hpp | 8 +- .../snippets/x64/op/brgemm_copy_b.cpp | 20 +- .../snippets/x64/op/brgemm_copy_b.hpp | 43 +- .../snippets/x64/op/brgemm_cpu.cpp | 120 +- .../snippets/x64/op/brgemm_cpu.hpp | 67 +- .../snippets/x64/op/brgemm_utils.cpp | 67 +- .../snippets/x64/op/brgemm_utils.hpp | 65 +- .../snippets/x64/op/load_convert.cpp | 28 +- .../snippets/x64/op/load_convert.hpp | 30 +- .../snippets/x64/op/perf_count_rdtsc.cpp | 14 +- .../snippets/x64/op/perf_count_rdtsc.hpp | 17 +- .../snippets/x64/op/store_convert.cpp | 28 +- .../snippets/x64/op/store_convert.hpp | 30 +- .../x64/pass/brgemm_to_brgemm_cpu.cpp | 101 +- .../x64/pass/brgemm_to_brgemm_cpu.hpp | 3 +- .../x64/pass/eliminate_brgemm_copy_b.cpp | 6 +- .../x64/pass/eliminate_brgemm_copy_b.hpp | 8 +- .../snippets/x64/pass/enforce_precision.cpp | 48 +- .../snippets/x64/pass/enforce_precision.hpp | 22 +- .../adjust_brgemm_copy_b_loop_ports.cpp | 48 +- .../adjust_brgemm_copy_b_loop_ports.hpp | 11 +- .../brgemm_copy_b_loop_ports_adjuster.cpp | 4 +- .../brgemm_copy_b_loop_ports_adjuster.hpp | 15 +- .../x64/pass/lowered/brgemm_cpu_blocking.cpp | 19 +- .../x64/pass/lowered/brgemm_cpu_blocking.hpp | 14 +- .../brgemm_copy_b_buffer_expressions.cpp | 42 +- .../brgemm_copy_b_buffer_expressions.hpp | 14 +- .../lowered/external_repacking_adjuster.cpp | 14 +- .../lowered/external_repacking_adjuster.hpp | 11 +- .../lowered/fuse_load_store_and_convert.cpp | 56 +- .../lowered/fuse_load_store_and_convert.hpp | 2 +- .../lowered/insert_brgemm_copy_buffers.cpp | 59 +- .../lowered/insert_brgemm_copy_buffers.hpp | 9 +- .../snippets/x64/pass/remove_converts.cpp | 6 +- .../x64/pass/snippets_mark_skipped.cpp | 246 +- .../x64/pass/snippets_mark_skipped.hpp | 35 +- .../snippets/x64/shape_inference.cpp | 75 +- .../snippets/x64/shape_inference.hpp | 15 +- .../transformation_pipeline.cpp | 737 +++--- .../transformations/transformation_pipeline.h | 26 +- .../intel_cpu/src/transformations/utils.cpp | 5 +- .../intel_cpu/src/transformations/utils.hpp | 4 +- src/plugins/intel_cpu/src/utils/bfloat16.hpp | 48 +- src/plugins/intel_cpu/src/utils/blob_dump.cpp | 250 +- src/plugins/intel_cpu/src/utils/blob_dump.h | 29 +- src/plugins/intel_cpu/src/utils/caseless.hpp | 4 +- src/plugins/intel_cpu/src/utils/codec_xor.cpp | 5 +- src/plugins/intel_cpu/src/utils/codec_xor.hpp | 6 +- src/plugins/intel_cpu/src/utils/cpu_utils.hpp | 152 +- .../src/utils/debug_capabilities.cpp | 228 +- .../intel_cpu/src/utils/debug_capabilities.h | 136 +- .../intel_cpu/src/utils/debug_caps_config.cpp | 12 +- .../intel_cpu/src/utils/debug_caps_config.h | 116 +- src/plugins/intel_cpu/src/utils/denormals.hpp | 153 +- .../intel_cpu/src/utils/general_utils.h | 40 +- .../intel_cpu/src/utils/multidim_map.hpp | 24 +- .../src/utils/ngraph_transformation.hpp | 94 +- .../intel_cpu/src/utils/ngraph_utils.hpp | 8 +- .../intel_cpu/src/utils/node_dumper.cpp | 41 +- src/plugins/intel_cpu/src/utils/node_dumper.h | 27 +- .../intel_cpu/src/utils/plain_tensor.hpp | 51 +- .../intel_cpu/src/utils/precision_support.cpp | 14 +- .../intel_cpu/src/utils/precision_support.h | 4 +- .../rt_info/memory_formats_attribute.cpp | 4 +- .../rt_info/memory_formats_attribute.hpp | 32 +- src/plugins/intel_cpu/src/utils/serialize.cpp | 70 +- src/plugins/intel_cpu/src/utils/serialize.hpp | 8 +- src/plugins/intel_cpu/src/utils/verbose.cpp | 108 +- src/plugins/intel_cpu/src/utils/verbose.h | 18 +- src/plugins/intel_cpu/src/weights_cache.cpp | 48 +- src/plugins/intel_cpu/src/weights_cache.hpp | 29 +- 649 files changed, 30396 insertions(+), 23430 deletions(-) mode change 100755 => 100644 src/plugins/intel_cpu/src/nodes/common/cpu_memcpy.h mode change 100755 => 100644 src/plugins/intel_cpu/src/transformations/cpu_opset/common/pass/swap_convert_transpose.cpp mode change 100755 => 100644 src/plugins/intel_cpu/src/transformations/cpu_opset/common/pass/swap_convert_transpose.hpp diff --git a/src/plugins/intel_cpu/CMakeLists.txt b/src/plugins/intel_cpu/CMakeLists.txt index 04909c7d8f5a5a..eb56a3fb39503e 100644 --- a/src/plugins/intel_cpu/CMakeLists.txt +++ b/src/plugins/intel_cpu/CMakeLists.txt @@ -242,7 +242,8 @@ ov_add_plugin(NAME ${TARGET_NAME} DEVICE_NAME "CPU" AS_EXTENSION VERSION_DEFINES_FOR src/plugin.cpp - SOURCES ${SOURCES} ${HEADERS}) + SOURCES ${SOURCES} ${HEADERS} + ADD_CLANG_FORMAT) # give a different file name depending on target platform architecture if(ARM OR AARCH64) diff --git a/src/plugins/intel_cpu/src/cache/cache_entry.h b/src/plugins/intel_cpu/src/cache/cache_entry.h index 135a1090a60045..6e71e207b0a71c 100644 --- a/src/plugins/intel_cpu/src/cache/cache_entry.h +++ b/src/plugins/intel_cpu/src/cache/cache_entry.h @@ -4,8 +4,9 @@ #pragma once -#include #include +#include + #include "lru_cache.h" namespace ov { @@ -13,27 +14,24 @@ namespace intel_cpu { class CacheEntryBase { public: - enum class LookUpStatus : int8_t { - Hit, - Miss - }; + enum class LookUpStatus : int8_t { Hit, Miss }; + public: virtual ~CacheEntryBase() = default; }; /** * @brief Class represents a templated record in multi cache - * @tparam KeyType is a key type that must define hash() const method with return type convertible to size_t and define comparison operator. + * @tparam KeyType is a key type that must define hash() const method with return type convertible to size_t and define + * comparison operator. * @tparam ValType is a type that must meet all the requirements to the std::unordered_map mapped type - * @tparam ImplType is a type for the internal storage. It must provide put(KeyType, ValueType) and ValueType get(const KeyType&) - * interface and must have constructor of type ImplType(size_t). + * @tparam ImplType is a type for the internal storage. It must provide put(KeyType, ValueType) and ValueType get(const + * KeyType&) interface and must have constructor of type ImplType(size_t). * * @note In this implementation default constructed value objects are treated as empty objects. */ -template> +template > class CacheEntry : public CacheEntryBase { public: using ResultType = std::pair; @@ -42,11 +40,12 @@ class CacheEntry : public CacheEntryBase { explicit CacheEntry(size_t capacity) : _impl(capacity) {} /** - * @brief Searches the key in the underlying storage and returns value if it exists, or creates a value using the builder functor and adds it to - * the underlying storage. + * @brief Searches the key in the underlying storage and returns value if it exists, or creates a value using the + * builder functor and adds it to the underlying storage. * @param key is the search key * @param builder is a callable object that creates the ValType object from the KeyType lval reference - * @return result of the operation which is a pair of the requested object of ValType and the status of whether the cache hit or miss occurred + * @return result of the operation which is a pair of the requested object of ValType and the status of whether the + * cache hit or miss occurred */ ResultType getOrCreate(const KeyType& key, std::function builder) { @@ -70,5 +69,5 @@ class CacheEntry : public CacheEntryBase { ImplType _impl; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cache/lru_cache.h b/src/plugins/intel_cpu/src/cache/lru_cache.h index 792451da16c484..c3a4d47aa9de9f 100644 --- a/src/plugins/intel_cpu/src/cache/lru_cache.h +++ b/src/plugins/intel_cpu/src/cache/lru_cache.h @@ -10,7 +10,8 @@ /** * @brief This is yet another implementation of a preemptive cache with LRU eviction policy. - * @tparam Key is a key type that must define hash() const method with return type convertible to size_t and define comparison operator. + * @tparam Key is a key type that must define hash() const method with return type convertible to size_t and define + * comparison operator. * @tparam Value is a type that must meet all the requirements to the std::unordered_map mapped type * * @attention This cache implementation IS NOT THREAD SAFE! @@ -19,7 +20,7 @@ namespace ov { namespace intel_cpu { -template +template class LruCache { public: using value_type = std::pair; @@ -33,7 +34,7 @@ class LruCache { * @param value */ - void put(const Key &key, const Value &val) { + void put(const Key& key, const Value& val) { if (0 == _capacity) { return; } @@ -56,7 +57,7 @@ class LruCache { * @return Value associated with the key or default constructed instance of the Value type. */ - Value get(const Key &key) { + Value get(const Key& key) { auto itr = _cacheMapper.find(key); if (itr == _cacheMapper.end()) { return Value(); @@ -82,13 +83,13 @@ class LruCache { * @brief Returns the current capacity value * @return the current capacity value */ - size_t getCapacity() const noexcept { - return _capacity; - } + size_t getCapacity() const noexcept { + return _capacity; + } private: struct key_hasher { - std::size_t operator()(const Key &k) const { + std::size_t operator()(const Key& k) const { return k.hash(); } }; @@ -105,5 +106,5 @@ class LruCache { size_t _capacity; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cache/multi_cache.cpp b/src/plugins/intel_cpu/src/cache/multi_cache.cpp index 29dad18a41c770..325dfb517831b5 100644 --- a/src/plugins/intel_cpu/src/cache/multi_cache.cpp +++ b/src/plugins/intel_cpu/src/cache/multi_cache.cpp @@ -9,5 +9,5 @@ namespace intel_cpu { std::atomic_size_t MultiCache::_typeIdCounter{0}; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cache/multi_cache.h b/src/plugins/intel_cpu/src/cache/multi_cache.h index d9b6e5f8bfe19a..e216efe6fea801 100644 --- a/src/plugins/intel_cpu/src/cache/multi_cache.h +++ b/src/plugins/intel_cpu/src/cache/multi_cache.h @@ -4,9 +4,10 @@ #pragma once +#include #include #include -#include + #include "cache_entry.h" namespace ov { @@ -20,27 +21,28 @@ namespace intel_cpu { class MultiCache { public: - template + template using EntryTypeT = CacheEntry; using EntryBasePtr = std::shared_ptr; - template + template using EntryPtr = std::shared_ptr>; public: /** - * @param capacity here means maximum records limit FOR EACH entry specified by a pair of Key/Value types. - * @note zero capacity means empty cache so no records are stored and no entries are created - */ + * @param capacity here means maximum records limit FOR EACH entry specified by a pair of Key/Value types. + * @note zero capacity means empty cache so no records are stored and no entries are created + */ explicit MultiCache(size_t capacity) : _capacity(capacity) {} /** - * @brief Searches a value of ValueType in the cache using the provided key or creates a new ValueType instance (if nothing was found) - * using the key and the builder functor and adds the new record to the cache - * @param key is the search key - * @param builder is a callable object that creates the ValType object from the KeyType lval reference. - * Also the builder type is used for the ValueType deduction - * @return result of the operation which is a pair of the requested object of ValType and the status of whether the cache hit or miss occurred - */ + * @brief Searches a value of ValueType in the cache using the provided key or creates a new ValueType instance (if + * nothing was found) using the key and the builder functor and adds the new record to the cache + * @param key is the search key + * @param builder is a callable object that creates the ValType object from the KeyType lval reference. + * Also the builder type is used for the ValueType deduction + * @return result of the operation which is a pair of the requested object of ValType and the status of whether the + * cache hit or miss occurred + */ template 201703L)) || (defined(__cplusplus) && (__cplusplus > 201703L)) @@ -54,9 +56,9 @@ class MultiCache { } private: - template + template size_t getTypeId(); - template + template EntryPtr getEntry(); private: @@ -65,13 +67,13 @@ class MultiCache { std::unordered_map _storage; }; -template +template size_t MultiCache::getTypeId() { static size_t id = _typeIdCounter.fetch_add(1); return id; } -template +template MultiCache::EntryPtr MultiCache::getEntry() { using EntryType = EntryTypeT; size_t id = getTypeId(); @@ -88,5 +90,5 @@ using MultiCacheWeakCPtr = std::weak_ptr; using MultiCachePtr = std::shared_ptr; using MultiCacheCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/compiled_model.cpp b/src/plugins/intel_cpu/src/compiled_model.cpp index bbee5d937be5d5..f0f9668ca3ae50 100644 --- a/src/plugins/intel_cpu/src/compiled_model.cpp +++ b/src/plugins/intel_cpu/src/compiled_model.cpp @@ -3,29 +3,30 @@ // #include "compiled_model.h" + +#include +#include + #include "async_infer_request.h" +#include "cpu/x64/cpu_isa_traits.hpp" #include "infer_request.h" #include "itt.h" #include "low_precision/low_precision.hpp" #include "memory_state.h" #include "openvino/core/type/element_type.hpp" #include "openvino/runtime/intel_cpu/properties.hpp" -#include "openvino/runtime/threading/executor_manager.hpp" -#include "transformations/transformation_pipeline.h" #include "openvino/runtime/properties.hpp" -#include "openvino/util/common_util.hpp" +#include "openvino/runtime/threading/cpu_message.hpp" #include "openvino/runtime/threading/cpu_streams_executor.hpp" -#include "transformations/utils/utils.hpp" #include "openvino/runtime/threading/cpu_streams_info.hpp" -#include "openvino/runtime/threading/cpu_message.hpp" +#include "openvino/runtime/threading/executor_manager.hpp" +#include "openvino/util/common_util.hpp" +#include "transformations/transformation_pipeline.h" +#include "transformations/utils/utils.hpp" #include "utils/serialize.hpp" -#include "cpu/x64/cpu_isa_traits.hpp" -#include -#include - #if defined(OV_CPU_WITH_ACL) -#include "nodes/executors/acl/acl_ie_scheduler.hpp" +# include "nodes/executors/acl/acl_ie_scheduler.hpp" #endif using namespace ov::threading; @@ -329,8 +330,7 @@ ov::Any CompiledModel::get_property(const std::string& name) const { return decltype(ov::intel_cpu::sparse_weights_decompression_rate)::value_type( config.fcSparseWeiDecompressionRate); } else if (name == ov::hint::dynamic_quantization_group_size) { - return decltype(ov::hint::dynamic_quantization_group_size)::value_type( - config.fcDynamicQuantizationGroupSize); + return decltype(ov::hint::dynamic_quantization_group_size)::value_type(config.fcDynamicQuantizationGroupSize); } else if (name == ov::hint::kv_cache_precision) { return decltype(ov::hint::kv_cache_precision)::value_type(config.kvCachePrecision); } diff --git a/src/plugins/intel_cpu/src/compiled_model.h b/src/plugins/intel_cpu/src/compiled_model.h index faedf1ae5a744c..dc3735b4f3b63e 100644 --- a/src/plugins/intel_cpu/src/compiled_model.h +++ b/src/plugins/intel_cpu/src/compiled_model.h @@ -94,5 +94,5 @@ class CompiledModel : public ov::ICompiledModel { bool m_has_sub_compiled_models = false; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/config.cpp b/src/plugins/intel_cpu/src/config.cpp index 83e4ed1c99ea3d..7d1ee05897e81d 100644 --- a/src/plugins/intel_cpu/src/config.cpp +++ b/src/plugins/intel_cpu/src/config.cpp @@ -4,19 +4,19 @@ #include "config.h" +#include +#include +#include + #include "cpu/x64/cpu_isa_traits.hpp" #include "openvino/core/parallel.hpp" #include "openvino/core/type/element_type_traits.hpp" #include "openvino/runtime/intel_cpu/properties.hpp" #include "openvino/runtime/internal_properties.hpp" #include "openvino/runtime/properties.hpp" +#include "utils/cpu_utils.hpp" #include "utils/debug_capabilities.h" #include "utils/precision_support.h" -#include "utils/cpu_utils.hpp" - -#include -#include -#include namespace ov { namespace intel_cpu { @@ -61,9 +61,7 @@ Config::Config() { */ void Config::applyDebugCapsProperties() { // always enable perf counters for verbose, performance summary and average counters - if (!debugCaps.verbose.empty() || - !debugCaps.summaryPerf.empty() || - !debugCaps.averageCountersPath.empty()) { + if (!debugCaps.verbose.empty() || !debugCaps.summaryPerf.empty() || !debugCaps.averageCountersPath.empty()) { collectPerfCounters = true; } } @@ -151,10 +149,10 @@ void Config::readProperties(const ov::AnyMap& prop, const ModelType modelType) { logLevel = val.as(); } catch (const ov::Exception&) { OPENVINO_THROW("Wrong value ", - val.as(), - " for property key ", - key, - ". Expected only ov::log::Level::NO/ERR/WARNING/INFO/DEBUG/TRACE."); + val.as(), + " for property key ", + key, + ". Expected only ov::log::Level::NO/ERR/WARNING/INFO/DEBUG/TRACE."); } } else if (key == ov::hint::num_requests.name()) { try { @@ -243,8 +241,8 @@ void Config::readProperties(const ov::AnyMap& prop, const ModelType modelType) { fcDynamicQuantizationGroupSize = val.as(); } catch (const ov::Exception&) { OPENVINO_THROW("Wrong value for property key ", - ov::hint::dynamic_quantization_group_size.name(), - ". Expected only unsinged integer numbers"); + ov::hint::dynamic_quantization_group_size.name(), + ". Expected only unsinged integer numbers"); } } else if (key == ov::enable_profiling.name()) { try { @@ -366,7 +364,7 @@ void Config::readProperties(const ov::AnyMap& prop, const ModelType modelType) { if (one_of(prec, ov::element::f32, ov::element::f16, ov::element::bf16, ov::element::u8)) { kvCachePrecision = prec; } else { - OPENVINO_THROW("invalid value"); + OPENVINO_THROW("invalid value"); } } catch (ov::Exception&) { OPENVINO_THROW("Wrong value ", @@ -462,10 +460,13 @@ void Config::updateProperties() { void Config::applyRtInfo(const std::shared_ptr& model) { // if user sets explicitly, it will be higher priority than rt_info - if (!kvCachePrecisionSetExplicitly && model->has_rt_info({"runtime_options", ov::hint::kv_cache_precision.name()})) { - this->kvCachePrecision = model->get_rt_info({"runtime_options", ov::hint::kv_cache_precision.name()}); + if (!kvCachePrecisionSetExplicitly && + model->has_rt_info({"runtime_options", ov::hint::kv_cache_precision.name()})) { + this->kvCachePrecision = + model->get_rt_info({"runtime_options", ov::hint::kv_cache_precision.name()}); } - if (!fcDynamicQuantizationGroupSizeSetExplicitly && model->has_rt_info({"runtime_options", ov::hint::dynamic_quantization_group_size.name()})) { + if (!fcDynamicQuantizationGroupSizeSetExplicitly && + model->has_rt_info({"runtime_options", ov::hint::dynamic_quantization_group_size.name()})) { this->fcDynamicQuantizationGroupSize = model->get_rt_info({"runtime_options", ov::hint::dynamic_quantization_group_size.name()}); } diff --git a/src/plugins/intel_cpu/src/config.h b/src/plugins/intel_cpu/src/config.h index a8439d87803fd4..1aa08f4412f0b3 100644 --- a/src/plugins/intel_cpu/src/config.h +++ b/src/plugins/intel_cpu/src/config.h @@ -4,18 +4,17 @@ #pragma once +#include +#include +#include + +#include "internal_properties.hpp" #include "openvino/core/type/element_type.hpp" #include "openvino/runtime/properties.hpp" #include "openvino/runtime/threading/istreams_executor.hpp" #include "openvino/util/common_util.hpp" - -#include "internal_properties.hpp" #include "utils/debug_caps_config.h" -#include -#include -#include - namespace ov { namespace intel_cpu { struct Config { @@ -38,11 +37,7 @@ struct Config { Disable, }; - enum class ModelType { - CNN, - LLM, - Unknown - }; + enum class ModelType { CNN, LLM, Unknown }; bool collectPerfCounters = false; bool exclusiveAsyncRequests = false; @@ -69,7 +64,8 @@ struct Config { bool streamsChanged = false; int threads = 0; int threadsPerStream = 0; - ov::threading::IStreamsExecutor::ThreadBindingType threadBindingType = ov::threading::IStreamsExecutor::ThreadBindingType::NONE; + ov::threading::IStreamsExecutor::ThreadBindingType threadBindingType = + ov::threading::IStreamsExecutor::ThreadBindingType::NONE; ov::hint::PerformanceMode hintPerfMode = ov::hint::PerformanceMode::LATENCY; std::vector> streamsRankTable; bool changedHintPerfMode = false; @@ -122,4 +118,4 @@ struct Config { }; } // namespace intel_cpu -} // namespace ov +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_memory.cpp b/src/plugins/intel_cpu/src/cpu_memory.cpp index 8e5fe8d72fd1f2..7cb4abc2161f14 100644 --- a/src/plugins/intel_cpu/src/cpu_memory.cpp +++ b/src/plugins/intel_cpu/src/cpu_memory.cpp @@ -3,14 +3,17 @@ // #include "cpu_memory.h" -#include "memory_desc/cpu_memory_desc_utils.h" + #include -#include "nodes/reorder.h" + +#include "memory_desc/cpu_memory_desc_utils.h" #include "nodes/common/cpu_memcpy.h" +#include "nodes/reorder.h" #include "utils/debug_capabilities.h" #if defined(__linux__) # include /* Definition of SYS_* constants */ # include + # include /* strerror(errno) */ #endif @@ -27,69 +30,72 @@ BlockedMemoryDescPtr IMemory::getDescWithType() const { } namespace { - inline void setSubnormalsToZero(float *data, size_t size) { - uint32_t *u32data = reinterpret_cast(data); - for (size_t i = 0; i < size; ++i) { - if ((u32data[i] & (0xFF << 23)) == 0) { - u32data[i] = 0; - } +inline void setSubnormalsToZero(float* data, size_t size) { + uint32_t* u32data = reinterpret_cast(data); + for (size_t i = 0; i < size; ++i) { + if ((u32data[i] & (0xFF << 23)) == 0) { + u32data[i] = 0; } } +} - void transferData(const IMemory& src, const IMemory& dst, bool ftz) { - node::Reorder::reorderData(src, dst); +void transferData(const IMemory& src, const IMemory& dst, bool ftz) { + node::Reorder::reorderData(src, dst); - if (!ftz) { - return; - } - if (src.getDesc().getPrecision() != ov::element::f32 || dst.getDesc().getPrecision() == ov::element::bf16) { + if (!ftz) { + return; + } + if (src.getDesc().getPrecision() != ov::element::f32 || dst.getDesc().getPrecision() == ov::element::bf16) { + return; + } + size_t offset = 0; + if (dst.getDesc().getType() & MemoryDescType::Dnnl) { + // here we can safely cast to DnnlMemoryDesc + auto dnnl_desc = dst.getDescWithType(); + auto desc = dnnl_desc->getDnnlDesc(); + dnnl::impl::memory_desc_wrapper wrapper(desc.get()); + offset = wrapper.offset0(); + if (wrapper.is_wino_desc() || wrapper.is_rnn_packed_desc()) { return; } - size_t offset = 0; - if (dst.getDesc().getType() & MemoryDescType::Dnnl) { - // here we can safely cast to DnnlMemoryDesc - auto dnnl_desc = dst.getDescWithType(); - auto desc = dnnl_desc->getDnnlDesc(); - dnnl::impl::memory_desc_wrapper wrapper(desc.get()); - offset = wrapper.offset0(); - if (wrapper.is_wino_desc() || wrapper.is_rnn_packed_desc()) { - return; - } - } - // actual FTZ - auto* memData = static_cast(dst.getData()); - memData += offset; - setSubnormalsToZero(memData, dst.getSize() / sizeof(float)); } + // actual FTZ + auto* memData = static_cast(dst.getData()); + memData += offset; + setSubnormalsToZero(memData, dst.getSize() / sizeof(float)); +} -} // namespace +} // namespace -Memory::Memory(const dnnl::engine& eng, MemoryDescPtr desc, const void* data, bool pads_zeroing) : - m_eng(eng), - m_pMemDesc(desc), - m_blockHandle(std::make_shared(make_unique()), this), - dnnlMemHandle(this) { - if (desc->getPrecision() == element::string) { - OPENVINO_THROW("[CPU] Memory object cannot be created for string data."); - } - create(m_pMemDesc, data, pads_zeroing); +Memory::Memory(const dnnl::engine& eng, MemoryDescPtr desc, const void* data, bool pads_zeroing) + : m_eng(eng), + m_pMemDesc(desc), + m_blockHandle(std::make_shared(make_unique()), this), + dnnlMemHandle(this) { + if (desc->getPrecision() == element::string) { + OPENVINO_THROW("[CPU] Memory object cannot be created for string data."); } + create(m_pMemDesc, data, pads_zeroing); +} -Memory::Memory(const dnnl::engine& eng, const MemoryDesc& desc, const void* data, bool pads_zeroing) : - Memory::Memory(eng, desc.clone(), data, pads_zeroing) {} - -Memory::Memory(const dnnl::engine& eng, MemoryDescPtr desc, MemoryBlockPtr block) : - m_eng(eng), m_pMemDesc(desc), m_blockHandle(block, this), dnnlMemHandle(this) { - if (desc->getPrecision() == element::string) { - OPENVINO_THROW("[CPU] Memory object can't be created for string data."); - } - bool memAllocated = m_blockHandle->getRawPtr(); +Memory::Memory(const dnnl::engine& eng, const MemoryDesc& desc, const void* data, bool pads_zeroing) + : Memory::Memory(eng, desc.clone(), data, pads_zeroing) {} - create(desc, nullptr, !memAllocated); +Memory::Memory(const dnnl::engine& eng, MemoryDescPtr desc, MemoryBlockPtr block) + : m_eng(eng), + m_pMemDesc(desc), + m_blockHandle(block, this), + dnnlMemHandle(this) { + if (desc->getPrecision() == element::string) { + OPENVINO_THROW("[CPU] Memory object can't be created for string data."); } + bool memAllocated = m_blockHandle->getRawPtr(); -Memory::Memory(const dnnl::engine& eng, const MemoryDesc& desc, MemoryBlockPtr block) : - Memory::Memory(eng, desc.clone(), block) {} + create(desc, nullptr, !memAllocated); +} + +Memory::Memory(const dnnl::engine& eng, const MemoryDesc& desc, MemoryBlockPtr block) + : Memory::Memory(eng, desc.clone(), block) {} size_t Memory::getSize() const { auto size = getDesc().getCurrentMemSize(); @@ -99,7 +105,7 @@ size_t Memory::getSize() const { return size; } -void Memory::create(const MemoryDesc &desc, const void *data, bool pads_zeroing) { +void Memory::create(const MemoryDesc& desc, const void* data, bool pads_zeroing) { create(desc.clone(), data, pads_zeroing); } @@ -187,9 +193,7 @@ dnnl::memory Memory::DnnlMemPrimHandle::getPrim() const { void* Memory::getData() const { void* data = getDataNoThrow(); - if (data == nullptr && - m_pMemDesc->getShape().isStatic() && - m_pMemDesc->getShape().getElementsCount() != 0) + if (data == nullptr && m_pMemDesc->getShape().isStatic() && m_pMemDesc->getShape().getElementsCount() != 0) OPENVINO_THROW("Memory has not been allocated"); return data; } @@ -198,7 +202,7 @@ void* MemoryBlockWithReuse::getRawPtr() const noexcept { return m_data.get(); } -void MemoryBlockWithReuse::setExtBuff(void *ptr, size_t size) { +void MemoryBlockWithReuse::setExtBuff(void* ptr, size_t size) { m_useExternalStorage = true; m_memUpperBound = size; m_data = decltype(m_data)(ptr, release); @@ -208,7 +212,7 @@ bool MemoryBlockWithReuse::resize(size_t size) { constexpr int cacheLineSize = 64; bool sizeChanged = false; if (size > m_memUpperBound) { - void *ptr = dnnl::impl::malloc(size, cacheLineSize); + void* ptr = dnnl::impl::malloc(size, cacheLineSize); if (!ptr) { OPENVINO_THROW("Failed to allocate ", size, " bytes of memory"); } @@ -236,15 +240,17 @@ void MemoryBlockWithReuse::free() { m_useExternalStorage = false; } -void MemoryBlockWithReuse::release(void *ptr) {} +void MemoryBlockWithReuse::release(void* ptr) {} -void MemoryBlockWithReuse::destroy(void *ptr) { +void MemoryBlockWithReuse::destroy(void* ptr) { dnnl::impl::free(ptr); } /////////////// StringMemory /////////////// -StringMemory::StringMemory(const dnnl::engine& engine, const MemoryDescPtr& desc, const void* data) : m_engine(engine), m_mem_desc(desc) { +StringMemory::StringMemory(const dnnl::engine& engine, const MemoryDescPtr& desc, const void* data) + : m_engine(engine), + m_mem_desc(desc) { if (m_mem_desc->getPrecision() != element::string) { OPENVINO_THROW("[CPU] StringMemory supports String type only."); } @@ -258,8 +264,8 @@ StringMemory::StringMemory(const dnnl::engine& engine, const MemoryDescPtr& desc const auto string_size = m_mem_desc->getShape().getElementsCount(); if (data != nullptr) { - auto not_const_data = const_cast(data); - m_memoryBlock->setExtBuff(reinterpret_cast(not_const_data), string_size); + auto not_const_data = const_cast(data); + m_memoryBlock->setExtBuff(reinterpret_cast(not_const_data), string_size); } else { m_memoryBlock->resize(string_size); } @@ -273,7 +279,7 @@ void StringMemory::load(const IMemory& src, bool ftz) const { transferData(src, *this, false); } -void* StringMemory::getData() const { +void* StringMemory::getData() const { return m_memoryBlock->getRawPtr(); } @@ -297,7 +303,7 @@ void StringMemory::nullify() { } } -size_t StringMemory::getSize() const { // In bytes +size_t StringMemory::getSize() const { // In bytes auto size = getDesc().getCurrentMemSize(); if (size == MemoryDesc::UNDEFINED_SIZE) { OPENVINO_THROW("Can't get memory size for undefined shape."); @@ -329,7 +335,7 @@ bool StringMemory::StringMemoryBlock::resize(size_t size) { if (size > PTRDIFF_MAX) { OPENVINO_THROW("Requested allocation size { ", size, " } exceeds PTRDIFF_MAX."); } - auto ptr_size = static_cast(size); // WA for warning alloc-size-larger-than + auto ptr_size = static_cast(size); // WA for warning alloc-size-larger-than auto ptr = new OvString[ptr_size]; if (!ptr) { OPENVINO_THROW("Failed to allocate ", size, " bytes of memory"); @@ -355,7 +361,7 @@ void StringMemory::StringMemoryBlock::destroy(OvString* ptr) { } void* StringMemory::StringMemoryBlock::getRawPtr() const noexcept { - return reinterpret_cast(m_data.get()); + return reinterpret_cast(m_data.get()); } /////////////// DnnlMemoryBlock /////////////// @@ -364,7 +370,7 @@ void* DnnlMemoryBlock::getRawPtr() const noexcept { return m_pMemBlock->getRawPtr(); } -void DnnlMemoryBlock::setExtBuff(void *ptr, size_t size) { +void DnnlMemoryBlock::setExtBuff(void* ptr, size_t size) { m_pMemBlock->setExtBuff(ptr, size); notifyUpdate(); } @@ -401,8 +407,9 @@ void DnnlMemoryBlock::notifyUpdate() { } } -StaticMemory::StaticMemory(const dnnl::engine& eng, MemoryDescPtr desc, const void* data, bool pads_zeroing) : - m_eng(eng), m_pMemDesc(desc) { +StaticMemory::StaticMemory(const dnnl::engine& eng, MemoryDescPtr desc, const void* data, bool pads_zeroing) + : m_eng(eng), + m_pMemDesc(desc) { if (desc->getPrecision() == element::string) { OPENVINO_THROW("[CPU] StaticMemory object cannot be created for string data."); } @@ -427,14 +434,13 @@ StaticMemory::StaticMemory(const dnnl::engine& eng, MemoryDescPtr desc, const vo // // ======================== m_prim.set_data_handle(m_pMemBlock->getRawPtr()); - } - catch (const std::exception& exc) { + } catch (const std::exception& exc) { dnnlErrorCtx = exc.what(); } } -StaticMemory::StaticMemory(const dnnl::engine& eng, const MemoryDesc& desc, const void* data, bool pads_zeroing) : - StaticMemory::StaticMemory(eng, desc.clone(), data, pads_zeroing) {} +StaticMemory::StaticMemory(const dnnl::engine& eng, const MemoryDesc& desc, const void* data, bool pads_zeroing) + : StaticMemory::StaticMemory(eng, desc.clone(), data, pads_zeroing) {} const MemoryDesc& StaticMemory::getDesc() const { return *m_pMemDesc; @@ -475,7 +481,7 @@ MemoryBlockPtr StaticMemory::getMemoryBlock() const { return m_pMemBlock; } -//oneDNN specifics for backward compatibility +// oneDNN specifics for backward compatibility dnnl::memory StaticMemory::getPrimitive() const { if (!m_prim) { OPENVINO_THROW("Couldn't create dnnl::memory object: ", dnnlErrorCtx); @@ -517,11 +523,11 @@ bool StaticMemory::StaticMemoryBlock::hasExtBuffer() const noexcept { } void StaticMemory::StaticMemoryBlock::registerMemory(Memory* memPtr) { - //do nothing + // do nothing } void StaticMemory::StaticMemoryBlock::unregisterMemory(Memory* memPtr) { - //do nothing + // do nothing } #if defined(__linux__) @@ -529,9 +535,9 @@ void StaticMemory::StaticMemoryBlock::unregisterMemory(Memory* memPtr) { # define MPOL_BIND 2 # define MPOL_MF_STRICT (1 << 0) # define MPOL_MF_MOVE (1 << 1) -#if !defined(__NR_mbind) && defined(__x86_64__) -# define __NR_mbind 237 -#endif +# if !defined(__NR_mbind) && defined(__x86_64__) +# define __NR_mbind 237 +# endif static long mbind(void* start, unsigned long len, int mode, @@ -585,7 +591,12 @@ bool mbind_move(const dnnl::memory mem, int numaNodeID) { return mbind_move(data, size, numaNodeID); } -MemoryPtr split_horizontal(const dnnl::engine& eng, const MemoryPtr src, int dim, int w_rank, int w_size, bool need_fill) { +MemoryPtr split_horizontal(const dnnl::engine& eng, + const MemoryPtr src, + int dim, + int w_rank, + int w_size, + bool need_fill) { auto desc = src->getDescPtr(); auto shape = src->getShape(); auto dims = shape.getDims(); @@ -620,7 +631,9 @@ MemoryPtr split_horizontal(const dnnl::engine& eng, const MemoryPtr src, int dim // reference stride VectorDims stride_dims = dims; stride_dims[dim] = splited_dim_vec[0]; - size_t stride = std::accumulate(stride_dims.begin(), stride_dims.end(), static_cast(1), std::multiplies()) * prec.size(); + size_t stride = + std::accumulate(stride_dims.begin(), stride_dims.end(), static_cast(1), std::multiplies()) * + prec.size(); // create new shape for target memory VectorDims new_dims = dims; @@ -641,7 +654,12 @@ MemoryPtr split_horizontal(const dnnl::engine& eng, const MemoryPtr src, int dim return ptr; } -MemoryPtr split_vertical(const dnnl::engine& eng, const MemoryPtr src, int dim, int w_rank, int w_size, bool need_fill) { +MemoryPtr split_vertical(const dnnl::engine& eng, + const MemoryPtr src, + int dim, + int w_rank, + int w_size, + bool need_fill) { auto desc = src->getDescPtr(); auto shape = src->getShape(); auto dims = shape.getDims(); @@ -697,7 +715,7 @@ MemoryPtr split_vertical(const dnnl::engine& eng, const MemoryPtr src, int dim, strideSize /= 2; copySize /= 2; } - parallel_for(step, [&](int i){ + parallel_for(step, [&](int i) { int dst_offset = i * copySize; int src_offset = i * splited_size + w_rank * strideSize; cpu_parallel_memcpy(dstPtr + dst_offset, srcPtr + src_offset, copySize); @@ -705,5 +723,5 @@ MemoryPtr split_vertical(const dnnl::engine& eng, const MemoryPtr src, int dim, return ptr; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_memory.h b/src/plugins/intel_cpu/src/cpu_memory.h index 70e6713e36b886..f6837064babfa6 100644 --- a/src/plugins/intel_cpu/src/cpu_memory.h +++ b/src/plugins/intel_cpu/src/cpu_memory.h @@ -4,18 +4,18 @@ #pragma once -#include "memory_desc/cpu_memory_desc.h" -#include "dnnl_extension_utils.h" -#include #include - -#include "openvino/core/type/element_type.hpp" -#include "openvino/core/type/element_type_traits.hpp" +#include #include #include #include +#include "dnnl_extension_utils.h" +#include "memory_desc/cpu_memory_desc.h" +#include "openvino/core/type/element_type.hpp" +#include "openvino/core/type/element_type_traits.hpp" + /** * @file contains a concept classes to work with memory/tensor/blob abstractions on plugin level. * @@ -47,7 +47,8 @@ class IMemoryBlock { virtual void* getRawPtr() const noexcept = 0; /** - * @brief Allows to set externally allocated memory buffer. In that case, the object has no control over the provided memory. + * @brief Allows to set externally allocated memory buffer. In that case, the object has no control over the + * provided memory. * @param ptr - pointer to the memory * @param size - size of the memory buffer */ @@ -82,11 +83,11 @@ class MemoryBlockWithReuse : public IMemoryBlock { private: bool m_useExternalStorage = false; size_t m_memUpperBound = 0ul; - std::unique_ptr m_data; + std::unique_ptr m_data; int numa_node; - static void release(void *ptr); - static void destroy(void *ptr); + static void release(void* ptr); + static void destroy(void* ptr); }; class IMemoryBlockObserver : public IMemoryBlock { @@ -128,13 +129,13 @@ class DnnlMemBlockHandle { } DnnlMemBlockHandle(const DnnlMemBlockHandle&) = delete; - DnnlMemBlockHandle& operator= (const DnnlMemBlockHandle&) = delete; + DnnlMemBlockHandle& operator=(const DnnlMemBlockHandle&) = delete; DnnlMemBlockHandle(DnnlMemBlockHandle&& source) { std::swap(m_pMemBlock, source.m_pMemBlock); std::swap(m_pMem, source.m_pMem); } - DnnlMemBlockHandle& operator= (DnnlMemBlockHandle&& rhs) { + DnnlMemBlockHandle& operator=(DnnlMemBlockHandle&& rhs) { std::swap(m_pMemBlock, rhs.m_pMemBlock); std::swap(m_pMem, rhs.m_pMem); return *this; @@ -166,7 +167,7 @@ class IMemory { virtual const MemoryDesc& getDesc() const = 0; virtual MemoryDescPtr getDescPtr() const = 0; - virtual void* getData() const = 0; // pointer to the actual memory + virtual void* getData() const = 0; // pointer to the actual memory template ::type> T* getDataAs() const { @@ -177,7 +178,7 @@ class IMemory { return static_cast(getData()); } - virtual size_t getSize() const = 0; // in bytes + virtual size_t getSize() const = 0; // in bytes virtual const Shape& getShape() const = 0; virtual const VectorDims& getStaticDims() const = 0; @@ -199,7 +200,7 @@ class IMemory { return false; } - //oneDNN specifics for backward compatibility + // oneDNN specifics for backward compatibility virtual dnnl::memory getPrimitive() const = 0; ov::element::Type getPrecision() const { @@ -211,8 +212,8 @@ class IMemory { } template ::value && !std::is_reference::value, int>::type = 0, - typename std::enable_if::value, int>::type = 0> + typename std::enable_if::value && !std::is_reference::value, int>::type = 0, + typename std::enable_if::value, int>::type = 0> std::shared_ptr getDescWithType() const; }; @@ -241,17 +242,17 @@ class StaticMemory final : public IMemory { StaticMemory(const dnnl::engine& eng, const MemoryDesc& desc, const void* data = nullptr, bool pads_zeroing = true); StaticMemory(const StaticMemory&) = delete; - StaticMemory& operator= (const StaticMemory&) = delete; + StaticMemory& operator=(const StaticMemory&) = delete; StaticMemory(Memory&&) = delete; - StaticMemory& operator= (StaticMemory&&) = delete; + StaticMemory& operator=(StaticMemory&&) = delete; const MemoryDesc& getDesc() const override; MemoryDescPtr getDescPtr() const override; - void* getData() const override; // pointer to the actual memory + void* getData() const override; // pointer to the actual memory - size_t getSize() const override; // in bytes + size_t getSize() const override; // in bytes const Shape& getShape() const override; const VectorDims& getStaticDims() const override; @@ -262,7 +263,7 @@ class StaticMemory final : public IMemory { MemoryBlockPtr getMemoryBlock() const override; - //oneDNN specifics for backward compatibility + // oneDNN specifics for backward compatibility dnnl::memory getPrimitive() const override; void nullify() override; @@ -284,10 +285,10 @@ class Memory : public IMemory { Memory(const dnnl::engine& eng, const MemoryDesc& desc, MemoryBlockPtr block); Memory(const Memory&) = delete; - Memory& operator= (const Memory&) = delete; + Memory& operator=(const Memory&) = delete; Memory(Memory&&) = delete; - Memory& operator= (Memory&&) = delete; + Memory& operator=(Memory&&) = delete; dnnl::memory getPrimitive() const override; @@ -341,7 +342,7 @@ class Memory : public IMemory { bool m_padsZeroing = true; class DnnlMemPrimHandle { public: - explicit DnnlMemPrimHandle(const Memory* memObjPtr): m_memObjPtr(memObjPtr) {} + explicit DnnlMemPrimHandle(const Memory* memObjPtr) : m_memObjPtr(memObjPtr) {} bool isInit() const; dnnl::memory getPrim() const; void resetDnnlPrim(); @@ -376,7 +377,7 @@ class StringMemory : public IMemory { private: bool m_use_external_storage = false; size_t m_str_upper_bound = 0lu; - std::unique_ptr m_data; + std::unique_ptr m_data; static void release(OvString* ptr) {} static void destroy(OvString* ptr); @@ -390,7 +391,9 @@ class StringMemory : public IMemory { : StringMemory(engine, desc.clone(), data) {} StringMemory(const dnnl::engine& engine, const MemoryDescPtr& desc, const StringMemoryBlockPtr& block) - : m_engine(engine), m_mem_desc(desc), m_memoryBlock(block) {} + : m_engine(engine), + m_mem_desc(desc), + m_memoryBlock(block) {} StringMemory(const dnnl::engine& engine, const MemoryDesc& desc, const StringMemoryBlockPtr& block) : StringMemory(engine, desc.clone(), block) {} @@ -405,7 +408,7 @@ class StringMemory : public IMemory { void* getData() const override; - size_t getSize() const override; // In bytes + size_t getSize() const override; // In bytes const Shape& getShape() const override { return m_mem_desc->getShape(); @@ -443,8 +446,18 @@ bool mbind_move(void* data, size_t size, int numaNodeID); bool mbind_move(const MemoryCPtr mem, int numaNodeID); bool mbind_move(const dnnl::memory mem, int numaNodeID); -MemoryPtr split_horizontal(const dnnl::engine& eng, const MemoryPtr src, int dim, int w_rank, int w_size, bool need_fill = true); -MemoryPtr split_vertical(const dnnl::engine& eng, const MemoryPtr src, int dim, int w_rank, int w_size, bool need_fill = true); - -} // namespace intel_cpu -} // namespace ov +MemoryPtr split_horizontal(const dnnl::engine& eng, + const MemoryPtr src, + int dim, + int w_rank, + int w_size, + bool need_fill = true); +MemoryPtr split_vertical(const dnnl::engine& eng, + const MemoryPtr src, + int dim, + int w_rank, + int w_size, + bool need_fill = true); + +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_shape.cpp b/src/plugins/intel_cpu/src/cpu_shape.cpp index 4c6b5793d9f2ef..2b7011af1a1f5e 100644 --- a/src/plugins/intel_cpu/src/cpu_shape.cpp +++ b/src/plugins/intel_cpu/src/cpu_shape.cpp @@ -3,12 +3,13 @@ // #include "cpu_shape.h" + #include "utils/general_utils.h" namespace ov { namespace intel_cpu { -bool Shape::isCompatible(const VectorDims &vecDims) const { +bool Shape::isCompatible(const VectorDims& vecDims) const { if (getRank() != vecDims.size()) { return false; } @@ -21,17 +22,21 @@ bool Shape::isCompatible(const VectorDims &vecDims) const { return false; } - if (!std::equal(getMaxDims().begin(), getMaxDims().end(), vecDims.begin(), [](Dim lhs, Dim rhs) { return lhs >= rhs; })) { + if (!std::equal(getMaxDims().begin(), getMaxDims().end(), vecDims.begin(), [](Dim lhs, Dim rhs) { + return lhs >= rhs; + })) { return false; } - if (!std::equal(getMinDims().begin(), getMinDims().end(), vecDims.begin(), [](Dim lhs, Dim rhs) { return lhs <= rhs; })) { + if (!std::equal(getMinDims().begin(), getMinDims().end(), vecDims.begin(), [](Dim lhs, Dim rhs) { + return lhs <= rhs; + })) { return false; } return true; } -std::string Shape::toString() const { +std::string Shape::toString() const { std::stringstream output; output << "{"; @@ -50,10 +55,10 @@ std::string Shape::toString() const { Shape mergeShapes(const Shape& lhs, const Shape& rhs) { OPENVINO_ASSERT(lhs.getRank() == rhs.getRank(), - "Couldn't merge shapes of different ranks: shape 1:", - lhs.toString(), - " shape 2: ", - rhs.toString()); + "Couldn't merge shapes of different ranks: shape 1:", + lhs.toString(), + " shape 2: ", + rhs.toString()); const auto& lhsMinDims = lhs.getMinDims(); const auto& lhsMaxDims = lhs.getMaxDims(); @@ -66,10 +71,11 @@ Shape mergeShapes(const Shape& lhs, const Shape& rhs) { for (size_t i = 0; i < resultMinDims.size(); ++i) { resultMinDims[i] = std::max(lhsMinDims[i], rhsMinDims[i]); resultMaxDims[i] = std::min(lhsMaxDims[i], rhsMaxDims[i]); - OPENVINO_ASSERT(resultMinDims[i] <= resultMaxDims[i], "Couldn't merge shapes as the dims intervals are not overlapping."); + OPENVINO_ASSERT(resultMinDims[i] <= resultMaxDims[i], + "Couldn't merge shapes as the dims intervals are not overlapping."); } return Shape{resultMinDims, resultMaxDims}; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_shape.h b/src/plugins/intel_cpu/src/cpu_shape.h index a04b043689e520..f2895287e2f8fe 100644 --- a/src/plugins/intel_cpu/src/cpu_shape.h +++ b/src/plugins/intel_cpu/src/cpu_shape.h @@ -31,13 +31,17 @@ class Shape { type = shape.is_static() ? ShapeType::Static : ShapeType::Dynamic; initDims(); - hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { return dim == 0; } ); + hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { + return dim == 0; + }); } explicit Shape(const VectorDims& shape) { dims = minDims = maxDims = shape; type = ShapeType::Static; - hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { return dim == 0; } ); + hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { + return dim == 0; + }); } Shape(const VectorDims& minDims, const VectorDims& maxDims) { @@ -49,13 +53,17 @@ class Shape { initDims(); - if (std::any_of(dims.begin(), dims.end(), [](size_t dim) { return dim == Shape::UNDEFINED_DIM; } )) { + if (std::any_of(dims.begin(), dims.end(), [](size_t dim) { + return dim == Shape::UNDEFINED_DIM; + })) { type = ShapeType::Dynamic; } else { type = ShapeType::Static; } - hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { return dim == 0; } ); + hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { + return dim == 0; + }); } Shape(const std::initializer_list& shape) { @@ -69,7 +77,9 @@ class Shape { initDims(); - hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { return dim == 0; } ); + hasZeroDimensions = std::any_of(dims.begin(), dims.end(), [](size_t dim) { + return dim == 0; + }); } /** @@ -181,21 +191,21 @@ class Shape { std::string toString() const; - bool operator == (const Shape& rhs) const { + bool operator==(const Shape& rhs) const { return minDims == rhs.minDims && maxDims == rhs.maxDims; } - bool operator != (const Shape& rhs) const { + bool operator!=(const Shape& rhs) const { return !(*this == rhs); } bool hasDefinedUpperBounds() const { - return std::all_of(maxDims.begin(), maxDims.end(), [](Dim dim){ return dim != UNDEFINED_DIM; }); + return std::all_of(maxDims.begin(), maxDims.end(), [](Dim dim) { + return dim != UNDEFINED_DIM; + }); } - enum : Dim { - UNDEFINED_DIM = std::numeric_limits::max() - }; + enum : Dim { UNDEFINED_DIM = std::numeric_limits::max() }; private: void initDims() { @@ -205,10 +215,7 @@ class Shape { } } - enum class ShapeType { - Static, - Dynamic - } type {ShapeType::Static}; + enum class ShapeType { Static, Dynamic } type{ShapeType::Static}; bool hasZeroDimensions = false; @@ -229,5 +236,5 @@ class Shape { Shape mergeShapes(const Shape& lhs, const Shape& rhs); -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_streams_calculation.cpp b/src/plugins/intel_cpu/src/cpu_streams_calculation.cpp index 244adb7c40c23c..be6f5c4035d1ee 100644 --- a/src/plugins/intel_cpu/src/cpu_streams_calculation.cpp +++ b/src/plugins/intel_cpu/src/cpu_streams_calculation.cpp @@ -4,6 +4,11 @@ #include "cpu_streams_calculation.hpp" +#include +#include +#include +#include + #include "cpu_map_scheduling.hpp" #include "graph.h" #include "openvino/op/fake_quantize.hpp" @@ -13,29 +18,25 @@ #include "transformations/utils.hpp" #include "transformations/utils/utils.hpp" -#include -#include -#include -#include - using namespace ov; using namespace ov::threading; -#define INIT_VAL -100 +#define INIT_VAL -100 #define TP_CPU_LIMIT 32 namespace ov { namespace intel_cpu { -std::vector> get_streams_info_table(const int input_streams, - const bool input_streams_changed, - const int input_threads, - const int input_infer_requests, - const int model_prefer_threads, - const int input_current_socket_id, - const std::string input_perf_hint, - const std::set hint_model_distribution_policy, - const std::vector>& proc_type_table) { +std::vector> get_streams_info_table( + const int input_streams, + const bool input_streams_changed, + const int input_threads, + const int input_infer_requests, + const int model_prefer_threads, + const int input_current_socket_id, + const std::string input_perf_hint, + const std::set hint_model_distribution_policy, + const std::vector>& proc_type_table) { std::vector stream_info(CPU_STREAMS_TABLE_SIZE, INIT_VAL); std::vector> streams_info_table; std::vector> proc_socket_table; @@ -339,8 +340,7 @@ std::vector> get_streams_info_table(const int input_streams, n_threads_per_stream = static_cast(n_threads / n_streams); check_threads_per_stream(); } else { - n_threads_per_stream = - model_threads > 0 ? model_threads : static_cast(n_threads / n_streams); + n_threads_per_stream = model_threads > 0 ? model_threads : static_cast(n_threads / n_streams); } } } @@ -590,7 +590,7 @@ int get_model_prefer_threads(const int num_streams, (networkToleranceForLowCache.ratio_mem_limited_gemms > ov::MemBandwidthPressure::LIMITED))) { config.modelPreferThreads = 8; } -#elif((defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64)) && defined(__APPLE__)) +#elif ((defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64)) && defined(__APPLE__)) config.modelPreferThreads = 1; if (networkToleranceForLowCache.max_mem_tolerance == ov::MemBandwidthPressure::UNKNOWN) { if ((networkToleranceForLowCache.ratio_compute_convs == ov::MemBandwidthPressure::ALL) || diff --git a/src/plugins/intel_cpu/src/cpu_streams_calculation.hpp b/src/plugins/intel_cpu/src/cpu_streams_calculation.hpp index e362c0373d8d1d..0a0b4a1449b7cb 100644 --- a/src/plugins/intel_cpu/src/cpu_streams_calculation.hpp +++ b/src/plugins/intel_cpu/src/cpu_streams_calculation.hpp @@ -44,15 +44,16 @@ namespace intel_cpu { * in previous function. * @return streams information table which will be used by StreamsExecutor. */ -std::vector> get_streams_info_table(const int input_streams, - const bool input_streams_changed, - const int input_threads, - const int input_infer_requests, - const int model_prefer_threads, - const int input_current_socket_id, - const std::string input_perf_hint, - const std::set hint_llm_distribution_policy, - const std::vector>& proc_type_table); +std::vector> get_streams_info_table( + const int input_streams, + const bool input_streams_changed, + const int input_threads, + const int input_infer_requests, + const int model_prefer_threads, + const int input_current_socket_id, + const std::string input_perf_hint, + const std::set hint_llm_distribution_policy, + const std::vector>& proc_type_table); /** * @brief Generate streams rank table for tensor parallel according to streams info table. @@ -106,9 +107,7 @@ std::vector> generate_stream_info(const int streams, * @param[in] model graph handle * @param[in] config intel cpu configuration */ -void get_num_streams(const int streams, - const std::shared_ptr& model, - Config& config); +void get_num_streams(const int streams, const std::shared_ptr& model, Config& config); } // namespace intel_cpu } // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_tensor.cpp b/src/plugins/intel_cpu/src/cpu_tensor.cpp index 1a045ca117a538..0f82a8a9a4dfec 100644 --- a/src/plugins/intel_cpu/src/cpu_tensor.cpp +++ b/src/plugins/intel_cpu/src/cpu_tensor.cpp @@ -16,7 +16,8 @@ Tensor::Tensor(MemoryPtr memptr) : m_memptr{memptr} { // only support plain data format ncsp. auto memdesc = m_memptr->getDescPtr(); - OPENVINO_ASSERT(memdesc->hasLayoutType(LayoutType::ncsp), "intel_cpu::Tensor only supports memory with ncsp layout."); + OPENVINO_ASSERT(memdesc->hasLayoutType(LayoutType::ncsp), + "intel_cpu::Tensor only supports memory with ncsp layout."); m_element_type = memdesc->getPrecision(); } @@ -24,8 +25,14 @@ Tensor::Tensor(MemoryPtr memptr) : m_memptr{memptr} { void Tensor::set_shape(ov::Shape new_shape) { const auto& shape = m_memptr->getDescPtr()->getShape(); if (shape.isStatic()) { - DEBUG_LOG("tensor's memory object ", m_memptr.get(), ", ", vec2str(shape.getStaticDims()), " -> ", new_shape.to_string()); - if (shape.getStaticDims() == new_shape) return; + DEBUG_LOG("tensor's memory object ", + m_memptr.get(), + ", ", + vec2str(shape.getStaticDims()), + " -> ", + new_shape.to_string()); + if (shape.getStaticDims() == new_shape) + return; } auto desc = m_memptr->getDescPtr(); @@ -69,7 +76,7 @@ void Tensor::update_strides() const { OPENVINO_ASSERT(blocked_desc, "not a valid blocked memory descriptor."); auto& strides = blocked_desc->getStrides(); m_strides.resize(strides.size()); - std::transform(strides.cbegin(), strides.cend(), m_strides.begin(), [this] (const size_t stride) { + std::transform(strides.cbegin(), strides.cend(), m_strides.begin(), [this](const size_t stride) { return stride * m_element_type.size(); }); } @@ -96,5 +103,5 @@ std::shared_ptr make_tensor(MemoryPtr mem) { return std::make_shared(mem); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/cpu_tensor.h b/src/plugins/intel_cpu/src/cpu_tensor.h index 0f073e0d298faf..86648ce969b168 100644 --- a/src/plugins/intel_cpu/src/cpu_tensor.h +++ b/src/plugins/intel_cpu/src/cpu_tensor.h @@ -4,8 +4,8 @@ #pragma once -#include "openvino/runtime/itensor.hpp" #include "cpu_memory.h" +#include "openvino/runtime/itensor.hpp" namespace ov { namespace intel_cpu { @@ -29,7 +29,9 @@ class Tensor : public ITensor { void* data(const element::Type& type = {}) const override; - MemoryPtr get_memory() {return m_memptr;} + MemoryPtr get_memory() { + return m_memptr; + } private: void update_strides() const; @@ -44,5 +46,5 @@ class Tensor : public ITensor { std::shared_ptr make_tensor(MemoryPtr mem); -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/cpu_types.cpp b/src/plugins/intel_cpu/src/cpu_types.cpp index 30884bbe649962..67c538bd78341a 100644 --- a/src/plugins/intel_cpu/src/cpu_types.cpp +++ b/src/plugins/intel_cpu/src/cpu_types.cpp @@ -2,10 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 // #include "cpu_types.h" -#include "cpu_shape.h" -#include #include +#include + +#include "cpu_shape.h" namespace ov { namespace intel_cpu { @@ -260,8 +261,7 @@ static const TypeToNameMap& get_type_to_name_tbl() { {"QKVProjection", Type::QKVProjection}, {"RMS", Type::RMS}, {"SearchSorted", Type::SearchSorted}, - {"LoraSubgraph", Type::LoRA} - }; + {"LoraSubgraph", Type::LoRA}}; return type_to_name_tbl; } diff --git a/src/plugins/intel_cpu/src/dnnl_extension_utils.cpp b/src/plugins/intel_cpu/src/dnnl_extension_utils.cpp index 3d9b2f69bd8f66..457f8368f734dd 100644 --- a/src/plugins/intel_cpu/src/dnnl_extension_utils.cpp +++ b/src/plugins/intel_cpu/src/dnnl_extension_utils.cpp @@ -47,79 +47,79 @@ uint8_t DnnlExtensionUtils::sizeOfDataType(dnnl::memory::data_type dataType) { dnnl::memory::data_type DnnlExtensionUtils::ElementTypeToDataType(const ov::element::Type& elementType) { switch (elementType) { - case ov::element::f32: - return memory::data_type::f32; - case ov::element::i32: - return memory::data_type::s32; - case ov::element::bf16: - return memory::data_type::bf16; - case ov::element::i8: - return memory::data_type::s8; - case ov::element::u8: - case ov::element::boolean: - return memory::data_type::u8; - case ov::element::u1: - return memory::data_type::bin; - case ov::element::f16: - return memory::data_type::f16; - case ov::element::nf4: - return memory::data_type::nf4; - case ov::element::i4: - return memory::data_type::s4; - case ov::element::u4: - return memory::data_type::u4; - case ov::element::f8e8m0: - return memory::data_type::f8_e8m0; - case ov::element::f4e2m1: - return memory::data_type::f4_e2m1; - case ov::element::undefined: - return memory::data_type::undef; - default: { - OPENVINO_THROW("CPU plugin does not support ", elementType.to_string(), " for use with oneDNN."); - } + case ov::element::f32: + return memory::data_type::f32; + case ov::element::i32: + return memory::data_type::s32; + case ov::element::bf16: + return memory::data_type::bf16; + case ov::element::i8: + return memory::data_type::s8; + case ov::element::u8: + case ov::element::boolean: + return memory::data_type::u8; + case ov::element::u1: + return memory::data_type::bin; + case ov::element::f16: + return memory::data_type::f16; + case ov::element::nf4: + return memory::data_type::nf4; + case ov::element::i4: + return memory::data_type::s4; + case ov::element::u4: + return memory::data_type::u4; + case ov::element::f8e8m0: + return memory::data_type::f8_e8m0; + case ov::element::f4e2m1: + return memory::data_type::f4_e2m1; + case ov::element::undefined: + return memory::data_type::undef; + default: { + OPENVINO_THROW("CPU plugin does not support ", elementType.to_string(), " for use with oneDNN."); + } } } ov::element::Type DnnlExtensionUtils::DataTypeToElementType(const dnnl::memory::data_type& dataType) { switch (dataType) { - case memory::data_type::f32: - return ov::element::f32; - case memory::data_type::s32: - return ov::element::i32; - case memory::data_type::bf16: - return ov::element::bf16; - case memory::data_type::s8: - return ov::element::i8; - case memory::data_type::u8: - return ov::element::u8; - case memory::data_type::bin: - return ov::element::u1; - case memory::data_type::f16: - return ov::element::f16; - case memory::data_type::f64: - return ov::element::f64; - case memory::data_type::nf4: - return ov::element::nf4; - case memory::data_type::s4: - return ov::element::i4; - case memory::data_type::u4: - return ov::element::u4; - case memory::data_type::f8_e8m0: - return ov::element::f8e8m0; - case memory::data_type::f4_e2m1: - return ov::element::f4e2m1; - case memory::data_type::undef: - return ov::element::undefined; - default: { - OPENVINO_THROW("Unsupported data type."); - } + case memory::data_type::f32: + return ov::element::f32; + case memory::data_type::s32: + return ov::element::i32; + case memory::data_type::bf16: + return ov::element::bf16; + case memory::data_type::s8: + return ov::element::i8; + case memory::data_type::u8: + return ov::element::u8; + case memory::data_type::bin: + return ov::element::u1; + case memory::data_type::f16: + return ov::element::f16; + case memory::data_type::f64: + return ov::element::f64; + case memory::data_type::nf4: + return ov::element::nf4; + case memory::data_type::s4: + return ov::element::i4; + case memory::data_type::u4: + return ov::element::u4; + case memory::data_type::f8_e8m0: + return ov::element::f8e8m0; + case memory::data_type::f4_e2m1: + return ov::element::f4e2m1; + case memory::data_type::undef: + return ov::element::undefined; + default: { + OPENVINO_THROW("Unsupported data type."); + } } } -Dim DnnlExtensionUtils::convertToDim(const dnnl::memory::dim &dim) { - return dim == DNNL_RUNTIME_DIM_VAL ? Shape::UNDEFINED_DIM : static_cast(dim); +Dim DnnlExtensionUtils::convertToDim(const dnnl::memory::dim& dim) { + return dim == DNNL_RUNTIME_DIM_VAL ? Shape::UNDEFINED_DIM : static_cast(dim); } -dnnl::memory::dim DnnlExtensionUtils::convertToDnnlDim(const Dim &dim) { +dnnl::memory::dim DnnlExtensionUtils::convertToDnnlDim(const Dim& dim) { return dim == Shape::UNDEFINED_DIM ? DNNL_RUNTIME_DIM_VAL : static_cast(dim); } @@ -141,25 +141,25 @@ memory::dims DnnlExtensionUtils::convertToDnnlDims(const VectorDims& dims) { memory::format_tag DnnlExtensionUtils::GetPlainFormatByRank(size_t rank) { switch (rank) { - case 0: - case 1: - return memory::format_tag::a; - case 2: - return memory::format_tag::ab; - case 3: - return memory::format_tag::abc; - case 4: - return memory::format_tag::abcd; - case 5: - return memory::format_tag::abcde; - case 6: - return memory::format_tag::abcdef; - default: - return memory::format_tag::undef; + case 0: + case 1: + return memory::format_tag::a; + case 2: + return memory::format_tag::ab; + case 3: + return memory::format_tag::abc; + case 4: + return memory::format_tag::abcd; + case 5: + return memory::format_tag::abcde; + case 6: + return memory::format_tag::abcdef; + default: + return memory::format_tag::undef; } } -DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const dnnl::memory::desc &desc) { +DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const dnnl::memory::desc& desc) { return makeDescriptor(desc.get()); } @@ -182,7 +182,8 @@ size_t DnnlExtensionUtils::getMemSizeForDnnlDesc(const dnnl::memory::desc& desc) return size; } -std::shared_ptr DnnlExtensionUtils::makeUndefinedDesc(const memory::desc &desc, const Shape &shape) { +std::shared_ptr DnnlExtensionUtils::makeUndefinedDesc(const memory::desc& desc, + const Shape& shape) { if (desc.get_format_kind() == memory::format_kind::blocked) { return std::shared_ptr(new DnnlBlockedMemoryDesc(desc, shape)); } else { @@ -190,7 +191,9 @@ std::shared_ptr DnnlExtensionUtils::makeUndefinedDesc(con } } -DnnlMemoryDescPtr DnnlExtensionUtils::query_md(const const_dnnl_primitive_desc_t& pd, const dnnl::query& what, int idx) { +DnnlMemoryDescPtr DnnlExtensionUtils::query_md(const const_dnnl_primitive_desc_t& pd, + const dnnl::query& what, + int idx) { auto query = dnnl::convert_to_c(what); const auto* cdesc = dnnl_primitive_desc_query_md(pd, query, idx); @@ -201,7 +204,7 @@ DnnlMemoryDescPtr DnnlExtensionUtils::query_md(const const_dnnl_primitive_desc_t } std::string DnnlExtensionUtils::query_impl_info_str(const const_dnnl_primitive_desc_t& pd) { - const char *res; + const char* res; dnnl_status_t status = dnnl_primitive_desc_query(pd, dnnl_query_impl_info_str, 0, &res); if (status != dnnl_success) OPENVINO_THROW("query_impl_info_str failed."); @@ -209,10 +212,9 @@ std::string DnnlExtensionUtils::query_impl_info_str(const const_dnnl_primitive_d } bool DnnlExtensionUtils::find_implementation(dnnl::primitive_desc& desc, impl_desc_type impl_type) { - return DnnlExtensionUtils::find_implementation(desc, - [impl_type](impl_desc_type cur_impl_type){ - return cur_impl_type == impl_type; - }); + return DnnlExtensionUtils::find_implementation(desc, [impl_type](impl_desc_type cur_impl_type) { + return cur_impl_type == impl_type; + }); } dnnl_memory_desc_t DnnlExtensionUtils::clone_desc(const_dnnl_memory_desc_t cdesc) { @@ -233,31 +235,33 @@ const char* DnnlExtensionUtils::query_pd_info(const_dnnl_primitive_desc_t pd) { bool DnnlExtensionUtils::isUnarySupportedAsPostOp(Algorithm alg) { #if defined(OV_CPU_WITH_ACL) - return one_of(alg, Algorithm::EltwiseRelu, - Algorithm::EltwiseTanh, - Algorithm::EltwiseElu, - Algorithm::EltwiseAbs, - Algorithm::EltwiseSqrt, - Algorithm::EltwiseSoftRelu, - Algorithm::EltwiseSigmoid, - Algorithm::EltwiseClamp); + return one_of(alg, + Algorithm::EltwiseRelu, + Algorithm::EltwiseTanh, + Algorithm::EltwiseElu, + Algorithm::EltwiseAbs, + Algorithm::EltwiseSqrt, + Algorithm::EltwiseSoftRelu, + Algorithm::EltwiseSigmoid, + Algorithm::EltwiseClamp); #elif defined(OPENVINO_ARCH_X86_64) - return one_of(alg, Algorithm::EltwiseRelu, - Algorithm::EltwiseGeluErf, - Algorithm::EltwiseGeluTanh, - Algorithm::EltwiseElu, - Algorithm::EltwiseSigmoid, - Algorithm::EltwiseClamp, - Algorithm::EltwiseTanh, - Algorithm::EltwiseSwish, - Algorithm::EltwiseHswish, - Algorithm::EltwiseMish, - Algorithm::EltwiseHsigmoid, - Algorithm::EltwiseRoundHalfToEven, - Algorithm::EltwiseRoundHalfAwayFromZero, - Algorithm::EltwiseAbs, - Algorithm::EltwiseSqrt, - Algorithm::EltwiseSoftRelu); + return one_of(alg, + Algorithm::EltwiseRelu, + Algorithm::EltwiseGeluErf, + Algorithm::EltwiseGeluTanh, + Algorithm::EltwiseElu, + Algorithm::EltwiseSigmoid, + Algorithm::EltwiseClamp, + Algorithm::EltwiseTanh, + Algorithm::EltwiseSwish, + Algorithm::EltwiseHswish, + Algorithm::EltwiseMish, + Algorithm::EltwiseHsigmoid, + Algorithm::EltwiseRoundHalfToEven, + Algorithm::EltwiseRoundHalfAwayFromZero, + Algorithm::EltwiseAbs, + Algorithm::EltwiseSqrt, + Algorithm::EltwiseSoftRelu); #else return false; #endif @@ -269,5 +273,5 @@ std::string DnnlExtensionUtils::computeWeightsStringHash(const std::shared_ptr(memory->getData())); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/dnnl_extension_utils.h b/src/plugins/intel_cpu/src/dnnl_extension_utils.h index 7a968ea3c71c3d..ecf223b48497cd 100644 --- a/src/plugins/intel_cpu/src/dnnl_extension_utils.h +++ b/src/plugins/intel_cpu/src/dnnl_extension_utils.h @@ -10,11 +10,11 @@ #include +#include "common/c_types_map.hpp" #include "cpu_types.h" #include "onednn/dnnl.h" #include "onednn/iml_type_mapper.h" #include "openvino/core/type/element_type.hpp" -#include "common/c_types_map.hpp" namespace ov { namespace intel_cpu { @@ -29,8 +29,8 @@ class DnnlExtensionUtils { static uint8_t sizeOfDataType(dnnl::memory::data_type dataType); static dnnl::memory::data_type ElementTypeToDataType(const ov::element::Type& elementType); static ov::element::Type DataTypeToElementType(const dnnl::memory::data_type& dataType); - static Dim convertToDim(const dnnl::memory::dim &dim); - static dnnl::memory::dim convertToDnnlDim(const Dim &dim); + static Dim convertToDim(const dnnl::memory::dim& dim); + static dnnl::memory::dim convertToDnnlDim(const Dim& dim); static VectorDims convertToVectorDims(const dnnl::memory::dims& dims); static VectorDims convertToVectorDims(const dnnl::impl::dims_t dims, const int ndims); static std::vector convertToDnnlDims(const VectorDims& dims); @@ -41,25 +41,28 @@ class DnnlExtensionUtils { * @param desc dnnl::memory::desc from which one of the descriptors will be created * @return pointer to DnnlBlockedMemoryDesc or DnnlMemoryDesc */ - static std::shared_ptr makeDescriptor(const dnnl::memory::desc &desc); + static std::shared_ptr makeDescriptor(const dnnl::memory::desc& desc); static std::shared_ptr makeDescriptor(const_dnnl_memory_desc_t desc); /** * @brief Helper function that creates DnnlBlockedMemoryDesc from defined dnnl::memory::desc and undefined shape. - * It uses desc as an basis for the new undefined one. Specifically, type, layout, precision, blocks, extra data will be preserved. + * It uses desc as an basis for the new undefined one. Specifically, type, layout, precision, blocks, extra data + * will be preserved. * @param desc dnnl::memory::desc dnnl desc which will be used as a basis of the new descriptor * @param shape a new undefined shape * @return pointer to the created DnnlBlockedMemoryDesc * @note Obly blocked descriptors are allowed at the moment */ - static std::shared_ptr makeUndefinedDesc(const dnnl::memory::desc &desc, const Shape& shape); + static std::shared_ptr makeUndefinedDesc(const dnnl::memory::desc& desc, const Shape& shape); static size_t getMemSizeForDnnlDesc(const dnnl::memory::desc& desc); - static std::shared_ptr query_md(const const_dnnl_primitive_desc_t& pd, const dnnl::query& what, int idx = 0); + static std::shared_ptr query_md(const const_dnnl_primitive_desc_t& pd, + const dnnl::query& what, + int idx = 0); static std::string query_impl_info_str(const const_dnnl_primitive_desc_t& pd); - template + template static bool find_implementation(dnnl::primitive_desc& desc, T&& comparator) { dnnl::primitive_desc_iterator& itpd = desc; @@ -77,7 +80,7 @@ class DnnlExtensionUtils { return false; } - template + template static void for_each_implementation(dnnl::primitive_desc& desc, bool first_match, T&& comparator, L&& func) { dnnl::primitive_desc_iterator& itpd = desc; @@ -113,5 +116,5 @@ class DnnlExtensionUtils { const std::shared_ptr& dstDesc); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/dnnl_postops_composer.cpp b/src/plugins/intel_cpu/src/dnnl_postops_composer.cpp index 70d28f1f4ac739..7d62e5cb6b673d 100644 --- a/src/plugins/intel_cpu/src/dnnl_postops_composer.cpp +++ b/src/plugins/intel_cpu/src/dnnl_postops_composer.cpp @@ -656,7 +656,7 @@ static MemoryPtr prepackDecompressionParams(const MemoryCPtr& paramsPtr, // weights without batch: (OC, G) // weights with batch: (B, OC, G) const size_t OC = shape[shape.size() - 2]; - const size_t G = shape[shape.size() - 1]; + const size_t G = shape[shape.size() - 1]; Shape dstShape = Shape({OC, G}); @@ -698,8 +698,7 @@ void DnnlPostOpsComposer::appendDecompressionZeroPoints(const MemoryCPtr& zero_p if (zero_points_ptr == nullptr) return; - auto zeroPointsMem = - prepackDecompressionParams(zero_points_ptr, needTranspose, dstPrecision, engine); + auto zeroPointsMem = prepackDecompressionParams(zero_points_ptr, needTranspose, dstPrecision, engine); attr.set_zero_points_dims(DNNL_ARG_WEIGHTS, DnnlExtensionUtils::convertToDnnlDims(zeroPointsMem->getStaticDims()), DnnlExtensionUtils::ElementTypeToDataType(dstPrecision)); diff --git a/src/plugins/intel_cpu/src/dnnl_postops_composer.h b/src/plugins/intel_cpu/src/dnnl_postops_composer.h index 8c2718aaaed4d5..7ae634658b005f 100644 --- a/src/plugins/intel_cpu/src/dnnl_postops_composer.h +++ b/src/plugins/intel_cpu/src/dnnl_postops_composer.h @@ -12,8 +12,8 @@ #include "cpu_memory.h" #include "nodes/executors/dnnl/dnnl_aliases.hpp" -#include "post_ops.hpp" #include "nodes/executors/dnnl/dnnl_post_op_data.hpp" +#include "post_ops.hpp" namespace ov { namespace intel_cpu { @@ -31,7 +31,9 @@ class DnnlPostOpsComposer { const dnnl::memory::data_type outDataType); DnnlPrimitiveAttrs compose(); void appendDecompressionScales(const MemoryCPtr& scales_ptr, bool needTranspose, ov::element::Type dstPrecision); - void appendDecompressionZeroPoints(const MemoryCPtr& zero_points_ptr, bool needTranspose, ov::element::Type dstPrecision); + void appendDecompressionZeroPoints(const MemoryCPtr& zero_points_ptr, + bool needTranspose, + ov::element::Type dstPrecision); void setDynamicQuantizationParams(uint64_t groupSize); private: diff --git a/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.cpp b/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.cpp index cb59492463f410..3e40ead65d6cc3 100644 --- a/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.cpp +++ b/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.cpp @@ -3,9 +3,11 @@ // #include "dnnl_postops_composer_legacy.h" + #include #include + #include "utils/debug_capabilities.h" namespace ov { @@ -39,10 +41,10 @@ DnnlPostOpsComposerLegacy::DnnlPostOpsComposerLegacy(const dnnl::engine& engine, wei_scale_mask = wei_scale_values.size() > 1 ? weiScaleMaskPerChannel : 0; dst_scale_val = 1.0; - //set the DQscale into attr weight scale before appending any post-ops. + // set the DQscale into attr weight scale before appending any post-ops. updateWeiScales(); - //If having the bias, attr weight scale can't be updated for further ops-ops optimization. - //ONEDNN 3.x quantization for scheme: QuantizedInput * QuantizedWeight * DQScale + Bias. + // If having the bias, attr weight scale can't be updated for further ops-ops optimization. + // ONEDNN 3.x quantization for scheme: QuantizedInput * QuantizedWeight * DQScale + Bias. weightScaleAvailable = !hasBias; } else if (!DQScales.empty()) { // DQ scale is fused but swiching back to non-INT8 for execution in some cases. @@ -115,22 +117,22 @@ bool DnnlPostOpsComposerLegacy::appendScale(const std::vector& scale, boo return true; } if (weightScaleAvailable) { - //oneDNN v3.* weight scale can also be used in the further optimization patterns. - // there are so many possible optimizations can be done, for example: + // oneDNN v3.* weight scale can also be used in the further optimization patterns. + // there are so many possible optimizations can be done, for example: // - // we can switch the existing postOps's order to take - // advantage of output scale if it's available: - // relu(x)*scale = relu(x*scale) - // or we can fuse it into previous one as long as they are - // compatible in shape - // x*A*s = x*(A*s) - // or even with add: - // (x*A + B)*s = x*(A*s) + (B*s) - // or we can combine these two tricks: - // relu(x*A)*s = relu(x*(A*s)) + // we can switch the existing postOps's order to take + // advantage of output scale if it's available: + // relu(x)*scale = relu(x*scale) + // or we can fuse it into previous one as long as they are + // compatible in shape + // x*A*s = x*(A*s) + // or even with add: + // (x*A + B)*s = x*(A*s) + (B*s) + // or we can combine these two tricks: + // relu(x*A)*s = relu(x*(A*s)) // - // we cannot implement all of them, so we just add the one - // that we observed in real models. + // we cannot implement all of them, so we just add the one + // that we observed in real models. if ((ops.len() == 0)) fuseIntoWeiScale = true; @@ -201,9 +203,9 @@ bool DnnlPostOpsComposerLegacy::appendShift(const std::vector& shift, boo } bool DnnlPostOpsComposerLegacy::appendLinear(const std::vector& scale, - const std::vector& shift, - bool isLastPostOp, - bool allowBinary) { + const std::vector& shift, + bool isLastPostOp, + bool allowBinary) { if (scale.size() == 1 && shift.size() == 1) { if (shift[0] == 0.0f) return appendScale(scale, isLastPostOp, allowBinary); diff --git a/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.h b/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.h index 82fdda94012f15..485fa31fb5d956 100644 --- a/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.h +++ b/src/plugins/intel_cpu/src/dnnl_postops_composer_legacy.h @@ -8,11 +8,10 @@ */ #pragma once -#include "dnnl_types.h" - #include #include "cpu_memory.h" +#include "dnnl_types.h" #include "memory_desc/cpu_memory_desc.h" #include "memory_desc/dnnl_blocked_memory_desc.h" #include "onednn/dnnl.h" @@ -39,7 +38,10 @@ class DnnlPostOpsComposerLegacy { void appendRoundHTE(); bool appendScale(const std::vector& scale, bool isLastPostOp, bool allowBinary = true); bool appendShift(const std::vector& shift, bool allowBinary = true); - bool appendLinear(const std::vector& scale, const std::vector& shift, bool isLastPostOp, bool allowBinary = true); + bool appendLinear(const std::vector& scale, + const std::vector& shift, + bool isLastPostOp, + bool allowBinary = true); void appendClip(const std::vector& low, const std::vector& high); const VectorDims& getOutputDims() { diff --git a/src/plugins/intel_cpu/src/edge.cpp b/src/plugins/intel_cpu/src/edge.cpp index c49b924477f694..1eabc6275bf4b0 100644 --- a/src/plugins/intel_cpu/src/edge.cpp +++ b/src/plugins/intel_cpu/src/edge.cpp @@ -3,8 +3,9 @@ // #include "edge.h" -#include "node.h" + #include "dnnl_extension_utils.h" +#include "node.h" #include "openvino/core/type/element_type.hpp" #include "openvino/util/pp.hpp" @@ -12,8 +13,11 @@ using namespace dnnl; namespace ov { namespace intel_cpu { -Edge::Edge(const NodePtr &parent, const NodePtr &child, int pr_port, int ch_port) : - parent(parent), child(child), parent_port(pr_port), child_port(ch_port) {} +Edge::Edge(const NodePtr& parent, const NodePtr& child, int pr_port, int ch_port) + : parent(parent), + child(child), + parent_port(pr_port), + child_port(ch_port) {} const NodePtr Edge::getParent() const { auto parentPtr = parent.lock(); @@ -39,14 +43,14 @@ bool Edge::isDropped() const { auto parent_ptr = parent.lock(); if (parent_ptr) { - for (auto &edge : parent_ptr->childEdges) + for (auto& edge : parent_ptr->childEdges) if (edge.lock().get() == this) not_in_parent = false; } auto child_ptr = child.lock(); if (child_ptr) { - for (auto &edge : child_ptr->parentEdges) + for (auto& edge : child_ptr->parentEdges) if (edge.lock().get() == this) not_in_child = false; } @@ -131,8 +135,8 @@ bool Edge::enforceReorder() { } static inline bool isPhycicalMemCompatible(const MemoryDesc& lhsMemDesc, const MemoryDesc& rhsMemDesc) { - if (!lhsMemDesc.isDefined() || !rhsMemDesc.isDefined() || - !(lhsMemDesc.getType() & MemoryDescType::Blocked) || !(rhsMemDesc.getType() & MemoryDescType::Blocked) || + if (!lhsMemDesc.isDefined() || !rhsMemDesc.isDefined() || !(lhsMemDesc.getType() & MemoryDescType::Blocked) || + !(rhsMemDesc.getType() & MemoryDescType::Blocked) || (lhsMemDesc.getType() == DnnlBlocked && !lhsMemDesc.as()->hasEmptyExtraData()) || (rhsMemDesc.getType() == DnnlBlocked && !rhsMemDesc.as()->hasEmptyExtraData())) return false; @@ -140,13 +144,21 @@ static inline bool isPhycicalMemCompatible(const MemoryDesc& lhsMemDesc, const M const auto lhsBlockMemDesc = lhsMemDesc.as(); const auto rhsBlockMemDesc = rhsMemDesc.as(); - if (lhsBlockMemDesc->getShape() != rhsBlockMemDesc->getShape() || lhsBlockMemDesc->getPrecision() != rhsBlockMemDesc->getPrecision()) + if (lhsBlockMemDesc->getShape() != rhsBlockMemDesc->getShape() || + lhsBlockMemDesc->getPrecision() != rhsBlockMemDesc->getPrecision()) return false; // dims padding check - bool isZeroDimsPaddings = - std::all_of(lhsBlockMemDesc->getOffsetPaddingToData().begin(), lhsBlockMemDesc->getOffsetPaddingToData().end(), [](size_t x){ return x == 0; }) && - std::all_of(rhsBlockMemDesc->getOffsetPaddingToData().begin(), rhsBlockMemDesc->getOffsetPaddingToData().end(), [](size_t x){ return x == 0; }); + bool isZeroDimsPaddings = std::all_of(lhsBlockMemDesc->getOffsetPaddingToData().begin(), + lhsBlockMemDesc->getOffsetPaddingToData().end(), + [](size_t x) { + return x == 0; + }) && + std::all_of(rhsBlockMemDesc->getOffsetPaddingToData().begin(), + rhsBlockMemDesc->getOffsetPaddingToData().end(), + [](size_t x) { + return x == 0; + }); bool isSameElementsCount = lhsBlockMemDesc->getPaddedElementsCount() == rhsBlockMemDesc->getPaddedElementsCount(); if (!isZeroDimsPaddings || !isSameElementsCount) return false; @@ -161,7 +173,8 @@ static inline bool isPhycicalMemCompatible(const MemoryDesc& lhsMemDesc, const M std::vector lhsStridesDefault(lhsBlockDims.size()); lhsStridesDefault[lhsBlockDims.size() - 1] = 1; for (size_t i = 2; i <= lhsBlockDims.size(); i++) { - lhsStridesDefault[lhsBlockDims.size() - i] = lhsStridesDefault[lhsBlockDims.size() - (i - 1)] * lhsBlockDims[lhsBlockDims.size() - (i - 1)]; + lhsStridesDefault[lhsBlockDims.size() - i] = + lhsStridesDefault[lhsBlockDims.size() - (i - 1)] * lhsBlockDims[lhsBlockDims.size() - (i - 1)]; } auto rhsBlockDims = rhsBlockMemDesc->getBlockDims(); @@ -169,11 +182,11 @@ static inline bool isPhycicalMemCompatible(const MemoryDesc& lhsMemDesc, const M rhsStridesDefault[rhsBlockDims.size() - 1] = 1; for (size_t i = 2; i <= rhsBlockDims.size(); i++) { rhsStridesDefault[rhsBlockDims.size() - i] = - rhsStridesDefault[rhsBlockDims.size() - (i - 1)] * rhsBlockDims[rhsBlockDims.size() - (i - 1)]; + rhsStridesDefault[rhsBlockDims.size() - (i - 1)] * rhsBlockDims[rhsBlockDims.size() - (i - 1)]; } - // this check needed to avoid inserting unnecessary reorders if the memory is used in place and the batch size is equal to 1 - // in nodes like concate and split + // this check needed to avoid inserting unnecessary reorders if the memory is used in place and the batch size is + // equal to 1 in nodes like concate and split size_t lhsSkipAxis = lhsBlockDims.size() > 0 && lhsBlockDims[0] == 1 ? 0 : Shape::UNDEFINED_DIM; size_t rhsSkipAxis = rhsBlockDims.size() > 0 && rhsBlockDims[0] == 1 ? 0 : Shape::UNDEFINED_DIM; @@ -219,8 +232,10 @@ Edge::ReorderStatus Edge::needReorder() { // Check whether the child node may accept the parent produced tensor if (!outPortDesc->isCompatible(*inputPortDesc)) { - // Performance optimization which exploit the fact that some tensors do not need actual data reordering to be read using different descriptors - if (isPhycicalMemCompatible(*inputPortDesc->getMemDesc(), *outPortDesc->getMemDesc()) && !getParent()->isConstant()) { + // Performance optimization which exploit the fact that some tensors do not need actual data reordering to be + // read using different descriptors + if (isPhycicalMemCompatible(*inputPortDesc->getMemDesc(), *outPortDesc->getMemDesc()) && + !getParent()->isConstant()) { optimized = true; } else { return ReorderStatus::Regular; @@ -297,8 +312,8 @@ std::string Edge::hash() const { std::stringstream result; - return parentPtr->getName() + "_" + std::to_string(parent_port) + "_" + - childPtr->getName() + "_" + std::to_string(child_port); + return parentPtr->getName() + "_" + std::to_string(parent_port) + "_" + childPtr->getName() + "_" + + std::to_string(child_port); } void Edge::externalAllocate(WeightsSharing::Ptr weightsCache) { @@ -306,10 +321,13 @@ void Edge::externalAllocate(WeightsSharing::Ptr weightsCache) { return; if (weightsCache) { - auto alloc = [this] () { + auto alloc = [this]() { auto allocateFunc = [this](const MemoryDesc& inputDesc) -> MemoryPtr { auto parentPtr = getParent(); - return std::make_shared(parentPtr->getEngine(), inputDesc, nullptr, false); // no pads zeroing + return std::make_shared(parentPtr->getEngine(), + inputDesc, + nullptr, + false); // no pads zeroing }; allocateCommon(allocateFunc); @@ -424,7 +442,7 @@ const MemoryDesc& Edge::getDesc() const { return getInputDesc(); } -const IMemory &Edge::getMemory() { +const IMemory& Edge::getMemory() { auto memPtr = getMemoryPtr(); OPENVINO_ASSERT(memPtr != nullptr, " Dereferencing NULL memory in edge: ", *this); return *memPtr; @@ -434,7 +452,7 @@ MemoryPtr Edge::getMemoryPtr() const { return memoryPtr; } -void Edge::sharedMemFrom(const EdgePtr &edge) { +void Edge::sharedMemFrom(const EdgePtr& edge) { memoryFromEdge = edge; DEBUG_LOG(*this, " sharedMemFrom ", *edge); status = Status::NotAllocated; @@ -474,10 +492,8 @@ void Edge::init() { DEBUG_LOG(*this, " getBaseEdge() return itself"); changeStatus(Status::NeedAllocation); } else { - if (Type::Input == edgePtr->getParent()->getType() && - Type::MemoryInput != getParent()->getType() && - edgePtr->getParent()->isConstant() && - !edgePtr->getChild()->isConstant()) { + if (Type::Input == edgePtr->getParent()->getType() && Type::MemoryInput != getParent()->getType() && + edgePtr->getParent()->isConstant() && !edgePtr->getChild()->isConstant()) { changeStatus(Status::NeedAllocation); DEBUG_LOG(*this, " edge inplace from ", *edgePtr, " is broken!"); return; @@ -505,11 +521,11 @@ EdgePtr Edge::getBaseEdge(int look) { if ((childInPlacePort >= 0) && (look & LOOK_DOWN)) { auto ch_edges = getChild()->getChildEdgesAtPort(childInPlacePort); - auto &next_ch_edge = ch_edges[0]; + auto& next_ch_edge = ch_edges[0]; // Multiple connection to some out port // Will try to find inplace consumer - for (auto &ch_edge : ch_edges) { + for (auto& ch_edge : ch_edges) { if (ch_edge->getChild()->inPlaceInputPort(ch_edge->getOutputNum()) >= 0) { next_ch_edge = ch_edge; // To align with upstream-inplace, we stop searching once found the first inplace consumer @@ -525,14 +541,16 @@ EdgePtr Edge::getBaseEdge(int look) { for (auto edge : edgesForSamePort) { if (edge.get() != this) { // Return once found the first inplace consumer - if (edge->inPlace()) return edge; + if (edge->inPlace()) + return edge; } } // Return the first output edge as the base if there is no inPlace consumers // thus benefits zero-copy of outputs. for (auto edge : edgesForSamePort) { - if (Type::Output == edge->getChild()->getType()) return edge; + if (Type::Output == edge->getChild()->getType()) + return edge; } return edgesForSamePort[0]; @@ -579,7 +597,7 @@ NodePtr Edge::modifiedInPlace() const { for (size_t i = 0; i < outConfs.size(); ++i) { const auto& conf = outConfs[i]; if (childPort < 0 || conf.inPlace() != childPort || - Type::MemoryInput == childNode->getType()) { //exception type, it doesn't modify memory + Type::MemoryInput == childNode->getType()) { // exception type, it doesn't modify memory continue; } if (childNode->isExecutable()) { @@ -599,12 +617,14 @@ NodePtr Edge::modifiedInPlace() const { return nullptr; } -std::ostream& operator<<(std::ostream &os, const Edge& edge) { - return os << "(" << edge.getParent()->getName() << ")" << "[" << edge.getInputNum() << "] " +std::ostream& operator<<(std::ostream& os, const Edge& edge) { + return os << "(" << edge.getParent()->getName() << ")" + << "[" << edge.getInputNum() << "] " << "<->" - << "(" << edge.getChild()->getName() << ")" << "[" << edge.getOutputNum() << "]" + << "(" << edge.getChild()->getName() << ")" + << "[" << edge.getOutputNum() << "]" << ":" << Edge::statusToString(edge.getStatus()); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/edge.h b/src/plugins/intel_cpu/src/edge.h index 5c418b2665924d..38f49ff00db075 100644 --- a/src/plugins/intel_cpu/src/edge.h +++ b/src/plugins/intel_cpu/src/edge.h @@ -4,15 +4,15 @@ #pragma once +#include +#include + #include "cpu_shape.h" #include "internal_properties.hpp" #include "memory_desc/cpu_memory_desc.h" #include "nodes/node_config.h" #include "weights_cache.hpp" -#include -#include - namespace ov { namespace intel_cpu { @@ -24,23 +24,11 @@ using EdgeWeakPtr = std::weak_ptr; class Edge { public: - Edge(const std::shared_ptr& parent, - const std::shared_ptr& child, - int pr_port = 0, int ch_port = 0); - - enum class Status { - Uninitialized, - NeedAllocation, - NotAllocated, - Allocated, - Validated - }; - - enum class ReorderStatus { - Regular = 0, - Optimized = 1, - No = 2 - }; + Edge(const std::shared_ptr& parent, const std::shared_ptr& child, int pr_port = 0, int ch_port = 0); + + enum class Status { Uninitialized, NeedAllocation, NotAllocated, Allocated, Validated }; + + enum class ReorderStatus { Regular = 0, Optimized = 1, No = 2 }; enum LOOK { LOOK_UP = 1, LOOK_DOWN = 2, LOOK_BOTH = LOOK_UP | LOOK_DOWN }; @@ -52,15 +40,15 @@ class Edge { #define CASE(_status) \ case Status::_status: \ return #_status; - switch (status) { - CASE(Uninitialized); - CASE(NeedAllocation); - CASE(NotAllocated); - CASE(Allocated); - CASE(Validated); - } + switch (status) { + CASE(Uninitialized); + CASE(NeedAllocation); + CASE(NotAllocated); + CASE(Allocated); + CASE(Validated); + } #undef CASE - return "Unexpected"; + return "Unexpected"; } void changeStatus(Status state); @@ -87,7 +75,9 @@ class Edge { int getInputNum() const; int getOutputNum() const; - void setChildPort(const size_t port) { child_port = port; } + void setChildPort(const size_t port) { + child_port = port; + } void sharedMemFrom(const EdgePtr& edge); EdgePtr getSharedEdge() const; @@ -126,8 +116,7 @@ class Edge { friend class Graph; }; -std::ostream& operator<<(std::ostream &os, const Edge& edge); - -} // namespace intel_cpu -} // namespace ov +std::ostream& operator<<(std::ostream& os, const Edge& edge); +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.cpp index 01af9dbde7fe01..c2c6ddf6f271fc 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.cpp @@ -4,9 +4,10 @@ #ifdef CPU_DEBUG_CAPS -#include "debug_capabilities.hpp" -#include -#include +# include "debug_capabilities.hpp" + +# include +# include namespace ov { namespace intel_cpu { @@ -14,25 +15,26 @@ namespace intel_cpu { using namespace Xbyak; using namespace dnnl::impl::cpu::x64; -template void RegPrinter::print(jit_generator &h, Xmm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Xmm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Ymm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Ymm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Zmm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Zmm reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg64 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg64 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg32 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg32 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg16 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg16 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg8 reg, const char *name); -template void RegPrinter::print(jit_generator &h, Reg8 reg, const char *name); +template void RegPrinter::print(jit_generator& h, Xmm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Xmm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Ymm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Ymm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Zmm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Zmm reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg64 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg64 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg32 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg32 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg16 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg16 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg8 reg, const char* name); +template void RegPrinter::print(jit_generator& h, Reg8 reg, const char* name); template -void RegPrinter::print_reg_prc(const char *name, const char *ori_name, T *ptr) { +void RegPrinter::print_reg_prc(const char* name, const char* ori_name, T* ptr) { std::stringstream ss; - if (name) ss << name << " | "; + if (name) + ss << name << " | "; ss << ori_name << ": "; if (std::is_floating_point::value) { ss << *ptr; @@ -48,9 +50,10 @@ void RegPrinter::print_reg_prc(const char *name, const char *ori_name, T *ptr) { } template -void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, PRC_T *ptr) { +void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, PRC_T* ptr) { std::stringstream ss; - if (name) ss << name << " | "; + if (name) + ss << name << " | "; ss << ori_name << ": {" << ptr[0]; for (size_t i = 1; i < vlen / sizeof(float); i++) { ss << ", " << ptr[i]; @@ -58,15 +61,15 @@ void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, PRC_T *pt ss << "}" << std::endl; std::cout << ss.str(); } -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, float *ptr); -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, float *ptr); -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, float *ptr); -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, int *ptr); -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, int *ptr); -template void RegPrinter::print_vmm_prc(const char *name, const char *ori_name, int *ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, float* ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, float* ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, float* ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, int* ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, int* ptr); +template void RegPrinter::print_vmm_prc(const char* name, const char* ori_name, int* ptr); template -struct vmm_traits{}; +struct vmm_traits {}; template <> struct vmm_traits { @@ -87,7 +90,7 @@ struct vmm_traits { }; template -void RegPrinter::save_vmm(jit_generator &h) { +void RegPrinter::save_vmm(jit_generator& h) { h.sub(h.rsp, vmm_traits::vmm_len * vmm_traits::vmm_cnt); for (size_t i = 0; i < vmm_traits::vmm_cnt; i++) { h.uni_vmovups(h.ptr[h.rsp + i * vmm_traits::vmm_len], T(i)); @@ -95,52 +98,52 @@ void RegPrinter::save_vmm(jit_generator &h) { } template -void RegPrinter::restore_vmm(jit_generator &h) { +void RegPrinter::restore_vmm(jit_generator& h) { for (size_t i = 0; i < vmm_traits::vmm_cnt; i++) { h.uni_vmovups(T(i), h.ptr[h.rsp + i * vmm_traits::vmm_len]); } h.add(h.rsp, vmm_traits::vmm_len * vmm_traits::vmm_cnt); } -void RegPrinter::save_reg(jit_generator &h) { +void RegPrinter::save_reg(jit_generator& h) { h.sub(h.rsp, reg_len * reg_cnt); for (size_t i = 0; i < reg_cnt; i++) { h.mov(h.ptr[h.rsp + i * reg_len], Reg64(i)); } } -void RegPrinter::restore_reg(jit_generator &h) { +void RegPrinter::restore_reg(jit_generator& h) { for (size_t i = 0; i < reg_cnt; i++) { h.mov(Reg64(i), h.ptr[h.rsp + i * reg_len]); } h.add(h.rsp, reg_len * reg_cnt); } -void RegPrinter::preamble(jit_generator &h) { +void RegPrinter::preamble(jit_generator& h) { save_reg(h); - mayiuse(cpu_isa_t::avx512_core) ? save_vmm(h) : (mayiuse(cpu_isa_t::avx2) ? - save_vmm(h) : save_vmm(h)); + mayiuse(cpu_isa_t::avx512_core) ? save_vmm(h) + : (mayiuse(cpu_isa_t::avx2) ? save_vmm(h) : save_vmm(h)); } -void RegPrinter::postamble(jit_generator &h) { - mayiuse(cpu_isa_t::avx512_core) ? restore_vmm(h) : (mayiuse(cpu_isa_t::avx2) ? - restore_vmm(h) : restore_vmm(h)); +void RegPrinter::postamble(jit_generator& h) { + mayiuse(cpu_isa_t::avx512_core) ? restore_vmm(h) + : (mayiuse(cpu_isa_t::avx2) ? restore_vmm(h) : restore_vmm(h)); restore_reg(h); } // ABI requires 16-bype stack alignment before a call -void RegPrinter::align_rsp(jit_generator &h) { +void RegPrinter::align_rsp(jit_generator& h) { constexpr int alignment = 16; h.mov(h.r15, h.rsp); h.and_(h.rsp, ~(alignment - 1)); } -void RegPrinter::restore_rsp(jit_generator &h) { +void RegPrinter::restore_rsp(jit_generator& h) { h.mov(h.rsp, h.r15); } template -void RegPrinter::print_vmm(jit_generator &h, REG_T vmm, const char *name) { +void RegPrinter::print_vmm(jit_generator& h, REG_T vmm, const char* name) { preamble(h); h.push(h.rax); @@ -181,7 +184,7 @@ void RegPrinter::print_vmm(jit_generator &h, REG_T vmm, const char *name) { } template -void RegPrinter::print_reg(jit_generator &h, REG_T reg, const char *name) { +void RegPrinter::print_reg(jit_generator& h, REG_T reg, const char* name) { preamble(h); h.push(h.rax); @@ -213,8 +216,7 @@ void RegPrinter::print_reg(jit_generator &h, REG_T reg, const char *name) { postamble(h); } -} // namespace intel_cpu -} // namespace ov - +} // namespace intel_cpu +} // namespace ov -#endif // CPU_DEBUG_CAPS +#endif // CPU_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.hpp index fd7135b17bf5b9..dcac847dfd1e0f 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/debug_capabilities.hpp @@ -6,7 +6,7 @@ #ifdef CPU_DEBUG_CAPS -#include "cpu/x64/jit_generator.hpp" +# include "cpu/x64/jit_generator.hpp" namespace ov { namespace intel_cpu { @@ -56,42 +56,44 @@ namespace intel_cpu { class RegPrinter { public: using jit_generator = dnnl::impl::cpu::x64::jit_generator; - template ::value, int>::type = 0> - static void print(jit_generator &h, REG_T reg, const char *name = nullptr) { + template ::value, int>::type = 0> + static void print(jit_generator& h, REG_T reg, const char* name = nullptr) { print_vmm(h, reg, name); } - template ::value, int>::type = 0> - static void print(jit_generator &h, REG_T reg, const char *name = nullptr) { + template ::value, int>::type = 0> + static void print(jit_generator& h, REG_T reg, const char* name = nullptr) { print_reg(h, reg, name); } private: RegPrinter() {} template - static void print_vmm(jit_generator &h, REG_T vmm, const char *name); + static void print_vmm(jit_generator& h, REG_T vmm, const char* name); template - static void print_reg(jit_generator &h, REG_T reg, const char *name); + static void print_reg(jit_generator& h, REG_T reg, const char* name); template - static void print_vmm_prc(const char *name, const char *ori_name, PRC_T *ptr); + static void print_vmm_prc(const char* name, const char* ori_name, PRC_T* ptr); template - static void print_reg_prc(const char *name, const char *ori_name, T *val); - static void preamble(jit_generator &h); - static void postamble(jit_generator &h); + static void print_reg_prc(const char* name, const char* ori_name, T* val); + static void preamble(jit_generator& h); + static void postamble(jit_generator& h); template - static void save_vmm(jit_generator &h); + static void save_vmm(jit_generator& h); template - static void restore_vmm(jit_generator &h); - static void save_reg(jit_generator &h); - static void restore_reg(jit_generator &h); - static void align_rsp(jit_generator &h); - static void restore_rsp(jit_generator &h); + static void restore_vmm(jit_generator& h); + static void save_reg(jit_generator& h); + static void restore_reg(jit_generator& h); + static void align_rsp(jit_generator& h); + static void restore_rsp(jit_generator& h); static constexpr size_t reg_len = 8; static constexpr size_t reg_cnt = 16; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov -#endif // CPU_DEBUG_CAPS +#endif // CPU_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_bf16_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_bf16_emitters.hpp index 43a2c2eb6b045f..2bfbaa68880aa8 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_bf16_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_bf16_emitters.hpp @@ -11,14 +11,18 @@ namespace intel_cpu { class jit_uni_vcvtneps2bf16 : public jit_emitter { public: - jit_uni_vcvtneps2bf16(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::bf16) : jit_emitter(host, host_isa, exec_prc) { + jit_uni_vcvtneps2bf16(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::bf16) + : jit_emitter(host, host_isa, exec_prc) { if (!dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core_bf16) && !dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx2_vnni_2)) prepare_table(); } - size_t get_inputs_num() const override { return 1; } + size_t get_inputs_num() const override { + return 1; + } private: void emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const override { @@ -36,7 +40,8 @@ class jit_uni_vcvtneps2bf16 : public jit_emitter { template void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using namespace Xbyak; - using Vmm = typename dnnl::impl::utils::conditional3::type; + using Vmm = typename dnnl::impl::utils:: + conditional3::type; Vmm in = Vmm(in_vec_idxs[0]); @@ -79,7 +84,7 @@ class jit_uni_vcvtneps2bf16 : public jit_emitter { h->uni_vpackusdw(aux, aux, aux); if (host_isa_ == dnnl::impl::cpu::x64::cpu_isa_t::avx2) { - h->vpermq(Ymm(aux.getIdx()), Ymm(aux.getIdx()), 0xD8); //11 01 10 00 + h->vpermq(Ymm(aux.getIdx()), Ymm(aux.getIdx()), 0xD8); // 11 01 10 00 h->vextracti128(out, Ymm(aux.getIdx()), 0); } else { h->uni_vmovups(out, aux); @@ -123,5 +128,5 @@ class jit_uni_vcvtneps2bf16 : public jit_emitter { } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.cpp index 544960008c9158..2e90af39fb9cf1 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.cpp @@ -6,7 +6,6 @@ #include "utils/bfloat16.hpp" - using namespace dnnl::impl::utils; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; @@ -15,19 +14,23 @@ using namespace Xbyak; namespace ov { namespace intel_cpu { -jit_convert_emitter::jit_convert_emitter(jit_generator *host, cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_convert_emitter::jit_convert_emitter(jit_generator* host, + cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { input_type = node->get_input_element_type(0); output_type = node->get_output_element_type(0); if (output_type == ov::element::bf16) - uni_vcvtneps2bf16.reset(new jit_uni_vcvtneps2bf16(host, host_isa)); + uni_vcvtneps2bf16.reset(new jit_uni_vcvtneps2bf16(host, host_isa)); } void jit_convert_emitter::validate_types() const { auto is_supported_type = [this](const ov::element::Type& type) { - return any_of(supported_types.begin(), supported_types.end(), - [&type](const ov::element::Type& supported_type) { return supported_type == type; } ); + return any_of(supported_types.begin(), supported_types.end(), [&type](const ov::element::Type& supported_type) { + return supported_type == type; + }); }; if (!is_supported_type(input_type)) @@ -36,7 +39,9 @@ void jit_convert_emitter::validate_types() const { OV_CPU_JIT_EMITTER_THROW("Unsupported output type: ", output_type.get_type_name()); } -size_t jit_convert_emitter::get_inputs_num() const { return 1; } +size_t jit_convert_emitter::get_inputs_num() const { + return 1; +} void jit_convert_emitter::emit_data() const { jit_emitter::emit_data(); @@ -45,19 +50,22 @@ void jit_convert_emitter::emit_data() const { } template -void jit_convert_emitter::float2bfloat(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_emitter::float2bfloat(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); - Vmm vmm_dst = Vmm(out_vec_idxs[0]); + Vmm vmm_dst = Vmm(out_vec_idxs[0]); if (!uni_vcvtneps2bf16) OV_CPU_JIT_EMITTER_THROW("Converter from float to bf16 isn't initialized!"); uni_vcvtneps2bf16->emit_code({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); } -jit_convert_truncation_emitter::jit_convert_truncation_emitter(jit_generator *host, cpu_isa_t host_isa, - const std::shared_ptr& node, ov::element::Type exec_prc) - : jit_convert_emitter(host, host_isa, node, exec_prc) { +jit_convert_truncation_emitter::jit_convert_truncation_emitter(jit_generator* host, + cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_convert_emitter(host, host_isa, node, exec_prc) { prepare_table(); } @@ -66,7 +74,8 @@ bool jit_convert_truncation_emitter::is_i8_and_u8_case() const { one_of(output_type, ov::element::i8, ov::element::u8); } -void jit_convert_truncation_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_truncation_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { validate_types(); if (host_isa_ == cpu::x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); @@ -80,10 +89,11 @@ void jit_convert_truncation_emitter::emit_impl(const std::vector &in_vec } template -void jit_convert_truncation_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_truncation_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); - Vmm vmm_dst = Vmm(out_vec_idxs[0]); + Vmm vmm_dst = Vmm(out_vec_idxs[0]); Xmm xmm_dst = Xmm(out_vec_idxs[0]); Ymm ymm_dst = Ymm(out_vec_idxs[0]); @@ -97,95 +107,95 @@ void jit_convert_truncation_emitter::emit_isa(const std::vector &in_vec_ } switch (input_type) { - case ov::element::f32: - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvttps2dq(vmm_dst, vmm_src); - break; - case ov::element::i32: - if (one_of(output_type, ov::element::f32, ov::element::bf16, ov::element::f16)) - h->uni_vcvtdq2ps(vmm_dst, vmm_src); - break; - case ov::element::bf16: - h->vpmovzxwd(vmm_dst, vmm_src); - h->uni_vpslld(vmm_dst, vmm_dst, 16); - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvttps2dq(vmm_dst, vmm_dst); - break; - case ov::element::f16: - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtph2ps(vmm_dst, Ymm(vmm_src.getIdx())); - else - h->vcvtph2ps(vmm_dst, - Xmm(vmm_src.getIdx())); // for avx2_vnni_2? - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvttps2dq(vmm_dst, vmm_dst); - break; - case ov::element::i8: - h->uni_vpmovsxbd(vmm_dst, vmm_src); - break; - case ov::element::u8: - h->uni_vpmovzxbd(vmm_dst, vmm_src); - break; - default: - OV_CPU_JIT_EMITTER_THROW("Unsupported input data type"); + case ov::element::f32: + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvttps2dq(vmm_dst, vmm_src); + break; + case ov::element::i32: + if (one_of(output_type, ov::element::f32, ov::element::bf16, ov::element::f16)) + h->uni_vcvtdq2ps(vmm_dst, vmm_src); + break; + case ov::element::bf16: + h->vpmovzxwd(vmm_dst, vmm_src); + h->uni_vpslld(vmm_dst, vmm_dst, 16); + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvttps2dq(vmm_dst, vmm_dst); + break; + case ov::element::f16: + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtph2ps(vmm_dst, Ymm(vmm_src.getIdx())); + else + h->vcvtph2ps(vmm_dst, + Xmm(vmm_src.getIdx())); // for avx2_vnni_2? + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvttps2dq(vmm_dst, vmm_dst); + break; + case ov::element::i8: + h->uni_vpmovsxbd(vmm_dst, vmm_src); + break; + case ov::element::u8: + h->uni_vpmovzxbd(vmm_dst, vmm_src); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported input data type"); } switch (output_type) { - case ov::element::f32: - if (!one_of(input_type, ov::element::i32, ov::element::bf16, ov::element::f16)) { + case ov::element::f32: + if (!one_of(input_type, ov::element::i32, ov::element::bf16, ov::element::f16)) { + h->uni_vcvtdq2ps(vmm_dst, vmm_dst); + } + break; + case ov::element::i32: + break; + case ov::element::bf16: + if (input_type == ov::element::f32) { + float2bfloat({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } else { + if (one_of(input_type, ov::element::i8, ov::element::u8)) { h->uni_vcvtdq2ps(vmm_dst, vmm_dst); } - break; - case ov::element::i32: - break; - case ov::element::bf16: - if (input_type == ov::element::f32) { - float2bfloat({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); - } else { - if (one_of(input_type, ov::element::i8, ov::element::u8)) { - h->uni_vcvtdq2ps(vmm_dst, vmm_dst); - } - float2bfloat({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); - } - break; - case ov::element::f16: - if (input_type == ov::element::f32) { - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtps2ph(ymm_dst, vmm_src, 0x4); - else - h->vcvtps2ph(xmm_dst, vmm_src, 0x4); - } else { - if (one_of(input_type, ov::element::i8, ov::element::u8)) { - h->uni_vcvtdq2ps(vmm_dst, vmm_dst); - } - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtps2ph(ymm_dst, vmm_dst, 0x4); - else - h->vcvtps2ph(xmm_dst, vmm_dst, 0x4); - } - break; - case ov::element::i8: - case ov::element::u8: - if (input_type == ov::element::i32) { - dword2int8({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); - } else { - dword2int8({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); + float2bfloat({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } + break; + case ov::element::f16: + if (input_type == ov::element::f32) { + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtps2ph(ymm_dst, vmm_src, 0x4); + else + h->vcvtps2ph(xmm_dst, vmm_src, 0x4); + } else { + if (one_of(input_type, ov::element::i8, ov::element::u8)) { + h->uni_vcvtdq2ps(vmm_dst, vmm_dst); } - break; - default: - OV_CPU_JIT_EMITTER_THROW("Unsupported output data type"); + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtps2ph(ymm_dst, vmm_dst, 0x4); + else + h->vcvtps2ph(xmm_dst, vmm_dst, 0x4); + } + break; + case ov::element::i8: + case ov::element::u8: + if (input_type == ov::element::i32) { + dword2int8({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } else { + dword2int8({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported output data type"); } } void jit_convert_truncation_emitter::register_table_entries() { - if (host_isa_ == dnnl::impl::cpu::x64::avx2 && - one_of(output_type, ov::element::i8, ov::element::u8) && + if (host_isa_ == dnnl::impl::cpu::x64::avx2 && one_of(output_type, ov::element::i8, ov::element::u8) && !is_i8_and_u8_case()) push_arg_entry_of("mask_byte", 0x000000ff, true); } template -void jit_convert_truncation_emitter::dword2int8(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_truncation_emitter::dword2int8(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); @@ -204,12 +214,14 @@ void jit_convert_truncation_emitter::dword2int8(const std::vector &in_ve } } -jit_convert_saturation_emitter::jit_convert_saturation_emitter(jit_generator *host, cpu_isa_t host_isa, - const std::shared_ptr& node, ov::element::Type exec_prc) - : jit_convert_emitter(host, host_isa, node, exec_prc) { -} +jit_convert_saturation_emitter::jit_convert_saturation_emitter(jit_generator* host, + cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_convert_emitter(host, host_isa, node, exec_prc) {} -void jit_convert_saturation_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_saturation_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { validate_types(); if (host_isa_ == cpu::x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); @@ -223,10 +235,11 @@ void jit_convert_saturation_emitter::emit_impl(const std::vector &in_vec } template -void jit_convert_saturation_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_convert_saturation_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); - Vmm vmm_dst = Vmm(out_vec_idxs[0]); + Vmm vmm_dst = Vmm(out_vec_idxs[0]); Xmm xmm_dst = Xmm(out_vec_idxs[0]); Ymm ymm_dst = Ymm(out_vec_idxs[0]); @@ -237,88 +250,94 @@ void jit_convert_saturation_emitter::emit_isa(const std::vector &in_vec_ } switch (input_type) { - case ov::element::f32: - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvtps2dq(vmm_dst, vmm_src); - break; - case ov::element::i32: - if (one_of(output_type, ov::element::f32, ov::element::bf16, ov::element::f16)) - h->uni_vcvtdq2ps(vmm_dst, vmm_src); - break; - case ov::element::bf16: - h->vpmovzxwd(vmm_dst, vmm_src); - h->uni_vpslld(vmm_dst, vmm_dst, 16); - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvttps2dq(vmm_dst, vmm_dst); - break; - case ov::element::f16: - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtph2ps(vmm_dst, Ymm(vmm_src.getIdx())); - else - h->vcvtph2ps(vmm_dst, - Xmm(vmm_src.getIdx())); // for avx2_vnni_2? - if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) - h->uni_vcvttps2dq(vmm_dst, vmm_dst); - break; - case ov::element::i8: - h->uni_vpmovsxbd(vmm_dst, vmm_src); - break; - case ov::element::u8: - h->uni_vpmovzxbd(vmm_dst, vmm_src); - break; - default: - OV_CPU_JIT_EMITTER_THROW("Unsupported input data type"); + case ov::element::f32: + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvtps2dq(vmm_dst, vmm_src); + break; + case ov::element::i32: + if (one_of(output_type, ov::element::f32, ov::element::bf16, ov::element::f16)) + h->uni_vcvtdq2ps(vmm_dst, vmm_src); + break; + case ov::element::bf16: + h->vpmovzxwd(vmm_dst, vmm_src); + h->uni_vpslld(vmm_dst, vmm_dst, 16); + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvttps2dq(vmm_dst, vmm_dst); + break; + case ov::element::f16: + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtph2ps(vmm_dst, Ymm(vmm_src.getIdx())); + else + h->vcvtph2ps(vmm_dst, + Xmm(vmm_src.getIdx())); // for avx2_vnni_2? + if (one_of(output_type, ov::element::i32, ov::element::i8, ov::element::u8)) + h->uni_vcvttps2dq(vmm_dst, vmm_dst); + break; + case ov::element::i8: + h->uni_vpmovsxbd(vmm_dst, vmm_src); + break; + case ov::element::u8: + h->uni_vpmovzxbd(vmm_dst, vmm_src); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported input data type"); } switch (output_type) { - case ov::element::f32: - if (!one_of(input_type, ov::element::i32, ov::element::bf16, ov::element::f16)) { + case ov::element::f32: + if (!one_of(input_type, ov::element::i32, ov::element::bf16, ov::element::f16)) { + h->uni_vcvtdq2ps(vmm_dst, vmm_dst); + } + break; + case ov::element::i32: + break; + case ov::element::bf16: + if (input_type == ov::element::f32) { + float2bfloat({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } else { + if (one_of(input_type, ov::element::i8, ov::element::u8)) { h->uni_vcvtdq2ps(vmm_dst, vmm_dst); } - break; - case ov::element::i32: - break; - case ov::element::bf16: - if (input_type == ov::element::f32) { - float2bfloat({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}); - } else { - if (one_of(input_type, ov::element::i8, ov::element::u8)) { - h->uni_vcvtdq2ps(vmm_dst, vmm_dst); - } - float2bfloat({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); - } - break; - case ov::element::f16: - if (input_type == ov::element::f32) { - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtps2ph(ymm_dst, vmm_src, 0x4); - else - h->vcvtps2ph(xmm_dst, vmm_src, 0x4); - } else { - if (one_of(input_type, ov::element::i8, ov::element::u8)) { - h->uni_vcvtdq2ps(vmm_dst, vmm_dst); - } - if (isa == dnnl::impl::cpu::x64::avx512_core) - h->vcvtps2ph(ymm_dst, vmm_dst, 0x4); - else - h->vcvtps2ph(xmm_dst, vmm_dst, 0x4); - } - break; - case ov::element::i8: - case ov::element::u8: - if (input_type == ov::element::i32) { - dword2int8({static_cast(vmm_src.getIdx())}, {static_cast(vmm_dst.getIdx())}, output_type.is_signed()); - } else { - dword2int8({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}, output_type.is_signed()); + float2bfloat({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}); + } + break; + case ov::element::f16: + if (input_type == ov::element::f32) { + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtps2ph(ymm_dst, vmm_src, 0x4); + else + h->vcvtps2ph(xmm_dst, vmm_src, 0x4); + } else { + if (one_of(input_type, ov::element::i8, ov::element::u8)) { + h->uni_vcvtdq2ps(vmm_dst, vmm_dst); } - break; - default: - OV_CPU_JIT_EMITTER_THROW("Unsupported output data type"); + if (isa == dnnl::impl::cpu::x64::avx512_core) + h->vcvtps2ph(ymm_dst, vmm_dst, 0x4); + else + h->vcvtps2ph(xmm_dst, vmm_dst, 0x4); + } + break; + case ov::element::i8: + case ov::element::u8: + if (input_type == ov::element::i32) { + dword2int8({static_cast(vmm_src.getIdx())}, + {static_cast(vmm_dst.getIdx())}, + output_type.is_signed()); + } else { + dword2int8({static_cast(vmm_dst.getIdx())}, + {static_cast(vmm_dst.getIdx())}, + output_type.is_signed()); + } + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported output data type"); } } template -void jit_convert_saturation_emitter::dword2int8(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs, bool is_signed) const { +void jit_convert_saturation_emitter::dword2int8(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs, + bool is_signed) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); @@ -330,7 +349,7 @@ void jit_convert_saturation_emitter::dword2int8(const std::vector &in_ve if (is_signed) { h->vpmovsdb(xmm_dst, vmm_src); } else { - Vmm vmm_zero = Vmm(aux_vec_idxs[0]); + Vmm vmm_zero = Vmm(aux_vec_idxs[0]); h->vpxord(vmm_zero, vmm_zero, vmm_zero); h->vpmaxsd(vmm_dst, vmm_src, vmm_zero); h->vpmovusdb(xmm_dst, vmm_dst); @@ -353,8 +372,8 @@ void jit_convert_saturation_emitter::dword2int8(const std::vector &in_ve size_t jit_convert_saturation_emitter::aux_vecs_count() const { // 1 register is for dword2int8 unsigned - return output_type == ov::element::u8 && host_isa_ == dnnl::impl::cpu::x64::avx512_core? 1 : 0; + return output_type == ov::element::u8 && host_isa_ == dnnl::impl::cpu::x64::avx512_core ? 1 : 0; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.hpp index ee451ed358dd1a..29b85079573bee 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_conversion_emitters.hpp @@ -4,16 +4,18 @@ #pragma once -#include "jit_emitter.hpp" #include "jit_bf16_emitters.hpp" +#include "jit_emitter.hpp" namespace ov { namespace intel_cpu { class jit_convert_emitter : public jit_emitter { public: - jit_convert_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); + jit_convert_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; @@ -22,19 +24,13 @@ class jit_convert_emitter : public jit_emitter { void validate_types() const; template - void float2bfloat(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const; + void float2bfloat(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; ov::element::Type input_type; ov::element::Type output_type; - const ov::element::TypeVector supported_types = { - ov::element::f32, - ov::element::i32, - ov::element::bf16, - ov::element::f16, - ov::element::i8, - ov::element::u8 - }; + const ov::element::TypeVector supported_types = + {ov::element::f32, ov::element::i32, ov::element::bf16, ov::element::f16, ov::element::i8, ov::element::u8}; std::shared_ptr uni_vcvtneps2bf16 = nullptr; }; @@ -45,16 +41,18 @@ class jit_convert_emitter : public jit_emitter { // 129 -> -127 class jit_convert_truncation_emitter : public jit_convert_emitter { public: - jit_convert_truncation_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); + jit_convert_truncation_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; template - void dword2int8(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const; + void dword2int8(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; bool is_i8_and_u8_case() const; void register_table_entries() override; @@ -66,19 +64,23 @@ class jit_convert_truncation_emitter : public jit_convert_emitter { // 129 -> 127 class jit_convert_saturation_emitter : public jit_convert_emitter { public: - jit_convert_saturation_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); + jit_convert_saturation_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; template - void dword2int8(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs, bool is_signed) const; + void dword2int8(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs, + bool is_signed) const; size_t aux_vecs_count() const override; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.cpp index 0b315cdd309715..51e801208b927c 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.cpp @@ -3,6 +3,7 @@ // #include "jit_dnnl_emitters.hpp" + #include using namespace dnnl::impl::utils; @@ -17,9 +18,11 @@ std::set> jit_dnnl_emitter::get_supported_precisions( return {{element::f32}}; } -jit_dnnl_emitter::jit_dnnl_emitter(jit_generator *host, cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) +jit_dnnl_emitter::jit_dnnl_emitter(jit_generator* host, + cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) { - kind = dnnl_eltwise_tanh; alpha = 0.f; beta = 0.f; @@ -27,33 +30,42 @@ jit_dnnl_emitter::jit_dnnl_emitter(jit_generator *host, cpu_isa_t host_isa, cons set_injector(); } -jit_dnnl_emitter::jit_dnnl_emitter(jit_generator *host, cpu_isa_t host_isa, - dnnl_alg_kind_t algKind, float alpha, float beta, +jit_dnnl_emitter::jit_dnnl_emitter(jit_generator* host, + cpu_isa_t host_isa, + dnnl_alg_kind_t algKind, + float alpha, + float beta, ov::element::Type exec_prc) - : jit_emitter(host, host_isa, exec_prc), kind(algKind), alpha(alpha), beta(beta) { - + : jit_emitter(host, host_isa, exec_prc), + kind(algKind), + alpha(alpha), + beta(beta) { set_injector(); } void jit_dnnl_emitter::set_injector() { if (host_isa_ == cpu::x64::sse41) { - eltwise_injector_sse42 = std::make_shared>( - h, kind, alpha, beta, 1.f); + eltwise_injector_sse42 = + std::make_shared>(h, kind, alpha, beta, 1.f); } else if (host_isa_ == cpu::x64::avx2) { - eltwise_injector_avx2 = std::make_shared>( - h, kind, alpha, beta, 1.f); + eltwise_injector_avx2 = + std::make_shared>(h, kind, alpha, beta, 1.f); } else if (host_isa_ == cpu::x64::avx512_core) { - eltwise_injector_avx512_core = std::make_shared>( - h, kind, alpha, beta, 1.f); + eltwise_injector_avx512_core = + std::make_shared>(h, kind, alpha, beta, 1.f); } else { OV_CPU_JIT_EMITTER_THROW("Unsupported ISA ", host_isa_); } } -size_t jit_dnnl_emitter::get_inputs_num() const { return 1; } +size_t jit_dnnl_emitter::get_inputs_num() const { + return 1; +} -void jit_dnnl_emitter::emit_code(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_dnnl_emitter::emit_code(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { if (host_isa_ == cpu::x64::sse41) { if (out_vec_idxs[0] != in_vec_idxs[0]) h->uni_vmovups(Xmm(out_vec_idxs[0]), Xmm(in_vec_idxs[0])); @@ -83,11 +95,13 @@ void jit_dnnl_emitter::emit_data() const { } } -jit_dnnl_aux_emitter::jit_dnnl_aux_emitter(jit_generator *host, cpu_isa_t host_isa, - dnnl_alg_kind_t algKind, float inpAlpha, float inpBeta, +jit_dnnl_aux_emitter::jit_dnnl_aux_emitter(jit_generator* host, + cpu_isa_t host_isa, + dnnl_alg_kind_t algKind, + float inpAlpha, + float inpBeta, ov::element::Type exec_prc) - : jit_dnnl_emitter(host, host_isa, algKind, inpAlpha, inpBeta, exec_prc) { -} + : jit_dnnl_emitter(host, host_isa, algKind, inpAlpha, inpBeta, exec_prc) {} -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.hpp index bdf04108370ed5..22e003ad261555 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_emitters.hpp @@ -4,8 +4,8 @@ #pragma once -#include "cpu/x64/jit_generator.hpp" #include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" +#include "cpu/x64/jit_generator.hpp" #include "jit_emitter.hpp" namespace ov { @@ -13,30 +13,41 @@ namespace intel_cpu { class jit_dnnl_emitter : public jit_emitter { public: - void emit_code(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const override; + void emit_code(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const override; void emit_data() const override; - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override {}; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override{}; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); protected: - jit_dnnl_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - dnnl_alg_kind_t algKind, float inpAlpha, float inpBeta, - ov::element::Type exec_prc = ov::element::f32); - jit_dnnl_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_dnnl_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + dnnl_alg_kind_t algKind, + float inpAlpha, + float inpBeta, + ov::element::Type exec_prc = ov::element::f32); + jit_dnnl_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); void set_injector(); - dnnl_alg_kind_t kind {dnnl_alg_kind_undef}; - float alpha {0.f}; - float beta {0.f}; + dnnl_alg_kind_t kind{dnnl_alg_kind_undef}; + float alpha{0.f}; + float beta{0.f}; - std::shared_ptr> eltwise_injector_sse42; - std::shared_ptr> eltwise_injector_avx2; - std::shared_ptr> eltwise_injector_avx512_core; + std::shared_ptr> + eltwise_injector_sse42; + std::shared_ptr> + eltwise_injector_avx2; + std::shared_ptr> + eltwise_injector_avx512_core; private: size_t get_inputs_num() const override; @@ -44,12 +55,15 @@ class jit_dnnl_emitter : public jit_emitter { class jit_dnnl_aux_emitter : public jit_dnnl_emitter { public: - jit_dnnl_aux_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - dnnl_alg_kind_t algKind, float inpAlpha, float inpBeta, - ov::element::Type exec_prc = ov::element::f32); + jit_dnnl_aux_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + dnnl_alg_kind_t algKind, + float inpAlpha, + float inpBeta, + ov::element::Type exec_prc = ov::element::f32); private: }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_ext_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_ext_emitters.hpp index 7a4d1e31277e3b..0b7396b6fcd830 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_ext_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_dnnl_ext_emitters.hpp @@ -4,9 +4,9 @@ #pragma once +#include "jit_dnnl_emitters.hpp" #include "openvino/opsets/opset5.hpp" #include "transformations/cpu_opset/common/op/swish_cpu.hpp" -#include "jit_dnnl_emitters.hpp" #include "utils/ngraph_utils.hpp" namespace ov { @@ -14,88 +14,102 @@ namespace intel_cpu { class jit_relu_emitter : public jit_dnnl_emitter { public: - jit_relu_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_relu_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_relu; - alpha = 0.f; - beta = 0.f; + kind = dnnl_eltwise_relu; + alpha = 0.f; + beta = 0.f; - set_injector(); - } + set_injector(); + } }; class jit_sigmoid_emitter : public jit_dnnl_emitter { public: - jit_sigmoid_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_sigmoid_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_logistic; - alpha = 0.f; - beta = 0.f; + kind = dnnl_eltwise_logistic; + alpha = 0.f; + beta = 0.f; - set_injector(); - } + set_injector(); + } }; class jit_tanh_emitter : public jit_dnnl_emitter { public: - jit_tanh_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_tanh_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_tanh; - alpha = 0.f; - beta = 0.f; + kind = dnnl_eltwise_tanh; + alpha = 0.f; + beta = 0.f; - set_injector(); - } + set_injector(); + } }; class jit_elu_emitter : public jit_dnnl_emitter { public: - jit_elu_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_elu_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_elu; - alpha = ov::as_type_ptr(n)->get_alpha(); - beta = 0.f; + kind = dnnl_eltwise_elu; + alpha = ov::as_type_ptr(n)->get_alpha(); + beta = 0.f; - set_injector(); - } + set_injector(); + } }; class jit_abs_emitter : public jit_dnnl_emitter { public: - jit_abs_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_abs_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_abs; - alpha = 0.f; - beta = 0.f; + kind = dnnl_eltwise_abs; + alpha = 0.f; + beta = 0.f; - set_injector(); - } + set_injector(); + } }; class jit_clamp_emitter : public jit_dnnl_emitter { public: - jit_clamp_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) + jit_clamp_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { - kind = dnnl_eltwise_clip; - auto op = ov::as_type_ptr(n); - alpha = op->get_min(); - beta = op->get_max(); + kind = dnnl_eltwise_clip; + auto op = ov::as_type_ptr(n); + alpha = op->get_min(); + beta = op->get_max(); - set_injector(); - } + set_injector(); + } }; class jit_swish_emitter : public jit_dnnl_emitter { public: - jit_swish_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) - : jit_dnnl_emitter(host, host_isa, n, exec_prc) { + jit_swish_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) + : jit_dnnl_emitter(host, host_isa, n, exec_prc) { kind = dnnl_eltwise_swish; auto op = ov::as_type_ptr(n); alpha = op->get_alpha(); @@ -107,9 +121,11 @@ class jit_swish_emitter : public jit_dnnl_emitter { class jit_hswish_emitter : public jit_dnnl_emitter { public: - jit_hswish_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) - : jit_dnnl_emitter(host, host_isa, n, exec_prc) { + jit_hswish_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) + : jit_dnnl_emitter(host, host_isa, n, exec_prc) { // since v3.0 oneDNN has flexible version of hardswish, ov still uses the one with hardcoded alpha and beta kind = dnnl_eltwise_hardswish; alpha = 1.f / 6.f; @@ -121,9 +137,11 @@ class jit_hswish_emitter : public jit_dnnl_emitter { class jit_gelu_v0_emitter : public jit_dnnl_emitter { public: - jit_gelu_v0_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_gelu_v0_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32) - : jit_dnnl_emitter(host, host_isa, n, exec_prc) { + : jit_dnnl_emitter(host, host_isa, n, exec_prc) { kind = dnnl_eltwise_gelu_erf; set_injector(); @@ -132,9 +150,11 @@ class jit_gelu_v0_emitter : public jit_dnnl_emitter { class jit_gelu_v7_emitter : public jit_dnnl_emitter { public: - jit_gelu_v7_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_gelu_v7_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32) - : jit_dnnl_emitter(host, host_isa, n, exec_prc) { + : jit_dnnl_emitter(host, host_isa, n, exec_prc) { auto gelu = getNgraphOpAs(n); ov::op::GeluApproximationMode approximationMode = gelu->get_approximation_mode(); if (approximationMode == ov::op::GeluApproximationMode::ERF) @@ -152,11 +172,11 @@ class jit_gelu_v7_emitter : public jit_dnnl_emitter { class jit_round_emitter : public jit_dnnl_emitter { public: - jit_round_emitter( - dnnl::impl::cpu::x64::jit_generator *host, - dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32) : jit_dnnl_emitter(host, host_isa, n, exec_prc) { + jit_round_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32) + : jit_dnnl_emitter(host, host_isa, n, exec_prc) { const auto round = getNgraphOpAs(n); const auto mode = round->get_mode(); if ((mode != ov::opset5::Round::RoundMode::HALF_AWAY_FROM_ZERO) && @@ -165,12 +185,11 @@ class jit_round_emitter : public jit_dnnl_emitter { static_cast(mode)); } - kind = mode == ov::opset5::Round::RoundMode::HALF_AWAY_FROM_ZERO ? - dnnl_eltwise_round_half_away_from_zero : - dnnl_eltwise_round_half_to_even; + kind = mode == ov::opset5::Round::RoundMode::HALF_AWAY_FROM_ZERO ? dnnl_eltwise_round_half_away_from_zero + : dnnl_eltwise_round_half_to_even; set_injector(); } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.cpp index 0331a3ee4908b9..7a091fc946c2d8 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.cpp @@ -8,8 +8,8 @@ using namespace dnnl::impl::utils; using namespace dnnl::impl::cpu; using namespace Xbyak; -#define CONST_1_F 0x3f800000 // 1.f -#define INF_MASK 0x7F800000 +#define CONST_1_F 0x3f800000 // 1.f +#define INF_MASK 0x7F800000 #define INF_NEG_MASK 0xFF800000 namespace ov { @@ -22,23 +22,30 @@ ov::element::Type get_arithmetic_binary_exec_precision(const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_add_emitter::jit_add_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_add_emitter::jit_add_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_add_emitter::jit_add_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_add_emitter::get_inputs_num() const { return 2; } +size_t jit_add_emitter::get_inputs_num() const { + return 2; +} -void jit_add_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_add_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -51,7 +58,7 @@ void jit_add_emitter::emit_impl(const std::vector &in_vec_idxs, const st } template -void jit_add_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_add_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -59,9 +66,14 @@ void jit_add_emitter::emit_isa(const std::vector &in_vec_idxs, const std auto uni_vadd = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: h->uni_vaddps(vmm_dst, vmm_src0, vmm_src1); break; - case ov::element::i32: h->uni_vpaddd(vmm_dst, vmm_src0, vmm_src1); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: + h->uni_vaddps(vmm_dst, vmm_src0, vmm_src1); + break; + case ov::element::i32: + h->uni_vpaddd(vmm_dst, vmm_src0, vmm_src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -78,14 +90,19 @@ std::set> jit_add_emitter::get_supported_precisions(c } /// MUL_ADD /// -jit_mul_add_emitter::jit_mul_add_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_mul_add_emitter::jit_mul_add_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_mul_add_emitter::jit_mul_add_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_mul_add_emitter::jit_mul_add_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_mul_add_emitter::get_inputs_num() const { return 3; } +size_t jit_mul_add_emitter::get_inputs_num() const { + return 3; +} -void jit_mul_add_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_mul_add_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -98,7 +115,8 @@ void jit_mul_add_emitter::emit_impl(const std::vector &in_vec_idxs, cons } template -void jit_mul_add_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_mul_add_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -109,47 +127,49 @@ void jit_mul_add_emitter::emit_isa(const std::vector &in_vec_idxs, const auto uni_vfmadd231_xmm = [this](Xmm vmm_dst, Xmm vmm_src0, Xmm vmm_src1, Xmm vmm_src2) { h->uni_vmovups(vmm_dst, vmm_src0); switch (exec_prc_) { - case ov::element::f32: { - h->uni_vmulps(vmm_dst, vmm_dst, vmm_src1); - h->uni_vaddps(vmm_dst, vmm_dst, vmm_src2); - } break; - case ov::element::i32: { - h->uni_vpmulld(vmm_dst, vmm_dst, vmm_src1); - h->uni_vpaddd(vmm_dst, vmm_dst, vmm_src2); - } break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: { + h->uni_vmulps(vmm_dst, vmm_dst, vmm_src1); + h->uni_vaddps(vmm_dst, vmm_dst, vmm_src2); + } break; + case ov::element::i32: { + h->uni_vpmulld(vmm_dst, vmm_dst, vmm_src1); + h->uni_vpaddd(vmm_dst, vmm_dst, vmm_src2); + } break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; auto uni_vfmadd231_vmm = [this, vmm_aux0](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1, Vmm vmm_src2) { switch (exec_prc_) { - case ov::element::f32: { - Vmm vmm_mul0; - if (vmm_dst.getIdx() == vmm_src0.getIdx()) { - h->uni_vmovups(vmm_aux0, vmm_src0); - vmm_mul0 = vmm_aux0; - } else { - vmm_mul0 = vmm_src0; - } - - Vmm vmm_mul1; - if (vmm_dst.getIdx() == vmm_src1.getIdx()) { - h->uni_vmovups(vmm_aux0, vmm_src1); - vmm_mul1 = vmm_aux0; - } else { - vmm_mul1 = vmm_src1; - } - - if (vmm_dst.getIdx() != vmm_src2.getIdx()) - h->uni_vmovups(vmm_dst, vmm_src2); - - h->uni_vfmadd231ps(vmm_dst, vmm_mul0, vmm_mul1); - } break; - case ov::element::i32: { - h->uni_vpmulld(vmm_dst, vmm_src0, vmm_src1); - h->uni_vpaddd(vmm_dst, vmm_dst, vmm_src2); - } break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: { + Vmm vmm_mul0; + if (vmm_dst.getIdx() == vmm_src0.getIdx()) { + h->uni_vmovups(vmm_aux0, vmm_src0); + vmm_mul0 = vmm_aux0; + } else { + vmm_mul0 = vmm_src0; + } + + Vmm vmm_mul1; + if (vmm_dst.getIdx() == vmm_src1.getIdx()) { + h->uni_vmovups(vmm_aux0, vmm_src1); + vmm_mul1 = vmm_aux0; + } else { + vmm_mul1 = vmm_src1; + } + + if (vmm_dst.getIdx() != vmm_src2.getIdx()) + h->uni_vmovups(vmm_dst, vmm_src2); + + h->uni_vfmadd231ps(vmm_dst, vmm_mul0, vmm_mul1); + } break; + case ov::element::i32: { + h->uni_vpmulld(vmm_dst, vmm_src0, vmm_src1); + h->uni_vpaddd(vmm_dst, vmm_dst, vmm_src2); + } break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -164,19 +184,27 @@ size_t jit_mul_add_emitter::aux_vecs_count() const { return 1; } -std::set> jit_mul_add_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_mul_add_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32, element::f32}, {element::i32, element::i32, element::i32}}; } /// SUB /// -jit_subtract_emitter::jit_subtract_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_subtract_emitter::jit_subtract_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_subtract_emitter::jit_subtract_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_subtract_emitter::jit_subtract_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_subtract_emitter::get_inputs_num() const { return 2; } +size_t jit_subtract_emitter::get_inputs_num() const { + return 2; +} -void jit_subtract_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_subtract_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -189,7 +217,8 @@ void jit_subtract_emitter::emit_impl(const std::vector &in_vec_idxs, con } template -void jit_subtract_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_subtract_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -197,9 +226,14 @@ void jit_subtract_emitter::emit_isa(const std::vector &in_vec_idxs, cons auto uni_vsub = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: h->uni_vsubps(vmm_dst, vmm_src0, vmm_src1); break; - case ov::element::i32: h->uni_vpsubd(vmm_dst, vmm_src0, vmm_src1); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: + h->uni_vsubps(vmm_dst, vmm_src0, vmm_src1); + break; + case ov::element::i32: + h->uni_vpsubd(vmm_dst, vmm_src0, vmm_src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -211,19 +245,27 @@ void jit_subtract_emitter::emit_isa(const std::vector &in_vec_idxs, cons } } -std::set> jit_subtract_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_subtract_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// MULTIPLY /// -jit_multiply_emitter::jit_multiply_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_multiply_emitter::jit_multiply_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_multiply_emitter::jit_multiply_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_multiply_emitter::jit_multiply_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_multiply_emitter::get_inputs_num() const { return 2; } +size_t jit_multiply_emitter::get_inputs_num() const { + return 2; +} -void jit_multiply_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_multiply_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -236,7 +278,8 @@ void jit_multiply_emitter::emit_impl(const std::vector &in_vec_idxs, con } template -void jit_multiply_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_multiply_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -244,9 +287,14 @@ void jit_multiply_emitter::emit_isa(const std::vector &in_vec_idxs, cons auto uni_vmul = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: h->uni_vmulps(vmm_dst, vmm_src0, vmm_src1); break; - case ov::element::i32: h->uni_vpmulld(vmm_dst, vmm_src0, vmm_src1); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: + h->uni_vmulps(vmm_dst, vmm_src0, vmm_src1); + break; + case ov::element::i32: + h->uni_vpmulld(vmm_dst, vmm_src0, vmm_src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -258,19 +306,26 @@ void jit_multiply_emitter::emit_isa(const std::vector &in_vec_idxs, cons } } -std::set> jit_multiply_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_multiply_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// DIVIDE /// -jit_divide_emitter::jit_divide_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_divide_emitter::jit_divide_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_divide_emitter::jit_divide_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_divide_emitter::jit_divide_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_divide_emitter::get_inputs_num() const { return 2; } +size_t jit_divide_emitter::get_inputs_num() const { + return 2; +} -void jit_divide_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_divide_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -283,7 +338,8 @@ void jit_divide_emitter::emit_impl(const std::vector &in_vec_idxs, const } template -void jit_divide_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_divide_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -291,23 +347,24 @@ void jit_divide_emitter::emit_isa(const std::vector &in_vec_idxs, const auto uni_vdiv = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: { - h->uni_vdivps(vmm_dst, vmm_src0, vmm_src1); - break; - } - case ov::element::i32: { - Vmm vmm_aux0 = Vmm(aux_vec_idxs[0]); - - // The opset doesn't contain vector instruction for integer divide operation - // As WA we emulate its behavior via fp divide followed by rounding to zero - h->uni_vcvtdq2ps(vmm_dst, vmm_src0); - h->uni_vcvtdq2ps(vmm_aux0, vmm_src1); - h->uni_vdivps(vmm_dst, vmm_dst, vmm_aux0); - h->uni_vroundps(vmm_dst, vmm_dst, 3); // rounding to zero - h->uni_vcvtps2dq(vmm_dst, vmm_dst); - break; - } - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: { + h->uni_vdivps(vmm_dst, vmm_src0, vmm_src1); + break; + } + case ov::element::i32: { + Vmm vmm_aux0 = Vmm(aux_vec_idxs[0]); + + // The opset doesn't contain vector instruction for integer divide operation + // As WA we emulate its behavior via fp divide followed by rounding to zero + h->uni_vcvtdq2ps(vmm_dst, vmm_src0); + h->uni_vcvtdq2ps(vmm_aux0, vmm_src1); + h->uni_vdivps(vmm_dst, vmm_dst, vmm_aux0); + h->uni_vroundps(vmm_dst, vmm_dst, 3); // rounding to zero + h->uni_vcvtps2dq(vmm_dst, vmm_dst); + break; + } + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -319,7 +376,8 @@ void jit_divide_emitter::emit_isa(const std::vector &in_vec_idxs, const } } -std::set> jit_divide_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_divide_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } @@ -328,18 +386,25 @@ size_t jit_divide_emitter::aux_vecs_count() const { } /// FLOOR /// -jit_floor_emitter::jit_floor_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} -jit_floor_emitter::jit_floor_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_floor_emitter::jit_floor_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} +jit_floor_emitter::jit_floor_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_floor_emitter::get_inputs_num() const { return 1; } +size_t jit_floor_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_floor_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_floor_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } -void jit_floor_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_floor_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -352,7 +417,8 @@ void jit_floor_emitter::emit_impl(const std::vector& in_vec_idxs, const } template -void jit_floor_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_floor_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -360,14 +426,20 @@ void jit_floor_emitter::emit_isa(const std::vector &in_vec_idxs, const s } /// CEILING /// -jit_ceiling_emitter::jit_ceiling_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} -jit_ceiling_emitter::jit_ceiling_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_ceiling_emitter::jit_ceiling_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} +jit_ceiling_emitter::jit_ceiling_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_ceiling_emitter::get_inputs_num() const { return 1; } +size_t jit_ceiling_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_ceiling_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_ceiling_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } @@ -385,7 +457,8 @@ void jit_ceiling_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_ceiling_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_ceiling_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -403,13 +476,17 @@ jit_floor_mod_emitter::jit_floor_mod_emitter(x64::jit_generator* host, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_floor_mod_emitter::get_inputs_num() const { return 2; } +size_t jit_floor_mod_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_floor_mod_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_floor_mod_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_floor_mod_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_floor_mod_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -422,7 +499,8 @@ void jit_floor_mod_emitter::emit_impl(const std::vector& in_vec_idxs, co } template -void jit_floor_mod_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_floor_mod_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -434,14 +512,14 @@ void jit_floor_mod_emitter::emit_isa(const std::vector &in_vec_idxs, con h->uni_vmovups(vmm_dst, vmm_src0); h->uni_vmovups(vmm_aux0, vmm_src0); h->uni_vdivps(vmm_aux0, vmm_aux0, vmm_src1); - h->uni_vroundps(vmm_aux0, vmm_aux0, 1); // rounding down + h->uni_vroundps(vmm_aux0, vmm_aux0, 1); // rounding down h->uni_vmulps(vmm_aux0, vmm_aux0, vmm_src1); h->uni_vsubps(vmm_dst, vmm_dst, vmm_aux0); } else { if (vmm_dst.getIdx() != vmm_src0.getIdx()) h->uni_vmovups(vmm_dst, vmm_src0); h->uni_vdivps(vmm_aux0, vmm_src0, vmm_src1); - h->uni_vroundps(vmm_aux0, vmm_aux0, 1); // rounding down + h->uni_vroundps(vmm_aux0, vmm_aux0, 1); // rounding down h->uni_vmulps(vmm_aux0, vmm_aux0, vmm_src1); h->uni_vsubps(vmm_dst, vmm_dst, vmm_aux0); } @@ -452,12 +530,17 @@ size_t jit_floor_mod_emitter::aux_vecs_count() const { } /// MOD /// -jit_mod_emitter::jit_mod_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} -jit_mod_emitter::jit_mod_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_mod_emitter::jit_mod_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} +jit_mod_emitter::jit_mod_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_mod_emitter::get_inputs_num() const { return 2; } +size_t jit_mod_emitter::get_inputs_num() const { + return 2; +} std::set> jit_mod_emitter::get_supported_precisions(const std::shared_ptr& node) { return {{element::f32, element::f32}}; @@ -476,7 +559,7 @@ void jit_mod_emitter::emit_impl(const std::vector& in_vec_idxs, const st } template -void jit_mod_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_mod_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -488,14 +571,14 @@ void jit_mod_emitter::emit_isa(const std::vector &in_vec_idxs, const std h->uni_vmovups(vmm_dst, vmm_src0); h->uni_vmovups(vmm_aux0, vmm_src0); h->uni_vdivps(vmm_aux0, vmm_aux0, vmm_src1); - h->uni_vroundps(vmm_aux0, vmm_aux0, 3); // truncate + h->uni_vroundps(vmm_aux0, vmm_aux0, 3); // truncate h->uni_vmulps(vmm_aux0, vmm_aux0, vmm_src1); h->uni_vsubps(vmm_dst, vmm_dst, vmm_aux0); } else { if (vmm_dst.getIdx() != vmm_src0.getIdx()) h->uni_vmovups(vmm_dst, vmm_src0); h->uni_vdivps(vmm_aux0, vmm_src0, vmm_src1); - h->uni_vroundps(vmm_aux0, vmm_aux0, 3); // truncate + h->uni_vroundps(vmm_aux0, vmm_aux0, 3); // truncate h->uni_vmulps(vmm_aux0, vmm_aux0, vmm_src1); h->uni_vsubps(vmm_dst, vmm_dst, vmm_aux0); } @@ -506,14 +589,19 @@ size_t jit_mod_emitter::aux_vecs_count() const { } /// MAXIMUM /// -jit_maximum_emitter::jit_maximum_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_maximum_emitter::jit_maximum_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_maximum_emitter::jit_maximum_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_maximum_emitter::jit_maximum_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_maximum_emitter::get_inputs_num() const { return 2; } +size_t jit_maximum_emitter::get_inputs_num() const { + return 2; +} -void jit_maximum_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_maximum_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -526,7 +614,8 @@ void jit_maximum_emitter::emit_impl(const std::vector &in_vec_idxs, cons } template -void jit_maximum_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_maximum_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -534,9 +623,14 @@ void jit_maximum_emitter::emit_isa(const std::vector &in_vec_idxs, const auto uni_vmax = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: h->uni_vmaxps(vmm_dst, vmm_src0, vmm_src1); break; - case ov::element::i32: h->uni_vpmaxsd(vmm_dst, vmm_src0, vmm_src1); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: + h->uni_vmaxps(vmm_dst, vmm_src0, vmm_src1); + break; + case ov::element::i32: + h->uni_vpmaxsd(vmm_dst, vmm_src0, vmm_src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -549,19 +643,25 @@ void jit_maximum_emitter::emit_isa(const std::vector &in_vec_idxs, const } } -std::set> jit_maximum_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_maximum_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// MINIMUM /// -jit_minimum_emitter::jit_minimum_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node) -: jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} -jit_minimum_emitter::jit_minimum_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_minimum_emitter::jit_minimum_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node) + : jit_emitter(host, host_isa, get_arithmetic_binary_exec_precision(node)) {} +jit_minimum_emitter::jit_minimum_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_minimum_emitter::get_inputs_num() const { return 2; } +size_t jit_minimum_emitter::get_inputs_num() const { + return 2; +} -void jit_minimum_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_minimum_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -574,7 +674,8 @@ void jit_minimum_emitter::emit_impl(const std::vector &in_vec_idxs, cons } template -void jit_minimum_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_minimum_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -582,9 +683,14 @@ void jit_minimum_emitter::emit_isa(const std::vector &in_vec_idxs, const auto uni_vmin = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: h->uni_vminps(vmm_dst, vmm_src0, vmm_src1); break; - case ov::element::i32: h->uni_vpminsd(vmm_dst, vmm_src0, vmm_src1); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: + h->uni_vminps(vmm_dst, vmm_src0, vmm_src1); + break; + case ov::element::i32: + h->uni_vpminsd(vmm_dst, vmm_src0, vmm_src1); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -597,20 +703,28 @@ void jit_minimum_emitter::emit_isa(const std::vector &in_vec_idxs, const } } -std::set> jit_minimum_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_minimum_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// SQUARED_DIFFERENCE /// -jit_squared_difference_emitter::jit_squared_difference_emitter( - x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} -jit_squared_difference_emitter::jit_squared_difference_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) {} +jit_squared_difference_emitter::jit_squared_difference_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} +jit_squared_difference_emitter::jit_squared_difference_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_squared_difference_emitter::get_inputs_num() const { return 2; } +size_t jit_squared_difference_emitter::get_inputs_num() const { + return 2; +} -void jit_squared_difference_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_squared_difference_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -623,7 +737,8 @@ void jit_squared_difference_emitter::emit_impl(const std::vector &in_vec } template -void jit_squared_difference_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_squared_difference_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -631,15 +746,16 @@ void jit_squared_difference_emitter::emit_isa(const std::vector &in_vec_ auto uni_vsqdiff = [this](Vmm vmm_dst, Vmm vmm_src0, Vmm vmm_src1) { switch (exec_prc_) { - case ov::element::f32: { - h->uni_vsubps(vmm_dst, vmm_src0, vmm_src1); - h->uni_vmulps(vmm_dst, vmm_dst, vmm_dst); - } break; - case ov::element::i32: { - h->uni_vpsubd(vmm_dst, vmm_src0, vmm_src1); - h->uni_vpmulld(vmm_dst, vmm_dst, vmm_dst); - } break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); + case ov::element::f32: { + h->uni_vsubps(vmm_dst, vmm_src0, vmm_src1); + h->uni_vmulps(vmm_dst, vmm_dst, vmm_dst); + } break; + case ov::element::i32: { + h->uni_vpsubd(vmm_dst, vmm_src0, vmm_src1); + h->uni_vpmulld(vmm_dst, vmm_dst, vmm_dst); + } break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported precision"); } }; @@ -652,24 +768,33 @@ void jit_squared_difference_emitter::emit_isa(const std::vector &in_vec_ } } -std::set> jit_squared_difference_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_squared_difference_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}, {element::i32, element::i32}}; } /// POWER_DYNAMIC /// -jit_power_dynamic_emitter::jit_power_dynamic_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, +jit_power_dynamic_emitter::jit_power_dynamic_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -jit_power_dynamic_emitter::jit_power_dynamic_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_power_dynamic_emitter::jit_power_dynamic_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_power_dynamic_emitter::get_inputs_num() const { return 2; } +size_t jit_power_dynamic_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_power_dynamic_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_power_dynamic_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_power_dynamic_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_power_dynamic_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -682,7 +807,8 @@ void jit_power_dynamic_emitter::emit_impl(const std::vector& in_vec_idxs } template -void jit_power_dynamic_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_power_dynamic_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -692,8 +818,8 @@ void jit_power_dynamic_emitter::emit_isa(const std::vector &in_vec_idxs, // caller obligation to save gprs as callee may use them size_t gpr_size = 8; - Xbyak::Operand gprs_to_save[] = {h->r8, h->r9, h->r10, h->r11, h->rax, - h->rcx, h->rdx, h->rdi, h->rsi, h->rbp, h->rbx}; + Xbyak::Operand gprs_to_save[] = + {h->r8, h->r9, h->r10, h->r11, h->rax, h->rcx, h->rdx, h->rdi, h->rsi, h->rbp, h->rbx}; size_t n_gprs_to_save = sizeof(gprs_to_save) / sizeof(gprs_to_save[0]); h->sub(h->rsp, n_gprs_to_save * gpr_size); @@ -722,8 +848,8 @@ void jit_power_dynamic_emitter::emit_isa(const std::vector &in_vec_idxs, h->sub(h->rsp, (get_max_vecs_count() + 2) * get_vec_length()); for (size_t i = 2; i < get_max_vecs_count() + 2; ++i) h->uni_vmovups(h->ptr[h->rsp + i * get_vec_length()], Vmm(i - 2)); - h->uni_vmovups(h->ptr[h->rsp + 0 * get_vec_length()], vmm_src0); // src - h->uni_vmovups(h->ptr[h->rsp + 1 * get_vec_length()], vmm_src1); // beta + h->uni_vmovups(h->ptr[h->rsp + 0 * get_vec_length()], vmm_src0); // src + h->uni_vmovups(h->ptr[h->rsp + 1 * get_vec_length()], vmm_src1); // beta // save function address in gpr to pass in in call instruction h->mov(h->rbp, reinterpret_cast(powf)); @@ -735,7 +861,7 @@ void jit_power_dynamic_emitter::emit_isa(const std::vector &in_vec_idxs, // Take src, apply powf on it and replace value on a stack with dst. for (size_t i = 0; i < get_vec_length() / sizeof(float); ++i) { - const Address &source = h->ptr[h->rsp + h->rbx + i * sizeof(float)]; + const Address& source = h->ptr[h->rsp + h->rbx + i * sizeof(float)]; h->uni_vmovss(xmm0, source); h->uni_vmovss(xmm1, h->ptr[h->rsp + h->rbx + get_vec_length() + i * sizeof(float)]); h->call(h->rbp); @@ -767,24 +893,30 @@ void jit_power_dynamic_emitter::emit_isa(const std::vector &in_vec_idxs, h->add(h->rsp, n_gprs_to_save * gpr_size); } - /// EQUAL /// -jit_equal_emitter::jit_equal_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_equal_emitter::jit_equal_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -jit_equal_emitter::jit_equal_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_equal_emitter::jit_equal_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_equal_emitter::get_inputs_num() const { return 2; } +size_t jit_equal_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_equal_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_equal_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_equal_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_equal_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -797,7 +929,8 @@ void jit_equal_emitter::emit_impl(const std::vector& in_vec_idxs, const } template -void jit_equal_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_equal_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -846,13 +979,17 @@ jit_not_equal_emitter::jit_not_equal_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_not_equal_emitter::get_inputs_num() const { return 2; } +size_t jit_not_equal_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_not_equal_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_not_equal_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_not_equal_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_not_equal_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -865,7 +1002,8 @@ void jit_not_equal_emitter::emit_impl(const std::vector& in_vec_idxs, co } template -void jit_not_equal_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_not_equal_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -900,22 +1038,29 @@ size_t jit_not_equal_emitter::aux_vecs_count() const { } /// GREATER /// -jit_greater_emitter::jit_greater_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_greater_emitter::jit_greater_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -jit_greater_emitter::jit_greater_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_greater_emitter::jit_greater_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_greater_emitter::get_inputs_num() const { return 2; } +size_t jit_greater_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_greater_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_greater_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_greater_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_greater_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -928,7 +1073,8 @@ void jit_greater_emitter::emit_impl(const std::vector& in_vec_idxs, cons } template -void jit_greater_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_greater_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -963,23 +1109,31 @@ size_t jit_greater_emitter::aux_vecs_count() const { } /// GREATER_EQUAL /// -jit_greater_equal_emitter::jit_greater_equal_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, +jit_greater_equal_emitter::jit_greater_equal_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -jit_greater_equal_emitter::jit_greater_equal_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_greater_equal_emitter::jit_greater_equal_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_greater_equal_emitter::get_inputs_num() const { return 2; } +size_t jit_greater_equal_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_greater_equal_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_greater_equal_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_greater_equal_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_greater_equal_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -992,7 +1146,8 @@ void jit_greater_equal_emitter::emit_impl(const std::vector& in_vec_idxs } template -void jit_greater_equal_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_greater_equal_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1027,22 +1182,28 @@ size_t jit_greater_equal_emitter::aux_vecs_count() const { } /// LESS /// -jit_less_emitter::jit_less_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_less_emitter::jit_less_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -jit_less_emitter::jit_less_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc) { +jit_less_emitter::jit_less_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) + : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_less_emitter::get_inputs_num() const { return 2; } +size_t jit_less_emitter::get_inputs_num() const { + return 2; +} std::set> jit_less_emitter::get_supported_precisions(const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_less_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_less_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1055,7 +1216,7 @@ void jit_less_emitter::emit_impl(const std::vector& in_vec_idxs, const s } template -void jit_less_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_less_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1104,13 +1265,17 @@ jit_less_equal_emitter::jit_less_equal_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_less_equal_emitter::get_inputs_num() const { return 2; } +size_t jit_less_equal_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_less_equal_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_less_equal_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_less_equal_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_less_equal_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1123,7 +1288,8 @@ void jit_less_equal_emitter::emit_impl(const std::vector& in_vec_idxs, c } template -void jit_less_equal_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_less_equal_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1173,13 +1339,17 @@ jit_logical_and_emitter::jit_logical_and_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_logical_and_emitter::get_inputs_num() const { return 2; } +size_t jit_logical_and_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_logical_and_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_logical_and_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_logical_and_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_logical_and_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1192,7 +1362,8 @@ void jit_logical_and_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_logical_and_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_logical_and_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1261,13 +1432,17 @@ jit_logical_or_emitter::jit_logical_or_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_logical_or_emitter::get_inputs_num() const { return 2; } +size_t jit_logical_or_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_logical_or_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_logical_or_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_logical_or_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_logical_or_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1280,7 +1455,8 @@ void jit_logical_or_emitter::emit_impl(const std::vector& in_vec_idxs, c } template -void jit_logical_or_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_logical_or_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1349,13 +1525,17 @@ jit_logical_xor_emitter::jit_logical_xor_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_logical_xor_emitter::get_inputs_num() const { return 2; } +size_t jit_logical_xor_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_logical_xor_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_logical_xor_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_logical_xor_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_logical_xor_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1368,7 +1548,8 @@ void jit_logical_xor_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_logical_xor_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_logical_xor_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1437,13 +1618,17 @@ jit_logical_not_emitter::jit_logical_not_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_logical_not_emitter::get_inputs_num() const { return 1; } +size_t jit_logical_not_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_logical_not_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_logical_not_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } -void jit_logical_not_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_logical_not_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1456,7 +1641,8 @@ void jit_logical_not_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_logical_not_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_logical_not_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -1507,20 +1693,30 @@ jit_power_static_emitter::jit_power_static_emitter(x64::jit_generator* host, prepare_table(); } -jit_power_static_emitter::jit_power_static_emitter(x64::jit_generator *host, x64::cpu_isa_t host_isa, - float inpPower, float inpScale, float inpShift, +jit_power_static_emitter::jit_power_static_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + float inpPower, + float inpScale, + float inpShift, ov::element::Type exec_prc) -: jit_emitter(host, host_isa, exec_prc), power(inpPower), scale(inpScale), shift(inpShift) { + : jit_emitter(host, host_isa, exec_prc), + power(inpPower), + scale(inpScale), + shift(inpShift) { prepare_table(); } -size_t jit_power_static_emitter::get_inputs_num() const { return 1; } +size_t jit_power_static_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_power_static_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_power_static_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } -void jit_power_static_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_power_static_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1533,7 +1729,8 @@ void jit_power_static_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_power_static_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_power_static_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -1600,8 +1797,8 @@ void jit_power_static_emitter::emit_isa(const std::vector &in_vec_idxs, // caller obligation to save gprs as callee may use them size_t gpr_size = 8; - Xbyak::Operand gprs_to_save[] = {h->r8, h->r9, h->r10, h->r11, h->rax, - h->rcx, h->rdx, h->rdi, h->rsi, h->rbp, h->rbx}; + Xbyak::Operand gprs_to_save[] = + {h->r8, h->r9, h->r10, h->r11, h->rax, h->rcx, h->rdx, h->rdi, h->rsi, h->rbp, h->rbx}; size_t n_gprs_to_save = sizeof(gprs_to_save) / sizeof(gprs_to_save[0]); h->sub(h->rsp, n_gprs_to_save * gpr_size); @@ -1630,8 +1827,8 @@ void jit_power_static_emitter::emit_isa(const std::vector &in_vec_idxs, h->sub(h->rsp, (get_max_vecs_count() + 2) * get_vec_length()); for (size_t i = 2; i < get_max_vecs_count() + 2; ++i) h->uni_vmovups(h->ptr[h->rsp + i * get_vec_length()], Vmm(i - 2)); - h->uni_vmovups(h->ptr[h->rsp + 0 * get_vec_length()], vmm_dst); // src - h->uni_vmovups(h->ptr[h->rsp + 1 * get_vec_length()], vmm_aux0); // beta + h->uni_vmovups(h->ptr[h->rsp + 0 * get_vec_length()], vmm_dst); // src + h->uni_vmovups(h->ptr[h->rsp + 1 * get_vec_length()], vmm_aux0); // beta // save function address in gpr to pass in in call instruction h->mov(h->rbp, reinterpret_cast(powf)); @@ -1643,7 +1840,7 @@ void jit_power_static_emitter::emit_isa(const std::vector &in_vec_idxs, // Take src, apply powf on it and replace value on a stack with dst. for (size_t i = 0; i < get_vec_length() / sizeof(float); ++i) { - const Address &source = h->ptr[h->rsp + h->rbx + i * sizeof(float)]; + const Address& source = h->ptr[h->rsp + h->rbx + i * sizeof(float)]; h->uni_vmovss(xmm0, source); h->uni_vmovss(xmm1, h->ptr[h->rsp + h->rbx + get_vec_length() + i * sizeof(float)]); h->call(h->rbp); @@ -1680,7 +1877,7 @@ void jit_power_static_emitter::register_table_entries() { push_arg_entry_of("power", x64::float2int(power), true); push_arg_entry_of("scale", x64::float2int(scale), true); push_arg_entry_of("shift", x64::float2int(shift), true); - push_arg_entry_of("one", x64::float2int(1.f), true); + push_arg_entry_of("one", x64::float2int(1.f), true); } size_t jit_power_static_emitter::aux_vecs_count() const { @@ -1699,13 +1896,17 @@ jit_prelu_emitter::jit_prelu_emitter(x64::jit_generator* host, x64::cpu_isa_t ho : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_prelu_emitter::get_inputs_num() const { return 2; } +size_t jit_prelu_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_prelu_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_prelu_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32}}; } -void jit_prelu_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_prelu_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1718,7 +1919,8 @@ void jit_prelu_emitter::emit_impl(const std::vector& in_vec_idxs, const } template -void jit_prelu_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_prelu_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -1761,13 +1963,16 @@ jit_sqrt_emitter::jit_sqrt_emitter(x64::jit_generator* host, jit_sqrt_emitter::jit_sqrt_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_sqrt_emitter::get_inputs_num() const { return 1; } +size_t jit_sqrt_emitter::get_inputs_num() const { + return 1; +} std::set> jit_sqrt_emitter::get_supported_precisions(const std::shared_ptr& node) { return {{element::f32}}; } -void jit_sqrt_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_sqrt_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1780,12 +1985,12 @@ void jit_sqrt_emitter::emit_impl(const std::vector& in_vec_idxs, const s } template -void jit_sqrt_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_sqrt_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); - h->uni_vsqrtps(vmm_dst, vmm_src0); + h->uni_vsqrtps(vmm_dst, vmm_src0); } /// Negate /// @@ -1795,13 +2000,17 @@ jit_negative_emitter::jit_negative_emitter(x64::jit_generator* host, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_negative_emitter::get_inputs_num() const { return 1; } +size_t jit_negative_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_negative_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_negative_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } -void jit_negative_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_negative_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1814,33 +2023,38 @@ void jit_negative_emitter::emit_impl(const std::vector& in_vec_idxs, con } template -void jit_negative_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_negative_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); - Vmm vmm_dst = Vmm(out_vec_idxs[0]); + Vmm vmm_dst = Vmm(out_vec_idxs[0]); h->uni_vpxor(vmm_dst, vmm_dst, vmm_dst); h->uni_vsubps(vmm_dst, vmm_dst, vmm_src); } - /// EXP /// jit_exp_emitter::jit_exp_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -jit_exp_emitter::jit_exp_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) +jit_exp_emitter::jit_exp_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_exp_emitter::get_inputs_num() const { return 1; } +size_t jit_exp_emitter::get_inputs_num() const { + return 1; +} std::set> jit_exp_emitter::get_supported_precisions(const std::shared_ptr& node) { return {{element::f32}}; } -void jit_exp_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_exp_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1853,7 +2067,7 @@ void jit_exp_emitter::emit_impl(const std::vector &in_vec_idxs, const st } template -void jit_exp_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_exp_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -1862,7 +2076,7 @@ void jit_exp_emitter::emit_isa(const std::vector &in_vec_idxs, const std Vmm vmm_aux0 = Vmm(aux_vec_idxs[0 + static_cast(need_vmm_mask())]); Vmm vmm_aux1 = Vmm(aux_vec_idxs[1 + static_cast(need_vmm_mask())]); - auto compute_cmp_mask = [&](const Vmm &vmm_src, const Xbyak::Operand &compare_operand, int cmp_predicate) { + auto compute_cmp_mask = [&](const Vmm& vmm_src, const Xbyak::Operand& compare_operand, int cmp_predicate) { if (host_isa_ == x64::avx512_core) { h->vcmpps(k_mask, vmm_src, compare_operand, cmp_predicate); } else { @@ -1870,7 +2084,7 @@ void jit_exp_emitter::emit_isa(const std::vector &in_vec_idxs, const std } }; - auto blend_with_mask = [&](const Vmm &vmm_dst, const Xbyak::Operand &src) { + auto blend_with_mask = [&](const Vmm& vmm_dst, const Xbyak::Operand& src) { if (host_isa_ == x64::avx512_core) { h->vblendmps(vmm_dst | k_mask, vmm_dst, src); } else { @@ -1924,11 +2138,11 @@ void jit_exp_emitter::emit_isa(const std::vector &in_vec_idxs, const std } void jit_exp_emitter::register_table_entries() { - push_arg_entry_of("pol1", 0x3f7ffffb, true); // p1 = 0.999999701f - push_arg_entry_of("pol2", 0x3efffee3, true); // p2 = 0.499991506f - push_arg_entry_of("pol3", 0x3e2aad40, true); // p3 = 0.166676521f - push_arg_entry_of("pol4", 0x3d2b9d0d, true); // p4 = 0.0418978221f - push_arg_entry_of("pol5", 0x3c07cfce, true); // p5 = 0.00828929059f + push_arg_entry_of("pol1", 0x3f7ffffb, true); // p1 = 0.999999701f + push_arg_entry_of("pol2", 0x3efffee3, true); // p2 = 0.499991506f + push_arg_entry_of("pol3", 0x3e2aad40, true); // p3 = 0.166676521f + push_arg_entry_of("pol4", 0x3d2b9d0d, true); // p4 = 0.0418978221f + push_arg_entry_of("pol5", 0x3c07cfce, true); // p5 = 0.00828929059f push_arg_entry_of("one", CONST_1_F, true); push_arg_entry_of("half", 0x3f000000, true); @@ -1950,16 +2164,21 @@ jit_erf_emitter::jit_erf_emitter(x64::jit_generator* host, x64::cpu_isa_t host_i prepare_table(); } -jit_erf_emitter::jit_erf_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, const std::shared_ptr& node, ov::element::Type exec_prc) +jit_erf_emitter::jit_erf_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + const std::shared_ptr& node, + ov::element::Type exec_prc) : jit_erf_emitter(host, host_isa, exec_prc) {} -size_t jit_erf_emitter::get_inputs_num() const { return 1; } +size_t jit_erf_emitter::get_inputs_num() const { + return 1; +} std::set> jit_erf_emitter::get_supported_precisions(const std::shared_ptr& node) { return {{element::f32}}; } -void jit_erf_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_erf_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -1972,7 +2191,7 @@ void jit_erf_emitter::emit_impl(const std::vector &in_vec_idxs, const st } template -void jit_erf_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_erf_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -1991,8 +2210,11 @@ void jit_erf_emitter::emit_isa(const std::vector &in_vec_idxs, const std // pass the current `aux_vec_idxs` to `exp_emitter` excepting `vmm_aux3` auto exp_aux_vec_idxs = aux_vec_idxs; - exp_aux_vec_idxs.erase(std::find(exp_aux_vec_idxs.begin(), exp_aux_vec_idxs.end(), static_cast(vmm_aux3.getIdx()))); - m_exp_emitter->emit_code({static_cast(vmm_dst.getIdx())}, {static_cast(vmm_dst.getIdx())}, exp_aux_vec_idxs); + exp_aux_vec_idxs.erase( + std::find(exp_aux_vec_idxs.begin(), exp_aux_vec_idxs.end(), static_cast(vmm_aux3.getIdx()))); + m_exp_emitter->emit_code({static_cast(vmm_dst.getIdx())}, + {static_cast(vmm_dst.getIdx())}, + exp_aux_vec_idxs); h->uni_vxorps(vmm_dst, vmm_dst, table_val("sign_mask")); @@ -2027,16 +2249,16 @@ void jit_erf_emitter::emit_isa(const std::vector &in_vec_idxs, const std } void jit_erf_emitter::register_table_entries() { - push_arg_entry_of("approx_const", 0x3ea7ba05, true); // 0.3275911 + push_arg_entry_of("approx_const", 0x3ea7ba05, true); // 0.3275911 push_arg_entry_of("one", CONST_1_F, true); push_arg_entry_of("sign_mask", 0x80000000, true); push_arg_entry_of("positive_mask", 0x7fffffff, true); - push_arg_entry_of("pol1", 0x3e827906, true); // p1 = 0.254829592f - push_arg_entry_of("pol2", 0xbe91a98e, true); // p2 = -0.284496736f - push_arg_entry_of("pol3", 0x3fb5f0e3, true); // p3 = 1.421413741f - push_arg_entry_of("pol4", 0xbfba00e3, true); // p4 = -1.453152027f - push_arg_entry_of("pol5", 0x3f87dc22, true); // p5 = 1.061405429f + push_arg_entry_of("pol1", 0x3e827906, true); // p1 = 0.254829592f + push_arg_entry_of("pol2", 0xbe91a98e, true); // p2 = -0.284496736f + push_arg_entry_of("pol3", 0x3fb5f0e3, true); // p3 = 1.421413741f + push_arg_entry_of("pol4", 0xbfba00e3, true); // p4 = -1.453152027f + push_arg_entry_of("pol5", 0x3f87dc22, true); // p5 = 1.061405429f } size_t jit_erf_emitter::aux_vecs_count() const { @@ -2063,13 +2285,17 @@ jit_soft_sign_emitter::jit_soft_sign_emitter(x64::jit_generator* host, prepare_table(); } -size_t jit_soft_sign_emitter::get_inputs_num() const { return 1; } +size_t jit_soft_sign_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_soft_sign_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_soft_sign_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32}}; } -void jit_soft_sign_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_soft_sign_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2082,7 +2308,8 @@ void jit_soft_sign_emitter::emit_impl(const std::vector& in_vec_idxs, co } template -void jit_soft_sign_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_soft_sign_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -2100,10 +2327,11 @@ void jit_soft_sign_emitter::register_table_entries() { /// IS_FINITE /// template <> -void jit_is_finite_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_finite_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { auto vmm_src = Zmm(in_vec_idxs[0]); auto vmm_dst = Zmm(out_vec_idxs[0]); - auto &ones_mask = h->k1; + auto& ones_mask = h->k1; auto reg32_one = Reg32(aux_gpr_idxs[0]); h->mov(reg32_one, CONST_1_F); @@ -2113,13 +2341,14 @@ void jit_is_finite_emitter::emit_isa(const std::vector } template -void jit_is_finite_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_finite_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional::type; auto vmm_src = Vmm(in_vec_idxs[0]); auto vmm_dst = Vmm(out_vec_idxs[0]); h->uni_vandps(vmm_src, vmm_src, table_val("inf")); - h->uni_vcmpps(vmm_src, vmm_src, table_val("inf"), 0B00000100); // NEq + h->uni_vcmpps(vmm_src, vmm_src, table_val("inf"), 0B00000100); // NEq if (isa == x64::avx2) { h->uni_vandps(vmm_dst, vmm_src, table_val("one")); @@ -2131,7 +2360,8 @@ void jit_is_finite_emitter::emit_isa(const std::vector &in_vec_idxs, con } } -void jit_is_finite_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_finite_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::avx512_core) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2152,12 +2382,13 @@ void jit_is_finite_emitter::register_table_entries() { /// IS_INF /// template <> -void jit_is_inf_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_inf_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { Zmm vmm_src = Zmm(in_vec_idxs[0]); Zmm vmm_dst = Zmm(out_vec_idxs[0]); if (detect_negative || detect_positive) { - auto &ones_mask = h->k1; + auto& ones_mask = h->k1; auto reg32_one = Reg32(aux_gpr_idxs[0]); uint8_t imm = detect_negative ? 0B00010000 : 0B00000000; if (detect_positive) { @@ -2173,7 +2404,8 @@ void jit_is_inf_emitter::emit_isa(const std::vector &i } template -void jit_is_inf_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_inf_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional::type; if (detect_negative || detect_positive) { @@ -2204,7 +2436,8 @@ void jit_is_inf_emitter::emit_isa(const std::vector &in_vec_idxs, const } } -void jit_is_inf_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_inf_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::avx512_core) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2226,10 +2459,11 @@ void jit_is_inf_emitter::register_table_entries() { /// IS_NAN /// template <> -void jit_is_nan_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_nan_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { auto vmm_src = Zmm(in_vec_idxs[0]); auto vmm_dst = Zmm(out_vec_idxs[0]); - auto &ones_mask = h->k1; + auto& ones_mask = h->k1; auto reg32_one = Reg32(aux_gpr_idxs[0]); h->mov(reg32_one, CONST_1_F); @@ -2238,7 +2472,8 @@ void jit_is_nan_emitter::emit_isa(const std::vector &i } template -void jit_is_nan_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_nan_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional::type; auto vmm_src = Vmm(in_vec_idxs[0]); auto vmm_dst = Vmm(out_vec_idxs[0]); @@ -2254,7 +2489,8 @@ void jit_is_nan_emitter::emit_isa(const std::vector &in_vec_idxs, const } } -void jit_is_nan_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_is_nan_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::avx512_core) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2281,9 +2517,12 @@ jit_select_emitter::jit_select_emitter(x64::jit_generator* host, jit_select_emitter::jit_select_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_select_emitter::get_inputs_num() const { return 3; } +size_t jit_select_emitter::get_inputs_num() const { + return 3; +} -std::set> jit_select_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_select_emitter::get_supported_precisions( + const std::shared_ptr& node) { return {{element::f32, element::f32, element::f32}}; } @@ -2292,11 +2531,12 @@ size_t jit_select_emitter::aux_vecs_count() const { return 0; else if (host_isa_ == x64::avx2) // tmp vec for mask return 1; - else // mask should be xmm0 on sse41 + tmp vec for mask + else // mask should be xmm0 on sse41 + tmp vec for mask return 2; } -void jit_select_emitter::emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_select_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2309,7 +2549,8 @@ void jit_select_emitter::emit_impl(const std::vector &in_vec_idxs, const } template -void jit_select_emitter::emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const { +void jit_select_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_cond = Vmm(in_vec_idxs[0]); Vmm vmm_src0 = Vmm(in_vec_idxs[1]); @@ -2346,20 +2587,22 @@ jit_bitwise_and_emitter::jit_bitwise_and_emitter(x64::jit_generator* host, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -jit_bitwise_and_emitter::jit_bitwise_and_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_bitwise_and_emitter::jit_bitwise_and_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_bitwise_and_emitter::get_inputs_num() const { return 2; } +size_t jit_bitwise_and_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_bitwise_and_emitter::get_supported_precisions(const std::shared_ptr& node) { - return { - {element::i8, element::i8}, - {element::u8, element::u8}, - {element::i32, element::i32} - }; +std::set> jit_bitwise_and_emitter::get_supported_precisions( + const std::shared_ptr& node) { + return {{element::i8, element::i8}, {element::u8, element::u8}, {element::i32, element::i32}}; } -void jit_bitwise_and_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_and_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2372,7 +2615,8 @@ void jit_bitwise_and_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_bitwise_and_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_and_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -2399,24 +2643,28 @@ jit_bitwise_not_emitter::jit_bitwise_not_emitter(x64::jit_generator* host, prepare_table(); } -jit_bitwise_not_emitter::jit_bitwise_not_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_bitwise_not_emitter::jit_bitwise_not_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) { prepare_table(); } -size_t jit_bitwise_not_emitter::get_inputs_num() const { return 1; } +size_t jit_bitwise_not_emitter::get_inputs_num() const { + return 1; +} -std::set> jit_bitwise_not_emitter::get_supported_precisions(const std::shared_ptr& node) { - return { - {element::i8}, - {element::u8}, - {element::i32} - }; +std::set> jit_bitwise_not_emitter::get_supported_precisions( + const std::shared_ptr& node) { + return {{element::i8}, {element::u8}, {element::i32}}; } -size_t jit_bitwise_not_emitter::aux_vecs_count() const { return 1; } +size_t jit_bitwise_not_emitter::aux_vecs_count() const { + return 1; +} -void jit_bitwise_not_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_not_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2429,7 +2677,8 @@ void jit_bitwise_not_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_bitwise_not_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_not_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src = Vmm(in_vec_idxs[0]); Vmm vmm_dst = Vmm(out_vec_idxs[0]); @@ -2457,20 +2706,22 @@ jit_bitwise_or_emitter::jit_bitwise_or_emitter(x64::jit_generator* host, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -jit_bitwise_or_emitter::jit_bitwise_or_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_bitwise_or_emitter::jit_bitwise_or_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_bitwise_or_emitter::get_inputs_num() const { return 2; } +size_t jit_bitwise_or_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_bitwise_or_emitter::get_supported_precisions(const std::shared_ptr& node) { - return { - {element::i8, element::i8}, - {element::u8, element::u8}, - {element::i32, element::i32} - }; +std::set> jit_bitwise_or_emitter::get_supported_precisions( + const std::shared_ptr& node) { + return {{element::i8, element::i8}, {element::u8, element::u8}, {element::i32, element::i32}}; } -void jit_bitwise_or_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_or_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2483,7 +2734,8 @@ void jit_bitwise_or_emitter::emit_impl(const std::vector& in_vec_idxs, c } template -void jit_bitwise_or_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_or_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -2508,20 +2760,22 @@ jit_bitwise_xor_emitter::jit_bitwise_xor_emitter(x64::jit_generator* host, ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -jit_bitwise_xor_emitter::jit_bitwise_xor_emitter(x64::jit_generator* host, x64::cpu_isa_t host_isa, ov::element::Type exec_prc) +jit_bitwise_xor_emitter::jit_bitwise_xor_emitter(x64::jit_generator* host, + x64::cpu_isa_t host_isa, + ov::element::Type exec_prc) : jit_emitter(host, host_isa, exec_prc) {} -size_t jit_bitwise_xor_emitter::get_inputs_num() const { return 2; } +size_t jit_bitwise_xor_emitter::get_inputs_num() const { + return 2; +} -std::set> jit_bitwise_xor_emitter::get_supported_precisions(const std::shared_ptr& node) { - return { - {element::i8, element::i8}, - {element::u8, element::u8}, - {element::i32, element::i32} - }; +std::set> jit_bitwise_xor_emitter::get_supported_precisions( + const std::shared_ptr& node) { + return {{element::i8, element::i8}, {element::u8, element::u8}, {element::i32, element::i32}}; } -void jit_bitwise_xor_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_xor_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { if (host_isa_ == x64::sse41) { emit_isa(in_vec_idxs, out_vec_idxs); } else if (host_isa_ == x64::avx2) { @@ -2534,7 +2788,8 @@ void jit_bitwise_xor_emitter::emit_impl(const std::vector& in_vec_idxs, } template -void jit_bitwise_xor_emitter::emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_bitwise_xor_emitter::emit_isa(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { using Vmm = typename conditional3::type; Vmm vmm_src0 = Vmm(in_vec_idxs[0]); Vmm vmm_src1 = Vmm(in_vec_idxs[1]); @@ -2543,5 +2798,5 @@ void jit_bitwise_xor_emitter::emit_isa(const std::vector& in_vec_idxs, c h->uni_vxorps(vmm_dst, vmm_src0, vmm_src1); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.hpp index c8c4b06d6f3347..84c65d44a12280 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_eltwise_emitters.hpp @@ -11,418 +11,488 @@ namespace intel_cpu { class jit_add_emitter : public jit_emitter { public: - jit_add_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_add_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_add_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_add_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_mul_add_emitter : public jit_emitter { public: - jit_mul_add_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_mul_add_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_mul_add_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_mul_add_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; size_t aux_vecs_count() const override; }; - class jit_subtract_emitter : public jit_emitter { public: - jit_subtract_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_subtract_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_subtract_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_subtract_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_multiply_emitter : public jit_emitter { public: - jit_multiply_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_multiply_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_multiply_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_multiply_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_divide_emitter : public jit_emitter { public: - jit_divide_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_divide_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_divide_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_divide_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; size_t aux_vecs_count() const override; }; class jit_floor_emitter : public jit_emitter { public: - jit_floor_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_floor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_floor_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_floor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_ceiling_emitter : public jit_emitter { public: - jit_ceiling_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_ceiling_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_ceiling_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_ceiling_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_floor_mod_emitter : public jit_emitter { public: - jit_floor_mod_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_floor_mod_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_floor_mod_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_floor_mod_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; size_t aux_vecs_count() const override; }; - class jit_mod_emitter : public jit_emitter { public: - jit_mod_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_mod_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_mod_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_mod_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; size_t aux_vecs_count() const override; }; - class jit_maximum_emitter : public jit_emitter { public: - jit_maximum_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_maximum_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_maximum_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_maximum_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_minimum_emitter : public jit_emitter { public: - jit_minimum_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_minimum_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_minimum_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); + jit_minimum_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_squared_difference_emitter : public jit_emitter { public: - jit_squared_difference_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_squared_difference_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_squared_difference_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_squared_difference_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_power_dynamic_emitter : public jit_emitter { public: - jit_power_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_power_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_power_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_power_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; - class jit_equal_emitter : public jit_emitter { public: - jit_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_not_equal_emitter : public jit_emitter { public: - jit_not_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_not_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_not_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_not_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_greater_emitter : public jit_emitter { public: - jit_greater_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_greater_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_greater_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_greater_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_greater_equal_emitter : public jit_emitter { public: - jit_greater_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_greater_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_greater_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_greater_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_less_emitter : public jit_emitter { public: - jit_less_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_less_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_less_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_less_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_less_equal_emitter : public jit_emitter { public: - jit_less_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_less_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_less_equal_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_less_equal_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_logical_and_emitter : public jit_emitter { public: - jit_logical_and_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_logical_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_logical_and_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_logical_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_logical_or_emitter : public jit_emitter { public: - jit_logical_or_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_logical_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_logical_or_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_logical_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; }; - class jit_logical_xor_emitter : public jit_emitter { public: - jit_logical_xor_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_logical_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_logical_xor_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_logical_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; @@ -430,19 +500,23 @@ class jit_logical_xor_emitter : public jit_emitter { class jit_logical_not_emitter : public jit_emitter { public: - jit_logical_not_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_logical_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_logical_not_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_logical_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; @@ -450,21 +524,26 @@ class jit_logical_not_emitter : public jit_emitter { class jit_power_static_emitter : public jit_emitter { public: - jit_power_static_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - float inpPower, float inpScale, float inpShift, + jit_power_static_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + float inpPower, + float inpScale, + float inpShift, ov::element::Type exec_prc = ov::element::f32); - jit_power_static_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_power_static_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); - + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; @@ -476,73 +555,90 @@ class jit_power_static_emitter : public jit_emitter { class jit_prelu_emitter : public jit_emitter { public: - jit_prelu_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_prelu_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_prelu_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_prelu_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; size_t aux_vecs_count() const override; }; class jit_sqrt_emitter : public jit_emitter { public: - jit_sqrt_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_sqrt_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_sqrt_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_sqrt_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_negative_emitter : public jit_emitter { public: - jit_negative_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_negative_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_exp_emitter : public jit_emitter { public: - jit_exp_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_exp_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_exp_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_exp_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; - bool need_vmm_mask() const { return host_isa_ != dnnl::impl::cpu::x64::avx512_core; } + bool need_vmm_mask() const { + return host_isa_ != dnnl::impl::cpu::x64::avx512_core; + } void register_table_entries() override; size_t aux_vecs_count() const override; @@ -550,103 +646,132 @@ class jit_exp_emitter : public jit_emitter { class jit_erf_emitter : public jit_emitter { public: - jit_erf_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); + jit_erf_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); - jit_erf_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_erf_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); void emit_data() const override; size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; size_t aux_vecs_count() const override; - std::unique_ptr m_exp_emitter {nullptr}; + std::unique_ptr m_exp_emitter{nullptr}; }; class jit_soft_sign_emitter : public jit_emitter { public: - jit_soft_sign_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_soft_sign_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_soft_sign_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_soft_sign_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; void register_table_entries() override; }; class jit_is_finite_emitter : public jit_emitter { public: - jit_is_finite_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, - ov::element::Type execPrc = ov::element::f32) : jit_emitter(host, hostIsa, execPrc) { + jit_is_finite_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + ov::element::Type execPrc = ov::element::f32) + : jit_emitter(host, hostIsa, execPrc) { prepare_table(); } - jit_is_finite_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, const std::shared_ptr& node, - ov::element::Type execPrc = ov::element::f32) : jit_emitter(host, hostIsa, execPrc) { + jit_is_finite_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + const std::shared_ptr& node, + ov::element::Type execPrc = ov::element::f32) + : jit_emitter(host, hostIsa, execPrc) { prepare_table(); } - size_t get_inputs_num() const override { return 1; }; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr) { + size_t get_inputs_num() const override { + return 1; + }; + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr) { return {{element::f32}}; } protected: - size_t aux_gprs_count() const override { return (entry_map_.empty() ? 0 : 1) + 1; } + size_t aux_gprs_count() const override { + return (entry_map_.empty() ? 0 : 1) + 1; + } void register_table_entries() override; private: - void emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const override; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_is_inf_emitter : public jit_emitter { public: - jit_is_inf_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, - ov::element::Type execPrc = ov::element::f32, bool detect_negative = true, bool detect_positive = true) - : jit_emitter(host, hostIsa, execPrc), detect_negative(detect_negative), detect_positive(detect_positive) { + jit_is_inf_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + ov::element::Type execPrc = ov::element::f32, + bool detect_negative = true, + bool detect_positive = true) + : jit_emitter(host, hostIsa, execPrc), + detect_negative(detect_negative), + detect_positive(detect_positive) { prepare_table(); } - jit_is_inf_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, const std::shared_ptr& node, - ov::element::Type execPrc = ov::element::f32): jit_emitter(host, hostIsa, execPrc) { + jit_is_inf_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + const std::shared_ptr& node, + ov::element::Type execPrc = ov::element::f32) + : jit_emitter(host, hostIsa, execPrc) { prepare_table(); } - size_t get_inputs_num() const override { return 1; }; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr) { + size_t get_inputs_num() const override { + return 1; + }; + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr) { return {{element::f32}}; } protected: - size_t aux_gprs_count() const override { return (entry_map_.empty() ? 0 : 1) + 1; } + size_t aux_gprs_count() const override { + return (entry_map_.empty() ? 0 : 1) + 1; + } void register_table_entries() override; private: - void emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const override; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; bool detect_negative; bool detect_positive; @@ -654,58 +779,76 @@ class jit_is_inf_emitter : public jit_emitter { class jit_is_nan_emitter : public jit_emitter { public: - jit_is_nan_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, - ov::element::Type execPrc = ov::element::f32) : jit_emitter(host, hostIsa, execPrc) { + jit_is_nan_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + ov::element::Type execPrc = ov::element::f32) + : jit_emitter(host, hostIsa, execPrc) { prepare_table(); } - jit_is_nan_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t hostIsa, const std::shared_ptr& node, - ov::element::Type execPrc = ov::element::f32) : jit_emitter(host, hostIsa, execPrc) { + jit_is_nan_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t hostIsa, + const std::shared_ptr& node, + ov::element::Type execPrc = ov::element::f32) + : jit_emitter(host, hostIsa, execPrc) { prepare_table(); } - size_t get_inputs_num() const override { return 1; } - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr) { + size_t get_inputs_num() const override { + return 1; + } + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr) { return {{element::f32}}; } protected: - size_t aux_gprs_count() const override { return (entry_map_.empty() ? 0 : 1) + 1; } + size_t aux_gprs_count() const override { + return (entry_map_.empty() ? 0 : 1) + 1; + } void register_table_entries() override; private: - void emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const override; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_select_emitter : public jit_emitter { public: - jit_select_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_select_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::element::Type exec_prc = ov::element::f32); - jit_select_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, + jit_select_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); size_t aux_vecs_count() const override; private: - void emit_impl(const std::vector &in_vec_idxs, const std::vector &out_vec_idxs) const override; + 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; + void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; class jit_bitwise_and_emitter : public jit_emitter { public: - jit_bitwise_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_bitwise_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_and_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; @@ -716,13 +859,17 @@ class jit_bitwise_and_emitter : public jit_emitter { class jit_bitwise_not_emitter : public jit_emitter { public: - jit_bitwise_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_bitwise_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_not_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); size_t aux_vecs_count() const override; private: @@ -735,13 +882,17 @@ class jit_bitwise_not_emitter : public jit_emitter { class jit_bitwise_or_emitter : public jit_emitter { public: - jit_bitwise_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_bitwise_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_or_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; @@ -752,13 +903,17 @@ class jit_bitwise_or_emitter : public jit_emitter { class jit_bitwise_xor_emitter : public jit_emitter { public: - jit_bitwise_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32); - jit_bitwise_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n, - ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32); + jit_bitwise_xor_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n, + ov::element::Type exec_prc = ov::element::f32); size_t get_inputs_num() const override; - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + 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; @@ -767,5 +922,5 @@ class jit_bitwise_xor_emitter : public jit_emitter { void emit_isa(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.cpp index acbb04ea01af80..7ee4d5184b311a 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.cpp @@ -3,9 +3,11 @@ // #include "jit_emitter.hpp" + #include -#include "utils/general_utils.h" + #include "utils.hpp" +#include "utils/general_utils.h" using namespace dnnl::impl::cpu; using namespace dnnl::impl; @@ -19,11 +21,12 @@ size_t jit_emitter::get_max_vecs_count() const { } size_t jit_emitter::get_vec_length() const { - return one_of(host_isa_, cpu::x64::avx512_core, cpu::x64::avx512_core) ? 64 : - one_of(host_isa_, cpu::x64::avx2) ? 32 : 16; + return one_of(host_isa_, cpu::x64::avx512_core, cpu::x64::avx512_core) ? 64 + : one_of(host_isa_, cpu::x64::avx2) ? 32 + : 16; } -void jit_emitter::push_vec(const Xbyak::Address &addr, size_t vec_idx) const { +void jit_emitter::push_vec(const Xbyak::Address& addr, size_t vec_idx) const { if (host_isa_ == cpu::x64::sse41) { h->uni_vmovups(addr, Xmm(vec_idx)); } else if (host_isa_ == cpu::x64::avx2) { @@ -33,7 +36,7 @@ void jit_emitter::push_vec(const Xbyak::Address &addr, size_t vec_idx) const { } } -void jit_emitter::pop_vec(size_t vec_idx, const Xbyak::Address &addr) const { +void jit_emitter::pop_vec(size_t vec_idx, const Xbyak::Address& addr) const { if (host_isa_ == cpu::x64::sse41) { h->uni_vmovups(Xmm(vec_idx), addr); } else if (host_isa_ == cpu::x64::avx2) { @@ -60,11 +63,15 @@ std::set> jit_emitter::get_supported_precisions(const return {}; } -void jit_emitter::emitter_preamble(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_emitter::emitter_preamble(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { using namespace Xbyak::util; - bool is_vec_input = (in_out_type_ == emitter_in_out_map::vec_to_vec) || (in_out_type_ == emitter_in_out_map::vec_to_gpr); - bool is_vec_output = (in_out_type_ == emitter_in_out_map::vec_to_vec) || (in_out_type_ == emitter_in_out_map::gpr_to_vec); + bool is_vec_input = + (in_out_type_ == emitter_in_out_map::vec_to_vec) || (in_out_type_ == emitter_in_out_map::vec_to_gpr); + bool is_vec_output = + (in_out_type_ == emitter_in_out_map::vec_to_vec) || (in_out_type_ == emitter_in_out_map::gpr_to_vec); for (auto idx : pool_vec_idxs) aux_vec_idxs.push_back(idx); @@ -73,9 +80,11 @@ void jit_emitter::emitter_preamble(const std::vector &in_idxs, const std if (host_isa_ == cpu::x64::sse41 && aux_vecs_count() > 0) { size_t idx = 0; if (is_vec_input) - OV_CPU_JIT_EMITTER_ASSERT(std::find(in_idxs.begin(), in_idxs.end(), idx) == in_idxs.end(), "Xmm(0) cannot be input register in SSE41"); + OV_CPU_JIT_EMITTER_ASSERT(std::find(in_idxs.begin(), in_idxs.end(), idx) == in_idxs.end(), + "Xmm(0) cannot be input register in SSE41"); if (is_vec_output) - OV_CPU_JIT_EMITTER_ASSERT(std::find(out_idxs.begin(), out_idxs.end(), idx) == out_idxs.end(), "Xmm(0) cannot be output register in SSE41"); + OV_CPU_JIT_EMITTER_ASSERT(std::find(out_idxs.begin(), out_idxs.end(), idx) == out_idxs.end(), + "Xmm(0) cannot be output register in SSE41"); if (std::find(aux_vec_idxs.begin(), aux_vec_idxs.end(), idx) == aux_vec_idxs.end()) { aux_vec_idxs.push_back(idx); preserved_vec_idxs.push_back(idx); @@ -93,16 +102,21 @@ void jit_emitter::emitter_preamble(const std::vector &in_idxs, const std } for (size_t idx = 0; idx < get_max_vecs_count(); idx++) { - if (aux_vec_idxs.size() >= aux_vecs_count()) break; + if (aux_vec_idxs.size() >= aux_vecs_count()) + break; if (is_vec_input) { - if (std::find(in_idxs.begin(), in_idxs.end(), idx) != in_idxs.end()) continue; + if (std::find(in_idxs.begin(), in_idxs.end(), idx) != in_idxs.end()) + continue; } if (is_vec_output) { - if (std::find(out_idxs.begin(), out_idxs.end(), idx) != out_idxs.end()) continue; + if (std::find(out_idxs.begin(), out_idxs.end(), idx) != out_idxs.end()) + continue; } - if (std::find(aux_vec_idxs.begin(), aux_vec_idxs.end(), idx) != aux_vec_idxs.end()) continue; - if (std::find(preserved_vec_idxs.begin(), preserved_vec_idxs.end(), idx) != preserved_vec_idxs.end()) continue; + if (std::find(aux_vec_idxs.begin(), aux_vec_idxs.end(), idx) != aux_vec_idxs.end()) + continue; + if (std::find(preserved_vec_idxs.begin(), preserved_vec_idxs.end(), idx) != preserved_vec_idxs.end()) + continue; aux_vec_idxs.push_back(idx); preserved_vec_idxs.push_back(idx); @@ -115,18 +129,24 @@ void jit_emitter::emitter_preamble(const std::vector &in_idxs, const std aux_gpr_idxs.push_back(idx); for (size_t gpr_idx = 0; gpr_idx <= Operand::R15; ++gpr_idx) { - size_t _idx = Operand::R15 - gpr_idx; // we allocate from the end + size_t _idx = Operand::R15 - gpr_idx; // we allocate from the end - if (aux_gpr_idxs.size() >= aux_gprs_count()) break; - if (_idx == Operand::RSP) continue; + if (aux_gpr_idxs.size() >= aux_gprs_count()) + break; + if (_idx == Operand::RSP) + continue; if (!is_vec_input) { - if (std::find(in_idxs.begin(), in_idxs.end(), _idx) != in_idxs.end()) continue; + if (std::find(in_idxs.begin(), in_idxs.end(), _idx) != in_idxs.end()) + continue; } if (!is_vec_output) { - if (std::find(out_idxs.begin(), out_idxs.end(), _idx) != out_idxs.end()) continue; + if (std::find(out_idxs.begin(), out_idxs.end(), _idx) != out_idxs.end()) + continue; } - if (std::find(aux_gpr_idxs.begin(), aux_gpr_idxs.end(), _idx) != aux_gpr_idxs.end()) continue; - if (std::find(preserved_gpr_idxs.begin(), preserved_gpr_idxs.end(), _idx) != preserved_gpr_idxs.end()) continue; + if (std::find(aux_gpr_idxs.begin(), aux_gpr_idxs.end(), _idx) != aux_gpr_idxs.end()) + continue; + if (std::find(preserved_gpr_idxs.begin(), preserved_gpr_idxs.end(), _idx) != preserved_gpr_idxs.end()) + continue; aux_gpr_idxs.push_back(_idx); preserved_gpr_idxs.push_back(_idx); @@ -154,7 +174,6 @@ void jit_emitter::emitter_preamble(const std::vector &in_idxs, const std load_table_addr(); } - void jit_emitter::emitter_postamble() const { using namespace Xbyak::util; @@ -183,7 +202,7 @@ void jit_emitter::emit_data() const { // Run through the map and insert values stored there for (auto it = entry_map_.begin(); it != entry_map_.end(); it++) { - const auto &te = (*it).second; // get map entry for a given key + const auto& te = (*it).second; // get map entry for a given key const auto len = te.bcast ? get_vec_length() : sizeof(table_entry_val_t); for (size_t d = 0; d < len; d += sizeof(table_entry_val_t)) h->dd(te.val); @@ -199,14 +218,16 @@ void jit_emitter::prepare_table() { // prepare_table. size_t off = 0; for (auto it = entry_map_.begin(); it != entry_map_.end(); it++) { - auto &te = (*it).second; + auto& te = (*it).second; te.off = off; off += te.bcast ? get_vec_length() : sizeof(table_entry_val_t); } } -void jit_emitter::emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_emitter::emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { emitter_preamble(in_idxs, out_idxs, pool_vec_idxs, pool_gpr_idxs); emit_impl(in_idxs, out_idxs); @@ -214,5 +235,5 @@ void jit_emitter::emit_code(const std::vector &in_idxs, const std::vecto emitter_postamble(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.hpp index c5729613f1bfe5..04ac2e6ea0684d 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_emitter.hpp @@ -4,17 +4,17 @@ #pragma once -#include "cpu/x64/jit_generator.hpp" - -#include "snippets/snippets_isa.hpp" -#include "snippets/generator.hpp" -#include "emitters/utils.hpp" #include #include +#include "cpu/x64/jit_generator.hpp" +#include "emitters/utils.hpp" +#include "snippets/generator.hpp" +#include "snippets/snippets_isa.hpp" + #ifdef SNIPPETS_DEBUG_CAPS -#include "emitters/snippets/x64/verbose.hpp" +# include "emitters/snippets/x64/verbose.hpp" #endif namespace ov { @@ -34,14 +34,23 @@ struct emitter_params { class jit_emitter : public ov::snippets::Emitter { public: - jit_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type exec_prc = ov::element::f32, emitter_in_out_map in_out_type = emitter_in_out_map::vec_to_vec) - : Emitter(), h(host), host_isa_(host_isa), exec_prc_(exec_prc), l_table (new Xbyak::Label()), in_out_type_(in_out_type) { - k_mask = Xbyak::Opmask(1); // FIXME: in general case we need preserve k_mask state as well + jit_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type exec_prc = ov::element::f32, + emitter_in_out_map in_out_type = emitter_in_out_map::vec_to_vec) + : Emitter(), + h(host), + host_isa_(host_isa), + exec_prc_(exec_prc), + l_table(new Xbyak::Label()), + in_out_type_(in_out_type) { + k_mask = Xbyak::Opmask(1); // FIXME: in general case we need preserve k_mask state as well } - void emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; void emit_data() const override; virtual size_t get_inputs_num() const = 0; @@ -53,10 +62,11 @@ class jit_emitter : public ov::snippets::Emitter { * Precisions are ordered, the first bigger bitness precision with the same type will be selected. * Empty collection means the emitter supports any input precisions. */ - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); #ifdef SNIPPETS_DEBUG_CAPS - const char *info() const { + const char* info() const { if (!info_.is_initialized()) info_.init(this); return info_.c_str(); @@ -77,12 +87,14 @@ class jit_emitter : public ov::snippets::Emitter { virtual void prepare_table(); virtual void register_table_entries() {} - void load_table_addr() const { h->mov(p_table, *l_table.get()); } + void load_table_addr() const { + h->mov(p_table, *l_table.get()); + } // we accept only 32bit hexadecimal table values to avoid any rounding using table_entry_val_t = uint32_t; - using table_entry_offset_t = size_t; // offsets are in bytes wrt p_table - using table_entry_bcast_t = bool; // true => bcast value + using table_entry_offset_t = size_t; // offsets are in bytes wrt p_table + using table_entry_bcast_t = bool; // true => bcast value struct table_entry_t { table_entry_val_t val; @@ -106,10 +118,12 @@ class jit_emitter : public ov::snippets::Emitter { _cmp_gt_os = dnnl::impl::cpu::x64::jit_generator::_cmp_nle_us, }; - virtual void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const = 0; + virtual void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const = 0; - virtual void emitter_preamble(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const; + virtual void emitter_preamble(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const; virtual void emitter_postamble() const; emitter_in_out_map in_out_type_; @@ -132,14 +146,14 @@ class jit_emitter : public ov::snippets::Emitter { mapped_table_t entry_map_; void push_arg_entry_of(const std::string key, const table_entry_val_t val, const bool broadcast) { - mapped_table_entry_t te {0, val, broadcast}; + mapped_table_entry_t te{0, val, broadcast}; entry_map_.insert(std::make_pair(key, te)); } - void push_entries_of(const table_t &t) { + void push_entries_of(const table_t& t) { for (auto it = t.begin(); it != t.end(); it++) { auto key = (*it).first; - auto te = (*it).second; // copy values from table + auto te = (*it).second; // copy values from table push_arg_entry_of(key, te.val, te.bcast); } } @@ -155,20 +169,20 @@ class jit_emitter : public ov::snippets::Emitter { mutable std::vector preserved_vec_idxs; mutable std::vector preserved_gpr_idxs; - void push_vec(const Xbyak::Address &addr, size_t vec_idx) const; - void pop_vec(size_t vec_idx, const Xbyak::Address &addr) const; + void push_vec(const Xbyak::Address& addr, size_t vec_idx) const; + void pop_vec(size_t vec_idx, const Xbyak::Address& addr) const; size_t table_off(std::string& key, size_t key_off_val_shift = 0) const { // assumption: all table entries sharing the same key also // share their broadcast property // TODO: enforce through data structure - const auto it = entry_map_.find(key); // search an entry for a key + const auto it = entry_map_.find(key); // search an entry for a key OV_CPU_JIT_EMITTER_ASSERT(it != entry_map_.end(), "Value has not been found in the table"); - const auto &te = (*it).second; + const auto& te = (*it).second; const auto scale = te.bcast ? get_vec_length() : sizeof(table_entry_val_t); return te.off + key_off_val_shift * scale; } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.cpp index 893c18768a9511..513c1f70d22932 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.cpp @@ -3,6 +3,7 @@ // #include "jit_load_store_emitters.hpp" + #include "utils/bfloat16.hpp" using namespace dnnl::impl; @@ -16,19 +17,20 @@ using namespace Xbyak::util; // An auxiliary vector reg(data_reg_new) is used as destination vector for source pollution instructions, // After updated, processed with new vector and no more need to update as source is preserved. // e.g. with STORE_KEEP_SOURCE(vextractf128, xmm, Xmm(aux_src_idx), ymm, 1); -// if ymm is already updated, h->vextractf128(xmm, ymm, 1) is used, which change ymm values as xmm and ymm have the same index. -// if ymm is not updated, h->vextractf128(Xmm(aux_src_idx), ymm, 1) is used, which keep ymm values unchanged as destination is another vector reg. +// if ymm is already updated, h->vextractf128(xmm, ymm, 1) is used, which change ymm values as xmm and ymm have the +// same index. if ymm is not updated, h->vextractf128(Xmm(aux_src_idx), ymm, 1) is used, which keep ymm values +// unchanged as destination is another vector reg. #define STORE_KEEP_SOURCE(instruction, data_reg, data_reg_new, ...) \ - if (data_reg_updated) { \ - h->instruction(data_reg, __VA_ARGS__); \ - } else { \ - h->instruction(data_reg_new, __VA_ARGS__); \ - data_idx = aux_src_idx; \ - xmm = Xbyak::Xmm(data_idx); \ - ymm = Xbyak::Ymm(data_idx); \ - zmm = Xbyak::Zmm(data_idx); \ - vmm = Vmm(data_idx); \ - data_reg_updated = true; \ + if (data_reg_updated) { \ + h->instruction(data_reg, __VA_ARGS__); \ + } else { \ + h->instruction(data_reg_new, __VA_ARGS__); \ + data_idx = aux_src_idx; \ + xmm = Xbyak::Xmm(data_idx); \ + ymm = Xbyak::Ymm(data_idx); \ + zmm = Xbyak::Zmm(data_idx); \ + vmm = Vmm(data_idx); \ + data_reg_updated = true; \ } namespace ov { @@ -39,7 +41,7 @@ namespace { constexpr int threshold_for_mask_emu_load = 14; // heuristic threshold number by byte between mask store and emulation with several simple partial store constexpr int threshold_for_mask_emu_store = 6; -} // namespace +} // namespace size_t load_emitter_params::hash() const { size_t seed = 0; @@ -61,46 +63,69 @@ size_t store_emitter_params::hash() const { return seed; } -static int get_aux_regs_as_temp(const int elem_count, const int data_size, bool is_pure_move, bool is_store_as_real16, - const int avx512_threshold_for_mask = 0, const bool is_fill = false) { +static int get_aux_regs_as_temp(const int elem_count, + const int data_size, + bool is_pure_move, + bool is_store_as_real16, + const int avx512_threshold_for_mask = 0, + const bool is_fill = false) { if (mayiuse(cpu::x64::avx512_core) && is_fill) return 1; // for pure move, there are direct no-mask instructions to move on full xmm/ymm/zmm, so aux_gpr is not needed. // for move+convert: - // there are direct no-mask instructions to load i8/u8/i16/u16/bf16/fp16 to full xmm/ymm/zmm as f32/i32, so aux_gpr is not needed. - // there are direct no-mask instructions to store i32 on full xmm/ymm/zmm to i8/u8/i16/u16, so aux_gpr is not needed. - // store f32 on full xmm/ymm/zmm to bf16/fp16, need convert to bf16/fp16 on vmm, then store vmm to memory, use store_dword_to_word/byte_base condition. - // store_num == 16, vector: 16 * f32 -> 16 * bf16 -> ymm(256bit) -> store - // store_num == 8, vector: 8 * f32 -> 8 * bf16 -> xmm(128bit) -> store - // store_num == 4, vector: 4 * f32 -> 4 * bf16 -> 64bit -> masked instruction with aux_gpr needed - // f32<->i32 is on full vmm, so aux_gpr is not needed. + // there are direct no-mask instructions to load i8/u8/i16/u16/bf16/fp16 to full xmm/ymm/zmm as f32/i32, so aux_gpr + // is not needed. there are direct no-mask instructions to store i32 on full xmm/ymm/zmm to i8/u8/i16/u16, so + // aux_gpr is not needed. store f32 on full xmm/ymm/zmm to bf16/fp16, need convert to bf16/fp16 on vmm, then store + // vmm to memory, use store_dword_to_word/byte_base condition. store_num == 16, vector: 16 * f32 -> 16 * bf16 -> + // ymm(256bit) -> store store_num == 8, vector: 8 * f32 -> 8 * bf16 -> xmm(128bit) -> store store_num == 4, + // vector: 4 * f32 -> 4 * bf16 -> 64bit -> masked instruction with aux_gpr needed f32<->i32 is on full vmm, + // so aux_gpr is not needed. const int byte_size = elem_count * data_size; - if ((is_pure_move && one_of(byte_size, 16, 32, 64)) || (!is_pure_move && one_of(elem_count, 4, 8, 16) && !is_store_as_real16)) + if ((is_pure_move && one_of(byte_size, 16, 32, 64)) || + (!is_pure_move && one_of(elem_count, 4, 8, 16) && !is_store_as_real16)) return 0; - if ((mayiuse(cpu::x64::avx512_core) && (byte_size > avx512_threshold_for_mask)) || (one_of(byte_size % 16, 1, 2, 3))) + if ((mayiuse(cpu::x64::avx512_core) && (byte_size > avx512_threshold_for_mask)) || + (one_of(byte_size % 16, 1, 2, 3))) return 1; return 0; } /// LOAD /// -jit_load_emitter::jit_load_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type src_prc, ov::element::Type dst_prc, int load_num, ov::element::Type exec_prc, - bool is_fill, std::string fill_value, emitter_in_out_map in_out_type) -: jit_emitter(host, host_isa, exec_prc, in_out_type), name_("unknown"), load_num_(load_num), src_prc_(src_prc), - dst_prc_(dst_prc), is_fill_(is_fill), fill_value_(fill_value) { +jit_load_emitter::jit_load_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type src_prc, + ov::element::Type dst_prc, + int load_num, + ov::element::Type exec_prc, + bool is_fill, + std::string fill_value, + emitter_in_out_map in_out_type) + : jit_emitter(host, host_isa, exec_prc, in_out_type), + name_("unknown"), + load_num_(load_num), + src_prc_(src_prc), + dst_prc_(dst_prc), + is_fill_(is_fill), + fill_value_(fill_value) { prepare_table(); load_size_ = load_num * src_prc.size(); v_len_elt_ = get_vec_length() / exec_prc.size(); } -size_t jit_load_emitter::get_inputs_num() const { return 1; } +size_t jit_load_emitter::get_inputs_num() const { + return 1; +} size_t jit_load_emitter::aux_gprs_count() const { // 0 for temp reg for mask load in avx512 if needed - const auto is_pure_load = (src_prc_ == dst_prc_) || - (one_of(src_prc_, ov::element::f32, ov::element::i32) && - one_of(dst_prc_, ov::element::f32, ov::element::i32)); - int count = get_aux_regs_as_temp(load_num_, static_cast(src_prc_.size()), is_pure_load, false, threshold_for_mask_emu_load, is_fill_); + const auto is_pure_load = (src_prc_ == dst_prc_) || (one_of(src_prc_, ov::element::f32, ov::element::i32) && + one_of(dst_prc_, ov::element::f32, ov::element::i32)); + int count = get_aux_regs_as_temp(load_num_, + static_cast(src_prc_.size()), + is_pure_load, + false, + threshold_for_mask_emu_load, + is_fill_); // 1 for table address if (is_fill_) @@ -109,7 +134,7 @@ size_t jit_load_emitter::aux_gprs_count() const { return count; } -void jit_load_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_load_emitter::emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const { // offset in load emitter is the offset of src gpr register, should be parsed from in_idxs. const int offset = in_idxs.size() == 2 ? in_idxs[1] : 0; if (host_isa_ == cpu::x64::sse41) { @@ -124,7 +149,7 @@ void jit_load_emitter::emit_impl(const std::vector &in_idxs, const std:: } template -void jit_load_emitter::emit_isa(const Xbyak::Reg64 ®_src, const int out_vec_idx, const int offset) const { +void jit_load_emitter::emit_isa(const Xbyak::Reg64& reg_src, const int out_vec_idx, const int offset) const { bool matched_prc = (dst_prc_ == src_prc_) || (dst_prc_ == ov::element::f32) || (dst_prc_ == ov::element::i32); if (!matched_prc) { OV_CPU_JIT_EMITTER_THROW("only support output precision of FP32 or I32 or the same precision as input."); @@ -139,43 +164,43 @@ void jit_load_emitter::emit_isa(const Xbyak::Reg64 ®_src, const int out_vec_i if (src_prc_ == dst_prc_) { load_bytes(Vmm(out_vec_idx), reg_src, offset, load_size_); } else { - // "pure load" + convert. dst_prc must be FP32 or I32. + // "pure load" + convert. dst_prc must be FP32 or I32. switch (src_prc_) { - case ov::element::f32: - case ov::element::i32: - load_bytes(Vmm(out_vec_idx), reg_src, offset, load_size_); - break; - case ov::element::i8: - load_bytes_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, true, load_size_); - break; - case ov::element::u8: - load_bytes_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, false, load_size_); - break; - case ov::element::i16: - case ov::element::u16: - case ov::element::bf16: - case ov::element::f16: - load_words_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, src_prc_, load_size_); - break; - default: - OV_CPU_JIT_EMITTER_THROW("has unsupported src precision to load."); + case ov::element::f32: + case ov::element::i32: + load_bytes(Vmm(out_vec_idx), reg_src, offset, load_size_); + break; + case ov::element::i8: + load_bytes_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, true, load_size_); + break; + case ov::element::u8: + load_bytes_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, false, load_size_); + break; + case ov::element::i16: + case ov::element::u16: + case ov::element::bf16: + case ov::element::f16: + load_words_to_dword_extension(Vmm(out_vec_idx), reg_src, offset, src_prc_, load_size_); + break; + default: + OV_CPU_JIT_EMITTER_THROW("has unsupported src precision to load."); } } // post convert between I32 and FP32 if (src_prc_ != dst_prc_) { switch (dst_prc_) { - case ov::element::f32: - if (!src_prc_.is_real()) - h->uni_vcvtdq2ps(Vmm(out_vec_idx), Vmm(out_vec_idx)); - break; - case ov::element::i32: - if (src_prc_.is_real()) { - h->uni_vcvtps2dq(Vmm(out_vec_idx), Vmm(out_vec_idx)); - } - break; - default: - break; + case ov::element::f32: + if (!src_prc_.is_real()) + h->uni_vcvtdq2ps(Vmm(out_vec_idx), Vmm(out_vec_idx)); + break; + case ov::element::i32: + if (src_prc_.is_real()) { + h->uni_vcvtps2dq(Vmm(out_vec_idx), Vmm(out_vec_idx)); + } + break; + default: + break; } } @@ -186,19 +211,19 @@ void jit_load_emitter::emit_isa(const Xbyak::Reg64 ®_src, const int out_vec_i } /** -* load_bytes is the utility function to facilitate loading of -* load_size (0 <= load_size <= 64) many contiguous bytes into the Xmm/Ymm/Zmm -* register from the memory referenced by ptr[reg + offset] address. -* -* Functionally, invocation of load_bytes is equivalent to -* the following loop: -* -* for (int idx = 0; idx < load_size; ++idx) -* vpinsrb(vmm, vmm, ptr[reg + offset + idx], idx); -* -*/ + * load_bytes is the utility function to facilitate loading of + * load_size (0 <= load_size <= 64) many contiguous bytes into the Xmm/Ymm/Zmm + * register from the memory referenced by ptr[reg + offset] address. + * + * Functionally, invocation of load_bytes is equivalent to + * the following loop: + * + * for (int idx = 0; idx < load_size; ++idx) + * vpinsrb(vmm, vmm, ptr[reg + offset + idx], idx); + * + */ template -void jit_load_emitter::load_bytes(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, int load_size) const { +void jit_load_emitter::load_bytes(const Vmm& vmm, const Xbyak::Reg64& reg, int offset, int load_size) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -249,14 +274,17 @@ void jit_load_emitter::load_bytes(const Vmm &vmm, const Xbyak::Reg64 ®, int o } // Cornerstone of partial load is combinaion of vpinsrb/w/d. - // As vpinsrb/w/d will not only write(insert) values into vmm, but also read values in vmm to copy from to positions that not in imm mask, - // this could introduce RAW false dependency(we actually do not care about values not in imm mask). - // To eliminate this false dependency, + // As vpinsrb/w/d will not only write(insert) values into vmm, but also read values in vmm to copy from to + // positions that not in imm mask, this could introduce RAW false dependency(we actually do not care about + // values not in imm mask). To eliminate this false dependency, // 1. For 1/2/3/4 bytes tails, replace vpinsrb/w/d with mov,shl etc instructions that don't read vmm. - // Besides eliminate RAW, these instructions have smaller latency, which also bring better perf, especially for small loop iteration case. + // Besides eliminate RAW, these instructions have smaller latency, which also bring better perf, especially + // for small loop iteration case. // 2. For 8/16 bytes, use vmovq/vmovdqu instructions to load, which also don't read src vmm. - // 3. For other size, insert vpxor before vpinsrb/w/d. vpxor and read vmm instructions in previous loop have WAR(write after read) relationship. - // CPU can identify this scenario and assign another physical vector register(register renameing) in next loop to eliminate RAW. + // 3. For other size, insert vpxor before vpinsrb/w/d. vpxor and read vmm instructions in previous loop have + // WAR(write after read) relationship. + // CPU can identify this scenario and assign another physical vector register(register renameing) in next + // loop to eliminate RAW. if (!one_of(bytes_to_load, 0, 1, 2, 3, 4, 8, 16)) { h->uni_vpxor(vmm, vmm, vmm); } @@ -266,121 +294,136 @@ void jit_load_emitter::load_bytes(const Vmm &vmm, const Xbyak::Reg64 ®, int o h->uni_vmovdqu(xmm, addr(start_bytes)); switch (bytes_to_load) { - case 0: break; - case 1: - h->movzx(Reg32(aux_gpr_idxs[0]), addr(start_bytes)); - h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); - break; - case 2: - h->movzx(Reg32(aux_gpr_idxs[0]), word_addr(start_bytes)); - h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); - break; - case 3: - h->movzx(Reg32(aux_gpr_idxs[0]), addr(start_bytes + 2)); - h->shl(Reg32(aux_gpr_idxs[0]), 16); - h->mov(Reg16(aux_gpr_idxs[0]), word_addr(start_bytes)); - h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); - break; - case 4: h->uni_vmovss(xmm, addr(start_bytes)); break; - case 5: - h->uni_vmovss(xmm, addr(start_bytes)); - h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 4), 4); - break; - case 6: - h->uni_vmovss(xmm, addr(start_bytes)); - h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 4), 2); - break; - case 7: - h->uni_vmovss(xmm, addr(start_bytes)); - h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 4), 2); - h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 6), 6); - break; - case 8: break; - case 9: h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 8), 8); break; - case 10: h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 8), 4); break; - case 11: - h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 8), 4); - h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 10), 10); - break; - case 12: h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); break; - case 13: - h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); - h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 12), 12); - break; - case 14: - h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); - h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 12), 6); - break; - case 15: - h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); - h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 12), 6); - h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 14), 14); - break; - case 16: break; - default: - OV_CPU_JIT_EMITTER_THROW("has unexpected number of values to load in load_byte."); + case 0: + break; + case 1: + h->movzx(Reg32(aux_gpr_idxs[0]), addr(start_bytes)); + h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); + break; + case 2: + h->movzx(Reg32(aux_gpr_idxs[0]), word_addr(start_bytes)); + h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); + break; + case 3: + h->movzx(Reg32(aux_gpr_idxs[0]), addr(start_bytes + 2)); + h->shl(Reg32(aux_gpr_idxs[0]), 16); + h->mov(Reg16(aux_gpr_idxs[0]), word_addr(start_bytes)); + h->uni_vmovq(xmm, Reg64(aux_gpr_idxs[0])); + break; + case 4: + h->uni_vmovss(xmm, addr(start_bytes)); + break; + case 5: + h->uni_vmovss(xmm, addr(start_bytes)); + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 4), 4); + break; + case 6: + h->uni_vmovss(xmm, addr(start_bytes)); + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 4), 2); + break; + case 7: + h->uni_vmovss(xmm, addr(start_bytes)); + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 4), 2); + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 6), 6); + break; + case 8: + break; + case 9: + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 8), 8); + break; + case 10: + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 8), 4); + break; + case 11: + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 8), 4); + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 10), 10); + break; + case 12: + h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); + break; + case 13: + h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 12), 12); + break; + case 14: + h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 12), 6); + break; + case 15: + h->uni_vpinsrd(xmm, xmm, addr(start_bytes + 8), 2); + h->uni_vpinsrw(xmm, xmm, addr(start_bytes + 12), 6); + h->uni_vpinsrb(xmm, xmm, addr(start_bytes + 14), 14); + break; + case 16: + break; + default: + OV_CPU_JIT_EMITTER_THROW("has unexpected number of values to load in load_byte."); } if (has_xmm_block) { - h->vinsertf128(ymm, ymm, xmm, 1); // insert to upper bits of ymm + h->vinsertf128(ymm, ymm, xmm, 1); // insert to upper bits of ymm if (has_ymm_block) - h->vinsertf128(ymm, ymm, addr(32), 0); // insert to lower bits of ymm + h->vinsertf128(ymm, ymm, addr(32), 0); // insert to lower bits of ymm else - h->vinsertf128(ymm, ymm, addr(0), 0); // insert to lower bits of ymm + h->vinsertf128(ymm, ymm, addr(0), 0); // insert to lower bits of ymm } if (has_ymm_block) { - h->vinsertf64x4(zmm, zmm, ymm, 1); // insert to upper bits of zmm - h->vinsertf64x4(zmm, zmm, addr(0), 0); // insert to lower bits of zmm + h->vinsertf64x4(zmm, zmm, ymm, 1); // insert to upper bits of zmm + h->vinsertf64x4(zmm, zmm, addr(0), 0); // insert to lower bits of zmm } }; switch (load_size) { - case 64: - h->uni_vmovdqu(zmm, addr(0)); - break; - case 32: - h->uni_vmovdqu(ymm, addr(0)); - break; - case 16: - h->uni_vmovdqu(xmm, addr(0)); - break; - default: { - if (mayiuse(cpu::x64::avx512_core) && load_size > threshold_for_mask_emu_load) { - uint64_t mask = 1; - mask = (mask << load_size) - mask; - h->mov(Reg64(aux_gpr_idxs[0]), mask); - h->kmovq(k_mask, Reg64(aux_gpr_idxs[0])); - h->vmovdqu8(zmm | k_mask | T_z, addr(0)); - } else { - load_byte_base(); - } - break; + case 64: + h->uni_vmovdqu(zmm, addr(0)); + break; + case 32: + h->uni_vmovdqu(ymm, addr(0)); + break; + case 16: + h->uni_vmovdqu(xmm, addr(0)); + break; + default: { + if (mayiuse(cpu::x64::avx512_core) && load_size > threshold_for_mask_emu_load) { + uint64_t mask = 1; + mask = (mask << load_size) - mask; + h->mov(Reg64(aux_gpr_idxs[0]), mask); + h->kmovq(k_mask, Reg64(aux_gpr_idxs[0])); + h->vmovdqu8(zmm | k_mask | T_z, addr(0)); + } else { + load_byte_base(); } + break; + } } } /** -* load_bytes_to_dword_extension is the utility function to facilitate -* loading of load_size (0 <= load_size <= 16) many contiguous bytes in -* the xmm register from the memory referenced by ptr[reg + offset] -* address and then do signed/zero extension of those to double words. -* -* Functionally, invocation of load_bytes_to_dword_extension is equivalent -* to the following: -* -* for (int idx = 0; idx < load_size; ++idx) -* vpinsrb(vmm, vmm, ptr[reg + offset + idx], idx); -* if (is_signed) vpmovsxbd(vmm, vmm); else vpmovzxbd(vmm, vmm); -* -* Valid values for the load_size variable are: -* [0..4] for XMM version of the function, i.e. 4 bytes -> 4 * 32 bit == 128 bit -* [0..8] for YMM version of the function. i.e. 8 bytes -> 8 * 32 bit == 256 bit -* [0..16] for ZMM version of the function. i.e. 16 bytes -> 16 * 32 bit == 512 bit -*/ + * load_bytes_to_dword_extension is the utility function to facilitate + * loading of load_size (0 <= load_size <= 16) many contiguous bytes in + * the xmm register from the memory referenced by ptr[reg + offset] + * address and then do signed/zero extension of those to double words. + * + * Functionally, invocation of load_bytes_to_dword_extension is equivalent + * to the following: + * + * for (int idx = 0; idx < load_size; ++idx) + * vpinsrb(vmm, vmm, ptr[reg + offset + idx], idx); + * if (is_signed) vpmovsxbd(vmm, vmm); else vpmovzxbd(vmm, vmm); + * + * Valid values for the load_size variable are: + * [0..4] for XMM version of the function, i.e. 4 bytes -> 4 * 32 bit == 128 bit + * [0..8] for YMM version of the function. i.e. 8 bytes -> 8 * 32 bit == 256 bit + * [0..16] for ZMM version of the function. i.e. 16 bytes -> 16 * 32 bit == 512 bit + */ template -void jit_load_emitter::load_bytes_to_dword_extension(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, bool is_signed, int load_size) const { +void jit_load_emitter::load_bytes_to_dword_extension(const Vmm& vmm, + const Xbyak::Reg64& reg, + int offset, + bool is_signed, + int load_size) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -401,76 +444,80 @@ void jit_load_emitter::load_bytes_to_dword_extension(const Vmm &vmm, const Xbyak // For load_size == 4/8/16, do load/extension in one go switch (load_size) { - case 16: { - // full size of zmm - const auto zmm = Xbyak::Zmm(vmm.getIdx()); - if (is_signed) - h->uni_vpmovsxbd(zmm, ptr[reg + offset]); - else - h->uni_vpmovzxbd(zmm, ptr[reg + offset]); - break; - } - case 8: { - // full size of ymm or ymm_block of zmm - const auto ymm = Xbyak::Ymm(vmm.getIdx()); + case 16: { + // full size of zmm + const auto zmm = Xbyak::Zmm(vmm.getIdx()); + if (is_signed) + h->uni_vpmovsxbd(zmm, ptr[reg + offset]); + else + h->uni_vpmovzxbd(zmm, ptr[reg + offset]); + break; + } + case 8: { + // full size of ymm or ymm_block of zmm + const auto ymm = Xbyak::Ymm(vmm.getIdx()); + if (is_signed) + h->uni_vpmovsxbd(ymm, ptr[reg + offset]); + else + h->uni_vpmovzxbd(ymm, ptr[reg + offset]); + break; + } + case 4: { + // full size of xmm or xmm_block of ymm/zmm + const auto xmm = Xbyak::Xmm(vmm.getIdx()); + if (is_signed) + h->uni_vpmovsxbd(xmm, ptr[reg + offset]); + else + h->uni_vpmovzxbd(xmm, ptr[reg + offset]); + break; + } + default: { + if (is_zmm && load_size > threshold_for_mask_emu_load) { + unsigned int mask = 1; + mask = (mask << load_size) - mask; + h->mov(Reg32(aux_gpr_idxs[0]), mask); + h->kmovw(k_mask, Reg32(aux_gpr_idxs[0])); if (is_signed) - h->uni_vpmovsxbd(ymm, ptr[reg + offset]); + h->uni_vpmovsxbd(vmm | k_mask | T_z, ptr[reg + offset]); else - h->uni_vpmovzxbd(ymm, ptr[reg + offset]); - break; - } - case 4: { - // full size of xmm or xmm_block of ymm/zmm + h->uni_vpmovzxbd(vmm | k_mask | T_z, ptr[reg + offset]); + } else { const auto xmm = Xbyak::Xmm(vmm.getIdx()); + load_bytes(xmm, reg, offset, load_size); if (is_signed) - h->uni_vpmovsxbd(xmm, ptr[reg + offset]); + h->uni_vpmovsxbd(vmm, xmm); else - h->uni_vpmovzxbd(xmm, ptr[reg + offset]); - break; - } - default: { - if (is_zmm && load_size > threshold_for_mask_emu_load) { - unsigned int mask = 1; - mask = (mask << load_size) - mask; - h->mov(Reg32(aux_gpr_idxs[0]), mask); - h->kmovw(k_mask, Reg32(aux_gpr_idxs[0])); - if (is_signed) - h->uni_vpmovsxbd(vmm | k_mask | T_z, ptr[reg + offset]); - else - h->uni_vpmovzxbd(vmm | k_mask | T_z, ptr[reg + offset]); - } else { - const auto xmm = Xbyak::Xmm(vmm.getIdx()); - load_bytes(xmm, reg, offset, load_size); - if (is_signed) - h->uni_vpmovsxbd(vmm, xmm); - else - h->uni_vpmovzxbd(vmm, xmm); - } - break; + h->uni_vpmovzxbd(vmm, xmm); } + break; + } } } /** -* load_words_to_dword_extension is the utility function to facilitate -* loading of load_size (0 <= load_size <= 32) byte many contiguous words(num == load_size / 2) -* in the Vmm register from the memory referenced by ptr[reg + offset] -* address and then do signed/zero extension of those to double words. -* -* Functionally, invocation of load_words_to_dword_extension is equivalent -* to the following extended pseudo code: -* -* for (int idx = 0; idx < load_size / 2; ++idx) -* vpinsrw(vmm, vmm, ptr[reg + offset + 2 * idx], idx); -* if (is_signed) vpmovsxwd(vmm, vmm); else vpmovzxwd(vmm, vmm); -* -* Valid values for the load_size variable are: -* [0..8] for XMM version of the function. i.e. 4 words -> 4 * 32 bit == 128 bit -* [0..16] for YMM version of the function. i.e. 8 words -> 8 * 32 bit == 256 bit -* [0.. 32] for ZMM version of the function. i.e. 16 words -> 16 * 32 bit == 512 bit -*/ + * load_words_to_dword_extension is the utility function to facilitate + * loading of load_size (0 <= load_size <= 32) byte many contiguous words(num == load_size / 2) + * in the Vmm register from the memory referenced by ptr[reg + offset] + * address and then do signed/zero extension of those to double words. + * + * Functionally, invocation of load_words_to_dword_extension is equivalent + * to the following extended pseudo code: + * + * for (int idx = 0; idx < load_size / 2; ++idx) + * vpinsrw(vmm, vmm, ptr[reg + offset + 2 * idx], idx); + * if (is_signed) vpmovsxwd(vmm, vmm); else vpmovzxwd(vmm, vmm); + * + * Valid values for the load_size variable are: + * [0..8] for XMM version of the function. i.e. 4 words -> 4 * 32 bit == 128 bit + * [0..16] for YMM version of the function. i.e. 8 words -> 8 * 32 bit == 256 bit + * [0.. 32] for ZMM version of the function. i.e. 16 words -> 16 * 32 bit == 512 bit + */ template -void jit_load_emitter::load_words_to_dword_extension(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, ov::element::Type prc, int load_size) const { +void jit_load_emitter::load_words_to_dword_extension(const Vmm& vmm, + const Xbyak::Reg64& reg, + int offset, + ov::element::Type prc, + int load_size) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -503,87 +550,87 @@ void jit_load_emitter::load_words_to_dword_extension(const Vmm &vmm, const Xbyak // For load_size == 32/16/8, do load/extension in one go // including xmm/ymm tail block for ymm/zmm, so explicite xmm/ymm/zmm switch (load_size) { - case 32: { - if (is_bf16) { + case 32: { + if (is_bf16) { + h->uni_vpmovzxwd(zmm, ptr[reg + offset]); + h->uni_vpslld(zmm, zmm, 16); + } else if (is_f16) { + h->vcvtph2ps(zmm, ptr[reg + offset]); + } else { + if (is_signed) + h->uni_vpmovsxwd(zmm, ptr[reg + offset]); + else h->uni_vpmovzxwd(zmm, ptr[reg + offset]); - h->uni_vpslld(zmm, zmm, 16); - } else if (is_f16) { - h->vcvtph2ps(zmm, ptr[reg + offset]); - } else { - if (is_signed) - h->uni_vpmovsxwd(zmm, ptr[reg + offset]); - else - h->uni_vpmovzxwd(zmm, ptr[reg + offset]); - } - break; } - case 16: { - if (is_bf16) { + break; + } + case 16: { + if (is_bf16) { + h->uni_vpmovzxwd(ymm, ptr[reg + offset]); + h->uni_vpslld(ymm, ymm, 16); + } else if (is_f16) { + h->vcvtph2ps(ymm, ptr[reg + offset]); + } else { + if (is_signed) + h->uni_vpmovsxwd(ymm, ptr[reg + offset]); + else h->uni_vpmovzxwd(ymm, ptr[reg + offset]); - h->uni_vpslld(ymm, ymm, 16); + } + break; + } + case 8: { + if (is_bf16) { + h->uni_vpmovzxwd(xmm, ptr[reg + offset]); + h->uni_vpslld(xmm, xmm, 16); + } else if (is_f16) { + h->vcvtph2ps(xmm, ptr[reg + offset]); + } else { + if (is_signed) + h->uni_vpmovsxwd(xmm, ptr[reg + offset]); + else + h->uni_vpmovzxwd(xmm, ptr[reg + offset]); + } + break; + } + default: { + if (is_zmm && load_size > threshold_for_mask_emu_load) { + unsigned int mask = 1; + mask = (mask << (load_size / 2)) - mask; + h->mov(Reg32(aux_gpr_idxs[0]), mask); + h->kmovw(k_mask, Reg32(aux_gpr_idxs[0])); + if (is_bf16) { + h->uni_vpmovzxwd(vmm | k_mask | T_z, ptr[reg + offset]); + h->uni_vpslld(vmm, vmm, 16); } else if (is_f16) { - h->vcvtph2ps(ymm, ptr[reg + offset]); + h->vcvtph2ps(vmm | k_mask | T_z, ptr[reg + offset]); } else { if (is_signed) - h->uni_vpmovsxwd(ymm, ptr[reg + offset]); + h->uni_vpmovsxwd(vmm | k_mask | T_z, ptr[reg + offset]); else - h->uni_vpmovzxwd(ymm, ptr[reg + offset]); + h->uni_vpmovzxwd(vmm | k_mask | T_z, ptr[reg + offset]); } - break; - } - case 8: { + } else { + // xmm or ymm version + load_bytes(xmm, reg, offset, load_size); if (is_bf16) { - h->uni_vpmovzxwd(xmm, ptr[reg + offset]); - h->uni_vpslld(xmm, xmm, 16); + h->uni_vpmovzxwd(vmm, xmm); + h->uni_vpslld(vmm, vmm, 16); } else if (is_f16) { - h->vcvtph2ps(xmm, ptr[reg + offset]); + h->vcvtph2ps(ymm, xmm); } else { if (is_signed) - h->uni_vpmovsxwd(xmm, ptr[reg + offset]); + h->uni_vpmovsxwd(vmm, xmm); else - h->uni_vpmovzxwd(xmm, ptr[reg + offset]); - } - break; - } - default: { - if (is_zmm && load_size > threshold_for_mask_emu_load) { - unsigned int mask = 1; - mask = (mask << (load_size / 2)) - mask; - h->mov(Reg32(aux_gpr_idxs[0]), mask); - h->kmovw(k_mask, Reg32(aux_gpr_idxs[0])); - if (is_bf16) { - h->uni_vpmovzxwd(vmm | k_mask | T_z, ptr[reg + offset]); - h->uni_vpslld(vmm, vmm, 16); - } else if (is_f16) { - h->vcvtph2ps(vmm | k_mask | T_z, ptr[reg + offset]); - } else { - if (is_signed) - h->uni_vpmovsxwd(vmm | k_mask | T_z, ptr[reg + offset]); - else - h->uni_vpmovzxwd(vmm | k_mask | T_z, ptr[reg + offset]); - } - } else { - // xmm or ymm version - load_bytes(xmm, reg, offset, load_size); - if (is_bf16) { h->uni_vpmovzxwd(vmm, xmm); - h->uni_vpslld(vmm, vmm, 16); - } else if (is_f16) { - h->vcvtph2ps(ymm, xmm); - } else { - if (is_signed) - h->uni_vpmovsxwd(vmm, xmm); - else - h->uni_vpmovzxwd(vmm, xmm); - } } - break; } + break; + } } } template -void jit_load_emitter::fill_with_default(const Vmm &vmm, std::string fill_value, const int &load_num) const { +void jit_load_emitter::fill_with_default(const Vmm& vmm, std::string fill_value, const int& load_num) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -614,10 +661,20 @@ void jit_load_emitter::register_table_entries() { } /// STORE /// -jit_store_emitter::jit_store_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type src_prc, ov::element::Type dst_prc, int store_num, arithmetic_mode mode, ov::element::Type exec_prc, +jit_store_emitter::jit_store_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type src_prc, + ov::element::Type dst_prc, + int store_num, + arithmetic_mode mode, + ov::element::Type exec_prc, emitter_in_out_map in_out_type) - : jit_emitter(host, host_isa, exec_prc, in_out_type), name_("unknown"), store_num_(store_num), src_prc_(src_prc), dst_prc_(dst_prc), mode_(mode) { + : jit_emitter(host, host_isa, exec_prc, in_out_type), + name_("unknown"), + store_num_(store_num), + src_prc_(src_prc), + dst_prc_(dst_prc), + mode_(mode) { prepare_table(); v_len_elt_ = get_vec_length() / exec_prc.size(); store_size_ = store_num * dst_prc.size(); @@ -630,17 +687,20 @@ inline bool jit_store_emitter::is_saturation() const { // case for SSE and AVX2 when we should use AND to truncate values inline bool jit_store_emitter::is_truncation_emulation() const { - return !mayiuse(cpu::x64::avx512_core) && !is_saturation() && - src_prc_ != dst_prc_ && one_of(dst_prc_, ov::element::u16, ov::element::i16, ov::element::u8, ov::element::i8); + return !mayiuse(cpu::x64::avx512_core) && !is_saturation() && src_prc_ != dst_prc_ && + one_of(dst_prc_, ov::element::u16, ov::element::i16, ov::element::u8, ov::element::i8); } size_t jit_store_emitter::aux_gprs_count() const { // for temp reg for store(mask version or special number cases) - const auto is_pure_store = (src_prc_ == dst_prc_) || - (one_of(src_prc_, ov::element::f32, ov::element::i32) && - one_of(dst_prc_, ov::element::f32, ov::element::i32)); + const auto is_pure_store = (src_prc_ == dst_prc_) || (one_of(src_prc_, ov::element::f32, ov::element::i32) && + one_of(dst_prc_, ov::element::f32, ov::element::i32)); const auto is_store_as_real16 = one_of(dst_prc_, ov::element::bf16, ov::element::f16); - int count = get_aux_regs_as_temp(store_num_, static_cast(dst_prc_.size()), is_pure_store, is_store_as_real16, threshold_for_mask_emu_store); + int count = get_aux_regs_as_temp(store_num_, + static_cast(dst_prc_.size()), + is_pure_store, + is_store_as_real16, + threshold_for_mask_emu_store); // for table value in truncation arithmetic mode if (is_truncation_emulation()) @@ -661,14 +721,17 @@ size_t jit_store_emitter::aux_vecs_count() const { if ((host_isa_ == cpu::x64::sse41) && (src_prc_ == ov::element::f32 && dst_prc_ == ov::element::bf16)) count++; - // zero value, zeroed and passed from caller from performance standpoint(zeroed one time and not need preserve and restore status) + // zero value, zeroed and passed from caller from performance standpoint(zeroed one time and not need preserve and + // restore status) if (mayiuse(cpu::x64::avx512_core) && one_of(dst_prc_, ov::element::u8, ov::element::u16)) count++; return count; } -size_t jit_store_emitter::get_inputs_num() const { return 1; } +size_t jit_store_emitter::get_inputs_num() const { + return 1; +} void jit_store_emitter::emit_data() const { jit_emitter::emit_data(); @@ -676,7 +739,7 @@ void jit_store_emitter::emit_data() const { uni_vcvtneps2bf16_->emit_data(); } -void jit_store_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_store_emitter::emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const { // offset in store emitter is the offset of dst gpr register, should be parsed from out_idxs. const int offset = out_idxs.size() == 2 ? out_idxs[1] : 0; if (host_isa_ == cpu::x64::sse41) { @@ -691,7 +754,7 @@ void jit_store_emitter::emit_impl(const std::vector &in_idxs, const std: } template -void jit_store_emitter::emit_isa(const int in_vec_idx, const Xbyak::Reg64 ®_dst, const int offset) const { +void jit_store_emitter::emit_isa(const int in_vec_idx, const Xbyak::Reg64& reg_dst, const int offset) const { bool matched_prc = (src_prc_ == dst_prc_) || (src_prc_ == ov::element::f32) || (src_prc_ == ov::element::i32); if (!matched_prc) { OV_CPU_JIT_EMITTER_THROW("only support input precision of FP32 or I32 or the same precision as output."); @@ -707,29 +770,29 @@ void jit_store_emitter::emit_isa(const int in_vec_idx, const Xbyak::Reg64 ®_d data_idx = in_vec_idx; data_reg_updated = false; if (!aux_vec_idxs.empty()) - aux_src_idx = aux_vec_idxs.back(); // to avoid src pollution + aux_src_idx = aux_vec_idxs.back(); // to avoid src pollution if (src_prc_ != dst_prc_) { switch (src_prc_) { - case ov::element::f32: - if (!dst_prc_.is_real()) { - if (is_saturation()) { - h->uni_vcvtps2dq(Vmm(aux_src_idx), Vmm(data_idx)); - } else { - h->uni_vcvttps2dq(Vmm(aux_src_idx), Vmm(data_idx)); - } - data_idx = aux_src_idx; - data_reg_updated = true; - } - break; - case ov::element::i32: - if (dst_prc_.is_real()) { - h->uni_vcvtdq2ps(Vmm(aux_src_idx), Vmm(data_idx)); - data_idx = aux_src_idx; - data_reg_updated = true; + case ov::element::f32: + if (!dst_prc_.is_real()) { + if (is_saturation()) { + h->uni_vcvtps2dq(Vmm(aux_src_idx), Vmm(data_idx)); + } else { + h->uni_vcvttps2dq(Vmm(aux_src_idx), Vmm(data_idx)); } - break; - default: - break; + data_idx = aux_src_idx; + data_reg_updated = true; + } + break; + case ov::element::i32: + if (dst_prc_.is_real()) { + h->uni_vcvtdq2ps(Vmm(aux_src_idx), Vmm(data_idx)); + data_idx = aux_src_idx; + data_reg_updated = true; + } + break; + default: + break; } } @@ -737,44 +800,44 @@ void jit_store_emitter::emit_isa(const int in_vec_idx, const Xbyak::Reg64 ®_d store_bytes(reg_dst, offset, store_size_); } else { switch (dst_prc_) { - case ov::element::f32: - case ov::element::i32: - store_bytes(reg_dst, offset, store_size_); - break; - case ov::element::i8: - store_dword_to_byte_extension(reg_dst, offset, true, store_num_); - break; - case ov::element::u8: - store_dword_to_byte_extension(reg_dst, offset, false, store_num_); - break; - case ov::element::i16: - case ov::element::u16: - case ov::element::bf16: - case ov::element::f16: - store_dword_to_word_extension(reg_dst, offset, dst_prc_, store_num_); - break; - default: - OV_CPU_JIT_EMITTER_THROW("has unsupported dst precision to store."); + case ov::element::f32: + case ov::element::i32: + store_bytes(reg_dst, offset, store_size_); + break; + case ov::element::i8: + store_dword_to_byte_extension(reg_dst, offset, true, store_num_); + break; + case ov::element::u8: + store_dword_to_byte_extension(reg_dst, offset, false, store_num_); + break; + case ov::element::i16: + case ov::element::u16: + case ov::element::bf16: + case ov::element::f16: + store_dword_to_word_extension(reg_dst, offset, dst_prc_, store_num_); + break; + default: + OV_CPU_JIT_EMITTER_THROW("has unsupported dst precision to store."); } } } /** -* store_bytes is the utility function to facilitate storing of -* store_size (0 <= store_size <= 64) many contiguous bytes from the Xmm/Ymm/Zmm -* register into the memory referenced by ptr[reg + offset] address. -* -* Additionally, when store_size > 16, the input Ymm register will not be -* preserved due to the usage of vextracti128 instruction. -* -* Functionally, invocation of store_bytes is equivalent -* to the following loop: -* -* for (int idx = 0; idx < store_size; ++idx) -* vpextrb(ptr[reg + offset + idx], vmm, idx); -* -*/ + * store_bytes is the utility function to facilitate storing of + * store_size (0 <= store_size <= 64) many contiguous bytes from the Xmm/Ymm/Zmm + * register into the memory referenced by ptr[reg + offset] address. + * + * Additionally, when store_size > 16, the input Ymm register will not be + * preserved due to the usage of vextracti128 instruction. + * + * Functionally, invocation of store_bytes is equivalent + * to the following loop: + * + * for (int idx = 0; idx < store_size; ++idx) + * vpextrb(ptr[reg + offset + idx], vmm, idx); + * + */ template -void jit_store_emitter::store_bytes(const Xbyak::Reg64 ®, int offset, int store_size) const { +void jit_store_emitter::store_bytes(const Xbyak::Reg64& reg, int offset, int store_size) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -805,7 +868,7 @@ void jit_store_emitter::store_bytes(const Xbyak::Reg64 ®, int offset, int sto int bytes_to_store = store_size; if (store_size > 32) { - h->uni_vmovdqu(addr(0), ymm); // store lower bits from zmm + h->uni_vmovdqu(addr(0), ymm); // store lower bits from zmm start_bytes += 32; bytes_to_store -= 32; // load upper bits from zmm into ymm @@ -813,7 +876,7 @@ void jit_store_emitter::store_bytes(const Xbyak::Reg64 ®, int offset, int sto } if (bytes_to_store > 16) { - h->uni_vmovdqu(addr(start_bytes), xmm); // store lower bits from ymm + h->uni_vmovdqu(addr(start_bytes), xmm); // store lower bits from ymm start_bytes += 16; bytes_to_store -= 16; // load upper bits from ymm into xmm @@ -834,93 +897,108 @@ void jit_store_emitter::store_bytes(const Xbyak::Reg64 ®, int offset, int sto h->mov(addr(start_bytes + bytes_offset), Reg8(gpr_idx, ext8bit)); }; switch (bytes_to_store) { - case 0: break; - case 1: - h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); - store_one_byte(0, aux_gpr_idxs[0]); - break; - case 2: - h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); - h->mov(addr(start_bytes), Reg16(aux_gpr_idxs[0])); - break; - case 3: - h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); - h->mov(addr(start_bytes), Reg16(aux_gpr_idxs[0])); - h->shr(Reg64(aux_gpr_idxs[0]), 16); - store_one_byte(2, aux_gpr_idxs[0]); - break; - case 4: h->uni_vmovss(addr(start_bytes), xmm); break; - case 5: - h->uni_vmovss(addr(start_bytes), xmm); - h->uni_vpextrb(addr(start_bytes + 4), xmm, 4); - break; - case 6: - h->uni_vmovss(addr(start_bytes), xmm); - h->uni_vpextrw(addr(start_bytes + 4), xmm, 2); - break; - case 7: - h->uni_vmovss(addr(start_bytes), xmm); - h->uni_vpextrw(addr(start_bytes + 4), xmm, 2); - h->uni_vpextrb(addr(start_bytes + 6), xmm, 6); - break; - case 8: break; - case 9: h->uni_vpextrb(addr(start_bytes + 8), xmm, 8); break; - case 10: h->uni_vpextrw(addr(start_bytes + 8), xmm, 4); break; - case 11: - h->uni_vpextrw(addr(start_bytes + 8), xmm, 4); - h->uni_vpextrb(addr(start_bytes + 10), xmm, 10); - break; - case 12: h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); break; - case 13: - h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); - h->uni_vpextrb(addr(start_bytes + 12), xmm, 12); - break; - case 14: - h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); - h->uni_vpextrw(addr(start_bytes + 12), xmm, 6); - break; - case 15: - h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); - h->uni_vpextrw(addr(start_bytes + 12), xmm, 6); - h->uni_vpextrb(addr(start_bytes + 14), xmm, 14); - break; - case 16: break; - default: - OV_CPU_JIT_EMITTER_THROW("has unexpected number of values to store in store_bytes."); - } - }; - - switch (store_size) { - case 64: - h->uni_vmovdqu(addr(0), zmm); + case 0: + break; + case 1: + h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); + store_one_byte(0, aux_gpr_idxs[0]); + break; + case 2: + h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); + h->mov(addr(start_bytes), Reg16(aux_gpr_idxs[0])); + break; + case 3: + h->uni_vmovq(Reg64(aux_gpr_idxs[0]), xmm); + h->mov(addr(start_bytes), Reg16(aux_gpr_idxs[0])); + h->shr(Reg64(aux_gpr_idxs[0]), 16); + store_one_byte(2, aux_gpr_idxs[0]); + break; + case 4: + h->uni_vmovss(addr(start_bytes), xmm); + break; + case 5: + h->uni_vmovss(addr(start_bytes), xmm); + h->uni_vpextrb(addr(start_bytes + 4), xmm, 4); + break; + case 6: + h->uni_vmovss(addr(start_bytes), xmm); + h->uni_vpextrw(addr(start_bytes + 4), xmm, 2); + break; + case 7: + h->uni_vmovss(addr(start_bytes), xmm); + h->uni_vpextrw(addr(start_bytes + 4), xmm, 2); + h->uni_vpextrb(addr(start_bytes + 6), xmm, 6); + break; + case 8: break; - case 32: - h->uni_vmovdqu(addr(0), ymm); + case 9: + h->uni_vpextrb(addr(start_bytes + 8), xmm, 8); + break; + case 10: + h->uni_vpextrw(addr(start_bytes + 8), xmm, 4); + break; + case 11: + h->uni_vpextrw(addr(start_bytes + 8), xmm, 4); + h->uni_vpextrb(addr(start_bytes + 10), xmm, 10); + break; + case 12: + h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); + break; + case 13: + h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); + h->uni_vpextrb(addr(start_bytes + 12), xmm, 12); + break; + case 14: + h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); + h->uni_vpextrw(addr(start_bytes + 12), xmm, 6); + break; + case 15: + h->uni_vpextrd(addr(start_bytes + 8), xmm, 2); + h->uni_vpextrw(addr(start_bytes + 12), xmm, 6); + h->uni_vpextrb(addr(start_bytes + 14), xmm, 14); break; case 16: - h->uni_vmovdqu(addr(0), xmm); break; default: - if (mayiuse(cpu::x64::avx512_core) && store_size > threshold_for_mask_emu_store) { - uint64_t mask = 1; - mask = (mask << store_size) - mask; - h->mov(Reg64(aux_gpr_idxs[0]), mask); - h->kmovq(k_mask, Reg64(aux_gpr_idxs[0])); - h->vmovdqu8(addr(0), zmm | k_mask); - } else { - store_byte_base(); - } - break; + OV_CPU_JIT_EMITTER_THROW("has unexpected number of values to store in store_bytes."); + } + }; + + switch (store_size) { + case 64: + h->uni_vmovdqu(addr(0), zmm); + break; + case 32: + h->uni_vmovdqu(addr(0), ymm); + break; + case 16: + h->uni_vmovdqu(addr(0), xmm); + break; + default: + if (mayiuse(cpu::x64::avx512_core) && store_size > threshold_for_mask_emu_store) { + uint64_t mask = 1; + mask = (mask << store_size) - mask; + h->mov(Reg64(aux_gpr_idxs[0]), mask); + h->kmovq(k_mask, Reg64(aux_gpr_idxs[0])); + h->vmovdqu8(addr(0), zmm | k_mask); + } else { + store_byte_base(); + } + break; } } /** -* store_dword_to_byte_extension is the utility function to -* 1. convert store_num (0 <= store_num <= 16) dwords in the Xmm/Ymm/Zmm to store_num bytes, singed or unsinged, truncated or saturated. -* 2. store the packed byte into the memory referenced by ptr[reg + offset] address. -*/ + * store_dword_to_byte_extension is the utility function to + * 1. convert store_num (0 <= store_num <= 16) dwords in the Xmm/Ymm/Zmm to store_num bytes, singed or unsinged, + * truncated or saturated. + * 2. store the packed byte into the memory referenced by ptr[reg + offset] address. + */ template -void jit_store_emitter::store_dword_to_byte_extension(const Xbyak::Reg64 ®, int offset, bool is_signed, int store_num) const { +void jit_store_emitter::store_dword_to_byte_extension(const Xbyak::Reg64& reg, + int offset, + bool is_signed, + int store_num) const { constexpr bool is_xmm = std::is_same::value; constexpr bool is_ymm = std::is_same::value; constexpr bool is_zmm = std::is_same::value; @@ -1032,7 +1110,7 @@ void jit_store_emitter::store_dword_to_byte_extension(const Xbyak::Reg64 ®, i break; case 4: if (mayiuse(cpu::x64::avx512_core)) { - if (is_saturation()) { // xmm block on avx512F + VL + if (is_saturation()) { // xmm block on avx512F + VL if (is_signed) { h->vpmovsdb(addr(0), xmm); } else { @@ -1074,13 +1152,16 @@ void jit_store_emitter::store_dword_to_byte_extension(const Xbyak::Reg64 ®, i } /** -* store_dword_to_word_extension is the utility function to -* 1. convert store_num (0 <= store_num <= 16) dwords in the Xmm/Ymm/Zmm to store_num words with singed or unsinged saturation. -* 2. store the packed words into the memory referenced by ptr[reg + offset] address. -*/ + * store_dword_to_word_extension is the utility function to + * 1. convert store_num (0 <= store_num <= 16) dwords in the Xmm/Ymm/Zmm to store_num words with singed or unsinged + * saturation. + * 2. store the packed words into the memory referenced by ptr[reg + offset] address. + */ template -void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64 ®, - int offset, ov::element::Type precision, int store_num) const { +void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64& reg, + int offset, + ov::element::Type precision, + int store_num) const { const bool is_bf16 = (precision == ov::element::bf16); const bool is_f16 = (precision == ov::element::f16); const bool is_signed = precision.is_signed(); @@ -1151,7 +1232,8 @@ void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64 ®, if (is_bf16) { if (mayiuse(cpu::x64::avx512_core)) { - // to avoid src vmm pollution, this check means no precision convert happens, so data_idx is still original_data_idx. + // to avoid src vmm pollution, this check means no precision convert happens, so data_idx is still + // original_data_idx. if (src_prc_ == ov::element::f32) { ymm = Ymm(aux_vec_idxs[0]); } @@ -1171,7 +1253,8 @@ void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64 ®, if (host_isa_ == cpu::x64::sse41 && src_prc_ == ov::element::f32) { auto xmm_aux1 = Xmm(aux_vec_idxs[1]); h->uni_vmovups(xmm_aux1, vmm); - uni_vcvtneps2bf16_->emit_code({static_cast(vmm.getIdx())}, {static_cast(vmm.getIdx())}, + uni_vcvtneps2bf16_->emit_code({static_cast(vmm.getIdx())}, + {static_cast(vmm.getIdx())}, {static_cast(xmm.getIdx())}); h->uni_vmovups(xmm, vmm); h->uni_vmovups(vmm, xmm_aux1); // return original data to src vmm @@ -1222,7 +1305,7 @@ void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64 ®, Vmm zero(aux_vec_idxs[0]); h->uni_vpxor(zero, zero, zero); STORE_KEEP_SOURCE(uni_vpmaxsd, vmm, Vmm(aux_src_idx), vmm, zero); - h->vpmovusdw(ptr[reg + offset], vmm); // unsinged int32 saturate to unsigned int16. + h->vpmovusdw(ptr[reg + offset], vmm); // unsinged int32 saturate to unsigned int16. } } else { h->vpmovdw(ptr[reg + offset], vmm); @@ -1261,7 +1344,7 @@ void jit_store_emitter::store_dword_to_word_extension(const Xbyak::Reg64 ®, h->vpmovdw(ptr[reg + offset], xmm); } } else { - store_dword_to_word_base(); + store_dword_to_word_base(); } break; default: @@ -1297,5 +1380,5 @@ void jit_store_emitter::register_table_entries() { } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.hpp index 9570a836aa64ee..2c4e15ccaeb28b 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/jit_load_store_emitters.hpp @@ -4,16 +4,23 @@ #pragma once -#include "jit_emitter.hpp" #include "jit_bf16_emitters.hpp" +#include "jit_emitter.hpp" namespace ov { namespace intel_cpu { struct load_emitter_params : public emitter_params { - load_emitter_params(ov::element::Type src_prc, ov::element::Type dst_prc, - int load_num, bool is_fill = false, std::string fill_value = "zero"): - src_prc_(src_prc), dst_prc_(dst_prc), load_num_(load_num), is_fill_(is_fill), fill_value_(fill_value) {} + load_emitter_params(ov::element::Type src_prc, + ov::element::Type dst_prc, + int load_num, + bool is_fill = false, + std::string fill_value = "zero") + : src_prc_(src_prc), + dst_prc_(dst_prc), + load_num_(load_num), + is_fill_(is_fill), + fill_value_(fill_value) {} size_t hash() const override; @@ -25,8 +32,10 @@ struct load_emitter_params : public emitter_params { }; struct store_emitter_params : public emitter_params { - store_emitter_params(ov::element::Type src_prc, ov::element::Type dst_prc, int store_num): - src_prc_(src_prc), dst_prc_(dst_prc), store_num_(store_num) {} + store_emitter_params(ov::element::Type src_prc, ov::element::Type dst_prc, int store_num) + : src_prc_(src_prc), + dst_prc_(dst_prc), + store_num_(store_num) {} size_t hash() const override; @@ -36,57 +45,61 @@ struct store_emitter_params : public emitter_params { }; // Arithmetic modes for data type conversion in store_emitter -enum arithmetic_mode { - saturation, - truncation -}; +enum arithmetic_mode { saturation, truncation }; class jit_load_emitter : public jit_emitter { public: - jit_load_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type src_prc, ov::element::Type dst_prc, int load_num, + jit_load_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type src_prc, + ov::element::Type dst_prc, + int load_num, ov::element::Type exec_prc = ov::element::f32, - bool is_fill = false, std::string fill_value = "zero", + bool is_fill = false, + std::string fill_value = "zero", emitter_in_out_map in_out_type = emitter_in_out_map::gpr_to_vec); /** - * load_num values with src_prc precision are loaded from ptr[Reg64(in_idxs[0]) + offset_byte] address to Vmm[out_idxs[0]] as dst_prc, where offset_byte is in_idxs[1] - * is_fill: when load_num can not fully fit in vector register, whether fill_value should be filled as default values. - * fill_value: when load_num can not fully fit in vector register, what values should be filled as default values. - * currently support "zero", "int_one", "float_one", "int32_min", "float_min", "int32_max" and "float_max". - * supported src_prc and dst_prc pairs are as below(x indicate for support): - * FP32 I32 I16 U16 I8 U8 BF16 --> src_prc - * FP32 x x x x x x x - * I32 x x x x x x x - * I16 x - * U16 x - * I8 x - * U8 x - * BF16 x - * | - * \|/ - * dst_prc - */ + * load_num values with src_prc precision are loaded from ptr[Reg64(in_idxs[0]) + offset_byte] address to + * Vmm[out_idxs[0]] as dst_prc, where offset_byte is in_idxs[1] is_fill: when load_num can not fully fit in vector + * register, whether fill_value should be filled as default values. fill_value: when load_num can not fully fit in + * vector register, what values should be filled as default values. currently support "zero", "int_one", + * "float_one", "int32_min", "float_min", "int32_max" and "float_max". supported src_prc and dst_prc pairs are as + * below(x indicate for support): FP32 I32 I16 U16 I8 U8 BF16 --> src_prc FP32 x x x x + * x x x I32 x x x x x x x I16 x U16 x I8 x U8 + * x BF16 x + * | + * \|/ + * dst_prc + */ // offset in load emitter is the offset of src gpr register, should be parsed from in_idxs. - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; size_t get_inputs_num() const override; private: template - void emit_isa(const Xbyak::Reg64 ®_src, const int out_vec_idx, const int offset) const; + void emit_isa(const Xbyak::Reg64& reg_src, const int out_vec_idx, const int offset) const; template - void load_bytes(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, int load_size) const; + void load_bytes(const Vmm& vmm, const Xbyak::Reg64& reg, int offset, int load_size) const; template - void load_bytes_to_dword_extension(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, bool is_signed, int load_size) const; + void load_bytes_to_dword_extension(const Vmm& vmm, + const Xbyak::Reg64& reg, + int offset, + bool is_signed, + int load_size) const; template - void load_words_to_dword_extension(const Vmm &vmm, const Xbyak::Reg64 ®, int offset, ov::element::Type prc, int load_size) const; + void load_words_to_dword_extension(const Vmm& vmm, + const Xbyak::Reg64& reg, + int offset, + ov::element::Type prc, + int load_size) const; template - void fill_with_default(const Vmm &vmm, std::string fill_value, const int &load_num) const; + void fill_with_default(const Vmm& vmm, std::string fill_value, const int& load_num) const; void register_table_entries() override; @@ -104,30 +117,27 @@ class jit_load_emitter : public jit_emitter { class jit_store_emitter : public jit_emitter { public: - jit_store_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::element::Type src_prc, ov::element::Type dst_prc, int store_num, + jit_store_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + ov::element::Type src_prc, + ov::element::Type dst_prc, + int store_num, arithmetic_mode mode = arithmetic_mode::saturation, ov::element::Type exec_prc = ov::element::f32, emitter_in_out_map in_out_type = emitter_in_out_map::vec_to_gpr); /** - * store_num values with src_prc in Vmm[in_vec_idx] is stored to ptr[reg_dst + offset_byte] address as dst_prc data, where offset_byte is in_idxs[1] - * supported src_prc and dst_prc pairs are as below(x indicate for support): - * FP32 I32 I16 U16 I8 U8 BF16 --> src_prc - * FP32 x x - * I32 x x - * I16 x x x - * U16 x x x - * I8 x x x - * U8 x x x - * BF16 x* x* x - * \|/ - * dst_prc - * note: FP32/I32-->BF16(x*) is supported only on at least avx512-core plateform - */ + * store_num values with src_prc in Vmm[in_vec_idx] is stored to ptr[reg_dst + offset_byte] address as dst_prc data, + * where offset_byte is in_idxs[1] supported src_prc and dst_prc pairs are as below(x indicate for support): FP32 + * I32 I16 U16 I8 U8 BF16 --> src_prc FP32 x x I32 x x I16 x x x U16 x x + * x I8 x x x U8 x x x BF16 x* x* x + * \|/ + * dst_prc + * note: FP32/I32-->BF16(x*) is supported only on at least avx512-core plateform + */ // offset in store emitter is the offset of dst gpr register, should be parsed from out_idxs. - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; size_t get_inputs_num() const override; @@ -139,16 +149,19 @@ class jit_store_emitter : public jit_emitter { private: template - void emit_isa(const int in_vec_idx, const Xbyak::Reg64 ®_dst, const int offset) const; + void emit_isa(const int in_vec_idx, const Xbyak::Reg64& reg_dst, const int offset) const; template - void store_bytes(const Xbyak::Reg64 ®, int offset, int store_size) const; + void store_bytes(const Xbyak::Reg64& reg, int offset, int store_size) const; template - void store_dword_to_byte_extension(const Xbyak::Reg64 ®, int offset, bool is_signed, int store_size) const; + void store_dword_to_byte_extension(const Xbyak::Reg64& reg, int offset, bool is_signed, int store_size) const; template - void store_dword_to_word_extension(const Xbyak::Reg64 ®, int offset, ov::element::Type precision, int store_size) const; + void store_dword_to_word_extension(const Xbyak::Reg64& reg, + int offset, + ov::element::Type precision, + int store_size) const; void register_table_entries() override; @@ -176,5 +189,5 @@ class jit_store_emitter : public jit_emitter { mutable int aux_src_idx = 0; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.cpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.cpp index ea16122f2f9793..420e9691ebc73c 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.cpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.cpp @@ -21,8 +21,21 @@ EmitABIRegSpills::~EmitABIRegSpills() { void EmitABIRegSpills::preamble() { // gprs - Xbyak::Operand gprs_to_save[] = {h->r8, h->r9, h->r10, h->r11, h->r12, h->r13, h->r14, h->r15, - h->rax, h->rbx, h->rcx, h->rdx, h->rdi, h->rsi, h->rbp}; + Xbyak::Operand gprs_to_save[] = {h->r8, + h->r9, + h->r10, + h->r11, + h->r12, + h->r13, + h->r14, + h->r15, + h->rax, + h->rbx, + h->rcx, + h->rdx, + h->rdi, + h->rsi, + h->rbp}; size_t n_gprs_to_save = sizeof(gprs_to_save) / sizeof(gprs_to_save[0]); h->sub(h->rsp, n_gprs_to_save * gpr_size); @@ -75,8 +88,21 @@ void EmitABIRegSpills::postamble() { } // restore gpr registers - Xbyak::Operand gprs_to_save[] = {h->r8, h->r9, h->r10, h->r11, h->r12, h->r13, h->r14, h->r15, - h->rax, h->rbx, h->rcx, h->rdx, h->rdi, h->rsi, h->rbp}; + Xbyak::Operand gprs_to_save[] = {h->r8, + h->r9, + h->r10, + h->r11, + h->r12, + h->r13, + h->r14, + h->r15, + h->rax, + h->rbx, + h->rcx, + h->rdx, + h->rdi, + h->rsi, + h->rbp}; size_t n_gprs_to_save = sizeof(gprs_to_save) / sizeof(gprs_to_save[0]); for (int i = n_gprs_to_save - 1; i >= 0; --i) h->mov(gprs_to_save[i], h->ptr[h->rsp + i * gpr_size]); @@ -113,13 +139,17 @@ void EmitABIRegSpills::rsp_restore() { cpu_isa_t EmitABIRegSpills::get_isa() { // need preserve based on cpu capability, instead of host isa. // in case there are possibilty that different isa emitters exist in one kernel from perf standpoint in the future. - // e.g. other emitters isa is avx512, while this emitter isa is avx2, and internal call is used. Internal call may use avx512 and spoil k-reg, ZMM. - // do not care about platform w/ avx512_common but w/o avx512_core(knight landing), which is obsoleted. - if (mayiuse(avx512_core)) return avx512_core; - if (mayiuse(avx2)) return avx2; - if (mayiuse(sse41)) return sse41; + // e.g. other emitters isa is avx512, while this emitter isa is avx2, and internal call is used. Internal call may + // use avx512 and spoil k-reg, ZMM. do not care about platform w/ avx512_common but w/o avx512_core(knight landing), + // which is obsoleted. + if (mayiuse(avx512_core)) + return avx512_core; + if (mayiuse(avx2)) + return avx2; + if (mayiuse(sse41)) + return sse41; OV_CPU_JIT_EMITTER_THROW("unsupported isa"); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.hpp b/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.hpp index 16a66beba7a536..ba956f3375f054 100644 --- a/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.hpp +++ b/src/plugins/intel_cpu/src/emitters/plugin/x64/utils.hpp @@ -30,11 +30,15 @@ class EmitABIRegSpills { static dnnl::impl::cpu::x64::cpu_isa_t get_isa(); - inline size_t get_max_vecs_count() const { return dnnl::impl::cpu::x64::isa_num_vregs(isa); } - inline size_t get_vec_length() const { return dnnl::impl::cpu::x64::isa_max_vlen(isa); } + inline size_t get_max_vecs_count() const { + return dnnl::impl::cpu::x64::isa_num_vregs(isa); + } + inline size_t get_vec_length() const { + return dnnl::impl::cpu::x64::isa_max_vlen(isa); + } - dnnl::impl::cpu::x64::jit_generator* h {nullptr}; - const dnnl::impl::cpu::x64::cpu_isa_t isa {dnnl::impl::cpu::x64::cpu_isa_t::isa_undef}; + dnnl::impl::cpu::x64::jit_generator* h{nullptr}; + const dnnl::impl::cpu::x64::cpu_isa_t isa{dnnl::impl::cpu::x64::cpu_isa_t::isa_undef}; static constexpr int k_mask_size = 8; static constexpr int k_mask_num = 8; @@ -44,5 +48,5 @@ class EmitABIRegSpills { bool rsp_status = true; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/cpu_kernel_executor_table.hpp b/src/plugins/intel_cpu/src/emitters/snippets/cpu_kernel_executor_table.hpp index 79e8dcafb218f6..cfe03d21eac19e 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/cpu_kernel_executor_table.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/cpu_kernel_executor_table.hpp @@ -4,34 +4,38 @@ #pragma once -#include "snippets/kernel_executor_table.hpp" #include "cache/multi_cache.h" +#include "snippets/kernel_executor_table.hpp" namespace ov { namespace intel_cpu { -template +template class CPUKernelExecutor : public snippets::KernelExecutor { public: - CPUKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, Conf c) : - snippets::KernelExecutor(std::move(c)), m_kernel_cache(std::move(kernel_cache)) {} + CPUKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, Conf c) + : snippets::KernelExecutor(std::move(c)), + m_kernel_cache(std::move(kernel_cache)) {} - void update_kernel(const Conf& config, std::shared_ptr& kernel) const override final { // NOLINT + void update_kernel(const Conf& config, std::shared_ptr& kernel) const override final { // NOLINT const auto& cache = m_kernel_cache.lock(); OPENVINO_ASSERT(cache, "Invalid kernel cache pointer in CPUKernelExecutor::update_kernel()"); - const auto& lookup_result = cache->getOrCreate(Key(config), - [this](const Key& k) { - return compile_kernel(k.config); - }); + const auto& lookup_result = cache->getOrCreate(Key(config), [this](const Key& k) { + return compile_kernel(k.config); + }); kernel = lookup_result.first; } protected: struct Key { explicit Key(Conf c) : config{std::move(c)} {} - const Conf config; - size_t hash() const { return config.hash(); } - bool operator==(const Key& rhs) const { return config == rhs.config; } + const Conf config; + size_t hash() const { + return config.hash(); + } + bool operator==(const Key& rhs) const { + return config == rhs.config; + } }; /** Compile kernel managed by KernelExecutor instance. Will be called only if Kernel is not found in the cache */ virtual std::shared_ptr compile_kernel(const Conf& c) const = 0; @@ -39,5 +43,5 @@ class CPUKernelExecutor : public snippets::KernelExecutor { ov::intel_cpu::MultiCacheWeakPtr m_kernel_cache; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.cpp b/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.cpp index b2758735b2d27a..65741d7031d289 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.cpp @@ -8,8 +8,8 @@ #include "snippets/utils/utils.hpp" #ifndef OPENVINO_ARCH_ARM64 -#include "transformations/snippets/x64/pass/lowered/brgemm_copy_b_loop_ports_adjuster.hpp" -#include "transformations/snippets/x64/pass/lowered/external_repacking_adjuster.hpp" +# include "transformations/snippets/x64/pass/lowered/brgemm_copy_b_loop_ports_adjuster.hpp" +# include "transformations/snippets/x64/pass/lowered/external_repacking_adjuster.hpp" #endif namespace ov { namespace intel_cpu { @@ -21,7 +21,8 @@ const size_t CPURuntimeConfigurator::rank6D = 6; std::string CPURuntimeConfig::to_string() const { std::stringstream out; out << RuntimeConfig::to_string(); - out << "Loop Parameters:" << "\n"; + out << "Loop Parameters:" + << "\n"; for (size_t i = 0; i < loop_args.size(); ++i) { const auto& loop = loop_args[i]; out << "\t[" << i << "] WA: " << loop.m_work_amount << "\n"; @@ -38,8 +39,8 @@ std::string CPURuntimeConfig::to_string() const { } #endif -CPURuntimeConfigurator::CPURuntimeConfigurator() : ov::snippets::RuntimeConfigurator(std::make_shared()) { -} +CPURuntimeConfigurator::CPURuntimeConfigurator() + : ov::snippets::RuntimeConfigurator(std::make_shared()) {} void CPURuntimeConfigurator::initialization(const ov::snippets::lowered::LinearIRCPtr& linear_ir) { RuntimeConfigurator::initialization(linear_ir); @@ -78,12 +79,14 @@ void CPURuntimeConfigurator::update_loop_args(const ov::snippets::lowered::Linea const auto& data_sizes = loop_info->get_data_sizes(); auto& loop_arg = cpu_config->loop_args[idx]; - loop_arg = jit_snippets_call_args::loop_args_t(loop_info->get_work_amount(), loop_info->get_ptr_increments(), loop_info->get_finalization_offsets()); + loop_arg = jit_snippets_call_args::loop_args_t(loop_info->get_work_amount(), + loop_info->get_ptr_increments(), + loop_info->get_finalization_offsets()); for (int64_t i = 0; i < loop_arg.m_num_data_ptrs; ++i) { loop_arg.m_ptr_increments[i] *= (increment * data_sizes[i]); loop_arg.m_finalization_offsets[i] *= data_sizes[i]; } } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.hpp b/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.hpp index 42ce35a3c66c2b..1706670ce870d1 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/cpu_runtime_configurator.hpp @@ -34,6 +34,7 @@ class CPURuntimeConfigurator : public ov::snippets::RuntimeConfigurator { * @param linear_ir LinearIR */ void update_loop_args(const ov::snippets::lowered::LinearIRCPtr& linear_ir) const; + protected: void update(const ov::snippets::lowered::LinearIRCPtr& linear_ir) override; void update_tensor_rank(const ov::snippets::VectorDims& master_shape) const override; @@ -43,5 +44,5 @@ class CPURuntimeConfigurator : public ov::snippets::RuntimeConfigurator { static const size_t rank6D; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.cpp index 6f78c43fd54797..ceee57f3c0cd28 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.cpp @@ -3,15 +3,18 @@ // #include "jit_container_emitter.hpp" + #include "emitters/utils.hpp" #include "utils/general_utils.h" namespace ov { namespace intel_cpu { -void jit_container_emitter::map_abstract_registers(mapping_info& gpr_map_pool, mapping_info& vec_map_pool, +void jit_container_emitter::map_abstract_registers(mapping_info& gpr_map_pool, + mapping_info& vec_map_pool, snippets::lowered::LinearIR::container& expressions) const { - OV_CPU_JIT_EMITTER_ASSERT(!expressions.empty(), "Cannot map registers when there is no allocated_emitters provided"); + OV_CPU_JIT_EMITTER_ASSERT(!expressions.empty(), + "Cannot map registers when there is no allocated_emitters provided"); auto map_regs = [&](const std::vector& abstract_regs) { std::vector physical_regs = abstract_regs; @@ -19,13 +22,16 @@ void jit_container_emitter::map_abstract_registers(mapping_info& gpr_map_pool, m const auto& abstract_reg = abstract_regs[i]; const auto& type = abstract_reg.type; const auto& abstract = abstract_reg.idx; - OV_CPU_JIT_EMITTER_ASSERT(one_of(type, snippets::RegType::gpr, snippets::RegType::vec), "Incorrect reg type detected!"); + OV_CPU_JIT_EMITTER_ASSERT(one_of(type, snippets::RegType::gpr, snippets::RegType::vec), + "Incorrect reg type detected!"); auto& mapping = type == snippets::RegType::gpr ? gpr_map_pool : vec_map_pool; auto& abstract_to_physical = mapping.first; auto& regs_pool = mapping.second; auto& physical = physical_regs[i]; if (abstract_to_physical.count(abstract) == 0) { - OV_CPU_JIT_EMITTER_ASSERT(!regs_pool.empty(), "Cannot map registers for jit_container_emitter: not enough regs in the pool"); + OV_CPU_JIT_EMITTER_ASSERT( + !regs_pool.empty(), + "Cannot map registers for jit_container_emitter: not enough regs in the pool"); physical.idx = regs_pool.back(); regs_pool.pop_back(); abstract_to_physical[abstract] = physical.idx; @@ -48,5 +54,5 @@ void jit_container_emitter::map_abstract_registers(mapping_info& gpr_map_pool, m } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.hpp index 2325c6ef1a2eb3..7737e7e1150926 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/jit_container_emitter.hpp @@ -20,8 +20,10 @@ class jit_container_emitter { protected: // maps gpr and vec abstract registers to physical ones. - void map_abstract_registers(mapping_info& gpr_map_pool, mapping_info& vec_map_pool, snippets::lowered::LinearIR::container& expressions) const; + void map_abstract_registers(mapping_info& gpr_map_pool, + mapping_info& vec_map_pool, + snippets::lowered::LinearIR::container& expressions) const; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.cpp b/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.cpp index 48f98c2ffb2450..20e19bcba7e4f4 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.cpp @@ -3,10 +3,11 @@ // #include "jit_snippets_call_args.hpp" -#include "emitters/utils.hpp" #include +#include "emitters/utils.hpp" + namespace ov { namespace intel_cpu { @@ -21,16 +22,19 @@ void jit_snippets_call_args::register_loops(const std::vector& loop std::copy(loops.begin(), loops.end(), loop_args); } -jit_snippets_call_args::loop_args_t::loop_args_t(int64_t work_amount, const std::vector& ptr_increments, +jit_snippets_call_args::loop_args_t::loop_args_t(int64_t work_amount, + const std::vector& ptr_increments, const std::vector& finalization_offsets) : m_work_amount(work_amount) { - OV_CPU_JIT_EMITTER_ASSERT(ptr_increments.size() == finalization_offsets.size(), "Inconsistent sizes of ptr_increments and finalization_offsets"); + OV_CPU_JIT_EMITTER_ASSERT(ptr_increments.size() == finalization_offsets.size(), + "Inconsistent sizes of ptr_increments and finalization_offsets"); m_num_data_ptrs = static_cast(ptr_increments.size()); init_pointers_and_copy_data(m_num_data_ptrs, ptr_increments.data(), finalization_offsets.data()); } jit_snippets_call_args::loop_args_t::loop_args_t(const loop_args_t& other) - : m_work_amount(other.m_work_amount), m_num_data_ptrs(other.m_num_data_ptrs) { + : m_work_amount(other.m_work_amount), + m_num_data_ptrs(other.m_num_data_ptrs) { init_pointers_and_copy_data(m_num_data_ptrs, other.m_ptr_increments, other.m_finalization_offsets); } @@ -44,7 +48,8 @@ jit_snippets_call_args::loop_args_t& jit_snippets_call_args::loop_args_t::operat return *this; } -void jit_snippets_call_args::loop_args_t::init_pointers_and_copy_data(const int64_t num_elements, const int64_t* ptr_increments, +void jit_snippets_call_args::loop_args_t::init_pointers_and_copy_data(const int64_t num_elements, + const int64_t* ptr_increments, const int64_t* finalization_offsets) { const size_t chunk_size = num_elements * sizeof(int64_t); m_ptr_increments = new int64_t[num_elements]; @@ -60,5 +65,5 @@ void swap(jit_snippets_call_args::loop_args_t& first, jit_snippets_call_args::lo std::swap(first.m_finalization_offsets, second.m_finalization_offsets); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.hpp b/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.hpp index 027655d493784d..eb74190dd71676 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/jit_snippets_call_args.hpp @@ -4,9 +4,9 @@ #pragma once -#include -#include #include +#include +#include #include "dnnl_types.h" #include "openvino/core/visibility.hpp" @@ -15,12 +15,12 @@ namespace ov { namespace intel_cpu { #if defined(OPENVINO_ARCH_ARM64) -#define SNIPPETS_MAX_DATA_PTR_COUNT 23 +# define SNIPPETS_MAX_DATA_PTR_COUNT 23 #else -#define SNIPPETS_MAX_DATA_PTR_COUNT 11 +# define SNIPPETS_MAX_DATA_PTR_COUNT 11 #endif -#define GET_OFF(field) offsetof(jit_snippets_call_args, field) +#define GET_OFF(field) offsetof(jit_snippets_call_args, field) #define GET_OFF_LOOP_ARGS(field) offsetof(jit_snippets_call_args::loop_args_t, field) struct amx_tile_config_t { @@ -37,9 +37,9 @@ struct jit_snippets_call_args { void register_loops(const std::vector& loops); - const void *src_ptrs[SNIPPETS_MAX_DATA_PTR_COUNT] = {}; - void *dst_ptrs[SNIPPETS_MAX_DATA_PTR_COUNT] = {}; - void *buffer_scratchpad_ptr = nullptr; + const void* src_ptrs[SNIPPETS_MAX_DATA_PTR_COUNT] = {}; + void* dst_ptrs[SNIPPETS_MAX_DATA_PTR_COUNT] = {}; + void* buffer_scratchpad_ptr = nullptr; // Note: Ideally loop_args must be private, since we manage this pointer manually. // However, standard-layout class definition (to use offset_of) requires the same access specifier @@ -51,14 +51,18 @@ struct jit_snippets_call_args { struct jit_snippets_call_args::loop_args_t { loop_args_t() = default; - loop_args_t(int64_t work_amount, const std::vector& ptr_increments, const std::vector& finalization_offsets); + loop_args_t(int64_t work_amount, + const std::vector& ptr_increments, + const std::vector& finalization_offsets); loop_args_t(const loop_args_t& other); ~loop_args_t(); loop_args_t& operator=(loop_args_t other); friend void swap(loop_args_t& first, loop_args_t& second); - void init_pointers_and_copy_data(const int64_t num_elements, const int64_t* ptr_increments, const int64_t* finalization_offsets); + void init_pointers_and_copy_data(const int64_t num_elements, + const int64_t* ptr_increments, + const int64_t* finalization_offsets); int64_t m_work_amount = 0; int64_t m_num_data_ptrs = 0; @@ -71,5 +75,5 @@ struct jit_snippets_compile_args { std::vector exec_domain = {}; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.cpp b/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.cpp index b7c51539861ff8..e4c3c40e1d8120 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.cpp @@ -3,7 +3,7 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#include "debug_caps_config.hpp" +# include "debug_caps_config.hpp" namespace ov { namespace intel_cpu { @@ -20,7 +20,7 @@ void SnippetsDebugCapsConfig::readProperties() { enable_segfault_detector = readEnv("OV_CPU_SNIPPETS_SEGFAULT_DETECTOR") ? true : false; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.hpp b/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.hpp index 14dcae0ddf0c69..8f01e85063f5e9 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/utils/debug_caps_config.hpp @@ -3,10 +3,10 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#pragma once +# pragma once -#include -#include +# include +# include namespace ov { namespace intel_cpu { @@ -23,7 +23,7 @@ class SnippetsDebugCapsConfig { void readProperties(); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/cpu_generator.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/cpu_generator.cpp index c210782db8f91c..39e384837856a1 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/cpu_generator.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/cpu_generator.cpp @@ -4,63 +4,61 @@ #include "cpu_generator.hpp" -#include "snippets/snippets_isa.hpp" -#include "emitters/snippets/cpu_runtime_configurator.hpp" +#include +#include "emitters/plugin/x64/jit_conversion_emitters.hpp" +#include "emitters/plugin/x64/jit_dnnl_emitters.hpp" +#include "emitters/plugin/x64/jit_dnnl_ext_emitters.hpp" +#include "emitters/plugin/x64/jit_eltwise_emitters.hpp" +#include "emitters/snippets/cpu_kernel_executor_table.hpp" +#include "emitters/snippets/cpu_runtime_configurator.hpp" #include "emitters/snippets/x64/jit_brgemm_copy_b_emitter.hpp" #include "emitters/snippets/x64/jit_brgemm_emitter.hpp" -#include "emitters/snippets/x64/jit_memory_emitters.hpp" +#include "emitters/snippets/x64/jit_fill_emitter.hpp" +#include "emitters/snippets/x64/jit_horizon_emitter.hpp" #include "emitters/snippets/x64/jit_kernel_emitter.hpp" #include "emitters/snippets/x64/jit_loop_emitters.hpp" +#include "emitters/snippets/x64/jit_memory_emitters.hpp" #include "emitters/snippets/x64/jit_snippets_emitters.hpp" -#include "emitters/snippets/x64/jit_fill_emitter.hpp" -#include "emitters/snippets/x64/jit_horizon_emitter.hpp" -#include "emitters/plugin/x64/jit_eltwise_emitters.hpp" -#include "emitters/plugin/x64/jit_dnnl_emitters.hpp" -#include "emitters/plugin/x64/jit_dnnl_ext_emitters.hpp" -#include "emitters/plugin/x64/jit_conversion_emitters.hpp" - -#include "transformations/snippets/x64/op/load_convert.hpp" -#include "transformations/snippets/x64/op/store_convert.hpp" +#include "snippets/snippets_isa.hpp" +#include "transformations/cpu_opset/common/op/swish_cpu.hpp" #include "transformations/snippets/common/op/fused_mul_add.hpp" #include "transformations/snippets/x64/op/brgemm_copy_b.hpp" #include "transformations/snippets/x64/op/brgemm_cpu.hpp" +#include "transformations/snippets/x64/op/load_convert.hpp" #include "transformations/snippets/x64/op/perf_count_rdtsc.hpp" -#include "transformations/cpu_opset/common/op/swish_cpu.hpp" +#include "transformations/snippets/x64/op/store_convert.hpp" #include "transformations/snippets/x64/pass/lowered/fuse_load_store_and_convert.hpp" -#include -#include "emitters/snippets/cpu_kernel_executor_table.hpp" - #ifdef SNIPPETS_DEBUG_CAPS -#include "emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp" -#include "emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp" -#include "transformations/snippets/x64/op/perf_count_rdtsc.hpp" -#include "emitters/snippets/x64/jit_debug_emitter.hpp" -#include "emitters/snippets/x64/jit_segfault_detector_emitter.hpp" -#include "emitters/snippets/x64/verbose.hpp" +# include "emitters/snippets/x64/jit_debug_emitter.hpp" +# include "emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp" +# include "emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp" +# include "emitters/snippets/x64/jit_segfault_detector_emitter.hpp" +# include "emitters/snippets/x64/verbose.hpp" +# include "transformations/snippets/x64/op/perf_count_rdtsc.hpp" #endif #ifdef SNIPPETS_LIBXSMM_TPP -#include "transformations/tpp/x64/op/brgemm.hpp" -#include "transformations/tpp/x64/op/eltwise.hpp" -#include "transformations/tpp/x64/op/reduce.hpp" -#include "transformations/tpp/x64/op/modifiers.hpp" -#include "transformations/tpp/x64/op/scalar.hpp" -#include "transformations/tpp/x64/op/equation.hpp" -#include "emitters/tpp/x64/jit_eltwise_emitters.hpp" -#include "emitters/tpp/x64/jit_brgemm_emitter.hpp" -#include "emitters/tpp/x64/jit_scalar_emitter.hpp" -#include "emitters/tpp/x64/jit_equation_emitter.hpp" -#include "emitters/tpp/x64/jit_debug_emitter.hpp" +# include "emitters/tpp/x64/jit_brgemm_emitter.hpp" +# include "emitters/tpp/x64/jit_debug_emitter.hpp" +# include "emitters/tpp/x64/jit_eltwise_emitters.hpp" +# include "emitters/tpp/x64/jit_equation_emitter.hpp" +# include "emitters/tpp/x64/jit_scalar_emitter.hpp" +# include "transformations/tpp/x64/op/brgemm.hpp" +# include "transformations/tpp/x64/op/eltwise.hpp" +# include "transformations/tpp/x64/op/equation.hpp" +# include "transformations/tpp/x64/op/modifiers.hpp" +# include "transformations/tpp/x64/op/reduce.hpp" +# include "transformations/tpp/x64/op/scalar.hpp" // Note: for reference implementations -#include +# include #endif namespace ov { #ifdef SNIPPETS_DEBUG_CAPS -static bool is_load_emitter(const intel_cpu::jit_emitter *emitter) { +static bool is_load_emitter(const intel_cpu::jit_emitter* emitter) { bool ret = false; if (dynamic_cast(emitter) || dynamic_cast(emitter)) { @@ -69,7 +67,7 @@ static bool is_load_emitter(const intel_cpu::jit_emitter *emitter) { return ret; } -static bool is_store_emitter(const intel_cpu::jit_emitter *emitter) { +static bool is_store_emitter(const intel_cpu::jit_emitter* emitter) { bool ret = false; if (dynamic_cast(emitter)) { return true; @@ -77,72 +75,82 @@ static bool is_store_emitter(const intel_cpu::jit_emitter *emitter) { return ret; } -static bool is_segfault_detector_emitter(const intel_cpu::jit_emitter *emitter) { +static bool is_segfault_detector_emitter(const intel_cpu::jit_emitter* emitter) { // default active for typical tensor memory access emitters bool ret = false; - ret = is_load_emitter(emitter) || - is_store_emitter(emitter) || - dynamic_cast(emitter) || - dynamic_cast(emitter) || - dynamic_cast(emitter); + ret = is_load_emitter(emitter) || is_store_emitter(emitter) || + dynamic_cast(emitter) || + dynamic_cast(emitter) || + dynamic_cast(emitter); return ret; // use below code to active all emitters for extend usage // return !dynamic_cast(emitter); } -#define CREATE_SNIPPETS_EMITTER(e_type, ...) { \ - [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ - auto emitter = std::make_shared(h.get(), isa, expr, ##__VA_ARGS__); \ - if (debug_config.enable_segfault_detector && is_segfault_detector_emitter(emitter.get())) { \ - auto segfault_emitter = std::make_shared(h.get(), isa, emitter.get(), \ - is_load_emitter(emitter.get()), is_store_emitter(emitter.get()), expr->get_node()->get_friendly_name()); \ - return std::make_shared(emitter, segfault_emitter, jit_debug_emitter::EmissionLocation::preamble); \ - } else { \ - return emitter; \ - } \ - }, \ - [](const std::shared_ptr& n) -> std::set> { \ - return e_type::get_supported_precisions(n); \ - } \ -} +# define CREATE_SNIPPETS_EMITTER(e_type, ...) \ + { \ + [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ + auto emitter = std::make_shared(h.get(), isa, expr, ##__VA_ARGS__); \ + if (debug_config.enable_segfault_detector && is_segfault_detector_emitter(emitter.get())) { \ + auto segfault_emitter = \ + std::make_shared(h.get(), \ + isa, \ + emitter.get(), \ + is_load_emitter(emitter.get()), \ + is_store_emitter(emitter.get()), \ + expr->get_node()->get_friendly_name()); \ + return std::make_shared(emitter, \ + segfault_emitter, \ + jit_debug_emitter::EmissionLocation::preamble); \ + } else { \ + return emitter; \ + } \ + }, \ + [](const std::shared_ptr& n) -> std::set> { \ + return e_type::get_supported_precisions(n); \ + } \ + } #else -#define CREATE_SNIPPETS_EMITTER(e_type, ...) { \ - [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ - return std::make_shared(h.get(), isa, expr, ##__VA_ARGS__); \ - }, \ - [](const std::shared_ptr& n) -> std::set> { \ - return e_type::get_supported_precisions(n); \ - } \ -} +# define CREATE_SNIPPETS_EMITTER(e_type, ...) \ + { \ + [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ + return std::make_shared(h.get(), isa, expr, ##__VA_ARGS__); \ + }, \ + [](const std::shared_ptr& n) -> std::set> { \ + return e_type::get_supported_precisions(n); \ + } \ + } #endif -#define CREATE_DEBUG_TPP_EMITTER(e_type) { \ - [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ - return std::make_shared(expr, std::make_shared(h.get(), isa, expr)); \ - }, \ - [](const std::shared_ptr& n) -> std::set> { \ - return e_type::get_supported_precisions(n); \ - } \ -} - +#define CREATE_DEBUG_TPP_EMITTER(e_type) \ + { \ + [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ + return std::make_shared(expr, std::make_shared(h.get(), isa, expr)); \ + }, \ + [](const std::shared_ptr& n) -> std::set> { \ + return e_type::get_supported_precisions(n); \ + } \ + } -#define CREATE_CPU_EMITTER(e_type) { \ - [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ - return std::make_shared(h.get(), isa, expr->get_node()); \ - }, \ - [](const std::shared_ptr& n) -> std::set> { \ - return e_type::get_supported_precisions(n); \ - } \ -} +#define CREATE_CPU_EMITTER(e_type) \ + { \ + [this](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ + return std::make_shared(h.get(), isa, expr->get_node()); \ + }, \ + [](const std::shared_ptr& n) -> std::set> { \ + return e_type::get_supported_precisions(n); \ + } \ + } -#define CREATE_UNDEFINED_EMITTER(supported_precisions) { \ - [](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ - return nullptr; \ - }, \ - [](const std::shared_ptr& n) -> std::set> { \ - return supported_precisions; \ - } \ -} +#define CREATE_UNDEFINED_EMITTER(supported_precisions) \ + { \ + [](const snippets::lowered::ExpressionPtr& expr) -> std::shared_ptr { \ + return nullptr; \ + }, \ + [](const std::shared_ptr& n) -> std::set> { \ + return supported_precisions; \ + } \ + } class jit_snippet : public dnnl::impl::cpu::x64::jit_generator { public: @@ -157,30 +165,43 @@ class jit_snippet : public dnnl::impl::cpu::x64::jit_generator { intel_cpu::CPUTargetMachine::CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::intel_cpu::MultiCacheWeakPtr cache) - : TargetMachine(std::make_shared()), h(new jit_snippet()), isa(host_isa), compiled_kernel_cache(std::move(cache)) { + : TargetMachine(std::make_shared()), + h(new jit_snippet()), + isa(host_isa), + compiled_kernel_cache(std::move(cache)) { // data movement jitters[op::v0::Parameter::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); jitters[op::v0::Result::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); jitters[snippets::op::Buffer::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); jitters[snippets::op::VectorBuffer::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); - jitters[snippets::op::RankNormalization::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); + jitters[snippets::op::RankNormalization::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); jitters[snippets::op::Reshape::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_nop_emitter); jitters[snippets::op::Load::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); - jitters[snippets::op::LoadReshape::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); - jitters[snippets::op::BroadcastLoad::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_broadcast_emitter); - jitters[intel_cpu::LoadConvertSaturation::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); - jitters[intel_cpu::LoadConvertTruncation::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); + jitters[snippets::op::LoadReshape::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); + jitters[snippets::op::BroadcastLoad::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_broadcast_emitter); + jitters[intel_cpu::LoadConvertSaturation::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); + jitters[intel_cpu::LoadConvertTruncation::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_load_memory_emitter); jitters[snippets::op::Store::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_store_memory_emitter); - jitters[intel_cpu::StoreConvertSaturation::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_store_memory_emitter); - jitters[intel_cpu::StoreConvertTruncation::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_store_memory_emitter); + jitters[intel_cpu::StoreConvertSaturation::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_store_memory_emitter); + jitters[intel_cpu::StoreConvertTruncation::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_store_memory_emitter); jitters[snippets::op::Scalar::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_scalar_emitter); - jitters[snippets::op::BroadcastMove::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_broadcast_move_emitter); + jitters[snippets::op::BroadcastMove::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_broadcast_move_emitter); - jitters[snippets::op::ConvertTruncation::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_convert_truncation_emitter); - jitters[snippets::op::ConvertSaturation::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_convert_saturation_emitter); + jitters[snippets::op::ConvertTruncation::get_type_info_static()] = + CREATE_CPU_EMITTER(intel_cpu::jit_convert_truncation_emitter); + jitters[snippets::op::ConvertSaturation::get_type_info_static()] = + CREATE_CPU_EMITTER(intel_cpu::jit_convert_saturation_emitter); // ternary jitters[op::v1::Select::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_select_emitter); @@ -203,10 +224,12 @@ intel_cpu::CPUTargetMachine::CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t ho jitters[op::v1::Mod::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_mod_emitter); jitters[op::v1::Multiply::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_multiply_emitter); jitters[op::v1::NotEqual::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_not_equal_emitter); - jitters[snippets::op::PowerStatic::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_power_static_emitter); + jitters[snippets::op::PowerStatic::get_type_info_static()] = + CREATE_CPU_EMITTER(intel_cpu::jit_power_static_emitter); jitters[op::v1::Power::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_power_dynamic_emitter); jitters[op::v0::PRelu::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_prelu_emitter); - jitters[op::v0::SquaredDifference::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_squared_difference_emitter); + jitters[op::v0::SquaredDifference::get_type_info_static()] = + CREATE_CPU_EMITTER(intel_cpu::jit_squared_difference_emitter); jitters[op::v1::Subtract::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_subtract_emitter); jitters[op::v0::Xor::get_type_info_static()] = CREATE_CPU_EMITTER(intel_cpu::jit_logical_xor_emitter); @@ -235,25 +258,35 @@ intel_cpu::CPUTargetMachine::CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t ho jitters[snippets::op::HorizonMax::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_horizon_emitter); jitters[snippets::op::HorizonSum::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_horizon_emitter); - jitters[snippets::op::KernelStatic::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_kernel_static_emitter); - jitters[snippets::op::KernelDynamic::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_kernel_dynamic_emitter); - jitters[snippets::op::LoopBegin::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_loop_begin_emitter); + jitters[snippets::op::KernelStatic::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_kernel_static_emitter); + jitters[snippets::op::KernelDynamic::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_kernel_dynamic_emitter); + jitters[snippets::op::LoopBegin::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_loop_begin_emitter); jitters[snippets::op::LoopEnd::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_loop_end_emitter); - // Note: jit_brgemm_emitter and jit_brgemm_copy_b_emitter support runtime recompilation, so their constructor takes additional arguments - jitters[intel_cpu::BrgemmCPU::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_brgemm_emitter, - configurator->get_kernel_executor_table(), - compiled_kernel_cache); - jitters[intel_cpu::BrgemmCopyB::get_type_info_static()] = CREATE_SNIPPETS_EMITTER(intel_cpu::jit_brgemm_copy_b_emitter, - configurator->get_kernel_executor_table(), - compiled_kernel_cache); + // Note: jit_brgemm_emitter and jit_brgemm_copy_b_emitter support runtime recompilation, so their constructor takes + // additional arguments + jitters[intel_cpu::BrgemmCPU::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_brgemm_emitter, + configurator->get_kernel_executor_table(), + compiled_kernel_cache); + jitters[intel_cpu::BrgemmCopyB::get_type_info_static()] = + CREATE_SNIPPETS_EMITTER(intel_cpu::jit_brgemm_copy_b_emitter, + configurator->get_kernel_executor_table(), + compiled_kernel_cache); jitters[snippets::op::ReduceMax::get_type_info_static()] = CREATE_UNDEFINED_EMITTER({{ov::element::f32}}); jitters[snippets::op::ReduceSum::get_type_info_static()] = CREATE_UNDEFINED_EMITTER({{ov::element::f32}}); #ifdef SNIPPETS_DEBUG_CAPS - jitters[snippets::op::PerfCountBegin::get_type_info_static()] = CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_chrono_start_emitter); - jitters[snippets::op::PerfCountEnd::get_type_info_static()] = CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_chrono_end_emitter); - jitters[ov::intel_cpu::PerfCountRdtscBegin::get_type_info_static()] = CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_rdtsc_start_emitter); - jitters[ov::intel_cpu::PerfCountRdtscEnd::get_type_info_static()] = CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_rdtsc_end_emitter); + jitters[snippets::op::PerfCountBegin::get_type_info_static()] = + CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_chrono_start_emitter); + jitters[snippets::op::PerfCountEnd::get_type_info_static()] = + CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_chrono_end_emitter); + jitters[ov::intel_cpu::PerfCountRdtscBegin::get_type_info_static()] = + CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_rdtsc_start_emitter); + jitters[ov::intel_cpu::PerfCountRdtscEnd::get_type_info_static()] = + CREATE_CPU_EMITTER(ov::intel_cpu::jit_perf_count_rdtsc_end_emitter); #endif #ifdef SNIPPETS_LIBXSMM_TPP @@ -267,8 +300,8 @@ intel_cpu::CPUTargetMachine::CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t ho // Note: you can register Debug emitter for Unary/Binary operations as shown below: // jitters[intel_cpu::tpp::op::Add::get_type_info_static()] = CREATE_DEBUG_TPP_EMITTER(UnaryEltwiseTppEmitter); // - // Note: you can register Reference emitter for Unary operations using std::function or lambda function as shown below: - // jitters[intel_cpu::tpp::op::Exp::get_type_info_static()] = + // Note: you can register Reference emitter for Unary operations using std::function or lambda function as shown + // below: jitters[intel_cpu::tpp::op::Exp::get_type_info_static()] = // CREATE_SNIPPETS_EMITTER(ReferenceUnaryEltwiseTppEmitter, static_cast(std::exp)); // jitters[intel_cpu::tpp::op::Reciprocal::get_type_info_static()] = // CREATE_SNIPPETS_EMITTER(ReferenceUnaryEltwiseTppEmitter, [](float x){ return 1.f/x; }); @@ -292,10 +325,14 @@ std::shared_ptr intel_cpu::CPUTargetMachine::clone() co size_t intel_cpu::CPUTargetMachine::get_lanes() const { switch (isa) { - case dnnl::impl::cpu::x64::avx2 : return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); - case dnnl::impl::cpu::x64::sse41 : return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); - case dnnl::impl::cpu::x64::avx512_core : return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); - default : OPENVINO_THROW("unknown isa ", isa); + case dnnl::impl::cpu::x64::avx2: + return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); + case dnnl::impl::cpu::x64::sse41: + return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); + case dnnl::impl::cpu::x64::avx512_core: + return dnnl::impl::cpu::x64::cpu_isa_traits::vlen / sizeof(float); + default: + OPENVINO_THROW("unknown isa ", isa); } } @@ -315,13 +352,15 @@ snippets::CompiledSnippetPtr intel_cpu::CPUTargetMachine::get_snippet() { if (h->create_kernel() != dnnl::impl::status::success) { OPENVINO_THROW("Failed to create jit_kernel in get_snippet()"); } - const auto& result = std::make_shared(std::unique_ptr(h.release())); + const auto& result = + std::make_shared(std::unique_ptr(h.release())); // Note that we reset all the generated code, since it was copied into CompiledSnippetCPU h.reset(new jit_snippet()); return result; } -intel_cpu::CompiledSnippetCPU::CompiledSnippetCPU(std::unique_ptr h) : h_compiled(std::move(h)) { +intel_cpu::CompiledSnippetCPU::CompiledSnippetCPU(std::unique_ptr h) + : h_compiled(std::move(h)) { OPENVINO_ASSERT(h_compiled && h_compiled->jit_ker(), "Got invalid jit generator or kernel was nopt compiled"); } @@ -337,15 +376,14 @@ bool intel_cpu::CompiledSnippetCPU::empty() const { return get_code_size() == 0; } -intel_cpu::CPUGenerator::CPUGenerator(dnnl::impl::cpu::x64::cpu_isa_t isa_, ov::intel_cpu::MultiCacheWeakPtr cache) : - Generator(std::make_shared(isa_, std::move(cache))) { -} -intel_cpu::CPUGenerator::CPUGenerator(const std::shared_ptr& target) : Generator(target) { -} +intel_cpu::CPUGenerator::CPUGenerator(dnnl::impl::cpu::x64::cpu_isa_t isa_, ov::intel_cpu::MultiCacheWeakPtr cache) + : Generator(std::make_shared(isa_, std::move(cache))) {} +intel_cpu::CPUGenerator::CPUGenerator(const std::shared_ptr& target) : Generator(target) {} std::shared_ptr intel_cpu::CPUGenerator::clone() const { const auto& cpu_target_machine = std::dynamic_pointer_cast(target->clone()); - OPENVINO_ASSERT(cpu_target_machine, "Failed to clone CPUGenerator: the instance contains incompatible TargetMachine type"); + OPENVINO_ASSERT(cpu_target_machine, + "Failed to clone CPUGenerator: the instance contains incompatible TargetMachine type"); return std::make_shared(cpu_target_machine); } @@ -358,12 +396,11 @@ ov::snippets::RegType intel_cpu::CPUGenerator::get_specific_op_out_reg_type(cons #endif std::dynamic_pointer_cast(op)) return ov::snippets::RegType::gpr; - else if ( - std::dynamic_pointer_cast(op) || - std::dynamic_pointer_cast(op)) + else if (std::dynamic_pointer_cast(op) || + std::dynamic_pointer_cast(op)) return ov::snippets::RegType::vec; else - return ov::snippets::RegType::undefined; + return ov::snippets::RegType::undefined; } bool intel_cpu::CPUGenerator::uses_precompiled_kernel(const std::shared_ptr& e) const { @@ -383,4 +420,4 @@ bool intel_cpu::CPUGenerator::uses_precompiled_kernel(const std::shared_ptr h_compiled; + public: const uint8_t* get_code() const override; size_t get_code_size() const override; @@ -31,8 +30,7 @@ class CompiledSnippetCPU : public snippets::CompiledSnippet { class CPUTargetMachine : public snippets::TargetMachine { public: - explicit CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t host_isa, - ov::intel_cpu::MultiCacheWeakPtr); + explicit CPUTargetMachine(dnnl::impl::cpu::x64::cpu_isa_t host_isa, ov::intel_cpu::MultiCacheWeakPtr); std::shared_ptr clone() const override; bool is_supported() const override; snippets::CompiledSnippetPtr get_snippet() override; @@ -60,5 +58,5 @@ class CPUGenerator : public snippets::Generator { bool uses_precompiled_kernel(const std::shared_ptr& emitter) const override; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.cpp index 53d8fea05a8adf..6df658d8d72d0c 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.cpp @@ -4,18 +4,15 @@ #include "jit_brgemm_copy_b_emitter.hpp" +#include +#include + #include "emitters/plugin/x64/utils.hpp" #include "emitters/snippets/x64/utils.hpp" - -#include "snippets/utils/utils.hpp" #include "snippets/lowered/expression.hpp" - +#include "snippets/utils/utils.hpp" #include "transformations/snippets/x64/op/brgemm_cpu.hpp" -#include -#include - - using namespace Xbyak; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; @@ -34,7 +31,9 @@ bool get_is_transposed(const ov::snippets::lowered::ExpressionPtr& expr) { } } // namespace -jit_brgemm_copy_b_emitter::jit_brgemm_copy_b_emitter(jit_generator* h, cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr, +jit_brgemm_copy_b_emitter::jit_brgemm_copy_b_emitter(jit_generator* h, + cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr, const snippets::KernelExecutorTablePtr& kernel_table, const ov::intel_cpu::MultiCacheWeakPtr& compiled_kernel_cache) : jit_emitter(h, isa) { @@ -57,17 +56,20 @@ jit_brgemm_copy_b_emitter::jit_brgemm_copy_b_emitter(jit_generator* h, cpu_isa_t m_with_comp = with_compensations(brgemm_type); BrgemmCopyBKernelConfig kernel_config(src_prc, wei_prc, primitive_isa, m_with_comp, is_transposed, wei_N_blk); - m_kernel_executor = kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); + m_kernel_executor = + kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); m_memory_offsets = {brgemm_repack->get_offset_in(), brgemm_repack->get_offset_out()}; - m_buffer_ids = {utils::get_buffer_cluster_id(expr->get_input_port(0)), utils::get_buffer_cluster_id(expr->get_output_port(0))}; + m_buffer_ids = {utils::get_buffer_cluster_id(expr->get_input_port(0)), + utils::get_buffer_cluster_id(expr->get_output_port(0))}; if (m_with_comp) { m_memory_offsets.push_back(brgemm_repack->get_offset_compensations()); m_buffer_ids.push_back(utils::get_buffer_cluster_id(expr->get_output_port(1))); } } -void jit_brgemm_copy_b_emitter::validate_arguments(const std::vector &in, const std::vector &out) const { +void jit_brgemm_copy_b_emitter::validate_arguments(const std::vector& in, + const std::vector& out) const { OV_CPU_JIT_EMITTER_ASSERT(in.size() == 1, "expects 1 input"); OV_CPU_JIT_EMITTER_ASSERT((m_with_comp && out.size() == 2) || (!m_with_comp && out.size() == 1), "expects 2 outputs if there are compensations"); @@ -87,14 +89,20 @@ void jit_brgemm_copy_b_emitter::emit_impl(const std::vector& in, const s // Reserve memory on the stack h->sub(h->rsp, reserved_stack_size); - const bool is_dynamic_case = std::any_of(m_memory_offsets.cbegin(), m_memory_offsets.cend(), ov::snippets::utils::is_dynamic_value); + const bool is_dynamic_case = + std::any_of(m_memory_offsets.cbegin(), m_memory_offsets.cend(), ov::snippets::utils::is_dynamic_value); Xbyak::Reg64 aux_reg = is_dynamic_case ? ov::intel_cpu::utils::get_aux_gpr(mem_ptrs_idxs) : Xbyak::Reg64(); - const std::vector args_offsets {GET_OFF_BRGEMM_COPY_B_ARGS(src), GET_OFF_BRGEMM_COPY_B_ARGS(tr_src), GET_OFF_BRGEMM_COPY_B_ARGS(compensation_ptr)}; + const std::vector args_offsets{GET_OFF_BRGEMM_COPY_B_ARGS(src), + GET_OFF_BRGEMM_COPY_B_ARGS(tr_src), + GET_OFF_BRGEMM_COPY_B_ARGS(compensation_ptr)}; const auto& mem_ptrs = ov::intel_cpu::utils::transform_idxs_to_regs(mem_ptrs_idxs); for (size_t i = 0; i < mem_ptrs.size(); i++) { if (ov::snippets::utils::is_dynamic_value(m_memory_offsets[i])) - utils::push_ptr_with_runtime_offset_on_stack(h, args_offsets[i], mem_ptrs[i], aux_reg, + utils::push_ptr_with_runtime_offset_on_stack(h, + args_offsets[i], + mem_ptrs[i], + aux_reg, GET_OFF(buffer_offsets) + m_buffer_ids[i] * sizeof(size_t)); else utils::push_ptr_with_static_offset_on_stack(h, args_offsets[i], mem_ptrs[i], m_memory_offsets[i]); @@ -116,5 +124,5 @@ void jit_brgemm_copy_b_emitter::emit_impl(const std::vector& in, const s spill.postamble(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.hpp index ef53efe6081217..96a80153bba4b6 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_copy_b_emitter.hpp @@ -5,38 +5,40 @@ #pragma once #include "emitters/plugin/x64/jit_emitter.hpp" - #include "kernel_executors/brgemm_copy_b.hpp" - namespace ov { namespace intel_cpu { class jit_brgemm_copy_b_emitter : public jit_emitter { public: - jit_brgemm_copy_b_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_brgemm_copy_b_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr, const snippets::KernelExecutorTablePtr& kernel_table, const ov::intel_cpu::MultiCacheWeakPtr& compiled_kernel_cache); - size_t get_inputs_num() const override {return 1;} - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr) { + size_t get_inputs_num() const override { + return 1; + } + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr) { return {{element::i8}, {element::bf16}, {element::f32}}; } private: - void validate_arguments(const std::vector &in, const std::vector &out) const override; + void validate_arguments(const std::vector& in, const std::vector& out) const override; void emit_impl(const std::vector& in, const std::vector& out) const override; std::vector m_memory_offsets{}; std::vector m_buffer_ids{}; - std::shared_ptr m_kernel_executor {nullptr}; - bool m_with_comp {false}; + std::shared_ptr m_kernel_executor{nullptr}; + bool m_with_comp{false}; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_brgemm_copy_b_emitter(const jit_brgemm_copy_b_emitter *emitter); + friend std::string init_info_jit_brgemm_copy_b_emitter(const jit_brgemm_copy_b_emitter* emitter); #endif }; -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.cpp index 6e70cbf2e8fe81..172a1cc0b98284 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.cpp @@ -4,13 +4,12 @@ #include "jit_brgemm_emitter.hpp" -#include "transformations/snippets/x64/op/brgemm_cpu.hpp" -#include "transformations/snippets/x64/op/brgemm_utils.hpp" +#include "emitters/plugin/x64/utils.hpp" #include "emitters/snippets/x64/kernel_executors/brgemm.hpp" #include "emitters/snippets/x64/kernel_executors/brgemm_amx.hpp" -#include "emitters/plugin/x64/utils.hpp" - #include "snippets/utils/utils.hpp" +#include "transformations/snippets/x64/op/brgemm_cpu.hpp" +#include "transformations/snippets/x64/op/brgemm_utils.hpp" #include "utils.hpp" using namespace Xbyak; @@ -20,11 +19,12 @@ using namespace dnnl::impl::cpu::x64; namespace ov { namespace intel_cpu { -jit_brgemm_emitter::jit_brgemm_emitter(jit_generator* h, cpu_isa_t isa, +jit_brgemm_emitter::jit_brgemm_emitter(jit_generator* h, + cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr, const snippets::KernelExecutorTablePtr& kernel_table, - const ov::intel_cpu::MultiCacheWeakPtr& compiled_kernel_cache) : - jit_emitter(h, isa) { + const ov::intel_cpu::MultiCacheWeakPtr& compiled_kernel_cache) + : jit_emitter(h, isa) { in_out_type_ = emitter_in_out_map::gpr_to_gpr; const auto& brgemm_node = as_type_ptr(expr->get_node()); const auto& brg0Prc = brgemm_node->get_input_element_type(0); @@ -33,20 +33,26 @@ jit_brgemm_emitter::jit_brgemm_emitter(jit_generator* h, cpu_isa_t isa, m_is_with_amx = brgemm_utils::with_amx(brgemm_type); if (m_is_with_amx) { BrgemmAMXKernelConfig kernel_config(brg0Prc, brg1Prc, brgemm_utils::get_primitive_isa(brg0Prc, true)); - m_kernel_executor = kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); + m_kernel_executor = + kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); } else { - BrgemmKernelConfig kernel_config(brg0Prc, brg1Prc, with_compensations(brgemm_type), brgemm_utils::get_primitive_isa(brg0Prc, false)); - m_kernel_executor = kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); + BrgemmKernelConfig kernel_config(brg0Prc, + brg1Prc, + with_compensations(brgemm_type), + brgemm_utils::get_primitive_isa(brg0Prc, false)); + m_kernel_executor = + kernel_table->register_kernel(expr, compiled_kernel_cache, kernel_config); } // Note: even if the Brgemm node is dynamic, the first shapeInfer and RuntimeConfigurator::update() // are performed before the BrgemmKernelExecutor registration. So we have to trigger update() manually // for both static and the 1st dynamic shapes. OV_CPU_JIT_EMITTER_ASSERT(!snippets::utils::is_dynamic_vdims(expr->get_input_port_descriptor(0)->get_shape()) && - !snippets::utils::is_dynamic_vdims(expr->get_input_port_descriptor(1)->get_shape()), + !snippets::utils::is_dynamic_vdims(expr->get_input_port_descriptor(1)->get_shape()), "Jit emitter is called when the shapes are unknown"); m_memory_offsets = {brgemm_node->get_offset_a(), brgemm_node->get_offset_b(), brgemm_node->get_offset_c()}; - m_buffer_ids = {utils::get_buffer_cluster_id(expr->get_input_port(0)), utils::get_buffer_cluster_id(expr->get_input_port(1)), + m_buffer_ids = {utils::get_buffer_cluster_id(expr->get_input_port(0)), + utils::get_buffer_cluster_id(expr->get_input_port(1)), utils::get_buffer_cluster_id(expr->get_output_port(0))}; if (with_scratchpad(brgemm_type)) { m_memory_offsets.push_back(brgemm_node->get_offset_scratch()); @@ -54,7 +60,8 @@ jit_brgemm_emitter::jit_brgemm_emitter(jit_generator* h, cpu_isa_t isa, } } -std::set> jit_brgemm_emitter::get_supported_precisions(const std::shared_ptr& node) { +std::set> jit_brgemm_emitter::get_supported_precisions( + const std::shared_ptr& node) { const auto brgemm = as_type_ptr(node); OV_CPU_JIT_EMITTER_ASSERT(brgemm, "get_supported_precisions() expects BrgemmCPU node"); using brgemm_utils::BRGEMM_TYPE; @@ -77,7 +84,7 @@ std::set> jit_brgemm_emitter::get_supported_precision OV_CPU_JIT_EMITTER_THROW("got BrgemmCPU node with unsupported type"); } -void jit_brgemm_emitter::validate_arguments(const std::vector &in, const std::vector &out) const { +void jit_brgemm_emitter::validate_arguments(const std::vector& in, const std::vector& out) const { OV_CPU_JIT_EMITTER_ASSERT(m_memory_offsets.size() == in.size() + 1 && (out.size() == 1), "expects 3 inputs if there are compensations/wsp"); } @@ -96,8 +103,7 @@ void jit_brgemm_emitter::emit_impl(const std::vector& in, const std::vec OV_CPU_JIT_EMITTER_THROW("uknown execuor type"); } -template::value, bool>::type> +template ::value, bool>::type> void jit_brgemm_emitter::emit_call(const std::vector& mem_ptrs_idxs) const { EmitABIRegSpills spill(h); spill.preamble(); @@ -107,17 +113,24 @@ void jit_brgemm_emitter::emit_call(const std::vector& mem_ptrs_idxs) con // Reserve memory on the stack h->sub(h->rsp, reserved_stack_size); - const bool is_dynamic_case = std::any_of(m_memory_offsets.cbegin(), m_memory_offsets.cend(), ov::snippets::utils::is_dynamic_value); + const bool is_dynamic_case = + std::any_of(m_memory_offsets.cbegin(), m_memory_offsets.cend(), ov::snippets::utils::is_dynamic_value); Xbyak::Reg64 aux_reg = is_dynamic_case ? ov::intel_cpu::utils::get_aux_gpr(mem_ptrs_idxs) : Xbyak::Reg64(); #define GET_OFF_CALL_ARGS(field) offsetof(typename T::call_args, field) - const std::vector brgemm_args_offsets = { GET_OFF_CALL_ARGS(A), GET_OFF_CALL_ARGS(B), GET_OFF_CALL_ARGS(C), GET_OFF_CALL_ARGS(scratch) }; + const std::vector brgemm_args_offsets = {GET_OFF_CALL_ARGS(A), + GET_OFF_CALL_ARGS(B), + GET_OFF_CALL_ARGS(C), + GET_OFF_CALL_ARGS(scratch)}; #undef GET_OFF_CALL_ARGS const auto& mem_ptrs = utils::transform_idxs_to_regs(mem_ptrs_idxs); for (size_t i = 0; i < mem_ptrs.size(); i++) { if (ov::snippets::utils::is_dynamic_value(m_memory_offsets[i])) - utils::push_ptr_with_runtime_offset_on_stack(h, brgemm_args_offsets[i], mem_ptrs[i], aux_reg, + utils::push_ptr_with_runtime_offset_on_stack(h, + brgemm_args_offsets[i], + mem_ptrs[i], + aux_reg, GET_OFF(buffer_offsets) + m_buffer_ids[i] * sizeof(size_t)); else utils::push_ptr_with_static_offset_on_stack(h, brgemm_args_offsets[i], mem_ptrs[i], m_memory_offsets[i]); @@ -145,5 +158,5 @@ void jit_brgemm_emitter::emit_call(const std::vector& mem_ptrs_idxs) con spill.postamble(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.hpp index ccec1b68b18b20..9d072065c0fe52 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_brgemm_emitter.hpp @@ -12,34 +12,39 @@ namespace intel_cpu { class jit_brgemm_emitter : public jit_emitter { public: - jit_brgemm_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_brgemm_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr, const snippets::KernelExecutorTablePtr& kernel_table, const ov::intel_cpu::MultiCacheWeakPtr& compiled_kernel_cache); - size_t get_inputs_num() const override { return m_memory_offsets.size() - 1; } - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr); + size_t get_inputs_num() const override { + return m_memory_offsets.size() - 1; + } + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr); private: - void validate_arguments(const std::vector &in, const std::vector &out) const override; + void validate_arguments(const std::vector& in, const std::vector& out) const override; void emit_impl(const std::vector& in, const std::vector& out) const override; template ::value, bool>::type = true> void emit_call(const std::vector& mem_ptrs_idxs) const; - // Note: offsets order: A, B, C (+ scratchpad, if needed). Values can be dynamic_value if offset is calculated in runtime + // Note: offsets order: A, B, C (+ scratchpad, if needed). Values can be dynamic_value if offset is calculated in + // runtime std::vector m_memory_offsets{}; // Note: cluster ids order: A, B, C (+ scratchpad, if needed). Values can be dynamic_value if there is no buffer std::vector m_buffer_ids{}; std::shared_ptr m_kernel_executor = nullptr; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_brgemm_emitter(const jit_brgemm_emitter *emitter); + friend std::string init_info_jit_brgemm_emitter(const jit_brgemm_emitter* emitter); #endif - bool m_is_with_amx {false}; + bool m_is_with_amx{false}; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.cpp index 05b9d15786157b..45ebfc83899dba 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.cpp @@ -4,9 +4,11 @@ #ifdef SNIPPETS_DEBUG_CAPS -#include "jit_debug_emitter.hpp" -#include -#include "utils/general_utils.h" +# include "jit_debug_emitter.hpp" + +# include + +# include "utils/general_utils.h" using namespace dnnl::impl::cpu; using namespace dnnl::impl; @@ -27,8 +29,10 @@ size_t jit_debug_emitter::aux_gprs_count() const { return m_target_emitter->aux_gprs_count(); } -void jit_debug_emitter::emitter_preamble(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_debug_emitter::emitter_preamble(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { m_target_emitter->emitter_preamble(in_idxs, out_idxs, pool_vec_idxs, pool_gpr_idxs); } @@ -52,12 +56,14 @@ void jit_debug_emitter::register_table_entries() { m_target_emitter->register_table_entries(); } -void jit_debug_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_debug_emitter::emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const { m_target_emitter->emit_impl(in_idxs, out_idxs); } -void jit_debug_emitter::emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_debug_emitter::emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { if (m_decorator_emit_loc == EmissionLocation::preamble || m_decorator_emit_loc == EmissionLocation::both) m_decorator_emitter->emit_code(in_idxs, out_idxs, pool_vec_idxs, pool_gpr_idxs); @@ -67,7 +73,7 @@ void jit_debug_emitter::emit_code(const std::vector &in_idxs, const std: m_decorator_emitter->emit_code(in_idxs, out_idxs, pool_vec_idxs, pool_gpr_idxs); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.hpp index fe7cc527418587..2591af119cc3b5 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_debug_emitter.hpp @@ -4,29 +4,33 @@ #ifdef SNIPPETS_DEBUG_CAPS -#pragma once - -#include "emitters/plugin/x64/jit_emitter.hpp" +# pragma once +# include "emitters/plugin/x64/jit_emitter.hpp" namespace ov { namespace intel_cpu { class jit_debug_emitter : public jit_emitter { public: - enum class EmissionLocation { - preamble, - postamble, - both - }; - jit_debug_emitter(const std::shared_ptr& target_emitter, const std::shared_ptr& decorator_emitter, const EmissionLocation& loc) - : jit_emitter(target_emitter->h, target_emitter->host_isa_, target_emitter->exec_prc_, target_emitter->in_out_type_), - m_target_emitter(target_emitter), m_decorator_emitter(decorator_emitter), m_decorator_emit_loc(loc) { - prepare_table(); - } - - void emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + enum class EmissionLocation { preamble, postamble, both }; + jit_debug_emitter(const std::shared_ptr& target_emitter, + const std::shared_ptr& decorator_emitter, + const EmissionLocation& loc) + : jit_emitter(target_emitter->h, + target_emitter->host_isa_, + target_emitter->exec_prc_, + target_emitter->in_out_type_), + m_target_emitter(target_emitter), + m_decorator_emitter(decorator_emitter), + m_decorator_emit_loc(loc) { + prepare_table(); + } + + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; void emit_data() const override; size_t get_inputs_num() const override; @@ -38,10 +42,12 @@ class jit_debug_emitter : public jit_emitter { void prepare_table() override; void register_table_entries() override; - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; - void emitter_preamble(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const override; + void emitter_preamble(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const override; void emitter_postamble() const override; private: @@ -54,7 +60,7 @@ class jit_debug_emitter : public jit_emitter { EmissionLocation m_decorator_emit_loc; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.cpp index 1c05100317ae5f..687917acbabc5a 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.cpp @@ -4,16 +4,15 @@ #include "jit_fill_emitter.hpp" - using namespace Xbyak; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; - namespace ov { namespace intel_cpu { -jit_fill_emitter::jit_fill_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, +jit_fill_emitter::jit_fill_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) : jit_emitter(h, isa, ov::element::f32, emitter_in_out_map::vec_to_vec) { const auto fill = ov::as_type_ptr(expr->get_node()); @@ -52,9 +51,9 @@ void jit_fill_emitter::emit_impl(const std::vector& in, const std::vecto } template -void jit_fill_emitter::emit_isa(const std::vector &in, const std::vector &out) const { - using Vmm = typename dnnl::impl::utils::conditional3::type; +void jit_fill_emitter::emit_isa(const std::vector& in, const std::vector& out) const { + using Vmm = typename dnnl::impl::utils:: + conditional3::type; Vmm src_vmm = Vmm(in[0]); Vmm dst_vmm = Vmm(out[0]); @@ -62,7 +61,8 @@ void jit_fill_emitter::emit_isa(const std::vector &in, const std::vector const size_t supported_et_size = 4; const auto register_capacity = (src_vmm.getBit() / 8) / supported_et_size; if (offset == register_capacity) { - // WA: since AssignRegisters doesn't support inplace logic, Fill ops with offset = register_capacity can't be removed from the LIR + // WA: since AssignRegisters doesn't support inplace logic, Fill ops with offset = register_capacity can't be + // removed from the LIR // TODO: when inplace is supported, remove such Fill ops from the LIR and remove this logic. // Ticket: 126270 if (src_vmm.getIdx() != dst_vmm.getIdx()) @@ -105,5 +105,5 @@ void jit_fill_emitter::fill_tail(const Vmm& src_vmm, const Vmm& dst_vmm) const { } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.hpp index 79e9a0e4027a5d..23b929cc161ca7 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_fill_emitter.hpp @@ -6,15 +6,18 @@ #include "emitters/plugin/x64/jit_emitter.hpp" - namespace ov { namespace intel_cpu { class jit_fill_emitter : public jit_emitter { public: - jit_fill_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); + jit_fill_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 1;} + size_t get_inputs_num() const override { + return 1; + } protected: size_t aux_gprs_count() const override; @@ -23,18 +26,22 @@ class jit_fill_emitter : public jit_emitter { void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in, const std::vector &out) const; + void emit_isa(const std::vector& in, const std::vector& out) const; template void fill_full(const Vmm& vmm_dst) const; template void fill_tail(const Vmm& vmm_src, const Vmm& vmm_dst) const; - bool is_full_reg() const { return offset == 0; } - bool is_optimized() const { return is_full_reg() && fill_value == uint32_t(0x0); } + bool is_full_reg() const { + return offset == 0; + } + bool is_optimized() const { + return is_full_reg() && fill_value == uint32_t(0x0); + } size_t offset = 0; uint32_t fill_value = 0x0; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.cpp index a4f5cbe16d7e1f..34e9c2f71fd148 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.cpp @@ -4,7 +4,6 @@ #include "jit_horizon_emitter.hpp" - using namespace Xbyak; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; @@ -12,7 +11,8 @@ using namespace dnnl::impl::cpu::x64; namespace ov { namespace intel_cpu { -jit_horizon_emitter::jit_horizon_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, +jit_horizon_emitter::jit_horizon_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) : jit_emitter(h, isa, ov::element::f32, emitter_in_out_map::vec_to_vec) { if (ov::is_type(expr->get_node())) { @@ -24,8 +24,7 @@ jit_horizon_emitter::jit_horizon_emitter(dnnl::impl::cpu::x64::jit_generator* h, } } -void jit_horizon_emitter::emit_impl(const std::vector& in, - const std::vector& out) const { +void jit_horizon_emitter::emit_impl(const std::vector& in, const std::vector& out) const { if (host_isa_ == dnnl::impl::cpu::x64::sse41) { emit_isa(in, out); } else if (host_isa_ == dnnl::impl::cpu::x64::avx2) { @@ -38,9 +37,12 @@ void jit_horizon_emitter::emit_impl(const std::vector& in, } template -void jit_horizon_emitter::emit_isa(const std::vector &in, const std::vector &out) const { +void jit_horizon_emitter::emit_isa(const std::vector& in, const std::vector& out) const { using Vmm = typename dnnl::impl::utils::conditional3::type; + Xbyak::Xmm, + isa == dnnl::impl::cpu::x64::avx2, + Xbyak::Ymm, + Xbyak::Zmm>::type; Vmm src_vmm = Vmm(in[0]); Vmm dst_vmm = Vmm(out[0]); @@ -67,19 +69,19 @@ void jit_horizon_emitter::emit_isa(const std::vector &in, const std::vec perform_op(dst_vmm, dst_vmm, aux_vmm); } -template -void jit_horizon_emitter::perform_op(const Vmm &vmm1, const Vmm &vmm2, const Vmm &vmm3) const { +template +void jit_horizon_emitter::perform_op(const Vmm& vmm1, const Vmm& vmm2, const Vmm& vmm3) const { switch (m_op_type) { - case OpType::max: - h->uni_vmaxps(vmm1, vmm2, vmm3); - break; - case OpType::sum: - h->uni_vaddps(vmm1, vmm2, vmm3); - break; - default: - OV_CPU_JIT_EMITTER_THROW("Unsupported horizontal operation."); + case OpType::max: + h->uni_vmaxps(vmm1, vmm2, vmm3); + break; + case OpType::sum: + h->uni_vaddps(vmm1, vmm2, vmm3); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported horizontal operation."); } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.hpp index 1b222cb2a86776..df74b2ad9783a4 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_horizon_emitter.hpp @@ -6,34 +6,40 @@ #include "emitters/plugin/x64/jit_emitter.hpp" - namespace ov { namespace intel_cpu { class jit_horizon_emitter : public jit_emitter { public: - jit_horizon_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); + jit_horizon_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 1;} - static std::set> get_supported_precisions(const std::shared_ptr& node = nullptr) { + size_t get_inputs_num() const override { + return 1; + } + static std::set> get_supported_precisions( + const std::shared_ptr& node = nullptr) { return {{element::f32}}; } protected: - size_t aux_vecs_count() const override {return 1;} + size_t aux_vecs_count() const override { + return 1; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in, const std::vector &out) const; + void emit_isa(const std::vector& in, const std::vector& out) const; - template - void perform_op(const Vmm &vmm1, const Vmm &vmm2, const Vmm &vmm3) const; + template + void perform_op(const Vmm& vmm1, const Vmm& vmm2, const Vmm& vmm3) const; enum class OpType { max, sum }; OpType m_op_type = OpType::max; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_kernel_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_kernel_emitter.cpp index 476123355abe70..bd5a3227e1e125 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_kernel_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_kernel_emitter.cpp @@ -14,8 +14,11 @@ using namespace dnnl::impl::cpu::x64; namespace ov { namespace intel_cpu { -jit_kernel_emitter::jit_kernel_emitter(jit_generator* h, cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) - : jit_emitter(h, isa), reg_runtime_params_idx(abi_param1.getIdx()) { +jit_kernel_emitter::jit_kernel_emitter(jit_generator* h, + cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr) + : jit_emitter(h, isa), + reg_runtime_params_idx(abi_param1.getIdx()) { const auto kernel = ov::as_type_ptr(expr->get_node()); OV_CPU_JIT_EMITTER_ASSERT(kernel != nullptr, "invoked with invalid op argument"); OV_CPU_JIT_EMITTER_ASSERT(!kernel->region->empty(), "invoked with empty body"); @@ -59,8 +62,12 @@ void jit_kernel_emitter::init_reg_pools(const std::set& gpr_blacklist, c gp_regs_pool[i] = vec_regs_pool[i] = 15 - i; auto remove_regs_from_pool = [](std::vector& pool, const std::set& to_remove) { // It's important to keep the order of other elements - pool.erase(std::remove_if(pool.begin(), pool.end(), - [&](size_t x) {return to_remove.count(x) != 0;}), pool.end()); + pool.erase(std::remove_if(pool.begin(), + pool.end(), + [&](size_t x) { + return to_remove.count(x) != 0; + }), + pool.end()); }; // Reserve stack base and pointer for push(...) and pop(...) operations std::set gprs_blacklist_extended{Xbyak::Operand::RSP, Xbyak::Operand::RBP}; @@ -70,25 +77,31 @@ void jit_kernel_emitter::init_reg_pools(const std::set& gpr_blacklist, c remove_regs_from_pool(vec_regs_pool, vec_blacklist); } -void jit_kernel_emitter::emit_code(const std::vector &in, const std::vector &out, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_kernel_emitter::emit_code(const std::vector& in, + const std::vector& out, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { validate_arguments(in, out); emit_impl(in, out); } -void jit_kernel_emitter::validate_arguments(const std::vector &in, const std::vector &out) const { +void jit_kernel_emitter::validate_arguments(const std::vector& in, const std::vector& out) const { OV_CPU_JIT_EMITTER_ASSERT(in.empty() && out.empty(), ": expects 0 registers on input and output"); const auto num_params = num_inputs + num_outputs + num_unique_buffers; // The number of used gpr may be >= num_params since LoopBegin+LoopEnd could also use gpr to store work_amount OV_CPU_JIT_EMITTER_ASSERT(data_ptr_regs_idx.size() == num_params, - "number of inputs and outputs is inconsistent with the number of allocated registers ", num_params, - " data_ptr_regs_idx.size() = ", data_ptr_regs_idx.size()); + "number of inputs and outputs is inconsistent with the number of allocated registers ", + num_params, + " data_ptr_regs_idx.size() = ", + data_ptr_regs_idx.size()); } void jit_kernel_emitter::init_body_regs(const std::set& kernel_regs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) { + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) { // Initialize pools of gp and vec registers - // Reserve kernel regs (abi_param1 and, if there is, abi_param2), since they'll be used to pass runtime call args to kernel + // Reserve kernel regs (abi_param1 and, if there is, abi_param2), since they'll be used to pass runtime call args to + // kernel init_reg_pools(kernel_regs, {}); mapping_info gpr_map_pool({}, gp_regs_pool); @@ -122,9 +135,11 @@ void jit_kernel_emitter::emit_impl(const std::vector& in, const std::vec h->postamble(); } -jit_kernel_static_emitter::jit_kernel_static_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, +jit_kernel_static_emitter::jit_kernel_static_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) - : jit_kernel_emitter(h, isa, expr), reg_indexes_idx(abi_param2.getIdx()) { + : jit_kernel_emitter(h, isa, expr), + reg_indexes_idx(abi_param2.getIdx()) { const auto kernel = ov::as_type_ptr(expr->get_node()); OV_CPU_JIT_EMITTER_ASSERT(kernel != nullptr, "expectes KernelStatic expression"); jcp = *reinterpret_cast(kernel->compile_params); @@ -158,12 +173,12 @@ void jit_kernel_static_emitter::init_data_pointers(const std::vector(*spare_corruptable_gpr)); + Reg64 reg_tmp = + last_iter_explicitly ? data_ptr_regs[num_params - 1] : Reg64(static_cast(*spare_corruptable_gpr)); // Vector "data_ptr_regs" is sorted by abstract regs. // It means that the vector contains the physical registers in order [src, .., src, dst, .., dst, buffer] // So we can initialize buffer register firstly as last value of vector "data_ptr_regs" @@ -193,13 +208,15 @@ void jit_kernel_static_emitter::init_data_pointers(const std::vector(expr->get_node()); OV_CPU_JIT_EMITTER_ASSERT(kernel, "expectes KernelDynamic expression"); - // - Reserve abi_param1, since it wll be used to pass runtime call args to all dynamic emitters that needs runtime args + // - Reserve abi_param1, since it wll be used to pass runtime call args to all dynamic emitters that needs runtime + // args // - We cannot assign this register to the body emitters since runtime params MUST be valid during whole execution // for all dynamic emitters init_body_regs({reg_runtime_params_idx}); @@ -220,5 +237,5 @@ void jit_kernel_dynamic_emitter::init_data_pointers(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + jit_kernel_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); + + size_t get_inputs_num() const override { + return 0; + } + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; protected: void validate_arguments(const std::vector& in, const std::vector& out) const override; - void init_body_regs(const std::set& kernel_regs, const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}); + void init_body_regs(const std::set& kernel_regs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}); /** - * @brief populates physical registers pools for x86 (both vec and gp). + * @brief populates physical registers pools for x86 (both vec and gp). * Skips stack-related gprs and extra gprs passed as arguments. * @arg gpr_blacklist - set of gp registers that should not be added to register pool * @arg vec_blacklist - set of vec registers should not be added to register pool - */ + */ void init_reg_pools(const std::set& gpr_blacklist, const std::set& vec_blacklist); virtual void init_data_pointers(const std::vector& data_ptr_regs) const = 0; @@ -70,13 +77,15 @@ class jit_kernel_emitter : public jit_emitter, public jit_container_emitter { std::shared_ptr body; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_kernel_emitter(const jit_kernel_emitter *emitter); + friend std::string init_info_jit_kernel_emitter(const jit_kernel_emitter* emitter); #endif }; class jit_kernel_static_emitter : public jit_kernel_emitter { public: - jit_kernel_static_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); + jit_kernel_static_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); private: void init_data_pointers(const std::vector& data_ptr_regs) const override; @@ -86,21 +95,23 @@ class jit_kernel_static_emitter : public jit_kernel_emitter { std::vector> data_offsets; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_kernel_static_emitter(const jit_kernel_static_emitter *emitter); + friend std::string init_info_jit_kernel_static_emitter(const jit_kernel_static_emitter* emitter); #endif }; class jit_kernel_dynamic_emitter : public jit_kernel_emitter { public: - jit_kernel_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); + jit_kernel_dynamic_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); private: void init_data_pointers(const std::vector& data_ptr_regs) const override; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_kernel_dynamic_emitter(const jit_kernel_dynamic_emitter *emitter); + friend std::string init_info_jit_kernel_dynamic_emitter(const jit_kernel_dynamic_emitter* emitter); #endif }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.cpp index f3151d0df4ccb1..86421678a29011 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.cpp @@ -18,8 +18,11 @@ namespace intel_cpu { namespace { class jit_aux_gpr_holder { public: - jit_aux_gpr_holder(dnnl::impl::cpu::x64::jit_generator* host, std::vector& pool_gpr_idxs, const std::vector& used_gpr_idxs) - : m_h(host), m_pool_gpr_idxs(pool_gpr_idxs) { + jit_aux_gpr_holder(dnnl::impl::cpu::x64::jit_generator* host, + std::vector& pool_gpr_idxs, + const std::vector& used_gpr_idxs) + : m_h(host), + m_pool_gpr_idxs(pool_gpr_idxs) { // If the pool is empty, let's manualy allocate the gpr and push original vlaue on stack if (m_pool_gpr_idxs.empty()) { m_aux_gpr_idx = ov::intel_cpu::utils::get_aux_gpr(used_gpr_idxs); @@ -39,21 +42,26 @@ class jit_aux_gpr_holder { } } - const Reg64& get_reg() const { return m_aux_gpr_idx; } + const Reg64& get_reg() const { + return m_aux_gpr_idx; + } private: dnnl::impl::cpu::x64::jit_generator* m_h; std::vector& m_pool_gpr_idxs; - Reg64 m_aux_gpr_idx {}; + Reg64 m_aux_gpr_idx{}; bool m_is_preserved = false; }; } // namespace /* ================== jit_loop_begin_emitter ====================== */ -jit_loop_begin_emitter::jit_loop_begin_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, +jit_loop_begin_emitter::jit_loop_begin_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) - : jit_emitter(h, isa), loop_begin_label{new Xbyak::Label()}, loop_end_label(nullptr) { + : jit_emitter(h, isa), + loop_begin_label{new Xbyak::Label()}, + loop_end_label(nullptr) { const auto loop_begin = ov::as_type_ptr(expr->get_node()); OV_CPU_JIT_EMITTER_ASSERT(loop_begin, "expects LoopBegin expression"); const auto loop_end = loop_begin->get_loop_end(); @@ -65,7 +73,7 @@ jit_loop_begin_emitter::jit_loop_begin_emitter(dnnl::impl::cpu::x64::jit_generat in_out_type_ = emitter_in_out_map::gpr_to_gpr; } -void jit_loop_begin_emitter::validate_arguments(const std::vector &in, const std::vector &out) const { +void jit_loop_begin_emitter::validate_arguments(const std::vector& in, const std::vector& out) const { OV_CPU_JIT_EMITTER_ASSERT(in.empty(), "Invalid inputs size: expected 0 got " + std::to_string(in.size())); // Note: the only expected output is work amount register (communicated to jit_loop_end_emitter) OV_CPU_JIT_EMITTER_ASSERT(out.size() == 1, "Invalid outputs size: expected 1 got " + std::to_string(out.size())); @@ -74,21 +82,24 @@ void jit_loop_begin_emitter::validate_arguments(const std::vector &in, c "loop increment might be dynamic only if loop evaluates once!"); } -void jit_loop_begin_emitter::emit_code(const std::vector &in, const std::vector &out, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_loop_begin_emitter::emit_code(const std::vector& in, + const std::vector& out, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { validate_arguments(in, out); jit_emitter::emit_code(in, out, pool_vec_idxs, pool_gpr_idxs); } void jit_loop_begin_emitter::emit_impl(const std::vector& in, const std::vector& out) const { // If the loop evaulate once, we can skip loop begin code emission - // If work_amount is dynamic, we should get runtime `work_amount` - it might be `zero` and we should skip loop evaluation + // If work_amount is dynamic, we should get runtime `work_amount` - it might be `zero` and we should skip loop + // evaluation if (evaluate_once && !is_work_amount_dynamic) return; Reg64 reg_work_amount = Reg64(static_cast(out.back())); if (is_work_amount_dynamic) { - jit_aux_gpr_holder gpr_holder(h, aux_gpr_idxs, out); // loop_begin has only output registers + jit_aux_gpr_holder gpr_holder(h, aux_gpr_idxs, out); // loop_begin has only output registers Reg64 reg_loop_args_ptr = gpr_holder.get_reg(); const auto id_offset = loop_id * sizeof(jit_snippets_call_args::loop_args_t); h->mov(reg_loop_args_ptr, h->ptr[abi_param1 + GET_OFF(loop_args)]); @@ -113,9 +124,12 @@ void jit_loop_begin_emitter::emit_impl(const std::vector& in, const std: /* ================== jit_loop_end_emitter ====================== */ -jit_loop_end_emitter::jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, +jit_loop_end_emitter::jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr) - : jit_emitter(h, isa), loop_begin_label{nullptr}, loop_end_label{new Xbyak::Label()} { + : jit_emitter(h, isa), + loop_begin_label{nullptr}, + loop_end_label{new Xbyak::Label()} { in_out_type_ = emitter_in_out_map::gpr_to_gpr; const auto loop_end = ov::as_type_ptr(expr->get_node()); OV_CPU_JIT_EMITTER_ASSERT(loop_end != nullptr, "expected LoopEnd expr"); @@ -132,8 +146,9 @@ jit_loop_end_emitter::jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* are_ptr_increments_dynamic = std::any_of(ptr_increments.cbegin(), ptr_increments.cend(), ov::snippets::utils::is_dynamic_value); - are_final_offsets_dynamic = - std::any_of(finalization_offsets.cbegin(), finalization_offsets.cend(), ov::snippets::utils::is_dynamic_value); + are_final_offsets_dynamic = std::any_of(finalization_offsets.cbegin(), + finalization_offsets.cend(), + ov::snippets::utils::is_dynamic_value); are_ptr_shifts_dynamic = are_ptr_increments_dynamic || are_final_offsets_dynamic; const auto begin_expr = get_loop_begin_expr(expr); @@ -143,29 +158,51 @@ jit_loop_end_emitter::jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* loop_begin_label = loop_begin_emitter->get_begin_label(); } -ov::snippets::lowered::ExpressionPtr jit_loop_end_emitter::get_loop_begin_expr(const ov::snippets::lowered::ExpressionPtr& expr) { +ov::snippets::lowered::ExpressionPtr jit_loop_end_emitter::get_loop_begin_expr( + const ov::snippets::lowered::ExpressionPtr& expr) { const auto begin_expr = expr->get_input_port_connectors().back()->get_source().get_expr(); OV_CPU_JIT_EMITTER_ASSERT(ov::is_type(begin_expr->get_node()), "LoopEnd expression must have th last port connector to LoopBegin"); return begin_expr; } -void jit_loop_end_emitter::validate_arguments(const std::vector &in, const std::vector &out) const { +void jit_loop_end_emitter::validate_arguments(const std::vector& in, const std::vector& out) const { const auto io_size = num_inputs + num_outputs; OV_CPU_JIT_EMITTER_ASSERT(out.size() == 0, "Invalid number of out arguments: expected ", 0, " got ", out.size()); - OV_CPU_JIT_EMITTER_ASSERT(in.size() == io_size + 1, "Invalid number of in arguments: expected ", io_size + 1, " got ", in.size()); - OV_CPU_JIT_EMITTER_ASSERT(is_incremented.size() == io_size, "Invalid is_incremented size: expected ", io_size, " got ", is_incremented.size()); - OV_CPU_JIT_EMITTER_ASSERT(ptr_increments.size() == io_size, "Invalid ptr_increments size: expected ", io_size, " got ", ptr_increments.size()); + OV_CPU_JIT_EMITTER_ASSERT(in.size() == io_size + 1, + "Invalid number of in arguments: expected ", + io_size + 1, + " got ", + in.size()); + OV_CPU_JIT_EMITTER_ASSERT(is_incremented.size() == io_size, + "Invalid is_incremented size: expected ", + io_size, + " got ", + is_incremented.size()); + OV_CPU_JIT_EMITTER_ASSERT(ptr_increments.size() == io_size, + "Invalid ptr_increments size: expected ", + io_size, + " got ", + ptr_increments.size()); OV_CPU_JIT_EMITTER_ASSERT(finalization_offsets.size() == io_size, - "Invalid finalization_offsets size: expected: ", io_size, " got ", finalization_offsets.size()); - OV_CPU_JIT_EMITTER_ASSERT(data_sizes.size() == io_size, "Invalid data_sizes size: expected: ", io_size, " got ", data_sizes.size()); + "Invalid finalization_offsets size: expected: ", + io_size, + " got ", + finalization_offsets.size()); + OV_CPU_JIT_EMITTER_ASSERT(data_sizes.size() == io_size, + "Invalid data_sizes size: expected: ", + io_size, + " got ", + data_sizes.size()); OV_CPU_JIT_EMITTER_ASSERT(loop_end_label != nullptr && loop_begin_label != nullptr, "has not inited labels!"); OV_CPU_JIT_EMITTER_ASSERT(!snippets::utils::is_dynamic_value(wa_increment) || evaluate_once, "loop increment might be dynamic only if loop evaluates once!"); } -void jit_loop_end_emitter::emit_code(const std::vector &in, const std::vector &out, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_loop_end_emitter::emit_code(const std::vector& in, + const std::vector& out, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { validate_arguments(in, out); jit_emitter::emit_code(in, out, pool_vec_idxs, pool_gpr_idxs); } @@ -176,34 +213,38 @@ void jit_loop_end_emitter::emit_impl(const std::vector& in, const std::v data_ptr_reg_idxs.reserve(num_inputs + num_outputs); std::copy(in.begin(), in.end() - 1, std::back_inserter(data_ptr_reg_idxs)); - auto apply_increments = [&](bool use_runtime_args, size_t field_offset, const std::vector& increments, size_t scale) { - Reg64 reg_increments; - auto add_increments = [&]() { - for (size_t idx = 0; idx < data_ptr_reg_idxs.size(); idx++) { - const auto& increment = increments[idx]; - if (is_incremented[idx] && increment != 0) { - if (ov::snippets::utils::is_dynamic_value(increment)) { - OV_CPU_JIT_EMITTER_ASSERT(use_runtime_args, "Loop argument structure cannot be pushed to aux GPR"); - h->add(Reg64(static_cast(data_ptr_reg_idxs[idx])), h->ptr[reg_increments + idx * sizeof(int64_t)]); - } else { - h->add(Reg64(static_cast(data_ptr_reg_idxs[idx])), increment * scale * data_sizes[idx]); + auto apply_increments = + [&](bool use_runtime_args, size_t field_offset, const std::vector& increments, size_t scale) { + Reg64 reg_increments; + auto add_increments = [&]() { + for (size_t idx = 0; idx < data_ptr_reg_idxs.size(); idx++) { + const auto& increment = increments[idx]; + if (is_incremented[idx] && increment != 0) { + if (ov::snippets::utils::is_dynamic_value(increment)) { + OV_CPU_JIT_EMITTER_ASSERT(use_runtime_args, + "Loop argument structure cannot be pushed to aux GPR"); + h->add(Reg64(static_cast(data_ptr_reg_idxs[idx])), + h->ptr[reg_increments + idx * sizeof(int64_t)]); + } else { + h->add(Reg64(static_cast(data_ptr_reg_idxs[idx])), + increment * scale * data_sizes[idx]); + } } } + }; + + const auto id_offset = loop_id * sizeof(jit_snippets_call_args::loop_args_t); + if (use_runtime_args) { + jit_aux_gpr_holder gpr_holder(h, aux_gpr_idxs, in); // loop_end has only input registers + reg_increments = gpr_holder.get_reg(); + h->mov(reg_increments, h->ptr[abi_param1 + GET_OFF(loop_args)]); + h->mov(reg_increments, h->ptr[reg_increments + id_offset + field_offset]); + add_increments(); + } else { + add_increments(); } }; - const auto id_offset = loop_id * sizeof(jit_snippets_call_args::loop_args_t); - if (use_runtime_args) { - jit_aux_gpr_holder gpr_holder(h, aux_gpr_idxs, in); // loop_end has only input registers - reg_increments = gpr_holder.get_reg(); - h->mov(reg_increments, h->ptr[abi_param1 + GET_OFF(loop_args)]); - h->mov(reg_increments, h->ptr[reg_increments + id_offset + field_offset]); - add_increments(); - } else { - add_increments(); - } - }; - if (!evaluate_once) { apply_increments(are_ptr_increments_dynamic, GET_OFF_LOOP_ARGS(m_ptr_increments), ptr_increments, wa_increment); @@ -220,5 +261,5 @@ void jit_loop_end_emitter::emit_impl(const std::vector& in, const std::v /* ============================================================== */ -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.hpp index 262bba39b7d74c..c0a2b53b100c62 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_loop_emitters.hpp @@ -5,7 +5,6 @@ #pragma once #include "emitters/plugin/x64/jit_emitter.hpp" - #include "snippets/op/loop.hpp" #include "snippets/utils/utils.hpp" @@ -14,25 +13,36 @@ namespace intel_cpu { /* ================== jit_loop_begin_emitter ====================== */ -class jit_loop_begin_emitter: public jit_emitter { +class jit_loop_begin_emitter : public jit_emitter { public: - jit_loop_begin_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_loop_begin_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override { return 0; } + size_t get_inputs_num() const override { + return 0; + } - void emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; - void set_loop_end_label(const std::shared_ptr& label) { loop_end_label = label; } - std::shared_ptr get_begin_label() { return loop_begin_label; } + void set_loop_end_label(const std::shared_ptr& label) { + loop_end_label = label; + } + std::shared_ptr get_begin_label() { + return loop_begin_label; + } protected: - void validate_arguments(const std::vector &in, const std::vector &out) const override; + void validate_arguments(const std::vector& in, const std::vector& out) const override; void emit_impl(const std::vector& in, const std::vector& out) const override; // `jit_loop_begin_emitter` handles manually aux_gpr allocation using `jit_aux_gpr_holder` - size_t aux_gprs_count() const override { return 0; } + size_t aux_gprs_count() const override { + return 0; + } std::shared_ptr loop_begin_label = nullptr; std::shared_ptr loop_end_label = nullptr; @@ -43,27 +53,33 @@ class jit_loop_begin_emitter: public jit_emitter { bool is_work_amount_dynamic = false; }; - /* ============================================================== */ /* ================== jit_loop_end_emitter ====================== */ -class jit_loop_end_emitter: public jit_emitter { +class jit_loop_end_emitter : public jit_emitter { public: - jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, - const ov::snippets::lowered::ExpressionPtr& expr); + jit_loop_end_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override { return 0; } + size_t get_inputs_num() const override { + return 0; + } - void emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; protected: - void validate_arguments(const std::vector &in, const std::vector &out) const override; + void validate_arguments(const std::vector& in, const std::vector& out) const override; void emit_impl(const std::vector& in, const std::vector& out) const override; // `jit_loop_end_emitter` handles manually aux_gpr allocation using `jit_aux_gpr_holder` - size_t aux_gprs_count() const override { return 0; } + size_t aux_gprs_count() const override { + return 0; + } static ov::snippets::lowered::ExpressionPtr get_loop_begin_expr(const ov::snippets::lowered::ExpressionPtr& expr); @@ -86,5 +102,5 @@ class jit_loop_end_emitter: public jit_emitter { /* ============================================================== */ -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.cpp index b7a5fc2e993398..307ef63a8e6a2e 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.cpp @@ -5,10 +5,9 @@ #include "jit_memory_emitters.hpp" #include "emitters/snippets/jit_snippets_call_args.hpp" +#include "snippets/op/buffer.hpp" #include "transformations/snippets/x64/op/load_convert.hpp" #include "transformations/snippets/x64/op/store_convert.hpp" -#include "snippets/op/buffer.hpp" - using namespace Xbyak; using namespace dnnl::impl; @@ -21,7 +20,10 @@ using jit_generator = dnnl::impl::cpu::x64::jit_generator; using cpu_isa_t = dnnl::impl::cpu::x64::cpu_isa_t; using ExpressionPtr = ov::snippets::lowered::ExpressionPtr; -jit_memory_emitter::jit_memory_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr, emitter_in_out_map in_out_type) +jit_memory_emitter::jit_memory_emitter(jit_generator* h, + cpu_isa_t isa, + const ExpressionPtr& expr, + emitter_in_out_map in_out_type) : jit_emitter(h, isa) { in_out_type_ = in_out_type; @@ -36,7 +38,8 @@ jit_memory_emitter::jit_memory_emitter(jit_generator* h, cpu_isa_t isa, const Ex compiled_byte_offset = memory_access->get_input_offset(); buffer_cluster_id = 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"); + 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); @@ -46,7 +49,8 @@ jit_memory_emitter::jit_memory_emitter(jit_generator* h, cpu_isa_t isa, const Ex if (ov::snippets::utils::is_dynamic_value(compiled_byte_offset)) { is_offset_runtime = true; - // Compiled byte offset is zero to manually `add` runtime offset before operation and `sub` after to reset pointer in the register + // Compiled byte offset is zero to manually `add` runtime offset before operation and `sub` after to reset + // pointer in the register compiled_byte_offset = 0; OV_CPU_JIT_EMITTER_ASSERT(buffer_cluster_id != SIZE_MAX, "Incorrect buffer offset in call_args"); } @@ -84,8 +88,10 @@ std::vector jit_memory_emitter::get_available_aux_gprs() const { return available_aux_gprs; } -void jit_memory_emitter::emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs, const std::vector &pool_gpr_idxs) const { +void jit_memory_emitter::emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs, + const std::vector& pool_gpr_idxs) const { emitter_preamble(in_idxs, out_idxs, pool_vec_idxs, pool_gpr_idxs); Reg64 reg_runtime_params = abi_param1; // defined by jit_kernel_emitter @@ -152,19 +158,26 @@ void jit_load_broadcast_emitter::emit_impl(const std::vector& in, const } template -void jit_load_broadcast_emitter::emit_isa(const std::vector &in, const std::vector &out) const { - using Vmm = typename dnnl::impl::utils::conditional3::type; +void jit_load_broadcast_emitter::emit_isa(const std::vector& in, const std::vector& out) const { + using Vmm = typename dnnl::impl::utils:: + conditional3::type; Reg64 in_reg(in[0]); Vmm vmm_dst = Vmm(out[0]); - // It doesn't really matter if we broadcast or `movss` for vector tails so keep only one version for `BroadcastLoad`, - // key point here is not to add post-increment, it might be fixed by some other approach in future + // It doesn't really matter if we broadcast or `movss` for vector tails so keep only one version for + // `BroadcastLoad`, key point here is not to add post-increment, it might be fixed by some other approach in future switch (src_prc.size()) { - case 4: h->uni_vbroadcastss(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); break; - case 2: h->vpbroadcastw(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); break; - case 1: h->vpbroadcastb(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported data type"); + case 4: + h->uni_vbroadcastss(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); + break; + case 2: + h->vpbroadcastw(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); + break; + case 1: + h->vpbroadcastb(vmm_dst, h->ptr[in_reg + compiled_byte_offset]); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported data type"); } } @@ -190,5 +203,5 @@ void jit_store_memory_emitter::emit_data() const { store_emitter->emit_data(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.hpp index 55a41c977dd67c..d21e85d53e7193 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_memory_emitters.hpp @@ -7,17 +7,20 @@ #include "emitters/plugin/x64/jit_emitter.hpp" #include "emitters/plugin/x64/jit_load_store_emitters.hpp" - namespace ov { namespace intel_cpu { -class jit_memory_emitter : public jit_emitter { +class jit_memory_emitter : public jit_emitter { public: - jit_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, - const ov::snippets::lowered::ExpressionPtr& expr, emitter_in_out_map in_out_type); + jit_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr, + emitter_in_out_map in_out_type); - void emit_code(const std::vector &in_idxs, const std::vector &out_idxs, - const std::vector &pool_vec_idxs = {}, const std::vector &pool_gpr_idxs = {}) const override; + void emit_code(const std::vector& in_idxs, + const std::vector& out_idxs, + const std::vector& pool_vec_idxs = {}, + const std::vector& pool_gpr_idxs = {}) const override; protected: static size_t get_parent_buffer_cluster_id(const ov::snippets::lowered::ExpressionPtr& expr); @@ -36,16 +39,19 @@ class jit_memory_emitter : public jit_emitter { bool is_offset_runtime = false; #ifdef SNIPPETS_DEBUG_CAPS - friend std::string init_info_jit_memory_emitter(const jit_memory_emitter *emitter); + friend std::string init_info_jit_memory_emitter(const jit_memory_emitter* emitter); #endif }; class jit_load_memory_emitter : public jit_memory_emitter { public: - jit_load_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_load_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 0;} + size_t get_inputs_num() const override { + return 0; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override; @@ -58,24 +64,30 @@ class jit_load_memory_emitter : public jit_memory_emitter { class jit_load_broadcast_emitter : public jit_memory_emitter { public: - jit_load_broadcast_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_load_broadcast_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 0;} + size_t get_inputs_num() const override { + return 0; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in, const std::vector &out) const; + void emit_isa(const std::vector& in, const std::vector& out) const; }; -class jit_store_memory_emitter : public jit_memory_emitter { +class jit_store_memory_emitter : public jit_memory_emitter { public: - jit_store_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_store_memory_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 1;} + size_t get_inputs_num() const override { + return 1; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override; @@ -86,5 +98,5 @@ class jit_store_memory_emitter : public jit_memory_emitter { std::unique_ptr store_emitter = nullptr; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.cpp index f89e906ce57593..ccb4da742e38d6 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.cpp @@ -3,9 +3,9 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#include "jit_perf_count_chrono_emitters.hpp" +# include "jit_perf_count_chrono_emitters.hpp" -#include "emitters/plugin/x64/utils.hpp" +# include "emitters/plugin/x64/utils.hpp" using namespace dnnl::impl; using namespace dnnl::impl::utils; @@ -17,8 +17,10 @@ using namespace Xbyak::util; namespace ov { namespace intel_cpu { -jit_perf_count_chrono_start_emitter::jit_perf_count_chrono_start_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n) : jit_emitter(host, host_isa) { +jit_perf_count_chrono_start_emitter::jit_perf_count_chrono_start_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n) + : jit_emitter(host, host_isa) { m_start_node = ov::as_type_ptr(n); } @@ -30,11 +32,12 @@ void jit_perf_count_chrono_start_emitter::set_start_time(snippets::op::PerfCount start_node->set_start_time(); } -void jit_perf_count_chrono_start_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_perf_count_chrono_start_emitter::emit_impl(const std::vector& in_idxs, + const std::vector& out_idxs) const { EmitABIRegSpills spill(h); spill.preamble(); - const auto &set_start_time_overload = static_cast(set_start_time); + const auto& set_start_time_overload = static_cast(set_start_time); h->mov(h->rax, reinterpret_cast(set_start_time_overload)); h->mov(abi_param1, reinterpret_cast(m_start_node.get())); @@ -46,8 +49,10 @@ void jit_perf_count_chrono_start_emitter::emit_impl(const std::vector &i } ///////////////////jit_perf_count_chrono_end_emitter//////////////////////////////////// -jit_perf_count_chrono_end_emitter::jit_perf_count_chrono_end_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n) : jit_emitter(host, host_isa) { +jit_perf_count_chrono_end_emitter::jit_perf_count_chrono_end_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n) + : jit_emitter(host, host_isa) { m_end_node = ov::as_type_ptr(n); } @@ -59,11 +64,13 @@ void jit_perf_count_chrono_end_emitter::set_accumulated_time(snippets::op::PerfC end_node->set_accumulated_time(); } -void jit_perf_count_chrono_end_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_perf_count_chrono_end_emitter::emit_impl(const std::vector& in_idxs, + const std::vector& out_idxs) const { EmitABIRegSpills spill(h); spill.preamble(); - const auto &set_accumulated_time_overload = static_cast(set_accumulated_time); + const auto& set_accumulated_time_overload = + static_cast(set_accumulated_time); h->mov(h->rax, reinterpret_cast(set_accumulated_time_overload)); h->mov(abi_param1, reinterpret_cast(m_end_node.get())); @@ -74,6 +81,6 @@ void jit_perf_count_chrono_end_emitter::emit_impl(const std::vector &in_ spill.postamble(); } -} // namespace intel_cpu -} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +} // namespace intel_cpu +} // namespace ov +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp index e8608afc7f1428..817c0583609778 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_chrono_emitters.hpp @@ -3,24 +3,23 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#pragma once - -#include "emitters/plugin/x64/jit_emitter.hpp" - -#include "snippets/op/perf_count.hpp" +# pragma once +# include "emitters/plugin/x64/jit_emitter.hpp" +# include "snippets/op/perf_count.hpp" namespace ov { namespace intel_cpu { class jit_perf_count_chrono_start_emitter : public jit_emitter { public: - jit_perf_count_chrono_start_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_perf_count_chrono_start_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); size_t get_inputs_num() const override; private: - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; static void set_start_time(snippets::op::PerfCountBegin* start_node); std::shared_ptr m_start_node = nullptr; @@ -28,17 +27,18 @@ class jit_perf_count_chrono_start_emitter : public jit_emitter { class jit_perf_count_chrono_end_emitter : public jit_emitter { public: - jit_perf_count_chrono_end_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_perf_count_chrono_end_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, const std::shared_ptr& n); size_t get_inputs_num() const override; private: - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; static void set_accumulated_time(snippets::op::PerfCountEnd* end_node); std::shared_ptr m_end_node = nullptr; }; -} // namespace intel_cpu -} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +} // namespace intel_cpu +} // namespace ov +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.cpp index c469c052ce3ef6..e951f8042ad762 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.cpp @@ -3,7 +3,7 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#include "jit_perf_count_rdtsc_emitters.hpp" +# include "jit_perf_count_rdtsc_emitters.hpp" using namespace dnnl::impl; using namespace dnnl::impl::utils; @@ -15,8 +15,10 @@ using namespace Xbyak::util; namespace ov { namespace intel_cpu { -jit_perf_count_rdtsc_start_emitter::jit_perf_count_rdtsc_start_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n) : jit_emitter(host, host_isa) { +jit_perf_count_rdtsc_start_emitter::jit_perf_count_rdtsc_start_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n) + : jit_emitter(host, host_isa) { m_start_node = ov::as_type_ptr(n); } @@ -24,16 +26,18 @@ size_t jit_perf_count_rdtsc_start_emitter::get_inputs_num() const { return 0; } -void jit_perf_count_rdtsc_start_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_perf_count_rdtsc_start_emitter::emit_impl(const std::vector& in_idxs, + const std::vector& out_idxs) const { h->push(h->rax); h->push(h->rdx); - // The EDX register is loaded with the high-order 32 bits of the MSR and the EAX register is loaded with the low-order 32 bits. + // The EDX register is loaded with the high-order 32 bits of the MSR and the EAX register is loaded with the + // low-order 32 bits. h->lfence(); h->rdtsc(); h->lfence(); - h->shl(h->rdx, 0x20); // shift to higher half of rdx 0x20(32) - h->or_(h->rdx, h->rax); // rdx has current tsc + h->shl(h->rdx, 0x20); // shift to higher half of rdx 0x20(32) + h->or_(h->rdx, h->rax); // rdx has current tsc h->mov(h->rax, reinterpret_cast(&m_start_node->start_count)); h->mov(qword[h->rax], h->rdx); @@ -43,16 +47,19 @@ void jit_perf_count_rdtsc_start_emitter::emit_impl(const std::vector &in } ///////////////////jit_perf_count_rdtsc_end_emitter//////////////////////////////////// -jit_perf_count_rdtsc_end_emitter::jit_perf_count_rdtsc_end_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n) : jit_emitter(host, host_isa) { - m_end_node = ov::as_type_ptr(n); +jit_perf_count_rdtsc_end_emitter::jit_perf_count_rdtsc_end_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n) + : jit_emitter(host, host_isa) { + m_end_node = ov::as_type_ptr(n); } size_t jit_perf_count_rdtsc_end_emitter::get_inputs_num() const { return 0; } -void jit_perf_count_rdtsc_end_emitter::emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const { +void jit_perf_count_rdtsc_end_emitter::emit_impl(const std::vector& in_idxs, + const std::vector& out_idxs) const { h->push(h->rax); h->push(h->rdx); @@ -79,6 +86,6 @@ void jit_perf_count_rdtsc_end_emitter::emit_impl(const std::vector &in_i h->pop(h->rax); } -} // namespace intel_cpu -} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +} // namespace intel_cpu +} // namespace ov +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp index c3ae1aac01ab9d..343807bdfcd076 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_perf_count_rdtsc_emitters.hpp @@ -3,40 +3,40 @@ // #ifdef SNIPPETS_DEBUG_CAPS -#pragma once - -#include "emitters/plugin/x64/jit_emitter.hpp" - -#include "transformations/snippets/x64/op/perf_count_rdtsc.hpp" +# pragma once +# include "emitters/plugin/x64/jit_emitter.hpp" +# include "transformations/snippets/x64/op/perf_count_rdtsc.hpp" namespace ov { namespace intel_cpu { class jit_perf_count_rdtsc_start_emitter : public jit_emitter { public: - jit_perf_count_rdtsc_start_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n); + jit_perf_count_rdtsc_start_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; private: - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; std::shared_ptr m_start_node = nullptr; }; class jit_perf_count_rdtsc_end_emitter : public jit_emitter { public: - jit_perf_count_rdtsc_end_emitter(dnnl::impl::cpu::x64::jit_generator *host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - const std::shared_ptr& n); + jit_perf_count_rdtsc_end_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + const std::shared_ptr& n); size_t get_inputs_num() const override; private: - void emit_impl(const std::vector &in_idxs, const std::vector &out_idxs) const override; + void emit_impl(const std::vector& in_idxs, const std::vector& out_idxs) const override; std::shared_ptr m_end_node = nullptr; }; -} // namespace intel_cpu -} // namespace ov -#endif // SNIPPETS_DEBUG_CAPS +} // namespace intel_cpu +} // namespace ov +#endif // SNIPPETS_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.cpp index f88c345ff055b5..c513e969144d1c 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.cpp @@ -4,8 +4,9 @@ #ifdef SNIPPETS_DEBUG_CAPS -#include "jit_segfault_detector_emitter.hpp" -#include "emitters/plugin/x64/utils.hpp" +# include "jit_segfault_detector_emitter.hpp" + +# include "emitters/plugin/x64/utils.hpp" using namespace dnnl::impl::utils; using namespace dnnl::impl; @@ -18,22 +19,28 @@ namespace intel_cpu { std::shared_ptr> g_custom_segfault_handler = std::make_shared>(); -jit_uni_segfault_detector_emitter::jit_uni_segfault_detector_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - jit_emitter* target_emitter, bool is_load, bool is_store, std::string target_node_name) : - jit_emitter(host, host_isa), - m_target_emitter(target_emitter), - is_target_use_load_emitter(is_load), - is_target_use_store_emitter(is_store), - m_target_node_name(target_node_name) { +jit_uni_segfault_detector_emitter::jit_uni_segfault_detector_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_emitter* target_emitter, + bool is_load, + bool is_store, + std::string target_node_name) + : jit_emitter(host, host_isa), + m_target_emitter(target_emitter), + is_target_use_load_emitter(is_load), + is_target_use_store_emitter(is_store), + m_target_node_name(target_node_name) {} + +size_t jit_uni_segfault_detector_emitter::get_inputs_num() const { + return 1; } -size_t jit_uni_segfault_detector_emitter::get_inputs_num() const { return 1; } - const jit_emitter* jit_uni_segfault_detector_emitter::get_target_emitter() const { return m_target_emitter; } -void jit_uni_segfault_detector_emitter::emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const { +void jit_uni_segfault_detector_emitter::emit_impl(const std::vector& in_vec_idxs, + const std::vector& out_vec_idxs) const { save_target_emitter(); if (is_target_use_load_emitter) { memory_track(in_vec_idxs[0]); @@ -47,7 +54,8 @@ void jit_uni_segfault_detector_emitter::save_target_emitter() const { EmitABIRegSpills spill(h); spill.preamble(); - const auto &set_local_handler_overload = static_cast(set_local_handler); + const auto& set_local_handler_overload = + static_cast(set_local_handler); h->mov(h->rax, reinterpret_cast(set_local_handler_overload)); h->mov(abi_param1, reinterpret_cast(this)); @@ -85,7 +93,7 @@ void jit_uni_segfault_detector_emitter::memory_track(size_t gpr_idx_for_mem_addr h->pop(h->r15); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.hpp index 21ffaa84cf3db8..86191ae865fe38 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_segfault_detector_emitter.hpp @@ -4,11 +4,12 @@ #ifdef SNIPPETS_DEBUG_CAPS -#pragma once +# pragma once -#include -#include "emitters/plugin/x64/jit_emitter.hpp" -#include "openvino/runtime/threading/thread_local.hpp" +# include + +# include "emitters/plugin/x64/jit_emitter.hpp" +# include "openvino/runtime/threading/thread_local.hpp" using namespace ov::threading; @@ -20,18 +21,22 @@ extern std::shared_ptr> g_custom class jit_uni_segfault_detector_emitter : public jit_emitter { public: - jit_uni_segfault_detector_emitter(dnnl::impl::cpu::x64::jit_generator* host, dnnl::impl::cpu::x64::cpu_isa_t host_isa, - jit_emitter* target_emitter, bool is_load, bool is_store, std::string target_node_name); + jit_uni_segfault_detector_emitter(dnnl::impl::cpu::x64::jit_generator* host, + dnnl::impl::cpu::x64::cpu_isa_t host_isa, + jit_emitter* target_emitter, + bool is_load, + bool is_store, + std::string target_node_name); size_t get_inputs_num() const override; const jit_emitter* get_target_emitter() const; private: - // emit code is to save "this" pointer(jit_uni_segfault_detector_emitter) to global handler, then print info w/ it's target_emitter. - // and to save tracked memory address, iteration, etc to print + // emit code is to save "this" pointer(jit_uni_segfault_detector_emitter) to global handler, then print info w/ it's + // target_emitter. and to save tracked memory address, iteration, etc to print void emit_impl(const std::vector& in_vec_idxs, const std::vector& out_vec_idxs) const override; - jit_emitter *m_target_emitter = nullptr; + jit_emitter* m_target_emitter = nullptr; bool is_target_use_load_emitter = false; bool is_target_use_store_emitter = false; std::string m_target_node_name = ""; @@ -44,10 +49,10 @@ class jit_uni_segfault_detector_emitter : public jit_emitter { mutable size_t current_address = 0; mutable size_t iteration = 0; - friend std::string init_info_jit_uni_segfault_detector_emitter(const jit_uni_segfault_detector_emitter *emitter); + friend std::string init_info_jit_uni_segfault_detector_emitter(const jit_uni_segfault_detector_emitter* emitter); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.cpp index d8066f9a126543..ba4012de86d83d 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.cpp @@ -15,7 +15,10 @@ using jit_generator = dnnl::impl::cpu::x64::jit_generator; using cpu_isa_t = dnnl::impl::cpu::x64::cpu_isa_t; using ExpressionPtr = ov::snippets::lowered::ExpressionPtr; -jit_nop_emitter::jit_nop_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr, emitter_in_out_map emitter_type) +jit_nop_emitter::jit_nop_emitter(jit_generator* h, + cpu_isa_t isa, + const ExpressionPtr& expr, + emitter_in_out_map emitter_type) : jit_emitter(h, isa) { in_out_type_ = emitter_type; } @@ -25,7 +28,8 @@ jit_parameter_emitter::jit_parameter_emitter(jit_generator* h, cpu_isa_t isa, co in_out_type_ = emitter_in_out_map::gpr_to_gpr; } -jit_result_emitter::jit_result_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr) : jit_nop_emitter(h, isa, expr) { +jit_result_emitter::jit_result_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr) + : jit_nop_emitter(h, isa, expr) { in_out_type_ = emitter_in_out_map::gpr_to_gpr; } @@ -34,14 +38,13 @@ jit_broadcast_move_emitter::jit_broadcast_move_emitter(jit_generator* h, cpu_isa const auto n = expr->get_node(); if (n->get_input_element_type(0) != n->get_output_element_type(0)) OV_CPU_JIT_EMITTER_THROW("supports only equal input and output types but gets: ", - n->get_input_element_type(0), - " and ", - n->get_output_element_type(0)); + n->get_input_element_type(0), + " and ", + n->get_output_element_type(0)); byte_size = n->get_input_element_type(0).size(); } -void jit_broadcast_move_emitter::emit_impl(const std::vector& in, - const std::vector& out) const { +void jit_broadcast_move_emitter::emit_impl(const std::vector& in, const std::vector& out) const { if (host_isa_ == dnnl::impl::cpu::x64::sse41) { emit_isa(in, out); } else if (host_isa_ == dnnl::impl::cpu::x64::avx2) { @@ -54,17 +57,24 @@ void jit_broadcast_move_emitter::emit_impl(const std::vector& in, } template -void jit_broadcast_move_emitter::emit_isa(const std::vector &in, const std::vector &out) const { - using Vmm = typename dnnl::impl::utils::conditional3::type; +void jit_broadcast_move_emitter::emit_isa(const std::vector& in, const std::vector& out) const { + using Vmm = typename dnnl::impl::utils:: + conditional3::type; Xmm xmm_src0 = Xmm(in[0]); - Vmm vmm_dst = Vmm(out[0]); + Vmm vmm_dst = Vmm(out[0]); switch (byte_size) { - case 4: h->uni_vbroadcastss(vmm_dst, xmm_src0); break; - case 2: h->vpbroadcastw(vmm_dst, xmm_src0); break; - case 1: h->vpbroadcastb(vmm_dst, xmm_src0); break; - default: OV_CPU_JIT_EMITTER_THROW("unsupported data type"); + case 4: + h->uni_vbroadcastss(vmm_dst, xmm_src0); + break; + case 2: + h->vpbroadcastw(vmm_dst, xmm_src0); + break; + case 1: + h->vpbroadcastb(vmm_dst, xmm_src0); + break; + default: + OV_CPU_JIT_EMITTER_THROW("unsupported data type"); } } @@ -74,14 +84,20 @@ int32_t jit_scalar_emitter::read_value(const ov::snippets::lowered::ExpressionPt const auto& precision = n->get_output_element_type(0); int32_t res = INT_MIN; switch (precision) { - case element::i32: res = n->cast_vector(1)[0]; break; - case element::f32: res = dnnl::impl::cpu::x64::float2int(n->cast_vector(1)[0]); break; - default: OV_CPU_JIT_EMITTER_THROW("doesn't support ", precision); + case element::i32: + res = n->cast_vector(1)[0]; + break; + case element::f32: + res = dnnl::impl::cpu::x64::float2int(n->cast_vector(1)[0]); + break; + default: + OV_CPU_JIT_EMITTER_THROW("doesn't support ", precision); } return res; } -jit_scalar_emitter::jit_scalar_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr) : jit_emitter(h, isa) { +jit_scalar_emitter::jit_scalar_emitter(jit_generator* h, cpu_isa_t isa, const ExpressionPtr& expr) + : jit_emitter(h, isa) { push_arg_entry_of("scalar", read_value(expr), true); prepare_table(); } @@ -89,21 +105,27 @@ jit_scalar_emitter::jit_scalar_emitter(jit_generator* h, cpu_isa_t isa, const Ex void jit_scalar_emitter::emit_impl(const std::vector& in, const std::vector& out) const { using isa = cpu_isa_t; switch (host_isa_) { - case isa::sse41: emit_isa(in, out); break; - case isa::avx2: emit_isa(in, out); break; - case isa::avx512_core: emit_isa(in, out); break; - default: OV_CPU_JIT_EMITTER_THROW("Unsupported isa ", host_isa_); + case isa::sse41: + emit_isa(in, out); + break; + case isa::avx2: + emit_isa(in, out); + break; + case isa::avx512_core: + emit_isa(in, out); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Unsupported isa ", host_isa_); } } template -void jit_scalar_emitter::emit_isa(const std::vector &in, const std::vector &out) const { - using Vmm = typename dnnl::impl::utils::conditional3::type; - Vmm vmm_dst = Vmm(out[0]); +void jit_scalar_emitter::emit_isa(const std::vector& in, const std::vector& out) const { + using Vmm = typename dnnl::impl::utils:: + conditional3::type; + Vmm vmm_dst = Vmm(out[0]); h->uni_vbroadcastss(vmm_dst, table_val("scalar")); } - } // namespace intel_cpu } // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.hpp index c75f071c4ec7e0..6a91e3b7c47d3d 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/jit_snippets_emitters.hpp @@ -6,16 +6,19 @@ #include "emitters/plugin/x64/jit_emitter.hpp" - namespace ov { namespace intel_cpu { class jit_nop_emitter : public jit_emitter { public: - jit_nop_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, - const ov::snippets::lowered::ExpressionPtr& expr, emitter_in_out_map emitter_type = gpr_to_gpr); + jit_nop_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, + const ov::snippets::lowered::ExpressionPtr& expr, + emitter_in_out_map emitter_type = gpr_to_gpr); - size_t get_inputs_num() const override {return 0;} + size_t get_inputs_num() const override { + return 0; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override {} @@ -23,31 +26,40 @@ class jit_nop_emitter : public jit_emitter { class jit_parameter_emitter : public jit_nop_emitter { public: - jit_parameter_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_parameter_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override { return 0; } + size_t get_inputs_num() const override { + return 0; + } }; class jit_result_emitter : public jit_nop_emitter { public: - jit_result_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_result_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 1;} + size_t get_inputs_num() const override { + return 1; + } }; class jit_broadcast_move_emitter : public jit_emitter { public: - jit_broadcast_move_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_broadcast_move_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 1;} + size_t get_inputs_num() const override { + return 1; + } private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in, const std::vector &out) const; + void emit_isa(const std::vector& in, const std::vector& out) const; private: size_t byte_size = 0lu; @@ -55,18 +67,23 @@ class jit_broadcast_move_emitter : public jit_emitter { class jit_scalar_emitter : public jit_emitter { public: - jit_scalar_emitter(dnnl::impl::cpu::x64::jit_generator* h, dnnl::impl::cpu::x64::cpu_isa_t isa, + jit_scalar_emitter(dnnl::impl::cpu::x64::jit_generator* h, + dnnl::impl::cpu::x64::cpu_isa_t isa, const ov::snippets::lowered::ExpressionPtr& expr); - size_t get_inputs_num() const override {return 0;} - size_t aux_gprs_count() const override {return 1;} + size_t get_inputs_num() const override { + return 0; + } + size_t aux_gprs_count() const override { + return 1; + } static int32_t read_value(const ov::snippets::lowered::ExpressionPtr& expr); private: void emit_impl(const std::vector& in, const std::vector& out) const override; template - void emit_isa(const std::vector &in, const std::vector &out) const; + void emit_isa(const std::vector& in, const std::vector& out) const; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.cpp index c57824526d6e20..58a31a1804782a 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.cpp @@ -6,13 +6,10 @@ #include "common/utils.hpp" #include "dnnl_extension_utils.h" - #include "snippets/lowered/pass/insert_specific_iterations.hpp" - #include "transformations/snippets/x64/op/brgemm_cpu.hpp" #include "transformations/snippets/x64/op/brgemm_utils.hpp" - using namespace Xbyak; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; @@ -20,15 +17,21 @@ using namespace dnnl::impl::cpu::x64; namespace ov { namespace intel_cpu { -BrgemmKernelConfig::BrgemmKernelConfig(const element::Type& in0_dtype, const element::Type& in1_dtype, - bool is_with_comp, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) - : BrgemmBaseKernelConfig(), m_static_params(std::make_shared(in0_dtype, in1_dtype, is_with_comp, primitive_isa)) { +BrgemmKernelConfig::BrgemmKernelConfig(const element::Type& in0_dtype, + const element::Type& in1_dtype, + bool is_with_comp, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) + : BrgemmBaseKernelConfig(), + m_static_params(std::make_shared(in0_dtype, in1_dtype, is_with_comp, primitive_isa)) { m_hash = compute_hash(); } -BrgemmKernelConfig::StaticParams::StaticParams(const element::Type& in0_dtype, const element::Type& in1_dtype, - bool is_with_comp, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) - : StaticBaseParams(in0_dtype, in1_dtype, primitive_isa, compute_hash(is_with_comp)), is_with_comp(is_with_comp) {} +BrgemmKernelConfig::StaticParams::StaticParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, + bool is_with_comp, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) + : StaticBaseParams(in0_dtype, in1_dtype, primitive_isa, compute_hash(is_with_comp)), + is_with_comp(is_with_comp) {} bool BrgemmKernelConfig::StaticParams::operator==(const StaticParams& rhs) const { return StaticBaseParams::operator==(rhs) && is_with_comp == rhs.is_with_comp; @@ -47,8 +50,8 @@ std::string BrgemmKernelConfig::StaticParams::to_string() const { } #endif -BrgemmKernelExecutor::BrgemmKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmKernelConfig config) : - CPUKernelExecutor(std::move(kernel_cache), std::move(config)) { } +BrgemmKernelExecutor::BrgemmKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmKernelConfig config) + : CPUKernelExecutor(std::move(kernel_cache), std::move(config)) {} std::shared_ptr BrgemmKernelExecutor::compile_kernel(const BrgemmKernelConfig& config) const { std::shared_ptr compiled_kernel = std::make_shared(); @@ -57,8 +60,17 @@ std::shared_ptr BrgemmKernelExecutor::compile_kernel(const if (config.is_empty()) return compiled_kernel; - create_brgemm_kernel(compiled_kernel->brgemm_kernel, config.get_dt_in0(), config.get_dt_in1(), config.get_isa(), - config.get_M(), config.get_N(), config.get_K(), config.get_LDA(), config.get_LDB(), config.get_LDC(), config.get_beta()); + create_brgemm_kernel(compiled_kernel->brgemm_kernel, + config.get_dt_in0(), + config.get_dt_in1(), + config.get_isa(), + config.get_M(), + config.get_N(), + config.get_K(), + config.get_LDA(), + config.get_LDB(), + config.get_LDC(), + config.get_beta()); return compiled_kernel; } @@ -81,8 +93,9 @@ void BrgemmKernelExecutor::execute(const BrgemmKernelExecutor* executor, call_ar } #ifdef SNIPPETS_DEBUG_CAPS -BrgemmKernelReferenceExecutor::BrgemmKernelReferenceExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmKernelConfig config) : - BrgemmKernelExecutor(std::move(kernel_cache), std::move(config)) {} +BrgemmKernelReferenceExecutor::BrgemmKernelReferenceExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, + BrgemmKernelConfig config) + : BrgemmKernelExecutor(std::move(kernel_cache), std::move(config)) {} std::shared_ptr BrgemmKernelReferenceExecutor::compile_kernel(const BrgemmKernelConfig& c) const { const auto& res = std::make_shared(); @@ -91,11 +104,10 @@ std::shared_ptr BrgemmKernelReferenceExecutor::compile_ker } brgemm_ref_kernel::brgemm_ref_kernel(BrgemmKernelConfig c) : m_config(std::move(c)) { - OV_CPU_JIT_EMITTER_ASSERT(!m_config.is_with_comp(), - "brgemm_ref_kernel doesn't currently support compensations"); - OV_CPU_JIT_EMITTER_ASSERT(m_config.get_dt_in0() == m_config.get_dt_in1() && - m_config.get_dt_in0() == dnnl_data_type_t::dnnl_f32, - "brgemm_ref_kernel currently supports only fp32 inputs"); + OV_CPU_JIT_EMITTER_ASSERT(!m_config.is_with_comp(), "brgemm_ref_kernel doesn't currently support compensations"); + OV_CPU_JIT_EMITTER_ASSERT( + m_config.get_dt_in0() == m_config.get_dt_in1() && m_config.get_dt_in0() == dnnl_data_type_t::dnnl_f32, + "brgemm_ref_kernel currently supports only fp32 inputs"); } void brgemm_ref_kernel::operator()(dnnl::impl::cpu::x64::brgemm_kernel_params_t* args) const { @@ -115,5 +127,5 @@ void brgemm_ref_kernel::operator()(dnnl::impl::cpu::x64::brgemm_kernel_params_t* } #endif -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.hpp index 1c3d1e18872aea..9cc17049c4d3ae 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm.hpp @@ -11,24 +11,33 @@ namespace intel_cpu { struct BrgemmKernelConfig : public BrgemmBaseKernelConfig { public: - BrgemmKernelConfig(const element::Type& in0_dtype, const element::Type& in1_dtype, - bool is_with_comp, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); + BrgemmKernelConfig(const element::Type& in0_dtype, + const element::Type& in1_dtype, + bool is_with_comp, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); BrgemmKernelConfig() = delete; std::unique_ptr get_clone_ptr() const override { return std::unique_ptr(new BrgemmKernelConfig(*this)); } - bool is_with_comp() const { return m_static_params->is_with_comp; } + bool is_with_comp() const { + return m_static_params->is_with_comp; + } private: struct StaticParams : StaticBaseParams { - StaticParams(const element::Type& in0_dtype, const element::Type& in1_dtype, bool is_with_comp, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); + StaticParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, + bool is_with_comp, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); - const bool is_with_comp {false}; + const bool is_with_comp{false}; bool operator==(const StaticParams& rhs) const; - bool operator!=(const StaticParams& rhs) const { return !(*this == rhs); } + bool operator!=(const StaticParams& rhs) const { + return !(*this == rhs); + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const; #endif @@ -36,9 +45,11 @@ struct BrgemmKernelConfig : public BrgemmBaseKernelConfig { static size_t compute_hash(bool is_with_comp); }; - std::shared_ptr get_static_params() const override { return m_static_params; } + std::shared_ptr get_static_params() const override { + return m_static_params; + } - std::shared_ptr m_static_params {nullptr}; + std::shared_ptr m_static_params{nullptr}; }; // The `update_kernel` method verifies that a compiled kernel is not nullptr. @@ -76,21 +87,25 @@ class BrgemmKernelReferenceExecutor : public BrgemmKernelExecutor { public: BrgemmKernelReferenceExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmKernelConfig config); using BrgemmKernelExecutor::execute; + protected: std::shared_ptr compile_kernel(const BrgemmKernelConfig& c) const override; }; struct brgemm_ref_kernel : public dnnl::impl::cpu::x64::brgemm_kernel_t { brgemm_ref_kernel(BrgemmKernelConfig c); - void operator()(dnnl::impl::cpu::x64::brgemm_kernel_params_t *) const override; - dnnl_status_t create_kernel() override { return dnnl_status_t::dnnl_success; } - const dnnl::impl::cpu::x64::jit_generator *get_jit_generator() const override { + void operator()(dnnl::impl::cpu::x64::brgemm_kernel_params_t*) const override; + dnnl_status_t create_kernel() override { + return dnnl_status_t::dnnl_success; + } + const dnnl::impl::cpu::x64::jit_generator* get_jit_generator() const override { OV_CPU_JIT_EMITTER_THROW("get_jit_generator should not be called for reference kernel"); return nullptr; } + private: BrgemmKernelConfig m_config; }; #endif -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.cpp index 62c7236735f70e..12c52d43b2c4b8 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.cpp @@ -4,35 +4,40 @@ #include "brgemm_amx.hpp" -#include "transformations/snippets/x64/op/brgemm_utils.hpp" -#include "transformations/snippets/x64/op/brgemm_cpu.hpp" - #include +#include "transformations/snippets/x64/op/brgemm_cpu.hpp" +#include "transformations/snippets/x64/op/brgemm_utils.hpp" #define INNER_K_BLK(dtype) static_cast((brgemm_utils::repacking::compute_inner_k_block(in0_dtype))) #define VNNI_FACTOR(dtype) static_cast((brgemm_utils::compute_vnni_factor(in0_dtype))) -#define EQ(X) X == rhs.X -#define HASH(X) seed = hash_combine(seed, X) - +#define EQ(X) X == rhs.X +#define HASH(X) seed = hash_combine(seed, X) using namespace Xbyak; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; - namespace ov { namespace intel_cpu { -BrgemmAMXKernelConfig::BrgemmAMXKernelConfig(const element::Type& in0_dtype, const element::Type& in1_dtype, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) - : BrgemmBaseKernelConfig(), m_static_params(std::make_shared(in0_dtype, in1_dtype, primitive_isa)) { +BrgemmAMXKernelConfig::BrgemmAMXKernelConfig(const element::Type& in0_dtype, + const element::Type& in1_dtype, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) + : BrgemmBaseKernelConfig(), + m_static_params(std::make_shared(in0_dtype, in1_dtype, primitive_isa)) { m_hash = compute_hash(); } -BrgemmAMXKernelConfig::StaticParams::StaticParams(const element::Type& in0_dtype, const element::Type& in1_dtype, +BrgemmAMXKernelConfig::StaticParams::StaticParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa) - : StaticBaseParams(in0_dtype, in1_dtype, primitive_isa, compute_hash(INNER_K_BLK(in0_dtype), VNNI_FACTOR(in0_dtype))), - inner_k_blk(INNER_K_BLK(in0_dtype)), vnni_factor(VNNI_FACTOR(in0_dtype)) {} + : StaticBaseParams(in0_dtype, + in1_dtype, + primitive_isa, + compute_hash(INNER_K_BLK(in0_dtype), VNNI_FACTOR(in0_dtype))), + inner_k_blk(INNER_K_BLK(in0_dtype)), + vnni_factor(VNNI_FACTOR(in0_dtype)) {} bool BrgemmAMXKernelConfig::StaticParams::operator==(const StaticParams& rhs) const { return StaticBaseParams::operator==(rhs) && EQ(inner_k_blk) && EQ(vnni_factor); @@ -40,7 +45,8 @@ bool BrgemmAMXKernelConfig::StaticParams::operator==(const StaticParams& rhs) co size_t BrgemmAMXKernelConfig::StaticParams::compute_hash(dnnl_dim_t inner_k_blk, dnnl_dim_t vnni_factor) { size_t seed = 0; - HASH(inner_k_blk); HASH(vnni_factor); + HASH(inner_k_blk); + HASH(vnni_factor); return seed; } @@ -58,30 +64,50 @@ std::string BrgemmAMXKernelConfig::StaticParams::to_string() const { } #endif -BrgemmAMXKernelExecutor::BrgemmAMXKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmAMXKernelConfig config) : - CPUKernelExecutor(std::move(kernel_cache), std::move(config)) {} +BrgemmAMXKernelExecutor::BrgemmAMXKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, + BrgemmAMXKernelConfig config) + : CPUKernelExecutor(std::move(kernel_cache), std::move(config)) {} namespace { struct BrgemmCopyAKey { - BrgemmCopyAKey(cpu_isa_t isa, dnnl_data_type_t dt, dnnl_dim_t K, dnnl_dim_t K_blk, dnnl_dim_t K_tail, dnnl_dim_t src_stride, dnnl_dim_t LDA) - : isa(isa), dt(dt), K{K}, K_blk{K_blk}, K_tail{K_tail}, src_stride{src_stride}, LDA{LDA} {} + BrgemmCopyAKey(cpu_isa_t isa, + dnnl_data_type_t dt, + dnnl_dim_t K, + dnnl_dim_t K_blk, + dnnl_dim_t K_tail, + dnnl_dim_t src_stride, + dnnl_dim_t LDA) + : isa(isa), + dt(dt), + K{K}, + K_blk{K_blk}, + K_tail{K_tail}, + src_stride{src_stride}, + LDA{LDA} {} size_t hash() const { size_t seed = 0; - HASH(isa); HASH(dt); HASH(K); HASH(K_blk); HASH(K_tail); HASH(src_stride); HASH(LDA); + HASH(isa); + HASH(dt); + HASH(K); + HASH(K_blk); + HASH(K_tail); + HASH(src_stride); + HASH(LDA); return seed; } bool operator==(const BrgemmCopyAKey& rhs) const { return EQ(isa) && EQ(dt) && EQ(K) && EQ(K_blk) && EQ(K_tail) && EQ(src_stride) && EQ(LDA); } - cpu_isa_t isa {cpu_isa_t::isa_undef}; - dnnl_data_type_t dt {dnnl_data_type_t::dnnl_data_type_undef}; - dnnl_dim_t K {0}, K_blk {0}, K_tail {0}, src_stride {0}, LDA {0}; + cpu_isa_t isa{cpu_isa_t::isa_undef}; + dnnl_data_type_t dt{dnnl_data_type_t::dnnl_data_type_undef}; + dnnl_dim_t K{0}, K_blk{0}, K_tail{0}, src_stride{0}, LDA{0}; }; -} // namespace +} // namespace -std::shared_ptr BrgemmAMXKernelExecutor::compile_kernel(const BrgemmAMXKernelConfig& config) const { +std::shared_ptr BrgemmAMXKernelExecutor::compile_kernel( + const BrgemmAMXKernelConfig& config) const { std::shared_ptr compiled_kernel = std::make_shared(); // Brgemm is not executable - nothing to compile @@ -98,14 +124,26 @@ std::shared_ptr BrgemmAMXKernelExecutor::compile_kernel }; auto brgemm_builder = [](const BrgemmAMXKernelConfig& k) { - std::shared_ptr ker = std::make_shared(); - create_brgemm_kernel(ker->brgemm_kernel, k.get_dt_in0(), k.get_dt_in1(), k.get_isa(), k.get_M(), k.get_N(), k.get_K(), - k.get_LDA(), k.get_LDB(), k.get_LDC(), k.get_beta(), true, ker->palette); + std::shared_ptr ker = + std::make_shared(); + create_brgemm_kernel(ker->brgemm_kernel, + k.get_dt_in0(), + k.get_dt_in1(), + k.get_isa(), + k.get_M(), + k.get_N(), + k.get_K(), + k.get_LDA(), + k.get_LDB(), + k.get_LDC(), + k.get_beta(), + true, + ker->palette); return ker; }; auto brgemm_copy_a_builder = [](const BrgemmCopyAKey& k) { - std::shared_ptr ker {nullptr}; + std::shared_ptr ker{nullptr}; create_brgemm_copy_a_kernel(ker, k.isa, k.dt, k.K, k.K_blk, k.K_tail, k.src_stride, k.LDA); return ker; }; @@ -130,7 +168,13 @@ std::shared_ptr BrgemmAMXKernelExecutor::compile_kernel K_tail = ov::snippets::utils::rnd_up(K_tail, config.get_vnni_factor()); LDA = K_tail; - const auto key = BrgemmCopyAKey(config.get_isa(), config.get_dt_in0(), config.get_K(), config.get_inner_K_blk(), K_tail, copy_A_src_stride, LDA); + const auto key = BrgemmCopyAKey(config.get_isa(), + config.get_dt_in0(), + config.get_K(), + config.get_inner_K_blk(), + K_tail, + copy_A_src_stride, + LDA); const auto result = cache->getOrCreate(key, brgemm_copy_a_builder); compiled_kernel->brgemm_copy_a_kernel = result.first; } @@ -142,11 +186,17 @@ std::shared_ptr BrgemmAMXKernelExecutor::compile_kernel return compiled_kernel; } -void BrgemmAMXKernelExecutor::create_brgemm_copy_a_kernel(std::shared_ptr& kernel, - dnnl::impl::cpu::x64::cpu_isa_t isa, dnnl_data_type_t dt, - dnnl_dim_t K, dnnl_dim_t K_blk, dnnl_dim_t K_tail, dnnl_dim_t src_stride, dnnl_dim_t LDA) { +void BrgemmAMXKernelExecutor::create_brgemm_copy_a_kernel( + std::shared_ptr& kernel, + dnnl::impl::cpu::x64::cpu_isa_t isa, + dnnl_data_type_t dt, + dnnl_dim_t K, + dnnl_dim_t K_blk, + dnnl_dim_t K_tail, + dnnl_dim_t src_stride, + dnnl_dim_t LDA) { matmul::brgemm_matmul_conf_t conf_; - conf_.src_tag = dnnl_abcd; // unused + conf_.src_tag = dnnl_abcd; // unused conf_.K = K; conf_.K_tail = K_tail; conf_.K_blk = K_blk; @@ -176,18 +226,28 @@ void BrgemmAMXKernelExecutor::update_config(const ov::snippets::lowered::Express return BrgemmBaseKernelExecutor::update_config(expr, linear_ir, config); } -void BrgemmAMXKernelExecutor::configure_tiles_if_needed(amx_tile_config_t* config, const char* palette, dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K) { +void BrgemmAMXKernelExecutor::configure_tiles_if_needed(amx_tile_config_t* config, + const char* palette, + dnnl_dim_t M, + dnnl_dim_t N, + dnnl_dim_t K) { auto compatible = [&](amx_tile_config_t* rhs) { return rhs && rhs->M == M && rhs->N == N && rhs->K == K; }; if (config && !compatible(config)) { - config->M = M; config->N = N; config->K = K; + config->M = M; + config->N = N; + config->K = K; cpu::x64::amx_tile_configure(palette); } } -void BrgemmAMXKernelExecutor::execute_brgemm_copy_a_kernel(const std::shared_ptr& kernel, - const void* src, const void* tr_src, dnnl_dim_t M, dnnl_dim_t K) { +void BrgemmAMXKernelExecutor::execute_brgemm_copy_a_kernel( + const std::shared_ptr& kernel, + const void* src, + const void* tr_src, + dnnl_dim_t M, + dnnl_dim_t K) { auto ctx = matmul::jit_brgemm_matmul_copy_a_t::ctx_t(); ctx.current_M_blk = M; @@ -219,7 +279,11 @@ void BrgemmAMXKernelExecutor::execute(const BrgemmAMXKernelExecutor* executor, c if (K_body != 0) { const auto& K_body_kernel = kernel->K_body_kernel; - configure_tiles_if_needed(args->amx_tile_config, K_body_kernel->palette, config.get_M(), config.get_N(), K_body); + configure_tiles_if_needed(args->amx_tile_config, + K_body_kernel->palette, + config.get_M(), + config.get_N(), + K_body); execute_brgemm_kernel(K_body_kernel->brgemm_kernel, src_ptr, wei_ptr, args->C, scratch, false); src_ptr = src_ptr + K_body * dnnl_data_type_size(config.get_dt_in0()); @@ -235,7 +299,11 @@ void BrgemmAMXKernelExecutor::execute(const BrgemmAMXKernelExecutor* executor, c } const auto& K_tail_kernel = kernel->K_tail_kernel; - configure_tiles_if_needed(args->amx_tile_config, K_tail_kernel->palette, config.get_M(), config.get_N(), K_tail); + configure_tiles_if_needed(args->amx_tile_config, + K_tail_kernel->palette, + config.get_M(), + config.get_N(), + K_tail); execute_brgemm_kernel(K_tail_kernel->brgemm_kernel, src_ptr, wei_ptr, args->C, scratch, false); } } @@ -245,5 +313,5 @@ void BrgemmAMXKernelExecutor::execute(const BrgemmAMXKernelExecutor* executor, c #undef EQ #undef HASH -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.hpp index a8544e5343b0ce..733295ec995583 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_amx.hpp @@ -4,42 +4,50 @@ #pragma once -#include "brgemm_base.hpp" - -#include "emitters/plugin/x64/jit_emitter.hpp" -#include "emitters/snippets/jit_snippets_call_args.hpp" -#include "emitters/snippets/cpu_kernel_executor_table.hpp" - #include #include +#include "brgemm_base.hpp" +#include "emitters/plugin/x64/jit_emitter.hpp" +#include "emitters/snippets/cpu_kernel_executor_table.hpp" +#include "emitters/snippets/jit_snippets_call_args.hpp" namespace ov { namespace intel_cpu { struct BrgemmAMXKernelConfig : public BrgemmBaseKernelConfig { public: - BrgemmAMXKernelConfig(const element::Type& in0_dtype, const element::Type& in1_dtype, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); + BrgemmAMXKernelConfig(const element::Type& in0_dtype, + const element::Type& in1_dtype, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); BrgemmAMXKernelConfig() = delete; std::unique_ptr get_clone_ptr() const override { return std::unique_ptr(new BrgemmAMXKernelConfig(*this)); } - dnnl_dim_t get_inner_K_blk() const { return m_static_params->inner_k_blk; } - dnnl_dim_t get_vnni_factor() const { return m_static_params->vnni_factor; } + dnnl_dim_t get_inner_K_blk() const { + return m_static_params->inner_k_blk; + } + dnnl_dim_t get_vnni_factor() const { + return m_static_params->vnni_factor; + } bool need_copy_a(dnnl_dim_t K) const; private: struct StaticParams : StaticBaseParams { - StaticParams(const element::Type& in0_dtype, const element::Type& in1_dtype, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); + StaticParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa); - const dnnl_dim_t inner_k_blk {0}; - const dnnl_dim_t vnni_factor {0}; + const dnnl_dim_t inner_k_blk{0}; + const dnnl_dim_t vnni_factor{0}; bool operator==(const StaticParams& rhs) const; - bool operator!=(const StaticParams& rhs) const { return !(*this == rhs); } + bool operator!=(const StaticParams& rhs) const { + return !(*this == rhs); + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const; #endif @@ -47,22 +55,24 @@ struct BrgemmAMXKernelConfig : public BrgemmBaseKernelConfig { static size_t compute_hash(dnnl_dim_t inner_k_blk, dnnl_dim_t vnni_factor); }; - std::shared_ptr get_static_params() const override { return m_static_params; } + std::shared_ptr get_static_params() const override { + return m_static_params; + } - std::shared_ptr m_static_params {nullptr}; + std::shared_ptr m_static_params{nullptr}; }; struct BrgemmAMXCompiledKernel { struct BrgemmKernel { - std::shared_ptr brgemm_kernel {nullptr}; + std::shared_ptr brgemm_kernel{nullptr}; // Note: Palette is treated as a part of a kernel because it is initialized during the kernel compilation stage. // Each kernel need to store the pallet it was compiled with. char palette[64] = {}; }; - std::shared_ptr K_body_kernel {nullptr}; - std::shared_ptr K_tail_kernel {nullptr}; - std::shared_ptr brgemm_copy_a_kernel {nullptr}; + std::shared_ptr K_body_kernel{nullptr}; + std::shared_ptr K_tail_kernel{nullptr}; + std::shared_ptr brgemm_copy_a_kernel{nullptr}; }; class BrgemmAMXKernelExecutor : public BrgemmBaseKernelExecutor, @@ -87,16 +97,30 @@ class BrgemmAMXKernelExecutor : public BrgemmBaseKernelExecutor, const ov::snippets::lowered::LinearIRCPtr& linear_ir, BrgemmAMXKernelConfig& config) const override; - static void configure_tiles_if_needed(amx_tile_config_t* config, const char* palette, dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K); - - static void create_brgemm_copy_a_kernel(std::shared_ptr& kernel, - dnnl::impl::cpu::x64::cpu_isa_t isa, dnnl_data_type_t dt, - dnnl_dim_t K, dnnl_dim_t K_blk, dnnl_dim_t K_tail, dnnl_dim_t src_stride, dnnl_dim_t LDA); - - static void execute_brgemm_copy_a_kernel(const std::shared_ptr& kernel, - const void* src, const void* tr_src, dnnl_dim_t M, dnnl_dim_t K); + static void configure_tiles_if_needed(amx_tile_config_t* config, + const char* palette, + dnnl_dim_t M, + dnnl_dim_t N, + dnnl_dim_t K); + + static void create_brgemm_copy_a_kernel( + std::shared_ptr& kernel, + dnnl::impl::cpu::x64::cpu_isa_t isa, + dnnl_data_type_t dt, + dnnl_dim_t K, + dnnl_dim_t K_blk, + dnnl_dim_t K_tail, + dnnl_dim_t src_stride, + dnnl_dim_t LDA); + + static void execute_brgemm_copy_a_kernel( + const std::shared_ptr& kernel, + const void* src, + const void* tr_src, + dnnl_dim_t M, + dnnl_dim_t K); }; #define GET_OFF_BRGEMM_AMX_ARGS(field) offsetof(BrgemmAMXKernelExecutor::call_args, field) -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_base.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_base.cpp index 17b1f0e053b577..008237780de3f6 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_base.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_base.cpp @@ -9,11 +9,11 @@ #include "transformations/snippets/x64/op/brgemm_cpu.hpp" #include "transformations/snippets/x64/op/brgemm_utils.hpp" -#define DIM_CAST(X) static_cast(X) +#define DIM_CAST(X) static_cast(X) #define DTYPE_CAST(X) static_cast(DnnlExtensionUtils::ElementTypeToDataType(X)) -#define PRINT(X) ss << #X << " = " << X << "\n" -#define EQ(X) X == rhs.X -#define HASH(X) seed = hash_combine(seed, X) +#define PRINT(X) ss << #X << " = " << X << "\n" +#define EQ(X) X == rhs.X +#define HASH(X) seed = hash_combine(seed, X) using namespace Xbyak; using namespace dnnl::impl; @@ -31,22 +31,34 @@ bool BrgemmBaseKernelConfig::is_empty() const { } bool BrgemmBaseKernelConfig::operator==(const BrgemmBaseKernelConfig& rhs) const { - return EQ(m_hash) && EQ(m_beta) && - EQ(m_M) && EQ(m_N) && EQ(m_K) && - EQ(m_LDA) && EQ(m_LDB) && EQ(m_LDC) && + return EQ(m_hash) && EQ(m_beta) && EQ(m_M) && EQ(m_N) && EQ(m_K) && EQ(m_LDA) && EQ(m_LDB) && EQ(m_LDC) && (EQ(get_static_params()) || *get_static_params() == *(rhs.get_static_params())); } -void BrgemmBaseKernelConfig::update(dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K, dnnl_dim_t LDA, dnnl_dim_t LDB, dnnl_dim_t LDC, float beta) { +void BrgemmBaseKernelConfig::update(dnnl_dim_t M, + dnnl_dim_t N, + dnnl_dim_t K, + dnnl_dim_t LDA, + dnnl_dim_t LDB, + dnnl_dim_t LDC, + float beta) { // If M is zero, it means that Brgemm won't be executed (in Loop with work_amount = 0, for example) // To process this case, we have to make this Config as empty (nullify runtime parameters) if (utils::one_of(0, M, N, K)) { - m_M = 0; m_N = 0; m_K = 0; - m_LDA = 0; m_LDB = 0; m_LDC = 0; + m_M = 0; + m_N = 0; + m_K = 0; + m_LDA = 0; + m_LDB = 0; + m_LDC = 0; m_beta = 0; } else { - m_M = M; m_N = N; m_K = K; - m_LDA = LDA; m_LDB = LDB; m_LDC = LDC; + m_M = M; + m_N = N; + m_K = K; + m_LDA = LDA; + m_LDB = LDB; + m_LDC = LDC; m_beta = beta; } m_hash = compute_hash(); @@ -54,30 +66,45 @@ void BrgemmBaseKernelConfig::update(dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K, dn size_t BrgemmBaseKernelConfig::compute_hash() const { size_t seed = get_static_params()->hash(); - HASH(m_M); HASH(m_N); HASH(m_K); - HASH(m_LDA); HASH(m_LDB); HASH(m_LDC); + HASH(m_M); + HASH(m_N); + HASH(m_K); + HASH(m_LDA); + HASH(m_LDB); + HASH(m_LDC); HASH(m_beta); return seed; } -BrgemmBaseKernelConfig::StaticBaseParams::StaticBaseParams(const element::Type& in0_dtype, const element::Type& in1_dtype, - cpu_isa_t primitive_isa, size_t hash_seed) - : dt_in0(DTYPE_CAST(in0_dtype)), dt_in1(DTYPE_CAST(in1_dtype)), isa(primitive_isa), m_hash(compute_hash(hash_seed, dt_in0, dt_in1, isa)) {} +BrgemmBaseKernelConfig::StaticBaseParams::StaticBaseParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, + cpu_isa_t primitive_isa, + size_t hash_seed) + : dt_in0(DTYPE_CAST(in0_dtype)), + dt_in1(DTYPE_CAST(in1_dtype)), + isa(primitive_isa), + m_hash(compute_hash(hash_seed, dt_in0, dt_in1, isa)) {} bool BrgemmBaseKernelConfig::StaticBaseParams::operator==(const StaticBaseParams& rhs) const { return EQ(hash()) && EQ(dt_in0) && EQ(dt_in1) && EQ(isa); } -size_t BrgemmBaseKernelConfig::StaticBaseParams::compute_hash(size_t hash_seed, dnnl_data_type_t dt_in0, dnnl_data_type_t dt_in1, cpu_isa_t isa) { +size_t BrgemmBaseKernelConfig::StaticBaseParams::compute_hash(size_t hash_seed, + dnnl_data_type_t dt_in0, + dnnl_data_type_t dt_in1, + cpu_isa_t isa) { size_t seed = hash_seed; - HASH(dt_in0); HASH(dt_in1); HASH(isa); + HASH(dt_in0); + HASH(dt_in1); + HASH(isa); return seed; } #ifdef SNIPPETS_DEBUG_CAPS std::string BrgemmBaseKernelConfig::StaticBaseParams::to_string() const { std::stringstream ss; - PRINT(dt_in0); PRINT(dt_in1); + PRINT(dt_in0); + PRINT(dt_in1); PRINT(isa); return ss.str(); } @@ -85,26 +112,33 @@ std::string BrgemmBaseKernelConfig::StaticBaseParams::to_string() const { std::string BrgemmBaseKernelConfig::to_string() const { std::stringstream ss; ss << get_static_params()->to_string() << "\n"; - PRINT(m_M); PRINT(m_N); PRINT(m_K); - PRINT(m_LDA); PRINT(m_LDB); PRINT(m_LDC); + PRINT(m_M); + PRINT(m_N); + PRINT(m_K); + PRINT(m_LDA); + PRINT(m_LDB); + PRINT(m_LDC); PRINT(m_beta); return ss.str(); } #endif -float BrgemmBaseKernelExecutor::get_beta(const ov::snippets::lowered::LoopManagerPtr& loop_manager, int loop_id, +float BrgemmBaseKernelExecutor::get_beta(const ov::snippets::lowered::LoopManagerPtr& loop_manager, + int loop_id, const ov::snippets::lowered::ExpandedLoopInfoPtr& current_expanded_loop_info) { // Find all Expanded loops with the same Unified loop information -> they were decomposed from this Unified Loop. // Note that LoopInfo are normalized and sorted (due to NormalizedLoopIDs pass). // It means that previous executed Loops have Loop ID less the current Loop ID. - // - If there is executed Loop (work_amount > 0) and evaluated before the current -> the current Brgemm should have `beta = 1`. + // - If there is executed Loop (work_amount > 0) and evaluated before the current -> the current Brgemm should have + // `beta = 1`. // - If there is not this Loop -> the current executed Brgemm should have `beta = 0`. if (loop_id > 0) { const auto& current_unified_loop_info = current_expanded_loop_info->get_unified_loop_info(); // Check the previous Loops --loop_id; while (loop_id >= 0) { - const auto& expanded_loop_info = loop_manager->get_loop_info(loop_id); + const auto& expanded_loop_info = + loop_manager->get_loop_info(loop_id); if (expanded_loop_info->get_unified_loop_info() != current_unified_loop_info) return 0; if (expanded_loop_info->get_work_amount() > 0) { @@ -143,7 +177,7 @@ void BrgemmBaseKernelExecutor::update_config(const ov::snippets::lowered::Expres size_t loop_idx = 0; const auto& loop_ids = expr->get_loop_ids(); const auto& loop_manager = linear_ir->get_loop_manager(); - auto get_loop_info = [&](){ + auto get_loop_info = [&]() { OPENVINO_ASSERT(loop_idx < loop_ids.size(), "Loop is missed"); return loop_manager->get_loop_info(loop_ids[loop_idx++]); }; @@ -160,9 +194,11 @@ void BrgemmBaseKernelExecutor::update_config(const ov::snippets::lowered::Expres // to avoid extra checks, we validate only first input port // Note: We check `is_incremented` attribute only for not incremented ports because // this `is_incremented = true` can be changed by `CleanRepeatedDataPointerShifts` optimization - auto check_port = [&](const ov::snippets::lowered::LoopPort& p) { return p.dim_idx == 1; }; + auto check_port = [&](const ov::snippets::lowered::LoopPort& p) { + return p.dim_idx == 1; + }; OPENVINO_ASSERT(in_ports.size() > 1 && std::all_of(in_ports.cbegin(), in_ports.cend(), check_port) && - out_ports.size() == 1 && check_port(out_ports.back()), + out_ports.size() == 1 && check_port(out_ports.back()), "Incorrect Loop by Brgemm dimension M"); M = current_expanded_loop_info->get_work_amount() > 0 ? current_expanded_loop_info->get_increment() : 0; input_pds[0]->set_subtensor_dim(1, M); @@ -179,9 +215,12 @@ void BrgemmBaseKernelExecutor::update_config(const ov::snippets::lowered::Expres // Quick validation check: Should we check that port is really Brgemm port? // Note: We check `is_incremented` attribute only for not incremented ports because // this `is_incremented = true` can be changed by `CleanRepeatedDataPointerShifts` optimization - auto check_port = [&](const ov::snippets::lowered::LoopPort& p) { return p.dim_idx == 0; }; - OPENVINO_ASSERT(in_ports.size() >= 2 && !in_ports.front().is_incremented && std::all_of(in_ports.cbegin(), in_ports.cend(), check_port) && - out_ports.size() == 1 && check_port(out_ports.back()), + auto check_port = [&](const ov::snippets::lowered::LoopPort& p) { + return p.dim_idx == 0; + }; + OPENVINO_ASSERT(in_ports.size() >= 2 && !in_ports.front().is_incremented && + std::all_of(in_ports.cbegin(), in_ports.cend(), check_port) && out_ports.size() == 1 && + check_port(out_ports.back()), "Incorrect Loop by Brgemm dimension N"); N = current_expanded_loop_info->get_work_amount() > 0 ? current_expanded_loop_info->get_increment() : 0; input_pds[1]->set_subtensor_dim(0, N); @@ -204,7 +243,7 @@ void BrgemmBaseKernelExecutor::update_config(const ov::snippets::lowered::Expres // Note: We check `is_incremented` attribute only for not incremented ports because // this `is_incremented = true` can be changed by `CleanRepeatedDataPointerShifts` optimization OPENVINO_ASSERT(in_ports.size() >= 2 && in_ports.front().dim_idx == 0 && in_ports.back().dim_idx == 1 && - out_ports.size() == 1 && !out_ports.front().is_incremented, + out_ports.size() == 1 && !out_ports.front().is_incremented, "Incorrect Loop by Brgemm dimension K"); K = current_expanded_loop_info->get_work_amount() > 0 ? current_expanded_loop_info->get_increment() : 0; input_pds[0]->set_subtensor_dim(0, K); @@ -226,13 +265,37 @@ void BrgemmBaseKernelExecutor::update_config(const ov::snippets::lowered::Expres config.update(DIM_CAST(M), DIM_CAST(N), DIM_CAST(K), LDA, LDB, LDC, beta); } -void BrgemmBaseKernelExecutor::create_brgemm_kernel(std::shared_ptr& kernel, dnnl_data_type_t dt0, dnnl_data_type_t dt1, - cpu_isa_t isa, dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K, - dnnl_dim_t LDA, dnnl_dim_t LDB, dnnl_dim_t LDC, float beta, bool with_amx, char* palette) { +void BrgemmBaseKernelExecutor::create_brgemm_kernel(std::shared_ptr& kernel, + dnnl_data_type_t dt0, + dnnl_data_type_t dt1, + cpu_isa_t isa, + dnnl_dim_t M, + dnnl_dim_t N, + dnnl_dim_t K, + dnnl_dim_t LDA, + dnnl_dim_t LDB, + dnnl_dim_t LDC, + float beta, + bool with_amx, + char* palette) { cpu::x64::brgemm_desc_t desc; - OV_CPU_JIT_EMITTER_ASSERT(brgemm_desc_init(&desc, isa, cpu::x64::brgemm_strd, dt0, dt1, - false, false, cpu::x64::brgemm_row_major, 1.f, - beta, LDA, LDB, LDC, M, N, K, nullptr) == dnnl_success, + OV_CPU_JIT_EMITTER_ASSERT(brgemm_desc_init(&desc, + isa, + cpu::x64::brgemm_strd, + dt0, + dt1, + false, + false, + cpu::x64::brgemm_row_major, + 1.f, + beta, + LDA, + LDB, + LDC, + M, + N, + K, + nullptr) == dnnl_success, "Cannot initialize brgemm descriptor due to invalid params"); if (with_amx) { @@ -241,12 +304,18 @@ void BrgemmBaseKernelExecutor::create_brgemm_kernel(std::shared_ptr(kernel_); } -void BrgemmBaseKernelExecutor::execute_brgemm_kernel(const std::shared_ptr& kernel, - const void* src, const void* wei, void* dst, void* scratch, bool with_comp) { +void BrgemmBaseKernelExecutor::execute_brgemm_kernel( + const std::shared_ptr& kernel, + const void* src, + const void* wei, + void* dst, + void* scratch, + bool with_comp) { cpu::x64::brgemm_kernel_params_t brgemm_p; brgemm_p.batch = nullptr; // default value brgemm_p.ptr_A = src; @@ -269,5 +338,5 @@ void BrgemmBaseKernelExecutor::execute_brgemm_kernel(const std::shared_ptr #include "cpu/x64/cpu_isa_traits.hpp" - #include "emitters/plugin/x64/jit_emitter.hpp" -#include "emitters/snippets/jit_snippets_call_args.hpp" #include "emitters/snippets/cpu_kernel_executor_table.hpp" -#include - -#include "snippets/lowered/loop_manager.hpp" +#include "emitters/snippets/jit_snippets_call_args.hpp" +#include "openvino/core/type/element_type.hpp" #include "snippets/lowered/loop_info.hpp" +#include "snippets/lowered/loop_manager.hpp" namespace ov { namespace intel_cpu { @@ -24,27 +22,51 @@ struct BrgemmBaseKernelConfig : public snippets::KernelExecutorBase::GenericConf BrgemmBaseKernelConfig() = default; bool is_completed() const override; - size_t hash() const override { return m_hash; } + size_t hash() const override { + return m_hash; + } bool is_empty() const; void update(dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K, dnnl_dim_t LDA, dnnl_dim_t LDB, dnnl_dim_t LDC, float beta); bool operator==(const BrgemmBaseKernelConfig& rhs) const; - bool operator!=(const BrgemmBaseKernelConfig& rhs) const {return !(*this == rhs);} - - dnnl_data_type_t get_dt_in0() const { return get_static_params()->dt_in0; } - dnnl_data_type_t get_dt_in1() const { return get_static_params()->dt_in1; } - - dnnl::impl::cpu::x64::cpu_isa_t get_isa() const { return get_static_params()->isa; } - float get_beta() const { return m_beta; } - - dnnl_dim_t get_M() const { return m_M; } - dnnl_dim_t get_N() const { return m_N; } - dnnl_dim_t get_K() const { return m_K; } - - dnnl_dim_t get_LDA() const { return m_LDA; } - dnnl_dim_t get_LDB() const { return m_LDB; } - dnnl_dim_t get_LDC() const { return m_LDC; } + bool operator!=(const BrgemmBaseKernelConfig& rhs) const { + return !(*this == rhs); + } + + dnnl_data_type_t get_dt_in0() const { + return get_static_params()->dt_in0; + } + dnnl_data_type_t get_dt_in1() const { + return get_static_params()->dt_in1; + } + + dnnl::impl::cpu::x64::cpu_isa_t get_isa() const { + return get_static_params()->isa; + } + float get_beta() const { + return m_beta; + } + + dnnl_dim_t get_M() const { + return m_M; + } + dnnl_dim_t get_N() const { + return m_N; + } + dnnl_dim_t get_K() const { + return m_K; + } + + dnnl_dim_t get_LDA() const { + return m_LDA; + } + dnnl_dim_t get_LDB() const { + return m_LDB; + } + dnnl_dim_t get_LDC() const { + return m_LDC; + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const override; @@ -52,51 +74,77 @@ struct BrgemmBaseKernelConfig : public snippets::KernelExecutorBase::GenericConf protected: struct StaticBaseParams { - StaticBaseParams(const element::Type& in0_dtype, const element::Type& in1_dtype, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa, size_t hash_seed); + StaticBaseParams(const element::Type& in0_dtype, + const element::Type& in1_dtype, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa, + size_t hash_seed); virtual ~StaticBaseParams() = default; - const dnnl_data_type_t dt_in0 {dnnl_f32}, dt_in1 {dnnl_f32}; - const dnnl::impl::cpu::x64::cpu_isa_t isa {dnnl::impl::cpu::x64::isa_undef}; + const dnnl_data_type_t dt_in0{dnnl_f32}, dt_in1{dnnl_f32}; + const dnnl::impl::cpu::x64::cpu_isa_t isa{dnnl::impl::cpu::x64::isa_undef}; - size_t hash() const { return m_hash; } + size_t hash() const { + return m_hash; + } bool operator==(const StaticBaseParams& rhs) const; - bool operator!=(const StaticBaseParams& rhs) const { return !(*this == rhs); } + bool operator!=(const StaticBaseParams& rhs) const { + return !(*this == rhs); + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const; #endif protected: - static size_t compute_hash(size_t hash_seed, dnnl_data_type_t dt_in0, dnnl_data_type_t dt_in1, dnnl::impl::cpu::x64::cpu_isa_t isa); + static size_t compute_hash(size_t hash_seed, + dnnl_data_type_t dt_in0, + dnnl_data_type_t dt_in1, + dnnl::impl::cpu::x64::cpu_isa_t isa); - const size_t m_hash {0}; + const size_t m_hash{0}; }; virtual std::shared_ptr get_static_params() const = 0; size_t compute_hash() const; - dnnl_dim_t m_M {0}, m_N {0}, m_K {0}, m_LDA {0}, m_LDB {0}, m_LDC {0}; - float m_beta {0}; - size_t m_hash {SIZE_MAX}; + dnnl_dim_t m_M{0}, m_N{0}, m_K{0}, m_LDA{0}, m_LDB{0}, m_LDC{0}; + float m_beta{0}; + size_t m_hash{SIZE_MAX}; }; class BrgemmBaseKernelExecutor { public: virtual ~BrgemmBaseKernelExecutor() = default; + protected: - static float get_beta(const ov::snippets::lowered::LoopManagerPtr& loop_manager, int loop_id, + static float get_beta(const ov::snippets::lowered::LoopManagerPtr& loop_manager, + int loop_id, const ov::snippets::lowered::ExpandedLoopInfoPtr& current_expanded_loop_info); static void update_config(const ov::snippets::lowered::ExpressionPtr& expr, const ov::snippets::lowered::LinearIRCPtr& linear_ir, BrgemmBaseKernelConfig& config); - static void create_brgemm_kernel(std::shared_ptr& kernel, dnnl_data_type_t dt0, dnnl_data_type_t dt1, - dnnl::impl::cpu::x64::cpu_isa_t isa, dnnl_dim_t M, dnnl_dim_t N, dnnl_dim_t K, - dnnl_dim_t LDA, dnnl_dim_t LDB, dnnl_dim_t LDC, float beta, bool with_amx = false, char* palette = nullptr); - - static void execute_brgemm_kernel(const std::shared_ptr& kernel, const void* src, const void* wei, - void* dst, void* scratch, bool with_comp); + static void create_brgemm_kernel(std::shared_ptr& kernel, + dnnl_data_type_t dt0, + dnnl_data_type_t dt1, + dnnl::impl::cpu::x64::cpu_isa_t isa, + dnnl_dim_t M, + dnnl_dim_t N, + dnnl_dim_t K, + dnnl_dim_t LDA, + dnnl_dim_t LDB, + dnnl_dim_t LDC, + float beta, + bool with_amx = false, + char* palette = nullptr); + + static void execute_brgemm_kernel(const std::shared_ptr& kernel, + const void* src, + const void* wei, + void* dst, + void* scratch, + bool with_comp); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.cpp index cc79458c7c4c64..dd216517ace12e 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.cpp @@ -4,8 +4,8 @@ #include "brgemm_copy_b.hpp" -#include "snippets/lowered/loop_manager.hpp" #include "emitters/plugin/x64/utils.hpp" +#include "snippets/lowered/loop_manager.hpp" #include "transformations/snippets/x64/op/brgemm_utils.hpp" #define DTYPE_CAST(X) static_cast(DnnlExtensionUtils::ElementTypeToDataType(X)) @@ -16,8 +16,12 @@ using namespace dnnl::impl::cpu::x64; namespace ov { namespace intel_cpu { -BrgemmCopyBKernelConfig::BrgemmCopyBKernelConfig(const element::Type& src_dt, const element::Type& wei_dt, cpu_isa_t isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_N_blk) +BrgemmCopyBKernelConfig::BrgemmCopyBKernelConfig(const element::Type& src_dt, + const element::Type& wei_dt, + cpu_isa_t isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_N_blk) : m_static_params(std::make_shared(src_dt, wei_dt, isa, is_with_comp, is_transposed_B, wei_N_blk)) { m_hash = compute_hash(); } @@ -37,17 +41,28 @@ bool BrgemmCopyBKernelConfig::operator==(const BrgemmCopyBKernelConfig& rhs) con #undef EQ } -void BrgemmCopyBKernelConfig::update(dnnl_dim_t N, dnnl_dim_t N_blk, dnnl_dim_t K, dnnl_dim_t K_blk, dnnl_dim_t copy_B_wei_stride, dnnl_dim_t LDB) { - // If one of the dims is zero, it means that BrgemmCopyB won't be executed (in Loop with work_amount = 0, for example) - // To process this case, we have to make this Config as empty (nullify runtime parameters) +void BrgemmCopyBKernelConfig::update(dnnl_dim_t N, + dnnl_dim_t N_blk, + dnnl_dim_t K, + dnnl_dim_t K_blk, + dnnl_dim_t copy_B_wei_stride, + dnnl_dim_t LDB) { + // If one of the dims is zero, it means that BrgemmCopyB won't be executed (in Loop with work_amount = 0, for + // example) To process this case, we have to make this Config as empty (nullify runtime parameters) if (utils::one_of(0, N, K)) { - m_N = 0; m_N_blk = 0; - m_K = 0; m_K_blk = 0; - m_copy_B_wei_stride = 0; m_LDB = 0; + m_N = 0; + m_N_blk = 0; + m_K = 0; + m_K_blk = 0; + m_copy_B_wei_stride = 0; + m_LDB = 0; } else { - m_N = N; m_N_blk = N_blk; - m_K = K; m_K_blk = K_blk; - m_copy_B_wei_stride = copy_B_wei_stride; m_LDB = LDB; + m_N = N; + m_N_blk = N_blk; + m_K = K; + m_K_blk = K_blk; + m_copy_B_wei_stride = copy_B_wei_stride; + m_LDB = LDB; } m_hash = compute_hash(); } @@ -55,59 +70,94 @@ void BrgemmCopyBKernelConfig::update(dnnl_dim_t N, dnnl_dim_t N_blk, dnnl_dim_t size_t BrgemmCopyBKernelConfig::compute_hash() const { size_t seed = m_static_params->hash; #define HASH(X) seed = hash_combine(seed, X) - HASH(m_N); HASH(m_N_blk); - HASH(m_K); HASH(m_K_blk); - HASH(m_copy_B_wei_stride); HASH(m_LDB); + HASH(m_N); + HASH(m_N_blk); + HASH(m_K); + HASH(m_K_blk); + HASH(m_copy_B_wei_stride); + HASH(m_LDB); #undef HASH return seed; } -BrgemmCopyBKernelConfig::StaticParams::StaticParams(const element::Type& src_type, const element::Type& wei_type, cpu_isa_t isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_n_blk) - : src_dt(DTYPE_CAST(src_type)), wei_dt(DTYPE_CAST(wei_type)), isa(isa), - is_with_comp(is_with_comp), is_transposed_B(is_transposed_B), wei_N_blk(wei_n_blk), +BrgemmCopyBKernelConfig::StaticParams::StaticParams(const element::Type& src_type, + const element::Type& wei_type, + cpu_isa_t isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_n_blk) + : src_dt(DTYPE_CAST(src_type)), + wei_dt(DTYPE_CAST(wei_type)), + isa(isa), + is_with_comp(is_with_comp), + is_transposed_B(is_transposed_B), + wei_N_blk(wei_n_blk), hash(init_hash(src_dt, wei_dt, isa, is_with_comp, is_transposed_B, wei_N_blk)) {} bool BrgemmCopyBKernelConfig::StaticParams::operator==(const StaticParams& rhs) const { #define EQ(X) X == rhs.X - return EQ(hash) && EQ(src_dt) && EQ(wei_dt)&& EQ(isa) && EQ(is_with_comp) && EQ(is_transposed_B) && EQ(wei_N_blk); + return EQ(hash) && EQ(src_dt) && EQ(wei_dt) && EQ(isa) && EQ(is_with_comp) && EQ(is_transposed_B) && EQ(wei_N_blk); #undef EQ } -size_t BrgemmCopyBKernelConfig::StaticParams::init_hash(const dnnl_data_type_t& src_dt, const dnnl_data_type_t& wei_dt, cpu_isa_t isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_N_blk) { +size_t BrgemmCopyBKernelConfig::StaticParams::init_hash(const dnnl_data_type_t& src_dt, + const dnnl_data_type_t& wei_dt, + cpu_isa_t isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_N_blk) { size_t seed = 0; #define HASH(X) seed = hash_combine(seed, X) - HASH(src_dt); HASH(wei_dt); HASH(isa); - HASH(is_with_comp); HASH(is_transposed_B); HASH(wei_N_blk); + HASH(src_dt); + HASH(wei_dt); + HASH(isa); + HASH(is_with_comp); + HASH(is_transposed_B); + HASH(wei_N_blk); #undef HASH return seed; } #ifdef SNIPPETS_DEBUG_CAPS -#define PRINT(X) ss << #X << " = " << X << "\n" +# define PRINT(X) ss << #X << " = " << X << "\n" std::string BrgemmCopyBKernelConfig::to_string() const { std::stringstream ss; ss << m_static_params->to_string() << "\n"; - PRINT(m_hash); PRINT(m_N); PRINT(m_N_blk); - PRINT(m_K); PRINT(m_K_blk); PRINT(m_LDB); PRINT(m_copy_B_wei_stride); + PRINT(m_hash); + PRINT(m_N); + PRINT(m_N_blk); + PRINT(m_K); + PRINT(m_K_blk); + PRINT(m_LDB); + PRINT(m_copy_B_wei_stride); return ss.str(); } std::string BrgemmCopyBKernelConfig::StaticParams::to_string() const { std::stringstream ss; - PRINT(src_dt); PRINT(wei_dt); PRINT(isa); - PRINT(is_with_comp); PRINT(is_transposed_B); PRINT(wei_N_blk); + PRINT(src_dt); + PRINT(wei_dt); + PRINT(isa); + PRINT(is_with_comp); + PRINT(is_transposed_B); + PRINT(wei_N_blk); return ss.str(); } -#undef PRINT +# undef PRINT #endif BrgemmCopyBKernel::BrgemmCopyBKernel() : jit_generator(jit_name()), ker_(nullptr) {} BrgemmCopyBKernel::BrgemmCopyBKernel(const BrgemmCopyBKernelConfig& conf) - : jit_generator(jit_name()), is_with_comp(conf.is_with_comp()), is_transpose(conf.is_transposed_B()), - wei_data_size(dnnl_data_type_size(conf.get_wei_dt())), vnni_factor(data_type_vnni_granularity(conf.get_wei_dt())), - K(conf.get_K()), N_blk(conf.get_N_blk()), wei_N_blk(conf.get_wei_N_blk()), wei_N_tail(conf.get_wei_N_tail()), ker_(nullptr) { + : jit_generator(jit_name()), + is_with_comp(conf.is_with_comp()), + is_transpose(conf.is_transposed_B()), + wei_data_size(dnnl_data_type_size(conf.get_wei_dt())), + vnni_factor(data_type_vnni_granularity(conf.get_wei_dt())), + K(conf.get_K()), + N_blk(conf.get_N_blk()), + wei_N_blk(conf.get_wei_N_blk()), + wei_N_tail(conf.get_wei_N_tail()), + ker_(nullptr) { init_brgemm_copy_b_kernel(dnnl_brgemm_copy_b_kernel, conf); OV_CPU_JIT_EMITTER_ASSERT(dnnl_brgemm_copy_b_kernel, "Kernel is missed!"); } @@ -124,8 +174,9 @@ void BrgemmCopyBKernel::operator()(const call_args* args) const { ker_(args); } -void BrgemmCopyBKernel::init_brgemm_copy_b_kernel(std::unique_ptr& kernel, - const BrgemmCopyBKernelConfig& conf) const { +void BrgemmCopyBKernel::init_brgemm_copy_b_kernel( + std::unique_ptr& kernel, + const BrgemmCopyBKernelConfig& conf) const { matmul::brgemm_matmul_conf_t brgCopyKernelConf; brgCopyKernelConf.src_dt = conf.get_src_dt(); brgCopyKernelConf.wei_dt = conf.get_wei_dt(); @@ -143,8 +194,10 @@ void BrgemmCopyBKernel::init_brgemm_copy_b_kernel(std::unique_ptr(brgCopyKernelConf.wei_dt)); - brgCopyKernelConf.tr_b_dt_sz = DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.wei_dt)); + brgCopyKernelConf.b_dt_sz = + DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.wei_dt)); + brgCopyKernelConf.tr_b_dt_sz = + DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.wei_dt)); brgCopyKernelConf.req_wei_vnni_downconvert = false; @@ -191,28 +244,35 @@ void BrgemmCopyBKernel::generate() { postamble(); } -void BrgemmCopyBKernel::emit_brgemm_copy_b_kernel_call(size_t N, size_t K, size_t offset_in, size_t offset_out, size_t offset_comp) { +void BrgemmCopyBKernel::emit_brgemm_copy_b_kernel_call(size_t N, + size_t K, + size_t offset_in, + size_t offset_out, + size_t offset_comp) { EmitABIRegSpills spill(this); spill.preamble(); const auto add_offset = [&](Xbyak::Reg64 reg, size_t bytes_offset) { - if (bytes_offset) add(reg, bytes_offset); + if (bytes_offset) + add(reg, bytes_offset); }; // save function address in gpr to pass in call instruction - const auto& kernel_overload = static_cast(execute); + const auto& kernel_overload = static_cast< + void (*)(matmul::jit_brgemm_matmul_copy_b_t*, const void*, const void*, const void*, size_t, size_t)>(execute); mov(rbp, reinterpret_cast(kernel_overload)); mov(abi_param1, reinterpret_cast(dnnl_brgemm_copy_b_kernel.get())); - add_offset(src_reg, offset_in); // abi_param2 - add_offset(tr_src_reg, offset_out); // abi_param3 - if (is_with_comp) // abi_param4 + add_offset(src_reg, offset_in); // abi_param2 + add_offset(tr_src_reg, offset_out); // abi_param3 + if (is_with_comp) // abi_param4 add_offset(comp_reg, offset_comp); else mov(comp_reg, reinterpret_cast(nullptr)); #ifdef _WIN32 - // Note: ABI requires that the remaining parameters (except the first for) are pushed to the stack in right-to-left order + // Note: ABI requires that the remaining parameters (except the first for) are pushed to the stack in right-to-left + // order // Shadow space will be allocated inside internal_call_rsp_align() push(K); push(N); @@ -233,7 +293,12 @@ void BrgemmCopyBKernel::emit_brgemm_copy_b_kernel_call(size_t N, size_t K, size_ spill.postamble(); } -void BrgemmCopyBKernel::execute(matmul::jit_brgemm_matmul_copy_b_t* kernel, const void* src, const void* dst, const void* comp, size_t N, size_t K) { +void BrgemmCopyBKernel::execute(matmul::jit_brgemm_matmul_copy_b_t* kernel, + const void* src, + const void* dst, + const void* comp, + size_t N, + size_t K) { auto ctx = matmul::jit_brgemm_matmul_copy_b_t::ctx_t(); ctx.current_N_blk = N; ctx.src = src; @@ -248,10 +313,12 @@ void BrgemmCopyBKernel::execute(matmul::jit_brgemm_matmul_copy_b_t* kernel, cons (*kernel)(&ctx); } -BrgemmCopyBKernelExecutor::BrgemmCopyBKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, BrgemmCopyBKernelConfig config) - : CPUKernelExecutor(std::move(kernel_cache), std::move(config)) { } +BrgemmCopyBKernelExecutor::BrgemmCopyBKernelExecutor(ov::intel_cpu::MultiCacheWeakPtr kernel_cache, + BrgemmCopyBKernelConfig config) + : CPUKernelExecutor(std::move(kernel_cache), std::move(config)) {} -std::shared_ptr BrgemmCopyBKernelExecutor::compile_kernel(const BrgemmCopyBKernelConfig& config) const { +std::shared_ptr BrgemmCopyBKernelExecutor::compile_kernel( + const BrgemmCopyBKernelConfig& config) const { std::shared_ptr compiled_kernel = std::make_shared(); // BrgemmCopyB is not executable - nothing to compile if (!config.is_empty()) { @@ -283,14 +350,16 @@ void BrgemmCopyBKernelExecutor::update_config(const ov::snippets::lowered::Expre const auto& loop_manager = linear_ir->get_loop_manager(); auto init = [&](size_t& dim, size_t& blk, size_t idx) { - OPENVINO_ASSERT(idx < planar_shape.size() && idx < in_subtensor.size(), "Index must be less than shape/subtensor rank!"); + OPENVINO_ASSERT(idx < planar_shape.size() && idx < in_subtensor.size(), + "Index must be less than shape/subtensor rank!"); dim = *(planar_shape.rbegin() + idx); blk = *(in_subtensor.rbegin() + idx); if (ov::snippets::utils::is_full_dim_value(blk)) { blk = dim; } else { OPENVINO_ASSERT(loop_idx < loop_ids.size(), "Loop is missed"); - const auto& current_expanded_loop_info = loop_manager->get_loop_info(loop_ids[loop_idx++]); + const auto& current_expanded_loop_info = + loop_manager->get_loop_info(loop_ids[loop_idx++]); blk = current_expanded_loop_info->get_increment(); input_desc->set_subtensor_dim(idx, blk); output_desc->set_subtensor_dim(idx, blk); @@ -306,7 +375,9 @@ void BrgemmCopyBKernelExecutor::update_config(const ov::snippets::lowered::Expre const auto& brg_weight_etype = expr->get_node()->get_input_element_type(0); const auto LDB = brgemm_utils::repacking::compute_LDB(N_dim, brg_weight_etype); - const auto copy_B_wei_stride = ov::snippets::utils::get_dim_stride(expr->get_input_port(0), config.is_transposed_B() ? 0 : 1) * brg_weight_etype.size(); + const auto copy_B_wei_stride = + ov::snippets::utils::get_dim_stride(expr->get_input_port(0), config.is_transposed_B() ? 0 : 1) * + brg_weight_etype.size(); config.update(N_dim, N_blk, K_dim, K_blk, copy_B_wei_stride, LDB); } @@ -318,5 +389,5 @@ void BrgemmCopyBKernelExecutor::execute(const BrgemmCopyBKernelExecutor* executo (*kernel)(args); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.hpp index c4e3f3622ad88f..b3b107cd676705 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/kernel_executors/brgemm_copy_b.hpp @@ -4,13 +4,12 @@ #pragma once -#include "emitters/plugin/x64/jit_emitter.hpp" -#include "emitters/snippets/jit_snippets_call_args.hpp" -#include "emitters/snippets/cpu_kernel_executor_table.hpp" - #include #include +#include "emitters/plugin/x64/jit_emitter.hpp" +#include "emitters/snippets/cpu_kernel_executor_table.hpp" +#include "emitters/snippets/jit_snippets_call_args.hpp" namespace ov { namespace intel_cpu { @@ -18,11 +17,17 @@ namespace intel_cpu { struct BrgemmCopyBKernelConfig : public snippets::KernelExecutorBase::GenericConfig { public: BrgemmCopyBKernelConfig() = default; - BrgemmCopyBKernelConfig(const element::Type& src_dt, const element::Type& wei_dt, dnnl::impl::cpu::x64::cpu_isa_t isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_N_blk); + BrgemmCopyBKernelConfig(const element::Type& src_dt, + const element::Type& wei_dt, + dnnl::impl::cpu::x64::cpu_isa_t isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_N_blk); bool operator==(const BrgemmCopyBKernelConfig& rhs) const; - bool operator!=(const BrgemmCopyBKernelConfig& rhs) const {return !(*this == rhs);} + bool operator!=(const BrgemmCopyBKernelConfig& rhs) const { + return !(*this == rhs); + } std::unique_ptr get_clone_ptr() const override { return std::unique_ptr(new BrgemmCopyBKernelConfig(*this)); @@ -31,26 +36,61 @@ struct BrgemmCopyBKernelConfig : public snippets::KernelExecutorBase::GenericCon bool is_empty() const; bool is_completed() const override; - void update(dnnl_dim_t N, dnnl_dim_t N_blk, dnnl_dim_t K, dnnl_dim_t K_blk, dnnl_dim_t copy_B_wei_stride, dnnl_dim_t LDB); + void update(dnnl_dim_t N, + dnnl_dim_t N_blk, + dnnl_dim_t K, + dnnl_dim_t K_blk, + dnnl_dim_t copy_B_wei_stride, + dnnl_dim_t LDB); - size_t hash() const override { return m_hash; } + size_t hash() const override { + return m_hash; + } - dnnl_data_type_t get_src_dt() const { return m_static_params->src_dt; } - dnnl_data_type_t get_wei_dt() const { return m_static_params->wei_dt; } + dnnl_data_type_t get_src_dt() const { + return m_static_params->src_dt; + } + dnnl_data_type_t get_wei_dt() const { + return m_static_params->wei_dt; + } - dnnl::impl::cpu::x64::cpu_isa_t get_isa() const { return m_static_params->isa; } - bool is_with_comp() const { return m_static_params->is_with_comp; } - bool is_transposed_B() const { return m_static_params->is_transposed_B; } + dnnl::impl::cpu::x64::cpu_isa_t get_isa() const { + return m_static_params->isa; + } + bool is_with_comp() const { + return m_static_params->is_with_comp; + } + bool is_transposed_B() const { + return m_static_params->is_transposed_B; + } - dnnl_dim_t get_N() const { return m_N; } - dnnl_dim_t get_N_blk() const { return m_N_blk; } - dnnl_dim_t get_N_tail() const { return m_N % m_N_blk; } - dnnl_dim_t get_wei_N_blk() const { return m_static_params->wei_N_blk; } - dnnl_dim_t get_wei_N_tail() const { return m_N_blk % m_static_params->wei_N_blk; } - dnnl_dim_t get_K() const { return m_K; } - dnnl_dim_t get_K_blk() const { return m_K_blk; } - dnnl_dim_t get_copy_B_wei_stride() const { return m_copy_B_wei_stride; } - dnnl_dim_t get_LDB() const { return m_LDB; } + dnnl_dim_t get_N() const { + return m_N; + } + dnnl_dim_t get_N_blk() const { + return m_N_blk; + } + dnnl_dim_t get_N_tail() const { + return m_N % m_N_blk; + } + dnnl_dim_t get_wei_N_blk() const { + return m_static_params->wei_N_blk; + } + dnnl_dim_t get_wei_N_tail() const { + return m_N_blk % m_static_params->wei_N_blk; + } + dnnl_dim_t get_K() const { + return m_K; + } + dnnl_dim_t get_K_blk() const { + return m_K_blk; + } + dnnl_dim_t get_copy_B_wei_stride() const { + return m_copy_B_wei_stride; + } + dnnl_dim_t get_LDB() const { + return m_LDB; + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const override; @@ -58,35 +98,45 @@ struct BrgemmCopyBKernelConfig : public snippets::KernelExecutorBase::GenericCon private: struct StaticParams { - StaticParams(const element::Type& src_dt, const element::Type& wei_dt, dnnl::impl::cpu::x64::cpu_isa_t isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_N_blk); - - const dnnl_data_type_t src_dt {dnnl_data_type_undef}, wei_dt {dnnl_data_type_undef}; - const dnnl::impl::cpu::x64::cpu_isa_t isa {dnnl::impl::cpu::x64::isa_undef}; - const bool is_with_comp {false}; - const bool is_transposed_B {false}; - const dnnl_dim_t wei_N_blk {0}; - const size_t hash {0}; + StaticParams(const element::Type& src_dt, + const element::Type& wei_dt, + dnnl::impl::cpu::x64::cpu_isa_t isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_N_blk); + + const dnnl_data_type_t src_dt{dnnl_data_type_undef}, wei_dt{dnnl_data_type_undef}; + const dnnl::impl::cpu::x64::cpu_isa_t isa{dnnl::impl::cpu::x64::isa_undef}; + const bool is_with_comp{false}; + const bool is_transposed_B{false}; + const dnnl_dim_t wei_N_blk{0}; + const size_t hash{0}; bool operator==(const StaticParams& rhs) const; - bool operator!=(const StaticParams& rhs) const { return !(*this == rhs); } + bool operator!=(const StaticParams& rhs) const { + return !(*this == rhs); + } #ifdef SNIPPETS_DEBUG_CAPS std::string to_string() const; #endif private: - static size_t init_hash(const dnnl_data_type_t& src_dt, const dnnl_data_type_t& wei_dt, dnnl::impl::cpu::x64::cpu_isa_t primitive_isa, - bool is_with_comp, bool is_transposed_B, dnnl_dim_t wei_N_blk); + static size_t init_hash(const dnnl_data_type_t& src_dt, + const dnnl_data_type_t& wei_dt, + dnnl::impl::cpu::x64::cpu_isa_t primitive_isa, + bool is_with_comp, + bool is_transposed_B, + dnnl_dim_t wei_N_blk); }; size_t compute_hash() const; std::shared_ptr m_static_params; - dnnl_dim_t m_N {0}, m_N_blk {0}; - dnnl_dim_t m_K {0}, m_K_blk {0}; - dnnl_dim_t m_copy_B_wei_stride {0}, m_LDB {0}; - size_t m_hash {SIZE_MAX}; + dnnl_dim_t m_N{0}, m_N_blk{0}; + dnnl_dim_t m_K{0}, m_K_blk{0}; + dnnl_dim_t m_copy_B_wei_stride{0}, m_LDB{0}; + size_t m_hash{SIZE_MAX}; }; struct BrgemmCopyBKernel : public dnnl::impl::cpu::x64::jit_generator { @@ -109,8 +159,12 @@ struct BrgemmCopyBKernel : public dnnl::impl::cpu::x64::jit_generator { void emit_brgemm_copy_b_kernel_call(size_t N, size_t K, size_t offset_in, size_t offset_out, size_t offset_comp); - static void execute(dnnl::impl::cpu::x64::matmul::jit_brgemm_matmul_copy_b_t* kernel, const void* src, const void* dst, const void* comp, - size_t N, size_t K); + static void execute(dnnl::impl::cpu::x64::matmul::jit_brgemm_matmul_copy_b_t* kernel, + const void* src, + const void* dst, + const void* comp, + size_t N, + size_t K); void init_brgemm_copy_b_kernel(std::unique_ptr& kernel, const BrgemmCopyBKernelConfig& conf) const; @@ -151,5 +205,5 @@ class BrgemmCopyBKernelExecutor : public CPUKernelExecutor(); size_t id = SIZE_MAX; switch (port.get_type()) { - case ov::snippets::lowered::ExpressionPort::Type::Input: - offset = ma_op->get_input_offset(port.get_index()); - id = get_cluster_id(port.get_port_connector_ptr()->get_source()); - break; - case ov::snippets::lowered::ExpressionPort::Type::Output: - offset = ma_op->get_output_offset(port.get_index()); - for (const auto& child : port.get_connected_ports()) - if (!ov::is_type(child.get_expr()->get_node())) - id = get_cluster_id(child); - break; - default: - OV_CPU_JIT_EMITTER_THROW("Uknown type of expression port!"); + case ov::snippets::lowered::ExpressionPort::Type::Input: + offset = ma_op->get_input_offset(port.get_index()); + id = get_cluster_id(port.get_port_connector_ptr()->get_source()); + break; + case ov::snippets::lowered::ExpressionPort::Type::Output: + offset = ma_op->get_output_offset(port.get_index()); + for (const auto& child : port.get_connected_ports()) + if (!ov::is_type(child.get_expr()->get_node())) + id = get_cluster_id(child); + break; + default: + OV_CPU_JIT_EMITTER_THROW("Uknown type of expression port!"); } OV_CPU_JIT_EMITTER_ASSERT(IMPLICATION(ov::snippets::utils::is_dynamic_value(offset), id != SIZE_MAX), "In dynamic case Buffer Cluster ID must be known!"); @@ -46,31 +45,41 @@ size_t get_buffer_cluster_id(const ov::snippets::lowered::ExpressionPort& port) Xbyak::Reg64 get_aux_gpr(const std::vector& used_gpr_idxs) { // RSP, RBP - stack-related registers, abi_param1 - runtime parameter register in the kernel - static std::unordered_set blacklist_gpr_idxs = { Xbyak::Operand::RSP, Xbyak::Operand::RBP, static_cast(abi_param1.getIdx()) }; + static std::unordered_set blacklist_gpr_idxs = {Xbyak::Operand::RSP, + Xbyak::Operand::RBP, + static_cast(abi_param1.getIdx())}; for (size_t gpr_idx = 0; gpr_idx <= Xbyak::Operand::R15; ++gpr_idx) { - size_t _idx = Xbyak::Operand::R15 - gpr_idx; // we allocate from the end - if (std::find(used_gpr_idxs.cbegin(), used_gpr_idxs.cend(), _idx) != used_gpr_idxs.cend()) continue; - if (blacklist_gpr_idxs.count(_idx) > 0) continue; + size_t _idx = Xbyak::Operand::R15 - gpr_idx; // we allocate from the end + if (std::find(used_gpr_idxs.cbegin(), used_gpr_idxs.cend(), _idx) != used_gpr_idxs.cend()) + continue; + if (blacklist_gpr_idxs.count(_idx) > 0) + continue; return Xbyak::Reg64(_idx); } OV_CPU_JIT_EMITTER_THROW("Failed to allocate aux GPR"); } -void push_ptr_with_runtime_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, size_t stack_offset, - Xbyak::Reg64 ptr_reg, Xbyak::Reg64 aux_reg, size_t runtime_offset) { +void push_ptr_with_runtime_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, + size_t stack_offset, + Xbyak::Reg64 ptr_reg, + Xbyak::Reg64 aux_reg, + size_t runtime_offset) { const auto stack_frame = h->qword[h->rsp + stack_offset]; h->mov(aux_reg, ptr_reg); h->add(aux_reg, h->ptr[abi_param1 + runtime_offset]); h->mov(stack_frame, aux_reg); } -void push_ptr_with_static_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, size_t stack_offset, - Xbyak::Reg64 ptr_reg, size_t ptr_offset) { +void push_ptr_with_static_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, + size_t stack_offset, + Xbyak::Reg64 ptr_reg, + size_t ptr_offset) { const auto stack_frame = h->qword[h->rsp + stack_offset]; h->mov(stack_frame, ptr_reg); - if (ptr_offset != 0) h->add(stack_frame, ptr_offset); + if (ptr_offset != 0) + h->add(stack_frame, ptr_offset); } -} // namespace utils -} // namespace intel_cpu -} // namespace ov +} // namespace utils +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/utils.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/utils.hpp index 97ea86f404fd67..3d8026ea33c750 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/utils.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/utils.hpp @@ -13,13 +13,17 @@ namespace utils { inline static std::vector transform_idxs_to_regs(const std::vector& idxs) { std::vector regs(idxs.size()); - std::transform(idxs.begin(), idxs.end(), regs.begin(), [](size_t idx){return Xbyak::Reg64(static_cast(idx));}); + std::transform(idxs.begin(), idxs.end(), regs.begin(), [](size_t idx) { + return Xbyak::Reg64(static_cast(idx)); + }); return regs; } inline static std::vector transform_snippets_regs_to_idxs(const std::vector& regs) { std::vector idxs(regs.size()); - std::transform(regs.cbegin(), regs.cend(), idxs.begin(), [](const snippets::Reg& reg) { return reg.idx; }); + std::transform(regs.cbegin(), regs.cend(), idxs.begin(), [](const snippets::Reg& reg) { + return reg.idx; + }); return idxs; } @@ -46,8 +50,11 @@ Xbyak::Reg64 get_aux_gpr(const std::vector& used_gpr_idxs); * @param aux_reg aux register * @param runtime_offset offset in runtime params `abi_param1` */ -void push_ptr_with_runtime_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, size_t stack_offset, - Xbyak::Reg64 ptr_reg, Xbyak::Reg64 aux_reg, size_t runtime_offset); +void push_ptr_with_runtime_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, + size_t stack_offset, + Xbyak::Reg64 ptr_reg, + Xbyak::Reg64 aux_reg, + size_t runtime_offset); /** * @brief Push data pointer on stack adding static offset `ptr_offset` @@ -56,9 +63,11 @@ void push_ptr_with_runtime_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* * @param ptr_reg register contains data pointer * @param ptr_offset offset which will be added to data pointer */ -void push_ptr_with_static_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, size_t stack_offset, - Xbyak::Reg64 ptr_reg, size_t ptr_offset); +void push_ptr_with_static_offset_on_stack(dnnl::impl::cpu::x64::jit_generator* h, + size_t stack_offset, + Xbyak::Reg64 ptr_reg, + size_t ptr_offset); -} // namespace utils -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace utils +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.cpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.cpp index 269212edf1ab9b..9ac7f0d5cd0ffc 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.cpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.cpp @@ -4,20 +4,20 @@ #ifdef SNIPPETS_DEBUG_CAPS -#include "verbose.hpp" -#include "jit_segfault_detector_emitter.hpp" -#include "jit_memory_emitters.hpp" -#include "jit_brgemm_emitter.hpp" -#include "jit_brgemm_copy_b_emitter.hpp" -#include "jit_kernel_emitter.hpp" -#include "jit_snippets_emitters.hpp" -#include "kernel_executors/brgemm.hpp" -#include "kernel_executors/brgemm_amx.hpp" +# include "verbose.hpp" +# include "jit_brgemm_copy_b_emitter.hpp" +# include "jit_brgemm_emitter.hpp" +# include "jit_kernel_emitter.hpp" +# include "jit_memory_emitters.hpp" +# include "jit_segfault_detector_emitter.hpp" +# include "jit_snippets_emitters.hpp" +# include "kernel_executors/brgemm.hpp" +# include "kernel_executors/brgemm_amx.hpp" -#ifndef _WIN32 -#include -#endif +# ifndef _WIN32 +# include +# endif namespace ov { namespace intel_cpu { @@ -44,50 +44,44 @@ std::string vector_to_string(const T& v) { std::string get_emitter_type_name(const jit_emitter* emitter) { std::string name = typeid(*emitter).name(); -#ifndef _WIN32 +# ifndef _WIN32 int status; - std::unique_ptr demangled_name( - abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status), - std::free); + std::unique_ptr demangled_name(abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status), + std::free); name = demangled_name.get(); -#endif +# endif return name; } -std::string init_info_jit_memory_emitter(const jit_memory_emitter *emitter) { +std::string init_info_jit_memory_emitter(const jit_memory_emitter* emitter) { std::stringstream ss; - ss << " src_precision:" << emitter->src_prc - << " dst_precision:" << emitter->dst_prc - << " load/store_element_number:" << emitter->count - << " byte_offset:" << emitter->compiled_byte_offset; + ss << " src_precision:" << emitter->src_prc << " dst_precision:" << emitter->dst_prc + << " load/store_element_number:" << emitter->count << " byte_offset:" << emitter->compiled_byte_offset; return ss.str(); } -static std::string init_info_jit_load_memory_emitter(const jit_load_memory_emitter *emitter) { +static std::string init_info_jit_load_memory_emitter(const jit_load_memory_emitter* emitter) { std::stringstream ss; std::string memory_emitter_info = init_info_jit_memory_emitter(emitter); - ss << "Emitter_type_name:jit_load_memory_emitter" - << memory_emitter_info; + ss << "Emitter_type_name:jit_load_memory_emitter" << memory_emitter_info; return ss.str(); } -static std::string init_info_jit_load_broadcast_emitter(const jit_load_broadcast_emitter *emitter) { +static std::string init_info_jit_load_broadcast_emitter(const jit_load_broadcast_emitter* emitter) { std::stringstream ss; std::string memory_emitter_info = init_info_jit_memory_emitter(emitter); - ss << "Emitter_type_name:jit_load_broadcast_emitter" - << memory_emitter_info; + ss << "Emitter_type_name:jit_load_broadcast_emitter" << memory_emitter_info; return ss.str(); } -static std::string init_info_jit_store_memory_emitter(const jit_store_memory_emitter *emitter) { +static std::string init_info_jit_store_memory_emitter(const jit_store_memory_emitter* emitter) { std::stringstream ss; std::string memory_emitter_info = init_info_jit_memory_emitter(emitter); - ss << "Emitter_type_name:jit_store_memory_emitter" - << memory_emitter_info; + ss << "Emitter_type_name:jit_store_memory_emitter" << memory_emitter_info; return ss.str(); } -std::string init_info_jit_brgemm_emitter(const jit_brgemm_emitter *emitter) { +std::string init_info_jit_brgemm_emitter(const jit_brgemm_emitter* emitter) { std::stringstream ss; ss << "Emitter_type_name:jit_brgemm_emitter"; if (const auto& common = std::dynamic_pointer_cast(emitter->m_kernel_executor)) @@ -100,10 +94,9 @@ std::string init_info_jit_brgemm_emitter(const jit_brgemm_emitter *emitter) { return ss.str(); } -std::string init_info_jit_brgemm_copy_b_emitter(const jit_brgemm_copy_b_emitter *emitter) { +std::string init_info_jit_brgemm_copy_b_emitter(const jit_brgemm_copy_b_emitter* emitter) { std::stringstream ss; - ss << "Emitter_type_name:jit_brgemm_copy_b_emitter" - << emitter->m_kernel_executor->to_string() + ss << "Emitter_type_name:jit_brgemm_copy_b_emitter" << emitter->m_kernel_executor->to_string() << " m_memory_offset:" << vector_to_string(emitter->m_memory_offsets) << " m_buffer_ids:" << vector_to_string(emitter->m_buffer_ids); @@ -114,11 +107,9 @@ std::string init_info_jit_kernel_static_emitter(const jit_kernel_static_emitter* std::stringstream ss; ss << "Emitter_type_name:jit_kernel_static_emitter" << " jcp.exec_domain:" << vector_to_string(emitter->jcp.exec_domain) - << " gp_regs_pool:"<< vector_to_string(emitter->gp_regs_pool) - << " master_shape:" << vector_to_string(emitter->master_shape) - << " num_inputs:" << emitter->num_inputs - << " num_outputs:" << emitter->num_outputs - << " num_unique_buffers:" << emitter->num_unique_buffers + << " gp_regs_pool:" << vector_to_string(emitter->gp_regs_pool) + << " master_shape:" << vector_to_string(emitter->master_shape) << " num_inputs:" << emitter->num_inputs + << " num_outputs:" << emitter->num_outputs << " num_unique_buffers:" << emitter->num_unique_buffers << " data_ptr_regs_idx:" << vector_to_string(emitter->data_ptr_regs_idx) << " vec_regs_pool:" << vector_to_string(emitter->vec_regs_pool) << " reg_indexes_idx:" << emitter->reg_indexes_idx @@ -131,24 +122,20 @@ std::string init_info_jit_kernel_static_emitter(const jit_kernel_static_emitter* std::string init_info_jit_kernel_dynamic_emitter(const jit_kernel_dynamic_emitter* emitter) { std::stringstream ss; ss << "Emitter_type_name:jit_kernel_dynamic_emitter" - << " gp_regs_pool:"<< vector_to_string(emitter->gp_regs_pool) - << " num_inputs:" << emitter->num_inputs - << " num_outputs:" << emitter->num_outputs - << " num_unique_buffers:" << emitter->num_unique_buffers + << " gp_regs_pool:" << vector_to_string(emitter->gp_regs_pool) << " num_inputs:" << emitter->num_inputs + << " num_outputs:" << emitter->num_outputs << " num_unique_buffers:" << emitter->num_unique_buffers << " data_ptr_regs_idx:" << vector_to_string(emitter->data_ptr_regs_idx) << " vec_regs_pool:" << vector_to_string(emitter->vec_regs_pool) << " reg_runtime_params_idx:" << emitter->reg_runtime_params_idx; return ss.str(); } -std::string init_info_jit_uni_segfault_detector_emitter(const jit_uni_segfault_detector_emitter *emitter) { +std::string init_info_jit_uni_segfault_detector_emitter(const jit_uni_segfault_detector_emitter* emitter) { std::stringstream ss; - ss << "Node_name:" << emitter->m_target_node_name - << " use_load_emitter:"<< emitter->is_target_use_load_emitter - << " use_store_emitter:"<< emitter->is_target_use_store_emitter; + ss << "Node_name:" << emitter->m_target_node_name << " use_load_emitter:" << emitter->is_target_use_load_emitter + << " use_store_emitter:" << emitter->is_target_use_store_emitter; if (emitter->is_target_use_load_emitter || emitter->is_target_use_store_emitter) { - ss << " start_address:" << emitter->start_address - << " current_address:" << emitter->current_address + ss << " start_address:" << emitter->start_address << " current_address:" << emitter->current_address << " iteration:" << emitter->iteration << " "; } // traget emitter info @@ -158,14 +145,15 @@ std::string init_info_jit_uni_segfault_detector_emitter(const jit_uni_segfault_d return ss.str(); } -static std::string init_info_jit_emitter_general(const jit_emitter *emitter) { +static std::string init_info_jit_emitter_general(const jit_emitter* emitter) { std::stringstream ss; ss << "Emitter_type_name:" << get_emitter_type_name(emitter); return ss.str(); } -void jit_emitter_info_t::init(const jit_emitter *emitter) { - if (is_initialized_) return; +void jit_emitter_info_t::init(const jit_emitter* emitter) { + if (is_initialized_) + return; if (auto e_type = dynamic_cast(emitter)) { str_ = init_info_jit_load_memory_emitter(e_type); } else if (auto e_type = dynamic_cast(emitter)) { @@ -188,7 +176,7 @@ void jit_emitter_info_t::init(const jit_emitter *emitter) { is_initialized_ = true; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.hpp b/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.hpp index a81364039b98a7..ffbe210f75d2ff 100644 --- a/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.hpp +++ b/src/plugins/intel_cpu/src/emitters/snippets/x64/verbose.hpp @@ -4,27 +4,30 @@ #ifdef SNIPPETS_DEBUG_CAPS -#pragma once +# pragma once -#include +# include namespace ov { namespace intel_cpu { class jit_emitter; struct jit_emitter_info_t { jit_emitter_info_t() = default; - jit_emitter_info_t(const jit_emitter_info_t &rhs) - : str_(rhs.str_), is_initialized_(rhs.is_initialized_) {} - jit_emitter_info_t &operator=(const jit_emitter_info_t &rhs) { + jit_emitter_info_t(const jit_emitter_info_t& rhs) : str_(rhs.str_), is_initialized_(rhs.is_initialized_) {} + jit_emitter_info_t& operator=(const jit_emitter_info_t& rhs) { is_initialized_ = rhs.is_initialized_; str_ = rhs.str_; return *this; } - const char *c_str() const { return str_.c_str(); } - bool is_initialized() const { return is_initialized_; } + const char* c_str() const { + return str_.c_str(); + } + bool is_initialized() const { + return is_initialized_; + } - void init(const jit_emitter *emitter); + void init(const jit_emitter* emitter); private: std::string str_; @@ -33,7 +36,7 @@ struct jit_emitter_info_t { std::string get_emitter_type_name(const jit_emitter* emitter); -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov #endif \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/emitters/utils.cpp b/src/plugins/intel_cpu/src/emitters/utils.cpp index b92277ae643218..43172e1b600843 100644 --- a/src/plugins/intel_cpu/src/emitters/utils.cpp +++ b/src/plugins/intel_cpu/src/emitters/utils.cpp @@ -7,28 +7,29 @@ namespace ov { namespace intel_cpu { -std::string jit_emitter_pretty_name(const std::string &pretty_func) { -#define SAFE_SYMBOL_FINDING(idx, find) \ - auto idx = (find); \ +std::string jit_emitter_pretty_name(const std::string& pretty_func) { +#define SAFE_SYMBOL_FINDING(idx, find) \ + auto idx = (find); \ if (idx == std::string::npos || idx == 0) \ return pretty_func; // Example: - // pretty_func := void ov::intel_cpu::jit_load_memory_emitter::emit_impl(const std::vector& in, const std::vector& out) const - // begin := -----------| - // end := ---------------------------------------------------| - // result := ov::intel_cpu::jit_load_memory_emitter + // pretty_func := void ov::intel_cpu::jit_load_memory_emitter::emit_impl(const std::vector& in, const + // std::vector& out) const begin := -----------| end := + // ---------------------------------------------------| result := ov::intel_cpu::jit_load_memory_emitter // Signatures: // GCC: void foo() [with T = {type}] // clang: void foo() [T = {type}] // MSVC: void __cdecl foo<{type}>(void) SAFE_SYMBOL_FINDING(parenthesis, pretty_func.find("(")) - if (pretty_func[parenthesis - 1] == '>') { // To cover template on MSVC + if (pretty_func[parenthesis - 1] == '>') { // To cover template on MSVC parenthesis--; size_t counter = 1; while (counter != 0 && parenthesis > 0) { parenthesis--; - if (pretty_func[parenthesis] == '>') counter++; - if (pretty_func[parenthesis] == '<') counter--; + if (pretty_func[parenthesis] == '>') + counter++; + if (pretty_func[parenthesis] == '<') + counter--; } } SAFE_SYMBOL_FINDING(end, pretty_func.substr(0, parenthesis).rfind("::")) @@ -38,5 +39,5 @@ std::string jit_emitter_pretty_name(const std::string &pretty_func) { return end > begin ? pretty_func.substr(begin, end - begin) : pretty_func; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/emitters/utils.hpp b/src/plugins/intel_cpu/src/emitters/utils.hpp index 4c3210579d7fd2..7c89b720159dde 100644 --- a/src/plugins/intel_cpu/src/emitters/utils.hpp +++ b/src/plugins/intel_cpu/src/emitters/utils.hpp @@ -5,21 +5,22 @@ #pragma once #include + #include "openvino/core/except.hpp" namespace ov { namespace intel_cpu { -std::string jit_emitter_pretty_name(const std::string &pretty_func); +std::string jit_emitter_pretty_name(const std::string& pretty_func); #ifdef __GNUC__ -#define OV_CPU_JIT_EMITTER_NAME jit_emitter_pretty_name(__PRETTY_FUNCTION__) +# define OV_CPU_JIT_EMITTER_NAME jit_emitter_pretty_name(__PRETTY_FUNCTION__) #else /* __GNUC__ */ -#define OV_CPU_JIT_EMITTER_NAME jit_emitter_pretty_name(__FUNCSIG__) +# define OV_CPU_JIT_EMITTER_NAME jit_emitter_pretty_name(__FUNCSIG__) #endif /* __GNUC__ */ -#define OV_CPU_JIT_EMITTER_THROW(...) OPENVINO_THROW(OV_CPU_JIT_EMITTER_NAME, ": ", __VA_ARGS__) +#define OV_CPU_JIT_EMITTER_THROW(...) OPENVINO_THROW(OV_CPU_JIT_EMITTER_NAME, ": ", __VA_ARGS__) #define OV_CPU_JIT_EMITTER_ASSERT(cond, ...) OPENVINO_ASSERT((cond), OV_CPU_JIT_EMITTER_NAME, ": ", __VA_ARGS__) -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/extension.cpp b/src/plugins/intel_cpu/src/extension.cpp index e6dbc04b0ca6a4..bdb5211009a22a 100644 --- a/src/plugins/intel_cpu/src/extension.cpp +++ b/src/plugins/intel_cpu/src/extension.cpp @@ -9,8 +9,8 @@ #include "ov_ops/augru_sequence.hpp" #include "ov_ops/fully_connected.hpp" #include "ov_ops/fully_connected_compressed.hpp" -#include "ov_ops/fully_connected_quantized_legacy.hpp" #include "ov_ops/fully_connected_quantized.hpp" +#include "ov_ops/fully_connected_quantized_legacy.hpp" #include "ov_ops/gather_compressed.hpp" #include "ov_ops/multiclass_nms_ie_internal.hpp" #include "ov_ops/nms_ie_internal.hpp" @@ -26,8 +26,8 @@ #include "transformations/cpu_opset/common/op/sdpa.hpp" #include "transformations/cpu_opset/common/op/swish_cpu.hpp" #include "transformations/cpu_opset/x64/op/interaction.hpp" -#include "transformations/cpu_opset/x64/op/mha.hpp" #include "transformations/cpu_opset/x64/op/llm_mlp.hpp" +#include "transformations/cpu_opset/x64/op/mha.hpp" #include "transformations/cpu_opset/x64/op/qkv_proj.hpp" #include "transformations/snippets/x64/op/brgemm_copy_b.hpp" #include "transformations/snippets/x64/op/brgemm_cpu.hpp" @@ -40,8 +40,7 @@ namespace { template class TypeRelaxedExtension : public ov::OpExtension> { public: - TypeRelaxedExtension() - : m_ext_type(Op::get_type_info_static().name, "type_relaxed_opset") {} + TypeRelaxedExtension() : m_ext_type(Op::get_type_info_static().name, "type_relaxed_opset") {} ~TypeRelaxedExtension() override = default; const ov::DiscreteTypeInfo& get_type_info() const override { @@ -159,31 +158,31 @@ class TypeRelaxedExtension : public ov::OpExtension> { # define SNIPPETS_DEBUG_CAPS_EXTENSIONS #endif -#define SNIPPETS_EXTENSIONS \ - OP_EXTENSION(ov::snippets::op::Brgemm) \ - OP_EXTENSION(ov::snippets::op::BroadcastLoad) \ - OP_EXTENSION(ov::snippets::op::BroadcastMove) \ - OP_EXTENSION(ov::snippets::op::ConvertSaturation) \ - OP_EXTENSION(ov::snippets::op::ConvertTruncation) \ - OP_EXTENSION(ov::snippets::op::Fill) \ - OP_EXTENSION(ov::snippets::op::HorizonMax) \ - OP_EXTENSION(ov::snippets::op::HorizonSum) \ - OP_EXTENSION(ov::snippets::op::KernelStatic) \ - OP_EXTENSION(ov::snippets::op::KernelDynamic) \ - OP_EXTENSION(ov::snippets::op::Load) \ - OP_EXTENSION(ov::snippets::op::LoadReshape) \ - OP_EXTENSION(ov::snippets::op::LoopBegin) \ - OP_EXTENSION(ov::snippets::op::LoopEnd) \ - OP_EXTENSION(ov::snippets::op::Buffer) \ - OP_EXTENSION(ov::snippets::op::Nop) \ - OP_EXTENSION(ov::snippets::op::PowerStatic) \ - OP_EXTENSION(ov::snippets::op::Scalar) \ - OP_EXTENSION(ov::snippets::op::Store) \ - OP_EXTENSION(ov::snippets::op::Subgraph) \ - OP_EXTENSION(ov::snippets::op::VectorBuffer) \ - OP_EXTENSION(ov::snippets::op::RankNormalization) \ - OP_EXTENSION(ov::snippets::op::ReduceMax) \ - OP_EXTENSION(ov::snippets::op::ReduceSum) \ +#define SNIPPETS_EXTENSIONS \ + OP_EXTENSION(ov::snippets::op::Brgemm) \ + OP_EXTENSION(ov::snippets::op::BroadcastLoad) \ + OP_EXTENSION(ov::snippets::op::BroadcastMove) \ + OP_EXTENSION(ov::snippets::op::ConvertSaturation) \ + OP_EXTENSION(ov::snippets::op::ConvertTruncation) \ + OP_EXTENSION(ov::snippets::op::Fill) \ + OP_EXTENSION(ov::snippets::op::HorizonMax) \ + OP_EXTENSION(ov::snippets::op::HorizonSum) \ + OP_EXTENSION(ov::snippets::op::KernelStatic) \ + OP_EXTENSION(ov::snippets::op::KernelDynamic) \ + OP_EXTENSION(ov::snippets::op::Load) \ + OP_EXTENSION(ov::snippets::op::LoadReshape) \ + OP_EXTENSION(ov::snippets::op::LoopBegin) \ + OP_EXTENSION(ov::snippets::op::LoopEnd) \ + OP_EXTENSION(ov::snippets::op::Buffer) \ + OP_EXTENSION(ov::snippets::op::Nop) \ + OP_EXTENSION(ov::snippets::op::PowerStatic) \ + OP_EXTENSION(ov::snippets::op::Scalar) \ + OP_EXTENSION(ov::snippets::op::Store) \ + OP_EXTENSION(ov::snippets::op::Subgraph) \ + OP_EXTENSION(ov::snippets::op::VectorBuffer) \ + OP_EXTENSION(ov::snippets::op::RankNormalization) \ + OP_EXTENSION(ov::snippets::op::ReduceMax) \ + OP_EXTENSION(ov::snippets::op::ReduceSum) \ OP_EXTENSION(ov::snippets::op::Reshape) OPENVINO_CREATE_EXTENSIONS(std::vector( diff --git a/src/plugins/intel_cpu/src/graph.cpp b/src/plugins/intel_cpu/src/graph.cpp index 6aa4644f902bc9..7fb5f512227cf9 100644 --- a/src/plugins/intel_cpu/src/graph.cpp +++ b/src/plugins/intel_cpu/src/graph.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -16,6 +17,7 @@ #include #include +#include "common/primitive_desc_iface.hpp" #include "edge.h" #include "graph_dumper.h" #include "graph_optimizer.h" @@ -28,25 +30,21 @@ #include "nodes/common/cpu_memcpy.h" #include "nodes/convert.h" #include "nodes/input.h" -#include "nodes/reorder.h" #include "nodes/memory.hpp" +#include "nodes/reorder.h" #include "openvino/core/except.hpp" #include "openvino/core/model.hpp" #include "openvino/core/node.hpp" +#include "openvino/core/parallel.hpp" #include "openvino/core/type/element_type.hpp" +#include "openvino/runtime/exception.hpp" +#include "openvino/runtime/threading/cpu_streams_executor.hpp" #include "utils/debug_capabilities.h" #include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" #include "utils/node_dumper.h" -#include "utils/verbose.h" #include "utils/precision_support.h" - -#include -#include "common/primitive_desc_iface.hpp" - -#include "openvino/runtime/exception.hpp" -#include "openvino/runtime/threading/cpu_streams_executor.hpp" -#include "openvino/core/parallel.hpp" +#include "utils/verbose.h" #if (OV_THREAD == OV_THREAD_TBB || OV_THREAD == OV_THREAD_TBB_AUTO) # include @@ -61,8 +59,8 @@ Graph::~Graph() { CPU_DEBUG_CAP_ENABLE(average_counters(*this)); } -template -void Graph::CreateGraph(NET &model, const GraphContext::CPtr context) { +template +void Graph::CreateGraph(NET& model, const GraphContext::CPtr context) { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "CreateGraph"); Init(model, context); @@ -104,7 +102,7 @@ void Graph::CreateGraph(const std::vector& graphNodes, template void Graph::CreateGraph(const std::shared_ptr&, const GraphContext::CPtr); -void Graph::Replicate(const std::shared_ptr &model, +void Graph::Replicate(const std::shared_ptr& model, const std::vector& inputConfigs, const std::vector& outputConfigs) { OV_ITT_SCOPE_CHAIN(FIRST_INFERENCE, taskChain, itt::domains::intel_cpu_LT, "Graph::Replicate", "ov::Model"); @@ -135,7 +133,9 @@ void Graph::Replicate(const std::shared_ptr &model, if (op->get_type_info() == op::v0::Parameter::get_type_info_static()) { auto input_index = model->get_parameter_index(std::dynamic_pointer_cast(op)); OPENVINO_ASSERT(input_index >= 0, - "CPU plugin cannot find op: ", op->get_friendly_name(), " in model parameter list!"); + "CPU plugin cannot find op: ", + op->get_friendly_name(), + " in model parameter list!"); const auto& config = static_cast(input_index) < inputConfigs.size() ? inputConfigs[input_index] : node::Input::InputConfig{}; @@ -152,7 +152,9 @@ void Graph::Replicate(const std::shared_ptr &model, if (op->get_type_info() == op::v0::Result::get_type_info_static()) { auto output_index = model->get_result_index(std::dynamic_pointer_cast(op)); OPENVINO_ASSERT(output_index >= 0, - "CPU plugin cannot find op: ", op->get_friendly_name(), " in model result list!"); + "CPU plugin cannot find op: ", + op->get_friendly_name(), + " in model result list!"); const auto& config = static_cast(output_index) < outputConfigs.size() ? outputConfigs[output_index] : node::Input::OutputConfig{}; @@ -179,9 +181,9 @@ void Graph::Replicate(const std::shared_ptr &model, } if (!one_of(op->get_type_info(), - op::v0::Result::get_type_info_static(), - op::v3::Assign::get_type_info_static(), - op::v6::Assign::get_type_info_static())) { + op::v0::Result::get_type_info_static(), + op::v3::Assign::get_type_info_static(), + op::v6::Assign::get_type_info_static())) { for (size_t oi = 0; oi < op->get_output_size(); oi++) { if (op->get_output_target_inputs(oi).empty()) { unusedOutputs.push_back(op->output(oi)); @@ -194,10 +196,13 @@ void Graph::Replicate(const std::shared_ptr &model, for (auto unusedOutput : unusedOutputs) { auto parentNode = op2node[unusedOutput.get_node_shared_ptr()]; const auto port = unusedOutput.get_index(); - const auto nodeName = std::string("stub_") + std::to_string(unusedOutput.get_index()) + "_" + parentNode->getName(); + const auto nodeName = + std::string("stub_") + std::to_string(unusedOutput.get_index()) + "_" + parentNode->getName(); const NodePtr outNode = std::make_shared(parentNode->outputShapes[port], parentNode->getOriginalOutputPrecisionAtPort(port), - nodeName, "Result", m_context); + nodeName, + "Result", + m_context); CreateEdge(parentNode, outNode, port, 0); AddNode(outNode); } @@ -216,7 +221,7 @@ void Graph::Replicate(const std::shared_ptr &model, EnforceInferencePrecision(); // update input precisions of consumers to avoid extra reorders - for (auto &input : inputNodesMap) { + for (auto& input : inputNodesMap) { const auto& inputNode = input.second; const auto precToSet = inputNode->getOriginalOutputPrecisionAtPort(0); const auto childEdges = inputNode->getChildEdgesAtPort(0); @@ -233,7 +238,7 @@ void Graph::Replicate(const std::shared_ptr &model, // update output precisions of producers to avoid extra reorders // do this only in case output configration is not provided explicitly if (outputConfigs.empty()) { - for (auto &output : outputNodesMap) { + for (auto& output : outputNodesMap) { const auto& outputNode = output.second; const auto precToSet = outputNode->getOriginalInputPrecisionAtPort(0); const auto parentEdge = outputNode->getParentEdgeAt(0); @@ -254,11 +259,12 @@ static std::vector IdentifySyncPoints(const std::vector& graphN continue; if (node->outputShapeDataDependency() || - // WA: for convolution plus sum(broadcast). Due to the fact that a convolution with sum use the same memory for second sum term and the output - // tensors (inPlace) resizing the output tensor, may lead to reallocation of this second term memory and possible data lost. The reallocation - // may happen when the second term shape is broadcasted to the output tensor shape. To avoid the data loss, we have a special processing for - // such cases inside the convolution node, but it works properly only when dynamic shapes inference, preparation and execution a called - // for this node sequentially. + // WA: for convolution plus sum(broadcast). Due to the fact that a convolution with sum use the same memory + // for second sum term and the output tensors (inPlace) resizing the output tensor, may lead to reallocation + // of this second term memory and possible data lost. The reallocation may happen when the second term shape + // is broadcasted to the output tensor shape. To avoid the data loss, we have a special processing for such + // cases inside the convolution node, but it works properly only when dynamic shapes inference, preparation + // and execution a called for this node sequentially. (node->getType() == Type::Convolution && node->isInPlace()) || // Due to the special handling of the internal states and initialization subgraphs, MemoryInput nodes must // be processed as a internal dynamism node, allowing to hide the aforementioned complexity inside the @@ -271,15 +277,17 @@ static std::vector IdentifySyncPoints(const std::vector& graphN return syncNodesInds; } -static std::tuple, std::vector> ExtractExecutableNodesAndSyncPoints(const std::vector& syncNodesInds, - const std::vector& graphNodes) { +static std::tuple, std::vector> ExtractExecutableNodesAndSyncPoints( + const std::vector& syncNodesInds, + const std::vector& graphNodes) { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "Graph::ExtractExecutableNodesAndSyncPoints"); std::unordered_map graphIdToExecutableId; std::vector executableGraphNodes; for (size_t i = 0; i < graphNodes.size(); i++) { const auto& graphNode = graphNodes[i]; - if ((!graphNode->isConstant() && graphNode->isExecutable()) || // non-constant executable or - (graphNode->isDynamicNode() && !one_of(graphNode->getType(), Type::Input, Type::Output))) { // dynamic, except inputs / outputs + if ((!graphNode->isConstant() && graphNode->isExecutable()) || // non-constant executable or + (graphNode->isDynamicNode() && + !one_of(graphNode->getType(), Type::Input, Type::Output))) { // dynamic, except inputs / outputs graphIdToExecutableId[i] = executableGraphNodes.size(); executableGraphNodes.emplace_back(graphNode); } @@ -291,17 +299,17 @@ static std::tuple, std::vector> ExtractExecutableNo auto it = graphIdToExecutableId.find(syncNodesInd); if (it != graphIdToExecutableId.end()) { uniqueExecutableSyncNodesInds.insert(it->second); - // since sometimes we need to run the synchronization node alone (for example in the case of internal dynamism) - // let's add another sync index after the sync point node + // since sometimes we need to run the synchronization node alone (for example in the case of internal + // dynamism) let's add another sync index after the sync point node uniqueExecutableSyncNodesInds.insert(it->second + 1); } } uniqueExecutableSyncNodesInds.insert(executableGraphNodes.size()); // convert to a vector to reduce runtime overhead - std::vector executableSyncNodesInds(uniqueExecutableSyncNodesInds.begin(), uniqueExecutableSyncNodesInds.end()); + std::vector executableSyncNodesInds(uniqueExecutableSyncNodesInds.begin(), + uniqueExecutableSyncNodesInds.end()); - return std::make_tuple(std::move(executableGraphNodes), - std::move(executableSyncNodesInds)); + return std::make_tuple(std::move(executableGraphNodes), std::move(executableSyncNodesInds)); } void Graph::Init(const std::shared_ptr& model, @@ -346,7 +354,7 @@ static void UseExternalOutputMemory(const std::map& output } void Graph::Activate(const std::vector& externalInputMemory, - const std::vector& externalOutputMemory) { + const std::vector& externalOutputMemory) { OPENVINO_ASSERT(status == Status::Initialized, "Invalid graph status"); const bool hasDynNodes = ProcessDynNodes(); @@ -360,12 +368,13 @@ void Graph::Activate(const std::vector& externalInputMemory, CreatePrimitivesAndExecConstants(); #ifndef CPU_DEBUG_CAPS - for (auto &graphNode : graphNodes) { + for (auto& graphNode : graphNodes) { graphNode->cleanup(); } #endif - std::tie(m_executableGraphNodes, m_executableSyncNodesInds) = ExtractExecutableNodesAndSyncPoints(syncNodesInds, graphNodes); + std::tie(m_executableGraphNodes, m_executableSyncNodesInds) = + ExtractExecutableNodesAndSyncPoints(syncNodesInds, graphNodes); if (hasDynNodes) { status = Status::ReadyDynamic; @@ -424,7 +433,7 @@ void Graph::Configure(bool optimize) { void Graph::InitNodes() { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "Graph::InitNodes"); - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { node->init(); } } @@ -432,7 +441,7 @@ void Graph::InitNodes() { void Graph::InitDescriptors() { OV_ITT_SCOPE_CHAIN(FIRST_INFERENCE, taskChain, itt::domains::intel_cpu_LT, "InitDescriptors", "Prepare"); - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { OV_ITT_SCOPE_NEXT(FIRST_INFERENCE, taskChain, node->profiling.getSupportedDescriptors); DEBUG_LOG("Get supported primitive descriptors for node: ", node->getName()); node->getSupportedDescriptors(); @@ -445,15 +454,15 @@ void Graph::InitDescriptors() { const auto& SPDs = node->getSupportedPrimitiveDescriptors(); for (size_t i = 0; i < SPDs.size(); i++) { DEBUG_LOG("#", - node->getExecIndex(), - " ", - node->getName(), - " Before filter, SupportedPrimitiveDescriptors [", - i, - "/", - SPDs.size(), - "]: \n", - SPDs[i]); + node->getExecIndex(), + " ", + node->getName(), + " Before filter, SupportedPrimitiveDescriptors [", + i, + "/", + SPDs.size(), + "]: \n", + SPDs[i]); } } #endif @@ -478,7 +487,7 @@ void Graph::InitDescriptors() { #endif } - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { OV_ITT_SCOPE_NEXT(FIRST_INFERENCE, taskChain, node->profiling.selectOptimalPrimitiveDescriptor); DEBUG_LOG("Select optimal primitive descriptors for node: ", node->getName()); node->selectOptimalPrimitiveDescriptor(); @@ -495,12 +504,18 @@ void Graph::ResolveInplaceDirections() { void Graph::InitOptimalPrimitiveDescriptors() { OV_ITT_SCOPED_TASK(itt::domains::intel_cpu, "Graph::InitOptimalPrimitiveDescriptors"); - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, node->profiling.initOptimalPrimitiveDescriptor); DEBUG_LOG("Init optimal primitive descriptors for node: ", node->getName()); node->initOptimalPrimitiveDescriptor(); - DEBUG_LOG("#", node->getExecIndex(), " ", node->getName(), "\n", - *node->getSelectedPrimitiveDescriptor(), "selectedPrimitiveDescriptorIdx = ", node->selectedPrimitiveDescriptorIndex); + DEBUG_LOG("#", + node->getExecIndex(), + " ", + node->getName(), + "\n", + *node->getSelectedPrimitiveDescriptor(), + "selectedPrimitiveDescriptorIdx = ", + node->selectedPrimitiveDescriptorIndex); } } @@ -508,7 +523,7 @@ void Graph::CreatePrimitivesAndExecConstants() const { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "Graph::CreatePrimitivesAndExecConstants"); using shared_memory_ptr = WeightsSharing::SharedMemory::Ptr; - auto acquireSharedOutputs = [this](const NodePtr & node) { + auto acquireSharedOutputs = [this](const NodePtr& node) { std::vector outputs; bool hasLocalAllocatedEdges = false; bool hasExternalInvalidEdges = false; @@ -530,7 +545,7 @@ void Graph::CreatePrimitivesAndExecConstants() const { return std::make_tuple(hasExternalInvalidEdges, hasLocalAllocatedEdges, outputs); }; - for (const auto &node : graphNodes) { + for (const auto& node : graphNodes) { { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, node->profiling.createPrimitive); DEBUG_LOG(*node); @@ -547,7 +562,7 @@ void Graph::CreatePrimitivesAndExecConstants() const { if (std::get<0>(sharedOutputs) || std::get<1>(sharedOutputs)) { ExecuteNodeWithCatch(node); - for (auto & output : std::get<2>(sharedOutputs)) + for (auto& output : std::get<2>(sharedOutputs)) output->valid(true); } } else { @@ -556,7 +571,9 @@ void Graph::CreatePrimitivesAndExecConstants() const { } } -static bool isReorderAvailable(const MemoryDescPtr& parentDesc, const MemoryDescPtr& childDesc, const dnnl::engine& eng) { +static bool isReorderAvailable(const MemoryDescPtr& parentDesc, + const MemoryDescPtr& childDesc, + const dnnl::engine& eng) { auto definedParentDesc = parentDesc->isDefined() ? parentDesc : MemoryDescUtils::makeDummyDesc(*parentDesc); memory::desc srcMemDesc = MemoryDescUtils::convertToDnnlMemoryDesc(definedParentDesc)->getDnnlDesc(); @@ -566,14 +583,16 @@ static bool isReorderAvailable(const MemoryDescPtr& parentDesc, const MemoryDesc dnnl::primitive_attr attr; dnnl_primitive_desc_t result = nullptr; - auto status = dnnl_reorder_primitive_desc_create(&result, srcMemDesc.get(), eng.get(), dstMemDesc.get(), eng.get(), + auto status = dnnl_reorder_primitive_desc_create(&result, + srcMemDesc.get(), + eng.get(), + dstMemDesc.get(), + eng.get(), attr.get()); #if defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64) // temporary WA for slow FP32->FP16 conversion reorder in oneDNN on ARM // pretend the reorder is not available to use Convert node instead - if (hasHardwareSupport(ov::element::f16) && - result && - parse_impl_name(result->impl()->name()) == ref_any) { + if (hasHardwareSupport(ov::element::f16) && result && parse_impl_name(result->impl()->name()) == ref_any) { dnnl_primitive_desc_destroy(result); return false; } @@ -587,8 +606,8 @@ static bool isReorderAvailable(const MemoryDescPtr& parentDesc, const MemoryDesc void Graph::insertReorder(EdgePtr& edge, bool isOptimized, std::unordered_set& uniqueLayerNames) { std::string basicLayerName = edge->getParent()->getName() + "_" + - node::Reorder::getReorderArgs(edge->getInputDesc(), edge->getOutputDesc()) + "_" + - edge->getChild()->getName(); + node::Reorder::getReorderArgs(edge->getInputDesc(), edge->getOutputDesc()) + "_" + + edge->getChild()->getName(); std::string layerName = basicLayerName; int idx = 0; while (uniqueLayerNames.find(layerName) != uniqueLayerNames.end()) { @@ -605,11 +624,14 @@ void Graph::insertConvert(EdgePtr& edge) { const auto& inDesc = edge->getInputDesc(); const auto& outDesc = edge->getOutputDesc(); - std::string convertName = edge->getParent()->getName() + "_" + - inDesc.getPrecision().get_type_name() + "_" + outDesc.getPrecision().get_type_name(); + std::string convertName = edge->getParent()->getName() + "_" + inDesc.getPrecision().get_type_name() + "_" + + outDesc.getPrecision().get_type_name(); - auto convertNode = std::make_shared(inDesc.getShape(), inDesc.getPrecision(), outDesc.getPrecision(), - convertName, m_context); + auto convertNode = std::make_shared(inDesc.getShape(), + inDesc.getPrecision(), + outDesc.getPrecision(), + convertName, + m_context); convertNode->setDescs(inDesc, outDesc); InsertNode(edge, convertNode, true); } @@ -720,9 +742,9 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { // Resolve special cases: for (size_t i = 0; i < remaining_edge_clusters_count;) { - auto &cluster = edge_clusters[i]; + auto& cluster = edge_clusters[i]; bool erase = false; - for (auto &edge : cluster) { + for (auto& edge : cluster) { // Remove already allocated edges from the mem reuse algo if (edge->getStatus() == Edge::Status::Allocated) { erase = true; @@ -730,18 +752,23 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { } // Special allocation for string tensors - if (edge->getDesc().getPrecision() == element::string && edge->getStatus() == Edge::Status::NeedAllocation) { + if (edge->getDesc().getPrecision() == element::string && + edge->getStatus() == Edge::Status::NeedAllocation) { StringMemory::StringMemoryBlockPtr memBlcok; if (edge->getParent()->isConstant()) { if (edge->getParent()->getType() == Type::Input) { - auto constNode = static_cast(edge->getParent().get()); + auto constNode = static_cast(edge->getParent().get()); edge->reuse(std::const_pointer_cast(constNode->getMemoryPtr())); } else { edge->externalAllocate(m_context->getWeightsCache()); } - auto stringMemory = dynamic_cast(edge->getMemoryPtr().get()); - OPENVINO_ASSERT(stringMemory, "[CPU] Edge between nodes '", - edge->getParent()->getName(), "' and '", edge->getChild()->getName(), "' must have StringMemory."); + auto stringMemory = dynamic_cast(edge->getMemoryPtr().get()); + OPENVINO_ASSERT(stringMemory, + "[CPU] Edge between nodes '", + edge->getParent()->getName(), + "' and '", + edge->getChild()->getName(), + "' must have StringMemory."); memBlcok = stringMemory->getStringMemoryBlockPtr(); } else { auto memory = std::make_shared(getEngine(), edge->getDesc()); @@ -752,13 +779,18 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { if (edge_c == edge) { continue; } - OPENVINO_ASSERT(edge_c->getDesc().getPrecision() == element::string, "All edges in the cluster must be string."); + OPENVINO_ASSERT(edge_c->getDesc().getPrecision() == element::string, + "All edges in the cluster must be string."); if (edge_c->getStatus() == Edge::Status::NotAllocated) { auto memory = std::make_shared(getEngine(), edge_c->getDesc(), memBlcok); edge_c->reuse(memory); } else { - OPENVINO_THROW("[CPU] String tensors allocation in the cluster. Edge between nodes '", edge_c->getParent()->getName(), "' and '", - edge_c->getChild()->getName(), "' has an unexpected status: ", static_cast(edge_c->getStatus())); + OPENVINO_THROW("[CPU] String tensors allocation in the cluster. Edge between nodes '", + edge_c->getParent()->getName(), + "' and '", + edge_c->getChild()->getName(), + "' has an unexpected status: ", + static_cast(edge_c->getStatus())); } } erase = true; @@ -800,14 +832,15 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { int64_t boxSize = 0; bool isConst = false, isOutput = false, isInput = false; - for (auto &edge : edge_clusters[i]) { + for (auto& edge : edge_clusters[i]) { int e_start = edge->getParent()->getExecIndex(); int e_finish = edge->getChild()->getExecIndex(); auto&& desc = edge->getDesc(); if (boxSize != -1 && desc.isDefined()) { - int64_t e_size = desc.getCurrentMemSize(); // size in bytes (from the beginning of data to the last element) + int64_t e_size = + desc.getCurrentMemSize(); // size in bytes (from the beginning of data to the last element) boxSize = std::max(e_size, boxSize); } else { boxSize = -1; @@ -824,9 +857,9 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { } reg.alloc_type = allocType; - isConst |= isConstOutput(edge); + isConst |= isConstOutput(edge); isOutput |= edge->getChild()->getType() == Type::Output; - isInput |= edge->getParent()->getType() == Type::Input; + isInput |= edge->getParent()->getType() == Type::Input; } reg.size = boxSize; @@ -878,7 +911,7 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { memoryRegions.erase(it, memoryRegions.end()); - //Set up the memory control subsystem. + // Set up the memory control subsystem. this->m_pMemoryControl = &(getGraphContext()->getNetworkMemoryControl()->createMemoryControlUnit(syncNodesInds)); auto memoryBlocks = m_pMemoryControl->insert(memoryRegions); @@ -911,9 +944,8 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { } std::vector edges_to_process; edges_to_process.push_back(edge); - for (auto next_edge = edge->getSharedEdge(std::nothrow); - next_edge; - next_edge = next_edge->getSharedEdge(std::nothrow)) { + for (auto next_edge = edge->getSharedEdge(std::nothrow); next_edge; + next_edge = next_edge->getSharedEdge(std::nothrow)) { edges_to_process.push_back(next_edge); } std::for_each(edges_to_process.rbegin(), edges_to_process.rend(), [](const EdgePtr& edge) { @@ -937,16 +969,15 @@ void Graph::AllocateWithReuse(const std::vector& syncNodesInds) { void Graph::Allocate(const std::vector& syncNodesInds) { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "Graph::Allocate"); - //resolve inplace dead end nodes + // resolve inplace dead end nodes for (const auto& edge : graphEdges) { if (edge->getStatus() == Edge::Status::Uninitialized) { if (edge->getParent()->getParentEdges().empty() && - one_of(edge->getParent()->getType(), Type::Input, Type::MemoryInput) && - edge->inPlace(Edge::LOOK_UP)) { + one_of(edge->getParent()->getType(), Type::Input, Type::MemoryInput) && edge->inPlace(Edge::LOOK_UP)) { edge->getParent()->resolveInPlaceEdges(Edge::LOOK_UP); } else if (edge->getChild()->getChildEdges().empty() && - one_of(edge->getChild()->getType(), Type::Output, Type::MemoryOutput) && - edge->inPlace(Edge::LOOK_DOWN)) { + one_of(edge->getChild()->getType(), Type::Output, Type::MemoryOutput) && + edge->inPlace(Edge::LOOK_DOWN)) { edge->getChild()->resolveInPlaceEdges(Edge::LOOK_DOWN); } } @@ -955,13 +986,15 @@ void Graph::Allocate(const std::vector& syncNodesInds) { // resolve edges. Define which will be a view on others // NeedAllocation - real blob // NotAllocated - view on other blob, peer or in-place - for (auto& edge : graphEdges) edge->init(); + for (auto& edge : graphEdges) + edge->init(); // Allocate memory space for all edges marked with NeedAllocation AllocateWithReuse(syncNodesInds); // Check all getters. Should work. - for (auto& edge : graphEdges) edge->validate(); + for (auto& edge : graphEdges) + edge->validate(); } bool Graph::ProcessDynNodes() { @@ -975,7 +1008,8 @@ bool Graph::ProcessDynNodes() { } void Graph::PushInputData(const std::size_t& index, const ov::SoPtr& input) { - if (!IsReady()) OPENVINO_THROW("Wrong state. Topology not ready."); + if (!IsReady()) + OPENVINO_THROW("Wrong state. Topology not ready."); auto input_itr = inputNodesMap.find(index); if (input_itr != inputNodesMap.end()) { auto node = input_itr->second; @@ -1010,7 +1044,7 @@ void Graph::PullOutputData(std::unordered_map>& if (!IsReady()) OPENVINO_THROW("Wrong state. Topology not ready."); - for (auto &outputMap : outputNodesMap) { + for (auto& outputMap : outputNodesMap) { auto output_index = outputMap.first; auto node = outputMap.second; auto parentEdge = node->getParentEdgeAt(0); @@ -1040,17 +1074,32 @@ void Graph::PullOutputData(std::unordered_map>& if (ext_blob->get_shape() != outDims && !isScalarOutput) { // WA: because input/output info initially contains non empty dims, order etc. // and setDims (called inside setShape) can't correct modify blocked desc for desc with blocked layout - DEBUG_LOG(output_index, ", tensor data addr ", static_cast(output[output_index]->data()), - " dims ", PartialShape(output[output_index]->get_shape()), " -> ", PartialShape(outDims), - ", intr ptr ", intr_blob.getData(), " , parentedge's memory object ", parentEdge->getMemoryPtr().get()); + DEBUG_LOG(output_index, + ", tensor data addr ", + static_cast(output[output_index]->data()), + " dims ", + PartialShape(output[output_index]->get_shape()), + " -> ", + PartialShape(outDims), + ", intr ptr ", + intr_blob.getData(), + " , parentedge's memory object ", + parentEdge->getMemoryPtr().get()); ext_blob->set_shape(outDims); - DEBUG_LOG(output_index, ", tensor data addr ", static_cast(output[output_index]->data()), - " dims ", PartialShape(output[output_index]->get_shape()), ", intr ptr ", intr_blob.getData()); + DEBUG_LOG(output_index, + ", tensor data addr ", + static_cast(output[output_index]->data()), + " dims ", + PartialShape(output[output_index]->get_shape()), + ", intr ptr ", + intr_blob.getData()); expected_desc_ptr = MemoryDescUtils::generateCpuBlockedMemoryDesc(ext_blob); } // check for empty output blob - if (std::any_of(outDims.begin(), outDims.end(), [](const Dim dim) {return dim == 0;})) { + if (std::any_of(outDims.begin(), outDims.end(), [](const Dim dim) { + return dim == 0; + })) { continue; } @@ -1063,12 +1112,22 @@ void Graph::PullOutputData(std::unordered_map>& intr_blob.getSize(), ")."); - void *ext_blob_ptr = ext_blob->data(); - void *intr_blob_ptr = intr_blob.getData(); - DEBUG_LOG(output_index, " @ ", intr_blob_ptr, " -> ", ext_blob_ptr, " zero-copy: ", intr_blob_ptr == ext_blob_ptr, " graph ", this, "\r\n"); + void* ext_blob_ptr = ext_blob->data(); + void* intr_blob_ptr = intr_blob.getData(); + DEBUG_LOG(output_index, + " @ ", + intr_blob_ptr, + " -> ", + ext_blob_ptr, + " zero-copy: ", + intr_blob_ptr == ext_blob_ptr, + " graph ", + this, + "\r\n"); // That is the same memory. No need to copy - if (ext_blob_ptr == intr_blob_ptr) continue; + if (ext_blob_ptr == intr_blob_ptr) + continue; if (actualDesc->getPrecision() == element::string) { StringMemory outBloMem(getEngine(), expected_desc_ptr, ext_blob_ptr); @@ -1077,7 +1136,10 @@ void Graph::PullOutputData(std::unordered_map>& Memory outBloMem(getEngine(), expected_desc_ptr, ext_blob_ptr, false); outBloMem.load(intr_blob, false); } else { - OPENVINO_ASSERT(srcPrec == dstPrec, "The precision of the CPU output tensor index", output_index, " is different from the external one"); + OPENVINO_ASSERT(srcPrec == dstPrec, + "The precision of the CPU output tensor index", + output_index, + " is different from the external one"); size_t size_to_copy = intr_blob.getSize(); cpu_parallel_memcpy(ext_blob_ptr, intr_blob_ptr, size_to_copy); } @@ -1108,7 +1170,8 @@ namespace { class UpdateNodesSeq { public: - explicit UpdateNodesSeq(std::vector& executableGraphNodes) : m_executableGraphNodes(executableGraphNodes) {} + explicit UpdateNodesSeq(std::vector& executableGraphNodes) + : m_executableGraphNodes(executableGraphNodes) {} void operator()(size_t stopIndx) { for (; prepareCounter < stopIndx; ++prepareCounter) { @@ -1126,7 +1189,7 @@ class UpdateNodesSeq { }; #if (OV_THREAD == OV_THREAD_SEQ) - using UpdateNodes = UpdateNodesSeq; +using UpdateNodes = UpdateNodesSeq; #endif #if (OV_THREAD == OV_THREAD_TBB || OV_THREAD == OV_THREAD_TBB_AUTO || OV_THREAD == OV_THREAD_OMP) @@ -1143,7 +1206,8 @@ class UpdateNodesSeq { class UpdateNodesBase { public: - explicit UpdateNodesBase(std::vector& executableGraphNodes) : m_executableGraphNodes(executableGraphNodes) {} + explicit UpdateNodesBase(std::vector& executableGraphNodes) + : m_executableGraphNodes(executableGraphNodes) {} void updateShapes(size_t node_indx, size_t stop_indx) { try { for (size_t i = node_indx; i < stop_indx; i++) { @@ -1153,8 +1217,7 @@ class UpdateNodesBase { } m_prepareCounter.store(i, ov_memory_order_release); } - } - catch(...) { + } catch (...) { m_completion.store(true, ov_memory_order_relaxed); throw; } @@ -1185,13 +1248,16 @@ class UpdateNodesBase { std::vector& m_executableGraphNodes; }; -#if (OV_THREAD == OV_THREAD_TBB || OV_THREAD == OV_THREAD_TBB_AUTO) -#if (TBB_VERSION_MAJOR > 2020) +# if (OV_THREAD == OV_THREAD_TBB || OV_THREAD == OV_THREAD_TBB_AUTO) +# if (TBB_VERSION_MAJOR > 2020) template class AsyncTask : public tbb::detail::d1::task { public: - AsyncTask(Body& body, tbb::detail::d1::wait_context& wait, size_t node_indx, size_t stop_indx) : - m_body(body), m_wait(wait), m_node_indx(node_indx), m_stop_indx(stop_indx) {} + AsyncTask(Body& body, tbb::detail::d1::wait_context& wait, size_t node_indx, size_t stop_indx) + : m_body(body), + m_wait(wait), + m_node_indx(node_indx), + m_stop_indx(stop_indx) {} task* execute(tbb::detail::d1::execution_data&) override { m_body(m_node_indx, m_stop_indx); m_wait.release(); @@ -1235,11 +1301,14 @@ class UpdateNodes : public UpdateNodesBase { private: tbb::task_group_context ctx; }; -#else +# else template class AsyncTask : public tbb::task { public: - AsyncTask(Body& body, size_t node_indx, size_t stop_indx) : m_body(body), m_node_indx(node_indx), m_stop_indx(stop_indx) {} + AsyncTask(Body& body, size_t node_indx, size_t stop_indx) + : m_body(body), + m_node_indx(node_indx), + m_stop_indx(stop_indx) {} task* execute() override { m_body(m_node_indx, m_stop_indx); return nullptr; @@ -1257,28 +1326,30 @@ class UpdateNodes : public UpdateNodesBase { void operator()(size_t stopIndx) { m_completion.store(false); auto startCounter = m_prepareCounter.load(); - tbb::task& root = *new(tbb::task::allocate_root()) tbb::empty_task; - root.set_ref_count(3); // two for children and one preserved + tbb::task& root = *new (tbb::task::allocate_root()) tbb::empty_task; + root.set_ref_count(3); // two for children and one preserved auto task1 = [this](size_t start, size_t stop) { this->updateShapes(start, stop); }; - AsyncTask& a = *new (root.allocate_child()) AsyncTask(task1, startCounter, stopIndx); + AsyncTask& a = + *new (root.allocate_child()) AsyncTask(task1, startCounter, stopIndx); auto task2 = [this](size_t start, size_t stop) { this->updateDynParams(start, stop); }; - AsyncTask& b = *new (root.allocate_child()) AsyncTask(task2, startCounter, stopIndx); + AsyncTask& b = + *new (root.allocate_child()) AsyncTask(task2, startCounter, stopIndx); - b.set_affinity(2); // slot 1 plus 1 + b.set_affinity(2); // slot 1 plus 1 tbb::task::spawn(b); root.spawn_and_wait_for_all(a); } }; -#endif -#endif +# endif +# endif -#if (OV_THREAD == OV_THREAD_OMP) +# if (OV_THREAD == OV_THREAD_OMP) class UpdateNodes : public UpdateNodesBase { public: using UpdateNodesBase::UpdateNodesBase; @@ -1293,14 +1364,15 @@ class UpdateNodes : public UpdateNodesBase { if (origin_nested_levels < 2) { set_max_nested_levels(2); } - // In OpenMP, an exception that is thrown in a parallel region must be caught and handled in the same region by the same thread. - // Therefore, need to pass the error message and throw a new exception outside the parallel region. + // In OpenMP, an exception that is thrown in a parallel region must be caught and handled in the same region by + // the same thread. Therefore, need to pass the error message and throw a new exception outside the parallel + // region. const char* what = nullptr; - #pragma omp parallel - #pragma omp sections +# pragma omp parallel +# pragma omp sections { - #pragma omp section +# pragma omp section { try { updateDynParams(startCounter, stopIndx); @@ -1310,7 +1382,7 @@ class UpdateNodes : public UpdateNodesBase { what = "[ CPU ] Could not update dynamic parameters."; } } - #pragma omp section +# pragma omp section { try { updateShapes(startCounter, stopIndx); @@ -1329,18 +1401,18 @@ class UpdateNodes : public UpdateNodesBase { OPENVINO_ASSERT(what == nullptr, what); } }; -#endif +# endif #endif -} // namespace +} // namespace /* group all the profiling macros into a single one * to avoid cluttering a core logic */ #define VERBOSE_PERF_DUMP_ITT_DEBUG_LOG(ittScope, node, config) \ - VERBOSE(node, config.debugCaps.verbose); \ - PERF(node, config.collectPerfCounters); \ - DUMP(node, config.debugCaps, infer_count); \ - OV_ITT_SCOPED_TASK(ittScope, node->profiling.execute); \ + VERBOSE(node, config.debugCaps.verbose); \ + PERF(node, config.collectPerfCounters); \ + DUMP(node, config.debugCaps, infer_count); \ + OV_ITT_SCOPED_TASK(ittScope, node->profiling.execute); \ DEBUG_LOG(*node); inline void Graph::ExecuteNode(const NodePtr& node, SyncInferRequest* request, int numaId) const { @@ -1362,7 +1434,7 @@ inline void Graph::ExecuteNodeWithCatch(const NodePtr& node, SyncInferRequest* r } } -template +template void Graph::InferDynamic(SyncInferRequest* request, int numaId, UpdateStrategy&& update) { size_t inferCounter = 0; for (auto stopIndx : m_executableSyncNodesInds) { @@ -1410,17 +1482,20 @@ void Graph::Infer(SyncInferRequest* request) { InferStatic(request, numaId); break; default: - OPENVINO_ASSERT(IsReady(), "Wrong state of the ov::intel_cpu::Graph. Topology is not ready: ", static_cast(status)); + OPENVINO_ASSERT(IsReady(), + "Wrong state of the ov::intel_cpu::Graph. Topology is not ready: ", + static_cast(status)); } - if (infer_count != -1) infer_count++; + if (infer_count != -1) + infer_count++; } void Graph::SortTopologically() { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "Graph::SortTopologically"); // Set execIndex of all nodes to default invaild value - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { node->execIndex = -1; } @@ -1433,7 +1508,7 @@ void Graph::SortTopologically() { std::function visit; visit = [&execIndexCnt, &sorted, &visit](const NodePtr node) { if (node->execIndex >= 0) - return; // already visited + return; // already visited for (size_t i = 0; i < node->getParentEdges().size(); i++) { visit(node->getParentEdgeAt(i)->getParent()); @@ -1467,7 +1542,7 @@ void Graph::SortTopologically() { // Sort in / out child edges by port index // Make first N (N == port_num) edge indexes match with port index - for (auto &node : graphNodes) { + for (auto& node : graphNodes) { int port_num = node->outputShapes.size(); std::vector res(port_num); @@ -1512,10 +1587,7 @@ void Graph::GetPerfData(std::vector& perfMap) const { } } -void Graph::CreateEdge(const NodePtr& parent, - const NodePtr& child, - int parentPort, - int childPort) { +void Graph::CreateEdge(const NodePtr& parent, const NodePtr& child, int parentPort, int childPort) { assert(parentPort >= 0 && childPort >= 0); auto edge = std::make_shared(parent, child, parentPort, childPort); @@ -1539,24 +1611,28 @@ void Graph::AddNode(NodePtr node) { graphNodes.push_back(node); } -void Graph::DropNode(const NodePtr &node) { +void Graph::DropNode(const NodePtr& node) { auto children = node->childEdges; auto parents = node->parentEdges; for (size_t i = 0; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; const int inNum = p_edge->getInputNum(); RemoveEdge(p_edge); for (size_t j = 0; j < children.size(); j++) { auto c_edge = children[j].lock(); - if (!c_edge) continue; + if (!c_edge) + continue; auto child = c_edge->getChild(); - if (!child) continue; + if (!child) + continue; const int outNum = c_edge->getOutputNum(); RemoveEdge(c_edge); @@ -1565,31 +1641,37 @@ void Graph::DropNode(const NodePtr &node) { } } -void Graph::DropDWConvNode(const NodePtr &node) { +void Graph::DropDWConvNode(const NodePtr& node) { auto children = node->childEdges; auto parents = node->parentEdges; auto parentConvEdge = parents[0].lock(); - if (!parentConvEdge) return; + if (!parentConvEdge) + return; auto parentConv = parentConvEdge->getParent(); - if (!parentConv) return; + if (!parentConv) + return; parentConv->outputShapes[0] = node->outputShapes[0]; for (size_t i = 0; i < 1; i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; const int inNum = p_edge->getInputNum(); RemoveEdge(p_edge); for (size_t j = 0; j < children.size(); j++) { auto c_edge = children[j].lock(); - if (!c_edge) continue; + if (!c_edge) + continue; auto child = c_edge->getChild(); - if (!child) continue; + if (!child) + continue; const int outNum = c_edge->getOutputNum(); RemoveEdge(c_edge); @@ -1599,9 +1681,11 @@ void Graph::DropDWConvNode(const NodePtr &node) { for (size_t i = 1; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; const int inNum = p_edge->getInputNum(); const int portCandidate = p_edge->getOutputNum(); @@ -1615,14 +1699,20 @@ void Graph::DropDWConvNode(const NodePtr &node) { } void Graph::RemoveDroppedNodes() { - graphNodes.erase(std::remove_if(graphNodes.begin(), graphNodes.end(), - [](const NodePtr& node){ return node->isDropped(); }), + graphNodes.erase(std::remove_if(graphNodes.begin(), + graphNodes.end(), + [](const NodePtr& node) { + return node->isDropped(); + }), graphNodes.end()); } void Graph::RemoveDroppedEdges() { - graphEdges.erase(std::remove_if(graphEdges.begin(), graphEdges.end(), - [](const EdgePtr& node){ return node->isDropped(); }), + graphEdges.erase(std::remove_if(graphEdges.begin(), + graphEdges.end(), + [](const EdgePtr& node) { + return node->isDropped(); + }), graphEdges.end()); } @@ -1631,19 +1721,28 @@ NodePtr Graph::InsertReorder(EdgePtr edge, const MemoryDesc& inDesc, const MemoryDesc& outDesc, bool isOptimized, - const std::vector & src_perm) { + const std::vector& src_perm) { auto reorder = std::make_shared(inDesc, outDesc, layerName, m_context); reorder->setOptimized(isOptimized); reorder->setSrcPermutation(src_perm); DEBUG_LOG(reorder->getName(), " edge=", *edge, " isOptimized=", isOptimized); - DEBUG_LOG(" inDesc: ", inDesc.getShape().toString(), inDesc.getPrecision().get_type_name(), " ", inDesc.serializeFormat()); - DEBUG_LOG(" outDesc: ", outDesc.getShape().toString(), outDesc.getPrecision().get_type_name(), " ", outDesc.serializeFormat()); + DEBUG_LOG(" inDesc: ", + inDesc.getShape().toString(), + inDesc.getPrecision().get_type_name(), + " ", + inDesc.serializeFormat()); + DEBUG_LOG(" outDesc: ", + outDesc.getShape().toString(), + outDesc.getPrecision().get_type_name(), + " ", + outDesc.serializeFormat()); InsertNode(edge, reorder, true); // Using the method Edge::getDesc() we can check that input and output tensor descriptors are equal. - // Due to the specificity of GraphOptimizer::MergeTransposeAndReorder() that isOptimized flag uses, we shouldn't do these checks. + // Due to the specificity of GraphOptimizer::MergeTransposeAndReorder() that isOptimized flag uses, we shouldn't do + // these checks. if (!isOptimized) { reorder->getParentEdgeAt(0)->getDesc(); reorder->getChildEdgeAt(0)->getDesc(); @@ -1692,10 +1791,10 @@ void Graph::EnforceInferencePrecision() { const auto inferPrec = getConfig().inferencePrecision; if (one_of(inferPrec, element::f32, element::undefined, ov::element::f16)) - return; // nothing to do, only precision reduction is currently allowed + return; // nothing to do, only precision reduction is currently allowed #if defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64) if (inferPrec == ov::element::f16) - return; // precision of configured by ov::pass::ConvertPrecision + return; // precision of configured by ov::pass::ConvertPrecision #endif std::function& skipNodes)> searchForNodesToSkip; searchForNodesToSkip = [&](const NodePtr& node, std::unordered_set& skipNodes) -> void { @@ -1703,35 +1802,35 @@ void Graph::EnforceInferencePrecision() { const auto& parent = node->getParentEdgeAt(i)->getParent(); if (inferPrec == ov::element::bf16) { /* list of node types that must be forced to be executed in BF16 precision - * because of performance gains */ + * because of performance gains */ if (one_of(parent->getType(), - Type::Convolution, // conv nets - Type::FullyConnected, // conv / bert nets - Type::RNNCell, // recurent nets - Type::RNNSeq, // recurent nets - Type::MatMul, // bert nets - Type::ROIPooling, // object detection nets - Type::Interpolate, // super resolution nets - Type::PagedAttention, // page attention - Type::QKVProjection, - Type::LLMMLP)) - continue; // stop at significant nodes + Type::Convolution, // conv nets + Type::FullyConnected, // conv / bert nets + Type::RNNCell, // recurent nets + Type::RNNSeq, // recurent nets + Type::MatMul, // bert nets + Type::ROIPooling, // object detection nets + Type::Interpolate, // super resolution nets + Type::PagedAttention, // page attention + Type::QKVProjection, + Type::LLMMLP)) + continue; // stop at significant nodes } else if (inferPrec == ov::element::f16) { /* list of node types that must be forced to be executed in FP16 precision - * because of performance gains */ + * because of performance gains */ if (one_of(parent->getType(), - Type::Convolution, // conv nets - Type::Deconvolution, // deconv - Type::FullyConnected, // conv / bert nets - Type::MatMul, // bert nets - Type::Pooling, - Type::MVN)) - continue; // stop at significant nodes + Type::Convolution, // conv nets + Type::Deconvolution, // deconv + Type::FullyConnected, // conv / bert nets + Type::MatMul, // bert nets + Type::Pooling, + Type::MVN)) + continue; // stop at significant nodes } const auto res = skipNodes.insert(parent); - if (res.second) // node not visited yet + if (res.second) // node not visited yet searchForNodesToSkip(parent, skipNodes); } }; @@ -1772,10 +1871,10 @@ void Graph::EnforceInferencePrecision() { // kvcache of PagedAttention should be written directly if (node->getType() == Type::PagedAttention && (inPort == 3 || inPort == 4)) return true; - const auto &parent = node->getParentEdgeAt(inPort)->getParent(); + const auto& parent = node->getParentEdgeAt(inPort)->getParent(); /* Skip BF16 enforcement for nodes after Constant Inputs for maintaining precision for fusing. - * Element type conversion to bf16 is done automatically, if convolution follows up after Constant Inputs - * and activation is bf16 */ + * Element type conversion to bf16 is done automatically, if convolution follows up after Constant + * Inputs and activation is bf16 */ if (parent->getType() == Type::Input && parent->isConstant() && // Concatenation node is exception because it doesn't change an accuracy for BF16 activation node->getType() != Type::Concatenation) @@ -1815,7 +1914,7 @@ void Graph::EnforceInferencePrecision() { // exclude Convert before Range since it may cause precision loss when integter type to LP. // TODO: Incorrect subgraph is generated by ONNX FE + ticket 117861. - const auto &child = node->getChildEdgeAt(i)->getChild(); + const auto& child = node->getChildEdgeAt(i)->getChild(); if (child->getType() == Type::Range && node->getType() == Type::Convert) continue; // skip second output of PagedAttention @@ -1845,5 +1944,5 @@ const std::unordered_map& Graph::getInterna return m_context->getMemoryStatesRegister()->getMemoryStates(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/graph.h b/src/plugins/intel_cpu/src/graph.h index d50ccc152c9186..bdf3205d2baaaf 100644 --- a/src/plugins/intel_cpu/src/graph.h +++ b/src/plugins/intel_cpu/src/graph.h @@ -4,22 +4,20 @@ #pragma once +#include +#include +#include +#include + #include "config.h" #include "cpu_memory.h" -#include "nodes/input.h" -#include "openvino/core/node_vector.hpp" -#include "openvino/runtime/profiling_info.hpp" -#include "node.h" #include "edge.h" #include "graph_context.h" #include "memory_control.hpp" +#include "node.h" +#include "nodes/input.h" +#include "openvino/core/node_vector.hpp" #include "openvino/runtime/profiling_info.hpp" - -#include -#include -#include -#include - #include "openvino/runtime/so_ptr.hpp" #include "proxy_mem_blk.h" @@ -29,7 +27,7 @@ namespace intel_cpu { class SyncInferRequest; namespace node { class MemoryStateNode; -} // namespace node +} // namespace node class Graph { public: @@ -61,15 +59,15 @@ class Graph { return IsStatic() || IsDynamic(); } - const Config & getConfig() const { + const Config& getConfig() const { return m_context->getConfig(); } - template - void CreateGraph(NET &model, const GraphContext::CPtr context); + template + void CreateGraph(NET& model, const GraphContext::CPtr context); - void CreateGraph(const std::vector &graphNodes, - const std::vector &graphEdges, + void CreateGraph(const std::vector& graphNodes, + const std::vector& graphEdges, const GraphContext::CPtr context, std::string name); @@ -97,14 +95,14 @@ class Graph { return outputNodesMap; } - NodePtr getInputNodeByIndex(const std::size_t &index) { + NodePtr getInputNodeByIndex(const std::size_t& index) { auto input = inputNodesMap.find(index); if (input == inputNodesMap.end()) OPENVINO_THROW("CPU execution graph doesn't contain input node with index: ", index); return input->second; } - NodePtr getOutputNodeByIndex(const std::size_t &index) { + NodePtr getOutputNodeByIndex(const std::size_t& index) { auto output = outputNodesMap.find(index); if (output == outputNodesMap.end()) OPENVINO_THROW("CPU execution graph doesn't contain output node with index: ", index); @@ -119,12 +117,9 @@ class Graph { return m_context; } - void GetPerfData(std::vector &perfMap) const; + void GetPerfData(std::vector& perfMap) const; - void CreateEdge(const NodePtr& parent, - const NodePtr& child, - int parentPort = 0, - int childPort = 0); + void CreateEdge(const NodePtr& parent, const NodePtr& child, int parentPort = 0, int childPort = 0); void RemoveEdge(const EdgePtr& edge); void RemoveDroppedNodes(); void RemoveDroppedEdges(); @@ -134,9 +129,9 @@ class Graph { /** * @brief Insert Reorder node at the edge-specified location. - * The Reorder node must be inserted in case when there are inplace conflicts or the input and output tensor descriptors do not match. - * The Reorder node rearranges the elements in memory according to inDesc and outDesc, or reinterprets memory descriptor without - * rearrangement of elements if isOptimized is true. + * The Reorder node must be inserted in case when there are inplace conflicts or the input and output tensor + * descriptors do not match. The Reorder node rearranges the elements in memory according to inDesc and outDesc, or + * reinterprets memory descriptor without rearrangement of elements if isOptimized is true. * @param edge * pointer to the edge in the graph where Reorder node will be inserted * @param layerName @@ -153,14 +148,18 @@ class Graph { * pointer to the blob containing scales * @return pointer to the new Reorder node. */ - NodePtr InsertReorder(EdgePtr edge, std::string layerName, const MemoryDesc& inDesc, - const MemoryDesc& outDesc, bool isOptimized = false, const std::vector & src_perm = {}); + NodePtr InsertReorder(EdgePtr edge, + std::string layerName, + const MemoryDesc& inDesc, + const MemoryDesc& outDesc, + bool isOptimized = false, + const std::vector& src_perm = {}); /** * @brief Insert Node at the edge-specified location. - * This method supports two regimes. First, the node is inserted without initialization (i.e. supported descriptors initialization, - * supported primitive descriptors selection, etc.), which can be useful after the ResolveEdgeConflicts() completes. The second is just inserting the - * node without initialization. + * This method supports two regimes. First, the node is inserted without initialization (i.e. supported descriptors + * initialization, supported primitive descriptors selection, etc.), which can be useful after the + * ResolveEdgeConflicts() completes. The second is just inserting the node without initialization. * @param edge * pointer to the edge in the graph where the node will be inserted * @param node @@ -173,10 +172,10 @@ class Graph { /** * @brief Insert Node between two specified nodes. - * This procedure creates two edges that link the parent and child nodes to the inserted one and adds all created objects to the graph. - * This method supports two regimes. First, the node is inserted without initialization (i.e. supported descriptors initialization, - * supported primitive descriptors selection, etc.), which can be useful after the ResolveEdgeConflicts() completes. The second is just inserting the - * node without initialization. + * This procedure creates two edges that link the parent and child nodes to the inserted one and adds all created + * objects to the graph. This method supports two regimes. First, the node is inserted without initialization (i.e. + * supported descriptors initialization, supported primitive descriptors selection, etc.), which can be useful after + * the ResolveEdgeConflicts() completes. The second is just inserting the node without initialization. * @param parent * pointer to the parent node * @param child @@ -193,7 +192,9 @@ class Graph { std::shared_ptr dump() const; - void ResetInferCount() { infer_count = 0; } + void ResetInferCount() { + infer_count = 0; + } void SortTopologically(); @@ -215,7 +216,7 @@ class Graph { * Activate execution graph using \p externalInputMemory and \p externalOutputMemory */ void Activate(const std::vector& externalInputMemory = {}, - const std::vector& externalOutputMemory = {}); + const std::vector& externalOutputMemory = {}); const std::unordered_map& getOutputNodesMemBlocksMap() const { return outputNodesMemBlocksMap; @@ -231,7 +232,7 @@ class Graph { graphEdges.clear(); m_executableSyncNodesInds.clear(); } - Status status { Status::NotReady }; + Status status{Status::NotReady}; // For dumping purposes. -1 - no counting, all other positive // values mean increment it within each Infer() call @@ -244,7 +245,7 @@ class Graph { bool graphHasDynamicInput = false; - void Replicate(const std::shared_ptr &subgraph, + void Replicate(const std::shared_ptr& subgraph, const std::vector& inputConfigs = {}, const std::vector& outputConfigs = {}); @@ -281,10 +282,10 @@ class Graph { void ExecuteNode(const NodePtr& node, SyncInferRequest* request = nullptr, int numaId = -1) const; void InferStatic(SyncInferRequest* request, int numaId); - template + template void InferDynamic(SyncInferRequest* request, int numaId, UpdateStrategy&& update); - friend std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph); + friend std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph& graph); private: using event_t = void (Graph::*)(void); diff --git a/src/plugins/intel_cpu/src/graph_context.cpp b/src/plugins/intel_cpu/src/graph_context.cpp index 5b967ed58a7918..462cdab2a9b5c0 100644 --- a/src/plugins/intel_cpu/src/graph_context.cpp +++ b/src/plugins/intel_cpu/src/graph_context.cpp @@ -1,10 +1,11 @@ // Copyright (C) 2018-2024 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // -#include "dnnl_types.h" #include "graph_context.h" -#include "nodes/memory.hpp" + +#include "dnnl_types.h" #include "memory_control.hpp" +#include "nodes/memory.hpp" namespace ov { namespace intel_cpu { @@ -42,5 +43,5 @@ const dnnl::engine& GraphContext::getEngine() { return eng; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/graph_context.h b/src/plugins/intel_cpu/src/graph_context.h index ce51af0c81b4bd..d13872129325b4 100644 --- a/src/plugins/intel_cpu/src/graph_context.h +++ b/src/plugins/intel_cpu/src/graph_context.h @@ -4,11 +4,11 @@ #pragma once -#include "openvino/runtime/threading/cpu_streams_executor.hpp" -#include "sub_memory_manager.hpp" #include "cache/multi_cache.h" #include "config.h" #include "dnnl_scratch_pad.h" +#include "openvino/runtime/threading/cpu_streams_executor.hpp" +#include "sub_memory_manager.hpp" #include "weights_cache.hpp" namespace ov { @@ -16,7 +16,7 @@ namespace intel_cpu { namespace node { class MemoryStatesRegister; -} // namespace node +} // namespace node class NetworkMemoryControl; @@ -39,7 +39,6 @@ class GraphContext { return weightsCache; } - MultiCachePtr getParamsCache() const { return rtParamsCache; } @@ -81,7 +80,7 @@ class GraphContext { private: Config config; // network-level config - WeightsSharing::Ptr weightsCache; // per NUMA node caches for sharing weights data + WeightsSharing::Ptr weightsCache; // per NUMA node caches for sharing weights data MultiCachePtr rtParamsCache; // primitive cache DnnlScratchPadPtr rtScratchPad; // scratch pad @@ -90,9 +89,9 @@ class GraphContext { std::vector rtScratchPads; // scratch pad (each sub-stream has its own copy) - ov::threading::IStreamsExecutor::Ptr streamExecutor; // stream executor for current graph + ov::threading::IStreamsExecutor::Ptr streamExecutor; // stream executor for current graph - ov::threading::CPUStreamsExecutor::Ptr cpuStreamExecutor; // cpu stream executor for current graph + ov::threading::CPUStreamsExecutor::Ptr cpuStreamExecutor; // cpu stream executor for current graph std::shared_ptr subMemoryManager; diff --git a/src/plugins/intel_cpu/src/graph_dumper.cpp b/src/plugins/intel_cpu/src/graph_dumper.cpp index 04c15408743c71..5a3a95362267fe 100644 --- a/src/plugins/intel_cpu/src/graph_dumper.cpp +++ b/src/plugins/intel_cpu/src/graph_dumper.cpp @@ -4,28 +4,28 @@ #include "graph_dumper.h" -#include "dnnl_debug.h" -#include "openvino/pass/manager.hpp" -#include "openvino/pass/serialize.hpp" -#include "openvino/runtime/exec_model_info.hpp" -#include "utils/debug_capabilities.h" - #include +#include #include #include #include #include -#include + +#include "dnnl_debug.h" +#include "openvino/pass/manager.hpp" +#include "openvino/pass/serialize.hpp" +#include "openvino/runtime/exec_model_info.hpp" +#include "utils/debug_capabilities.h" namespace ov { namespace intel_cpu { -void serializeToCout(const Graph &graph); -void serializeToXML(const Graph &graph, const std::string& path); +void serializeToCout(const Graph& graph); +void serializeToXML(const Graph& graph, const std::string& path); namespace { -std::map extract_node_metadata(const NodePtr &node) { +std::map extract_node_metadata(const NodePtr& node) { std::map serialization_info; if (node->getType() == Type::Input && node->isConstant()) { @@ -47,7 +47,8 @@ std::map extract_node_metadata(const NodePtr &node) { bool isAllEqual = true; for (size_t i = 1; i < node->getChildEdges().size(); i++) { - if (node->getChildEdgeAt(i - 1)->getMemory().getDesc().getPrecision() != node->getChildEdgeAt(i)->getMemory().getDesc().getPrecision()) { + if (node->getChildEdgeAt(i - 1)->getMemory().getDesc().getPrecision() != + node->getChildEdgeAt(i)->getMemory().getDesc().getPrecision()) { isAllEqual = false; break; } @@ -56,7 +57,8 @@ std::map extract_node_metadata(const NodePtr &node) { // If all output precisions are the same, we store the name only once if (!isAllEqual) { for (size_t i = 1; i < node->getChildEdges().size(); i++) - outputPrecisionsStr += "," + std::string(node->getChildEdgeAt(i)->getMemory().getDesc().getPrecision().get_type_name()); + outputPrecisionsStr += + "," + std::string(node->getChildEdgeAt(i)->getMemory().getDesc().getPrecision().get_type_name()); } } else { // Branch to correctly handle output nodes @@ -107,8 +109,8 @@ std::map extract_node_metadata(const NodePtr &node) { } // namespace -std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { - std::map > node2layer; +std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph& graph) { + std::map> node2layer; ov::ResultVector results; ov::ParameterVector params; @@ -117,7 +119,7 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { std::map> paramsMap; std::map> resultsMap; - auto get_inputs = [&] (const NodePtr & node) { + auto get_inputs = [&](const NodePtr& node) { auto pr_edges = node->getParentEdges(); ov::OutputVector inputs(pr_edges.size()); @@ -136,10 +138,10 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { return inputs; }; - auto create_ngraph_node = [&](const NodePtr &node) { + auto create_ngraph_node = [&](const NodePtr& node) { bool is_input = false, is_output = false, should_be_hold = false; size_t input_index = -1, output_index = -1; - for (auto && kvp : graph.inputNodesMap) { + for (auto&& kvp : graph.inputNodesMap) { if (kvp.second == node) { is_input = true; input_index = kvp.first; @@ -147,7 +149,7 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { } } - for (auto && kvp : graph.outputNodesMap) { + for (auto&& kvp : graph.outputNodesMap) { if (kvp.second == node) { is_output = true; output_index = kvp.first; @@ -174,7 +176,8 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { return_node = result; } else { return_node = std::make_shared( - get_inputs(node), node->getSelectedPrimitiveDescriptor()->getConfig().outConfs.size()); + get_inputs(node), + node->getSelectedPrimitiveDescriptor()->getConfig().outConfs.size()); for (size_t port = 0; port < return_node->get_output_size(); ++port) { auto& desc = node->getChildEdgeAt(port)->getMemory().getDesc(); @@ -186,7 +189,7 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { to_hold.push_back(return_node); } - for (auto && kvp : meta_data) + for (auto&& kvp : meta_data) return_node->get_rt_info()[kvp.first] = kvp.second; return_node->set_friendly_name(node->getName()); @@ -195,18 +198,18 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { ov::NodeVector nodes; nodes.reserve(graph.graphNodes.size()); - for (auto &node : graph.graphNodes) { // important: graph.graphNodes are in topological order + for (auto& node : graph.graphNodes) { // important: graph.graphNodes are in topological order nodes.emplace_back(create_ngraph_node(node)); node2layer[node] = nodes.back(); } - for (auto && kvp : paramsMap) + for (auto&& kvp : paramsMap) params.push_back(kvp.second); - for (auto && kvp : resultsMap) + for (auto&& kvp : resultsMap) results.push_back(kvp.second); auto holder = !results.empty() ? results[0] : std::make_shared(); - for (auto &node : to_hold) { + for (auto& node : to_hold) { holder->add_control_dependency(node); } @@ -214,7 +217,7 @@ std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph) { } #ifdef CPU_DEBUG_CAPS -void serialize(const Graph &graph) { +void serialize(const Graph& graph) { const std::string& path = graph.getConfig().debugCaps.execGraphPath; if (path.empty()) @@ -231,19 +234,17 @@ void serialize(const Graph &graph) { } } -void serializeToXML(const Graph &graph, const std::string& path) { +void serializeToXML(const Graph& graph, const std::string& path) { if (path.empty()) return; std::string binPath; ov::pass::Manager manager; - manager.register_pass(path, - binPath, - ov::pass::Serialize::Version::IR_V10); + manager.register_pass(path, binPath, ov::pass::Serialize::Version::IR_V10); manager.run_passes(graph.dump()); } -void serializeToCout(const Graph &graph) { +void serializeToCout(const Graph& graph) { for (const auto& node : graph.GetNodes()) { std::cout << "name: " << node->getName() << " [ "; auto nodeDesc = node->getSelectedPrimitiveDescriptor(); @@ -251,8 +252,7 @@ void serializeToCout(const Graph &graph) { auto& inConfs = nodeDesc->getConfig().inConfs; if (!inConfs.empty()) { std::cout << "in: " << inConfs.front().getMemDesc()->getPrecision().get_type_name() - << "/l=" << inConfs.front().getMemDesc()->serializeFormat() - << "; "; + << "/l=" << inConfs.front().getMemDesc()->serializeFormat() << "; "; } auto& outConfs = nodeDesc->getConfig().outConfs; if (!outConfs.empty()) { @@ -260,11 +260,11 @@ void serializeToCout(const Graph &graph) { << "/l=" << outConfs.front().getMemDesc()->serializeFormat(); } } - std::cout << " ]" << std::endl; + std::cout << " ]" << std::endl; } } -void summary_perf(const Graph &graph) { +void summary_perf(const Graph& graph) { if (!graph.getGraphContext()) { return; } @@ -277,7 +277,7 @@ void summary_perf(const Graph &graph) { std::map perf_by_node; double total_avg = 0; uint64_t total = 0; - for (auto &node : graph.GetNodes()) { // important: graph.graphNodes are in topological order + for (auto& node : graph.GetNodes()) { // important: graph.graphNodes are in topological order double avg = node->PerfCounter().avg(); auto type = node->getTypeStr() + "_" + node->getPrimitiveDescriptorType(); auto name = node->getName(); @@ -296,59 +296,60 @@ void summary_perf(const Graph &graph) { perf_by_node[node] = avg; } - if (total_avg < 1) return; + if (total_avg < 1) + return; std::cout << "======= ENABLE_DEBUG_CAPS:OV_CPU_SUMMARY_PERF ======" << std::endl; - std::cout << "Summary of " << graph.GetName() << " @" << std::hash{}(reinterpret_cast(&graph)) << std::endl; + std::cout << "Summary of " << graph.GetName() << " @" << std::hash{}(reinterpret_cast(&graph)) + << std::endl; std::cout << " Total(us): " << (uint64_t)(total) << std::endl; std::cout << " Total_avg(us): " << (uint64_t)(total_avg) << std::endl; { std::cout << " perf_by_type:" << std::endl; - std::vector > A; + std::vector> A; for (auto& it : perf_by_type) A.push_back(it); - sort(A.begin(), A.end(), - [](std::pair& a, - std::pair& b){ - return a.second > b.second; - }); + sort(A.begin(), A.end(), [](std::pair& a, std::pair& b) { + return a.second > b.second; + }); for (auto& it : A) { std::stringstream ss; - int percentage = static_cast(it.second*100/total_avg); - if (percentage == 0) break; - ss << std::setw(10) << std::right << percentage << " % : " << std::setw(8) << std::right << it.second << "(us) " << it.first << std::endl; + int percentage = static_cast(it.second * 100 / total_avg); + if (percentage == 0) + break; + ss << std::setw(10) << std::right << percentage << " % : " << std::setw(8) << std::right << it.second + << "(us) " << it.first << std::endl; std::cout << ss.str(); } } { std::cout << " perf_by_node:" << std::endl; - std::vector > A; + std::vector> A; for (auto& it : perf_by_node) A.push_back(it); - sort(A.begin(), A.end(), - [](std::pair& a, - std::pair& b){ + sort(A.begin(), A.end(), [](std::pair& a, std::pair& b) { return a.second > b.second; }); for (auto& it : A) { std::stringstream ss; - auto percentage = it.second*100/total_avg; + auto percentage = it.second * 100 / total_avg; auto node = it.first; - if (node->PerfCounter().count() == 0) continue; - if (node->PerfCounter().avg() < 1) continue; + if (node->PerfCounter().count() == 0) + continue; + if (node->PerfCounter().avg() < 1) + continue; ss << std::setw(10) << std::right << std::fixed << std::setprecision(2) << percentage << " % " - << std::setw(8) << std::right << node->PerfCounter().avg() << "(us)x" << node->PerfCounter().count() - << " #" << node->getExecIndex() - << " " << node->getName() - << " " << node->getTypeStr() + "_" + node->getPrimitiveDescriptorType() << std::endl; + << std::setw(8) << std::right << node->PerfCounter().avg() << "(us)x" << node->PerfCounter().count() + << " #" << node->getExecIndex() << " " << node->getName() << " " + << node->getTypeStr() + "_" + node->getPrimitiveDescriptorType() << std::endl; std::cout << ss.str(); } } } -void average_counters(const Graph &graph) { +void average_counters(const Graph& graph) { /** * @todo improve logic for a graph with inner graphs: * - collect counters only for the outer graph if full path is specified @@ -359,7 +360,8 @@ void average_counters(const Graph &graph) { static int graphIndex = 0; std::ofstream file; - std::string fileName = graph.getConfig().debugCaps.averageCountersPath + "_" + std::to_string(graphIndex++) + ".csv"; + std::string fileName = + graph.getConfig().debugCaps.averageCountersPath + "_" + std::to_string(graphIndex++) + ".csv"; file.open(fileName); @@ -379,18 +381,14 @@ void average_counters(const Graph &graph) { const auto cpuTime = toMs(avg); const auto realTime = cpuTime; - file << node->getName() << ";" - << status << ";" - << node->getTypeStr() << ";" - << node->getPrimitiveDescriptorType() << ";" - << realTime << ";" - << cpuTime << ";" - << "\n"; + file << node->getName() << ";" << status << ";" << node->getTypeStr() << ";" + << node->getPrimitiveDescriptorType() << ";" << realTime << ";" << cpuTime << ";" + << "\n"; return avg; }; - for (auto &node : graph.GetNodes()) { + for (auto& node : graph.GetNodes()) { if (node->isConstant()) continue; @@ -399,11 +397,12 @@ void average_counters(const Graph &graph) { const auto totalMs = toMs(total); - file << "Total;;;;" << totalMs << ";" << totalMs << ";" << "\n"; + file << "Total;;;;" << totalMs << ";" << totalMs << ";" + << "\n"; file.close(); } #endif -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/graph_dumper.h b/src/plugins/intel_cpu/src/graph_dumper.h index 417db7e4c3cdc5..40af2fd44c61e6 100644 --- a/src/plugins/intel_cpu/src/graph_dumper.h +++ b/src/plugins/intel_cpu/src/graph_dumper.h @@ -4,19 +4,19 @@ #pragma once -#include "graph.h" - #include +#include "graph.h" + namespace ov { namespace intel_cpu { -std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph &graph); +std::shared_ptr dump_graph_as_ie_ngraph_net(const Graph& graph); #ifdef CPU_DEBUG_CAPS -void serialize(const Graph &graph); -void summary_perf(const Graph &graph); -void average_counters(const Graph &graph); -#endif // CPU_DEBUG_CAPS +void serialize(const Graph& graph); +void summary_perf(const Graph& graph); +void average_counters(const Graph& graph); +#endif // CPU_DEBUG_CAPS -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/graph_optimizer.cpp b/src/plugins/intel_cpu/src/graph_optimizer.cpp index 94f54fc4c59b55..fe0df309dc32f1 100644 --- a/src/plugins/intel_cpu/src/graph_optimizer.cpp +++ b/src/plugins/intel_cpu/src/graph_optimizer.cpp @@ -4,6 +4,7 @@ #include "graph_optimizer.h" +#include "cpu_types.h" #include "dnnl_extension_utils.h" #include "nodes/bin_conv.h" #include "nodes/common/cpu_convert.h" @@ -22,28 +23,26 @@ #include "nodes/transpose.h" #include "onednn/dnnl.h" #include "openvino/opsets/opset1.hpp" -#include "cpu_types.h" #include "utils/cpu_utils.hpp" #include "utils/debug_capabilities.h" #include "utils/general_utils.h" // WA for xbyak.h #ifdef _WIN32 -# ifndef _WINSOCKAPI_ -# define _WINSOCKAPI_ -# endif -# ifndef _WINSOCK2API_ -# define _WINSOCK2API_ -#endif +# ifndef _WINSOCKAPI_ +# define _WINSOCKAPI_ +# endif +# ifndef _WINSOCK2API_ +# define _WINSOCK2API_ +# endif #endif -#include "cpu/x64/cpu_isa_traits.hpp" - -#include +#include #include #include #include -#include +#include +#include "cpu/x64/cpu_isa_traits.hpp" #include "itt.h" #include "memory_desc/cpu_memory_desc_utils.h" @@ -55,11 +54,15 @@ namespace intel_cpu { GraphOptimizer::GraphOptimizer() {} -void GraphOptimizer::ApplyCommonGraphOptimizations(Graph &graph) { +void GraphOptimizer::ApplyCommonGraphOptimizations(Graph& graph) { // For conv with input zp, canBeExecutedInInt8() check has dependency on input zero point check. - // Also zero point node is the input of computing-intensive nodes. Most others fusing are the output of computing-intensive nodes. - // So Locate the FuseConvolutionAndZeroPoints() as the first optimization. - OV_ITT_SCOPE_CHAIN(FIRST_INFERENCE, taskChain, itt::domains::intel_cpu_LT, "ApplyCommonGraphOptimizations", "FuseConvolutionAndZeroPoints"); + // Also zero point node is the input of computing-intensive nodes. Most others fusing are the output of + // computing-intensive nodes. So Locate the FuseConvolutionAndZeroPoints() as the first optimization. + OV_ITT_SCOPE_CHAIN(FIRST_INFERENCE, + taskChain, + itt::domains::intel_cpu_LT, + "ApplyCommonGraphOptimizations", + "FuseConvolutionAndZeroPoints"); FuseConvolutionAndZeroPoints(graph); graph.RemoveDroppedNodes(); @@ -187,7 +190,7 @@ void GraphOptimizer::ApplyCommonGraphOptimizations(Graph &graph) { graph.RemoveDroppedEdges(); } -void GraphOptimizer::ApplyImplSpecificGraphOptimizations(Graph &graph) { +void GraphOptimizer::ApplyImplSpecificGraphOptimizations(Graph& graph) { OV_ITT_SCOPE(FIRST_INFERENCE, itt::domains::intel_cpu_LT, "GraphOptimizer::ApplyImplSpecificGraphOptimizations"); DropDoubleReorders(graph); @@ -202,7 +205,7 @@ void GraphOptimizer::ApplyImplSpecificGraphOptimizations(Graph &graph) { graph.RemoveDroppedEdges(); } -void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { +void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isDQScaleGraphPattern = [](NodePtr node) { @@ -211,13 +214,12 @@ void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { } auto parentNode = node->getParentEdgeAt(0)->getParent(); auto scaleNode = node->getParentEdgeAt(1)->getParent(); - if (!(parentNode->getType() == Type::Convolution - || parentNode->getType() == Type::MatMul - || parentNode->getType() == Type::Deconvolution)) + if (!(parentNode->getType() == Type::Convolution || parentNode->getType() == Type::MatMul || + parentNode->getType() == Type::Deconvolution)) return false; if (!scaleNode->isConstant()) return false; - //Only Fusing scales for INT8 precision. + // Only Fusing scales for INT8 precision. if (!parentNode->canBeExecutedInInt8()) return false; return (parentNode->getParentEdges().size() == 2); @@ -233,8 +235,7 @@ void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { if (!node->getFusedWith().empty() || !scales->getFusedWith().empty()) return false; - const auto scalesDims = getNormalizedDimsBySize(scales->getOutputShapeAtPort(0).getDims(), - nodeOutDims.size()); + const auto scalesDims = getNormalizedDimsBySize(scales->getOutputShapeAtPort(0).getDims(), nodeOutDims.size()); if (nodeOutDims.size() != scalesDims.size() || scalesDims.size() < 2) return false; @@ -261,7 +262,7 @@ void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { if (scalesData == nullptr) OPENVINO_THROW("scalesBlob has not allocated buffer"); auto scalesDims = getNormalizedDimsBySize(scales->getOutputShapeAtPort(0).getDims(), - node->getOutputShapeAtPort(0).getDims().size()); + node->getOutputShapeAtPort(0).getDims().size()); auto scaleSize = std::accumulate(scalesDims.begin(), scalesDims.end(), 1, std::multiplies()); node->fuseDQScales(scalesData, scaleSize); return true; @@ -269,16 +270,21 @@ void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { for (size_t i = 0; i < graphNodes.size(); i++) { auto mul = graphNodes[i]; - if (!isDQScaleGraphPattern(mul)) continue; + if (!isDQScaleGraphPattern(mul)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseConvMatmulFCDeconvAndDQScales); auto node = mul->getParentEdgeAt(0)->getParent(); auto scales = mul->getParentEdgeAt(1)->getParent(); - if (!scaleDimsCheck(node, scales)) continue; + if (!scaleDimsCheck(node, scales)) + continue; if (initializeDeQuantizedScales(node, scales)) { - DEBUG_LOG("GraphOptimizer##FusingDQ: Node ##", mul->getName(), " optimized as DQ scales of Node ##", node->getName()); + DEBUG_LOG("GraphOptimizer##FusingDQ: Node ##", + mul->getName(), + " optimized as DQ scales of Node ##", + node->getName()); node->addOriginalLayer(mul->getOriginalLayers()); auto p_edge = mul->getParentEdgeAt(1); graph.RemoveEdge(p_edge); @@ -287,7 +293,7 @@ void GraphOptimizer::FuseConvMatmulFCDeconvAndDQScales(Graph &graph) { } } -void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { +void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](const NodePtr& node) { @@ -300,16 +306,14 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { return false; if (!deconv) - return (one_of(node->getType(), Type::Convolution, Type::MatMul) && - node->getParentEdges().size() == 2); + return (one_of(node->getType(), Type::Convolution, Type::MatMul) && node->getParentEdges().size() == 2); else return deconv->canFuseBias(); }; auto isSuitableChildNode = [&](const NodePtr& parentNode, const NodePtr& childNode) { - if (childNode->getAlgorithm() != Algorithm::EltwiseAdd - || !childNode->getFusedWith().empty() - || childNode->getParentEdges().size() != 2) + if (childNode->getAlgorithm() != Algorithm::EltwiseAdd || !childNode->getFusedWith().empty() || + childNode->getParentEdges().size() != 2) return false; auto biasPort = childNode->getParentEdgeAt(0)->getParent() == parentNode ? 1 : 0; @@ -318,10 +322,11 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { return false; const auto parentOutDims = parentNode->getOutputShapeAtPort(0).getDims(); - const auto biasDims = getNormalizedDimsBySize(biasNode->getOutputShapeAtPort(0).getDims(), - parentOutDims.size()); - // TODO [NM]: Legacy ConvBias fusion transformation supports both per-tensor (via explicit broadcasing) and per-channel cases. - // Most of the real models contain per-channel bias, so we need to reavaluate the need to support per-tensor variant. + const auto biasDims = + getNormalizedDimsBySize(biasNode->getOutputShapeAtPort(0).getDims(), parentOutDims.size()); + // TODO [NM]: Legacy ConvBias fusion transformation supports both per-tensor (via explicit broadcasing) and + // per-channel cases. Most of the real models contain per-channel bias, so we need to reavaluate the need to + // support per-tensor variant. if (parentOutDims.size() != biasDims.size() || biasDims.size() < 2) return false; @@ -357,9 +362,11 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { for (size_t i = 0; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; if (parent == parentNode) { for (size_t j = 0; j < childs.size(); j++) { @@ -369,7 +376,7 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { if (!child) continue; - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; if (remEdge) { inNum = remEdge->getInputNum(); @@ -384,7 +391,7 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { graph.CreateEdge(parent, child, inNum, outNum); } } else { - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; if (remEdge) { inNum = remEdge->getInputNum(); @@ -398,48 +405,57 @@ void GraphOptimizer::FuseConvolutionMatMulDeconvAndBias(Graph &graph) { // ONEDNN Conv, Deconv, FC would need the bias to be flatten into 1D tensor. // Usually the bias output shape would be normalized to align rank with Conv/Deconv/FC output. // To avoid duplicate reshape WA code in nodes, here we flatten the shape. - // Most bias nodes are const Input and bias memory primitive has been initialized as const memory when constructing CPU Input node. - // Const memory is not allowed to be modified after initialized. It means we can't redefine const bias memory primitive. - // So let's insert a reshape node to flatten the bias shape into 1D and const folding node will be executed during the compiling stage. - const bool needReshape = (targetNode->getType() != Type::MatMul && - biasOutputShape.getRank() != 1); + // Most bias nodes are const Input and bias memory primitive has been initialized as const memory when + // constructing CPU Input node. Const memory is not allowed to be modified after initialized. It means + // we can't redefine const bias memory primitive. So let's insert a reshape node to flatten the bias + // shape into 1D and const folding node will be executed during the compiling stage. + const bool needReshape = (targetNode->getType() != Type::MatMul && biasOutputShape.getRank() != 1); if (needReshape) { // Bias -> Reshape -> Conv/Deconv/FC const VectorDims flattenShape = {biasOutputShape.getElementsCount()}; // Construct Ngraph Reshape node and CPU Reshape node. - auto reshapeConstInput = std::make_shared(ov::element::i32, ov::Shape{1}, flattenShape); - auto reshapeDummyInput = std::make_shared( - biasNode->getOriginalOutputPrecisionAtPort(0), - biasOutputShape.toPartialShape()); - const auto reshape = std::make_shared(reshapeDummyInput, reshapeConstInput, false); + auto reshapeConstInput = + std::make_shared(ov::element::i32, ov::Shape{1}, flattenShape); + auto reshapeDummyInput = + std::make_shared(biasNode->getOriginalOutputPrecisionAtPort(0), + biasOutputShape.toPartialShape()); + const auto reshape = + std::make_shared(reshapeDummyInput, reshapeConstInput, false); reshape->set_friendly_name(biasNode->getName() + "_flatten_reshape"); - const auto cpuReshapeNode = std::make_shared(reshape, graph.getGraphContext()); + const auto cpuReshapeNode = + std::make_shared(reshape, graph.getGraphContext()); // Insert Reshape between bias node and Conv/Deconv/FC graph.InsertNode(biasNode, targetNode, cpuReshapeNode, inNum, outNum, false); // Insert the Reshape const input node and edge into CPU graph. - const auto cpuReshapeConstInput = std::make_shared(reshapeConstInput, graph.getGraphContext()); + const auto cpuReshapeConstInput = + std::make_shared(reshapeConstInput, graph.getGraphContext()); graph.AddNode(cpuReshapeConstInput); graph.CreateEdge(cpuReshapeConstInput, cpuReshapeNode, 0, 1); - DEBUG_LOG("GraphOptimizer##FusingBias:Flatten Bias node from shape ", PartialShape{biasOutputShape.getDims()}, - " to ", PartialShape{flattenShape}); + DEBUG_LOG("GraphOptimizer##FusingBias:Flatten Bias node from shape ", + PartialShape{biasOutputShape.getDims()}, + " to ", + PartialShape{flattenShape}); // Update bias output shape to be flatten shape. biasOutputShape = Shape{flattenShape}; } else { // Bias is connected as input edge. graph.CreateEdge(biasNode, targetNode, inNum, outNum); } - //Add the Bias inputshape into conv/FC/Deconv/Matmul. + // Add the Bias inputshape into conv/FC/Deconv/Matmul. targetNode->inputShapes.push_back(biasOutputShape); } } - DEBUG_LOG("GraphOptimizer##FusingBias:Node ##: ", childNode->getName(), " initialize as Bias of Node ##", parentNode->getName()); + DEBUG_LOG("GraphOptimizer##FusingBias:Node ##: ", + childNode->getName(), + " initialize as Bias of Node ##", + parentNode->getName()); parentNode->addOriginalLayer(childNode->getOriginalLayers()); parentNode->addOriginalInputPrecision(childNode->getOriginalInputPrecisionAtPort(biasPort)); graph.DropNode(childNode); } } -void GraphOptimizer::FuseDeconvolutionAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseDeconvolutionAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -485,7 +501,7 @@ void GraphOptimizer::FuseDeconvolutionAndSimpleOperation(Graph &graph) { childNode->fuseInto(parentNode); auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::Deconvolution) continue; @@ -497,7 +513,7 @@ void GraphOptimizer::FuseDeconvolutionAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { +void GraphOptimizer::FuseMultiplyAndAdd(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableSecondInput = [](const NodePtr& node, VectorDims dataDims) { @@ -509,9 +525,9 @@ void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { auto getChannelAxis = [](const VectorDims& dims) { auto channelAxis = -1; - for (size_t i = 0; i < dims.size(); i ++) { + for (size_t i = 0; i < dims.size(); i++) { if (dims[i] != 1) { - if (channelAxis != -1) // more than one axis is != 1 + if (channelAxis != -1) // more than one axis is != 1 return -1; else channelAxis = i; @@ -539,11 +555,13 @@ void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { }; auto isSuitableChildNode = [&](const NodePtr& parentNode, const NodePtr& childNode) { - if (childNode->getAlgorithm() != Algorithm::EltwiseAdd || !childNode->getFusedWith().empty() || childNode->getParentEdges().size() != 2) + if (childNode->getAlgorithm() != Algorithm::EltwiseAdd || !childNode->getFusedWith().empty() || + childNode->getParentEdges().size() != 2) return false; - return isSuitableSecondInput(childNode->getParentEdgeAt(1)->getParent(), childNode->getInputShapeAtPort(0).getDims()) && - parentNode->canFuse(childNode); + return isSuitableSecondInput(childNode->getParentEdgeAt(1)->getParent(), + childNode->getInputShapeAtPort(0).getDims()) && + parentNode->canFuse(childNode); }; auto parent = graphNodes.begin(); @@ -569,9 +587,11 @@ void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { for (size_t i = 0; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; if (parent == parentNode) { for (size_t j = 0; j < childs.size(); j++) { @@ -581,7 +601,7 @@ void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { if (!child) continue; - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; if (remEdge) { inNum = remEdge->getInputNum(); @@ -596,7 +616,7 @@ void GraphOptimizer::FuseMultiplyAndAdd(Graph &graph) { graph.CreateEdge(parent, child, inNum, outNum); } } else { - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; if (remEdge) { inNum = remEdge->getInputNum(); @@ -652,9 +672,11 @@ void GraphOptimizer::MergeConvertAndScaleShift(Graph& graph) { const auto parents = parentNode->parentEdges; for (size_t i = 0; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; if (!parentNode->childEdges[0].lock()) continue; @@ -688,8 +710,8 @@ void GraphOptimizer::FuseFCAndConvertOnWeights(Graph& graph) { return; #endif - // This optimization fuses Convert (fp16 -> bf16/fp32) on weights directly to FC input to allow precision conversion handling based on internal logic - // (e.g. fuse conversion with weights reordering) + // This optimization fuses Convert (fp16 -> bf16/fp32) on weights directly to FC input to allow precision conversion + // handling based on internal logic (e.g. fuse conversion with weights reordering) auto& graphNodes = graph.GetNodes(); for (const auto& fullyConnected : graphNodes) { if (fullyConnected->getType() != Type::FullyConnected) { @@ -722,14 +744,13 @@ void GraphOptimizer::FuseFCAndTransposeOnWeights(Graph& graph) { return; #endif - // This optimization allows us to avoid transposing the weights in Transpose node and do it directly along with reordering in FC node + // This optimization allows us to avoid transposing the weights in Transpose node and do it directly along with + // reordering in FC node auto& graphNodes = graph.GetNodes(); auto isSuitablePattern = [](NodePtr parent) { - bool res = true && parent->getType() == Type::Transpose - && parent->getChildEdges().size() == 1 - && parent->getChildEdgeAt(0)->getChild()->getType() == Type::FullyConnected - && parent->isConstant(); + bool res = true && parent->getType() == Type::Transpose && parent->getChildEdges().size() == 1 && + parent->getChildEdgeAt(0)->getChild()->getType() == Type::FullyConnected && parent->isConstant(); return res; }; @@ -744,7 +765,7 @@ void GraphOptimizer::FuseFCAndTransposeOnWeights(Graph& graph) { } } -void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { +void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableConvNode = [](NodePtr node) { @@ -777,9 +798,10 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { return false; // The plug-in doesn't support FP32 convolution with input/weights zero points. - // In case weights are in FP32 (or we have zero points on weights which are not supported by INT8 convolution) we cannot use - // INT8 implementation so we have to disable input zero points fusing as well. - if (parent1->getType() != Type::Input || !parent1->isConstant() || parent1->getOriginalOutputPrecisionAtPort(0) != ov::element::i8) { + // In case weights are in FP32 (or we have zero points on weights which are not supported by INT8 convolution) + // we cannot use INT8 implementation so we have to disable input zero points fusing as well. + if (parent1->getType() != Type::Input || !parent1->isConstant() || + parent1->getOriginalOutputPrecisionAtPort(0) != ov::element::i8) { return false; } @@ -827,7 +849,7 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { if (zeroPointsData == nullptr) OPENVINO_THROW("zeroPointsBlob has not allocated buffer"); - auto zeroPointDataSize = parent0->getInputShapeAtPort(1).getDims()[1]; + auto zeroPointDataSize = parent0->getInputShapeAtPort(1).getDims()[1]; if (Shape::UNDEFINED_DIM == zeroPointDataSize) { return false; } @@ -863,8 +885,10 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { auto OC = weightsConstantDims[0 + groupOffset]; auto IC = weightsConstantDims[1 + groupOffset]; - auto KD = weightsConstantDims.size() == (5 + groupOffset) ? weightsConstantDims[weightsConstantDims.size() - 3] : 1; - auto KH = weightsConstantDims.size() == (3 + groupOffset) ? 1 : weightsConstantDims[weightsConstantDims.size() - 2]; + auto KD = + weightsConstantDims.size() == (5 + groupOffset) ? weightsConstantDims[weightsConstantDims.size() - 3] : 1; + auto KH = + weightsConstantDims.size() == (3 + groupOffset) ? 1 : weightsConstantDims[weightsConstantDims.size() - 2]; auto KW = weightsConstantDims[weightsConstantDims.size() - 1]; for (size_t g = 0; g < G; g++) { @@ -874,20 +898,19 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { for (size_t kd = 0; kd < KD; kd++) { for (size_t kh = 0; kh < KH; kh++) { for (size_t kw = 0; kw < KW; kw++) { - size_t widx = g * OC * IC * KD * KH * KW + - oc * IC * KD * KH * KW + - ic * KD * KH * KW + - kd * KH * KW + - kh * KW + - kw; + size_t widx = g * OC * IC * KD * KH * KW + oc * IC * KD * KH * KW + ic * KD * KH * KW + + kd * KH * KW + kh * KW + kw; auto w = static_cast(weightsPtr[widx]); - auto izp = !convNode->legacyInputZeroPoints.empty() ? static_cast(convNode->legacyInputZeroPoints[g * IC + ic]) : 0; + auto izp = !convNode->legacyInputZeroPoints.empty() + ? static_cast(convNode->legacyInputZeroPoints[g * IC + ic]) + : 0; a += w * izp; - auto wzp = !convNode->legacyWeightsZeroPoints.empty() ? - static_cast(convNode->legacyWeightsZeroPoints[g * OC + oc]) : 0; + auto wzp = !convNode->legacyWeightsZeroPoints.empty() + ? static_cast(convNode->legacyWeightsZeroPoints[g * OC + oc]) + : 0; a -= wzp * izp; } } @@ -900,7 +923,8 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { for (size_t i = 0; i < graphNodes.size(); i++) { auto conv = graphNodes[i]; - if (!isSuitableConvNode(conv)) continue; + if (!isSuitableConvNode(conv)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseConvolutionAndZeroPoints_ConvNode); @@ -908,8 +932,10 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { auto weightsEltwise = conv->getParentEdgeAt(1)->getParent(); if (initializeInputZeroPoints(conv, dataEltwise, weightsEltwise)) { auto p_edge = dataEltwise->getParentEdgeAt(1); - DEBUG_LOG("[GraphOptimizer##FusingZeorPoint]:Eltwise Subtract Node ##", dataEltwise->getName(), - " is optimized as zeropoint of Conv ##", conv->getName()); + DEBUG_LOG("[GraphOptimizer##FusingZeorPoint]:Eltwise Subtract Node ##", + dataEltwise->getName(), + " is optimized as zeropoint of Conv ##", + conv->getName()); graph.RemoveEdge(p_edge); graph.DropNode(dataEltwise); initializeOutputCompensation(conv); @@ -917,7 +943,7 @@ void GraphOptimizer::FuseConvolutionAndZeroPoints(Graph &graph) { } } -void GraphOptimizer::FuseFullyConnectedAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseFullyConnectedAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -944,7 +970,7 @@ void GraphOptimizer::FuseFullyConnectedAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::FullyConnected) continue; @@ -957,7 +983,7 @@ void GraphOptimizer::FuseFullyConnectedAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseMatMulAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseMatMulAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSutableParentNode = [](const NodePtr& node) { @@ -984,7 +1010,7 @@ void GraphOptimizer::FuseMatMulAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::MatMul) continue; @@ -997,14 +1023,14 @@ void GraphOptimizer::FuseMatMulAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { +void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph& graph) { auto& graphNodes = graph.GetNodes(); - auto isConvolutionNode = [](const NodePtr &node) { + auto isConvolutionNode = [](const NodePtr& node) { return node->getType() == Type::Convolution; }; - auto is1x1Convolution = [](const std::shared_ptr &conv) { + auto is1x1Convolution = [](const std::shared_ptr& conv) { const auto weightRank = conv->getWeightDims().size(); return conv->getWeightDims()[weightRank - 1] == 1 && conv->getWeightDims()[weightRank - 2] == 1; }; @@ -1023,10 +1049,10 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { if (!conv->legacyWeightsZeroPoints.empty()) return false; - const auto &strides = conv->getStride(); - const auto &paddings = conv->getPaddingL(); - const auto &inDims = node->getInputShapeAtPort(0).getDims(); - const auto &outDims = node->getOutputShapeAtPort(0).getDims(); + const auto& strides = conv->getStride(); + const auto& paddings = conv->getPaddingL(); + const auto& inDims = node->getInputShapeAtPort(0).getDims(); + const auto& outDims = node->getOutputShapeAtPort(0).getDims(); bool isSupportedParams = conv->getGroupNum() == 1 && inDims.size() == 4 && dimsEqualStrong(inDims[inDims.size() - 1], outDims[outDims.size() - 1]) && @@ -1039,12 +1065,13 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { static_cast(paddings[paddings.size() - 1]), static_cast(paddings[paddings.size() - 2])) && !conv->canBeExecutedInInt8(); - if (!isSupportedParams) return false; + if (!isSupportedParams) + return false; return node->getChildEdges().size() == 1 && isConvolutionNode(node->getChildEdgeAt(0)->getChild()); }; - auto isSuitableChildConvolution = [&](const NodePtr &parentNode, const NodePtr &childNode) { + auto isSuitableChildConvolution = [&](const NodePtr& parentNode, const NodePtr& childNode) { if (parentNode->isDropped() || childNode->isDropped()) return false; @@ -1059,15 +1086,19 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { if (convParent == nullptr) OPENVINO_THROW("Cannot cast to convolution node ", parentNode->getName()); - if (!everyone_is(ov::element::f32, convParent->getOriginalOutputPrecisionAtPort(0), convChild->getOriginalInputPrecisionAtPort(0), - convChild->getOriginalOutputPrecisionAtPort(0))) + if (!everyone_is(ov::element::f32, + convParent->getOriginalOutputPrecisionAtPort(0), + convChild->getOriginalInputPrecisionAtPort(0), + convChild->getOriginalOutputPrecisionAtPort(0))) return false; - auto parentOutputPrecision = !parentNode->fusedWith.empty() + auto parentOutputPrecision = + !parentNode->fusedWith.empty() ? parentNode->fusedWith[parentNode->fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0) : parentNode->getOriginalOutputPrecisionAtPort(0); - auto childOutputPrecision = !childNode->fusedWith.empty() + auto childOutputPrecision = + !childNode->fusedWith.empty() ? childNode->fusedWith[childNode->fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0) : childNode->getOriginalOutputPrecisionAtPort(0); @@ -1103,7 +1134,7 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { return isSupportedParams; }; - auto isFusingWorthwhile = [&](const NodePtr &parentNode, const NodePtr &childNode) { + auto isFusingWorthwhile = [&](const NodePtr& parentNode, const NodePtr& childNode) { if (!childNode->inputShapes[0].isStatic() || !childNode->outputShapes[0].isStatic()) { return false; } @@ -1114,7 +1145,7 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { int L3_cache_size = dnnl::utils::get_cache_size(3, false); int dw_conv_input_size = inDims[0] * inDims[1] * inDims[2] * inDims[3] * elemSize; - int dw_conv_output_size = outDims[0] * outDims[1]* outDims[2] * outDims[3] * elemSize; + int dw_conv_output_size = outDims[0] * outDims[1] * outDims[2] * outDims[3] * elemSize; auto parentConvolutionNode = std::dynamic_pointer_cast(parentNode); if (parentConvolutionNode == nullptr) @@ -1127,19 +1158,23 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { }; for (size_t i = 0; i < graphNodes.size(); i++) { - if (!isConvolutionNode(graphNodes[i])) continue; + if (!isConvolutionNode(graphNodes[i])) + continue; auto parentConvNode = graphNodes[i]; - if (!isSuitableParentConvolution(parentConvNode)) continue; + if (!isSuitableParentConvolution(parentConvNode)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseConvolutionAndDWConvolution_ParentConv); auto childConvNode = parentConvNode->getChildEdgeAt(0)->getChild(); - if (!isSuitableChildConvolution(parentConvNode, childConvNode)) continue; + if (!isSuitableChildConvolution(parentConvNode, childConvNode)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseConvolutionAndDWConvolution_ChildConv); - if (!isFusingWorthwhile(parentConvNode, childConvNode)) continue; + if (!isFusingWorthwhile(parentConvNode, childConvNode)) + continue; parentConvNode->addFusedNode(childConvNode); @@ -1153,12 +1188,12 @@ void GraphOptimizer::FuseConvolutionAndDWConvolution(Graph &graph) { } // TODO [NM]: unite with FuseConvolutionAndSimpleOperation -void GraphOptimizer::FuseConvolutionAndSimpleOperationThroughMaxPool(Graph &graph) { +void GraphOptimizer::FuseConvolutionAndSimpleOperationThroughMaxPool(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { - return (node->getType() == Type::Convolution || node->getType() == Type::BinaryConvolution) && node->getChildEdges().size() == 1 && - node->getOriginalOutputPrecisionAtPort(0) == ov::element::f32; + return (node->getType() == Type::Convolution || node->getType() == Type::BinaryConvolution) && + node->getChildEdges().size() == 1 && node->getOriginalOutputPrecisionAtPort(0) == ov::element::f32; }; auto parent = graphNodes.begin(); @@ -1197,7 +1232,7 @@ void GraphOptimizer::FuseConvolutionAndSimpleOperationThroughMaxPool(Graph &grap parentNode->addFusedNode(fuseCandidate); parentNode->addOriginalLayer(fuseCandidate->getOriginalLayers()); auto parentEdges = fuseCandidate->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent() == childNode) continue; @@ -1208,11 +1243,12 @@ void GraphOptimizer::FuseConvolutionAndSimpleOperationThroughMaxPool(Graph &grap } } -void GraphOptimizer::FuseConvolutionAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseConvolutionAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { - return (node->getType() == Type::Convolution || node->getType() == Type::BinaryConvolution) && node->getChildEdges().size() == 1; + return (node->getType() == Type::Convolution || node->getType() == Type::BinaryConvolution) && + node->getChildEdges().size() == 1; }; auto parent = graphNodes.begin(); @@ -1237,7 +1273,7 @@ void GraphOptimizer::FuseConvolutionAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == parentNodeType) continue; @@ -1250,7 +1286,7 @@ void GraphOptimizer::FuseConvolutionAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FusePoolingAndFakeQuantize(Graph &graph) { +void GraphOptimizer::FusePoolingAndFakeQuantize(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1268,12 +1304,14 @@ void GraphOptimizer::FusePoolingAndFakeQuantize(Graph &graph) { for (size_t i = 0; i < graphNodes.size(); i++) { auto parent = graphNodes[i]; - if (!isSuitableParentNode(parent)) continue; + if (!isSuitableParentNode(parent)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FusePoolingAndFakeQuantize_ParentNode); auto child = parent->getChildEdgeAt(0)->getChild(); - if (!isSuitableChildNode(child)) continue; + if (!isSuitableChildNode(child)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FusePoolingAndFakeQuantize_ChildNode); @@ -1300,14 +1338,14 @@ void GraphOptimizer::FusePoolingAndFakeQuantize(Graph &graph) { * @param child node we try to find * @return True if child is one of data supplier */ -static bool is_data_dependency(const std::shared_ptr &parent, - const std::shared_ptr &child) { +static bool is_data_dependency(const std::shared_ptr& parent, const std::shared_ptr& child) { std::set visited; - std::list nextLayers {parent.get()}; + std::list nextLayers{parent.get()}; for (; !nextLayers.empty();) { auto layer = *nextLayers.begin(); - if (layer == child.get()) return true; + if (layer == child.get()) + return true; for (auto& oe : layer->getChildEdges()) { auto nn = oe.lock()->getChild(); if (visited.find(nn.get()) == visited.end()) { @@ -1358,19 +1396,18 @@ static bool is_data_dependency(const std::shared_ptr &parent, * *** */ -void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) { +void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph& graph) { #if !defined(OPENVINO_ARCH_X86) && !defined(OPENVINO_ARCH_X86_64) return; #endif - auto &graphNodes = graph.GetNodes(); + auto& graphNodes = graph.GetNodes(); auto isFusingSupported = [&](NodePtr conv, NodePtr child) { - return child->getType() == Type::Eltwise && - DnnlExtensionUtils::isUnarySupportedAsPostOp(child->getAlgorithm()); + return child->getType() == Type::Eltwise && DnnlExtensionUtils::isUnarySupportedAsPostOp(child->getAlgorithm()); }; - for (auto &graphNode : graphNodes) { + for (auto& graphNode : graphNodes) { const auto eltwiseNode = std::dynamic_pointer_cast(graphNode); if (graphNode->getType() != Type::Eltwise || graphNode->getAlgorithm() != Algorithm::EltwiseAdd || !eltwiseNode || eltwiseNode->isWithBroadcast()) @@ -1384,12 +1421,12 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) auto parent1 = graphNode->getParentEdgeAt(0)->getParent(); auto parent2 = graphNode->getParentEdgeAt(1)->getParent(); - bool isSuitableParent1 = parent1->getType() == Type::Convolution - || parent1->getType() == Type::BinaryConvolution; - bool isSuitableParent2 = parent2->getType() == Type::Convolution - || parent2->getType() == Type::BinaryConvolution; + bool isSuitableParent1 = + parent1->getType() == Type::Convolution || parent1->getType() == Type::BinaryConvolution; + bool isSuitableParent2 = + parent2->getType() == Type::Convolution || parent2->getType() == Type::BinaryConvolution; - auto canFuseSum = [](node::BinaryConvolution *binConv, NodePtr fuseCandidate) { + auto canFuseSum = [](node::BinaryConvolution* binConv, NodePtr fuseCandidate) { if (binConv->getImplType() == impl_desc_type::ref) return false; @@ -1408,12 +1445,12 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) return false; }; - auto* binConvNode1 = dynamic_cast(parent1.get()); + auto* binConvNode1 = dynamic_cast(parent1.get()); if (binConvNode1) { isSuitableParent1 = isSuitableParent1 && canFuseSum(binConvNode1, graphNode); } - auto* binConvNode2 = dynamic_cast(parent2.get()); + auto* binConvNode2 = dynamic_cast(parent2.get()); if (binConvNode2) { isSuitableParent2 = isSuitableParent2 && canFuseSum(binConvNode2, graphNode); } @@ -1427,7 +1464,7 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) return false; }; - auto* convNode1 = dynamic_cast(parent1.get()); + auto* convNode1 = dynamic_cast(parent1.get()); if (convNode1) { if (!convNode1->canBeExecutedInInt8()) { isSuitableParent1 = isSuitableParent1 && convNode1->getFusedWith().empty(); @@ -1436,7 +1473,7 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) } } - auto* convNode2 = dynamic_cast(parent2.get()); + auto* convNode2 = dynamic_cast(parent2.get()); if (convNode2) { if (!convNode2->canBeExecutedInInt8()) { isSuitableParent2 = isSuitableParent2 && convNode2->getFusedWith().empty(); @@ -1455,9 +1492,9 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) // not merged operation (peerNode) has to be in low precision const auto isBranchQuantized = [](const NodePtr& branchParent) { const auto& fused = branchParent->getFusedWith(); - const auto branchPrecision = fused.empty() ? - branchParent->getOriginalOutputPrecisionAtPort(0) : - fused[fused.size() - 1]->getOriginalOutputPrecisionAtPort(0); + const auto branchPrecision = fused.empty() + ? branchParent->getOriginalOutputPrecisionAtPort(0) + : fused[fused.size() - 1]->getOriginalOutputPrecisionAtPort(0); return (branchPrecision == ov::element::i8) || (branchPrecision == ov::element::u8); }; @@ -1527,15 +1564,16 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) // be overwritten. Should verify that all other consumer already read it and // we can spoil input data. // TODO: rewrite once we add "Inplace" reporting mechanism - for (auto & edge : peerNode->getChildEdges()) { + for (auto& edge : peerNode->getChildEdges()) { if (!fuse_allowed) break; fuse_allowed &= is_data_dependency(edge.lock()->getChild(), sum); } - if (!fuse_allowed) continue; + if (!fuse_allowed) + continue; if (graphNode->getChildEdges().size() == 1 && - isFusingSupported(graphNode, graphNode->getChildEdgeAt(0)->getChild())) { + isFusingSupported(graphNode, graphNode->getChildEdgeAt(0)->getChild())) { auto relu_shared = graphNode->getChildEdgeAt(0)->getChild(); lastNode = relu_shared; if (mergedConv->isConstant() && !lastNode->isConstant()) @@ -1545,8 +1583,8 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) lastNode->fuseInto(mergedConv); - if (mergedConv->fusedWith.size() > 0 && - (mergedConv->fusedWith[0]->getType() == Type::Convolution || mergedConv->fusedWith[0]->getType() == Type::BinaryConvolution)) { + if (mergedConv->fusedWith.size() > 0 && (mergedConv->fusedWith[0]->getType() == Type::Convolution || + mergedConv->fusedWith[0]->getType() == Type::BinaryConvolution)) { // Merged with DW_conv. Shape may change mergedConv->inputShapes.push_back(mergedConv->fusedWith[0]->getOutputShapeAtPort(0)); } else { @@ -1577,7 +1615,7 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) graph.CreateEdge(peerNode, mergedConv, peer_port, childPort); std::vector edges_to_reconnect = lastNode->getChildEdges(); - for (auto &edge_w : edges_to_reconnect) { + for (auto& edge_w : edges_to_reconnect) { auto edge = edge_w.lock(); auto child = edge->getChild(); int idxParent = edge->getInputNum(); @@ -1597,7 +1635,7 @@ void GraphOptimizer::FuseConvolutionSumAndConvolutionSumActivation(Graph &graph) } } -void GraphOptimizer::FuseMVNAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseMVNAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1624,7 +1662,7 @@ void GraphOptimizer::FuseMVNAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::MVN) continue; @@ -1637,7 +1675,7 @@ void GraphOptimizer::FuseMVNAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseInterpolateAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseInterpolateAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1646,8 +1684,8 @@ void GraphOptimizer::FuseInterpolateAndSimpleOperation(Graph &graph) { auto isSuitableChildNode = [&](NodePtr parentNode, NodePtr childNode) { // Avoid cycle dependencies - for (auto &childParentEdge : childNode->getParentEdges()) { - for (auto &parentParentEdge : parentNode->getParentEdges()) { + for (auto& childParentEdge : childNode->getParentEdges()) { + for (auto& parentParentEdge : parentNode->getParentEdges()) { if (childParentEdge.lock()->getParent() == parentParentEdge.lock()->getParent()) return false; } @@ -1683,7 +1721,7 @@ void GraphOptimizer::FuseInterpolateAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::Interpolate) continue; @@ -1696,7 +1734,7 @@ void GraphOptimizer::FuseInterpolateAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseNormalizeL2AndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseNormalizeL2AndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1723,7 +1761,7 @@ void GraphOptimizer::FuseNormalizeL2AndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::NormalizeL2) continue; @@ -1736,7 +1774,7 @@ void GraphOptimizer::FuseNormalizeL2AndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseReduceAndSimpleOperation(Graph &graph) { +void GraphOptimizer::FuseReduceAndSimpleOperation(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1763,7 +1801,7 @@ void GraphOptimizer::FuseReduceAndSimpleOperation(Graph &graph) { if (childNode->getType() == Type::FakeQuantize || childNode->getType() == Type::Eltwise) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge == nullptr) OPENVINO_THROW("Cannot get parent edge ", childNode->getName()); @@ -1778,7 +1816,7 @@ void GraphOptimizer::FuseReduceAndSimpleOperation(Graph &graph) { } } -void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { +void GraphOptimizer::FuseEltwiseAndSimple(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { @@ -1788,14 +1826,14 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { auto isSuitableChildNode = [&](NodePtr parentNode, NodePtr childNode) { if (parentNode->isConstant() && !childNode->isConstant()) return false; - for (auto &childParentEdge : childNode->getParentEdges()) { + for (auto& childParentEdge : childNode->getParentEdges()) { // WA to prevent unsupported reorder exception issue in some cases if (childParentEdge.lock()->getParent()->getType() == Type::Split) { return false; } // Avoid cycle dependencies - for (auto &parentParentEdge : parentNode->getParentEdges()) { + for (auto& parentParentEdge : parentNode->getParentEdges()) { if (childParentEdge.lock()->getParent() == parentParentEdge.lock()->getParent()) return false; } @@ -1819,7 +1857,8 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { auto childNode = parentNode->getChildEdgeAt(0)->getChild(); - if ((parentNode->isDynamicNode() && !childNode->isDynamicNode()) || (!parentNode->isDynamicNode() && childNode->isDynamicNode())) { + if ((parentNode->isDynamicNode() && !childNode->isDynamicNode()) || + (!parentNode->isDynamicNode() && childNode->isDynamicNode())) { parent++; continue; } @@ -1835,7 +1874,7 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { if (childNode->getType() == Type::FakeQuantize) { auto parentEdges = childNode->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (p_edge->getParent()->getType() == Type::Eltwise) continue; @@ -1851,9 +1890,11 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { for (size_t i = 0; i < parents.size(); i++) { auto p_edge = parents[i].lock(); - if (!p_edge) continue; + if (!p_edge) + continue; auto parent = p_edge->getParent(); - if (!parent) continue; + if (!parent) + continue; if (parent == parentNode) { for (size_t j = 0; j < children.size(); j++) { @@ -1863,7 +1904,7 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { if (!child) continue; - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; if (remEdge) { inNum = remEdge->getInputNum(); @@ -1879,7 +1920,7 @@ void GraphOptimizer::FuseEltwiseAndSimple(Graph &graph) { graph.CreateEdge(parent, child, inNum, outNum); } } else { - EdgePtr &remEdge = p_edge; + EdgePtr& remEdge = p_edge; int inNum = 0; int outNum = parentNode->getParentEdges().size(); if (remEdge) { @@ -1970,15 +2011,14 @@ void GraphOptimizer::ShareReorders(Graph& graph) { } } -void GraphOptimizer::DropDoubleReorders(Graph &graph) { +void GraphOptimizer::DropDoubleReorders(Graph& graph) { std::set processed; auto& nodes = graph.GetNodes(); for (size_t i = 0; i < nodes.size(); i++) { auto node = nodes[i]; - if (processed.find(node) == processed.end() && node->getType() == Type::Reorder - && node->getChildEdges().size() == 1 - && node->getChildEdgeAt(0)->getChild()->getType() == Type::Reorder ) { + if (processed.find(node) == processed.end() && node->getType() == Type::Reorder && + node->getChildEdges().size() == 1 && node->getChildEdgeAt(0)->getChild()->getType() == Type::Reorder) { auto nextNode = node->getChildEdgeAt(0)->getChild(); Reorder* n = dynamic_cast(node.get()); if (n == nullptr) @@ -2003,7 +2043,8 @@ void GraphOptimizer::DropDoubleReorders(Graph &graph) { if (cur->getChild() == c) edge = cur; } - if (!edge) OPENVINO_THROW("Inappropriate graph processing"); + if (!edge) + OPENVINO_THROW("Inappropriate graph processing"); std::string layerName = edge->getParent()->getName() + "_ScaleReorder_" + edge->getChild()->getName(); graph.InsertReorder(edge, layerName, n->getInput(), nn->getOutput(), false); @@ -2012,11 +2053,12 @@ void GraphOptimizer::DropDoubleReorders(Graph &graph) { } } -void GraphOptimizer::FuseClampAndFakeQuantize(Graph &graph) { +void GraphOptimizer::FuseClampAndFakeQuantize(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableClampNode = [](NodePtr node) { - return node->getType() == Type::Eltwise && node->getChildEdges().size() == 1 && node->getAlgorithm() == Algorithm::EltwiseClamp; + return node->getType() == Type::Eltwise && node->getChildEdges().size() == 1 && + node->getAlgorithm() == Algorithm::EltwiseClamp; }; auto isSuitableFakeQuantizeNode = [](NodePtr node) { @@ -2024,7 +2066,7 @@ void GraphOptimizer::FuseClampAndFakeQuantize(Graph &graph) { }; auto fuseClampAndFakeQuantizeNodes = [](NodePtr parent, NodePtr child) { - auto* eltwiseNode = dynamic_cast(parent.get()); + auto* eltwiseNode = dynamic_cast(parent.get()); if (eltwiseNode == nullptr) OPENVINO_THROW("Cannot cast ", parent->getName(), " to Eltwise node"); @@ -2050,12 +2092,14 @@ void GraphOptimizer::FuseClampAndFakeQuantize(Graph &graph) { for (size_t i = 0; i < graphNodes.size(); i++) { auto parent = graphNodes[i]; - if (!isSuitableClampNode(parent)) continue; + if (!isSuitableClampNode(parent)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseClampAndFakeQuantize_ClalmpNode); auto child = parent->getChildEdgeAt(0)->getChild(); - if (!isSuitableFakeQuantizeNode(child)) continue; + if (!isSuitableFakeQuantizeNode(child)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FuseClampAndFakeQuantize_QuantizeNode); @@ -2065,7 +2109,7 @@ void GraphOptimizer::FuseClampAndFakeQuantize(Graph &graph) { } } -void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph) { +void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto getNonConstPort = [](const NodePtr& node) { @@ -2083,11 +2127,12 @@ void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph) { }; auto isSuitableScaleShiftNode = [getNonConstPort](const NodePtr& node) { - if (!one_of(node->getAlgorithm(), Algorithm::EltwiseAdd, - Algorithm::EltwiseSubtract, - Algorithm::EltwiseMultiply, - Algorithm::EltwiseDivide, - Algorithm::EltwiseMulAdd)) + if (!one_of(node->getAlgorithm(), + Algorithm::EltwiseAdd, + Algorithm::EltwiseSubtract, + Algorithm::EltwiseMultiply, + Algorithm::EltwiseDivide, + Algorithm::EltwiseMulAdd)) return false; const auto nonConstPort = getNonConstPort(node); @@ -2117,7 +2162,7 @@ void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph) { const NodePtr eltwiseInput = parentEltwise->getParentEdgeAt(getNonConstPort(parent))->getParent(); std::tie(scalesBuffer, shiftsBuffer) = parentEltwise->getScalesAndShifts(eltwiseInput.get()); - const auto &outputShape = child->getOutputShapeAtPort(0); + const auto& outputShape = child->getOutputShapeAtPort(0); VectorDims outputDims = outputShape.getDims(); // We need to compute explicitly port with unfolded parent, @@ -2178,7 +2223,7 @@ void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph) { std::vector zeroShift(newInputScale.size(), 0.f); const auto isSubnormal = [](const float value) { - const uint32_t *u32data = reinterpret_cast(&value); + const uint32_t* u32data = reinterpret_cast(&value); return (*u32data) && (((*u32data) & (0xFF << 23)) == 0); }; @@ -2220,18 +2265,20 @@ void GraphOptimizer::FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph) { for (size_t i = 0; i < graphNodes.size(); i++) { auto parent = graphNodes[i]; - if (!isSuitableScaleShiftNode(parent)) continue; + if (!isSuitableScaleShiftNode(parent)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FusePerformedAsScaleShiftAndFakeQuantize_ShiftNode); auto child = parent->getChildEdgeAt(0)->getChild(); - if (!isSuitableFakeQuantizeNode(child)) continue; + if (!isSuitableFakeQuantizeNode(child)) + continue; CPU_GRAPH_OPTIMIZER_SCOPE(FusePerformedAsScaleShiftAndFakeQuantize_QuantizeNode); if (fuseScaleShiftAndFakeQuantizeNodes(parent, child)) { auto parentEdges = parent->parentEdges; - for (auto &parentEdge : parentEdges) { + for (auto& parentEdge : parentEdges) { auto p_edge = parentEdge.lock(); if (!p_edge->getParent()->isConstant()) continue; @@ -2355,7 +2402,12 @@ void GraphOptimizer::mergeTransposeReshapeReorder(Graph& graph, transposeNode->getName(), " is not a transpose node"); - const auto& inOrder = transposeNode->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->as()->getOrder(); + const auto& inOrder = transposeNode->getSelectedPrimitiveDescriptor() + ->getConfig() + .inConfs[0] + .getMemDesc() + ->as() + ->getOrder(); const auto& outOrder = reorderOutDesc->as()->getOrder(); // Permutation must be set and reorder mustn't be optimized in 2 cases: // 1. Transpose has blocked input & non-blocked output @@ -2371,11 +2423,13 @@ void GraphOptimizer::mergeTransposeReshapeReorder(Graph& graph, } } - std::string reorderName = nodeBeforeSequence->getName() + "_" + Reorder::getReorderArgs(*reorderInDesc, *reorderOutDesc); + std::string reorderName = + nodeBeforeSequence->getName() + "_" + Reorder::getReorderArgs(*reorderInDesc, *reorderOutDesc); if (isOptimized) - reorderName += "_fake"; + reorderName += "_fake"; DEBUG_LOG("mergeTransposeAndReorder ", parentNode->getName(), " and ", childNode->getName(), " -> ", reorderName); - auto reorder_layout = std::make_shared(*reorderInDesc, *reorderOutDesc, reorderName, graph.getGraphContext()); + auto reorder_layout = + std::make_shared(*reorderInDesc, *reorderOutDesc, reorderName, graph.getGraphContext()); reorder_layout->setOptimized(isOptimized); reorder_layout->setSrcPermutation(srcPerm); @@ -2388,10 +2442,8 @@ void GraphOptimizer::mergeTransposeReshapeReorder(Graph& graph, Reorder::getReorderArgs(*reorderOutDesc, *finalDesc) + "_" + nodeAfterSequence->getName(); - reorder_last = std::make_shared(*reorderOutDesc, - *finalDesc, - reorderLayerName2, - graph.getGraphContext()); + reorder_last = + std::make_shared(*reorderOutDesc, *finalDesc, reorderLayerName2, graph.getGraphContext()); reorder_last->setOptimized(false); reorder_last->setSrcPermutation(srcPerm); graph.CreateEdge(reorder_layout, reorder_last, 0, 0); @@ -2445,10 +2497,10 @@ void GraphOptimizer::MergeTransposeAndReorder(Graph& graph) { return false; }; - return node->getType() == Type::Transpose - && node->getChildEdges().size() == 1 - && !node->isDynamicNode() // TODO [DS]: enable for dynamic shapes when inPlace in the dynamic case is available (CVS-74863) - && !prevNodeIsConvSum(node); + return node->getType() == Type::Transpose && node->getChildEdges().size() == 1 && + !node->isDynamicNode() // TODO [DS]: enable for dynamic shapes when inPlace in the dynamic case is + // available (CVS-74863) + && !prevNodeIsConvSum(node); }; auto isSuitableReshape = [](NodePtr node) { @@ -2473,8 +2525,9 @@ void GraphOptimizer::MergeTransposeAndReorder(Graph& graph) { }; auto isSuitableReorder = [](NodePtr node) { - return node->getType() == Type::Reorder - && !node->isDynamicNode(); // TODO [DS]: enable for dynamic shapes when inPlace in the dynamic case is available (CVS-74863) + return node->getType() == Type::Reorder && + !node->isDynamicNode(); // TODO [DS]: enable for dynamic shapes when inPlace in the dynamic case is + // available (CVS-74863) }; auto updateOrder = [](const VectorDims& originalOrder, NodePtr reshape) { @@ -2542,17 +2595,28 @@ void GraphOptimizer::MergeTransposeAndReorder(Graph& graph) { const auto transposeNode = std::dynamic_pointer_cast(parentNode); const auto reorderNode = std::dynamic_pointer_cast(childNode); - std::shared_ptr reshapeNode = intermNode != nullptr ? std::dynamic_pointer_cast(intermNode) : nullptr; + std::shared_ptr reshapeNode = + intermNode != nullptr ? std::dynamic_pointer_cast(intermNode) : nullptr; if (!transposeNode || !reorderNode || (intermNode && !reshapeNode)) { continue; } auto transposeOrder = updateOrder(transposeNode->getOrder(), reshapeNode); - auto descBeforeReorder = reorderNode->getParentEdgeAt(0)->getParent()->getSelectedPrimitiveDescriptor()->getConfig().outConfs[0].getMemDesc(); + auto descBeforeReorder = reorderNode->getParentEdgeAt(0) + ->getParent() + ->getSelectedPrimitiveDescriptor() + ->getConfig() + .outConfs[0] + .getMemDesc(); auto layoutOrder = descBeforeReorder->as()->getOrder(); - auto inBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->as(); - auto outBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor()->getConfig().outConfs[0].getMemDesc()->as(); + auto inBlockedDesc = + reorderNode->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->as(); + auto outBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor() + ->getConfig() + .outConfs[0] + .getMemDesc() + ->as(); auto& inOrder = inBlockedDesc->getOrder(); auto& outOrder = outBlockedDesc->getOrder(); @@ -2563,13 +2627,11 @@ void GraphOptimizer::MergeTransposeAndReorder(Graph& graph) { } } -void GraphOptimizer::MergeReorderAndTranspose(Graph &graph) { +void GraphOptimizer::MergeReorderAndTranspose(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableTranspose = [](NodePtr node) { - return node->getType() == Type::Transpose - && node->getChildEdges().size() == 1 - && !node->isDynamicNode(); + return node->getType() == Type::Transpose && node->getChildEdges().size() == 1 && !node->isDynamicNode(); }; auto isSuitableReshape = [](NodePtr node) { @@ -2659,7 +2721,8 @@ void GraphOptimizer::MergeReorderAndTranspose(Graph &graph) { auto transposeNode = std::dynamic_pointer_cast(childNode); auto reorderNode = std::dynamic_pointer_cast(parentNode); - std::shared_ptr reshapeNode = intermNode != nullptr ? std::dynamic_pointer_cast(intermNode) : nullptr; + std::shared_ptr reshapeNode = + intermNode != nullptr ? std::dynamic_pointer_cast(intermNode) : nullptr; if (!transposeNode || !reorderNode || (intermNode && !reshapeNode)) { continue; } @@ -2668,15 +2731,20 @@ void GraphOptimizer::MergeReorderAndTranspose(Graph &graph) { auto descAfterTranspose = transposeNode->getSelectedPrimitiveDescriptor()->getConfig().outConfs[0].getMemDesc(); auto layoutOrder = updateOrder(descAfterTranspose->as()->getOrder(), reshapeNode); - auto inBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->as(); - auto outBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor()->getConfig().outConfs[0].getMemDesc()->as(); + auto inBlockedDesc = + reorderNode->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->as(); + auto outBlockedDesc = reorderNode->getSelectedPrimitiveDescriptor() + ->getConfig() + .outConfs[0] + .getMemDesc() + ->as(); auto& inOrder = inBlockedDesc->getOrder(); auto& outOrder = outBlockedDesc->getOrder(); if (checkAscendingFinalOrder(transposeOrder, layoutOrder, inOrder, outOrder)) { - // Reorder node doesn't support (with rare exceptions) reordering in case of different ranks on input and output. - // So the merge can be performed only in the case when the fused reorder will be optimized. + // Reorder node doesn't support (with rare exceptions) reordering in case of different ranks on input and + // output. So the merge can be performed only in the case when the fused reorder will be optimized. if (parentNode->getInputShapeAtPort(0).getRank() != childNode->getOutputShapeAtPort(0).getRank() && !canBeInplaced(parentNode, childNode)) { continue; @@ -2686,14 +2754,15 @@ void GraphOptimizer::MergeReorderAndTranspose(Graph &graph) { } } -void GraphOptimizer::reshapeRnnSeq(Graph &graph) { +void GraphOptimizer::reshapeRnnSeq(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableParentNode = [](NodePtr node) { if (node->type != Type::RNNSeq) return false; auto rnnNode = std::dynamic_pointer_cast(node); - return rnnNode && !rnnNode->hasNativeOrder() && node->outputShapes[0].getRank() == 4 && node->outputShapes[0].getDims()[1] == 1; + return rnnNode && !rnnNode->hasNativeOrder() && node->outputShapes[0].getRank() == 4 && + node->outputShapes[0].getDims()[1] == 1; }; for (size_t i = 0; i < graphNodes.size(); i++) { @@ -2715,10 +2784,12 @@ void GraphOptimizer::reshapeRnnSeq(Graph &graph) { auto edge = childrenEdges[j]; auto childNode = edge->getChild(); - const auto secondInput = std::make_shared(ov::element::i32, ov::Shape{1}, std::vector{1}); + const auto secondInput = + std::make_shared(ov::element::i32, ov::Shape{1}, std::vector{1}); const auto unsqueeze = std::make_shared( std::make_shared(parentNode->getOriginalOutputPrecisionAtPort(0), - parentNode->getOutputShapeAtPort(0).toPartialShape()), secondInput); + parentNode->getOutputShapeAtPort(0).toPartialShape()), + secondInput); unsqueeze->set_friendly_name(parentNode->getName() + "_abc_a1bc_" + std::to_string(j)); const auto cpuUnsqueeze = std::make_shared(unsqueeze, graph.getGraphContext()); @@ -2758,7 +2829,7 @@ void GraphOptimizer::RemoveSameConvert(Graph& graph) { } } -void GraphOptimizer::RemoveMemoryInputConvert(Graph &graph) { +void GraphOptimizer::RemoveMemoryInputConvert(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableNode = [](const NodePtr& node) { @@ -2784,7 +2855,7 @@ void GraphOptimizer::RemoveMemoryInputConvert(Graph &graph) { } } -void GraphOptimizer::RemoveConvertMemoryOutput(Graph &graph) { +void GraphOptimizer::RemoveConvertMemoryOutput(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableNode = [](const NodePtr& node) { @@ -2812,7 +2883,7 @@ void GraphOptimizer::RemoveConvertMemoryOutput(Graph &graph) { } } -void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { +void GraphOptimizer::MatchSdpaKvCache(Graph& graph) { auto& graphNodes = graph.GetNodes(); auto isSuitableMemInput = [](const NodePtr& node) -> bool { @@ -2829,7 +2900,7 @@ void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { if (Type::ScaledDotProductAttention == childNode->getType()) { if (childSdpa && childSdpa != childNode) { - //only one child SDPA supported + // only one child SDPA supported return false; } childSdpa = childNode; @@ -2872,7 +2943,7 @@ void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { input_prc = ov::optional(node->getOriginalInputPrecisionAtPort(0)); } - //search for SDPA + // search for SDPA std::shared_ptr sdpa; for (auto&& edge : node->getChildEdgesAtPort(0)) { auto child = edge->getChild(); @@ -2886,19 +2957,18 @@ void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { } } - //capture reference to the original mem output before graph transformations + // capture reference to the original mem output before graph transformations auto& memOutput = memInputNode->getOutputNode(); - auto memInputSdpa = std::make_shared( - memInputNode->getId(), - memInputNode->getName(), - memInputNode->getTypeStr(), - memInputNode->getOutputShapeAtPort(0), - memInputNode->getOriginalOutputPrecisionAtPort(0), - graph.getGraphContext(), - input_shape, - input_prc, - sdpa); + auto memInputSdpa = std::make_shared(memInputNode->getId(), + memInputNode->getName(), + memInputNode->getTypeStr(), + memInputNode->getOutputShapeAtPort(0), + memInputNode->getOriginalOutputPrecisionAtPort(0), + graph.getGraphContext(), + input_shape, + input_prc, + sdpa); if (!memInputNode->getParentEdges().empty()) { auto parentEdge = memInputNode->getParentEdgeAt(0); @@ -2915,14 +2985,13 @@ void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { graph.CreateEdge(memInputSdpa, child, 0, outputNum); } - //create a stub memory output - auto memOutputStub = std::make_shared( - memOutput.getId(), - memOutput.getName(), - memOutput.getTypeStr(), - memOutput.getInputShapeAtPort(0), - memOutput.getOriginalInputPrecisionAtPort(0), - graph.getGraphContext()); + // create a stub memory output + auto memOutputStub = std::make_shared(memOutput.getId(), + memOutput.getName(), + memOutput.getTypeStr(), + memOutput.getInputShapeAtPort(0), + memOutput.getOriginalInputPrecisionAtPort(0), + graph.getGraphContext()); auto memOutputEdge = memOutput.getParentEdgeAt(0); const auto inputNum = memOutputEdge->getInputNum(); @@ -2934,7 +3003,7 @@ void GraphOptimizer::MatchSdpaKvCache(Graph &graph) { } } -void GraphOptimizer::DropRedundantMemoryOutput(Graph &graph) { +void GraphOptimizer::DropRedundantMemoryOutput(Graph& graph) { // When we have a MemoryInput->MemoryOutput pair, that means that the state is immediately populated with the init // subgraph values when the init subgraph exists. In all the other cases the state is simply a read only object. // We can optimize such a case removing the MemoryOutput node and transferring the state values update @@ -2975,7 +3044,7 @@ void GraphOptimizer::DropRedundantMemoryOutput(Graph &graph) { } if (MemoryOutput && MemoryOutput != childNode) { - //only one child MemoryOutput is expected + // only one child MemoryOutput is expected return false; } MemoryOutput = childNode; @@ -3003,7 +3072,7 @@ void GraphOptimizer::DropRedundantMemoryOutput(Graph &graph) { inputPrc = ov::optional(node->getOriginalInputPrecisionAtPort(0)); } - //search for the MemoryOutputNode + // search for the MemoryOutputNode NodePtr memoryOutputNode; for (auto&& edge : node->getChildEdgesAtPort(0)) { auto child = edge->getChild(); @@ -3046,5 +3115,5 @@ void GraphOptimizer::DropRedundantMemoryOutput(Graph &graph) { } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/graph_optimizer.h b/src/plugins/intel_cpu/src/graph_optimizer.h index 536ef468a09816..90cf9c41c0907e 100644 --- a/src/plugins/intel_cpu/src/graph_optimizer.h +++ b/src/plugins/intel_cpu/src/graph_optimizer.h @@ -16,42 +16,42 @@ class GraphOptimizer { public: void ApplyCommonGraphOptimizations(Graph& graph); void ApplyImplSpecificGraphOptimizations(Graph& graph); - void ShareReorders(Graph &graph); + void ShareReorders(Graph& graph); private: - void FuseConvMatmulFCDeconvAndDQScales(Graph &graph); - void FuseConvolutionMatMulDeconvAndBias(Graph &graph); - void FuseDeconvolutionAndSimpleOperation(Graph &graph); - void FuseMultiplyAndAdd(Graph &graph); + void FuseConvMatmulFCDeconvAndDQScales(Graph& graph); + void FuseConvolutionMatMulDeconvAndBias(Graph& graph); + void FuseDeconvolutionAndSimpleOperation(Graph& graph); + void FuseMultiplyAndAdd(Graph& graph); void MergeConvertAndScaleShift(Graph& graph); void FuseFCAndConvertOnWeights(Graph& graph); void FuseFCAndTransposeOnWeights(Graph& graph); - void FuseFullyConnectedAndSimpleOperation(Graph &graph); - void FuseMatMulAndSimpleOperation(Graph &graph); - void FuseConvolutionAndSimpleOperationThroughMaxPool(Graph &graph); - void FuseConvolutionAndSimpleOperation(Graph &graph); - void FuseConvolutionAndDWConvolution(Graph &graph); - void FusePoolingAndFakeQuantize(Graph &graph); - void FuseConvolutionSumAndConvolutionSumActivation(Graph &graph); - void FuseMVNAndSimpleOperation(Graph &graph); - void FuseInterpolateAndSimpleOperation(Graph &graph); - void FuseNormalizeL2AndSimpleOperation(Graph &graph); - void FuseReduceAndSimpleOperation(Graph &graph); + void FuseFullyConnectedAndSimpleOperation(Graph& graph); + void FuseMatMulAndSimpleOperation(Graph& graph); + void FuseConvolutionAndSimpleOperationThroughMaxPool(Graph& graph); + void FuseConvolutionAndSimpleOperation(Graph& graph); + void FuseConvolutionAndDWConvolution(Graph& graph); + void FusePoolingAndFakeQuantize(Graph& graph); + void FuseConvolutionSumAndConvolutionSumActivation(Graph& graph); + void FuseMVNAndSimpleOperation(Graph& graph); + void FuseInterpolateAndSimpleOperation(Graph& graph); + void FuseNormalizeL2AndSimpleOperation(Graph& graph); + void FuseReduceAndSimpleOperation(Graph& graph); void DropDoubleReorders(Graph& graph); - void FuseConvolutionAndZeroPoints(Graph &graph); - void FuseBroadcastAndEltwise(Graph &graph); - void FuseEltwiseAndSimple(Graph &graph); - void FusePerformedAsScaleShiftAndFakeQuantize(Graph &graph); - void FuseClampAndFakeQuantize(Graph &graph); - void MergeTransposeAndReorder(Graph &graph); - void MergeReorderAndTranspose(Graph &graph); - void reshapeRnnSeq(Graph &graph); - void RemoveSameConvert(Graph &graph); - void RemoveMemoryInputConvert(Graph &graph); - void RemoveConvertMemoryOutput(Graph &graph); - void MatchSdpaKvCache(Graph &graph); - void DropRedundantMemoryOutput(Graph &graph); + void FuseConvolutionAndZeroPoints(Graph& graph); + void FuseBroadcastAndEltwise(Graph& graph); + void FuseEltwiseAndSimple(Graph& graph); + void FusePerformedAsScaleShiftAndFakeQuantize(Graph& graph); + void FuseClampAndFakeQuantize(Graph& graph); + void MergeTransposeAndReorder(Graph& graph); + void MergeReorderAndTranspose(Graph& graph); + void reshapeRnnSeq(Graph& graph); + void RemoveSameConvert(Graph& graph); + void RemoveMemoryInputConvert(Graph& graph); + void RemoveConvertMemoryOutput(Graph& graph); + void MatchSdpaKvCache(Graph& graph); + void DropRedundantMemoryOutput(Graph& graph); bool canBeInplaced(const NodePtr& parentNode, const NodePtr& childNode); // Method checks that after the sequential execution of Transpose and Reorder nodes, @@ -68,19 +68,22 @@ class GraphOptimizer { // Examples: // 1. Direct order, no Reshape node. // Before: [N,C,H,W]abcd==>Transpose(0312)==>[N,W,C,H]abcd==>Reorder(abcd->acdb)==>[N,W,C,H]acdb - // [N,C,H,W]abcd is equivalent to the [N,W,C,H]acdb, so the Transpose and Reorder can be fused into single optimized Reorder: - // After: [N,C,H,W]abcd==>Reorder(abcd->acdb, isOptimized=true)==>[N,W,C,H]acdb + // [N,C,H,W]abcd is equivalent to the [N,W,C,H]acdb, so the Transpose and Reorder can be fused into single + // optimized Reorder: After: [N,C,H,W]abcd==>Reorder(abcd->acdb, isOptimized=true)==>[N,W,C,H]acdb // 2. Reverse order, no Reshape node. // Before: [N,W,C,H]acdb==>Reorder(acdb->abcd)==>[N,W,C,H]abcd==>Transpose(0231)==>[N,C,H,W]abcd - // [N,W,C,H]acdb is equivalent to the [N,C,H,W]abcd, so the Transpose and Reorder can be fused into single optimized Reorder: - // After: [N,W,C,H]acdb==>Reorder(acdb->abcd, isOptimized=true)==>[N,C,H,W]abcd + // [N,W,C,H]acdb is equivalent to the [N,C,H,W]abcd, so the Transpose and Reorder can be fused into single + // optimized Reorder: After: [N,W,C,H]acdb==>Reorder(acdb->abcd, isOptimized=true)==>[N,C,H,W]abcd // 3. Direct order with Reshape node (L = H x w). - // Before: [N,L,C]abc==>Transpose(021)==>[N,C,L]abc==>Reshape==>[N,C,H,W]abcd==>Reoder(abcd->acdb)==>[N,C,H,W]acdb - // After: [N,L,C]abc==>Reorder(abc->acdb, isOptimized=true)==>[N,C,H,W]acdb + // Before: + // [N,L,C]abc==>Transpose(021)==>[N,C,L]abc==>Reshape==>[N,C,H,W]abcd==>Reoder(abcd->acdb)==>[N,C,H,W]acdb After: + // [N,L,C]abc==>Reorder(abc->acdb, isOptimized=true)==>[N,C,H,W]acdb // 4. Reverse order with Reshape node (L = H x W). - // Before: [N,C,H,W]acdb==>Reorder(acdb->abcd)==>[N,C,H,W]abcd==>Reshape==>[N,C,L]abc==>Transpose(021)==>[N,L,C]abc + // Before: + // [N,C,H,W]acdb==>Reorder(acdb->abcd)==>[N,C,H,W]abcd==>Reshape==>[N,C,L]abc==>Transpose(021)==>[N,L,C]abc // After: [N,C,H,W]acdb==>Reorder(acdb->abc, isOptimized=true)==>[N,L,C]abc - // Note: in some cases (inplace conflicts or transpose with blocked input and non-blocked output) the merged Reorder can not be optimized. + // Note: in some cases (inplace conflicts or transpose with blocked input and non-blocked output) the merged Reorder + // can not be optimized. void mergeTransposeReshapeReorder(Graph& graph, const NodePtr& transposeNode, const NodePtr& reshapeNode, @@ -88,5 +91,5 @@ class GraphOptimizer { const bool reverseOrder); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/infer_request.cpp b/src/plugins/intel_cpu/src/infer_request.cpp index 26cdaf0860168a..3cfc34589623d2 100644 --- a/src/plugins/intel_cpu/src/infer_request.cpp +++ b/src/plugins/intel_cpu/src/infer_request.cpp @@ -8,17 +8,17 @@ #include "compiled_model.h" #include "dnnl_extension_utils.h" #include "itt.h" +#include "memory_desc/cpu_memory_desc_utils.h" #include "memory_state.h" #include "nodes/common/cpu_convert.h" -#include "memory_desc/cpu_memory_desc_utils.h" #include "nodes/memory_state_base.h" #include "openvino/core/shape.hpp" #include "openvino/runtime/make_tensor.hpp" #include "openvino/runtime/tensor.hpp" +#include "openvino/runtime/threading/cpu_message.hpp" #include "proxy_mem_blk.h" #include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" -#include "openvino/runtime/threading/cpu_message.hpp" using OvString = ov::element_type_traits::value_type; @@ -56,7 +56,7 @@ void SyncInferRequest::create_infer_request() { init_tensor(it.first, ov::ISyncInferRequest::FoundPort::Type::OUTPUT); } - //create states according to the list of the MemoryStateNodes + // create states according to the list of the MemoryStateNodes for (auto&& node : m_graph->getInternalStateNodes()) { m_memory_states.emplace_back(node.second->makeState()); } @@ -162,7 +162,7 @@ static inline void change_edge_ptr(const EdgePtr& edge, ov::SoPtr& OPENVINO_ASSERT(mem != nullptr, "Edge with name '", *edge, "' doesn't have allocated memory object."); if (tensor->get_element_type() == element::string) { - auto memBlock = dynamic_cast(mem.get())->getStringMemoryBlockPtr(); + auto memBlock = dynamic_cast(mem.get())->getStringMemoryBlockPtr(); OPENVINO_ASSERT(memBlock); memBlock->setExtBuff(tensor->data(), tensor->get_size()); } else { @@ -177,14 +177,14 @@ void SyncInferRequest::change_default_ptr() { const auto& outputNodesMap = m_graph->GetOutputNodesMap(); std::unordered_set inputPtrs; - std::function& tensor)> changeInpPtr; + std::function& tensor)> changeInpPtr; if (m_graph->IsDynamic()) { - changeInpPtr = [&inputPtrs](const EdgePtr &edge, ov::SoPtr& tensor) { + changeInpPtr = [&inputPtrs](const EdgePtr& edge, ov::SoPtr& tensor) { change_edge_ptr(edge, tensor); inputPtrs.insert(tensor->data()); }; } else { - changeInpPtr = [](const EdgePtr &edge, ov::SoPtr& tensor) { + changeInpPtr = [](const EdgePtr& edge, ov::SoPtr& tensor) { change_edge_ptr(edge, tensor); }; } @@ -279,7 +279,7 @@ void SyncInferRequest::change_default_ptr() { } if (m_graph->IsDynamic()) { - const auto &outMemBlocksMap = m_graph->getOutputNodesMemBlocksMap(); + const auto& outMemBlocksMap = m_graph->getOutputNodesMemBlocksMap(); for (auto&& item : outMemBlocksMap) { const auto& name = item.first; @@ -291,20 +291,32 @@ void SyncInferRequest::change_default_ptr() { if (controlBlockItr != m_outputControlBlocks.end()) { auto output = outputNodesMap.find(name); - OPENVINO_ASSERT(outputNodesMap.end() != output, "Node with name: ", name, " is absent in the outputNodesMap"); + OPENVINO_ASSERT(outputNodesMap.end() != output, + "Node with name: ", + name, + " is absent in the outputNodesMap"); auto parentEdge = output->second->getParentEdgeAt(0); - //avoid cyclic memory use + // avoid cyclic memory use auto&& controlBlock = controlBlockItr->second; - std::shared_ptr memBlock = inputPtrs.count(controlBlock.rawPtr()) ? // same memory is used on the input and output - controlBlock.nextMemBlock() : // then swap internal buffer to avoid data corruption - controlBlock.currentMemBlock(); // else reuse the existing buffer + std::shared_ptr memBlock = + inputPtrs.count(controlBlock.rawPtr()) ? // same memory is used on the input and output + controlBlock.nextMemBlock() + : // then swap internal buffer to avoid data corruption + controlBlock.currentMemBlock(); // else reuse the existing buffer outputMemBlock->setMemBlockResize(memBlock); - DEBUG_LOG("reset proxy ", outputMemBlock, ", actual ", controlBlock.currentMemBlock(), " graph ", m_graph, " inferrequest ", this); + DEBUG_LOG("reset proxy ", + outputMemBlock, + ", actual ", + controlBlock.currentMemBlock(), + " graph ", + m_graph, + " inferrequest ", + this); DEBUG_LOG(name, ", tensor ", controlBlock.tensor()); } else { - outputMemBlock->reset(); // switch to the internal memory since memory sharing is no longer possible + outputMemBlock->reset(); // switch to the internal memory since memory sharing is no longer possible } } } @@ -456,12 +468,13 @@ void SyncInferRequest::set_tensor(const ov::Output& in_port, con } m_outputs[output_index] = tensor; - m_outputControlBlocks.erase(output_index); // now the memory is under user's control + m_outputControlBlocks.erase(output_index); // now the memory is under user's control } ov::ISyncInferRequest::set_tensor(port, tensor); } -void SyncInferRequest::set_tensors_impl(const ov::Output port, const std::vector>& tensors) { +void SyncInferRequest::set_tensors_impl(const ov::Output port, + const std::vector>& tensors) { if (find_port(port).is_input()) { m_batched_tensors[port.get_tensor_ptr()] = tensors; return; @@ -541,7 +554,8 @@ void SyncInferRequest::init_tensor(const std::size_t& port_index, const ov::ISyn } dnnl::engine eng(dnnl::engine::kind::cpu, 0); - CpuBlockedMemoryDescPtr desc = std::make_shared(model_prec, Shape{memDims}); + CpuBlockedMemoryDescPtr desc = + std::make_shared(model_prec, Shape{memDims}); auto memory = std::make_shared(eng, desc); tensor = std::make_shared(memory); @@ -551,12 +565,12 @@ void SyncInferRequest::init_tensor(const std::size_t& port_index, const ov::ISyn OutputControlBlock control_block{model_prec, Shape{shape}}; DEBUG_LOG(port_index, - ", tensor ", - control_block.tensor(), - ", memBlock ", - control_block.tensor()->get_memory()->getMemoryBlock(), - "memory object ", - control_block.tensor()->get_memory().get()); + ", tensor ", + control_block.tensor(), + ", memBlock ", + control_block.tensor()->get_memory()->getMemoryBlock(), + "memory object ", + control_block.tensor()->get_memory().get()); tensor = control_block.tensor(); if (model_prec == graph_prec) @@ -602,7 +616,7 @@ SyncInferRequest::OutputControlBlock::OutputControlBlock(const ov::element::Type m_proxyMemBlock = std::make_shared(m_buffers[m_buffIndx]); VectorDims memDims; - if (shape.isDynamic()) { // this is a WA since the ITensor doesn't allow dyn shapes + if (shape.isDynamic()) { // this is a WA since the ITensor doesn't allow dyn shapes for (auto&& item : shape.getDims()) { memDims.push_back(item != Shape::UNDEFINED_DIM ? item : 0); } @@ -610,8 +624,7 @@ SyncInferRequest::OutputControlBlock::OutputControlBlock(const ov::element::Type memDims = shape.getStaticDims(); } - CpuBlockedMemoryDescPtr desc = - std::make_shared(precision, Shape{memDims}); + CpuBlockedMemoryDescPtr desc = std::make_shared(precision, Shape{memDims}); auto memory = std::make_shared(eng, desc, m_proxyMemBlock); m_tensor = std::make_shared(memory); @@ -649,6 +662,5 @@ void SyncInferRequest::sub_streams_infer() { } } -} // namespace intel_cpu -} // namespace ov - +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/infer_request.h b/src/plugins/intel_cpu/src/infer_request.h index a9def63d359744..b66387ecc4d4d5 100644 --- a/src/plugins/intel_cpu/src/infer_request.h +++ b/src/plugins/intel_cpu/src/infer_request.h @@ -4,11 +4,11 @@ #pragma once -#include "graph.h" #include "cpu_tensor.h" +#include "graph.h" +#include "memory_state.h" #include "openvino/runtime/iinfer_request.hpp" #include "openvino/runtime/isync_infer_request.hpp" -#include "memory_state.h" namespace ov { namespace intel_cpu { @@ -29,7 +29,8 @@ class SyncInferRequest : public ov::ISyncInferRequest { void set_tensor(const ov::Output& port, const ov::SoPtr& tensor) override; - void set_tensors_impl(const ov::Output port, const std::vector>& tensors) override; + void set_tensors_impl(const ov::Output port, + const std::vector>& tensors) override; ov::SoPtr get_tensor(const ov::Output& port) const override; std::vector> get_tensors(const ov::Output& _port) const override; diff --git a/src/plugins/intel_cpu/src/memory_control.cpp b/src/plugins/intel_cpu/src/memory_control.cpp index 0f202c296891c1..26cd8459458b9d 100644 --- a/src/plugins/intel_cpu/src/memory_control.cpp +++ b/src/plugins/intel_cpu/src/memory_control.cpp @@ -16,8 +16,7 @@ namespace { class StaticPartitionMemoryBlock : public IMemoryBlockObserver { public: - StaticPartitionMemoryBlock(MemoryBlockPtr pBlock, ptrdiff_t offset) - : m_pBlock(pBlock), m_offset(offset) { + StaticPartitionMemoryBlock(MemoryBlockPtr pBlock, ptrdiff_t offset) : m_pBlock(pBlock), m_offset(offset) { OPENVINO_ASSERT(m_pBlock, "Memory block is uninitialized"); } @@ -92,7 +91,7 @@ class IMemoryManager { using MemoryManagerPtr = std::shared_ptr; -template +template std::shared_ptr makeDnnlMemoryBlock(Args&&... args) { return std::make_shared(make_unique(std::forward(args)...)); } @@ -152,10 +151,12 @@ class MemoryManagerStatic : public IMemoryManager { } void allocate() override { - if (m_workspace) m_workspace->resize(m_totalSize); + if (m_workspace) + m_workspace->resize(m_totalSize); } void release() override { - if (m_workspace) m_workspace->free(); + if (m_workspace) + m_workspace->free(); } private: @@ -171,14 +172,13 @@ class MemoryManageNonOverlapingSets : public IMemoryManager { void insert(const MemoryRegion& reg) override { MemorySolver::Box box = {reg.start, reg.finish, reg.size, reg.id}; if (-1 != reg.finish) { - //We have to extend the lifespan of tensors that are crossing a sync point border in order to save - //the intermediate computation results from possible loss due to the tensor resize - auto itr_upper = - std::upper_bound(m_syncInds.begin(), m_syncInds.end(), box.finish, [](int y, int x) { - return y <= x; - }); + // We have to extend the lifespan of tensors that are crossing a sync point border in order to save + // the intermediate computation results from possible loss due to the tensor resize + auto itr_upper = std::upper_bound(m_syncInds.begin(), m_syncInds.end(), box.finish, [](int y, int x) { + return y <= x; + }); auto itr_lower = std::lower_bound(m_syncInds.begin(), m_syncInds.end(), box.start); - if (itr_lower != itr_upper) { // across sections + if (itr_lower != itr_upper) { // across sections if (itr_upper == m_syncInds.end()) { box.finish = -1; } else { @@ -201,7 +201,7 @@ class MemoryManageNonOverlapingSets : public IMemoryManager { void solve() { ov::MemorySolver::normalize_boxes(m_boxes); - std::vector> groups; //groups of nonoverlapping boxes + std::vector> groups; // groups of nonoverlapping boxes groups.push_back({m_boxes.front()}); for (size_t i = 1; i < m_boxes.size(); ++i) { const auto& box = m_boxes[i]; @@ -229,7 +229,7 @@ class MemoryManageNonOverlapingSets : public IMemoryManager { } void allocate() override { - //nothing to do + // nothing to do } void release() override { for (auto&& item : m_internalBlocks) { @@ -305,15 +305,17 @@ MemoryControl::MemoryControl(std::vector syncInds) { })); // handler for static tensors - m_handlers.emplace_back(buildHandler([](const MemoryRegion& reg) { - if (reg.size >= 0 || MemoryRegion::RegionType::VARIABLE != reg.type || - MemoryRegion::AllocType::POD != reg.alloc_type) { - return false; - } - return true; - }, std::move(syncInds))); + m_handlers.emplace_back(buildHandler( + [](const MemoryRegion& reg) { + if (reg.size >= 0 || MemoryRegion::RegionType::VARIABLE != reg.type || + MemoryRegion::AllocType::POD != reg.alloc_type) { + return false; + } + return true; + }, + std::move(syncInds))); - //handler for I/O tensors, so far simply individual blocks + // handler for I/O tensors, so far simply individual blocks m_handlers.emplace_back(buildHandler([](const MemoryRegion& reg) { if (MemoryRegion::RegionType::VARIABLE == reg.type || reg.alloc_type != MemoryRegion::AllocType::POD) { return false; diff --git a/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.cpp b/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.cpp index 4b75d5c5263398..7dff6905df09d9 100644 --- a/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.cpp +++ b/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.cpp @@ -15,9 +15,9 @@ namespace intel_cpu { constexpr BlockedMemoryDesc::CmpMask BlockedMemoryDesc::FULL_MASK; constexpr BlockedMemoryDesc::CmpMask BlockedMemoryDesc::EMPTY_MASK; constexpr BlockedMemoryDesc::CmpMask BlockedMemoryDesc::SKIP_OFFSET_MASK; -constexpr size_t BlockedMemoryDesc::OFFSET_MASK_POS; +constexpr size_t BlockedMemoryDesc::OFFSET_MASK_POS; -bool BlockedMemoryDesc::isCompatibleInternal(const BlockedMemoryDesc &rhs, CmpMask cmpMask) const { +bool BlockedMemoryDesc::isCompatibleInternal(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const { if (this->getShape() != rhs.getShape() || this->getPrecision() != rhs.getPrecision()) return false; @@ -77,5 +77,5 @@ std::string BlockedMemoryDesc::serializeFormat() const { return result.str(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.h index d938a4ba585602..9ff132965bdc0b 100644 --- a/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/blocked_memory_desc.h @@ -21,7 +21,7 @@ class BlockedMemoryDesc : public virtual MemoryDesc { static constexpr CmpMask FULL_MASK{0xffffffff}; static constexpr CmpMask EMPTY_MASK{0x0}; static constexpr CmpMask SKIP_OFFSET_MASK{0x7fffffff}; - static constexpr size_t OFFSET_MASK_POS{31}; + static constexpr size_t OFFSET_MASK_POS{31}; /** * @brief Returns the blocked dimensions @@ -73,7 +73,7 @@ class BlockedMemoryDesc : public virtual MemoryDesc { * * @return the result of the compatibility check */ - virtual bool isCompatible(const BlockedMemoryDesc &rhs, CmpMask cmpMask) const = 0; + virtual bool isCompatible(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const = 0; using MemoryDesc::isCompatible; ~BlockedMemoryDesc() override = default; @@ -88,7 +88,7 @@ class BlockedMemoryDesc : public virtual MemoryDesc { * Doesn't perform descs specific attributes check * @return true if compatible, otherwise false */ - bool isCompatibleInternal(const BlockedMemoryDesc &rhs, CmpMask cmpMask = FULL_MASK) const; + bool isCompatibleInternal(const BlockedMemoryDesc& rhs, CmpMask cmpMask = FULL_MASK) const; mutable VectorDims blockedDims; mutable VectorDims strides; @@ -99,5 +99,5 @@ class BlockedMemoryDesc : public virtual MemoryDesc { using BlockedMemoryDescPtr = std::shared_ptr; using BlockedMemoryDescCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.cpp b/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.cpp index d1c50d0048c57d..c95463207a9c46 100644 --- a/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.cpp +++ b/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.cpp @@ -3,6 +3,7 @@ // #include "cpu_blocked_memory_desc.h" + #include "dnnl_blocked_memory_desc.h" #include "utils/general_utils.h" @@ -15,17 +16,27 @@ static VectorDims makeRange(size_t size) { return retVec; } -CpuBlockedMemoryDesc::CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& shape) : - CpuBlockedMemoryDesc(prc, shape, shape.getDims(), makeRange(shape.getDims().size())) {} - -CpuBlockedMemoryDesc::CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& shape, const VectorDims& blockedDims, - const VectorDims& order, size_t offsetPadding, const VectorDims& offsetPaddingToData, - const VectorDims& strides) : MemoryDesc(shape, Blocked), precision(prc) { - if (std::any_of(order.begin(), order.end(), [](size_t val) { return val == Shape::UNDEFINED_DIM; })) { +CpuBlockedMemoryDesc::CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& shape) + : CpuBlockedMemoryDesc(prc, shape, shape.getDims(), makeRange(shape.getDims().size())) {} + +CpuBlockedMemoryDesc::CpuBlockedMemoryDesc(ov::element::Type prc, + const Shape& shape, + const VectorDims& blockedDims, + const VectorDims& order, + size_t offsetPadding, + const VectorDims& offsetPaddingToData, + const VectorDims& strides) + : MemoryDesc(shape, Blocked), + precision(prc) { + if (std::any_of(order.begin(), order.end(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + })) { OPENVINO_THROW("CpuBlockedMemoryDesc do not support undefined order."); } - if (std::any_of(blockedDims.begin() + shape.getRank(), blockedDims.end(), [](size_t val) { return val == Shape::UNDEFINED_DIM; })) { + if (std::any_of(blockedDims.begin() + shape.getRank(), blockedDims.end(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + })) { OPENVINO_THROW("CpuBlockedMemoryDesc doesn't support undefined blockedDims."); } @@ -51,29 +62,43 @@ CpuBlockedMemoryDesc::CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& s if (strides.empty() && !order.empty()) { if (shape.hasZeroDims()) { this->strides.resize(order.size(), 0); - } else if (std::any_of(this->blockedDims.begin(), this->blockedDims.end(), [](size_t val) { return val == Shape::UNDEFINED_DIM; })) { + } else if (std::any_of(this->blockedDims.begin(), this->blockedDims.end(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + })) { this->strides.resize(order.size(), Shape::UNDEFINED_DIM); } else { this->strides.resize(order.size(), 1); for (size_t i = 2; i <= order.size(); i++) { - this->strides[order.size() - i] = this->strides[order.size() - (i - 1)] * this->blockedDims[blockedDims.size() - (i - 1)]; + this->strides[order.size() - i] = + this->strides[order.size() - (i - 1)] * this->blockedDims[blockedDims.size() - (i - 1)]; } } } else { this->strides = strides; } - if (!everyone_is(this->order.size(), this->blockedDims.size(), this->offsetPaddingToData.size(), this->strides.size())) { + if (!everyone_is(this->order.size(), + this->blockedDims.size(), + this->offsetPaddingToData.size(), + this->strides.size())) { OPENVINO_THROW("Order, blocked dims, offset padding to data and strides must have equals size"); } } bool CpuBlockedMemoryDesc::isDefinedImp() const { bool defined = true; - defined = defined && std::none_of(blockedDims.cbegin(), blockedDims.cend(), [](size_t val) { return val == Shape::UNDEFINED_DIM; }); - defined = defined && std::none_of(strides.cbegin(), strides.cend(), [](size_t val) { return val == Shape::UNDEFINED_DIM; }); - defined = defined && std::none_of(order.cbegin(), order.cend(), [](size_t val) { return val == Shape::UNDEFINED_DIM; }); - defined = defined && std::none_of(offsetPaddingToData.cbegin(), offsetPaddingToData.cend(), [](size_t val) { return val == Shape::UNDEFINED_DIM; }); + defined = defined && std::none_of(blockedDims.cbegin(), blockedDims.cend(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + }); + defined = defined && std::none_of(strides.cbegin(), strides.cend(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + }); + defined = defined && std::none_of(order.cbegin(), order.cend(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + }); + defined = defined && std::none_of(offsetPaddingToData.cbegin(), offsetPaddingToData.cend(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + }); defined = defined && offsetPadding != Shape::UNDEFINED_DIM; return defined; @@ -90,15 +115,15 @@ bool CpuBlockedMemoryDesc::isCompatible(const MemoryDesc& rhs) const { } } -bool CpuBlockedMemoryDesc::isCompatible(const CpuBlockedMemoryDesc &rhs, CmpMask cmpMask) const { +bool CpuBlockedMemoryDesc::isCompatible(const CpuBlockedMemoryDesc& rhs, CmpMask cmpMask) const { return BlockedMemoryDesc::isCompatibleInternal(rhs, cmpMask); } -bool CpuBlockedMemoryDesc::isCompatible(const DnnlBlockedMemoryDesc &rhs, CmpMask cmpMask) const { +bool CpuBlockedMemoryDesc::isCompatible(const DnnlBlockedMemoryDesc& rhs, CmpMask cmpMask) const { return rhs.isCompatible(*this, cmpMask); } -bool CpuBlockedMemoryDesc::isCompatible(const BlockedMemoryDesc &rhs, CmpMask cmpMask) const { +bool CpuBlockedMemoryDesc::isCompatible(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const { const BlockedMemoryDesc* pRhs = &rhs; if (auto cpuBlkDesc = dynamic_cast(pRhs)) { return isCompatible(*cpuBlkDesc, cmpMask); @@ -149,7 +174,9 @@ size_t CpuBlockedMemoryDesc::getMaxMemSize() const { } const auto& maxDims = shape.getMaxDims(); - if (std::any_of(maxDims.begin(), maxDims.end(), [](size_t x){ return Shape::UNDEFINED_DIM == x; })) { + if (std::any_of(maxDims.begin(), maxDims.end(), [](size_t x) { + return Shape::UNDEFINED_DIM == x; + })) { return UNDEFINED_SIZE; } @@ -193,16 +220,16 @@ size_t CpuBlockedMemoryDesc::getElementOffset(size_t elemNumber) const { bool CpuBlockedMemoryDesc::hasLayoutType(LayoutType layoutType) const { switch (layoutType) { - case LayoutType::ncsp: - return isPlainFormat(); - case LayoutType::nspc: - return isTailCFormat(); - case LayoutType::nCsp8c: - return isBlockedCFormat(8); - case LayoutType::nCsp16c: - return isBlockedCFormat(16); - default: - return false; + case LayoutType::ncsp: + return isPlainFormat(); + case LayoutType::nspc: + return isTailCFormat(); + case LayoutType::nCsp8c: + return isBlockedCFormat(8); + case LayoutType::nCsp16c: + return isBlockedCFormat(16); + default: + return false; } } @@ -252,13 +279,15 @@ bool CpuBlockedMemoryDesc::isTailCFormat() const { return true; } -MemoryDescPtr CpuBlockedMemoryDesc::cloneWithNewDimsImp(const VectorDims &dims) const { - if (std::any_of(dims.begin(), dims.end(), [](size_t x){ return Shape::UNDEFINED_DIM == x; })) { +MemoryDescPtr CpuBlockedMemoryDesc::cloneWithNewDimsImp(const VectorDims& dims) const { + if (std::any_of(dims.begin(), dims.end(), [](size_t x) { + return Shape::UNDEFINED_DIM == x; + })) { OPENVINO_THROW("Can't clone desc if new dims are undefined"); } // TODO [DS]: add stride recalculation for strided blobs - for (int i = strides.size() - 2; i >= 0 ; i--) { + for (int i = strides.size() - 2; i >= 0; i--) { if (strides[i] == Shape::UNDEFINED_DIM) break; @@ -280,11 +309,18 @@ MemoryDescPtr CpuBlockedMemoryDesc::cloneWithNewDimsImp(const VectorDims &dims) } VectorDims newOffsetPaddingToData; - if (std::none_of(offsetPaddingToData.begin(), offsetPaddingToData.end(), [](size_t x){ return x == Shape::UNDEFINED_DIM;})) { + if (std::none_of(offsetPaddingToData.begin(), offsetPaddingToData.end(), [](size_t x) { + return x == Shape::UNDEFINED_DIM; + })) { newOffsetPaddingToData = offsetPaddingToData; } - return std::make_shared(precision, Shape(dims), newBlockedDims, order, offsetPadding, newOffsetPaddingToData); + return std::make_shared(precision, + Shape(dims), + newBlockedDims, + order, + offsetPadding, + newOffsetPaddingToData); } bool CpuBlockedMemoryDesc::blocksExtended() const { @@ -311,7 +347,9 @@ size_t CpuBlockedMemoryDesc::getPaddedElementsCount() const { if (getShape().hasZeroDims()) { return 0; } - if (std::any_of(blockedDims.begin(), blockedDims.end(), [](Dim dim) { return dim == Shape::UNDEFINED_DIM; })) { + if (std::any_of(blockedDims.begin(), blockedDims.end(), [](Dim dim) { + return dim == Shape::UNDEFINED_DIM; + })) { OPENVINO_THROW("Can't compute padded elements count for non undefined blocked dims"); } return std::accumulate(blockedDims.begin(), blockedDims.end(), size_t{1}, std::multiplies()); @@ -323,5 +361,5 @@ MemoryDescPtr CpuBlockedMemoryDesc::cloneWithNewPrecision(const ov::element::Typ return newDesc; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.h index 28badb4dac15fb..fdf931a262e854 100644 --- a/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/cpu_blocked_memory_desc.h @@ -16,8 +16,12 @@ class CpuBlockedMemoryDesc : public BlockedMemoryDesc { public: CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& shape); - CpuBlockedMemoryDesc(ov::element::Type prc, const Shape& shape, const VectorDims& blockedDims, - const VectorDims& order, size_t offsetPadding = 0, const VectorDims& offsetPaddingToData = {}, + CpuBlockedMemoryDesc(ov::element::Type prc, + const Shape& shape, + const VectorDims& blockedDims, + const VectorDims& order, + size_t offsetPadding = 0, + const VectorDims& offsetPaddingToData = {}, const VectorDims& strides = {}); MemoryDescPtr clone() const override { @@ -26,8 +30,8 @@ class CpuBlockedMemoryDesc : public BlockedMemoryDesc { bool isCompatible(const MemoryDesc& rhs) const override; bool isCompatible(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const override; - bool isCompatible(const CpuBlockedMemoryDesc &rhs, CmpMask cmpMask = BlockedMemoryDesc::FULL_MASK) const; - bool isCompatible(const DnnlBlockedMemoryDesc &rhs, CmpMask cmpMask = BlockedMemoryDesc::FULL_MASK) const; + bool isCompatible(const CpuBlockedMemoryDesc& rhs, CmpMask cmpMask = BlockedMemoryDesc::FULL_MASK) const; + bool isCompatible(const DnnlBlockedMemoryDesc& rhs, CmpMask cmpMask = BlockedMemoryDesc::FULL_MASK) const; ov::element::Type getPrecision() const override { return precision; @@ -105,5 +109,5 @@ class CpuBlockedMemoryDesc : public BlockedMemoryDesc { using CpuBlockedMemoryDescPtr = std::shared_ptr; using CpuBlockedMemoryDescCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc.h index c3936528abed7b..e6d260066118ee 100644 --- a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc.h @@ -22,7 +22,7 @@ namespace ov { namespace intel_cpu { namespace node { class Split; -} // namespace node +} // namespace node class MemoryDesc; @@ -39,10 +39,10 @@ enum MemoryDescType { }; enum class LayoutType : unsigned { - nspc, // general per channels format - ncsp, // general planar - nCsp8c, // general channels blocked by 8 - nCsp16c // general channels blocked by 16 + nspc, // general per channels format + ncsp, // general planar + nCsp8c, // general channels blocked by 8 + nCsp16c // general channels blocked by 16 }; class MemoryDesc { @@ -70,8 +70,8 @@ class MemoryDesc { /** * @brief Clone descriptor with new dims. - * Throws an exception if relaxedCheck is false and some of the new dims conflicts with the internal shape (i.e. its defined dims ,rank, upper bounds) - * or if internal shape and dims have different ranks + * Throws an exception if relaxedCheck is false and some of the new dims conflicts with the internal shape (i.e. its + * defined dims ,rank, upper bounds) or if internal shape and dims have different ranks * @param dims new dims * @param relaxedCheck flag which defined must we check dims with internal desc on compatibility * @return MemoryDescPtr with new dims @@ -136,8 +136,8 @@ class MemoryDesc { } template ::value && !std::is_reference::value, int>::type = 0, - typename std::enable_if::value, int>::type = 0> + typename std::enable_if::value && !std::is_reference::value, int>::type = 0, + typename std::enable_if::value, int>::type = 0> T* as() { T* casted = dynamic_cast(this); if (!casted) @@ -146,8 +146,8 @@ class MemoryDesc { } template ::value && !std::is_reference::value, int>::type = 0, - typename std::enable_if::value, int>::type = 0> + typename std::enable_if::value && !std::is_reference::value, int>::type = 0, + typename std::enable_if::value, int>::type = 0> const T* as() const { const T* casted = dynamic_cast(this); if (!casted) @@ -159,17 +159,16 @@ class MemoryDesc { protected: MemoryDesc() : type(MemoryDescType::Undef) {} - MemoryDesc(Shape shape, MemoryDescType type) - : type(type), shape(std::move(shape)) {} + MemoryDesc(Shape shape, MemoryDescType type) : type(type), shape(std::move(shape)) {} - MemoryDesc(const VectorDims& dims, MemoryDescType type) - : type(type), shape(dims) {} + MemoryDesc(const VectorDims& dims, MemoryDescType type) : type(type), shape(dims) {} virtual void setPrecision(ov::element::Type prc) = 0; virtual size_t getCurrentMemSizeImp() const = 0; - // Get offset to the n'th element. Returns physical index of the element by the logical one considering padding, layout, blocking etc. + // Get offset to the n'th element. Returns physical index of the element by the logical one considering padding, + // layout, blocking etc. virtual size_t getElementOffset(size_t elemNumber) const = 0; virtual bool canComputeMemSizeZeroDims() const = 0; @@ -195,5 +194,5 @@ class MemoryDesc { friend class node::Split; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.cpp b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.cpp index 0ae17d6c00322b..2937b73409b67d 100644 --- a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.cpp +++ b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.cpp @@ -4,29 +4,33 @@ #include "memory_desc/cpu_memory_desc_utils.h" -#include "memory_desc/cpu_blocked_memory_desc.h" -#include "memory_desc/dnnl_blocked_memory_desc.h" -#include "graph_context.h" -#include "cpu_memory_desc.h" -#include "memory_desc/empty_memory_desc.h" -#include -#include #include #include + #include #include +#include "cpu_memory_desc.h" +#include "graph_context.h" +#include "memory_desc/cpu_blocked_memory_desc.h" +#include "memory_desc/dnnl_blocked_memory_desc.h" +#include "memory_desc/empty_memory_desc.h" + using namespace dnnl; namespace ov { namespace intel_cpu { -DnnlMemoryDescPtr MemoryDescUtils::convertToDnnlMemoryDesc(const MemoryDescPtr &desc) { +DnnlMemoryDescPtr MemoryDescUtils::convertToDnnlMemoryDesc(const MemoryDescPtr& desc) { if (MemoryDescType::Blocked == desc->getType()) { const auto cpuDesc = desc->as(); - return std::shared_ptr(new DnnlBlockedMemoryDesc(cpuDesc->getPrecision(), cpuDesc->getShape(), cpuDesc->getBlockDims(), - cpuDesc->getOrder(), cpuDesc->getOffsetPadding(), - cpuDesc->getOffsetPaddingToData(), cpuDesc->getStrides())); + return std::shared_ptr(new DnnlBlockedMemoryDesc(cpuDesc->getPrecision(), + cpuDesc->getShape(), + cpuDesc->getBlockDims(), + cpuDesc->getOrder(), + cpuDesc->getOffsetPadding(), + cpuDesc->getOffsetPaddingToData(), + cpuDesc->getStrides())); } else if (MemoryDescType::Empty == desc->getType()) { return DnnlExtensionUtils::makeDescriptor(dnnl::memory::desc()); } else if (MemoryDescType::Dnnl & desc->getType()) { @@ -41,14 +45,19 @@ DnnlBlockedMemoryDesc MemoryDescUtils::convertToDnnlBlockedMemoryDesc(const Memo return DnnlBlockedMemoryDesc(*desc.as()); } else if (MemoryDescType::Blocked == desc.getType()) { const auto cpuDesc = desc.as(); - return DnnlBlockedMemoryDesc(cpuDesc->getPrecision(), cpuDesc->getShape(), cpuDesc->getBlockDims(), cpuDesc->getOrder(), cpuDesc->getOffsetPadding(), - cpuDesc->getOffsetPaddingToData(), cpuDesc->getStrides()); + return DnnlBlockedMemoryDesc(cpuDesc->getPrecision(), + cpuDesc->getShape(), + cpuDesc->getBlockDims(), + cpuDesc->getOrder(), + cpuDesc->getOffsetPadding(), + cpuDesc->getOffsetPaddingToData(), + cpuDesc->getStrides()); } else { OPENVINO_THROW("Cannot convert MemoryDesc to DnnlBlockedMemoryDesc"); } } -BlockedMemoryDescPtr MemoryDescUtils::convertToBlockedMemoryDesc(const MemoryDescPtr &desc) { +BlockedMemoryDescPtr MemoryDescUtils::convertToBlockedMemoryDesc(const MemoryDescPtr& desc) { if (desc->getType() & MemoryDescType::Blocked) { return std::dynamic_pointer_cast(desc); } else { @@ -57,7 +66,7 @@ BlockedMemoryDescPtr MemoryDescUtils::convertToBlockedMemoryDesc(const MemoryDes } CpuBlockedMemoryDescPtr MemoryDescUtils::generateCpuBlockedMemoryDesc(const ov::SoPtr& tensor) { - const auto& shape = tensor->get_shape().empty() ? ov::Shape{tensor->get_size()} : tensor->get_shape(); + const auto& shape = tensor->get_shape().empty() ? ov::Shape{tensor->get_size()} : tensor->get_shape(); VectorDims blk_order(shape.size()); std::iota(blk_order.begin(), blk_order.end(), 0); @@ -87,17 +96,16 @@ CpuBlockedMemoryDescPtr MemoryDescUtils::generateCpuBlockedMemoryDesc(const ov:: }); } - return std::make_shared( - element_type, - Shape{shape}, - shape, - blk_order, - 0UL, - VectorDims{}, - blk_strides); + return std::make_shared(element_type, + Shape{shape}, + shape, + blk_order, + 0UL, + VectorDims{}, + blk_strides); } -std::shared_ptr MemoryDescUtils::makeDummyDesc(const MemoryDesc &desc, Dim dummyVal) { +std::shared_ptr MemoryDescUtils::makeDummyDesc(const MemoryDesc& desc, Dim dummyVal) { auto dummyShape = makeDummyShape(desc.getShape(), dummyVal); return desc.cloneWithNewDims(dummyShape.getStaticDims()); } @@ -111,7 +119,7 @@ std::shared_ptr MemoryDescUtils::makeEmptyMemory(const GraphContext::CP return std::make_shared(context->getEngine(), makeEmptyDesc(), nullptr); } -Shape MemoryDescUtils::makeDummyShape(const Shape &shape, Dim dummyVal) { +Shape MemoryDescUtils::makeDummyShape(const Shape& shape, Dim dummyVal) { const auto& minDims = shape.getMinDims(); const auto& maxDims = shape.getMaxDims(); const auto& dims = shape.getDims(); @@ -122,7 +130,7 @@ Shape MemoryDescUtils::makeDummyShape(const Shape &shape, Dim dummyVal) { return Shape(dummyDims); } -Shape MemoryDescUtils::makeDummyShape(const Shape &shape, const VectorDims& dummyVals) { +Shape MemoryDescUtils::makeDummyShape(const Shape& shape, const VectorDims& dummyVals) { if (shape.getRank() != dummyVals.size()) { OPENVINO_THROW("makeDummyShape(): dummyVals vector size and shape ranks mismatch"); } @@ -131,9 +139,10 @@ Shape MemoryDescUtils::makeDummyShape(const Shape &shape, const VectorDims& dumm const auto& dims = shape.getDims(); VectorDims dummyDims(dims.size()); for (size_t i = 0; i < dims.size(); ++i) { - dummyDims[i] = dims[i] == Shape::UNDEFINED_DIM ? std::min(maxDims[i], std::max(minDims[i], dummyVals[i])) : dims[i]; + dummyDims[i] = + dims[i] == Shape::UNDEFINED_DIM ? std::min(maxDims[i], std::max(minDims[i], dummyVals[i])) : dims[i]; } return Shape(dummyDims); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.h b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.h index a4acd3eb2aa778..388c9a21c5df8e 100644 --- a/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.h +++ b/src/plugins/intel_cpu/src/memory_desc/cpu_memory_desc_utils.h @@ -5,11 +5,12 @@ #pragma once #include + #include "cpu_shape.h" #include "cpu_types.h" +#include "graph_context.h" #include "openvino/runtime/itensor.hpp" #include "openvino/runtime/so_ptr.hpp" -#include "graph_context.h" namespace ov { namespace intel_cpu { @@ -32,7 +33,7 @@ class MemoryDescUtils { * @param desc MemoryDesc to be converted * @return converted DnnlMemoryDesc */ - static std::shared_ptr convertToDnnlMemoryDesc(const std::shared_ptr &desc); + static std::shared_ptr convertToDnnlMemoryDesc(const std::shared_ptr& desc); /** * @brief Converts MemoryDesc to DnnlBlockedMemoryDesc @@ -46,7 +47,7 @@ class MemoryDescUtils { * @param desc MemoryDesc to be converted * @return converted BlockedMemoryDesc */ - static std::shared_ptr convertToBlockedMemoryDesc(const std::shared_ptr &desc); + static std::shared_ptr convertToBlockedMemoryDesc(const std::shared_ptr& desc); /** * @brief Builds CpuBlockedMemoryDesc for given ov::ITensor @@ -58,7 +59,8 @@ class MemoryDescUtils { static constexpr Dim DEFAULT_DUMMY_VAL = 64; /** - * @brief Makes a dummy descriptor where all undefined values are replaced with the smallest value between the parameter and the upper bound dim + * @brief Makes a dummy descriptor where all undefined values are replaced with the smallest value between the + * parameter and the upper bound dim * @param desc MemoryDesc from which the new descriptor is generated * @param dummyVal Dim value to replace undefined dimensions * @return a new MemoryDesc with dummy values instead of undefined dims @@ -66,27 +68,29 @@ class MemoryDescUtils { static std::shared_ptr makeDummyDesc(const MemoryDesc& desc, Dim dummyVal = DEFAULT_DUMMY_VAL); /** - * @brief Make an empty memory descriptor - * @note Shape{0}, undefined - * @return empty memory descriptor - */ + * @brief Make an empty memory descriptor + * @note Shape{0}, undefined + * @return empty memory descriptor + */ static std::shared_ptr makeEmptyDesc(); static std::shared_ptr makeEmptyMemory(const GraphContext::CPtr context); /** - * @brief Makes a static dummy shape where all undefined values are replaced with the smallest value between the parameter and the upper bound dim - * @param shape a Shape object from which the new static shape is generated - * @param dummyVal Dim value to replace undefined dimensions - * @return a new Shape with dummy values instead of undefined dims - */ + * @brief Makes a static dummy shape where all undefined values are replaced with the smallest value between the + * parameter and the upper bound dim + * @param shape a Shape object from which the new static shape is generated + * @param dummyVal Dim value to replace undefined dimensions + * @return a new Shape with dummy values instead of undefined dims + */ static Shape makeDummyShape(const Shape& shape, Dim dummyVal = DEFAULT_DUMMY_VAL); /** - * @brief Makes a static dummy shape where all undefined values are replaced with the smallest value between the parameter and the upper bound dim - * @param shape a Shape object from which the new static shape is generated - * @param dummyVals vector of values to replace undefined dimensions - * @return a new Shape with dummy values instead of undefined dims - */ + * @brief Makes a static dummy shape where all undefined values are replaced with the smallest value between the + * parameter and the upper bound dim + * @param shape a Shape object from which the new static shape is generated + * @param dummyVals vector of values to replace undefined dimensions + * @return a new Shape with dummy values instead of undefined dims + */ static Shape makeDummyShape(const Shape& shape, const VectorDims& dummyVals); /** @@ -104,5 +108,5 @@ class MemoryDescUtils { static std::string dims2str(const VectorDims& dims); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.cpp b/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.cpp index a24b55831c2c7c..38c020674c7168 100644 --- a/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.cpp +++ b/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.cpp @@ -4,26 +4,28 @@ #include "memory_desc/dnnl_blocked_memory_desc.h" +#include #include +#include #include + #include "cpu_types.h" #include "dnnl_extension_utils.h" #include "memory_desc/cpu_blocked_memory_desc.h" #include "utils/general_utils.h" -#include -#include - namespace ov { namespace intel_cpu { DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& shape, const VectorDims& strides) : MemoryDesc(shape, DnnlBlocked) { const auto ndims = shape.getRank(); - const auto &dims = shape.getDims(); + const auto& dims = shape.getDims(); - if (!strides.empty()) { // custom strides - if (shape.hasZeroDims() && std::any_of(strides.begin(), strides.end(), [](size_t stride) { return stride != 0; } )) { + if (!strides.empty()) { // custom strides + if (shape.hasZeroDims() && std::any_of(strides.begin(), strides.end(), [](size_t stride) { + return stride != 0; + })) { OPENVINO_THROW("Can't create DnnlBlockedMemoryDesc with zero dim, but with non zero strides"); } desc = {DnnlExtensionUtils::convertToDnnlDims(dims), @@ -33,16 +35,20 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& dnnl::memory::dims plain_strides; if (shape.hasZeroDims()) { plain_strides.resize(ndims, 0); - } else if (std::any_of(dims.begin(), dims.end(), [](size_t val) { return val == Shape::UNDEFINED_DIM; })) { + } else if (std::any_of(dims.begin(), dims.end(), [](size_t val) { + return val == Shape::UNDEFINED_DIM; + })) { plain_strides.resize(ndims, DNNL_RUNTIME_DIM_VAL); } else { plain_strides.resize(ndims, 1); for (size_t i = 1; i < ndims; i++) { - plain_strides[ndims - i -1] = plain_strides[ndims - i] * dims[ndims - i]; + plain_strides[ndims - i - 1] = plain_strides[ndims - i] * dims[ndims - i]; } } - desc = {DnnlExtensionUtils::convertToDnnlDims(dims), DnnlExtensionUtils::ElementTypeToDataType(prc), plain_strides}; + desc = {DnnlExtensionUtils::convertToDnnlDims(dims), + DnnlExtensionUtils::ElementTypeToDataType(prc), + plain_strides}; } order.resize(ndims); @@ -55,11 +61,12 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& * Construct from blocked parameters * * OV IOhw_4i16o4i dims(N) = {32, 64, 128, 128} - * blockedDims {4, 2, 128, 128, 4, 16, 4} // total dims(inner, outermost, auto blocked/padded). Generally sorted by strides. - * strides {8388608, 4194304, 32768, 256, 64, 4, 1} // strides for blockedDims, growing sequence - * order {1, 0, 2, 3, 1, 0, 1} // matching to original dims + * blockedDims {4, 2, 128, 128, 4, 16, 4} // total dims(inner, outermost, auto blocked/padded). + * Generally sorted by strides. strides {8388608, 4194304, 32768, 256, 64, 4, 1} // strides for blockedDims, + * growing sequence order {1, 0, 2, 3, 1, 0, 1} // matching to original dims * - * All vectors blockedDims/strides/order have same size equals total num of internal blocked dims(inner_dims + outer_dims) + * All vectors blockedDims/strides/order have same size equals total num of internal blocked dims(inner_dims + + * outer_dims) * * Tensor descriptor filing is not deterministic. It allows any permutation of index which keeps order of * real dims spliting. @@ -70,9 +77,14 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& * * Limitation of conversion first N elements of order should be permutation of [0,1,2 ... N] */ -DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& shape, const VectorDims& blockedDims, - const VectorDims& order, size_t offsetPadding, const VectorDims& offsetPaddingToData, - const VectorDims& strides) : MemoryDesc(shape, DnnlBlocked) { +DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, + const Shape& shape, + const VectorDims& blockedDims, + const VectorDims& order, + size_t offsetPadding, + const VectorDims& offsetPaddingToData, + const VectorDims& strides) + : MemoryDesc(shape, DnnlBlocked) { using namespace dnnl; // scalar case if (shape.getRank() == 0) { @@ -128,7 +140,9 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& const bool emptyDesc = shape.hasZeroDims(); if (!strides.empty()) { - if (emptyDesc && std::any_of(strides.begin(), strides.end(), [](size_t dim) { return dim != 0; } )) { + if (emptyDesc && std::any_of(strides.begin(), strides.end(), [](size_t dim) { + return dim != 0; + })) { OPENVINO_THROW("Can't create DnnlBlockedMemoryDesc with zero dim, but with non zero strides"); } @@ -143,7 +157,9 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& OPENVINO_THROW("Can not construct DnnlBlockedMemoryDesc from strides: ", vec2str(strides)); } - if (!strides.empty() && !emptyDesc && std::none_of(strides.begin(), strides.end(), [](size_t x) { return Shape::UNDEFINED_DIM == x; })) { + if (!strides.empty() && !emptyDesc && std::none_of(strides.begin(), strides.end(), [](size_t x) { + return Shape::UNDEFINED_DIM == x; + })) { bool inner_block_are_dense = one_of(strides.back(), 0u, 1u); // stride 1 - is dense case, 0 - broad casted for (size_t i = outer_ndims; i < strides.size() - 1; i++) { inner_block_are_dense &= (strides[i] == strides[i + 1] * blockedDims[i + 1]); @@ -164,8 +180,10 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& std::copy(dims.begin(), dims.end(), desc.get()->dims); if (!offsetPaddingToData.empty()) { - bool inner_pad_offsets_is_zero = std::all_of(offsetPaddingToData.begin() + outer_ndims, offsetPaddingToData.end(), - [](size_t pad) { return pad == 0; }); + bool inner_pad_offsets_is_zero = + std::all_of(offsetPaddingToData.begin() + outer_ndims, offsetPaddingToData.end(), [](size_t pad) { + return pad == 0; + }); if (!inner_pad_offsets_is_zero) OPENVINO_THROW("Can not construct DnnlBlockedMemoryDesc, inner pad offsets is not zero: ", @@ -189,7 +207,7 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& } // Fill blocking desc - auto &dnn_blk_desc = desc.get()->format_desc.blocking; + auto& dnn_blk_desc = desc.get()->format_desc.blocking; dnn_blk_desc.inner_nblks = inner_ndims; std::copy(dnnlBlkDims.end() - inner_ndims, dnnlBlkDims.end(), dnn_blk_desc.inner_blks); std::copy(order.end() - inner_ndims, order.end(), dnn_blk_desc.inner_idxs); @@ -209,8 +227,10 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& } } -DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const Shape& shape, dnnl::memory::data_type dataType, dnnl::memory::format_tag format) : - MemoryDesc(shape, DnnlBlocked) { +DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const Shape& shape, + dnnl::memory::data_type dataType, + dnnl::memory::format_tag format) + : MemoryDesc(shape, DnnlBlocked) { using namespace dnnl; if (format == memory::format_tag::any || format == memory::format_tag::undef) OPENVINO_THROW("Unexpected: Can't create dnnl::desc with any or undef format"); @@ -249,7 +269,7 @@ bool DnnlBlockedMemoryDesc::isCompatible(const MemoryDesc& rhs) const { } } -bool DnnlBlockedMemoryDesc::isCompatible(const BlockedMemoryDesc &rhs, CmpMask cmpMask) const { +bool DnnlBlockedMemoryDesc::isCompatible(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const { if (auto desc = dynamic_cast(&rhs)) { return isCompatible(*desc, cmpMask); } else if (auto desc = dynamic_cast(&rhs)) { @@ -261,7 +281,8 @@ bool DnnlBlockedMemoryDesc::isCompatible(const BlockedMemoryDesc &rhs, CmpMask c bool DnnlBlockedMemoryDesc::isCompatible(const CpuBlockedMemoryDesc& rhs, CmpMask cmpMask) const { dnnl::impl::memory_desc_wrapper wrapped(desc.get()); - return wrapped.extra().flags == dnnl_memory_extra_flag_none && BlockedMemoryDesc::isCompatibleInternal(rhs, cmpMask); + return wrapped.extra().flags == dnnl_memory_extra_flag_none && + BlockedMemoryDesc::isCompatibleInternal(rhs, cmpMask); } bool DnnlBlockedMemoryDesc::isCompatible(const DnnlBlockedMemoryDesc& rhs, CmpMask cmpMask) const { @@ -288,8 +309,10 @@ bool DnnlBlockedMemoryDesc::isCompatible(const DnnlBlockedMemoryDesc& rhs, CmpMa const auto thisExtra = wrappedThis.extra(); const auto rhsExtra = wrappedRhs.extra(); - return this->getOrder() == rhs.getOrder() && (thisExtra.flags == rhsExtra.flags && thisExtra.compensation_mask == rhsExtra.compensation_mask && - thisExtra.scale_adjust == rhsExtra.scale_adjust) && wrappedThis.similar_to(wrappedRhs, true, true, 0, true, checkOffset, stride_mask); + return this->getOrder() == rhs.getOrder() && + (thisExtra.flags == rhsExtra.flags && thisExtra.compensation_mask == rhsExtra.compensation_mask && + thisExtra.scale_adjust == rhsExtra.scale_adjust) && + wrappedThis.similar_to(wrappedRhs, true, true, 0, true, checkOffset, stride_mask); } static VectorDims extractOrder(const dnnl::memory::desc& desc) { @@ -300,7 +323,7 @@ static VectorDims extractOrder(const dnnl::memory::desc& desc) { OPENVINO_THROW("Unexpected: Cannot calculate order from undefined dims or strides"); } - const auto &blk_desc = descWrapped.blocking_desc(); + const auto& blk_desc = descWrapped.blocking_desc(); const size_t outer_ndims = dims.size(); const size_t inner_ndims = blk_desc.inner_nblks; @@ -319,11 +342,11 @@ static VectorDims extractOrder(const dnnl::memory::desc& desc) { // order of outer dims. In case of IOhw_ will be {1, 0, 2, 3} VectorDims outer_order(outer_ndims); std::iota(outer_order.begin(), outer_order.end(), 0); - std::sort(outer_order.begin(), outer_order.end(), - [&blk_desc, &outer_block_dims](size_t ind_l, size_t ind_r) { - return (blk_desc.strides[ind_l] > blk_desc.strides[ind_r]) || - (blk_desc.strides[ind_l] == blk_desc.strides[ind_r] && outer_block_dims[ind_l] > outer_block_dims[ind_r]); - }); + std::sort(outer_order.begin(), outer_order.end(), [&blk_desc, &outer_block_dims](size_t ind_l, size_t ind_r) { + return (blk_desc.strides[ind_l] > blk_desc.strides[ind_r]) || + (blk_desc.strides[ind_l] == blk_desc.strides[ind_r] && + outer_block_dims[ind_l] > outer_block_dims[ind_r]); + }); // blocked order // [new_outer_order] U [inner_idxs] @@ -333,8 +356,8 @@ static VectorDims extractOrder(const dnnl::memory::desc& desc) { return blk_order; } -DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const_dnnl_memory_desc_t cdesc) : - MemoryDesc(DnnlExtensionUtils::convertToVectorDims(cdesc->dims, cdesc->ndims), DnnlBlocked) { +DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const_dnnl_memory_desc_t cdesc) + : MemoryDesc(DnnlExtensionUtils::convertToVectorDims(cdesc->dims, cdesc->ndims), DnnlBlocked) { desc = dnnl::memory::desc(DnnlExtensionUtils::clone_desc(cdesc)); if (desc.get_format_kind() == dnnl::memory::format_kind::any) @@ -356,16 +379,16 @@ DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const_dnnl_memory_desc_t cdesc) : bool DnnlBlockedMemoryDesc::hasLayoutType(LayoutType layoutType) const { switch (layoutType) { - case LayoutType::ncsp: - return isPlainFormat(); - case LayoutType::nspc: - return isTailCFormat(); - case LayoutType::nCsp8c: - return isBlockedCFormat(8); - case LayoutType::nCsp16c: - return isBlockedCFormat(16); - default: - return false; + case LayoutType::ncsp: + return isPlainFormat(); + case LayoutType::nspc: + return isTailCFormat(); + case LayoutType::nCsp8c: + return isBlockedCFormat(8); + case LayoutType::nCsp16c: + return isBlockedCFormat(16); + default: + return false; } } @@ -382,8 +405,7 @@ bool DnnlBlockedMemoryDesc::isPlainFormat() const { } bool DnnlBlockedMemoryDesc::isBlockedCFormat(size_t blk_size) const { - if (desc.get_format_kind() != dnnl::memory::format_kind::blocked || - desc.get_inner_nblks() != 1 || + if (desc.get_format_kind() != dnnl::memory::format_kind::blocked || desc.get_inner_nblks() != 1 || desc.get_inner_idxs()[0] != 1) return false; @@ -452,13 +474,15 @@ static dnnl::memory::desc cloneDescWithNewDims(const dnnl::memory::desc& desc, return newMklDesc; } -MemoryDescPtr DnnlBlockedMemoryDesc::cloneWithNewDimsImp(const VectorDims &dims) const { - if (std::any_of(dims.begin(), dims.end(), [](size_t x){ return Shape::UNDEFINED_DIM == x; })) { +MemoryDescPtr DnnlBlockedMemoryDesc::cloneWithNewDimsImp(const VectorDims& dims) const { + if (std::any_of(dims.begin(), dims.end(), [](size_t x) { + return Shape::UNDEFINED_DIM == x; + })) { OPENVINO_THROW("Can't clone desc if new dims are undefined"); } // TODO [DS]: add stride recalculation for strided blobs - for (int i = strides.size() - 2; i >= 0 ; i--) { + for (int i = strides.size() - 2; i >= 0; i--) { if (strides[i] == Shape::UNDEFINED_DIM) break; @@ -499,7 +523,7 @@ bool DnnlBlockedMemoryDesc::isSame(dnnl::memory::format_tag fmt) const { { const auto dims = desc.get_dims(); VectorDims total_block_per_dim(dims.size(), 1); - const auto &blk_desc = desc.get()->format_desc.blocking; + const auto& blk_desc = desc.get()->format_desc.blocking; for (int i = 0; i < blk_desc.inner_nblks; i++) { total_block_per_dim[blk_desc.inner_idxs[i]] *= blk_desc.inner_blks[i]; } @@ -509,10 +533,12 @@ bool DnnlBlockedMemoryDesc::isSame(dnnl::memory::format_tag fmt) const { } std::iota(actualOrder.begin(), actualOrder.end(), 0); - std::sort(actualOrder.begin(), actualOrder.end(), - [&actualStrides, &outer_block_dims] (size_t ind_l, size_t ind_r) { + std::sort(actualOrder.begin(), + actualOrder.end(), + [&actualStrides, &outer_block_dims](size_t ind_l, size_t ind_r) { return (actualStrides[ind_l] > actualStrides[ind_r]) || - (actualStrides[ind_l] == actualStrides[ind_r] && outer_block_dims[ind_l] > outer_block_dims[ind_r]); + (actualStrides[ind_l] == actualStrides[ind_r] && + outer_block_dims[ind_l] > outer_block_dims[ind_r]); }); } @@ -520,7 +546,7 @@ bool DnnlBlockedMemoryDesc::isSame(dnnl::memory::format_tag fmt) const { { const auto dims = refDesc.get_dims(); VectorDims total_block_per_dim(dims.size(), 1); - const auto &blk_desc = refDesc.get()->format_desc.blocking; + const auto& blk_desc = refDesc.get()->format_desc.blocking; for (int i = 0; i < blk_desc.inner_nblks; i++) { total_block_per_dim[blk_desc.inner_idxs[i]] *= blk_desc.inner_blks[i]; } @@ -530,11 +556,10 @@ bool DnnlBlockedMemoryDesc::isSame(dnnl::memory::format_tag fmt) const { } std::iota(refOrder.begin(), refOrder.end(), 0); - std::sort(refOrder.begin(), refOrder.end(), - [&refStrides, &outer_block_dims] (size_t ind_l, size_t ind_r) { - return (refStrides[ind_l] > refStrides[ind_r]) || - (refStrides[ind_l] == refStrides[ind_r] && outer_block_dims[ind_l] > outer_block_dims[ind_r]); - }); + std::sort(refOrder.begin(), refOrder.end(), [&refStrides, &outer_block_dims](size_t ind_l, size_t ind_r) { + return (refStrides[ind_l] > refStrides[ind_r]) || + (refStrides[ind_l] == refStrides[ind_r] && outer_block_dims[ind_l] > outer_block_dims[ind_r]); + }); } if (actualOrder != refOrder) { @@ -549,7 +574,9 @@ size_t DnnlBlockedMemoryDesc::getMaxMemSize() const { } const auto& maxDims = shape.getMaxDims(); - if (std::any_of(maxDims.begin(), maxDims.end(), [](size_t x){ return Shape::UNDEFINED_DIM == x; })) { + if (std::any_of(maxDims.begin(), maxDims.end(), [](size_t x) { + return Shape::UNDEFINED_DIM == x; + })) { return UNDEFINED_SIZE; } @@ -563,11 +590,13 @@ size_t DnnlBlockedMemoryDesc::getPaddedElementsCount() const { } auto padded_dims = desc.get_padded_dims(); - if (std::any_of(std::begin(padded_dims), std::begin(padded_dims) + desc.get_ndims(), - [](dnnl_dim_t dim) { return dim == DNNL_RUNTIME_DIM_VAL; })) { + if (std::any_of(std::begin(padded_dims), std::begin(padded_dims) + desc.get_ndims(), [](dnnl_dim_t dim) { + return dim == DNNL_RUNTIME_DIM_VAL; + })) { OPENVINO_THROW("Can't compute padded elements count for non undefined blocked dims"); } - return std::accumulate(std::begin(padded_dims), std::begin(padded_dims) + desc.get_ndims(), + return std::accumulate(std::begin(padded_dims), + std::begin(padded_dims) + desc.get_ndims(), size_t{1}, std::multiplies()); } @@ -586,7 +615,7 @@ void DnnlBlockedMemoryDesc::initBlockDims() { const auto dims = desc.get_dims(); const size_t outer_ndims = dims.size(); - const auto inner_ndims = desc.get_inner_nblks(); + const auto inner_ndims = desc.get_inner_nblks(); const size_t total_ndims = outer_ndims + inner_ndims; // total inner block size. in case of 4i16o4i will be {16, 16, 1, 1} @@ -612,10 +641,10 @@ void DnnlBlockedMemoryDesc::initBlockDims() { std::copy(order.begin(), order.begin() + outer_ndims, outer_order.begin()); blockedDims.resize(total_ndims, 0); - std::copy(inner_blks.begin(), inner_blks.begin() + inner_nblks, - blockedDims.end() - inner_nblks); - std::transform(outer_order.begin(), outer_order.end(), blockedDims.begin(), - [&] (size_t i) { return outer_block_dims[i]; }); + std::copy(inner_blks.begin(), inner_blks.begin() + inner_nblks, blockedDims.end() - inner_nblks); + std::transform(outer_order.begin(), outer_order.end(), blockedDims.begin(), [&](size_t i) { + return outer_block_dims[i]; + }); } void DnnlBlockedMemoryDesc::initStrides() { @@ -623,7 +652,7 @@ void DnnlBlockedMemoryDesc::initStrides() { const size_t outer_ndims = dims.size(); const size_t inner_nblks = desc.get_inner_nblks(); - const auto inner_blks = desc.get_inner_blks(); + const auto inner_blks = desc.get_inner_blks(); const size_t total_ndims = outer_ndims + inner_nblks; // strides of inner dims. In case of 4i16o4i will be {64, 4, 1} @@ -642,8 +671,9 @@ void DnnlBlockedMemoryDesc::initStrides() { std::copy(inner_strides.rbegin(), inner_strides.rend(), strides.rbegin()); const auto desc_strides = desc.get_strides(); - std::transform(outer_order.begin(), outer_order.end(), strides.begin(), - [&](size_t i) { return desc_strides[i] == DNNL_RUNTIME_DIM_VAL ? Shape::UNDEFINED_DIM : desc_strides[i]; }); + std::transform(outer_order.begin(), outer_order.end(), strides.begin(), [&](size_t i) { + return desc_strides[i] == DNNL_RUNTIME_DIM_VAL ? Shape::UNDEFINED_DIM : desc_strides[i]; + }); } void DnnlBlockedMemoryDesc::initOffsetPadding() { @@ -659,15 +689,17 @@ MemoryDescPtr DnnlBlockedMemoryDesc::cloneWithNewPrecision(const ov::element::Ty } void DnnlBlockedMemoryDesc::recomputeDefaultStrides() { - const auto &rank = getShape().getRank(); + const auto& rank = getShape().getRank(); if (order.size() != blockedDims.size()) OPENVINO_THROW("Can't recompute stride: order size != blocked dims size"); - auto &oneDnnStrides = desc.get()->format_desc.blocking.strides; + auto& oneDnnStrides = desc.get()->format_desc.blocking.strides; if (getShape().hasZeroDims()) { std::fill(std::begin(oneDnnStrides), std::begin(oneDnnStrides) + getShape().getRank(), 0); - } else if (std::any_of(blockedDims.begin(), blockedDims.end(), [](Dim val) { return val == Shape::UNDEFINED_DIM; })) { + } else if (std::any_of(blockedDims.begin(), blockedDims.end(), [](Dim val) { + return val == Shape::UNDEFINED_DIM; + })) { std::fill(std::begin(oneDnnStrides), std::begin(oneDnnStrides) + rank, DNNL_RUNTIME_DIM_VAL); initStrides(); } else { @@ -682,8 +714,8 @@ void DnnlBlockedMemoryDesc::recomputeDefaultStrides() { } } -DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const dnnl::memory::desc& mdesc, const Shape& shape) : - MemoryDesc(shape, DnnlBlocked) { +DnnlBlockedMemoryDesc::DnnlBlockedMemoryDesc(const dnnl::memory::desc& mdesc, const Shape& shape) + : MemoryDesc(shape, DnnlBlocked) { if (mdesc.get_format_kind() == dnnl::memory::format_kind::any) OPENVINO_THROW("Unexpected: Memory format any is prohibited!"); @@ -715,5 +747,5 @@ std::string DnnlBlockedMemoryDesc::serializeFormat() const { return BlockedMemoryDesc::serializeFormat(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.h index a6c6a3297ba044..91388c12e2abf7 100644 --- a/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/dnnl_blocked_memory_desc.h @@ -4,19 +4,20 @@ #pragma once +#include + +#include "dnnl_extension_utils.h" #include "dnnl_memory_desc.h" #include "memory_desc/blocked_memory_desc.h" #include "openvino/util/util.hpp" -#include "dnnl_extension_utils.h" -#include namespace ov { namespace intel_cpu { class CpuBlockedMemoryDesc; -OPENVINO_DISABLE_WARNING_MSVC_BEGIN(4250) // Visual Studio warns us about inheritance via dominance but it's done intentionally - // so turn it off +OPENVINO_DISABLE_WARNING_MSVC_BEGIN(4250) // Visual Studio warns us about inheritance via dominance but it's done + // intentionally so turn it off class DnnlBlockedMemoryDesc : public BlockedMemoryDesc, public DnnlMemoryDesc { public: // Creates planar DnnlBlockedMemoryDesc @@ -30,8 +31,8 @@ class DnnlBlockedMemoryDesc : public BlockedMemoryDesc, public DnnlMemoryDesc { bool isCompatible(const MemoryDesc& rhs) const override; bool isCompatible(const BlockedMemoryDesc& rhs, CmpMask cmpMask) const override; - bool isCompatible(const CpuBlockedMemoryDesc &rhs, CmpMask cmpMask = FULL_MASK) const; - bool isCompatible(const DnnlBlockedMemoryDesc &rhs, CmpMask cmpMask = FULL_MASK) const; + bool isCompatible(const CpuBlockedMemoryDesc& rhs, CmpMask cmpMask = FULL_MASK) const; + bool isCompatible(const DnnlBlockedMemoryDesc& rhs, CmpMask cmpMask = FULL_MASK) const; const VectorDims& getBlockDims() const override { return blockedDims; @@ -63,17 +64,22 @@ class DnnlBlockedMemoryDesc : public BlockedMemoryDesc, public DnnlMemoryDesc { MemoryDescPtr cloneWithNewPrecision(const ov::element::Type prec) const override; - using DnnlMemoryDesc::setPrecision; using DnnlMemoryDesc::getPrecision; + using DnnlMemoryDesc::setPrecision; private: - DnnlBlockedMemoryDesc(ov::element::Type prc, const Shape& shape, const VectorDims& blockedDims, - const VectorDims& order, size_t offsetPadding = 0, const VectorDims& offsetPaddingToData = {}, + DnnlBlockedMemoryDesc(ov::element::Type prc, + const Shape& shape, + const VectorDims& blockedDims, + const VectorDims& order, + size_t offsetPadding = 0, + const VectorDims& offsetPaddingToData = {}, const VectorDims& strides = {}); - // Creates DnnlBlockedMemoryDesc using the shape parameter as a true shape but all other params (layout, blocks, etc.) are used from the mdesc, but - // the mdesc own shape is ignored. The main purpose of this constructor is making dynamic descriptor from some dummy mdesc, which stores info about - // layout, blocking, strides, etc., and the provided dynamic shape. + // Creates DnnlBlockedMemoryDesc using the shape parameter as a true shape but all other params (layout, blocks, + // etc.) are used from the mdesc, but the mdesc own shape is ignored. The main purpose of this constructor is making + // dynamic descriptor from some dummy mdesc, which stores info about layout, blocking, strides, etc., and the + // provided dynamic shape. DnnlBlockedMemoryDesc(const dnnl::memory::desc& mdesc, const Shape& shape); explicit DnnlBlockedMemoryDesc(const_dnnl_memory_desc_t cdesc); @@ -84,7 +90,8 @@ class DnnlBlockedMemoryDesc : public BlockedMemoryDesc, public DnnlMemoryDesc { bool isBlockedCFormat(size_t blk_size = UNREACHABLE_DIM) const; bool isTailCFormat() const; - // WA: we need to initialize blocked params into ctor to avoid bugs when we calculate these params in throughput mode + // WA: we need to initialize blocked params into ctor to avoid bugs when we calculate these params in throughput + // mode // TODO [DS]: should be reimplemented to avoid useless calculation void initBlockedParams() { initBlockDims(); @@ -99,7 +106,8 @@ class DnnlBlockedMemoryDesc : public BlockedMemoryDesc, public DnnlMemoryDesc { void recomputeDefaultStrides(); friend DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const_dnnl_memory_desc_t desc); - friend std::shared_ptr DnnlExtensionUtils::makeUndefinedDesc(const dnnl::memory::desc &desc, const Shape& shape); + friend std::shared_ptr DnnlExtensionUtils::makeUndefinedDesc(const dnnl::memory::desc& desc, + const Shape& shape); friend class MemoryDescUtils; }; OPENVINO_DISABLE_WARNING_MSVC_END(4250) @@ -107,5 +115,5 @@ OPENVINO_DISABLE_WARNING_MSVC_END(4250) using DnnlBlockedMemoryDescPtr = std::shared_ptr; using DnnlBlockedMemoryDescCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.cpp b/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.cpp index 3e3af41cfc523a..375b218272ed57 100644 --- a/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.cpp +++ b/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.cpp @@ -3,20 +3,21 @@ // #include "dnnl_memory_desc.h" -#include "dnnl_extension_utils.h" + #include #include + +#include "dnnl_extension_utils.h" #include "onednn/dnnl.h" namespace ov { namespace intel_cpu { -DnnlMemoryDesc::DnnlMemoryDesc(const dnnl::memory::desc& desc) : - DnnlMemoryDesc(desc.get()) {} +DnnlMemoryDesc::DnnlMemoryDesc(const dnnl::memory::desc& desc) : DnnlMemoryDesc(desc.get()) {} -DnnlMemoryDesc::DnnlMemoryDesc(const_dnnl_memory_desc_t cdesc) : - MemoryDesc(Shape(DnnlExtensionUtils::convertToVectorDims(cdesc->dims, cdesc->ndims)), Dnnl), - desc(DnnlExtensionUtils::clone_desc(cdesc)) { +DnnlMemoryDesc::DnnlMemoryDesc(const_dnnl_memory_desc_t cdesc) + : MemoryDesc(Shape(DnnlExtensionUtils::convertToVectorDims(cdesc->dims, cdesc->ndims)), Dnnl), + desc(DnnlExtensionUtils::clone_desc(cdesc)) { if (getFormatKind() == dnnl::memory::format_kind::any) OPENVINO_THROW("Unexpected: Memory format any is prohibited!"); } @@ -35,7 +36,7 @@ MemoryDescPtr DnnlMemoryDesc::cloneWithNewPrecision(const ov::element::Type prec return newDesc; } -bool DnnlMemoryDesc::isCompatible(const MemoryDesc &rhs) const { +bool DnnlMemoryDesc::isCompatible(const MemoryDesc& rhs) const { if (MemoryDescType::Dnnl & rhs.getType()) { auto* dnnMemDesc = rhs.as(); return isCompatible(*dnnMemDesc); @@ -52,17 +53,25 @@ std::string DnnlMemoryDesc::serializeFormat() const { dnnl::impl::memory_desc_wrapper wrapped(desc.get()); if (wrapped.is_wino_desc()) { switch (desc.get()->format_desc.wino_desc.wino_format) { - case dnnl::impl::wino_memory_format_t::wino_wei_aaOio: return "wino_aaOio"; - case dnnl::impl::wino_memory_format_t::wino_wei_aaOBiOo: return "wino_aaOBiOo"; - case dnnl::impl::wino_memory_format_t::wino_wei_OBaaIBOIio: return "wino_OBaaIBOIio"; - default: return "wino_undef"; + case dnnl::impl::wino_memory_format_t::wino_wei_aaOio: + return "wino_aaOio"; + case dnnl::impl::wino_memory_format_t::wino_wei_aaOBiOo: + return "wino_aaOBiOo"; + case dnnl::impl::wino_memory_format_t::wino_wei_OBaaIBOIio: + return "wino_OBaaIBOIio"; + default: + return "wino_undef"; } } else if (wrapped.is_rnn_packed_desc()) { switch (desc.get()->format_desc.rnn_packed_desc.format) { - case dnnl::impl::rnn_packed_format::ldigo_p: return "packed_ldigo"; - case dnnl::impl::rnn_packed_format::ldgoi_p: return "packed_ldgoi"; - case dnnl::impl::rnn_packed_format::ldio_p: return "packed_ldio"; - default: return "packed_undef"; + case dnnl::impl::rnn_packed_format::ldigo_p: + return "packed_ldigo"; + case dnnl::impl::rnn_packed_format::ldgoi_p: + return "packed_ldgoi"; + case dnnl::impl::rnn_packed_format::ldio_p: + return "packed_ldio"; + default: + return "packed_undef"; } } return "undef"; @@ -116,7 +125,7 @@ bool DnnlMemoryDesc::isDefinedImp() const { return wrappedThis.offset0() != DNNL_RUNTIME_DIM_VAL; } -MemoryDescPtr DnnlMemoryDesc::cloneWithNewDimsImp(const VectorDims &dims) const { +MemoryDescPtr DnnlMemoryDesc::cloneWithNewDimsImp(const VectorDims& dims) const { OPENVINO_THROW("Unexpected: Cannot clone non blocked oneDNN desc with new dims"); } @@ -125,6 +134,5 @@ size_t DnnlMemoryDesc::getOffsetPadding() const { return DnnlExtensionUtils::convertToDim(wrap.offset0()); } - -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.h index f2722a5170f871..6b3692c5663078 100644 --- a/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/dnnl_memory_desc.h @@ -4,11 +4,11 @@ #pragma once -#include "dnnl_extension_utils.h" #include #include -#include "memory_desc/cpu_memory_desc.h" + #include "dnnl_extension_utils.h" +#include "memory_desc/cpu_memory_desc.h" namespace ov { namespace intel_cpu { @@ -29,13 +29,17 @@ class DnnlMemoryDesc : public virtual MemoryDesc { bool isCompatible(const MemoryDesc& rhs) const override; bool isCompatible(const DnnlMemoryDesc& rhs) const; - bool hasLayoutType(LayoutType layoutType) const override { return false; } + bool hasLayoutType(LayoutType layoutType) const override { + return false; + } std::string serializeFormat() const override; size_t getMaxMemSize() const override; - virtual bool isSame(dnnl::memory::format_tag fmt) const { return false; } + virtual bool isSame(dnnl::memory::format_tag fmt) const { + return false; + } const dnnl::memory::desc& getDnnlDesc() const { return desc; @@ -70,10 +74,9 @@ class DnnlMemoryDesc : public virtual MemoryDesc { bool isDefinedImp() const override; MemoryDescPtr cloneWithNewDimsImp(const VectorDims& dims) const override; - friend DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const dnnl::memory::desc &desc); + friend DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const dnnl::memory::desc& desc); friend DnnlMemoryDescPtr DnnlExtensionUtils::makeDescriptor(const_dnnl_memory_desc_t desc); }; -} // namespace intel_cpu -} // namespace ov - +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_desc/empty_memory_desc.h b/src/plugins/intel_cpu/src/memory_desc/empty_memory_desc.h index 1575841cb2be9e..c26cc6aa33a251 100644 --- a/src/plugins/intel_cpu/src/memory_desc/empty_memory_desc.h +++ b/src/plugins/intel_cpu/src/memory_desc/empty_memory_desc.h @@ -5,7 +5,6 @@ #pragma once #include "cpu_memory_desc.h" - #include "cpu_shape.h" #include "openvino/core/except.hpp" #include "openvino/core/type/element_type.hpp" @@ -23,8 +22,7 @@ namespace intel_cpu { */ class EmptyMemoryDesc : public MemoryDesc { public: - EmptyMemoryDesc(): - MemoryDesc(Shape{0}, Empty) { + EmptyMemoryDesc() : MemoryDesc(Shape{0}, Empty) { /* status never changes for an empty memory desc * so "define" beforehand to ensure isDefined() is thread safe */ status = MemoryDesc::descStatus::Defined; @@ -60,7 +58,9 @@ class EmptyMemoryDesc : public MemoryDesc { MemoryDescPtr cloneWithNewPrecision(const ov::element::Type prec) const override { OPENVINO_ASSERT(prec == ov::element::undefined, - "Clone an empty memory desc with defined precision: ", prec, " is prohibited"); + "Clone an empty memory desc with defined precision: ", + prec, + " is prohibited"); return clone(); } @@ -92,5 +92,5 @@ class EmptyMemoryDesc : public MemoryDesc { using EmptyMemoryDescPtr = std::shared_ptr; using EmptyMemoryDescCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/memory_state.cpp b/src/plugins/intel_cpu/src/memory_state.cpp index aa06f4ebd82957..c0dc85c4103ce4 100644 --- a/src/plugins/intel_cpu/src/memory_state.cpp +++ b/src/plugins/intel_cpu/src/memory_state.cpp @@ -5,30 +5,33 @@ #include "memory_state.h" #include + #include "cpu_memory.h" +#include "cpu_tensor.h" +#include "dnnl_extension_utils.h" #include "memory_desc/cpu_blocked_memory_desc.h" #include "memory_desc/cpu_memory_desc_utils.h" -#include "dnnl_extension_utils.h" -#include "cpu_tensor.h" -#include "utils/plain_tensor.hpp" -#include "openvino/core/parallel.hpp" #include "nodes/common/cpu_convert.h" #include "nodes/kernels/scaled_attn/attn_quant.hpp" +#include "openvino/core/parallel.hpp" +#include "utils/plain_tensor.hpp" using namespace ov::Extensions::Cpu::XARCH; namespace ov { namespace intel_cpu { -VariableStateBase::VariableStateBase(const std::string& name, const MemoryDescPtr& external_desc) : - IVariableState{name} , m_external_desc{external_desc} {} +VariableStateBase::VariableStateBase(const std::string& name, const MemoryDescPtr& external_desc) + : IVariableState{name}, + m_external_desc{external_desc} {} MemoryDescPtr VariableStateBase::to_static(const MemoryDescPtr& desc) { if (!desc->isDefined()) { auto&& current_dims = desc->getShape().getDims(); VectorDims new_dims(current_dims.size()); std::transform(current_dims.begin(), current_dims.end(), new_dims.begin(), [](Dim x) { - return x == Shape::UNDEFINED_DIM ? 0 : x; }); + return x == Shape::UNDEFINED_DIM ? 0 : x; + }); return desc->cloneWithNewDims(new_dims, true); } @@ -71,21 +74,26 @@ ov::SoPtr VariableStateBase::get_state() const { return std::make_shared(internal_state_mem()); } - //test precision + // test precision { auto internal_prc = current_internal_desc->getPrecision(); auto tmp_desc = current_ext_desc->cloneWithNewPrecision(internal_prc); if (tmp_desc->isCompatible(*current_internal_desc)) { auto mem = std::make_shared(get_engine(), current_ext_desc); - size_t elements_to_convert = internal_state_mem()->getDescWithType()->getPaddedElementsCount(); + size_t elements_to_convert = + internal_state_mem()->getDescWithType()->getPaddedElementsCount(); auto external_prc = current_ext_desc->getPrecision(); - cpu_convert(internal_state_mem()->getData(), mem->getData(), internal_prc, external_prc, elements_to_convert); + cpu_convert(internal_state_mem()->getData(), + mem->getData(), + internal_prc, + external_prc, + elements_to_convert); return std::make_shared(mem); } } - //reorder + // reorder auto mem = std::make_shared(get_engine(), current_ext_desc); mem->load(*(internal_state_mem())); return std::make_shared(mem); @@ -108,19 +116,19 @@ void VariableStateBase::commit() { VariableStateDoubleBuffer::VariableStateDoubleBuffer(const std::string& name, const MemoryPtr& first_buffer, const MemoryPtr& second_buffer, - const MemoryDescPtr& external_desc) : - VariableStateBase(name, external_desc) { + const MemoryDescPtr& external_desc) + : VariableStateBase(name, external_desc) { OPENVINO_ASSERT(first_buffer && second_buffer); reset_prime_mem(first_buffer); reset_second_mem(second_buffer); m_internal_desc = prime_mem()->getDescPtr(); auto&& shape = m_internal_desc->getShape(); - //TODO what if by some reason we already have internal static state while the node is dynamic, is it even possible? + // TODO what if by some reason we already have internal static state while the node is dynamic, is it even possible? if (shape.isStatic()) { prime_mem()->nullify(); } else { - //in the case of the original desc has dynamic shape we create an empty tensor + // in the case of the original desc has dynamic shape we create an empty tensor auto new_desc = to_static(m_internal_desc); prime_mem()->redefineDesc(new_desc); } @@ -199,11 +207,11 @@ void VariableStateSingleBuffer::commit_impl() { // nothing to do } -VariableStateKVcache::VariableStateKVcache( - const std::string& name, - const MemoryDescPtr& external_desc, - const BlockedMemoryDescPtr& dense_internal_desc) : - VariableStateBase(name, external_desc), m_dense_internal_desc(dense_internal_desc) { +VariableStateKVcache::VariableStateKVcache(const std::string& name, + const MemoryDescPtr& external_desc, + const BlockedMemoryDescPtr& dense_internal_desc) + : VariableStateBase(name, external_desc), + m_dense_internal_desc(dense_internal_desc) { auto&& shape = external_desc->getShape(); OPENVINO_ASSERT(shape.isDynamic(), "VariableStateKVcache is unexpectedly initalized with a static tensor"); @@ -227,7 +235,7 @@ ov::SoPtr VariableStateKVcache::get_state() const { OPENVINO_ASSERT(actual_external_desc->getShape().getRank() == 4); auto&& actual_internal_order = actual_internal_desc->getOrder(); - //sanity check + // sanity check OPENVINO_ASSERT(actual_internal_order == m_dense_internal_desc->getOrder()); PlainTensor output, pastkv, beam_table; @@ -253,20 +261,12 @@ ov::SoPtr VariableStateKVcache::get_state() const { S, m_scale_zp.ptr(m, b_kv, h)[0], m_scale_zp.ptr(m, b_kv, h)[1]); - cpu_convert(buffers[ithr].ptr(), - output.ptr_v(m, b, h), - element::f32, - output.m_dt, - S); + cpu_convert(buffers[ithr].ptr(), output.ptr_v(m, b, h), element::f32, output.m_dt, S); }); } else { parallel_for3d(L0, B, H, [&](size_t m, size_t b, size_t h) { auto b_kv = static_cast(beam_table.at({b, m})); - cpu_convert(pastkv.ptr_v(m, b_kv, h), - output.ptr_v(m, b, h), - pastkv.m_dt, - output.m_dt, - S); + cpu_convert(pastkv.ptr_v(m, b_kv, h), output.ptr_v(m, b, h), pastkv.m_dt, output.m_dt, S); }); } @@ -274,11 +274,11 @@ ov::SoPtr VariableStateKVcache::get_state() const { } void VariableStateKVcache::set_state_impl(const ov::SoPtr& state) { - //1. reset the memory object - m_state = state; // simply to extend the lifetime + // 1. reset the memory object + m_state = state; // simply to extend the lifetime auto state_desc = MemoryDescUtils::generateCpuBlockedMemoryDesc(m_state); - //May be optimized by reusing the state tensor underlining memory pointer, but corner cases should be considered + // May be optimized by reusing the state tensor underlining memory pointer, but corner cases should be considered auto dense_internal_desc = m_dense_internal_desc->cloneWithNewDims(state_desc->getShape().getStaticDims()); m_internal_mem = std::make_shared(get_engine(), dense_internal_desc); @@ -287,7 +287,10 @@ void VariableStateKVcache::set_state_impl(const ov::SoPtr& state) { if (dense_internal_desc->getPrecision() == element::u8) { PlainTensor external, internal; auto&& actual_internal_order = m_dense_internal_desc->getOrder(); - external.resize(external_mem.getStaticDims(), state_desc->getPrecision().size(), state_desc->getPrecision(), m_state->data()); + external.resize(external_mem.getStaticDims(), + state_desc->getPrecision().size(), + state_desc->getPrecision(), + m_state->data()); internal.reset(m_internal_mem); external = external.permute(actual_internal_order); internal = internal.permute(actual_internal_order); @@ -300,11 +303,7 @@ void VariableStateKVcache::set_state_impl(const ov::SoPtr& state) { m_scale_zp.resize({L0, B, H, 2}); parallel_for3d(B, H, L0, [&](size_t ithr, size_t b, size_t h, size_t m) { buffers[ithr].resize({S}); - cpu_convert(external.ptr_v(m, b, h), - buffers[ithr].ptr(), - external.m_dt, - element::f32, - S); + cpu_convert(external.ptr_v(m, b, h), buffers[ithr].ptr(), external.m_dt, element::f32, S); attn_quant_u8(buffers[ithr].ptr(), internal.ptr(m, b, h), S, @@ -315,14 +314,13 @@ void VariableStateKVcache::set_state_impl(const ov::SoPtr& state) { m_internal_mem->load(external_mem); } - //2. Reset the beam search table + // 2. Reset the beam search table auto&& state_dims = dense_internal_desc->getShape().getStaticDims(); auto&& order = m_dense_internal_desc->getOrder(); const size_t size_B = state_dims[order.at(1)]; const size_t size_L = state_dims[order.at(0)]; - auto mem_desc = - std::make_shared(ov::element::i32, Shape{size_B, size_L}); + auto mem_desc = std::make_shared(ov::element::i32, Shape{size_B, size_L}); m_hidden_state = std::make_shared(get_engine(), mem_desc); auto buff = m_hidden_state->getDataAs(); @@ -336,11 +334,11 @@ void VariableStateKVcache::set_state_impl(const ov::SoPtr& state) { } void VariableStateKVcache::reset_impl() { - //nothing to do + // nothing to do } void VariableStateKVcache::commit_impl() { - //nothing to do + // nothing to do } MemoryPtr VariableStateKVcache::input_mem() { @@ -352,7 +350,7 @@ MemoryPtr VariableStateKVcache::output_mem() { } MemoryDescPtr VariableStateKVcache::internal_desc() const { - return m_dense_internal_desc; //since we don't store initial one + return m_dense_internal_desc; // since we don't store initial one } MemoryPtr VariableStateKVcache::internal_state_mem() const { diff --git a/src/plugins/intel_cpu/src/memory_state.h b/src/plugins/intel_cpu/src/memory_state.h index e7493f327e93fa..f35e78989b02f8 100644 --- a/src/plugins/intel_cpu/src/memory_state.h +++ b/src/plugins/intel_cpu/src/memory_state.h @@ -29,12 +29,12 @@ class VariableStateBase : public IVariableState { public: VariableStateBase(const std::string& name, const MemoryDescPtr& external_desc); - //ov::IVariableState - void set_state(const ov::SoPtr& state) override final; // NOLINT + // ov::IVariableState + void set_state(const ov::SoPtr& state) override final; // NOLINT ov::SoPtr get_state() const override; - void reset() override final; // NOLINT - bool is_reset_state() const override final; // NOLINT - void commit() override final; // NOLINT + void reset() override final; // NOLINT + bool is_reset_state() const override final; // NOLINT + void commit() override final; // NOLINT protected: virtual MemoryPtr internal_state_mem() const = 0; @@ -66,7 +66,7 @@ class VariableStateDoubleBuffer : public VariableStateBase { MemoryDescPtr internal_desc() const override; private: - //ov::intel_cpu::VariableStateBase + // ov::intel_cpu::VariableStateBase void reset_impl() override; void commit_impl() override; @@ -89,7 +89,7 @@ class VariableStateDoubleBuffer : public VariableStateBase { MemoryPtr internal_state_mem() const override; private: - MemoryDescPtr m_internal_desc; //mem desc required by the graph internal tensor + MemoryDescPtr m_internal_desc; // mem desc required by the graph internal tensor std::array m_internal_mem{}; size_t buffer_num = 0; }; @@ -111,7 +111,7 @@ class VariableStateSingleBuffer : public VariableStateBase { MemoryPtr internal_state_mem() const override; private: - MemoryDescPtr m_internal_desc; //mem desc required by the graph internal tensor + MemoryDescPtr m_internal_desc; // mem desc required by the graph internal tensor MemoryPtr m_internal_mem; }; @@ -121,10 +121,10 @@ class VariableStateKVcache : public VariableStateBase { const MemoryDescPtr& external_desc, const BlockedMemoryDescPtr& dense_internal_desc); - //ov::IVariableState + // ov::IVariableState ov::SoPtr get_state() const override; - //ov::intel_cpu::VariableStateBase + // ov::intel_cpu::VariableStateBase MemoryPtr input_mem() override; MemoryPtr output_mem() override; MemoryDescPtr internal_desc() const override; @@ -158,14 +158,14 @@ class VariableStateKVcache : public VariableStateBase { } private: - //ov::intel_cpu::VariableStateBase + // ov::intel_cpu::VariableStateBase void set_state_impl(const ov::SoPtr& state) override; void reset_impl() override; void commit_impl() override; private: - MemoryPtr m_internal_mem; // kv cache - MemoryPtr m_hidden_state; // beam access table + MemoryPtr m_internal_mem; // kv cache + MemoryPtr m_hidden_state; // beam access table size_t m_internal_mem_max_size = 0; size_t m_hidden_state_max_size = 0; @@ -178,5 +178,5 @@ class VariableStateKVcache : public VariableStateBase { using MemStatePtr = std::shared_ptr; using MemStateCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/mlas/thread_pool.hpp b/src/plugins/intel_cpu/src/mlas/thread_pool.hpp index 536b3746be1d69..5af8b0cce915fa 100644 --- a/src/plugins/intel_cpu/src/mlas/thread_pool.hpp +++ b/src/plugins/intel_cpu/src/mlas/thread_pool.hpp @@ -7,6 +7,7 @@ #include #include #include + #include "mlas.h" namespace ov { @@ -17,6 +18,7 @@ class OVMlasThreadPool : public IMlasThreadPool { explicit OVMlasThreadPool(const size_t& threadNum) : threadNum(threadNum) {} size_t DegreeOfParallelism() override; void TrySimpleParallelFor(const std::ptrdiff_t total, const std::function& fn) override; + public: // the actual threads used for sgemm size_t threadNum = 0; diff --git a/src/plugins/intel_cpu/src/node.cpp b/src/plugins/intel_cpu/src/node.cpp index ee0a99c3bba44e..ddf8d068f920a2 100644 --- a/src/plugins/intel_cpu/src/node.cpp +++ b/src/plugins/intel_cpu/src/node.cpp @@ -3,39 +3,38 @@ // #include "node.h" -#include "cpu_types.h" -#include "edge.h" -#include "partitioned_mem_blk.h" -#include "openvino/core/type/element_type.hpp" +#include +#include + +#include +#include +#include #include #include -#include +#include #include -#include #include +#include +#include "cpu_types.h" +#include "dnnl_extension_utils.h" +#include "edge.h" +#include "memory_desc/cpu_memory_desc_utils.h" +#include "memory_desc/dnnl_blocked_memory_desc.h" +#include "nodes/common/cpu_convert.h" #include "nodes/conv.h" #include "nodes/eltwise.h" #include "nodes/input.h" -#include "nodes/reorder.h" #include "nodes/reference.h" -#include "dnnl_extension_utils.h" - +#include "nodes/reorder.h" +#include "openvino/core/type/element_type.hpp" +#include "partitioned_mem_blk.h" +#include "utils/cpu_utils.hpp" #include "utils/debug_capabilities.h" +#include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" #include "utils/rt_info/memory_formats_attribute.hpp" -#include - -#include -#include -#include "utils/general_utils.h" -#include "utils/cpu_utils.hpp" -#include "nodes/common/cpu_convert.h" -#include "memory_desc/cpu_memory_desc_utils.h" -#include "memory_desc/dnnl_blocked_memory_desc.h" -#include -#include using namespace dnnl; using namespace openvino; @@ -44,7 +43,7 @@ using namespace ov::intel_cpu::node; namespace ov { namespace intel_cpu { -Node::NodesFactory & Node::factory() { +Node::NodesFactory& Node::factory() { static NodesFactory factoryInstance; return factoryInstance; } @@ -63,7 +62,7 @@ Node::Node(const std::shared_ptr& op, type(TypeFromName(op->get_type_name())), profiling(op->get_friendly_name()) { for (size_t i = 0; i < op->get_input_size(); i++) { - const auto &shape = op->get_input_partial_shape(i); + const auto& shape = op->get_input_partial_shape(i); if (shape.rank().is_dynamic()) { OPENVINO_THROW("Unexpected: CPU plug-in doesn't support ", getTypeStr(), @@ -83,7 +82,7 @@ Node::Node(const std::shared_ptr& op, OPENVINO_THROW("Node with type '", typeStr, "' and name '", name, "' does not have any outputs."); } for (size_t i = 0; i < op->get_output_size(); i++) { - const auto &shape = op->get_output_partial_shape(i); + const auto& shape = op->get_output_partial_shape(i); if (shape.rank().is_dynamic()) { OPENVINO_THROW("Unexpected: CPU plug-in doesn't support ", getTypeStr(), @@ -99,8 +98,14 @@ Node::Node(const std::shared_ptr& op, childEdges.reserve(outputShapes.size()); } - isDynamic = std::any_of(inputShapes.begin(), inputShapes.end(), [](const Shape& shape){ return shape.isDynamic(); }) || - std::any_of(outputShapes.begin(), outputShapes.end(), [](const Shape& shape){ return shape.isDynamic(); }); + isDynamic = std::any_of(inputShapes.begin(), + inputShapes.end(), + [](const Shape& shape) { + return shape.isDynamic(); + }) || + std::any_of(outputShapes.begin(), outputShapes.end(), [](const Shape& shape) { + return shape.isDynamic(); + }); if (isDynamic) { shapeInference = shapeInferFactory.makeShapeInfer(); @@ -127,12 +132,13 @@ Node::Node(const std::shared_ptr& op, if (str.substr(0, 4) != "cpu:") continue; customImplPriorities.push_back(parse_impl_name(str)); - if (customImplPriorities.back() == impl_desc_type::unknown && - str != "cpu:unknown") + if (customImplPriorities.back() == impl_desc_type::unknown && str != "cpu:unknown") OPENVINO_THROW("Unsupported CPU implementation ", str, " for node ", getName()); } const auto& defaultImplPriorities = getDefaultImplPriority(); - customImplPriorities.insert(customImplPriorities.end(), defaultImplPriorities.begin(), defaultImplPriorities.end()); + customImplPriorities.insert(customImplPriorities.end(), + defaultImplPriorities.begin(), + defaultImplPriorities.end()); } std::string inputMemoryFormats = getInputMemoryFormats(op); @@ -199,10 +205,11 @@ void Node::addEdge(const EdgePtr& edge) { } void Node::remove() { - auto drop = [](std::vector edges){ + auto drop = [](std::vector edges) { for (auto& edge : edges) { auto edgePtr = edge.lock(); - if (!edgePtr) continue; + if (!edgePtr) + continue; edgePtr->getParent()->removeChildEdge(edgePtr); edgePtr->getChild()->removeParentEdge(edgePtr); } @@ -213,7 +220,7 @@ void Node::remove() { } bool Node::isEdgesEmpty(const std::vector& edges) const { - for (auto &edge : edges) { + for (auto& edge : edges) { if (edge.lock()) return false; } @@ -265,7 +272,8 @@ void Node::selectPreferPrimitiveDescriptor(const std::vector& pr auto parentEdge = getParentEdgeAt(j); auto parentPtr = parentEdge->getParent(); - // We don't take into account constant edges since reorders on them will be executed on load network stage + // We don't take into account constant edges since reorders on them will be executed on load network + // stage if (ignoreConstInputs && j > 0 && parentPtr->isConstant()) { equalsLocalFormatCount++; continue; @@ -286,10 +294,20 @@ void Node::selectPreferPrimitiveDescriptor(const std::vector& pr equalsLocalFormatCount++; } - DEBUG_LOG(getName(), " pd[", i, "].inConfs[", j, "]" - " is ", (isCompatible ? "compatible" : "not compatible"), - " with parent ", parentPtr->getName(), - " outConfs[", inNum, "], equalsLocalFormatCount add to ", equalsLocalFormatCount); + DEBUG_LOG(getName(), + " pd[", + i, + "].inConfs[", + j, + "]" + " is ", + (isCompatible ? "compatible" : "not compatible"), + " with parent ", + parentPtr->getName(), + " outConfs[", + inNum, + "], equalsLocalFormatCount add to ", + equalsLocalFormatCount); } if (equalsLocalFormatCount > equalsFormatCount) { @@ -334,7 +352,8 @@ bool Node::isReorderRequired(ov::intel_cpu::MemoryDescPtr desc1, ov::intel_cpu:: return !(isOneDimShape1 && isOneDimShape2 && samePrec); } -void Node::selectPreferPrimitiveDescriptorWithShape(const std::vector& priority, bool ignoreConstInputs) { +void Node::selectPreferPrimitiveDescriptorWithShape(const std::vector& priority, + bool ignoreConstInputs) { // Filter out dynamic shape. if (isDynamic) { return selectPreferPrimitiveDescriptor(priority, ignoreConstInputs); @@ -371,11 +390,22 @@ void Node::selectPreferPrimitiveDescriptorWithShape(const std::vectorgetShape().toPartialShape()) ? "one dim shape" : "not one dim shape"), - " with parent ", parentPtr->getName(), - " outConfs[", inNum, "], estimate add to ", estimate); + DEBUG_LOG(getName(), + " pd[", + i, + "].inConfs[", + j, + "]" + " is ", + (isCompatible ? "compatible" : "not compatible"), + " shape is ", + (isOneDimShape(curDesc->getShape().toPartialShape()) ? "one dim shape" : "not one dim shape"), + " with parent ", + parentPtr->getName(), + " outConfs[", + inNum, + "], estimate add to ", + estimate); } } return estimate; @@ -443,7 +473,7 @@ bool Node::canBeInPlace() const { } if (getParentEdges().size() != 1 || getParentEdgeAt(0)->getParent()->getChildEdges().size() != 1 || - (getParentEdgeAt(0)->getParent()->isConstant() && !getParentEdgeAt(0)->getChild()->isConstant())) + (getParentEdgeAt(0)->getParent()->isConstant() && !getParentEdgeAt(0)->getChild()->isConstant())) return false; // TODO: we need to extend this logic to properly handle all possible inplace conflicts @@ -463,7 +493,7 @@ bool Node::canBeInPlace() const { } void Node::resolveInPlaceEdges(Edge::LOOK look) { - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (!selected_pd) OPENVINO_THROW("Cannot find selected primitive descriptor for node: ", getName()); if (look & Edge::LOOK_DOWN) { @@ -478,16 +508,19 @@ void Node::resolveInPlaceEdges(Edge::LOOK look) { " Unexpected inplace resolve call to an allocated edge: ", *parentEdge); - //search for already allocated edge + // search for already allocated edge const auto& childEdges = getChildEdgesAtPort(inplaceOutIndx); - auto itr = std::find_if(childEdges.begin(), childEdges.end(), [](const EdgePtr& edge) { return edge->getStatus() == Edge::Status::Allocated; }); + auto itr = std::find_if(childEdges.begin(), childEdges.end(), [](const EdgePtr& edge) { + return edge->getStatus() == Edge::Status::Allocated; + }); OPENVINO_ASSERT(itr != childEdges.end(), " Could not find an allocated edge to resolve in-place for node: ", getName()); auto baseMemBlock = (*itr)->getMemory().getMemoryBlock(); auto memBlock = std::make_shared(baseMemBlock); - auto newMem = std::make_shared(getEngine(), selected_pd->getConfig().inConfs[i].getMemDesc(), memBlock); + auto newMem = + std::make_shared(getEngine(), selected_pd->getConfig().inConfs[i].getMemDesc(), memBlock); parentEdge->reuse(newMem); } } @@ -506,7 +539,8 @@ void Node::resolveInPlaceEdges(Edge::LOOK look) { OPENVINO_ASSERT(childEdge->getStatus() == Edge::Status::NotAllocated, " Unexpected inplace resolve call to an allocated edge: ", *childEdge); - auto newMem = std::make_shared(getEngine(), selected_pd->getConfig().outConfs[i].getMemDesc(), memBlock); + auto newMem = + std::make_shared(getEngine(), selected_pd->getConfig().outConfs[i].getMemDesc(), memBlock); childEdge->reuse(newMem); } } @@ -566,9 +600,9 @@ std::string Node::getPrimitiveDescriptorType() const { str_type += t; }; -#define SEARCH_TYPE(_type) \ - if ((type & impl_desc_type::_type) == impl_desc_type::_type) \ - add_type(#_type) +#define SEARCH_TYPE(_type) \ + if ((type & impl_desc_type::_type) == impl_desc_type::_type) \ + add_type(#_type) SEARCH_TYPE(undef); SEARCH_TYPE(reorder); @@ -609,13 +643,19 @@ std::string Node::getPrimitiveDescriptorType() const { if (selectedPrimitiveDesc) { if (!selectedPrimitiveDesc->getConfig().inConfs.empty()) { if (selectedPrimitiveDesc->getConfig().inConfs[0].getMemDesc()->getPrecision() != ov::element::u8) { - str_type += "_" + std::string(selectedPrimitiveDesc->getConfig().inConfs[0].getMemDesc()->getPrecision().get_type_name()); + str_type += + "_" + + std::string( + selectedPrimitiveDesc->getConfig().inConfs[0].getMemDesc()->getPrecision().get_type_name()); } else { str_type += "_I8"; } } else { if (selectedPrimitiveDesc->getConfig().outConfs[0].getMemDesc()->getPrecision() != ov::element::u8) { - str_type += "_" + std::string(selectedPrimitiveDesc->getConfig().outConfs[0].getMemDesc()->getPrecision().get_type_name()); + str_type += + "_" + + std::string( + selectedPrimitiveDesc->getConfig().outConfs[0].getMemDesc()->getPrecision().get_type_name()); } else { str_type += "_I8"; } @@ -651,7 +691,7 @@ std::vector Node::getChildEdgesAtPort(int inputNum) const { OPENVINO_THROW("Node ", getName(), " contains less output ports than ", inputNum); std::vector res; - for (auto &edge_w : childEdges) { + for (auto& edge_w : childEdges) { auto edge = edge_w.lock(); if (!edge) OPENVINO_THROW("Node ", getName(), " contains dead weak ptr"); @@ -661,7 +701,7 @@ std::vector Node::getChildEdgesAtPort(int inputNum) const { return res; } -std::vector Node::getAvailableFormatsForDims(const Shape &dims) const { +std::vector Node::getAvailableFormatsForDims(const Shape& dims) const { if (dims.getRank() == 0) return {memory::format_tag::x}; else if (dims.getRank() == 1) @@ -669,8 +709,11 @@ std::vector Node::getAvailableFormatsForDims(const Shape &di else if (dims.getRank() == 2) return {memory::format_tag::nc}; else if (dims.getRank() == 3) - return {memory::format_tag::tnc, memory::format_tag::ntc, - memory::format_tag::ncw, memory::format_tag::nCw8c, memory::format_tag::nCw16c }; + return {memory::format_tag::tnc, + memory::format_tag::ntc, + memory::format_tag::ncw, + memory::format_tag::nCw8c, + memory::format_tag::nCw16c}; else if (dims.getRank() == 4) return {memory::format_tag::nchw, memory::format_tag::nChw8c, memory::format_tag::nChw16c}; else if (dims.getRank() == 5) @@ -695,36 +738,36 @@ void Node::updateShapes() { getTypeStr(), " with name: ", getName()); - try { - if (needShapeInfer()) { - auto result = shapeInfer(); - if (ShapeInferStatus::success == result.status) { - redefineOutputMemory(result.dims); + try { + if (needShapeInfer()) { + auto result = shapeInfer(); + if (ShapeInferStatus::success == result.status) { + redefineOutputMemory(result.dims); + } + } else { + // guard check for internal dynamic nodes to avoid possible overestimation of the required memory size + if (shapeInference && FULL_PORT_MASK == shapeInference->get_port_mask()) + return; + + for (auto&& edge : getChildEdges()) { + auto edge_ptr = edge.lock(); + CPU_NODE_ASSERT(edge_ptr, " has null edge"); + if (edge_ptr->inPlace(Edge::LOOK_UP)) { + continue; } - } else { - //guard check for internal dynamic nodes to avoid possible overestimation of the required memory size - if (shapeInference && FULL_PORT_MASK == shapeInference->get_port_mask()) - return; - - for (auto&& edge : getChildEdges()) { - auto edge_ptr = edge.lock(); - CPU_NODE_ASSERT(edge_ptr, " has null edge"); - if (edge_ptr->inPlace(Edge::LOOK_UP)) { - continue; - } - auto mem = edge_ptr->getMemoryPtr(); - CPU_NODE_ASSERT(mem, " has null output memory"); + auto mem = edge_ptr->getMemoryPtr(); + CPU_NODE_ASSERT(mem, " has null output memory"); - if (mem->getShape().hasZeroDims()) { - continue; - } - fetchRawMemory(mem); + if (mem->getShape().hasZeroDims()) { + continue; } + fetchRawMemory(mem); } - } catch (const std::exception& exp) { - THROW_CPU_NODE_ERR(exp.what()); } + } catch (const std::exception& exp) { + THROW_CPU_NODE_ERR(exp.what()); + } } void Node::updateDynamicParams() { @@ -736,10 +779,17 @@ void Node::updateDynamicParams() { try { if (isExecutable()) { if (needPrepareParams()) { - OPENVINO_ASSERT(inputShapesDefined(), - "Input shapes are not defined."); - DEBUG_LOG(" prepareParams() on #", getExecIndex(), " ", getTypeStr(), " ", algToString(getAlgorithm()), - " ", getName(), " ", getOriginalLayers()); + OPENVINO_ASSERT(inputShapesDefined(), "Input shapes are not defined."); + DEBUG_LOG(" prepareParams() on #", + getExecIndex(), + " ", + getTypeStr(), + " ", + algToString(getAlgorithm()), + " ", + getName(), + " ", + getOriginalLayers()); prepareParams(); } } @@ -782,7 +832,7 @@ bool Node::outputShapeDataDependency() const { return false; } -void Node::redefineOutputMemory(const std::vector &newOutputShapes) { +void Node::redefineOutputMemory(const std::vector& newOutputShapes) { if (newOutputShapes.size() != outputShapes.size()) { OPENVINO_THROW("Number shapes mismatch with real outputs number for node with name: ", getName()); } @@ -841,34 +891,45 @@ void Node::initSupportedPrimitiveDescriptors() { }; /* When custom implementation priorities are NOT defined it is enough to - * just use the first implementation from the priority list. - * When custom implementation priorities are defined, all the implementations should be considered, - * since custom implementations can be not available at all, so a fallback to the default ones must happen - * To achive the fallback, it is necessary to create a supported primitive descriptor for each implementation - * since oneDNN primitive is mutating while iterating */ + * just use the first implementation from the priority list. + * When custom implementation priorities are defined, all the implementations should be considered, + * since custom implementations can be not available at all, so a fallback to the default ones must happen + * To achive the fallback, it is necessary to create a supported primitive descriptor for each implementation + * since oneDNN primitive is mutating while iterating */ #ifdef CPU_DEBUG_CAPS { - if (!customImplPriorities.empty()) { - DEBUG_LOG("#", getName(), " customImplPriorities [", 0 , "/", customImplPriorities.size(), - "]: ", impl_type_to_string(customImplPriorities[0])); - } + if (!customImplPriorities.empty()) { + DEBUG_LOG("#", + getName(), + " customImplPriorities [", + 0, + "/", + customImplPriorities.size(), + "]: ", + impl_type_to_string(customImplPriorities[0])); + } } #endif for (auto& desc : descs) { auto first_desc = dnnl::primitive_desc(DnnlExtensionUtils::clone_primitive_desc(desc.get())); const bool first_match = customImplPriorities.empty(); - DEBUG_LOG("#", getName(), - ", itpd.impl_info_str(): ", desc.impl_info_str(), - ", parsed imp_type: ", impl_type_to_string(parse_impl_name(desc.impl_info_str())), - ", first_match: ", first_match ? "true" : "false"); - DnnlExtensionUtils::for_each_implementation(desc, - first_match, - [&](impl_desc_type implType) { - return contains(getImplPriority(), implType); - }, - [&](dnnl::primitive_desc& desc) { - addSupportedPrimitiveDescriptor(desc); - }); + DEBUG_LOG("#", + getName(), + ", itpd.impl_info_str(): ", + desc.impl_info_str(), + ", parsed imp_type: ", + impl_type_to_string(parse_impl_name(desc.impl_info_str())), + ", first_match: ", + first_match ? "true" : "false"); + DnnlExtensionUtils::for_each_implementation( + desc, + first_match, + [&](impl_desc_type implType) { + return contains(getImplPriority(), implType); + }, + [&](dnnl::primitive_desc& desc) { + addSupportedPrimitiveDescriptor(desc); + }); // fallback. if none of the primitive types is present in the priority list just add first implementation // @todo this fallback is not necessary if primitive priority list is filled correctly @@ -889,22 +950,29 @@ void Node::filterSupportedPrimitiveDescriptors() { }; auto isNotSuitableDesc = [&](const NodeDesc& desc) { - const auto &config = desc.getConfig(); - if (inputMemoryFormatsFilter.size() > config.inConfs.size() || outputMemoryFormatsFilter.size() > config.outConfs.size()) + const auto& config = desc.getConfig(); + if (inputMemoryFormatsFilter.size() > config.inConfs.size() || + outputMemoryFormatsFilter.size() > config.outConfs.size()) OPENVINO_THROW("Incorrect number of input or output memory formats"); for (size_t i = 0; i < inputMemoryFormatsFilter.size(); i++) { if (!areCompatible(*config.inConfs[i].getMemDesc(), inputMemoryFormatsFilter[i])) { - DEBUG_LOG(getName(), " input memory format filter: ", inputMemoryFormatsFilter[i], - " not matched. Erase desc from supported primitive descriptors: ", desc); + DEBUG_LOG(getName(), + " input memory format filter: ", + inputMemoryFormatsFilter[i], + " not matched. Erase desc from supported primitive descriptors: ", + desc); return true; } } for (size_t i = 0; i < outputMemoryFormatsFilter.size(); i++) { if (!areCompatible(*config.outConfs[i].getMemDesc(), outputMemoryFormatsFilter[i])) { - DEBUG_LOG(getName(), " Output memory format filter: ", outputMemoryFormatsFilter[i], - " not matched. Erase desc from supported primitive descriptors: ", desc); + DEBUG_LOG(getName(), + " Output memory format filter: ", + outputMemoryFormatsFilter[i], + " not matched. Erase desc from supported primitive descriptors: ", + desc); return true; } } @@ -932,7 +1000,8 @@ void Node::initDescriptor(const NodeConfig& config) { if (descs.empty()) { const auto& selectedConfig = selectedPD->getConfig(); - if (selectedConfig.inConfs.size() != config.inConfs.size() || selectedConfig.outConfs.size() != config.outConfs.size()) + if (selectedConfig.inConfs.size() != config.inConfs.size() || + selectedConfig.outConfs.size() != config.outConfs.size()) return; for (size_t i = 0; i < selectedConfig.inConfs.size(); i++) { @@ -949,19 +1018,19 @@ void Node::initDescriptor(const NodeConfig& config) { return; } - auto updateNodeConfig = [&](const NodeConfig& cfg){ + auto updateNodeConfig = [&](const NodeConfig& cfg) { auto updatedConfig = cfg; for (size_t i = 0; i < descInputNumbers(); i++) { PortConfig& dataConfig = updatedConfig.inConfs[i]; - dataConfig.inPlace(canBeInPlace() ? 0 : -1); // update inPlace - dataConfig.setMemDesc(dataConfig.getMemDesc()); // reset desc with default compatibility mask + dataConfig.inPlace(canBeInPlace() ? 0 : -1); // update inPlace + dataConfig.setMemDesc(dataConfig.getMemDesc()); // reset desc with default compatibility mask } for (size_t i = 0; i < descOutputNumbers(); i++) { PortConfig& dataConfig = updatedConfig.outConfs[i]; - dataConfig.inPlace(-1); // update inPlace - dataConfig.setMemDesc(dataConfig.getMemDesc()); // reset desc with default compatibility mask + dataConfig.inPlace(-1); // update inPlace + dataConfig.setMemDesc(dataConfig.getMemDesc()); // reset desc with default compatibility mask } return updatedConfig; @@ -1017,8 +1086,8 @@ void Node::prepareMemory(const DnnlMemoryDescPtr& intDesc, size_t indx) { MemoryPtr ptr; auto weightCache = context->getWeightsCache(); if (weightCache != nullptr && memory::format_kind::blocked == intDesc->getDnnlDesc().get_format_kind()) { - const auto string_hash = - name + "_" + std::to_string(indx) + "_" + DnnlExtensionUtils::computeWeightsStringHash(internalBlob, intDesc); + const auto string_hash = name + "_" + std::to_string(indx) + "_" + + DnnlExtensionUtils::computeWeightsStringHash(internalBlob, intDesc); ptr = *weightCache->findOrCreate(string_hash, create); } else { ptr = create(); @@ -1043,7 +1112,7 @@ void Node::prepareMemory(const std::vector& intDescs) { void Node::prepareMemory(dnnl::primitive_desc_iterator& itpd) { std::vector intDescs; - for (auto &it : internalBlobDesc) + for (auto& it : internalBlobDesc) intDescs.push_back(it(itpd, 0)); Node::prepareMemory(intDescs); @@ -1063,8 +1132,8 @@ MemoryPtr Node::prepareWeightMemory(DnnlMemoryDescPtr dstWeightDesc, DnnlMemoryD srcWeightDesc = DnnlExtensionUtils::makeDescriptor(weightSrcDesc); } - auto create = [&] () { - Memory srcMemory{ getEngine(), srcWeightDesc, edgeMem->getData() }; + auto create = [&]() { + Memory srcMemory{getEngine(), srcWeightDesc, edgeMem->getData()}; MemoryPtr _ptr = std::make_shared(getEngine(), dstWeightDesc); node::Reorder::reorderData(srcMemory, *_ptr, context->getParamsCache()); @@ -1128,13 +1197,13 @@ bool Node::isInPlace() const { inplace = InPlaceType::NoInPlace; auto config = selected_pd->getConfig(); - for (auto &in : config.inConfs) { + for (auto& in : config.inConfs) { if (in.inPlace() >= 0) { inplace = InPlaceType::InPlace; break; } } - for (auto &out : config.outConfs) { + for (auto& out : config.outConfs) { if (out.inPlace() >= 0) { inplace = InPlaceType::InPlace; break; @@ -1165,7 +1234,7 @@ void Node::updateConstantType() { const auto prevConstantType = constant; constant = isConst ? ConstantType::Const : ConstantType::NoConst; if (constant == prevConstantType) - return; // state has not changed, no reason to continue + return; // state has not changed, no reason to continue for (const auto& childEdge : getChildEdges()) { const auto childNode = childEdge.lock()->getChild(); @@ -1174,7 +1243,8 @@ void Node::updateConstantType() { } void Node::addOriginalLayer(const std::string& layerName) { - if (layerName.empty()) return; + if (layerName.empty()) + return; if (originalLayers.empty()) { originalLayers = layerName; } else { @@ -1197,46 +1267,25 @@ void Node::cleanup() { const std::vector& Node::getDefaultImplPriority() { static const std::vector priorities { impl_desc_type::unknown, - // Undef impl type is used to express use-cases there real type is unkown during compilation - // Undef has higher priority than defined types in order to force primitive selection logic to make decision based on other properties - impl_desc_type::undef, - impl_desc_type::brgconv_avx512_amx_1x1, - impl_desc_type::brgconv_avx512_amx, - impl_desc_type::jit_avx512_amx_dw, - impl_desc_type::jit_avx512_amx_1x1, - impl_desc_type::jit_avx512_amx, - // Brgconv kernels disabled in order to prevent perf degradations on non AMX HW - // impl_desc_type::brgconv_avx512_1x1, - // impl_desc_type::brgconv_avx512, - impl_desc_type::jit_uni_dw, - impl_desc_type::jit_uni_1x1, - impl_desc_type::jit_uni, - impl_desc_type::jit_avx512_dw, - impl_desc_type::jit_avx512_1x1, - impl_desc_type::jit_avx512, - impl_desc_type::jit_avx2_dw, - impl_desc_type::jit_avx2_1x1, - impl_desc_type::jit_avx2, - impl_desc_type::jit_avx_dw, - impl_desc_type::jit_avx_1x1, - impl_desc_type::jit_avx, - impl_desc_type::jit_sse42_dw, - impl_desc_type::jit_sse42_1x1, - impl_desc_type::jit_sse42, + // Undef impl type is used to express use-cases there real type is unkown during compilation + // Undef has higher priority than defined types in order to force primitive selection logic to make decision + // based on other properties + impl_desc_type::undef, impl_desc_type::brgconv_avx512_amx_1x1, impl_desc_type::brgconv_avx512_amx, + impl_desc_type::jit_avx512_amx_dw, impl_desc_type::jit_avx512_amx_1x1, impl_desc_type::jit_avx512_amx, + // Brgconv kernels disabled in order to prevent perf degradations on non AMX HW + // impl_desc_type::brgconv_avx512_1x1, + // impl_desc_type::brgconv_avx512, + impl_desc_type::jit_uni_dw, impl_desc_type::jit_uni_1x1, impl_desc_type::jit_uni, + impl_desc_type::jit_avx512_dw, impl_desc_type::jit_avx512_1x1, impl_desc_type::jit_avx512, + impl_desc_type::jit_avx2_dw, impl_desc_type::jit_avx2_1x1, impl_desc_type::jit_avx2, + impl_desc_type::jit_avx_dw, impl_desc_type::jit_avx_1x1, impl_desc_type::jit_avx, + impl_desc_type::jit_sse42_dw, impl_desc_type::jit_sse42_1x1, impl_desc_type::jit_sse42, #if defined(OPENVINO_ARCH_ARM64) - impl_desc_type::jit_asimd, + impl_desc_type::jit_asimd, #endif - impl_desc_type::gemm_any, - impl_desc_type::gemm_blas, - impl_desc_type::gemm_avx512, - impl_desc_type::gemm_avx2, - impl_desc_type::gemm_avx, - impl_desc_type::gemm_sse42, - impl_desc_type::gemm_acl, - impl_desc_type::acl, - impl_desc_type::jit_gemm, - impl_desc_type::ref_any, - impl_desc_type::ref, + impl_desc_type::gemm_any, impl_desc_type::gemm_blas, impl_desc_type::gemm_avx512, impl_desc_type::gemm_avx2, + impl_desc_type::gemm_avx, impl_desc_type::gemm_sse42, impl_desc_type::gemm_acl, impl_desc_type::acl, + impl_desc_type::jit_gemm, impl_desc_type::ref_any, impl_desc_type::ref, }; return priorities; @@ -1246,30 +1295,31 @@ const std::vector& Node::getImplPriority() { if (!customImplPriorities.empty()) return customImplPriorities; - return getDefaultImplPriority(); } -PortDescBasePtr Node::getConsistentInputDesc(const NodeConfig &config, size_t idx) const { +PortDescBasePtr Node::getConsistentInputDesc(const NodeConfig& config, size_t idx) const { const auto& inConf = config.inConfs[idx]; - if (inConf.inPlace() >= 0) { // node have inplace input + if (inConf.inPlace() >= 0) { // node have inplace input auto inplaceIndx = static_cast(inConf.inPlace()); PortDescBasePtr outPortDesc; const auto& outConf = config.outConfs[inplaceIndx]; - if (outConf.inPlace() == static_cast(idx)) { // the input desc port is the same port used for inplace output - outPortDesc = outConf.getPortDesc(); // just use desc from this output port + if (outConf.inPlace() == + static_cast(idx)) { // the input desc port is the same port used for inplace output + outPortDesc = outConf.getPortDesc(); // just use desc from this output port } else { - outPortDesc = getConsistentOutputDesc(config, inplaceIndx); // get consistent desc otherwise + outPortDesc = getConsistentOutputDesc(config, inplaceIndx); // get consistent desc otherwise } - if (inConf.getPortDesc()->isCompatible(*outPortDesc)) { // use the desc if compatible + if (inConf.getPortDesc()->isCompatible(*outPortDesc)) { // use the desc if compatible return outPortDesc; } } - auto *parentSelectedPD = getParentEdgeAt(idx)->getParent()->getSelectedPrimitiveDescriptor(); + auto* parentSelectedPD = getParentEdgeAt(idx)->getParent()->getSelectedPrimitiveDescriptor(); if (!parentSelectedPD) - OPENVINO_THROW("Cannot get selected primitive descriptor for node: ", getParentEdgeAt(idx)->getParent()->getName()); + OPENVINO_THROW("Cannot get selected primitive descriptor for node: ", + getParentEdgeAt(idx)->getParent()->getName()); int num = getParentEdgeAt(idx)->getInputNum(); if (num >= 0) { @@ -1290,26 +1340,28 @@ PortDescBasePtr Node::getConsistentInputDesc(const NodeConfig &config, size_t id return inConf.getPortDesc(); } -PortDescBasePtr Node::getConsistentOutputDesc(const NodeConfig &config, size_t idx) const { +PortDescBasePtr Node::getConsistentOutputDesc(const NodeConfig& config, size_t idx) const { const auto& outConf = config.outConfs[idx]; - if (outConf.inPlace() >= 0) { // node have inplace output + if (outConf.inPlace() >= 0) { // node have inplace output auto inplaceIndx = static_cast(outConf.inPlace()); PortDescBasePtr inpPortDesc; const auto& inpConf = config.inConfs[inplaceIndx]; - if (inpConf.inPlace() == static_cast(idx)) { // the input desc port is the same port used for inplace output - inpPortDesc = inpConf.getPortDesc(); // just use desc from this output port + if (inpConf.inPlace() == + static_cast(idx)) { // the input desc port is the same port used for inplace output + inpPortDesc = inpConf.getPortDesc(); // just use desc from this output port } else { - inpPortDesc = getConsistentInputDesc(config, inplaceIndx); // get consistent desc otherwise + inpPortDesc = getConsistentInputDesc(config, inplaceIndx); // get consistent desc otherwise } - if (outConf.getPortDesc()->isCompatible(*inpPortDesc)) { // use the desc if compatible + if (outConf.getPortDesc()->isCompatible(*inpPortDesc)) { // use the desc if compatible return inpPortDesc; } } - auto *childSelectedPD = getChildEdgeAt(idx)->getChild()->getSelectedPrimitiveDescriptor(); + auto* childSelectedPD = getChildEdgeAt(idx)->getChild()->getSelectedPrimitiveDescriptor(); if (!childSelectedPD) - OPENVINO_THROW("Cannot get selected primitive descriptor for node: ", getChildEdgeAt(idx)->getChild()->getName()); + OPENVINO_THROW("Cannot get selected primitive descriptor for node: ", + getChildEdgeAt(idx)->getChild()->getName()); int num = getChildEdgeAt(idx)->getOutputNum(); if (num >= 0) { @@ -1331,7 +1383,7 @@ PortDescBasePtr Node::getConsistentOutputDesc(const NodeConfig &config, size_t i } void Node::initOptimalPrimitiveDescriptor() { - if (one_of(getType(), Type::RNNCell, Type::RNNSeq)) // can be skipped for RNN node + if (one_of(getType(), Type::RNNCell, Type::RNNSeq)) // can be skipped for RNN node return; auto selected_pd = getSelectedPrimitiveDescriptor(); @@ -1358,7 +1410,8 @@ void Node::initOptimalPrimitiveDescriptor() { // it is assumed that the nodes will define dense tensors on output edges // if it is not the case the implementation must redefine this behaviour if (outMemDesc->getType() & Blocked) { - config.outConfs[i].setMemDesc(std::dynamic_pointer_cast(outMemDesc), BlockedMemoryDesc::FULL_MASK); + config.outConfs[i].setMemDesc(std::dynamic_pointer_cast(outMemDesc), + BlockedMemoryDesc::FULL_MASK); } } } @@ -1366,9 +1419,9 @@ void Node::initOptimalPrimitiveDescriptor() { initDescriptor(config); } -bool Node::isConfigDefined(const NodeConfig &config) const { +bool Node::isConfigDefined(const NodeConfig& config) const { for (const auto& configs : {config.inConfs, config.outConfs}) { - for (const auto &dc : configs) { + for (const auto& dc : configs) { if (!dc.getMemDesc()->isDefined()) return false; } @@ -1376,14 +1429,14 @@ bool Node::isConfigDefined(const NodeConfig &config) const { return true; } -MemoryDescPtr Node::getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const { +MemoryDescPtr Node::getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const { if (getInputShapeAtPort(idx).isDynamic()) { return DnnlExtensionUtils::makeUndefinedDesc(prim_desc.src_desc(idx), getInputShapeAtPort(idx)); } return DnnlExtensionUtils::makeDescriptor(prim_desc.src_desc(idx)); } -MemoryDescPtr Node::getDstMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const { +MemoryDescPtr Node::getDstMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const { if (getOutputShapeAtPort(idx).isDynamic()) { return DnnlExtensionUtils::makeUndefinedDesc(prim_desc.dst_desc(idx), getOutputShapeAtPort(idx)); } @@ -1393,7 +1446,7 @@ MemoryDescPtr Node::getDstMemDesc(const dnnl::primitive_desc &prim_desc, size_t void Node::appendPostOpArgs(const dnnl::primitive_attr& attr, std::unordered_map& primArgs, const std::unordered_map& postOpsArgs) { - for (auto & entry : postOpsArgs) { + for (auto& entry : postOpsArgs) { primArgs[entry.first] = entry.second->getPrimitive(); } } @@ -1426,11 +1479,17 @@ dnnl::memory::format_tag Node::getWeightsFormatTagByDims(const VectorDims& dims) } } -void Node::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::unordered_map& postOpsMem, const int channelAxis) { +void Node::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, + const int channelAxis) { OPENVINO_THROW("Fusing of ", NameFromType(this->getType()), " operation is not implemented"); } -void Node::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis) { +void Node::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis) { OPENVINO_THROW("Fusing of ", NameFromType(this->getType()), " operation is not implemented"); } @@ -1474,12 +1533,12 @@ ov::element::Type Node::getRuntimePrecision() const { } Node* Node::NodesFactory::create(const std::shared_ptr& op, const GraphContext::CPtr context) { - // getExceptionDescWithoutStatus removes redundant information from the exception message. For instance, the NotImplemented - // exception is generated in the form: full_path_to_src_file:line_number [ NOT_IMPLEMENTED ] reason. + // getExceptionDescWithoutStatus removes redundant information from the exception message. For instance, the + // NotImplemented exception is generated in the form: full_path_to_src_file:line_number [ NOT_IMPLEMENTED ] reason. // An example for gather node: - // /path-to-openVino-root/src/plugins/intel_cpu/nodes/gather.cpp:42 [ NOT_IMPLEMENTED ] Only opset7 Gather operation is supported - // The most important part of the message is the reason, so the lambda trims everything up to "]" - // Note that the op type and its friendly name will also be provided if we fail to create the node. + // /path-to-openVino-root/src/plugins/intel_cpu/nodes/gather.cpp:42 [ NOT_IMPLEMENTED ] Only opset7 Gather operation + // is supported The most important part of the message is the reason, so the lambda trims everything up to "]" Note + // that the op type and its friendly name will also be provided if we fail to create the node. auto getExceptionDescWithoutStatus = [](const ov::Exception& ex) { std::string desc = ex.what(); size_t pos = desc.find(']'); @@ -1492,7 +1551,7 @@ Node* Node::NodesFactory::create(const std::shared_ptr& op, const Grap } return desc; }; - Node *newNode = nullptr; + Node* newNode = nullptr; std::string errorMessage; if (newNode == nullptr) { try { @@ -1539,7 +1598,7 @@ Node* Node::NodesFactory::create(const std::shared_ptr& op, const Grap return newNode; } -bool Node::canBePerformedAsScaleShift(const Node *parentNode) const { +bool Node::canBePerformedAsScaleShift(const Node* parentNode) const { #if defined(OPENVINO_ARCH_X86_64) OPENVINO_ASSERT(parentNode); @@ -1547,7 +1606,7 @@ bool Node::canBePerformedAsScaleShift(const Node *parentNode) const { const auto channelAxis = parentNode->getFusingAxis(); for (size_t i = 0; i < getParentEdges().size(); i++) { - Node *node = getParentEdgeAt(i)->getParent().get(); + Node* node = getParentEdgeAt(i)->getParent().get(); if (node == nullptr) { OPENVINO_THROW("Cannot get parent node for ", getName(), " on ", i, " port"); } @@ -1575,7 +1634,7 @@ bool Node::canBePerformedAsScaleShift(const Node *parentNode) const { const auto isConvertablePowerStatic = [&]() { if (getAlgorithm() == Algorithm::EltwisePowerStatic) { - const auto eltwise = dynamic_cast(this); + const auto eltwise = dynamic_cast(this); if (!eltwise) { OPENVINO_THROW("Cannot cast ", getName(), " to Eltwise"); } @@ -1584,13 +1643,15 @@ bool Node::canBePerformedAsScaleShift(const Node *parentNode) const { return false; }; - return (one_of(getAlgorithm(), Algorithm::EltwiseAdd, - Algorithm::EltwiseMultiply, - Algorithm::EltwiseSubtract, - Algorithm::EltwiseDivide, - Algorithm::EltwisePrelu, - Algorithm::EltwiseMulAdd) && isBroadcastableToDataInput()) - || isConvertablePowerStatic(); + return (one_of(getAlgorithm(), + Algorithm::EltwiseAdd, + Algorithm::EltwiseMultiply, + Algorithm::EltwiseSubtract, + Algorithm::EltwiseDivide, + Algorithm::EltwisePrelu, + Algorithm::EltwiseMulAdd) && + isBroadcastableToDataInput()) || + isConvertablePowerStatic(); #else // TODO: provide correct list of operations for other backends return false; @@ -1600,11 +1661,11 @@ bool Node::canBePerformedAsScaleShift(const Node *parentNode) const { // @todo shifts for Subtract and scales for Divide are replaced with // Add (with opposite sign) and Multiply (with inverse value) for legacy dephwise post ops // This can be avoided after dephwise post ops are gone -std::pair, std::vector> Node::getScalesAndShifts(const Node *parentNode) const { +std::pair, std::vector> Node::getScalesAndShifts(const Node* parentNode) const { std::vector scales, shifts; const auto fillValuesFrom = [&](const NodePtr& constInput, std::vector& buffer) { - auto *constInputNode = dynamic_cast(constInput.get()); + auto* constInputNode = dynamic_cast(constInput.get()); if (!constInputNode) { OPENVINO_THROW("Cannot cast ", constInput->getName(), " to Input"); } @@ -1628,7 +1689,7 @@ std::pair, std::vector> Node::getScalesAndShifts(const fillValuesFrom(getParentEdgeAt(1)->getParent(), scales); fillValuesFrom(getParentEdgeAt(2)->getParent(), shifts); } else if (one_of(getAlgorithm(), Algorithm::EltwisePowerStatic)) { - const auto power = dynamic_cast(this); + const auto power = dynamic_cast(this); if (!power) { OPENVINO_THROW("Cannot cast ", getName(), " to Eltwise"); } @@ -1639,25 +1700,30 @@ std::pair, std::vector> Node::getScalesAndShifts(const } switch (getAlgorithm()) { - case Algorithm::EltwiseAdd: { - scales.resize(shifts.size(), 1.0f); - break; - } - case Algorithm::EltwiseSubtract: { - scales.resize(shifts.size(), 1.0f); - std::transform(shifts.begin(), shifts.end(), shifts.begin(), [](float shift){ return -1.0f * shift; }); - break; - } - case Algorithm::EltwiseMultiply: { - shifts.resize(scales.size(), 0.0f); - break; - } - case Algorithm::EltwiseDivide: { - shifts.resize(scales.size(), 0.0f); - std::transform(scales.begin(), scales.end(), scales.begin(), [](float scale){ return 1.0f / scale; }); - break; - } - default: break; + case Algorithm::EltwiseAdd: { + scales.resize(shifts.size(), 1.0f); + break; + } + case Algorithm::EltwiseSubtract: { + scales.resize(shifts.size(), 1.0f); + std::transform(shifts.begin(), shifts.end(), shifts.begin(), [](float shift) { + return -1.0f * shift; + }); + break; + } + case Algorithm::EltwiseMultiply: { + shifts.resize(scales.size(), 0.0f); + break; + } + case Algorithm::EltwiseDivide: { + shifts.resize(scales.size(), 0.0f); + std::transform(scales.begin(), scales.end(), scales.begin(), [](float scale) { + return 1.0f / scale; + }); + break; + } + default: + break; } return {scales, shifts}; @@ -1824,22 +1890,25 @@ bool Node::canFuseSimpleOperation(const NodePtr& node) const { return ret; } else if (node->getType() == Type::Eltwise) { return DnnlExtensionUtils::isUnarySupportedAsPostOp(node->getAlgorithm()) || - node->canBePerformedAsScaleShift(this); + node->canBePerformedAsScaleShift(this); } return false; } -void Node::addFusedNode(const NodePtr &fusingNode) { +void Node::addFusedNode(const NodePtr& fusingNode) { fusedWith.push_back(fusingNode); } void Node::addSupportedPrimDesc(const std::vector& inPortConfigs, const std::vector& outPortConfigs, impl_desc_type implType) { - auto fill_port = [] (const PortConfigurator& portConfigurator, const Shape& shape, - ov::element::Type prc, std::vector& port) -> bool { - // In order to simplify particular node initialization logic we just don't add config in case target shape is not supported by blockedDescCreator. - // This should be suitable for major of scenarios since almost all nodes add `ncsp` blockedDescCreator which supports any shape rank. + auto fill_port = [](const PortConfigurator& portConfigurator, + const Shape& shape, + ov::element::Type prc, + std::vector& port) -> bool { + // In order to simplify particular node initialization logic we just don't add config in case target shape is + // not supported by blockedDescCreator. This should be suitable for major of scenarios since almost all nodes + // add `ncsp` blockedDescCreator which supports any shape rank. if (shape.getRank() < portConfigurator.blockedDescCreator->getMinimalRank()) return false; @@ -1856,14 +1925,16 @@ void Node::addSupportedPrimDesc(const std::vector& inPortConfi NodeConfig config; for (size_t i = 0; i < inPortConfigs.size(); i++) { auto shape = inPortConfigs[i].shape.getRank() == 0 ? getInputShapeAtPort(i) : inPortConfigs[i].shape; - auto prc = inPortConfigs[i].prc == ov::element::undefined ? getOriginalInputPrecisionAtPort(i) : inPortConfigs[i].prc; + auto prc = + inPortConfigs[i].prc == ov::element::undefined ? getOriginalInputPrecisionAtPort(i) : inPortConfigs[i].prc; if (!fill_port(inPortConfigs[i], shape, prc, config.inConfs)) return; } for (size_t i = 0; i < outPortConfigs.size(); i++) { auto dims = outPortConfigs[i].shape.getRank() == 0 ? getOutputShapeAtPort(i) : outPortConfigs[i].shape; - auto prc = outPortConfigs[i].prc == ov::element::undefined ? getOriginalOutputPrecisionAtPort(i) : outPortConfigs[i].prc; + auto prc = outPortConfigs[i].prc == ov::element::undefined ? getOriginalOutputPrecisionAtPort(i) + : outPortConfigs[i].prc; if (!fill_port(outPortConfigs[i], dims, prc, config.outConfs)) return; } @@ -1884,23 +1955,27 @@ void Node::fuseDQScales(const float* scaleData, const size_t scaleSize) { if (scaleSize > DQScales.size()) DQScales.resize(scaleSize, DQScales[0]); if (1 == scaleSize) { - std::transform(DQScales.begin(), DQScales.end(), DQScales.begin(), [=](float val){ return (scaleData[0] * val); }); - } else { - for (size_t i = 0; i < DQScales.size(); i++) { - DQScales[i] *= scaleData[i]; - } - } - if (std::all_of(DQScales.begin(), DQScales.end(), [OV_CAPTURE_CPY_AND_THIS](float val){ return (val == DQScales[0]);})) + std::transform(DQScales.begin(), DQScales.end(), DQScales.begin(), [=](float val) { + return (scaleData[0] * val); + }); + } else { + for (size_t i = 0; i < DQScales.size(); i++) { + DQScales[i] *= scaleData[i]; + } + } + if (std::all_of(DQScales.begin(), DQScales.end(), [OV_CAPTURE_CPY_AND_THIS](float val) { + return (val == DQScales[0]); + })) DQScales.resize(1); } int Node::inPlaceInputPort(int portIdx) const { if (inputShapes.empty()) { - //special case - a dead end node + // special case - a dead end node return -1; } - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (!selected_pd) OPENVINO_THROW("Cannot find selected primitive descriptor for node: ", getName()); @@ -1918,11 +1993,11 @@ int Node::inPlaceInputPort(int portIdx) const { int Node::inPlaceOutPort(int portIdx) const { if (outputShapes.empty()) { - //special case - a dead end node + // special case - a dead end node return -1; } - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (!selected_pd) OPENVINO_THROW("Cannot find selected primitive descriptor for node: ", getName()); @@ -1939,8 +2014,8 @@ int Node::inPlaceOutPort(int portIdx) const { } void Node::resolveInPlaceDirection() { - enum InplaceDirectionType {UP, DOWN, CYCLIC, NONE}; - enum PortType {INPUT, OUTPUT}; + enum InplaceDirectionType { UP, DOWN, CYCLIC, NONE }; + enum PortType { INPUT, OUTPUT }; auto inPlaceDirection = [](const Node* node, PortType portType, int portNum) -> InplaceDirectionType { if (PortType::INPUT == portType) { @@ -1990,7 +2065,8 @@ void Node::resolveInPlaceDirection() { if (auto pEdge = wEdge.lock()) { auto inpPort = pEdge->getOutputNum(); auto inPlaceInpPort = inPlaceInputPort(inpPort); - if (inPlaceInpPort < 0 || inPlaceDirection(this, PortType::INPUT, inpPort) != InplaceDirectionType::CYCLIC) { + if (inPlaceInpPort < 0 || + inPlaceDirection(this, PortType::INPUT, inpPort) != InplaceDirectionType::CYCLIC) { continue; } // inPlace memory cyclic dependency detected, need to resolve @@ -2002,12 +2078,14 @@ void Node::resolveInPlaceDirection() { config.inConfs[inpPort].inPlace(-1); initDescriptor(config); } else if (parentInPlaceDirection == InplaceDirectionType::DOWN) { - //search if siblings already have downstream direction + // search if siblings already have downstream direction auto downstreamPeers = [&] { for (auto& peerEdge : pParent->getChildEdgesAtPort(pEdge->getInputNum())) { auto peerNode = peerEdge->getChild().get(); - if (peerNode == this) continue; - if (inPlaceDirection(peerNode, PortType::INPUT, peerEdge->getOutputNum()) == InplaceDirectionType::DOWN) { + if (peerNode == this) + continue; + if (inPlaceDirection(peerNode, PortType::INPUT, peerEdge->getOutputNum()) == + InplaceDirectionType::DOWN) { return true; } } @@ -2068,7 +2146,8 @@ void Node::resolveInPlaceDirection() { // note: there are only non-inplace or cyclic-inplace descendants at the moment. std::function searchReferencingOutput; searchReferencingOutput = [&](const Node* node, int portIdx) -> void { - if (numConflicts > 1) return; // early stop + if (numConflicts > 1) + return; // early stop auto childEdges = node->getChildEdgesAtPort(portIdx); for (auto& edge : childEdges) { auto pChild = edge->getChild().get(); @@ -2077,7 +2156,8 @@ void Node::resolveInPlaceDirection() { } else { auto result = inPlaceDirection(pChild, PortType::INPUT, edge->getOutputNum()); if (InplaceDirectionType::CYCLIC == result) { - return searchReferencingOutput(pChild, pChild->inPlaceInputPort(edge->getOutputNum())); + return searchReferencingOutput(pChild, + pChild->inPlaceInputPort(edge->getOutputNum())); } } } @@ -2090,7 +2170,8 @@ void Node::resolveInPlaceDirection() { // note: the parent node does not use inPlace memory at the moment, let's check the siblings for (auto& peerEdge : pParent->getChildEdgesAtPort(pEdge->getInputNum())) { auto peerNode = peerEdge->getChild().get(); - if (peerNode == this) continue; + if (peerNode == this) + continue; if (Type::Output == peerNode->getType()) { numConflicts++; } else { @@ -2102,11 +2183,11 @@ void Node::resolveInPlaceDirection() { } } - if (numConflicts == 1) { // downstream to make the only output edge be referenced. + if (numConflicts == 1) { // downstream to make the only output edge be referenced. auto config = getSelectedPrimitiveDescriptor()->getConfig(); config.outConfs[inPlaceInpPort].inPlace(-1); initDescriptor(config); - } else { // the default direction of upstream + } else { // the default direction of upstream auto config = getSelectedPrimitiveDescriptor()->getConfig(); config.inConfs[inpPort].inPlace(-1); initDescriptor(config); @@ -2121,8 +2202,7 @@ void Node::resolveInPlaceDirection() { #ifndef CPU_DEBUG_CAPS std::ostream& operator<<(std::ostream& out, const Node& node) { - return out << "Node " << node.getName() << - " of type " << node.getTypeStr() << "\n"; + return out << "Node " << node.getName() << " of type " << node.getTypeStr() << "\n"; } std::ostream& operator<<(std::ostream& out, const Node* node) { @@ -2130,5 +2210,5 @@ std::ostream& operator<<(std::ostream& out, const Node* node) { } #endif -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/node.h b/src/plugins/intel_cpu/src/node.h index 453b8323fe9e66..9166e87dbf50e1 100644 --- a/src/plugins/intel_cpu/src/node.h +++ b/src/plugins/intel_cpu/src/node.h @@ -4,37 +4,38 @@ #pragma once +#include + #include +#include #include +#include +#include +#include +#include + #include "cpu_memory.h" #include "cpu_shape.h" #include "cpu_types.h" #include "edge.h" +#include "graph_context.h" #include "memory_desc/cpu_memory_desc.h" -#include "selective_build.h" #include "memory_desc/dnnl_memory_desc.h" +#include "nodes/executors/executor.hpp" +#include "nodes/node_config.h" #include "onednn/dnnl.h" #include "onednn/iml_type_mapper.h" -#include #include "openvino/cc/factory.h" #include "openvino/core/node.hpp" -#include -#include "nodes/node_config.h" -#include #include "perf_count.h" -#include "utils/debug_capabilities.h" +#include "selective_build.h" #include "utils/bit_util.hpp" #include "utils/debug_capabilities.h" -#include "graph_context.h" -#include "nodes/executors/executor.hpp" - -#include -#include -#include - -#define THROW_CPU_NODE_ERR(...) OPENVINO_THROW("[CPU] ", getTypeStr(), " node with name '", getName(), "' ", __VA_ARGS__) -#define CPU_NODE_ASSERT(condition, ...) OPENVINO_ASSERT(condition, getTypeStr(), " node with name '", getName(), "' ", __VA_ARGS__) +#define THROW_CPU_NODE_ERR(...) \ + OPENVINO_THROW("[CPU] ", getTypeStr(), " node with name '", getName(), "' ", __VA_ARGS__) +#define CPU_NODE_ASSERT(condition, ...) \ + OPENVINO_ASSERT(condition, getTypeStr(), " node with name '", getName(), "' ", __VA_ARGS__) namespace ov { namespace intel_cpu { @@ -45,13 +46,25 @@ using NodeWeakPtr = std::weak_ptr; class PortConfigurator { public: - PortConfigurator(ov::intel_cpu::LayoutType blockedDescType, ov::element::Type prc, const Shape& shape, - bool constant = false, int inPlace = -1) : - blockedDescCreator(getBlockedDescCreator(blockedDescType)), prc(prc), shape(shape), constant(constant), inPlace(inPlace) {} - - PortConfigurator(ov::intel_cpu::LayoutType blockedDescType, ov::element::Type prc = ov::element::undefined, - bool constant = false, int inPlace = -1) : - blockedDescCreator(getBlockedDescCreator(blockedDescType)), prc(prc), constant(constant), inPlace(inPlace) {} + PortConfigurator(ov::intel_cpu::LayoutType blockedDescType, + ov::element::Type prc, + const Shape& shape, + bool constant = false, + int inPlace = -1) + : blockedDescCreator(getBlockedDescCreator(blockedDescType)), + prc(prc), + shape(shape), + constant(constant), + inPlace(inPlace) {} + + PortConfigurator(ov::intel_cpu::LayoutType blockedDescType, + ov::element::Type prc = ov::element::undefined, + bool constant = false, + int inPlace = -1) + : blockedDescCreator(getBlockedDescCreator(blockedDescType)), + prc(prc), + constant(constant), + inPlace(inPlace) {} ov::intel_cpu::BlockedDescCreator::CreatorConstPtr blockedDescCreator; const ov::element::Type prc; @@ -60,7 +73,8 @@ class PortConfigurator { int inPlace = -1; private: - static ov::intel_cpu::BlockedDescCreator::CreatorConstPtr getBlockedDescCreator(ov::intel_cpu::LayoutType blockedDescType) { + static ov::intel_cpu::BlockedDescCreator::CreatorConstPtr getBlockedDescCreator( + ov::intel_cpu::LayoutType blockedDescType) { auto& creators = ov::intel_cpu::BlockedDescCreator::getCommonCreators(); if (creators.find(blockedDescType) == creators.end()) { OPENVINO_THROW("Cannot find tensor descriptor creator"); @@ -71,11 +85,15 @@ class PortConfigurator { class NodeDesc { public: - NodeDesc(NodeConfig conf, impl_desc_type type): - config(std::move(conf)), implementationType(type), executorFactory(nullptr) {} + NodeDesc(NodeConfig conf, impl_desc_type type) + : config(std::move(conf)), + implementationType(type), + executorFactory(nullptr) {} - NodeDesc(NodeConfig conf, impl_desc_type type, ExecutorFactoryLegacyPtr factory): - config(std::move(conf)), implementationType(type), executorFactory(factory) {} + NodeDesc(NodeConfig conf, impl_desc_type type, ExecutorFactoryLegacyPtr factory) + : config(std::move(conf)), + implementationType(type), + executorFactory(factory) {} const NodeConfig& getConfig() const { return config; @@ -98,8 +116,8 @@ class NodeDesc { } template ::value && !std::is_reference::value, int>::type = 0, - typename std::enable_if::value, int>::type = 0> + typename std::enable_if::value && !std::is_reference::value, int>::type = 0, + typename std::enable_if::value, int>::type = 0> std::shared_ptr getExecutorFactoryAs() { auto casted = std::dynamic_pointer_cast(executorFactory); if (!casted) @@ -119,34 +137,41 @@ class NodeDesc { class Node { public: - Node(const Node &) = delete; - Node & operator = (const Node &) = delete; + Node(const Node&) = delete; + Node& operator=(const Node&) = delete; using AttrPtr = std::shared_ptr; public: - template + template struct Tag {}; struct PerfCounters { PerfCounters(std::string const& name) - : execute(openvino::itt::handle(name)) - , getSupportedDescriptors(openvino::itt::handle>("Node::getSupportedDescriptors")) - , initSupportedPrimitiveDescriptors(openvino::itt::handle>("Node::initSupportedPrimitiveDescriptors")) - , filterSupportedPrimitiveDescriptors(openvino::itt::handle>("Node::filterSupportedPrimitiveDescriptors")) - , selectOptimalPrimitiveDescriptor(openvino::itt::handle>("Node::selectOptimalPrimitiveDescriptor")) - , createPrimitive(openvino::itt::handle>("Node::createPrimitive")) - , initOptimalPrimitiveDescriptor(openvino::itt::handle>("Node::initOptimalPrimitiveDescriptor")) - {} - - template + : execute(openvino::itt::handle(name)), + getSupportedDescriptors(openvino::itt::handle>("Node::getSupportedDescriptors")), + initSupportedPrimitiveDescriptors( + openvino::itt::handle>("Node::initSupportedPrimitiveDescriptors")), + filterSupportedPrimitiveDescriptors( + openvino::itt::handle>("Node::filterSupportedPrimitiveDescriptors")), + selectOptimalPrimitiveDescriptor( + openvino::itt::handle>("Node::selectOptimalPrimitiveDescriptor")), + createPrimitive(openvino::itt::handle>("Node::createPrimitive")), + initOptimalPrimitiveDescriptor( + openvino::itt::handle>("Node::initOptimalPrimitiveDescriptor")) {} + + template void buildClassCounters(const std::string& type_name) { getSupportedDescriptors = openvino::itt::handle>(type_name + "::getSupportedDescriptors"); - initSupportedPrimitiveDescriptors = openvino::itt::handle>(type_name + "::initSupportedPrimitiveDescriptors"); - filterSupportedPrimitiveDescriptors = openvino::itt::handle>(type_name + "::filterSupportedPrimitiveDescriptors"); - selectOptimalPrimitiveDescriptor = openvino::itt::handle>(type_name + "::selectOptimalPrimitiveDescriptor"); + initSupportedPrimitiveDescriptors = + openvino::itt::handle>(type_name + "::initSupportedPrimitiveDescriptors"); + filterSupportedPrimitiveDescriptors = + openvino::itt::handle>(type_name + "::filterSupportedPrimitiveDescriptors"); + selectOptimalPrimitiveDescriptor = + openvino::itt::handle>(type_name + "::selectOptimalPrimitiveDescriptor"); createPrimitive = openvino::itt::handle>(type_name + "::createPrimitive"); - initOptimalPrimitiveDescriptor = openvino::itt::handle>(type_name + "::initOptimalPrimitiveDescriptor"); + initOptimalPrimitiveDescriptor = + openvino::itt::handle>(type_name + "::initOptimalPrimitiveDescriptor"); } openvino::itt::handle_t execute; @@ -159,7 +184,7 @@ class Node { }; class NodesFactory; - static NodesFactory & factory(); + static NodesFactory& factory(); virtual ~Node() = default; @@ -171,11 +196,12 @@ class Node { void remove(); void addParentEdge(const EdgePtr& edge) { - assert(std::none_of(parentEdges.begin(), parentEdges.end(), - [&edge](const EdgeWeakPtr& _edge){ - return _edge.lock()->getOutputNum() == edge->getOutputNum(); - })); - parentEdges.insert(std::upper_bound(parentEdges.begin(), parentEdges.end(), edge, + assert(std::none_of(parentEdges.begin(), parentEdges.end(), [&edge](const EdgeWeakPtr& _edge) { + return _edge.lock()->getOutputNum() == edge->getOutputNum(); + })); + parentEdges.insert(std::upper_bound(parentEdges.begin(), + parentEdges.end(), + edge, [](const EdgeWeakPtr& lhs, const EdgeWeakPtr& rhs) { return lhs.lock()->getOutputNum() < rhs.lock()->getOutputNum(); }), @@ -196,11 +222,11 @@ class Node { removeEdge(edge, childEdges); } - const std::vector &getParentEdges() const noexcept { + const std::vector& getParentEdges() const noexcept { return parentEdges; } - const std::vector &getChildEdges() const noexcept { + const std::vector& getChildEdges() const noexcept { return childEdges; } @@ -238,7 +264,7 @@ class Node { return getSrcMemoryAtPort(idx)->getData(); } - template + template T* getSrcDataAtPortAs(size_t idx) const { return getSrcMemoryAtPort(idx)->getDataAs(); } @@ -247,7 +273,7 @@ class Node { return getDstMemoryAtPort(idx)->getData(); } - template + template T* getDstDataAtPortAs(size_t idx) const { return getDstMemoryAtPort(idx)->getDataAs(); } @@ -273,7 +299,8 @@ class Node { enum class ConstantType { Const, // Node is placed in a constant subgraph NoConst, // Node is placed in a non-constant subgraph - StrictNoConst, // Node produces non-constant subgraph: this type can't be changed and it does not depend on the parent nodes' ConstantType. + StrictNoConst, // Node produces non-constant subgraph: this type can't be changed and it does not depend on the + // parent nodes' ConstantType. }; ConstantType getConstantType() const; void updateConstantType(); @@ -290,10 +317,11 @@ class Node { bool isFusedWith(Type type) const; - virtual void addFusedNode(const NodePtr &fusingNode); + virtual void addFusedNode(const NodePtr& fusingNode); virtual void fuseInto(NodePtr& parentNode) { - // The graph supports fusing only of consecutive nodes and some graph logic requires to know through which input port a node was fused into parent one. + // The graph supports fusing only of consecutive nodes and some graph logic requires to know through which input + // port a node was fused into parent one. for (size_t i = 0; i < getParentEdges().size(); i++) { if (getParentEdgeAt(i)->getParent().get() == parentNode.get()) { setFusingPort(i); @@ -323,15 +351,15 @@ class Node { fusedWith.clear(); } - void mergeWith(const NodePtr &merge) { + void mergeWith(const NodePtr& merge) { mergedWith.push_back(merge); } - const std::vector &getMergeWith() { + const std::vector& getMergeWith() { return mergedWith; } - const std::vector &getFusedWith() { + const std::vector& getFusedWith() { return fusedWith; } @@ -343,17 +371,17 @@ class Node { this->fusingPort = fusingPort; } - const std::string &getName() const { + const std::string& getName() const { return name; } void addOriginalLayer(const std::string& layerName); - const std::string &getOriginalLayers() const { + const std::string& getOriginalLayers() const { return originalLayers; } - const std::string &getParallelDomain() const { + const std::string& getParallelDomain() const { return parallelDomain; } @@ -437,7 +465,9 @@ class Node { virtual std::string getPrimitiveDescriptorType() const; - PerfCount &PerfCounter() { return perfCounter; } + PerfCount& PerfCounter() { + return perfCounter; + } virtual void resolveInPlaceEdges(Edge::LOOK look = Edge::LOOK_BOTH); @@ -448,7 +478,7 @@ class Node { void updateShapes(); void updateDynamicParams(); void executeDynamic(dnnl::stream strm, int numaId = -1); - virtual void redefineOutputMemory(const std::vector &newShapes); + virtual void redefineOutputMemory(const std::vector& newShapes); void redefineOutputMemory(const size_t port, const VectorDims& new_output_shape); bool outputShapeDataDependency() const; @@ -475,7 +505,8 @@ class Node { /** * @brief Performs Node initialization based on graph context. - * This is an auxiliary method that allows to use information not available in Node constructor (e.g. connection information with other nodes) + * This is an auxiliary method that allows to use information not available in Node constructor (e.g. connection + * information with other nodes) */ virtual void init() {} @@ -483,11 +514,11 @@ class Node { return execIndex; } - const std::string & getTypeStr() const { + const std::string& getTypeStr() const { return typeStr; } - void setTypeStr(const std::string &typeStr) { + void setTypeStr(const std::string& typeStr) { this->typeStr = typeStr; } @@ -499,11 +530,11 @@ class Node { return 1; } - const PerfCounters & perfCounters() const { + const PerfCounters& perfCounters() const { return profiling; } - PerfCounters & perfCounters() { + PerfCounters& perfCounters() { return profiling; } @@ -588,7 +619,7 @@ class Node { return false; } - bool canBePerformedAsScaleShift(const Node *parentNode = nullptr) const; + bool canBePerformedAsScaleShift(const Node* parentNode = nullptr) const; bool isDynamicNode() const { return isDynamic; @@ -613,14 +644,14 @@ class Node { } /** - * @brief Return scales and shift if nodes can be executed as ScaleShift, else raise exception - * If node has only scale or shift value, fill missing value with default values - * i.e. EltwiseAdd: fill shifts from constant, fill scales with default values = 1.0f - * @param parentNode - * node from which data comes - * @return pair of scales and shifts - */ - std::pair, std::vector> getScalesAndShifts(const Node *parentNode) const; + * @brief Return scales and shift if nodes can be executed as ScaleShift, else raise exception + * If node has only scale or shift value, fill missing value with default values + * i.e. EltwiseAdd: fill shifts from constant, fill scales with default values = 1.0f + * @param parentNode + * node from which data comes + * @return pair of scales and shifts + */ + std::pair, std::vector> getScalesAndShifts(const Node* parentNode) const; void fuseDQScales(const float* scaleData, const size_t scaleSize); const std::vector& getDQScales() const { @@ -631,8 +662,14 @@ class Node { * Seed node should call this routine and pass its post operations list as parameter. * @param ops List of fused post operations */ - virtual void appendPostOps(dnnl::post_ops& ops, const VectorDims& postOpDims, std::unordered_map& postOpsMem, const int channelAxis = 1); - virtual void appendPostOps(dnnl::post_ops& ops, const VectorDims& postOpDims, std::vector& postOpsMem, const int channelAxis = 1); + virtual void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, + const int channelAxis = 1); + virtual void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis = 1); virtual bool canBeExecutedInInt8() const { OPENVINO_THROW_NOT_IMPLEMENTED("canBeExecutedInInt8 not implemented for node with type ", NameFromType(getType())); @@ -649,22 +686,24 @@ class Node { this->type = type; } - virtual PortDescBasePtr getConsistentInputDesc(const NodeConfig &config, size_t idx) const; - virtual PortDescBasePtr getConsistentOutputDesc(const NodeConfig &config, size_t idx) const; - virtual MemoryDescPtr getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const; - virtual MemoryDescPtr getDstMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const; + virtual PortDescBasePtr getConsistentInputDesc(const NodeConfig& config, size_t idx) const; + virtual PortDescBasePtr getConsistentOutputDesc(const NodeConfig& config, size_t idx) const; + virtual MemoryDescPtr getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const; + virtual MemoryDescPtr getDstMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const; - virtual AttrPtr initPrimitiveAttr() { return nullptr; } + virtual AttrPtr initPrimitiveAttr() { + return nullptr; + } - typedef std::function - GetPrimitiveMemoryFormatFunc; + typedef std::function + GetPrimitiveMemoryFormatFunc; std::vector internalBlobDesc; std::vector inputShapes; std::vector outputShapes; - std::vector fusedWith; - std::vector mergedWith; + std::vector fusedWith; + std::vector mergedWith; int curNumaNode = -1; @@ -672,11 +711,11 @@ class Node { virtual void toNumaNodeImpl(int numaID); std::string primitivesPriority; - std::vector customImplPriorities; - std::vector inputMemoryFormatsFilter; - std::vector outputMemoryFormatsFilter; + std::vector customImplPriorities; + std::vector inputMemoryFormatsFilter; + std::vector outputMemoryFormatsFilter; bool enforceBF16evenForGraphTail = false; - bool keepOriginalPrecision = false; + bool keepOriginalPrecision = false; std::string originalLayers; // contains names of the original layers separated by comma std::string parallelDomain; @@ -692,11 +731,7 @@ class Node { int selectedPrimitiveDescriptorIndex = -1; - enum class InPlaceType { - Unknown, - InPlace, - NoInPlace - }; + enum class InPlaceType { Unknown, InPlace, NoInPlace }; mutable InPlaceType inplace = InPlaceType::Unknown; ConstantType constant = ConstantType::NoConst; std::vector internalBlobs; @@ -718,7 +753,7 @@ class Node { void selectPreferPrimitiveDescriptorWithShape(const std::vector& priority, bool ignoreConstInputs); bool isOneDimShape(const ov::PartialShape& pshape); bool isReorderRequired(ov::intel_cpu::MemoryDescPtr desc1, ov::intel_cpu::MemoryDescPtr desc2); - bool isConfigDefined(const NodeConfig &config) const; + bool isConfigDefined(const NodeConfig& config) const; virtual bool canBeInPlace() const; /* returns default implementaion prioirity */ @@ -733,13 +768,15 @@ class Node { /** * @brief Auxiliary function to get node input precisions - * @return Vector of precisions based on information from node input edges. Return empty vector in case edges are not initialized yet. + * @return Vector of precisions based on information from node input edges. Return empty vector in case edges are + * not initialized yet. */ virtual std::vector getInputPrecisions() const; /** * @brief Auxiliary function to get node output precisions - * @return Vector of precisions based on information from node output edges. Return empty vector in case edges are not initialized yet. + * @return Vector of precisions based on information from node output edges. Return empty vector in case edges are + * not initialized yet. */ virtual std::vector getOutputPrecisions() const; @@ -803,13 +840,14 @@ class Node { // is still under control of strong references outside of cache. // privateWeightCache is for holding strong references to constant weight // copies of same content with different layouts. - std::shared_ptr> privateWeightCache - = std::make_shared>(); + std::shared_ptr> privateWeightCache = + std::make_shared>(); private: - static void removeEdge(const EdgePtr edge, std::vector &edges) { - edges.erase(std::remove_if(edges.begin(), edges.end(), - [&edge] (EdgeWeakPtr _edge) { + static void removeEdge(const EdgePtr edge, std::vector& edges) { + edges.erase(std::remove_if(edges.begin(), + edges.end(), + [&edge](EdgeWeakPtr _edge) { return _edge.lock() == edge; }), edges.end()); @@ -856,22 +894,20 @@ constexpr uint64_t PortMask(T... rest) { return util::bit::mask(rest...); } -class Node::NodesFactory : public openvino::cc::Factory& op, - const GraphContext::CPtr)> { +class Node::NodesFactory + : public openvino::cc::Factory& op, const GraphContext::CPtr)> { public: NodesFactory(); Node* create(const std::shared_ptr& op, const GraphContext::CPtr context); }; -template +template struct NodeImpl : public NodeType { - NodeImpl(const std::shared_ptr& op, const GraphContext::CPtr context) - : NodeType(op, context) { + NodeImpl(const std::shared_ptr& op, const GraphContext::CPtr context) : NodeType(op, context) { NodeType::perfCounters().template buildClassCounters(NameFromType(NodeType::getType())); } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/adaptive_pooling.cpp b/src/plugins/intel_cpu/src/nodes/adaptive_pooling.cpp index f4e7f6217a8dec..f4af11b0f2362a 100644 --- a/src/plugins/intel_cpu/src/nodes/adaptive_pooling.cpp +++ b/src/plugins/intel_cpu/src/nodes/adaptive_pooling.cpp @@ -3,18 +3,21 @@ // #include "adaptive_pooling.h" -#include "openvino/core/parallel.hpp" -#include "cpu/x64/cpu_isa_traits.hpp" + #include -#include "onednn/dnnl.h" -#include "dnnl_extension_utils.h" -#include "selective_build.h" + #include #include #include -#include "utils/general_utils.h" #include + +#include "cpu/x64/cpu_isa_traits.hpp" +#include "dnnl_extension_utils.h" +#include "onednn/dnnl.h" +#include "openvino/core/parallel.hpp" +#include "selective_build.h" #include "shape_inference/custom/adaptive_pooling.hpp" +#include "utils/general_utils.h" using namespace dnnl; using namespace dnnl::impl::cpu::x64; @@ -23,7 +26,8 @@ namespace ov { namespace intel_cpu { namespace node { -bool AdaptivePooling::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool AdaptivePooling::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { if (one_of(op->get_type_info(), ov::op::v8::AdaptiveAvgPool::get_type_info_static())) { auto adaPool = std::dynamic_pointer_cast(op); @@ -51,9 +55,9 @@ AdaptivePooling::AdaptivePooling(const std::shared_ptr& op, const Grap : Node(op, context, AdaptivePoolingShapeInferFactory(op)) { std::string errorMessage; if (isSupportedOperation(op, errorMessage)) { - errorPrefix = "Adaptive Pooling layer with name '" + getName() + "' "; + errorPrefix = "Adaptive Pooling layer with name '" + getName() + "' "; } else { - OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); + OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); } if (one_of(op->get_type_info(), ov::op::v8::AdaptiveAvgPool::get_type_info_static())) { algorithm = Algorithm::AdaptivePoolingAvg; @@ -104,14 +108,14 @@ void AdaptivePooling::initSupportedPrimitiveDescriptors() { // we supports only fp32 currently precision = ov::element::f32; - std::vector dataFormats{ LayoutType::ncsp }; - const auto &inDims = getInputShapeAtPort(0).getDims(); + std::vector dataFormats{LayoutType::ncsp}; + const auto& inDims = getInputShapeAtPort(0).getDims(); if (inDims[1] != Shape::UNDEFINED_DIM && inDims[1] != 1) { dataFormats.push_back(LayoutType::nspc); dataFormats.push_back(LayoutType::nCsp16c); dataFormats.push_back(LayoutType::nCsp8c); } - for (const auto &df : dataFormats) { + for (const auto& df : dataFormats) { if (algorithm == Algorithm::AdaptivePoolingAvg) { addSupportedPrimDesc({{df, precision}, {LayoutType::ncsp, ov::element::i32}}, {{df, precision}}, @@ -134,9 +138,9 @@ void AdaptivePooling::execute(dnnl::stream strm) { if (!(inputPrec == dnnl_f32 && outputPrec == dnnl_f32)) OPENVINO_THROW(errorPrefix, "doesn't support demanded precisions"); - auto &srcMemory0 = getParentEdgeAt(0)->getMemory(); - auto &srcMemory1 = getParentEdgeAt(1)->getMemory(); - int *indexDst = nullptr; + auto& srcMemory0 = getParentEdgeAt(0)->getMemory(); + auto& srcMemory1 = getParentEdgeAt(1)->getMemory(); + int* indexDst = nullptr; if (algorithm == Algorithm::AdaptivePoolingMax) { indexDst = getDstDataAtPortAs(1); @@ -144,14 +148,15 @@ void AdaptivePooling::execute(dnnl::stream strm) { auto isPlainFmt = srcMemory0.getDesc().hasLayoutType(LayoutType::ncsp); auto isTailCFmt = srcMemory0.getDesc().hasLayoutType(LayoutType::nspc); - auto isBlkFmt = srcMemory0.getDesc().hasLayoutType(LayoutType::nCsp16c) || srcMemory0.getDesc().hasLayoutType(LayoutType::nCsp8c); + auto isBlkFmt = srcMemory0.getDesc().hasLayoutType(LayoutType::nCsp16c) || + srcMemory0.getDesc().hasLayoutType(LayoutType::nCsp8c); auto srcBlockDesc = srcMemory0.getDescWithType(); int blockSize = isBlkFmt ? srcBlockDesc->getBlockDims().back() : 1; - const auto *src = getSrcDataAtPortAs(0); - const auto *srcPooledSpatialShapes = getSrcDataAtPortAs(1); - auto *dst = getDstDataAtPortAs(0); + const auto* src = getSrcDataAtPortAs(0); + const auto* srcPooledSpatialShapes = getSrcDataAtPortAs(1); + auto* dst = getDstDataAtPortAs(0); if (static_cast(srcMemory1.getShape().getElementsCount()) != spatialDimsCount) OPENVINO_THROW(errorPrefix, @@ -175,8 +180,9 @@ void AdaptivePooling::execute(dnnl::stream strm) { const int iHW = IH * IW; const int oDHW = OD * OH * OW, oHW = OH * OW; - const int chPadding = blockSize * (isBlkFmt ? srcBlockDesc->getBlockDims()[1] : srcMemory0.getShape().getStaticDims()[1]); - const int blockCount = (isTailCFmt ? 1 : chPadding / blockSize); + const int chPadding = + blockSize * (isBlkFmt ? srcBlockDesc->getBlockDims()[1] : srcMemory0.getShape().getStaticDims()[1]); + const int blockCount = (isTailCFmt ? 1 : chPadding / blockSize); auto selectedPrimitiveDescriptor = getSelectedPrimitiveDescriptor(); if (!selectedPrimitiveDescriptor) OPENVINO_THROW(errorPrefix, "doesn't have primitive descriptors."); @@ -186,27 +192,26 @@ void AdaptivePooling::execute(dnnl::stream strm) { // unified strides array const size_t tailDimsOffset = (isTailCFmt ? -1 : 0); - const size_t inStrides[5] = { - srcStrides[0], - (isTailCFmt ? 1 : srcStrides[1]), - (spatialDimsCount == 3 ? srcStrides[2 + tailDimsOffset] : 0), - (spatialDimsCount >= 2 ? srcStrides[spatialDimsCount + tailDimsOffset] : 0), - srcStrides[spatialDimsCount + 1 + tailDimsOffset] }; - const size_t outStrides[5] = { - dstStrides[0], - (isTailCFmt ? 1 : dstStrides[1]), - (spatialDimsCount == 3 ? dstStrides[2 + tailDimsOffset] : 0), - (spatialDimsCount >= 2 ? dstStrides[spatialDimsCount + tailDimsOffset] : 0), - dstStrides[spatialDimsCount + 1 + tailDimsOffset] }; - - std::function pool; - auto poolMax = [&] (const float *srcData, float *dstData, int od, int oh, int ow, size_t spatIndOff) { + const size_t inStrides[5] = {srcStrides[0], + (isTailCFmt ? 1 : srcStrides[1]), + (spatialDimsCount == 3 ? srcStrides[2 + tailDimsOffset] : 0), + (spatialDimsCount >= 2 ? srcStrides[spatialDimsCount + tailDimsOffset] : 0), + srcStrides[spatialDimsCount + 1 + tailDimsOffset]}; + const size_t outStrides[5] = {dstStrides[0], + (isTailCFmt ? 1 : dstStrides[1]), + (spatialDimsCount == 3 ? dstStrides[2 + tailDimsOffset] : 0), + (spatialDimsCount >= 2 ? dstStrides[spatialDimsCount + tailDimsOffset] : 0), + dstStrides[spatialDimsCount + 1 + tailDimsOffset]}; + + std::function pool; + auto poolMax = [&](const float* srcData, float* dstData, int od, int oh, int ow, size_t spatIndOff) { size_t dStart, dEnd, hStart, hEnd, wStart, wEnd; setBinBorders(&dStart, &dEnd, od, ID, OD); setBinBorders(&hStart, &hEnd, oh, IH, OH); setBinBorders(&wStart, &wEnd, ow, IW, OW); - float res = srcData[dStart * inStrides[2] + hStart * inStrides[3] + wStart * inStrides[4]]; // initial max value - int resIndex = dStart * iHW + hStart * IW + wStart; // initial max index + float res = + srcData[dStart * inStrides[2] + hStart * inStrides[3] + wStart * inStrides[4]]; // initial max value + int resIndex = dStart * iHW + hStart * IW + wStart; // initial max index for (size_t pixD = dStart; pixD < dEnd; pixD++) { for (size_t pixH = hStart; pixH < hEnd; pixH++) { for (size_t pixW = wStart; pixW < wEnd; pixW++) { @@ -219,7 +224,7 @@ void AdaptivePooling::execute(dnnl::stream strm) { *dstData = res; indexDst[spatIndOff * oDHW + od * oHW + oh * OW + ow] = resIndex; }; - auto poolAvg = [&] (const float *srcData, float *dstData, int od, int oh, int ow, size_t spatIndOff) { + auto poolAvg = [&](const float* srcData, float* dstData, int od, int oh, int ow, size_t spatIndOff) { size_t dStart, dEnd, hStart, hEnd, wStart, wEnd; setBinBorders(&dStart, &dEnd, od, ID, OD); setBinBorders(&hStart, &hEnd, oh, IH, OH); @@ -245,11 +250,10 @@ void AdaptivePooling::execute(dnnl::stream strm) { pool = poolAvg; } - parallel_for5d(N, blockCount, OD, OH, OW, - [&](int n, int blkIdx, int od, int oh, int ow) { + parallel_for5d(N, blockCount, OD, OH, OW, [&](int n, int blkIdx, int od, int oh, int ow) { auto srcData = src + n * inStrides[0] + blkIdx * inStrides[1]; - auto dstData = dst + n * outStrides[0] + blkIdx * outStrides[1] + - od * outStrides[2] + oh * outStrides[3] + ow * outStrides[4]; + auto dstData = dst + n * outStrides[0] + blkIdx * outStrides[1] + od * outStrides[2] + oh * outStrides[3] + + ow * outStrides[4]; int cStart = 0, cEnd = C, inResidual = 0, outResidual = 0; if (!isTailCFmt) { cStart = blkIdx * blockSize; @@ -263,18 +267,23 @@ void AdaptivePooling::execute(dnnl::stream strm) { inResidual = outResidual = c % blockSize; } pool(srcData + inResidual, dstData + outResidual, od, oh, ow, n * C + c); - }}); + } + }); } bool AdaptivePooling::created() const { return getType() == Type::AdaptivePooling; } -inline void AdaptivePooling::setBinBorders(size_t *startPtr, size_t *endPtr, size_t idx, size_t inputLength, size_t outputLength) { +inline void AdaptivePooling::setBinBorders(size_t* startPtr, + size_t* endPtr, + size_t idx, + size_t inputLength, + size_t outputLength) { *(startPtr) = idx * inputLength / outputLength; *(endPtr) = ceil(static_cast((idx + 1) * inputLength) / outputLength); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/adaptive_pooling.h b/src/plugins/intel_cpu/src/nodes/adaptive_pooling.h index c88c9b5989aef9..04b628a5da5cee 100644 --- a/src/plugins/intel_cpu/src/nodes/adaptive_pooling.h +++ b/src/plugins/intel_cpu/src/nodes/adaptive_pooling.h @@ -5,9 +5,11 @@ #pragma once #include -#include + #include +#include #include + #include "dnnl_extension_utils.h" namespace ov { @@ -29,16 +31,18 @@ class AdaptivePooling : public Node { int spatialDimsCount; mutable std::vector spatialDimsValue = {}; ov::element::Type precision = ov::element::f32; - inline void setBinBorders(size_t *startPtr, size_t *endPtr, size_t idx, size_t inputLength, size_t outputLength); + inline void setBinBorders(size_t* startPtr, size_t* endPtr, size_t idx, size_t inputLength, size_t outputLength); std::string errorPrefix; protected: bool needShapeInfer() const override; - bool needPrepareParams() const override { return false; }; + bool needPrepareParams() const override { + return false; + }; void executeDynamicImpl(dnnl::stream strm) override; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/batch_to_space.cpp b/src/plugins/intel_cpu/src/nodes/batch_to_space.cpp index 80713e90750e2d..50665c083ec930 100644 --- a/src/plugins/intel_cpu/src/nodes/batch_to_space.cpp +++ b/src/plugins/intel_cpu/src/nodes/batch_to_space.cpp @@ -2,14 +2,16 @@ // SPDX-License-Identifier: Apache-2.0 // -#include +#include "batch_to_space.h" + +#include #include +#include + #include "dnnl_types.h" +#include "nodes/common/blocked_desc_creator.h" #include "openvino/core/parallel.hpp" #include "selective_build.h" -#include "batch_to_space.h" -#include "nodes/common/blocked_desc_creator.h" -#include namespace ov { namespace intel_cpu { @@ -40,8 +42,8 @@ BatchToSpace::BatchToSpace(const std::shared_ptr& op, const GraphConte if (inputShapes.size() != 4 || outputShapes.size() != 1) OPENVINO_THROW(errorPrefix, " has incorrect number of input or output edges!"); - const auto &inDims = getInputShapeAtPort(0).getDims(); - const auto &outDims = getOutputShapeAtPort(0).getDims(); + const auto& inDims = getInputShapeAtPort(0).getDims(); + const auto& outDims = getOutputShapeAtPort(0).getDims(); if (inDims.size() < 4 || inDims.size() > 5) OPENVINO_THROW(errorPrefix, " has unsupported 'data' input rank: ", inDims.size()); if (inDims.size() != outDims.size()) @@ -52,7 +54,7 @@ void BatchToSpace::initSupportedPrimitiveDescriptors() { if (!supportedPrimitiveDescriptors.empty()) return; - const auto &inDims = getInputShapeAtPort(0).getDims(); + const auto& inDims = getInputShapeAtPort(0).getDims(); const auto precision = getOriginalInputPrecisionAtPort(0); const std::set supported_precision_sizes = {1, 2, 4, 8}; if (supported_precision_sizes.find(precision.size()) == supported_precision_sizes.end()) @@ -88,7 +90,7 @@ void BatchToSpace::initSupportedPrimitiveDescriptors() { } } -static std::vector getShape5D(const VectorDims &shape) { +static std::vector getShape5D(const VectorDims& shape) { std::vector shape5D(5, 1); for (int i = 0; i < 2; i++) { shape5D[i] = shape[i]; @@ -98,26 +100,26 @@ static std::vector getShape5D(const VectorDims &shape) { return shape5D; } -template +template void BatchToSpace::batchToSpaceKernel() { - const auto *srcData = getSrcDataAtPortAs(0); - const auto *blockShapesPtr = getSrcDataAtPortAs(1); + const auto* srcData = getSrcDataAtPortAs(0); + const auto* blockShapesPtr = getSrcDataAtPortAs(1); size_t dataRank = getSrcMemoryAtPort(0)->getShape().getRank(); blockShapeIn.clear(); for (size_t i = 0; i < dataRank; i++) { blockShapeIn.push_back(*(blockShapesPtr + i)); } - const auto *padsBeginPtr = getSrcDataAtPortAs(2); + const auto* padsBeginPtr = getSrcDataAtPortAs(2); cropsBeginIn.clear(); for (size_t i = 0; i < dataRank; i++) { cropsBeginIn.push_back(*(padsBeginPtr + i)); } - auto *dstData = getDstDataAtPortAs(0); + auto* dstData = getDstDataAtPortAs(0); - const auto &inDims = getParentEdgeAt(0)->getMemory().getStaticDims(); - const auto &outDims = getChildEdgeAt(0)->getMemory().getStaticDims(); + const auto& inDims = getParentEdgeAt(0)->getMemory().getStaticDims(); + const auto& outDims = getChildEdgeAt(0)->getMemory().getStaticDims(); auto srcDesc = getParentEdgeAt(0)->getMemory().getDescWithType(); @@ -193,8 +195,8 @@ void BatchToSpace::batchToSpaceKernel() { const int64_t addTmpOC = blocked ? 0lu : oAdd[1]; const int64_t addTmpOc = blocked ? oAdd[1] : 0lu; - const size_t firstI1 = i0 == 0 ? std::max(begin[1], indxStart[1]) : begin[1]; - const size_t lastI1 = i0 == indxEnd[0] ? std::min(indxEnd[1] + 1, finish[1]) : finish[1]; + const size_t firstI1 = i0 == 0 ? std::max(begin[1], indxStart[1]) : begin[1]; + const size_t lastI1 = i0 == indxEnd[0] ? std::min(indxEnd[1] + 1, finish[1]) : finish[1]; for (size_t i1 = firstI1; i1 < lastI1; ++i1) { const size_t block = i1 == finish[1] ? lastBlock : blockSize; @@ -216,12 +218,13 @@ void BatchToSpace::batchToSpaceKernel() { const size_t dstIdx4 = dstIdx3 + tmpOw * blockSize; for (size_t it = 0; it < itEnd + 1; ++it) { const size_t i5Begin = it == 0 ? 0 : (it * blockSize - 1 - oAdd[1]) / blockShape[1] + 1; - const size_t i5End = it == itEnd ? (block - 1) : ((it + 1) * blockSize - 1 - oAdd[1]) / blockShape[1]; + const size_t i5End = + it == itEnd ? (block - 1) : ((it + 1) * blockSize - 1 - oAdd[1]) / blockShape[1]; for (size_t i5 = i5Begin; i5 < i5End + 1; ++i5) { const int64_t tmpOc = i5 * blockShape[1] + addTmpOc; const size_t srcIdx5 = srcIdx4 + i5; const size_t dstIdx5 = - dstIdx4 + it * outSpatialStep * blockSize + (tmpOc - it * blockSize); + dstIdx4 + it * outSpatialStep * blockSize + (tmpOc - it * blockSize); dstData[dstIdx5] = srcData[srcIdx5]; } } @@ -239,13 +242,19 @@ void BatchToSpace::executeDynamicImpl(dnnl::stream strm) { void BatchToSpace::execute(dnnl::stream strm) { switch (getParentEdgeAt(0)->getMemory().getDesc().getPrecision().size()) { - case 1: batchToSpaceKernel::value_type>(); break; - case 2: batchToSpaceKernel::value_type>(); break; - case 4: batchToSpaceKernel::value_type>(); break; - default: - OPENVINO_THROW("BatchToSpace layer does not support precision '", - std::string(getParentEdgeAt(0)->getMemory().getDesc().getPrecision().get_type_name()), - "'"); + case 1: + batchToSpaceKernel::value_type>(); + break; + case 2: + batchToSpaceKernel::value_type>(); + break; + case 4: + batchToSpaceKernel::value_type>(); + break; + default: + OPENVINO_THROW("BatchToSpace layer does not support precision '", + std::string(getParentEdgeAt(0)->getMemory().getDesc().getPrecision().get_type_name()), + "'"); } } @@ -253,6 +262,6 @@ bool BatchToSpace::created() const { return getType() == Type::BatchToSpace; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/batch_to_space.h b/src/plugins/intel_cpu/src/nodes/batch_to_space.h index 1b583f74bd7905..5211e0c0b5dd10 100644 --- a/src/plugins/intel_cpu/src/nodes/batch_to_space.h +++ b/src/plugins/intel_cpu/src/nodes/batch_to_space.h @@ -14,7 +14,7 @@ class BatchToSpace : public Node { public: BatchToSpace(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; // output shape can potentially be empty @@ -25,14 +25,18 @@ class BatchToSpace : public Node { void execute(dnnl::stream strm) override; bool created() const override; - bool needPrepareParams() const override { return false; }; - bool needShapeInfer() const override {return true;}; + bool needPrepareParams() const override { + return false; + }; + bool needShapeInfer() const override { + return true; + }; void executeDynamicImpl(dnnl::stream strm) override; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; private: - template + template void batchToSpaceKernel(); private: @@ -42,6 +46,6 @@ class BatchToSpace : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/bin_conv.cpp b/src/plugins/intel_cpu/src/nodes/bin_conv.cpp index d1e82235ba9bb1..336a370374a9f9 100644 --- a/src/plugins/intel_cpu/src/nodes/bin_conv.cpp +++ b/src/plugins/intel_cpu/src/nodes/bin_conv.cpp @@ -3,34 +3,35 @@ // #include "bin_conv.h" -#include "eltwise.h" -#include "fake_quantize.h" -#include "conv.h" + #include #include #include -#include "dnnl_types.h" + +#include "conv.h" +#include "cpu/x64/cpu_isa_traits.hpp" +#include "cpu/x64/injectors/jit_uni_depthwise_injector.hpp" +#include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" +#include "cpu/x64/jit_generator.hpp" #include "dnnl_extension_utils.h" +#include "dnnl_types.h" +#include "eltwise.h" +#include "fake_quantize.h" #include "openvino/core/parallel.hpp" -#include "cpu/x64/jit_generator.hpp" -#include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" -#include "cpu/x64/injectors/jit_uni_depthwise_injector.hpp" -#include "cpu/x64/cpu_isa_traits.hpp" -#include "utils/general_utils.h" #include "openvino/opsets/opset1.hpp" +#include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" // WA for xbyak.h #ifdef _WIN32 -# ifndef _WINSOCKAPI_ -# define _WINSOCKAPI_ -# endif -# ifndef _WINSOCK2API_ -# define _WINSOCK2API_ -# endif +# ifndef _WINSOCKAPI_ +# define _WINSOCKAPI_ +# endif +# ifndef _WINSOCK2API_ +# define _WINSOCK2API_ +# endif #endif - using namespace dnnl; using namespace dnnl::impl; using namespace dnnl::impl::cpu; @@ -42,14 +43,17 @@ namespace ov { namespace intel_cpu { namespace node { #if defined(OPENVINO_ARCH_X86_64) -#define GET_OFF(field) offsetof(jit_bin_conv_call_args, field) +# define GET_OFF(field) offsetof(jit_bin_conv_call_args, field) template struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_bin_conv_kernel_f32) - explicit jit_uni_bin_conv_kernel_f32(jit_bin_conv_params jcp, jit_dw_conv_params jcp_dw_conv, const dnnl_primitive_attr &attr) : - jit_uni_bin_conv_kernel(jcp, jcp_dw_conv, attr), jit_generator(jit_name()) {} + explicit jit_uni_bin_conv_kernel_f32(jit_bin_conv_params jcp, + jit_dw_conv_params jcp_dw_conv, + const dnnl_primitive_attr& attr) + : jit_uni_bin_conv_kernel(jcp, jcp_dw_conv, attr), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -57,16 +61,19 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } void generate() override { - const auto &p = attr_.post_ops_; + const auto& p = attr_.post_ops_; int end_idx = jcp_.with_dw_conv ? p.find(primitive_kind::convolution) : p.len(); for (int i = 0; i < end_idx; i++) { - auto &post_op = p.entry_[i]; + auto& post_op = p.entry_[i]; if (post_op.is_eltwise()) { - eltwise_injectors.push_back(std::make_shared>( - this, post_op.eltwise, true, eltwise_reserved, mask_post_op_reserved)); + eltwise_injectors.push_back(std::make_shared>(this, + post_op.eltwise, + true, + eltwise_reserved, + mask_post_op_reserved)); } else if (post_op.is_depthwise()) { - depthwise_injectors.push_back(std::make_shared>( - this, post_op, mask_post_op_reserved)); + depthwise_injectors.push_back( + std::make_shared>(this, post_op, mask_post_op_reserved)); } } @@ -80,7 +87,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ mov(reg_oc_work, ptr[this->param1 + GET_OFF(oc_work)]); mov(reg_post_ops_data, ptr[this->param1 + GET_OFF(post_op_data)]); - mov(reg_oc_off, ptr[param1 + GET_OFF(oc_off)]); + mov(reg_oc_off, ptr[param1 + GET_OFF(oc_off)]); mov(reg_table, l_table); Label main_loop_label; @@ -98,14 +105,16 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ int nbits = 8; - L(main_loop_label); { + L(main_loop_label); + { cmp(reg_oc_work, jcp_.oc_block); jl(tail_label, T_NEAR); solve_common(1, jcp_.oc_block); sub(reg_oc_work, jcp_.oc_block); - add(reg_kernel_base, jcp_.oc_block * jcp_.nb_ic * jcp_.kh * jcp_.kw * div_up(jcp_.ic_block, nbits) * jcp_.typesize_in); + add(reg_kernel_base, + jcp_.oc_block * jcp_.nb_ic * jcp_.kh * jcp_.kw * div_up(jcp_.ic_block, nbits) * jcp_.typesize_in); if (jcp_.with_dw_conv) { add(reg_output_base, jcp_.oc_block * jcp_dw_conv_.kh * jcp_.ow * jcp_.typesize_out); @@ -137,8 +146,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } private: - using Vmm = typename conditional3::type; + using Vmm = typename conditional3::type; using Ymm = const Xbyak::Ymm; using reg8_t = const Xbyak::Reg8; @@ -212,100 +220,108 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ nstl::vector>> eltwise_injectors; nstl::vector>> depthwise_injectors; - void cvt2ps(dnnl::memory::data_type type_in, Vmm vmm_in, const Xbyak::Operand &op, bool scalar_load) { + void cvt2ps(dnnl::memory::data_type type_in, Vmm vmm_in, const Xbyak::Operand& op, bool scalar_load) { Xmm xmm_in = Xmm(vmm_in.getIdx()); switch (type_in) { - case memory::data_type::f32: - case memory::data_type::s32: - if (scalar_load) { - mov(reg_tmp_32, op); - uni_vmovq(xmm_in, reg_tmp_64); - } else { - uni_vmovups(vmm_in, op); - } - break; - case memory::data_type::s8: - if (scalar_load) { - movsx(reg_tmp_32, op); - uni_vmovq(xmm_in, reg_tmp_64); - } else { - uni_vpmovsxbd(vmm_in, op); - } - break; - case memory::data_type::u8: - if (scalar_load) { - movzx(reg_tmp_32, op); - uni_vmovq(xmm_in, reg_tmp_64); - } else { - uni_vpmovzxbd(vmm_in, op); - } - break; - default: assert(!"unsupported data type"); + case memory::data_type::f32: + case memory::data_type::s32: + if (scalar_load) { + mov(reg_tmp_32, op); + uni_vmovq(xmm_in, reg_tmp_64); + } else { + uni_vmovups(vmm_in, op); + } + break; + case memory::data_type::s8: + if (scalar_load) { + movsx(reg_tmp_32, op); + uni_vmovq(xmm_in, reg_tmp_64); + } else { + uni_vpmovsxbd(vmm_in, op); + } + break; + case memory::data_type::u8: + if (scalar_load) { + movzx(reg_tmp_32, op); + uni_vmovq(xmm_in, reg_tmp_64); + } else { + uni_vpmovzxbd(vmm_in, op); + } + break; + default: + assert(!"unsupported data type"); } if (type_in != data_type::f32) uni_vcvtdq2ps(vmm_in, vmm_in); } - void store_dst(const Xbyak::Address &op, Vmm vmm_dst, bool scalar_store) { + void store_dst(const Xbyak::Address& op, Vmm vmm_dst, bool scalar_store) { Ymm ymm_dst = Ymm(vmm_dst.getIdx()); Xmm xmm_dst = Xmm(vmm_dst.getIdx()); switch (jcp_.dst_dt) { - case memory::data_type::f32: - case memory::data_type::s32: - if (scalar_store) { - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_32); - } else { - uni_vmovups(op, vmm_dst); - } - break; - case memory::data_type::s8: - uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); + case memory::data_type::f32: + case memory::data_type::s32: + if (scalar_store) { + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_32); + } else { + uni_vmovups(op, vmm_dst); + } + break; + case memory::data_type::s8: + uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41 && !scalar_store) - vpermq(ymm_dst, ymm_dst, 0x08); + if (isa != x64::sse41 && !scalar_store) + vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); + uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); - if (scalar_store) { - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - } else { - if (isa != x64::sse41) - vmovq(op, xmm_dst); - else - movd(op, xmm_dst); - } - break; - case memory::data_type::u8: - case memory::data_type::bin: - uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); + if (scalar_store) { + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + } else { + if (isa != x64::sse41) + vmovq(op, xmm_dst); + else + movd(op, xmm_dst); + } + break; + case memory::data_type::u8: + case memory::data_type::bin: + uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41 && !scalar_store) - vpermq(ymm_dst, ymm_dst, 0x08); + if (isa != x64::sse41 && !scalar_store) + vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); + uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); - if (scalar_store) { - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - } else { - if (isa != x64::sse41) - vmovq(op, xmm_dst); - else - movd(op, xmm_dst); - } + if (scalar_store) { + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + } else { + if (isa != x64::sse41) + vmovq(op, xmm_dst); + else + movd(op, xmm_dst); + } - break; - default: - assert(!"unknown dst_dt"); + break; + default: + assert(!"unknown dst_dt"); } } - void apply_filter(int ur_w, int pad_l, int pad_r, int oc_blocks, int oc_step, int ic_blocks, bool last_icb, bool h_padded) { + void apply_filter(int ur_w, + int pad_l, + int pad_r, + int oc_blocks, + int oc_step, + int ic_blocks, + bool last_icb, + bool h_padded) { int kw = jcp_.kw; int kh = jcp_.kh; int stride_w = jcp_.stride_w; @@ -318,15 +334,16 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ for (int ki = 0; ki < kw; ki++) { int jj_start = nstl::max(0, div_up(pad_l - ki * dilate_w, stride_w)); - int jj_end = ur_w - nstl::max(0, div_up(ki*dilate_w+pad_r-(kw-1)*dilate_w, stride_w)); + int jj_end = ur_w - nstl::max(0, div_up(ki * dilate_w + pad_r - (kw - 1) * dilate_w, stride_w)); int _start = (!jcp_.exclude_pad) ? 0 : jj_start; int _end = (!jcp_.exclude_pad) ? ur_w : jj_end; for (int ifm2 = 0; ifm2 < ic_blocks; ifm2++) { for (int jj = _start; jj < _end; jj++) { - int inp_off = ((ki*dilate_w + jj*stride_w - pad_l)*div_up(jcp_.ic, nbits) + - ifm2 * div_up(ic_blk, nbits)) * jcp_.typesize_in; + int inp_off = ((ki * dilate_w + jj * stride_w - pad_l) * div_up(jcp_.ic, nbits) + + ifm2 * div_up(ic_blk, nbits)) * + jcp_.typesize_in; if (h_padded || jj < jj_start || jj >= jj_end) { uni_vmovups(vmm_src, ptr[reg_table + 8 * vlen]); @@ -336,10 +353,11 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ for (int r = 0; r < repeats; r++) { for (int ii = 0; ii < oc_blocks; ii++) { - int ker_off = (ifm2 * kh * kw * div_up(ic_blk, nbits) * oc_blk - + ii * jcp_.nb_ic * div_up(ic_blk, nbits) * kh * kw * oc_blk - + ki * div_up(ic_blk, nbits) * oc_blk - + r * div_up(ic_blk, nbits) * (oc_blk / 2)) * jcp_.typesize_in; + int ker_off = + (ifm2 * kh * kw * div_up(ic_blk, nbits) * oc_blk + + ii * jcp_.nb_ic * div_up(ic_blk, nbits) * kh * kw * oc_blk + + ki * div_up(ic_blk, nbits) * oc_blk + r * div_up(ic_blk, nbits) * (oc_blk / 2)) * + jcp_.typesize_in; uni_vmovups(vmm_tmp, ptr[aux1_reg_kernel + ker_off]); @@ -350,7 +368,8 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ if (mayiuse(x64::avx512_vpopcnt)) { vpopcntd(vmm_tmp, vmm_tmp); uni_vpaddd(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), - Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), vmm_tmp); + Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), + vmm_tmp); } else { if (isa == x64::sse41) { movups(vmm_tmp1, vmm_tmp); @@ -375,12 +394,15 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } if (mayiuse(avx512_core_vnni)) { - vpdpbusd(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), vmm_tmp, vmm_one_u8); + vpdpbusd(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), + vmm_tmp, + vmm_one_u8); } else { uni_vpmaddubsw(vmm_tmp, vmm_tmp, vmm_one_u8); uni_vpmaddwd(vmm_tmp, vmm_tmp, vmm_one_s16); uni_vpaddd(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), - Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), vmm_tmp); + Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), + vmm_tmp); } } } @@ -431,22 +453,22 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ int nbits = 8; const int inp_mult = dilate_h * div_up(jcp_.ic, nbits); - Label t_overflow_label, no_t_overflow_label, - b_overflow_label, no_b_overflow_label; + Label t_overflow_label, no_t_overflow_label, b_overflow_label, no_b_overflow_label; mov(aux_reg_input, reg_input); mov(aux_reg_kernel, reg_kernel_base); - uni_vmovups(vmm_lookup, ptr[reg_table + 0 * vlen]); - uni_vmovups(vmm_mask, ptr[reg_table + 1 * vlen]); - uni_vmovups(vmm_one_u8, ptr[reg_table + 5 * vlen]); + uni_vmovups(vmm_lookup, ptr[reg_table + 0 * vlen]); + uni_vmovups(vmm_mask, ptr[reg_table + 1 * vlen]); + uni_vmovups(vmm_one_u8, ptr[reg_table + 5 * vlen]); uni_vmovups(vmm_one_s16, ptr[reg_table + 6 * vlen]); if (!jcp_.exclude_pad) { - mov(reg_overflow, ptr[param1 + GET_OFF(t_overflow)]); + mov(reg_overflow, ptr[param1 + GET_OFF(t_overflow)]); cmp(reg_overflow, 0); je(no_t_overflow_label, T_NEAR); - L(t_overflow_label); { + L(t_overflow_label); + { oh_step_unroll_kw(ur_w, pad_l, pad_r, oc_blocks, oc_step, true); add(aux_reg_kernel, jcp_.typesize_in * kw * jcp_.oc_block * div_up(jcp_.ic_block, nbits)); @@ -459,8 +481,8 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ Label skip_kh_loop; mov(reg_kh, ptr[this->param1 + GET_OFF(kh_padding)]); - if (!jcp_.exclude_pad || (jcp_.exclude_pad && - (jcp_.kh - 1) * (jcp_.dilate_h + 1) < nstl::max(jcp_.t_pad, jcp_.b_pad))) { + if (!jcp_.exclude_pad || + (jcp_.exclude_pad && (jcp_.kh - 1) * (jcp_.dilate_h + 1) < nstl::max(jcp_.t_pad, jcp_.b_pad))) { cmp(reg_kh, 0); je(skip_kh_loop, T_NEAR); } @@ -481,10 +503,11 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ L(skip_kh_loop); if (!jcp_.exclude_pad) { - mov(reg_overflow, ptr[param1 + GET_OFF(b_overflow)]); + mov(reg_overflow, ptr[param1 + GET_OFF(b_overflow)]); cmp(reg_overflow, 0); je(no_b_overflow_label, T_NEAR); - L(b_overflow_label); { + L(b_overflow_label); + { oh_step_unroll_kw(ur_w, pad_l, pad_r, oc_blocks, oc_step, true); add(aux_reg_kernel, jcp_.typesize_in * kw * jcp_.oc_block * div_up(jcp_.ic_block, nbits)); @@ -515,7 +538,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ kmovw(ktail_mask, reg_tmp_32); } - const auto &p = attr_.post_ops_; + const auto& p = attr_.post_ops_; for (int r = 0; r < repeats; r++) { int tail_size = isa == x64::sse41 ? nstl::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; bool is_scalar_store = isa == x64::sse41 ? tail_size < jcp_.oc_block / 2 : tail_size < jcp_.oc_block; @@ -524,15 +547,17 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ if (jcp_.exclude_pad) { mov(reg_tmp_32, jcp_.ic); - imul(reg_tmp_32, ptr[param1 + GET_OFF(kh_padding)]); + imul(reg_tmp_32, ptr[param1 + GET_OFF(kh_padding)]); for (int jj = 0; jj < ur_w; jj++) kw_padding[jj] = 0; for (int ki = 0; ki < jcp_.kw; ki++) { int jj_start = nstl::max(0, div_up(pad_l - ki * (jcp_.dilate_w + 1), jcp_.stride_w)); - int jj_end = ur_w - nstl::max(0, div_up(ki * (jcp_.dilate_w + 1) + pad_r - - (jcp_.kw - 1) * (jcp_.dilate_w + 1), jcp_.stride_w)); + int jj_end = + ur_w - nstl::max(0, + div_up(ki * (jcp_.dilate_w + 1) + pad_r - (jcp_.kw - 1) * (jcp_.dilate_w + 1), + jcp_.stride_w)); for (int jj = jj_start; jj < jj_end; jj++) { kw_padding[jj]++; } @@ -552,8 +577,11 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } for (int ii = 0; ii < oc_blocks; ii++) { - uni_vcvtdq2ps(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj)); - uni_vfmadd213ps(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), vmm_scale, vmm_shift); + uni_vcvtdq2ps(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), + Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj)); + uni_vfmadd213ps(Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj), + vmm_scale, + vmm_shift); } } @@ -580,7 +608,9 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ for (int ii = 0; ii < oc_blocks; ii++) { depthwise_injectors[depthwise_inj_idx]->compute_vector_range(start_idx + ur_w * ii, - start_idx + ur_w * ii + ur_w, reg_d_weights, reg_d_weights); + start_idx + ur_w * ii + ur_w, + reg_d_weights, + reg_d_weights); add(reg_d_weights, jcp_.oc_block * sizeof(float)); } @@ -596,7 +626,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ if (is_scalar_store) { if (isa == x64::avx512_core) { - int o_off = jj * jcp_.oc * jcp_.ngroups; + int o_off = jj * jcp_.oc * jcp_.ngroups; Vmm vmm_in = vmm_sum | ktail_mask | T_z; @@ -604,7 +634,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ uni_vaddps(vmm_dst, vmm_dst, vmm_sum); } else { for (int oc = 0; oc < tail_size; oc++) { - int o_off = jj * jcp_.oc * jcp_.ngroups + r * (jcp_.oc_block / 2) + oc; + int o_off = jj * jcp_.oc * jcp_.ngroups + r * (jcp_.oc_block / 2) + oc; uni_vpxor(vmm_sum, vmm_sum, vmm_sum); cvt2ps(jcp_.dst_dt, vmm_sum, ptr[reg_output + o_off * jcp_.typesize_out], true); @@ -621,7 +651,8 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } } } else { - size_t o_off = ii * jcp_.oc_block + jj * jcp_.oc * jcp_.ngroups + r * (jcp_.oc_block / 2); + size_t o_off = + ii * jcp_.oc_block + jj * jcp_.oc * jcp_.ngroups + r * (jcp_.oc_block / 2); cvt2ps(jcp_.dst_dt, vmm_sum, ptr[reg_output + o_off * jcp_.typesize_out], false); uni_vaddps(vmm_dst, vmm_dst, vmm_sum); @@ -649,10 +680,15 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ for (int ii = 0; ii < oc_blocks; ii++) { for (int jj = 0; jj < ur_w; jj++) { for (int r = 0; r < repeats; r++) { - int tail_size = isa == x64::sse41 ? nstl::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; + int tail_size = + isa == x64::sse41 ? nstl::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; mov(reg_b_mask, (1 << tail_size) - 1); - uni_vmovups(vmm_thr, ptr[reg_b_weights + (ii * jcp_.oc_block + r * (jcp_.oc_block / 2)) * sizeof(float)]); - uni_vmovups(vmm_out_mask, ptr[reg_b_out_mask + (ii * jcp_.oc_block + r * (jcp_.oc_block / 2)) * sizeof(float)]); + uni_vmovups( + vmm_thr, + ptr[reg_b_weights + (ii * jcp_.oc_block + r * (jcp_.oc_block / 2)) * sizeof(float)]); + uni_vmovups( + vmm_out_mask, + ptr[reg_b_out_mask + (ii * jcp_.oc_block + r * (jcp_.oc_block / 2)) * sizeof(float)]); Vmm vmm_dst = Vmm(1 + r * jcp_.ur_w * jcp_.nb_oc_blocking + ur_w * ii + jj); @@ -693,7 +729,8 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } } else { for (int r = 0; r < repeats; r++) { - int tail_size = isa == x64::sse41 ? nstl::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; + int tail_size = + isa == x64::sse41 ? nstl::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; bool is_scalar_store = isa == x64::sse41 ? tail_size < jcp_.oc_block / 2 : tail_size < jcp_.oc_block; if (is_scalar_store) { for (int jj = 0; jj < ur_w; jj++) { @@ -735,7 +772,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ size_t o_off; if (jcp_.with_dw_conv) - o_off = ((size_t) ii * jcp_dw_conv_.kh * jcp_.ow + jj) * jcp_.oc_block + + o_off = ((size_t)ii * jcp_dw_conv_.kh * jcp_.ow + jj) * jcp_.oc_block + r * (jcp_.oc_block / 2); else o_off = ii * jcp_.oc_block + jj * jcp_.oc * jcp_.ngroups + r * (jcp_.oc_block / 2); @@ -759,14 +796,15 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ int nbits = 8; const int inp_mult = div_up(jcp_.ic, nbits); - const int out_mult = jcp_.with_dw_conv ? jcp_.oc_block : jcp_.with_binarization ? div_up(jcp_.oc, nbits) : jcp_.oc; + const int out_mult = jcp_.with_dw_conv ? jcp_.oc_block + : jcp_.with_binarization ? div_up(jcp_.oc, nbits) + : jcp_.oc; int l_pad = jcp_.l_pad; - int r_pad = nstl::max(0, (jcp_.ow - 1) * str_w + (kw - 1) * dilate_w - - (iw + l_pad - 1)); - int r_pad1 = (ur_w * n_oi - 1) * str_w + (kw - 1) * dilate_w - - (iw + l_pad - 1); - if (r_pad1 > 0) n_oi--; + int r_pad = nstl::max(0, (jcp_.ow - 1) * str_w + (kw - 1) * dilate_w - (iw + l_pad - 1)); + int r_pad1 = (ur_w * n_oi - 1) * str_w + (kw - 1) * dilate_w - (iw + l_pad - 1); + if (r_pad1 > 0) + n_oi--; mov(reg_input, reg_input_base); mov(reg_output, reg_output_base); @@ -779,9 +817,9 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ if (l_pad > 0) { n_oi--; if (n_oi < 0 && r_pad1 > 0) - width_blk_step(ur_w, l_pad, r_pad1, oc_blocks, oc_step); // "lrpad" + width_blk_step(ur_w, l_pad, r_pad1, oc_blocks, oc_step); // "lrpad" else - width_blk_step(ur_w, l_pad, 0, oc_blocks, oc_step); // "lpad" + width_blk_step(ur_w, l_pad, 0, oc_blocks, oc_step); // "lpad" add(reg_input, jcp_.typesize_in * (ur_w * str_w - l_pad) * inp_mult); add(reg_output, jcp_.typesize_out * ur_w * out_mult); } @@ -792,7 +830,7 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ if (n_oi > 0) { L(ow_loop_label); - width_blk_step(ur_w, 0, 0, oc_blocks, oc_step); // "middle" + width_blk_step(ur_w, 0, 0, oc_blocks, oc_step); // "middle" add(reg_input, jcp_.typesize_in * ur_w * str_w * inp_mult); add(reg_output, jcp_.typesize_out * ur_w * out_mult); @@ -801,14 +839,14 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ jl(ow_loop_label, T_NEAR); } - if (r_pad1 > 0 && n_oi >=0) { - width_blk_step(ur_w, 0, r_pad1, oc_blocks, oc_step); // "rpad" + if (r_pad1 > 0 && n_oi >= 0) { + width_blk_step(ur_w, 0, r_pad1, oc_blocks, oc_step); // "rpad" add(reg_input, jcp_.typesize_in * ur_w * str_w * inp_mult); add(reg_output, jcp_.typesize_out * ur_w * out_mult); } if (ur_w_tail != 0) - width_blk_step(ur_w_tail, 0, r_pad, oc_blocks, oc_step); // "tail" + width_blk_step(ur_w_tail, 0, r_pad, oc_blocks, oc_step); // "tail" pop(reg_oc_off); pop(reg_oc_work); @@ -817,17 +855,15 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } void prepare_table() { - const unsigned int cvals[] = { - 0x02010100, // 0 1 1 2 - 0x03020201, // 1 2 2 3 - 0x03020201, // 1 2 2 3 - 0x04030302, // 2 3 3 4 - 0x0f0f0f0f, - 0x000000ff, - 0xc0000000, // -2.0f - 0x01010101, - 0x00010001 - }; + const unsigned int cvals[] = {0x02010100, // 0 1 1 2 + 0x03020201, // 1 2 2 3 + 0x03020201, // 1 2 2 3 + 0x04030302, // 2 3 3 4 + 0x0f0f0f0f, + 0x000000ff, + 0xc0000000, // -2.0f + 0x01010101, + 0x00010001}; size_t simd_w = vlen / sizeof(int32_t); @@ -876,7 +912,8 @@ struct jit_uni_bin_conv_kernel_f32 : public jit_uni_bin_conv_kernel, public jit_ } }; #endif -bool BinaryConvolution::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool BinaryConvolution::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { if (isDynamicNgraphNode(op)) { errorMessage = "Doesn't support op with dynamic shapes"; @@ -934,7 +971,7 @@ void BinaryConvolution::getSupportedDescriptors() { withSum = false; size_t expectedInputEdgesNum = 2; for (size_t i = 0; i < fusedWith.size(); i++) { - auto *eltwiseNode = dynamic_cast(fusedWith[i].get()); + auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); if (eltwiseNode && eltwiseNode->isSpecialConvolutionAddFusing()) { withSum = true; expectedInputEdgesNum++; @@ -979,22 +1016,30 @@ void BinaryConvolution::initSupportedPrimitiveDescriptors() { if (implType != impl_desc_type::ref) { // optimzed implementation -// auto weiFormat = implType == impl_desc_type::jit_avx512 ? memory::format_tag::OhIw16o32i : memory::format_tag::OhIw8o32i; + // auto weiFormat = implType == impl_desc_type::jit_avx512 ? memory::format_tag::OhIw16o32i : + // memory::format_tag::OhIw8o32i; - //activation + // activation auto nspcCreator = BlockedDescCreator::getCommonCreators().at(LayoutType::nspc); config.inConfs[0].setMemDesc(nspcCreator->createSharedDesc(ov::element::u1, getInputShapeAtPort(0))); - //weights - size_t weiFirstDimBlockSize = implType == impl_desc_type::jit_avx512 ? 16 : 8; //memory::format_tag::OIhw16o32i : memory::format_tag::OIhw8o32i; + // weights + size_t weiFirstDimBlockSize = implType == impl_desc_type::jit_avx512 + ? 16 + : 8; // memory::format_tag::OIhw16o32i : memory::format_tag::OIhw8o32i; auto weiDims = getInputShapeAtPort(1).getStaticDims(); - std::vector weiBlockDims = {div_up(weiDims[0], weiFirstDimBlockSize), div_up(weiDims[1], 32), - weiDims[2], weiDims[3], weiFirstDimBlockSize, 32}; + std::vector weiBlockDims = {div_up(weiDims[0], weiFirstDimBlockSize), + div_up(weiDims[1], 32), + weiDims[2], + weiDims[3], + weiFirstDimBlockSize, + 32}; std::vector weiOrder = {0, 1, 2, 3, 0, 1}; - config.inConfs[1].setMemDesc(std::make_shared(ov::element::u1, Shape(weiDims), weiBlockDims, weiOrder)); + config.inConfs[1].setMemDesc( + std::make_shared(ov::element::u1, Shape(weiDims), weiBlockDims, weiOrder)); - //result + // result auto outputPrecision = withBinarization ? ov::element::u1 : ov::element::f32; config.outConfs[0].setMemDesc(nspcCreator->createSharedDesc(outputPrecision, getOutputShapeAtPort(0))); if (withSum) { @@ -1056,14 +1101,15 @@ void BinaryConvolution::createPrimitive() { jcp.with_dw_conv = false; jcp.with_binarization = withBinarization; - const auto &p = (*attr.get()).post_ops_; + const auto& p = (*attr.get()).post_ops_; jcp.with_sum = p.find(primitive_kind::sum) != -1; jcp.with_binarization = p.find(primitive_kind::binarization) != -1; int simd_w = implType == impl_desc_type::jit_avx512 ? 16 : 8; jcp.ur_w = implType == impl_desc_type::jit_avx512 ? 4 : 2; - if (jcp.ow < jcp.ur_w) jcp.ur_w = jcp.ow; + if (jcp.ow < jcp.ur_w) + jcp.ur_w = jcp.ow; jcp.ur_w_tail = jcp.ow % jcp.ur_w; jcp.ic_block = 32; @@ -1073,7 +1119,10 @@ void BinaryConvolution::createPrimitive() { jcp.oc_block = simd_w; jcp.nb_oc = div_up(jcp.oc, jcp.oc_block); - jcp.nb_oc_blocking = nstl::min(implType == impl_desc_type::jit_sse42 ? 2 : implType == impl_desc_type::jit_avx2 ? 4 : 6, jcp.nb_oc); + jcp.nb_oc_blocking = nstl::min(implType == impl_desc_type::jit_sse42 ? 2 + : implType == impl_desc_type::jit_avx2 ? 4 + : 6, + jcp.nb_oc); auto srcPrecision = getParentEdgeAt(0)->getMemory().getDesc().getPrecision(); auto dstPrecision = getChildEdgeAt(0)->getMemory().getDesc().getPrecision(); @@ -1082,11 +1131,13 @@ void BinaryConvolution::createPrimitive() { jcp.typesize_in = srcPrecision == ov::element::u1 ? 1 : srcPrecision.size(); jcp.typesize_out = dstPrecision == ov::element::u1 ? 1 : dstPrecision.size(); - int r_pad_no_tail = nstl::max(0, (jcp.ow - jcp.ur_w_tail - 1) * jcp.stride_w - + (jcp.kw - 1) * (jcp.dilate_w + 1) - (jcp.iw + jcp.l_pad - 1)); + int r_pad_no_tail = nstl::max( + 0, + (jcp.ow - jcp.ur_w_tail - 1) * jcp.stride_w + (jcp.kw - 1) * (jcp.dilate_w + 1) - (jcp.iw + jcp.l_pad - 1)); - bool args_ok = (jcp.l_pad <= jcp.ur_w) && (r_pad_no_tail <= jcp.ur_w) && - IMPLICATION(jcp.kw > 7, (jcp.t_pad == 0 && jcp.l_pad == 0) || (jcp.stride_w == 1 && jcp.stride_h == 1)); + bool args_ok = + (jcp.l_pad <= jcp.ur_w) && (r_pad_no_tail <= jcp.ur_w) && + IMPLICATION(jcp.kw > 7, (jcp.t_pad == 0 && jcp.l_pad == 0) || (jcp.stride_w == 1 && jcp.stride_h == 1)); if (!args_ok) OPENVINO_THROW("BinaryConvolution with name '", getName(), "' has unsupported parameters"); #if defined(OPENVINO_ARCH_X86_64) @@ -1122,12 +1173,12 @@ bool BinaryConvolution::canFuse(const NodePtr& node) const { } } -void BinaryConvolution::setPostOps(dnnl::primitive_attr &attr) { +void BinaryConvolution::setPostOps(dnnl::primitive_attr& attr) { dnnl::post_ops ops; postOpsDataPtrs.clear(); - for (auto &node : fusedWith) { - auto* eltwiseNode = dynamic_cast(node.get()); + for (auto& node : fusedWith) { + auto* eltwiseNode = dynamic_cast(node.get()); if (eltwiseNode) { if (eltwiseNode->isSpecialConvolutionAddFusing()) { ops.append_sum(1.0); @@ -1138,7 +1189,7 @@ void BinaryConvolution::setPostOps(dnnl::primitive_attr &attr) { continue; } - auto* fakeQuantizeNode = dynamic_cast(node.get()); + auto* fakeQuantizeNode = dynamic_cast(node.get()); if (fakeQuantizeNode) { fakeQuantizeNode->appendPostOps(ops, getOutputShapeAtPort(0).getStaticDims(), postOpsDataPtrs); continue; @@ -1154,9 +1205,13 @@ void BinaryConvolution::setPostOps(dnnl::primitive_attr &attr) { attr.set_post_ops(ops); } -void BinaryConvolution::executeOptimized(const uint8_t* src, const uint8_t* weights, uint8_t* dst, - const std::vector& s_str, const std::vector& w_str, const std::vector& d_str) { - auto dst_f32 = reinterpret_cast(dst); +void BinaryConvolution::executeOptimized(const uint8_t* src, + const uint8_t* weights, + uint8_t* dst, + const std::vector& s_str, + const std::vector& w_str, + const std::vector& d_str) { + auto dst_f32 = reinterpret_cast(dst); const int MB = jcp.mb; @@ -1170,26 +1225,28 @@ void BinaryConvolution::executeOptimized(const uint8_t* src, const uint8_t* weig auto par_conv = jit_bin_conv_call_args(); const int ij = oh * jcp.stride_h; - const int i_t_overflow = nstl::min(jcp.kh, div_up(nstl::max(0, jcp.t_pad - ij), (jcp.dilate_h+1))); - const int i_b_overflow = nstl::min(jcp.kh, div_up(nstl::max(jcp.ih, ij + (jcp.kh-1) * (jcp.dilate_h+1) - - jcp.t_pad+1) - jcp.ih, (jcp.dilate_h + 1))); + const int i_t_overflow = nstl::min(jcp.kh, div_up(nstl::max(0, jcp.t_pad - ij), (jcp.dilate_h + 1))); + const int i_b_overflow = + nstl::min(jcp.kh, + div_up(nstl::max(jcp.ih, ij + (jcp.kh - 1) * (jcp.dilate_h + 1) - jcp.t_pad + 1) - jcp.ih, + (jcp.dilate_h + 1))); const size_t _oc = g * jcp.nb_oc + ocb; const size_t _ic = g * jcp.nb_ic; const int ih = nstl::max(ij - jcp.t_pad + i_t_overflow * (jcp.dilate_h + 1), 0); - par_conv.src = &src[(n * s_str[0] + _ic*jcp.ic_block * s_str[1] + ih * s_str[2]) / nbits]; + par_conv.src = &src[(n * s_str[0] + _ic * jcp.ic_block * s_str[1] + ih * s_str[2]) / nbits]; if (jcp.with_binarization) { - par_conv.dst = &dst[(n * d_str[0] + _oc*jcp.oc_block * d_str[1] + oh * d_str[2]) / nbits]; + par_conv.dst = &dst[(n * d_str[0] + _oc * jcp.oc_block * d_str[1] + oh * d_str[2]) / nbits]; } else { - par_conv.dst = &dst_f32[n * d_str[0] + _oc*jcp.oc_block * d_str[1] + oh * d_str[2]]; + par_conv.dst = &dst_f32[n * d_str[0] + _oc * jcp.oc_block * d_str[1] + oh * d_str[2]]; } const int wh = jcp.exclude_pad ? i_t_overflow : 0; par_conv.filt = &weights[(ocb * w_str[0] + wh * w_str[2]) / nbits]; - par_conv.oc_work = nstl::min((ocb + ocb_num) * jcp.oc_block, jcp.oc) - ocb*jcp.oc_block; + par_conv.oc_work = nstl::min((ocb + ocb_num) * jcp.oc_block, jcp.oc) - ocb * jcp.oc_block; par_conv.kw_padding = 0; const int kh_padding = jcp.kh - i_t_overflow - i_b_overflow; @@ -1204,9 +1261,13 @@ void BinaryConvolution::executeOptimized(const uint8_t* src, const uint8_t* weig }); } -void BinaryConvolution::executeReference(const uint8_t* src, const uint8_t* weights, uint8_t* dst, - const std::vector& s_str, const std::vector& w_str, const std::vector& d_str) { - auto dst_fp = reinterpret_cast(dst); +void BinaryConvolution::executeReference(const uint8_t* src, + const uint8_t* weights, + uint8_t* dst, + const std::vector& s_str, + const std::vector& w_str, + const std::vector& d_str) { + auto dst_fp = reinterpret_cast(dst); const bool with_groups = jcp.ngroups > 1; @@ -1240,7 +1301,7 @@ void BinaryConvolution::executeReference(const uint8_t* src, const uint8_t* weig return (uint8_t)((val >> bit) & 0x0001); }; - auto ker = [=](int32_t &d, int g, int mb, int oc, int oh, int ow) { + auto ker = [=](int32_t& d, int g, int mb, int oc, int oh, int ow) { for (int ic = 0; ic < IC; ++ic) { for (int kh = 0; kh < KH; ++kh) { for (int kw = 0; kw < KW; ++kw) { @@ -1259,14 +1320,14 @@ void BinaryConvolution::executeReference(const uint8_t* src, const uint8_t* weig if (pad_value == 0) continue; else - s = pad_value == 1.0f ? (uint8_t) 1 : (uint8_t) 0; + s = pad_value == 1.0f ? (uint8_t)1 : (uint8_t)0; } else { - s = extract_bit(src[iidx / nbits], (uint8_t) (iidx % nbits)); + s = extract_bit(src[iidx / nbits], (uint8_t)(iidx % nbits)); } - uint8_t w = extract_bit(weights[widx / nbits], (uint8_t) (widx % nbits)); + uint8_t w = extract_bit(weights[widx / nbits], (uint8_t)(widx % nbits)); - d += (int32_t) (s ^ w); + d += (int32_t)(s ^ w); } } } @@ -1280,13 +1341,11 @@ void BinaryConvolution::executeReference(const uint8_t* src, const uint8_t* weig if (pad_value == 0.0f) { const int i_left_overflow = nstl::max(0, (padL - ow * KSW)); const int i_right_overflow = nstl::max(IW, (ow * KSW + (KW - 1) * (KDW + 1) - padL + 1)) - IW; - const int kw_padding = - KW - div_up(i_left_overflow, (KDW + 1)) - div_up(i_right_overflow, (KDW + 1)); + const int kw_padding = KW - div_up(i_left_overflow, (KDW + 1)) - div_up(i_right_overflow, (KDW + 1)); const int i_top_overflow = nstl::max(0, (padT - oh * KSH)); const int i_bottom_overflow = nstl::max(IH, (oh * KSH + (KH - 1) * (KDH + 1) - padT + 1)) - IH; - const int kh_padding = - KH - div_up(i_top_overflow, (KDH + 1)) - div_up(i_bottom_overflow, (KDH + 1)); + const int kh_padding = KH - div_up(i_top_overflow, (KDH + 1)) - div_up(i_bottom_overflow, (KDH + 1)); base_value = IC * kh_padding * kw_padding; } else { @@ -1295,7 +1354,7 @@ void BinaryConvolution::executeReference(const uint8_t* src, const uint8_t* weig float a_fp = base_value - static_cast(2 * a); - dst_fp[mb * d_str[0] + (g*OC + oc) * d_str[1] + oh * d_str[2] + ow * d_str[3]] = a_fp; + dst_fp[mb * d_str[0] + (g * OC + oc) * d_str[1] + oh * d_str[2] + ow * d_str[3]] = a_fp; }); } @@ -1342,6 +1401,6 @@ bool BinaryConvolution::created() const { return getType() == Type::BinaryConvolution; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/bin_conv.h b/src/plugins/intel_cpu/src/nodes/bin_conv.h index 86b5cb41b2bf6d..661e075b680ec7 100644 --- a/src/plugins/intel_cpu/src/nodes/bin_conv.h +++ b/src/plugins/intel_cpu/src/nodes/bin_conv.h @@ -39,9 +39,9 @@ struct jit_dw_conv_params { }; struct jit_bin_conv_call_args { - const void *src; - const void *dst; - const void *filt; + const void* src; + const void* dst; + const void* filt; size_t kh_padding; size_t kw_padding; size_t oc_work; @@ -52,15 +52,20 @@ struct jit_bin_conv_call_args { }; struct jit_uni_bin_conv_kernel { - void (*ker_)(const jit_bin_conv_call_args *); + void (*ker_)(const jit_bin_conv_call_args*); - void operator()(const jit_bin_conv_call_args *args) { + void operator()(const jit_bin_conv_call_args* args) { assert(ker_); ker_(args); } - explicit jit_uni_bin_conv_kernel(jit_bin_conv_params jcp, jit_dw_conv_params jcp_dw_conv, const dnnl_primitive_attr &attr) : - ker_(nullptr), jcp_(jcp), jcp_dw_conv_(jcp_dw_conv), attr_(attr) {} + explicit jit_uni_bin_conv_kernel(jit_bin_conv_params jcp, + jit_dw_conv_params jcp_dw_conv, + const dnnl_primitive_attr& attr) + : ker_(nullptr), + jcp_(jcp), + jcp_dw_conv_(jcp_dw_conv), + attr_(attr) {} virtual ~jit_uni_bin_conv_kernel() {} virtual void create_ker() = 0; @@ -68,7 +73,7 @@ struct jit_uni_bin_conv_kernel { jit_bin_conv_params jcp_; jit_dw_conv_params jcp_dw_conv_; - const dnnl_primitive_attr &attr_; + const dnnl_primitive_attr& attr_; }; class BinaryConvolution : public Node { @@ -83,12 +88,14 @@ class BinaryConvolution : public Node { bool canBeInPlace() const override { return false; } - void setPostOps(dnnl::primitive_attr &attr); + void setPostOps(dnnl::primitive_attr& attr); bool canFuse(const NodePtr& node) const override; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; - impl_desc_type getImplType() { return implType; } + impl_desc_type getImplType() { + return implType; + } private: bool withSum = false; @@ -110,14 +117,22 @@ class BinaryConvolution : public Node { impl_desc_type implType = impl_desc_type::ref; - void executeOptimized(const uint8_t* src, const uint8_t* weights, uint8_t* dst, - const std::vector& s_str, const std::vector& w_str, const std::vector& d_str); - void executeReference(const uint8_t* src, const uint8_t* weights, uint8_t* dst, - const std::vector& s_str, const std::vector& w_str, const std::vector& d_str); + void executeOptimized(const uint8_t* src, + const uint8_t* weights, + uint8_t* dst, + const std::vector& s_str, + const std::vector& w_str, + const std::vector& d_str); + void executeReference(const uint8_t* src, + const uint8_t* weights, + uint8_t* dst, + const std::vector& s_str, + const std::vector& w_str, + const std::vector& d_str); std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/broadcast.cpp b/src/plugins/intel_cpu/src/nodes/broadcast.cpp index c88803e07de601..646e186922b397 100644 --- a/src/plugins/intel_cpu/src/nodes/broadcast.cpp +++ b/src/plugins/intel_cpu/src/nodes/broadcast.cpp @@ -2,15 +2,18 @@ // SPDX-License-Identifier: Apache-2.0 // -#include +#include "broadcast.h" + +#include + #include +#include + +#include "common/cpu_memcpy.h" #include "dnnl_types.h" -#include "openvino/core/parallel.hpp" -#include -#include "broadcast.h" #include "nodes/common/blocked_desc_creator.h" +#include "openvino/core/parallel.hpp" #include "openvino/opsets/opset1.hpp" -#include "common/cpu_memcpy.h" #include "utils/ngraph_utils.hpp" namespace ov { @@ -24,19 +27,20 @@ bool Broadcast::isSupportedOperation(const std::shared_ptr& op, return false; } if (!one_of(ov::as_type_ptr(op)->get_broadcast_spec().m_type, - ov::op::AutoBroadcastType::NUMPY, ov::op::AutoBroadcastType::EXPLICIT)) { + ov::op::AutoBroadcastType::NUMPY, + ov::op::AutoBroadcastType::EXPLICIT)) { errorMessage = "Only NUMPY and EXPLICIT broadcast types are supported."; return false; } if (op->get_input_partial_shape(TARGET_SHAPE_IDX).is_dynamic() || - (op->get_input_size() > AXES_MAPPING_IDX && op->get_input_partial_shape(AXES_MAPPING_IDX).is_dynamic())) { + (op->get_input_size() > AXES_MAPPING_IDX && op->get_input_partial_shape(AXES_MAPPING_IDX).is_dynamic())) { errorMessage = "Only static shapes are supported for target shape and axes mapping inputs."; return false; } if (!isDynamicNgraphNode(op) && - (!ov::is_type(op->get_input_node_ptr(TARGET_SHAPE_IDX)) || - (op->get_input_size() > AXES_MAPPING_IDX && - !ov::is_type(op->get_input_node_ptr(AXES_MAPPING_IDX))))) { + (!ov::is_type(op->get_input_node_ptr(TARGET_SHAPE_IDX)) || + (op->get_input_size() > AXES_MAPPING_IDX && + !ov::is_type(op->get_input_node_ptr(AXES_MAPPING_IDX))))) { errorMessage = "Only constant target shapes and axis mapping inputs are supported for static shapes."; return false; } @@ -72,12 +76,13 @@ Broadcast::Broadcast(const std::shared_ptr& op, const GraphContext::CP if (ov::is_type(op->get_input_node_ptr(TARGET_SHAPE_IDX))) { constMap[TARGET_SHAPE_IDX] = true; - targetShape = (ov::as_type(op->get_input_node_ptr(TARGET_SHAPE_IDX)))->get_vector(); + targetShape = + (ov::as_type(op->get_input_node_ptr(TARGET_SHAPE_IDX)))->get_vector(); } - if (broadcastType == EXPLICIT && - ov::is_type(op->get_input_node_ptr(AXES_MAPPING_IDX))) { + if (broadcastType == EXPLICIT && ov::is_type(op->get_input_node_ptr(AXES_MAPPING_IDX))) { constMap[AXES_MAPPING_IDX] = true; - axesMapping = ov::as_type(op->get_input_node_ptr(AXES_MAPPING_IDX))->get_vector(); + axesMapping = + ov::as_type(op->get_input_node_ptr(AXES_MAPPING_IDX))->get_vector(); } } @@ -126,7 +131,8 @@ void Broadcast::prepareParams() { repeats.assign(targetShape.begin(), targetShape.end()); const auto ndims = repeats.size(); - auto srcBlockedDims = getParentEdgeAt(INPUT_DATA_IDX)->getMemory().getDescWithType()->getBlockDims(); + auto srcBlockedDims = + getParentEdgeAt(INPUT_DATA_IDX)->getMemory().getDescWithType()->getBlockDims(); auto dstBlockedDims = getChildEdgeAt(0)->getMemory().getDescWithType()->getBlockDims(); if (broadcastType == NUMPY) { @@ -227,8 +233,8 @@ void Broadcast::plainExecute(dnnl::stream strm) { } const size_t workAmountDst = dstStrides[0] * dstDims[0]; - const auto *srcData = getSrcDataAtPortAs(INPUT_DATA_IDX); - auto *dstData = getDstDataAtPortAs(0); + const auto* srcData = getSrcDataAtPortAs(INPUT_DATA_IDX); + auto* dstData = getDstDataAtPortAs(0); parallel_nt(0, [&](const int ithr, const int nthr) { size_t i = 0lu, srcIdx = 0lu, start = 0lu, end = 0lu; @@ -246,7 +252,8 @@ void Broadcast::plainExecute(dnnl::stream strm) { for (int j = dataDstRank - 1; j >= 0; j--) { counters[j] = (counters[j] + 1) % dstDims[j]; - if (counters[j] != 0) break; + if (counters[j] != 0) + break; } } }); @@ -256,6 +263,6 @@ bool Broadcast::created() const { return getType() == Type::Broadcast; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/broadcast.h b/src/plugins/intel_cpu/src/nodes/broadcast.h index 1435314ee08776..df9ad4614e311d 100644 --- a/src/plugins/intel_cpu/src/nodes/broadcast.h +++ b/src/plugins/intel_cpu/src/nodes/broadcast.h @@ -4,12 +4,12 @@ #pragma once -#include "common/tile_broadcast_utils.h" - #include #include #include +#include "common/tile_broadcast_utils.h" + namespace ov { namespace intel_cpu { namespace node { @@ -35,10 +35,7 @@ class Broadcast : public Node, public TileBroadcastCommon { private: void plainExecute(dnnl::stream strm); - enum AutoBroadcastType { - NUMPY, - EXPLICIT - }; + enum AutoBroadcastType { NUMPY, EXPLICIT }; AutoBroadcastType broadcastType = NUMPY; static constexpr size_t INPUT_DATA_IDX = 0; @@ -51,6 +48,6 @@ class Broadcast : public Node, public TileBroadcastCommon { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/bucketize.cpp b/src/plugins/intel_cpu/src/nodes/bucketize.cpp index a71255c0d531e4..cfa4bb031501ef 100644 --- a/src/plugins/intel_cpu/src/nodes/bucketize.cpp +++ b/src/plugins/intel_cpu/src/nodes/bucketize.cpp @@ -2,14 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "bucketize.h" + +#include +#include #include #include -#include -#include "openvino/opsets/opset3.hpp" -#include #include "openvino/core/parallel.hpp" -#include "bucketize.h" +#include "openvino/opsets/opset3.hpp" namespace ov { namespace intel_cpu { @@ -70,16 +71,15 @@ void Bucketize::initSupportedPrimitiveDescriptors() { output_precision = ov::element::i32; } - addSupportedPrimDesc({{LayoutType::ncsp, input_precision}, - {LayoutType::ncsp, boundaries_precision}}, + addSupportedPrimDesc({{LayoutType::ncsp, input_precision}, {LayoutType::ncsp, boundaries_precision}}, {{LayoutType::ncsp, output_precision}}, impl_desc_type::ref_any); } inline constexpr uint32_t getElementsMask(ov::element::Type precision1, - ov::element::Type precision2, - ov::element::Type precision3 = ov::element::undefined, - ov::element::Type precision4 = ov::element::undefined) { + ov::element::Type precision2, + ov::element::Type precision3 = ov::element::undefined, + ov::element::Type precision4 = ov::element::undefined) { return static_cast(ov::element::Type_t(precision1)) | (static_cast(ov::element::Type_t(precision2)) << 8) | (static_cast(ov::element::Type_t(precision3)) << 16) | @@ -90,98 +90,98 @@ void Bucketize::execute(dnnl::stream strm) { auto precision_mask = getElementsMask(input_precision, boundaries_precision, output_precision); switch (precision_mask) { - case getElementsMask(ov::element::f32, ov::element::f32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::f32, ov::element::f32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::f32, ov::element::i32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::f32, ov::element::i32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::f32, ov::element::i64, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::f32, ov::element::i64, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::f32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::f32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::i32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::i32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::i64, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i32, ov::element::i64, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::f32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::f32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::i32, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::i32, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::i64, ov::element::i32): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - case getElementsMask(ov::element::i64, ov::element::i64, ov::element::i64): - bucketize::value_type, - element_type_traits::value_type, - element_type_traits::value_type>(); - break; - default: - OPENVINO_THROW(errorPrefix, " has unsupported precision: ", precision_mask); + case getElementsMask(ov::element::f32, ov::element::f32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::f32, ov::element::f32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::f32, ov::element::i32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::f32, ov::element::i32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::f32, ov::element::i64, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::f32, ov::element::i64, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::f32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::f32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::i32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::i32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::i64, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i32, ov::element::i64, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::f32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::f32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::i32, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::i32, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::i64, ov::element::i32): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + case getElementsMask(ov::element::i64, ov::element::i64, ov::element::i64): + bucketize::value_type, + element_type_traits::value_type, + element_type_traits::value_type>(); + break; + default: + OPENVINO_THROW(errorPrefix, " has unsupported precision: ", precision_mask); } } @@ -222,9 +222,9 @@ bool Bucketize::isExecutable() const { template void Bucketize::bucketize() { - const auto *input_data = getSrcDataAtPortAs(0); - const auto *boundaries_data = getSrcDataAtPortAs(1); - auto *output_data = getDstDataAtPortAs(0); + const auto* input_data = getSrcDataAtPortAs(0); + const auto* boundaries_data = getSrcDataAtPortAs(1); + auto* output_data = getDstDataAtPortAs(0); if (!with_bins) { memset(output_data, 0, num_values * sizeof(T_IND)); @@ -248,6 +248,6 @@ bool Bucketize::created() const { return getType() == Type::Bucketize; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/bucketize.h b/src/plugins/intel_cpu/src/nodes/bucketize.h index c834921a38ce54..0ecdd633838950 100644 --- a/src/plugins/intel_cpu/src/nodes/bucketize.h +++ b/src/plugins/intel_cpu/src/nodes/bucketize.h @@ -14,7 +14,7 @@ class Bucketize : public Node { public: Bucketize(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -46,6 +46,6 @@ class Bucketize : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.cpp b/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.cpp index 674d77265c9219..fd015a372ed1db 100644 --- a/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.cpp +++ b/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.cpp @@ -4,16 +4,16 @@ #include "causal_mask_preprocess.h" +#include +#include +#include + #include "common/bfloat16.hpp" #include "common/cpu_memcpy.h" #include "cpu/x64/cpu_isa_traits.hpp" #include "shape_inference/shape_inference_internal_dyn.hpp" #include "utils/plain_tensor.hpp" -#include -#include -#include - namespace ov { namespace intel_cpu { namespace node { @@ -48,7 +48,7 @@ The functionality is equivalent to following python code: template struct CausalMaskPreprocess::ExecutorCausalMaskPreprocess : public CausalMaskPreprocess::Executor { void execute(dnnl::stream strm, - intel_cpu::Node * pnode, + intel_cpu::Node* pnode, const intel_cpu::CausalMaskPreprocessNode::Config& config) override { ov::intel_cpu::PlainTensor t_attention_mask(pnode->getSrcMemoryAtPort(0)); ov::intel_cpu::PlainTensor t_batch_size(pnode->getSrcMemoryAtPort(1)); @@ -64,7 +64,14 @@ struct CausalMaskPreprocess::ExecutorCausalMaskPreprocess : public CausalMaskPre pnode->redefineOutputMemory({newDims}); ov::intel_cpu::PlainTensor t_dst(pnode->getDstMemoryAtPort(0)); - DEBUG_LOG("CausalMaskPreprocess::execute", config.type, " batch_size=", batch_size, " qLen=", qLen, " kvLen=", kvLen); + DEBUG_LOG("CausalMaskPreprocess::execute", + config.type, + " batch_size=", + batch_size, + " qLen=", + qLen, + " kvLen=", + kvLen); DEBUG_LOG("CausalMaskPreprocess::execute attention_mask=", t_attention_mask); DEBUG_LOG("CausalMaskPreprocess::execute cache_positions=", t_cache_positions); @@ -81,7 +88,7 @@ struct CausalMaskPreprocess::ExecutorCausalMaskPreprocess : public CausalMaskPre bool cmask_eq0 = (j <= row); bool amask_eq0 = (pamask[j] == 0); bool padding_mask = (cmask_eq0 && amask_eq0); - pdst[j] = (padding_mask | (!cmask_eq0))? min_dtype : T(0); + pdst[j] = (padding_mask | (!cmask_eq0)) ? min_dtype : T(0); } for (; j < kvLen; j++) { bool cmask_eq0 = (j <= row); @@ -103,7 +110,8 @@ CausalMaskPreprocess::CausalMaskPreprocess(const std::shared_ptr& op, m_config = node->get_config(); } -bool CausalMaskPreprocess::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool CausalMaskPreprocess::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto node = std::dynamic_pointer_cast(op); if (!node) { @@ -133,7 +141,8 @@ void CausalMaskPreprocess::initSupportedPrimitiveDescriptors() { oprecs[0] = ov::element::f32; } // all input precisions must be int32 - for (auto& prec : iprecs) prec = ov::element::i32; + for (auto& prec : iprecs) + prec = ov::element::i32; } else { OPENVINO_THROW("CPU: CausalMaskPreprocess type not supported : " + m_config.type); } diff --git a/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.h b/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.h index eeb997c4cefb9f..444f242b0597a7 100644 --- a/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.h +++ b/src/plugins/intel_cpu/src/nodes/causal_mask_preprocess.h @@ -32,7 +32,7 @@ class CausalMaskPreprocess : public Node { private: struct Executor { virtual void execute(dnnl::stream strm, - intel_cpu::Node * pnode, + intel_cpu::Node* pnode, const intel_cpu::CausalMaskPreprocessNode::Config& config) = 0; virtual ~Executor() = default; }; diff --git a/src/plugins/intel_cpu/src/nodes/col2im.cpp b/src/plugins/intel_cpu/src/nodes/col2im.cpp index 4b83e78fd82505..409607ea6bb89c 100644 --- a/src/plugins/intel_cpu/src/nodes/col2im.cpp +++ b/src/plugins/intel_cpu/src/nodes/col2im.cpp @@ -3,8 +3,9 @@ // #include "col2im.h" -#include "openvino/reference/col2im.hpp" + #include "openvino/op/col2im.hpp" +#include "openvino/reference/col2im.hpp" namespace ov { namespace intel_cpu { @@ -62,42 +63,42 @@ void Col2Im::executeDynamicImpl(dnnl::stream strm) { template void Col2Im::executeImpl() { - ov::reference::col2im( - getSrcDataAtPortAs(0), - ov::Shape{getSrcMemoryAtPort(0)->getStaticDims()}, - getSrcDataAtPortAs(1), - getSrcDataAtPortAs(2), - getDstDataAtPortAs(0), - strides, - dilations, - padsBegin, - padsEnd); + ov::reference::col2im(getSrcDataAtPortAs(0), + ov::Shape{getSrcMemoryAtPort(0)->getStaticDims()}, + getSrcDataAtPortAs(1), + getSrcDataAtPortAs(2), + getDstDataAtPortAs(0), + strides, + dilations, + padsBegin, + padsEnd); } namespace { struct Col2ImContext { - Col2Im &node; + Col2Im& node; }; -} +} // namespace -template +template struct Col2Im::Col2ImExecute { using TData = typename std::tuple_element<0, T>::type; using TIndex = typename std::tuple_element<1, T>::type; - void operator()(Col2ImContext & ctx) { - ctx.node.executeImpl(); - } + void operator()(Col2ImContext& ctx) { + ctx.node.executeImpl(); + } }; void Col2Im::execute(dnnl::stream strm) { auto dataPrecision = getParentEdgeAt(0)->getMemory().getDesc().getPrecision(); auto indexPrecision = getParentEdgeAt(1)->getMemory().getDesc().getPrecision(); - Col2ImContext ctx = { - *this - }; + Col2ImContext ctx = {*this}; - OV_SWITCH(intel_cpu, Col2ImExecute, ctx, std::tie(dataPrecision, indexPrecision), + OV_SWITCH(intel_cpu, + Col2ImExecute, + ctx, + std::tie(dataPrecision, indexPrecision), OV_CASE2(ov::element::f32, ov::element::i32, float, int32_t), OV_CASE2(ov::element::f16, ov::element::i32, ov::float16, int32_t), OV_CASE2(ov::element::bf16, ov::element::i32, ov::bfloat16, int32_t), diff --git a/src/plugins/intel_cpu/src/nodes/col2im.h b/src/plugins/intel_cpu/src/nodes/col2im.h index 9904689e53be0f..b56b4bb78469aa 100644 --- a/src/plugins/intel_cpu/src/nodes/col2im.h +++ b/src/plugins/intel_cpu/src/nodes/col2im.h @@ -26,7 +26,7 @@ class Col2Im : public Node { template void executeImpl(); - template + template struct Col2ImExecute; ov::Strides strides; diff --git a/src/plugins/intel_cpu/src/nodes/color_convert.cpp b/src/plugins/intel_cpu/src/nodes/color_convert.cpp index ea3c8e2c774944..a06214b768d6b4 100644 --- a/src/plugins/intel_cpu/src/nodes/color_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/color_convert.cpp @@ -3,14 +3,17 @@ // #include "color_convert.h" + #include -#include -#include -#include -#include + #include -#include "openvino/core/parallel.hpp" +#include +#include +#include +#include + #include "kernels/x64/jit_kernel.hpp" +#include "openvino/core/parallel.hpp" #include "shape_inference/custom/color_convert.hpp" using namespace dnnl::impl; @@ -39,7 +42,7 @@ class Converter : public ColorConvert::Converter { using Base = ColorConvert::Converter; public: - Converter(Node *node); + Converter(Node* node); bool singlePlane() const; @@ -47,12 +50,12 @@ class Converter : public ColorConvert::Converter { std::tuple yuv_to_rgb(float y, float u, float v); }; -Converter::Converter(Node *node) - : Base(node, node->getAlgorithm() == Algorithm::ColorConvertNV12toRGB - || node->getAlgorithm() == Algorithm::ColorConvertI420toRGB - ? ColorFormat { { 0, 1, 2 } } - : ColorFormat { { 2, 1, 0 } }) { -} +Converter::Converter(Node* node) + : Base(node, + node->getAlgorithm() == Algorithm::ColorConvertNV12toRGB || + node->getAlgorithm() == Algorithm::ColorConvertI420toRGB + ? ColorFormat{{0, 1, 2}} + : ColorFormat{{2, 1, 0}}) {} bool Converter::singlePlane() const { return _node->getOriginalInputsNumber() == 1; @@ -81,46 +84,43 @@ struct jit_uni_converter : public jit_kernel { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_converter) struct Params { - const void * y; - const void * u; - const void * v; - void * dst; + const void* y; + const void* u; + const void* v; + void* dst; size_t width; - uint8_t colorFormat; // RGB: 0, BGR: !=0 + uint8_t colorFormat; // RGB: 0, BGR: !=0 }; - typedef void (*function_t)(const Params *); + typedef void (*function_t)(const Params*); void init(); - void operator()(const Params & args) const { + void operator()(const Params& args) const { _fn(&args); } protected: jit_uni_converter(); - template - void yuv_to_rgb(const variable & y, - const variable & u, - const variable & v, - const variable & color_format, + template + void yuv_to_rgb(const variable& y, + const variable& u, + const variable& v, + const variable& color_format, bool round); - template - void store_tail(const variable & dst, - const variable & a, - const variable & b, - const variable & c, - const variable & size); + template + void store_tail(const variable& dst, + const variable& a, + const variable& b, + const variable& c, + const variable& size); function_t _fn; variable _consts; }; -jit_uni_converter::jit_uni_converter() - : jit_kernel(jit_name()), - _consts(*this) { -} +jit_uni_converter::jit_uni_converter() : jit_kernel(jit_name()), _consts(*this) {} void jit_uni_converter::init() { if (create_kernel() != status::success) @@ -128,15 +128,13 @@ void jit_uni_converter::init() { _fn = (function_t)jit_ker(); } -template -void jit_uni_converter::yuv_to_rgb(const variable & y, - const variable & u, - const variable & v, - const variable & color_format, +template +void jit_uni_converter::yuv_to_rgb(const variable& y, + const variable& u, + const variable& v, + const variable& color_format, bool round) { - auto clip = [&](const variable & op, - const variable & a, - const variable & b) { + auto clip = [&](const variable& op, const variable& a, const variable& b) { if (round) uni_vroundps(op, op, 0); uni_vmaxps(op, op, a); @@ -144,8 +142,12 @@ void jit_uni_converter::yuv_to_rgb(const variable & y, }; // blend r,g,b and put to r0,r1,r2 - auto blend = [&](const variable & r, const variable & g, const variable & b, - const variable & r0, const variable & r1, const variable & r2) { + auto blend = [&](const variable& r, + const variable& g, + const variable& b, + const variable& r0, + const variable& r1, + const variable& r2) { /* Input: r0,r1,r2,r3,r4,r5,r6,r7 @@ -174,7 +176,7 @@ void jit_uni_converter::yuv_to_rgb(const variable & y, */ auto genPermutationMask = [&](int offset) { - std::array mask {}; + std::array mask{}; for (uint8_t i = 0; i < mask.size(); ++i) mask[(i * 3 + offset) % mask.size()] = i; return mask; @@ -184,11 +186,8 @@ void jit_uni_converter::yuv_to_rgb(const variable & y, g.permute(genPermutationMask(1)); b.permute(genPermutationMask(2)); - auto blendWithMask = [&](int offset, const variable & result) { - static const uint32_t blendMasks[2] = { - 0x92492492, - 0x24924924 - }; + auto blendWithMask = [&](int offset, const variable& result) { + static const uint32_t blendMasks[2] = {0x92492492, 0x24924924}; const uint16_t mask0 = static_cast(blendMasks[0] >> ((offset * N) % 3)); const uint16_t mask1 = static_cast(blendMasks[1] >> ((offset * N) % 3)); @@ -208,29 +207,29 @@ void jit_uni_converter::yuv_to_rgb(const variable & y, auto b = var(); auto tmp = var(); - uni_vbroadcastss(tmp, ptr[_consts + 0 * sizeof(float)]); // tmp = [16.0f,16.0f,...] - uni_vsubps(y, y, tmp); // y = y - tmp - uni_vbroadcastss(tmp, ptr[_consts + 1 * sizeof(float)]); // tmp = [128.f,128.f,...] - uni_vsubps(u, u, tmp); // u = u - tmp - uni_vsubps(v, v, tmp); // v = v - tmp + uni_vbroadcastss(tmp, ptr[_consts + 0 * sizeof(float)]); // tmp = [16.0f,16.0f,...] + uni_vsubps(y, y, tmp); // y = y - tmp + uni_vbroadcastss(tmp, ptr[_consts + 1 * sizeof(float)]); // tmp = [128.f,128.f,...] + uni_vsubps(u, u, tmp); // u = u - tmp + uni_vsubps(v, v, tmp); // v = v - tmp - uni_vbroadcastss(tmp, ptr[_consts + 2 * sizeof(float)]); // tmp = [1.164f,1.164f,...] - uni_vmulps(y, y, tmp); // y = y * tmp + uni_vbroadcastss(tmp, ptr[_consts + 2 * sizeof(float)]); // tmp = [1.164f,1.164f,...] + uni_vmulps(y, y, tmp); // y = y * tmp - uni_vbroadcastss(r, ptr[_consts + 3 * sizeof(float)]); // r = [1.596f,1.596f,...] - uni_vmulps(r, r, v); // r = r * v - uni_vaddps(r, r, y); // r = r + y + uni_vbroadcastss(r, ptr[_consts + 3 * sizeof(float)]); // r = [1.596f,1.596f,...] + uni_vmulps(r, r, v); // r = r * v + uni_vaddps(r, r, y); // r = r + y - uni_vbroadcastss(g, ptr[_consts + 4 * sizeof(float)]); // g = [0.391f,0.391f,...] - uni_vmulps(g, g, u); // g = g * u - uni_vsubps(g, y, g); // g = y - g - uni_vbroadcastss(tmp, ptr[_consts + 6 * sizeof(float)]); // tmp = [0.813f,0.813f,...] - uni_vmulps(tmp, tmp, v); // tmp = tmp * v - uni_vsubps(g, g, tmp); // g = g - tmp + uni_vbroadcastss(g, ptr[_consts + 4 * sizeof(float)]); // g = [0.391f,0.391f,...] + uni_vmulps(g, g, u); // g = g * u + uni_vsubps(g, y, g); // g = y - g + uni_vbroadcastss(tmp, ptr[_consts + 6 * sizeof(float)]); // tmp = [0.813f,0.813f,...] + uni_vmulps(tmp, tmp, v); // tmp = tmp * v + uni_vsubps(g, g, tmp); // g = g - tmp - uni_vbroadcastss(b, ptr[_consts + 5 * sizeof(float)]); // b = [2.018f,2.018f,...] - uni_vmulps(b, b, u); // b = b * u - uni_vaddps(b, b, y); // b = b + y + uni_vbroadcastss(b, ptr[_consts + 5 * sizeof(float)]); // b = [2.018f,2.018f,...] + uni_vmulps(b, b, u); // b = b * u + uni_vaddps(b, b, y); // b = b + y // clip uni_vxorps(y, y, y); @@ -241,24 +240,30 @@ void jit_uni_converter::yuv_to_rgb(const variable & y, clip(b, y, u); _if(color_format == 0) - ._then([&]{ blend(r, g, b, y, u, v); }) - ._else([&]{ blend(b, g, r, y, u, v); }); + ._then([&] { + blend(r, g, b, y, u, v); + }) + ._else([&] { + blend(b, g, r, y, u, v); + }); } -template -void jit_uni_converter::store_tail(const variable & dst, - const variable & a, - const variable & b, - const variable & c, - const variable & size) { +template +void jit_uni_converter::store_tail(const variable& dst, + const variable& a, + const variable& b, + const variable& c, + const variable& size) { const size_t step = N * sizeof(T); auto s = stack(3 * step); auto sptr = var(); sptr = s.pointer(); - store(sptr, a); sptr += step; - store(sptr, b); sptr += step; + store(sptr, a); + sptr += step; + store(sptr, b); + sptr += step; store(sptr, c); auto copy_size = size * size_t(3u); @@ -269,36 +274,33 @@ void jit_uni_converter::store_tail(const variable & dst, namespace nv12 { -ColorConvert::Converter::PrimitiveDescs supportedPrimitiveDescs(Node *node) { - const LayoutType layout = LayoutType::ncsp; // 0,1,2,3 +ColorConvert::Converter::PrimitiveDescs supportedPrimitiveDescs(Node* node) { + const LayoutType layout = LayoutType::ncsp; // 0,1,2,3 - const ov::element::Type precision = node->getOriginalInputPrecisionAtPort(0) == ov::element::u8 - ? ov::element::u8 - : ov::element::f32; + const ov::element::Type precision = + node->getOriginalInputPrecisionAtPort(0) == ov::element::u8 ? ov::element::u8 : ov::element::f32; ColorConvert::Converter::PrimitiveDescs descs; - descs.emplace_back(std::vector { node->getOriginalInputsNumber(), { layout, precision } }, - std::vector { { layout, precision } }, - mayiuse(cpu_isa_t::sse41) - ? impl_desc_type::jit_uni - : impl_desc_type::ref, - true); + descs.emplace_back(std::vector{node->getOriginalInputsNumber(), {layout, precision}}, + std::vector{{layout, precision}}, + mayiuse(cpu_isa_t::sse41) ? impl_desc_type::jit_uni : impl_desc_type::ref, + true); return descs; } -template +template class SinglePlaneConvert; -template +template class TwoPlaneConvert; class RefConverter : public Converter { public: - RefConverter(Node *node); + RefConverter(Node* node); protected: - template + template void convert(const T* y, const T* uv, T* dst, @@ -309,15 +311,14 @@ class RefConverter : public Converter { size_t stride_uv); }; -RefConverter::RefConverter(Node *node) - : Converter(node) { +RefConverter::RefConverter(Node* node) : Converter(node) { if (node->getOriginalInputsNumber() != (singlePlane() ? 1 : 2)) OPENVINO_THROW("NV12Converter node has incorrect number of inputs"); if (!node->getOriginalOutputsNumber()) OPENVINO_THROW("NV12Converter node has incorrect number of outputs"); } -template +template void RefConverter::convert(const T* y, const T* uv, T* dst, @@ -346,13 +347,13 @@ void RefConverter::convert(const T* y, }); } -template +template class SinglePlaneConvert : public RefConverter { public: using RefConverter::RefConverter; void execute(dnnl::stream strm) override { - const auto & dims = inputDims(0); + const auto& dims = inputDims(0); const size_t batch_size = dims[N_DIM]; const size_t height = dims[H_DIM] * 2 / 3; @@ -362,22 +363,17 @@ class SinglePlaneConvert : public RefConverter { const T* uv = y + width * height; T* dst = static_cast(output(0)); - convert(y, uv, dst, - batch_size, - height, - width, - height * width * 3 / 2, - height * width * 3 / 2); + convert(y, uv, dst, batch_size, height, width, height * width * 3 / 2, height * width * 3 / 2); } }; -template +template class TwoPlaneConvert : public RefConverter { public: using RefConverter::RefConverter; void execute(dnnl::stream strm) override { - const auto & dims = inputDims(0); + const auto& dims = inputDims(0); const T* y = static_cast(input(0)); const T* uv = static_cast(input(1)); @@ -387,34 +383,24 @@ class TwoPlaneConvert : public RefConverter { const size_t height = dims[H_DIM]; const size_t width = dims[W_DIM]; - convert(y, uv, dst, - batch_size, - height, - width, - height * width, - height * width / 2); + convert(y, uv, dst, batch_size, height, width, height * width, height * width / 2); } }; #if defined(OPENVINO_ARCH_X86_64) -template +template class JitConverter; -template +template class JitConverter : public jit_uni_converter { private: void generate() override; - std::tuple, - variable, - variable> - load_yuv(const variable & src_y, - const variable & src_uv); - std::tuple, - variable> - unpack_uv(const variable & uv); + std::tuple, variable, variable> load_yuv(const variable& src_y, + const variable& src_uv); + std::tuple, variable> unpack_uv(const variable& uv); }; -template +template void JitConverter::generate() { preamble(); @@ -425,7 +411,7 @@ void JitConverter::generate() { auto width = arg(&Params::width); auto colorFormat = arg(&Params::colorFormat); - static const float data[8] = { 16.f, 128.f, 1.164f, 1.596f, 0.391f, 2.018f, 0.813f, 255.f }; + static const float data[8] = {16.f, 128.f, 1.164f, 1.596f, 0.391f, 2.018f, 0.813f, 255.f}; _consts = data; const size_t reg_capacity_log = static_cast(std::logb(N)); @@ -433,26 +419,29 @@ void JitConverter::generate() { width >>= reg_capacity_log; - foreach(0, width, [&](const Reg64 & idx) { + foreach (0, width, [&](const Reg64& idx) { auto yuv = load_yuv(src_y, src_uv); // Aliases - const auto & y = std::get<0>(yuv); - const auto & u = std::get<1>(yuv); - const auto & v = std::get<2>(yuv); + const auto& y = std::get<0>(yuv); + const auto& u = std::get<1>(yuv); + const auto& v = std::get<2>(yuv); yuv_to_rgb(y, u, v, colorFormat, std::is_integral::value); - store(dst, y); dst += step; - store(dst, u); dst += step; - store(dst, v); dst += step; - }); + store(dst, y); + dst += step; + store(dst, u); + dst += step; + store(dst, v); + dst += step; + }) + ; mov(width, argPtr(&Params::width)); width &= N - 1; - _if(width != 0) - ._then([&] { + _if(width != 0)._then([&] { auto y = var(); auto uv = var(); @@ -462,8 +451,8 @@ void JitConverter::generate() { auto uv_pair = unpack_uv(uv); // Aliases - const auto & u = std::get<0>(uv_pair); - const auto & v = std::get<1>(uv_pair); + const auto& u = std::get<0>(uv_pair); + const auto& v = std::get<1>(uv_pair); yuv_to_rgb(y, u, v, colorFormat, std::is_integral::value); @@ -473,12 +462,9 @@ void JitConverter::generate() { postamble(); } -template -std::tuple, - jit_kernel::variable, - jit_kernel::variable> -JitConverter::load_yuv(const variable & src_y, - const variable & src_uv) { +template +std::tuple, jit_kernel::variable, jit_kernel::variable> +JitConverter::load_yuv(const variable& src_y, const variable& src_uv) { auto y = var(); auto uv = var(); @@ -490,29 +476,26 @@ JitConverter::load_yuv(const variable & src_y, src_y += N * sizeof(T); src_uv += N * sizeof(T); - return std::make_tuple(std::move(y), - std::move(std::get<0>(uv_pair)), - std::move(std::get<1>(uv_pair))); + return std::make_tuple(std::move(y), std::move(std::get<0>(uv_pair)), std::move(std::get<1>(uv_pair))); } -template -std::tuple, - jit_kernel::variable> -JitConverter::unpack_uv(const variable & uv) { +template +std::tuple, jit_kernel::variable> JitConverter::unpack_uv( + const variable& uv) { auto u = var(); auto v = var(); - const uint8_t even_mask = 0xA0; // 0b10100000 - const uint8_t odd_mask = 0xF5; // 0b11110101 + const uint8_t even_mask = 0xA0; // 0b10100000 + const uint8_t odd_mask = 0xF5; // 0b11110101 - uni_vshufps(u, uv, uv, even_mask); // u = uv[0,0,2,2,4,4,6,6] - uni_vshufps(v, uv, uv, odd_mask); // v = uv[1,1,3,3,5,5,7,7] + uni_vshufps(u, uv, uv, even_mask); // u = uv[0,0,2,2,4,4,6,6] + uni_vshufps(v, uv, uv, odd_mask); // v = uv[1,1,3,3,5,5,7,7] return std::make_tuple(std::move(u), std::move(v)); } -template -const jit_uni_converter & jit_converter_create() { +template +const jit_uni_converter& jit_converter_create() { auto createKernel = []() { std::unique_ptr kernel; @@ -540,22 +523,21 @@ const jit_uni_converter & jit_converter_create() { return *kernel; } -template -const jit_uni_converter & jit_converter_get() { +template +const jit_uni_converter& jit_converter_get() { return jit_converter_create(); } -template +template class SinglePlaneConvert : public Converter { public: - SinglePlaneConvert(Node *node) - : Converter(node) { + SinglePlaneConvert(Node* node) : Converter(node) { jit_converter_create(); } void execute(dnnl::stream strm) override { - const auto & kernel = jit_converter_get(); - const auto & dims = inputDims(0); + const auto& kernel = jit_converter_get(); + const auto& dims = inputDims(0); const size_t batch_size = dims[N_DIM]; const size_t height = dims[H_DIM] * 2 / 3; @@ -574,23 +556,22 @@ class SinglePlaneConvert : public Converter { args.u = args.v = uv + batch * stride_uv + (h / 2) * width; args.dst = dst + (batch * width * height + h * width) * 3; args.width = width; - args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. + args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. kernel(args); }); } }; -template +template class TwoPlaneConvert : public Converter { public: - TwoPlaneConvert(Node *node) - : Converter(node) { + TwoPlaneConvert(Node* node) : Converter(node) { jit_converter_create(); } void execute(dnnl::stream strm) override { - const auto & kernel = jit_converter_get(); - const auto & dims = inputDims(0); + const auto& kernel = jit_converter_get(); + const auto& dims = inputDims(0); const size_t batch_size = dims[N_DIM]; const size_t height = dims[H_DIM]; @@ -609,46 +590,43 @@ class TwoPlaneConvert : public Converter { args.u = args.v = uv + batch * stride_uv + (h / 2) * width; args.dst = dst + (batch * width * height + h * width) * 3; args.width = width; - args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. + args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. kernel(args); }); } }; #endif -} // namespace nv12 +} // namespace nv12 namespace i420 { -ColorConvert::Converter::PrimitiveDescs supportedPrimitiveDescs(Node *node) { - const LayoutType layout = LayoutType::ncsp; // 0,1,2,3 +ColorConvert::Converter::PrimitiveDescs supportedPrimitiveDescs(Node* node) { + const LayoutType layout = LayoutType::ncsp; // 0,1,2,3 - const ov::element::Type precision = node->getOriginalInputPrecisionAtPort(0) == ov::element::u8 - ? ov::element::u8 - : ov::element::f32; + const ov::element::Type precision = + node->getOriginalInputPrecisionAtPort(0) == ov::element::u8 ? ov::element::u8 : ov::element::f32; ColorConvert::Converter::PrimitiveDescs descs; - descs.emplace_back(std::vector { node->getOriginalInputsNumber(), { layout, precision } }, - std::vector { { layout, precision } }, - mayiuse(cpu_isa_t::sse41) - ? impl_desc_type::jit_uni - : impl_desc_type::ref, - true); + descs.emplace_back(std::vector{node->getOriginalInputsNumber(), {layout, precision}}, + std::vector{{layout, precision}}, + mayiuse(cpu_isa_t::sse41) ? impl_desc_type::jit_uni : impl_desc_type::ref, + true); return descs; } -template +template class SinglePlaneConvert; -template +template class ThreePlaneConvert; class RefConverter : public Converter { public: - RefConverter(Node *node); + RefConverter(Node* node); protected: - template + template void convert(const T* y, const T* u, const T* v, @@ -660,15 +638,14 @@ class RefConverter : public Converter { size_t stride_uv); }; -RefConverter::RefConverter(Node *node) - : Converter(node) { - if (node->getOriginalInputsNumber() != (singlePlane() ? 1: 3)) +RefConverter::RefConverter(Node* node) : Converter(node) { + if (node->getOriginalInputsNumber() != (singlePlane() ? 1 : 3)) OPENVINO_THROW("I420Converter node has incorrect number of inputs"); if (!node->getOriginalOutputsNumber()) OPENVINO_THROW("I420Converter node has incorrect number of outputs"); } -template +template void RefConverter::convert(const T* y, const T* u, const T* v, @@ -699,13 +676,13 @@ void RefConverter::convert(const T* y, }); } -template +template class SinglePlaneConvert : public RefConverter { public: using RefConverter::RefConverter; void execute(dnnl::stream strm) override { - const auto & dims = inputDims(0); + const auto& dims = inputDims(0); const size_t batch_size = dims[N_DIM]; const size_t height = dims[H_DIM] * 2 / 3; @@ -716,22 +693,17 @@ class SinglePlaneConvert : public RefConverter { const T* v = y + 5 * width * height / 4; T* dst = static_cast(output(0)); - convert(y, u, v, dst, - batch_size, - height, - width, - height * width * 3 / 2, - height * width * 3 / 2); + convert(y, u, v, dst, batch_size, height, width, height * width * 3 / 2, height * width * 3 / 2); } }; -template +template class ThreePlaneConvert : public RefConverter { public: using RefConverter::RefConverter; void execute(dnnl::stream strm) override { - const auto & dims = inputDims(0); + const auto& dims = inputDims(0); const T* y = static_cast(input(0)); const T* u = static_cast(input(1)); @@ -742,34 +714,25 @@ class ThreePlaneConvert : public RefConverter { const size_t height = dims[H_DIM]; const size_t width = dims[W_DIM]; - convert(y, u, v, dst, - batch_size, - height, - width, - height * width, - height * width / 4); + convert(y, u, v, dst, batch_size, height, width, height * width, height * width / 4); } }; #if defined(OPENVINO_ARCH_X86_64) -template +template class JitConverter; -template +template class JitConverter : public jit_uni_converter { private: void generate() override; - std::tuple, - variable, - variable> - load_yuv(const variable & src_y, - const variable & src_u, - const variable & src_v); - void unpack_uv(const variable & u, - const variable & v); + std::tuple, variable, variable> load_yuv(const variable& src_y, + const variable& src_u, + const variable& src_v); + void unpack_uv(const variable& u, const variable& v); }; -template +template void JitConverter::generate() { preamble(); @@ -781,7 +744,7 @@ void JitConverter::generate() { auto width = arg(&Params::width); auto colorFormat = arg(&Params::colorFormat); - static const float data[8] = { 16.f, 128.f, 1.164f, 1.596f, 0.391f, 2.018f, 0.813f, 255.f }; + static const float data[8] = {16.f, 128.f, 1.164f, 1.596f, 0.391f, 2.018f, 0.813f, 255.f}; _consts = data; const size_t reg_capacity_log = static_cast(std::logb(N)); @@ -789,26 +752,29 @@ void JitConverter::generate() { width >>= reg_capacity_log; - foreach(0, width, [&](const Reg64 & idx) { + foreach (0, width, [&](const Reg64& idx) { auto yuv = load_yuv(src_y, src_u, src_v); // Aliases - const auto & y = std::get<0>(yuv); - const auto & u = std::get<1>(yuv); - const auto & v = std::get<2>(yuv); + const auto& y = std::get<0>(yuv); + const auto& u = std::get<1>(yuv); + const auto& v = std::get<2>(yuv); yuv_to_rgb(y, u, v, colorFormat, std::is_integral::value); - store(dst, y); dst += step; - store(dst, u); dst += step; - store(dst, v); dst += step; - }); + store(dst, y); + dst += step; + store(dst, u); + dst += step; + store(dst, v); + dst += step; + }) + ; mov(width, argPtr(&Params::width)); width &= N - 1; - _if(width != 0) - ._then([&] { + _if(width != 0)._then([&] { auto y = var(); auto u = var(); auto v = var(); @@ -829,13 +795,11 @@ void JitConverter::generate() { postamble(); } -template -std::tuple, - jit_kernel::variable, - jit_kernel::variable> -JitConverter::load_yuv(const variable & src_y, - const variable & src_u, - const variable & src_v) { +template +std::tuple, jit_kernel::variable, jit_kernel::variable> +JitConverter::load_yuv(const variable& src_y, + const variable& src_u, + const variable& src_v) { auto y = var(); auto u = var(); auto v = var(); @@ -853,16 +817,15 @@ JitConverter::load_yuv(const variable & src_y, return std::make_tuple(std::move(y), std::move(u), std::move(v)); } -template -void JitConverter::unpack_uv(const variable & u, - const variable & v) { - static const uint8_t order[] = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 }; +template +void JitConverter::unpack_uv(const variable& u, const variable& v) { + static const uint8_t order[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; u.permute(order); v.permute(order); } -template -const jit_uni_converter & jit_converter_create() { +template +const jit_uni_converter& jit_converter_create() { auto createKernel = []() { std::unique_ptr kernel; @@ -890,22 +853,21 @@ const jit_uni_converter & jit_converter_create() { return *kernel; } -template -const jit_uni_converter & jit_converter_get() { +template +const jit_uni_converter& jit_converter_get() { return jit_converter_create(); } -template +template class SinglePlaneConvert : public Converter { public: - SinglePlaneConvert(Node *node) - : Converter(node) { + SinglePlaneConvert(Node* node) : Converter(node) { jit_converter_create(); } void execute(dnnl::stream strm) override { - const auto & kernel = jit_converter_get(); - const auto & dims = inputDims(0); + const auto& kernel = jit_converter_get(); + const auto& dims = inputDims(0); const size_t batch_size = dims[N_DIM]; const size_t height = dims[H_DIM] * 2 / 3; @@ -926,23 +888,22 @@ class SinglePlaneConvert : public Converter { args.v = v + batch * stride_uv + (h / 2) * (width / 2); args.dst = dst + (batch * width * height + h * width) * 3; args.width = width; - args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. + args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. kernel(args); }); } }; -template +template class ThreePlaneConvert : public Converter { public: - ThreePlaneConvert(Node *node) - : Converter(node) { + ThreePlaneConvert(Node* node) : Converter(node) { jit_converter_create(); } void execute(dnnl::stream strm) override { - const auto & kernel = jit_converter_get(); - const auto & dims = inputDims(0); + const auto& kernel = jit_converter_get(); + const auto& dims = inputDims(0); const T* y = static_cast(input(0)); const T* u = static_cast(input(1)); @@ -963,20 +924,19 @@ class ThreePlaneConvert : public Converter { args.v = v + batch * stride_uv + (h / 2) * (width / 2); args.dst = dst + (batch * width * height + h * width) * 3; args.width = width; - args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. + args.colorFormat = _colorFormat[0]; // The first byte is enough to determine the RGB or BGR format. kernel(args); }); } }; #endif -} // namespace i420 +} // namespace i420 -} // namespace +} // namespace -ColorConvert::Converter::Converter(Node *node, const ColorFormat & colorFormat) - : _node(node) - , _colorFormat(colorFormat) { -} +ColorConvert::Converter::Converter(Node* node, const ColorFormat& colorFormat) + : _node(node), + _colorFormat(colorFormat) {} ov::element::Type ColorConvert::Converter::inputPrecision(size_t idx) const { return _node->getParentEdgeAt(idx)->getMemory().getDesc().getPrecision(); @@ -986,15 +946,15 @@ ov::element::Type ColorConvert::Converter::outputPrecision(size_t idx) const { return _node->getChildEdgeAt(idx)->getMemory().getDesc().getPrecision(); } -const void * ColorConvert::Converter::input(size_t idx) const { +const void* ColorConvert::Converter::input(size_t idx) const { return _node->getSrcDataAtPort(idx); } -void * ColorConvert::Converter::output(size_t idx) const { +void* ColorConvert::Converter::output(size_t idx) const { return _node->getDstDataAtPort(idx); } -const VectorDims & ColorConvert::Converter::inputDims(size_t idx) const { +const VectorDims& ColorConvert::Converter::inputDims(size_t idx) const { return _node->getParentEdgeAt(idx)->getMemory().getStaticDims(); } @@ -1019,42 +979,42 @@ void ColorConvert::initSupportedPrimitiveDescriptors() { return; switch (algorithm) { - case Algorithm::ColorConvertNV12toRGB: - case Algorithm::ColorConvertNV12toBGR: { - for (const auto &desc : nv12::supportedPrimitiveDescs(this)) { - const auto & inPortConfigs = std::get<0>(desc); - const auto & outPortConfigs = std::get<1>(desc); - const auto implType = std::get<2>(desc); - addSupportedPrimDesc(inPortConfigs, outPortConfigs, implType); - } - initSupportedNV12Impls(); - break; + case Algorithm::ColorConvertNV12toRGB: + case Algorithm::ColorConvertNV12toBGR: { + for (const auto& desc : nv12::supportedPrimitiveDescs(this)) { + const auto& inPortConfigs = std::get<0>(desc); + const auto& outPortConfigs = std::get<1>(desc); + const auto implType = std::get<2>(desc); + addSupportedPrimDesc(inPortConfigs, outPortConfigs, implType); } - case Algorithm::ColorConvertI420toRGB: - case Algorithm::ColorConvertI420toBGR: { - for (const auto &desc : i420::supportedPrimitiveDescs(this)) { - const auto & inPortConfigs = std::get<0>(desc); - const auto & outPortConfigs = std::get<1>(desc); - const auto implType = std::get<2>(desc); - addSupportedPrimDesc(inPortConfigs, outPortConfigs, implType); - } - initSupportedI420Impls(); - break; + initSupportedNV12Impls(); + break; + } + case Algorithm::ColorConvertI420toRGB: + case Algorithm::ColorConvertI420toBGR: { + for (const auto& desc : i420::supportedPrimitiveDescs(this)) { + const auto& inPortConfigs = std::get<0>(desc); + const auto& outPortConfigs = std::get<1>(desc); + const auto implType = std::get<2>(desc); + addSupportedPrimDesc(inPortConfigs, outPortConfigs, implType); } - default: - break; + initSupportedI420Impls(); + break; + } + default: + break; } } void ColorConvert::initSupportedNV12Impls() { - #define SUPPORTED_IMPL(Impl, type, desc_type) \ - [](Node *node) { \ - return new nv12::Impl(node); \ - }; +#define SUPPORTED_IMPL(Impl, type, desc_type) \ + [](Node* node) { \ + return new nv12::Impl(node); \ + }; // ref { - auto &impls = _supportedImpls[impl_desc_type::ref][algorithm]; + auto& impls = _supportedImpls[impl_desc_type::ref][algorithm]; impls[ov::element::Type_t::u8][true] = SUPPORTED_IMPL(SinglePlaneConvert, uint8_t, ref); impls[ov::element::Type_t::u8][false] = SUPPORTED_IMPL(TwoPlaneConvert, uint8_t, ref); impls[ov::element::Type_t::f32][true] = SUPPORTED_IMPL(SinglePlaneConvert, float, ref); @@ -1064,25 +1024,25 @@ void ColorConvert::initSupportedNV12Impls() { #if defined(OPENVINO_ARCH_X86_64) // jit_uni { - auto &impls = _supportedImpls[impl_desc_type::jit_uni][algorithm]; + auto& impls = _supportedImpls[impl_desc_type::jit_uni][algorithm]; impls[ov::element::Type_t::u8][true] = SUPPORTED_IMPL(SinglePlaneConvert, uint8_t, jit_uni); impls[ov::element::Type_t::u8][false] = SUPPORTED_IMPL(TwoPlaneConvert, uint8_t, jit_uni); impls[ov::element::Type_t::f32][true] = SUPPORTED_IMPL(SinglePlaneConvert, float, jit_uni); impls[ov::element::Type_t::f32][false] = SUPPORTED_IMPL(TwoPlaneConvert, float, jit_uni); } #endif - #undef SUPPORTED_IMPL +#undef SUPPORTED_IMPL } void ColorConvert::initSupportedI420Impls() { - #define SUPPORTED_IMPL(Impl, type, desc_type) \ - [](Node *node) { \ - return new i420::Impl(node); \ - }; +#define SUPPORTED_IMPL(Impl, type, desc_type) \ + [](Node* node) { \ + return new i420::Impl(node); \ + }; // ref { - auto &impls = _supportedImpls[impl_desc_type::ref][algorithm]; + auto& impls = _supportedImpls[impl_desc_type::ref][algorithm]; impls[ov::element::Type_t::u8][true] = SUPPORTED_IMPL(SinglePlaneConvert, uint8_t, ref); impls[ov::element::Type_t::u8][false] = SUPPORTED_IMPL(ThreePlaneConvert, uint8_t, ref); impls[ov::element::Type_t::f32][true] = SUPPORTED_IMPL(SinglePlaneConvert, float, ref); @@ -1092,32 +1052,29 @@ void ColorConvert::initSupportedI420Impls() { #if defined(OPENVINO_ARCH_X86_64) // jit_uni { - auto &impls = _supportedImpls[impl_desc_type::jit_uni][algorithm]; + auto& impls = _supportedImpls[impl_desc_type::jit_uni][algorithm]; impls[ov::element::Type_t::u8][true] = SUPPORTED_IMPL(SinglePlaneConvert, uint8_t, jit_uni); impls[ov::element::Type_t::u8][false] = SUPPORTED_IMPL(ThreePlaneConvert, uint8_t, jit_uni); impls[ov::element::Type_t::f32][true] = SUPPORTED_IMPL(SinglePlaneConvert, float, jit_uni); impls[ov::element::Type_t::f32][false] = SUPPORTED_IMPL(ThreePlaneConvert, float, jit_uni); } #endif - #undef SUPPORTED_IMPL +#undef SUPPORTED_IMPL } void ColorConvert::createPrimitive() { - const NodeDesc *desc = getSelectedPrimitiveDescriptor(); + const NodeDesc* desc = getSelectedPrimitiveDescriptor(); if (!desc) OPENVINO_THROW(getTypeStr() + " node with name '" + getName() + "' ", "no optimal primitive descriptor selected"); if (!_impl) { - const auto & cfg = desc->getConfig(); + const auto& cfg = desc->getConfig(); const auto precision = cfg.inConfs[0].getMemDesc()->getPrecision(); const bool isSinglePlane = cfg.inConfs.size() == 1; - _impl = std::unique_ptr(_supportedImpls - .at(desc->getImplementationType()) - .at(algorithm) - .at(precision) - .at(isSinglePlane)(this)); + _impl = std::unique_ptr( + _supportedImpls.at(desc->getImplementationType()).at(algorithm).at(precision).at(isSinglePlane)(this)); } } @@ -1139,6 +1096,6 @@ void ColorConvert::executeDynamicImpl(dnnl::stream strm) { execute(strm); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/color_convert.h b/src/plugins/intel_cpu/src/nodes/color_convert.h index 19df1209dd4bab..9bd27c7cf9dffa 100644 --- a/src/plugins/intel_cpu/src/nodes/color_convert.h +++ b/src/plugins/intel_cpu/src/nodes/color_convert.h @@ -5,10 +5,11 @@ #pragma once #include -#include + +#include #include #include -#include +#include namespace ov { namespace intel_cpu { @@ -35,11 +36,11 @@ class ColorConvert : public Node { void initSupportedI420Impls(); private: - using ConverterBuilder = std::function; - using SupportedImpls = multidim_map; + using SupportedImpls = multidim_map; std::unique_ptr _impl; @@ -48,10 +49,11 @@ class ColorConvert : public Node { class ColorConvert::Converter { public: - using PrimitiveDescs = std::vector, // Input port configurator - std::vector, // Output port configurator - impl_desc_type, // Implementation type - bool>>; // // true - SinglePlaneConvert, false - TwoPlaneConvert/ThreePlaneConvert + using PrimitiveDescs = + std::vector, // Input port configurator + std::vector, // Output port configurator + impl_desc_type, // Implementation type + bool>>; // // true - SinglePlaneConvert, false - TwoPlaneConvert/ThreePlaneConvert using Shapes = std::vector; static constexpr size_t N_DIM = 0; @@ -61,20 +63,20 @@ class ColorConvert::Converter { using ColorFormat = std::array; - Converter(Node *node, const ColorFormat & colorFormat); + Converter(Node* node, const ColorFormat& colorFormat); virtual ~Converter() = default; ov::element::Type inputPrecision(size_t idx) const; ov::element::Type outputPrecision(size_t idx) const; - const void * input(size_t idx) const; - void * output(size_t idx) const; - const VectorDims & inputDims(size_t idx) const; + const void* input(size_t idx) const; + void* output(size_t idx) const; + const VectorDims& inputDims(size_t idx) const; virtual void execute(dnnl::stream strm) = 0; protected: - Node *_node; - ColorFormat _colorFormat; // RGB: {0,1,2}, BGR: {2,1,0} + Node* _node; + ColorFormat _colorFormat; // RGB: {0,1,2}, BGR: {2,1,0} }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.cpp b/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.cpp index a7d3adc50d62e3..5887900ce8fa9e 100644 --- a/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.cpp @@ -3,26 +3,26 @@ // #include "arbitrary_order_desc_creator.h" + #include "utils/general_utils.h" namespace ov { namespace intel_cpu { -ArbitraryOrderDescCreator::ArbitraryOrderDescCreator(VectorDims order) : - m_order(std::move(order)) { +ArbitraryOrderDescCreator::ArbitraryOrderDescCreator(VectorDims order) : m_order(std::move(order)) { OPENVINO_ASSERT(std::adjacent_find(m_order.begin(), m_order.end()) == m_order.end(), - "Can't construct ArbitraryOrderDescCreator, order vector contains repetitive elements", - vec2str(m_order)); + "Can't construct ArbitraryOrderDescCreator, order vector contains repetitive elements", + vec2str(m_order)); } -CpuBlockedMemoryDesc -ArbitraryOrderDescCreator::createDesc(const ov::element::Type& precision, const Shape& srcShape) const { +CpuBlockedMemoryDesc ArbitraryOrderDescCreator::createDesc(const ov::element::Type& precision, + const Shape& srcShape) const { auto&& dims = srcShape.getDims(); OPENVINO_ASSERT(dims.size() == m_order.size(), - "Couldn't create a tensor descriptor, shape and order size mismatch. Shape: ", - vec2str(dims), - " order: ", - vec2str(m_order)); + "Couldn't create a tensor descriptor, shape and order size mismatch. Shape: ", + vec2str(dims), + " order: ", + vec2str(m_order)); VectorDims blkDims(dims.size()); for (size_t i = 0; i < dims.size(); ++i) { @@ -36,5 +36,5 @@ size_t ArbitraryOrderDescCreator::getMinimalRank() const { return m_order.size(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.h b/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.h index aaf5a7d5560799..c7341169fd9187 100644 --- a/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.h +++ b/src/plugins/intel_cpu/src/nodes/common/arbitrary_order_desc_creator.h @@ -20,5 +20,5 @@ class ArbitraryOrderDescCreator : public BlockedDescCreator { VectorDims m_order; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.cpp b/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.cpp index 88c351ecafbdc1..a7398cac1e9940 100644 --- a/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.cpp @@ -3,9 +3,8 @@ // #include "blocked_desc_creator.h" -#include - +#include namespace ov { namespace intel_cpu { @@ -15,17 +14,19 @@ constexpr size_t channelsPos = 1lu; class PlainFormatCreator : public BlockedDescCreator { public: - CpuBlockedMemoryDesc createDesc(const ov::element::Type &precision, const Shape& srcShape) const override { + CpuBlockedMemoryDesc createDesc(const ov::element::Type& precision, const Shape& srcShape) const override { VectorDims order(srcShape.getRank()); std::iota(order.begin(), order.end(), 0); return CpuBlockedMemoryDesc(precision, srcShape, srcShape.getDims(), order); } - size_t getMinimalRank() const override { return 0lu; } + size_t getMinimalRank() const override { + return 0lu; + } }; class PerChannelCreator : public BlockedDescCreator { public: - CpuBlockedMemoryDesc createDesc(const ov::element::Type &precision, const Shape& srcShape) const override { + CpuBlockedMemoryDesc createDesc(const ov::element::Type& precision, const Shape& srcShape) const override { VectorDims order(srcShape.getRank()); std::iota(order.begin(), order.end(), 0); VectorDims blkDims = srcShape.getDims(); @@ -41,7 +42,9 @@ class PerChannelCreator : public BlockedDescCreator { return CpuBlockedMemoryDesc(precision, srcShape, blkDims, order); } - size_t getMinimalRank() const override { return 3lu; } + size_t getMinimalRank() const override { + return 3lu; + } }; class ChannelBlockedCreator : public BlockedDescCreator { @@ -64,24 +67,27 @@ class ChannelBlockedCreator : public BlockedDescCreator { return CpuBlockedMemoryDesc(precision, srcShape, blkDims, order); } - size_t getMinimalRank() const override { return 3lu; } + size_t getMinimalRank() const override { + return 3lu; + } private: size_t _blockSize; }; -} // namespace +} // namespace const BlockedDescCreator::CreatorsMap& BlockedDescCreator::getCommonCreators() { - static const CreatorsMap map{ { LayoutType::nspc, CreatorConstPtr(new PerChannelCreator) }, - { LayoutType::nCsp8c, CreatorConstPtr(new ChannelBlockedCreator(8)) }, - { LayoutType::nCsp16c, CreatorConstPtr(new ChannelBlockedCreator(16)) }, - { LayoutType::ncsp, CreatorConstPtr(new PlainFormatCreator) } }; + static const CreatorsMap map{{LayoutType::nspc, CreatorConstPtr(new PerChannelCreator)}, + {LayoutType::nCsp8c, CreatorConstPtr(new ChannelBlockedCreator(8))}, + {LayoutType::nCsp16c, CreatorConstPtr(new ChannelBlockedCreator(16))}, + {LayoutType::ncsp, CreatorConstPtr(new PlainFormatCreator)}}; return map; } -std::pair -BlockedDescCreator::makeFilteredRange(const CreatorsMap &map, unsigned int rank) { +std::pair BlockedDescCreator::makeFilteredRange( + const CreatorsMap& map, + unsigned int rank) { auto rankFilter = [rank](const CreatorsMap::value_type& item) { if (item.second->getMinimalRank() > rank) { return false; @@ -94,8 +100,10 @@ BlockedDescCreator::makeFilteredRange(const CreatorsMap &map, unsigned int rank) return std::make_pair(first, last); } -std::pair -BlockedDescCreator::makeFilteredRange(const CreatorsMap& map, unsigned rank, const std::vector& supportedTypes) { +std::pair BlockedDescCreator::makeFilteredRange( + const CreatorsMap& map, + unsigned rank, + const std::vector& supportedTypes) { unsigned bitMask = 0ul; for (auto& item : supportedTypes) { bitMask |= 1 << static_cast(item); @@ -116,12 +124,13 @@ BlockedDescCreator::makeFilteredRange(const CreatorsMap& map, unsigned rank, con return std::make_pair(first, last); } -std::pair -BlockedDescCreator::makeFilteredRange(const CreatorsMap &map, BlockedDescCreator::Predicate predicate) { +std::pair BlockedDescCreator::makeFilteredRange( + const CreatorsMap& map, + BlockedDescCreator::Predicate predicate) { auto first = CreatorsMapFilterConstIterator(std::move(predicate), map.begin(), map.end()); auto last = first.end(); return std::make_pair(first, last); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.h b/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.h index 1fd7a02dff984b..9f8b15b430c727 100644 --- a/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.h +++ b/src/plugins/intel_cpu/src/nodes/common/blocked_desc_creator.h @@ -5,6 +5,7 @@ #pragma once #include + #include "cpu_shape.h" #include "memory_desc/cpu_blocked_memory_desc.h" @@ -22,15 +23,18 @@ class BlockedDescCreator { public: static const CreatorsMap& getCommonCreators(); - static std::pair - makeFilteredRange(const CreatorsMap &map, unsigned rank); + static std::pair makeFilteredRange( + const CreatorsMap& map, + unsigned rank); static std::pair makeFilteredRange(const CreatorsMap& map, unsigned rank, const std::vector& supportedTypes); - static std::pair - makeFilteredRange(const CreatorsMap& map, Predicate predicate); + static std::pair makeFilteredRange( + const CreatorsMap& map, + Predicate predicate); virtual CpuBlockedMemoryDesc createDesc(const ov::element::Type& precision, const Shape& srcShape) const = 0; - std::shared_ptr createSharedDesc(const ov::element::Type& precision, const Shape& srcShape) const { + std::shared_ptr createSharedDesc(const ov::element::Type& precision, + const Shape& srcShape) const { return std::make_shared(createDesc(precision, srcShape)); } @@ -49,7 +53,10 @@ class CreatorsMapFilterConstIterator { typedef std::function predicate_type; public: - CreatorsMapFilterConstIterator(predicate_type filter, Iterator begin, Iterator end) : _iter(begin), _end(end), _filter(std::move(filter)) { + CreatorsMapFilterConstIterator(predicate_type filter, Iterator begin, Iterator end) + : _iter(begin), + _end(end), + _filter(std::move(filter)) { while (_iter != _end && !_filter(*_iter)) { ++_iter; } @@ -93,5 +100,5 @@ class CreatorsMapFilterConstIterator { predicate_type _filter; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp index ad0738e9d57558..a0590827006eb4 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -5,16 +5,16 @@ #include "cpu_convert.h" #include "cpu_memcpy.h" -#include "utils/bfloat16.hpp" #include "openvino/core/type/nf4.hpp" +#include "utils/bfloat16.hpp" #if defined(OPENVINO_ARCH_X86_64) -#include "nodes/kernels/x64/jit_kernel.hpp" +# include "nodes/kernels/x64/jit_kernel.hpp" #else -#include "cpu_memory.h" -#include "openvino/core/type/element_type_traits.hpp" -#include "selective_build.h" -#include "utils/general_utils.h" +# include "cpu_memory.h" +# include "openvino/core/type/element_type_traits.hpp" +# include "selective_build.h" +# include "utils/general_utils.h" #endif namespace ov { @@ -28,16 +28,12 @@ using namespace dnnl::impl::cpu::x64; using namespace Xbyak; template -void convert_vec(jit_generator & gen, - const RegExp & src, - const RegExp & dst); +void convert_vec(jit_generator& gen, const RegExp& src, const RegExp& dst); template <> -void convert_vec(jit_generator & gen, - const RegExp & src, - const RegExp & dst) { - auto const & f16vec = gen.xmm3; - auto const & f32vec = gen.ymm4; +void convert_vec(jit_generator& gen, const RegExp& src, const RegExp& dst) { + auto const& f16vec = gen.xmm3; + auto const& f32vec = gen.ymm4; gen.movdqu(f16vec, gen.xword[src]); gen.vcvtph2ps(f32vec, f16vec); @@ -45,11 +41,9 @@ void convert_vec(jit_generator & gen, } template <> -void convert_vec(jit_generator & gen, - const RegExp & src, - const RegExp & dst) { - auto const & f16vec = gen.xmm3; - auto const & f32vec = gen.ymm4; +void convert_vec(jit_generator& gen, const RegExp& src, const RegExp& dst) { + auto const& f16vec = gen.xmm3; + auto const& f32vec = gen.ymm4; gen.vmovups(f32vec, gen.yword[src]); gen.vcvtps2ph(f16vec, f32vec, 0); @@ -72,18 +66,18 @@ class jit_convert_array : public jit_kernel { size >>= vlen_log2; - foreach(0, size, [&, this](const Xbyak::Reg64& idx) { + foreach (0, size, [&, this](const Xbyak::Reg64& idx) { _convert_vec(*this, src, dst); src += _src_size * vlen; dst += _dst_size * vlen; - }); + }) + ; mov(size, argPtr(&args_t::count)); size &= vlen - 1; // Tail conversion - _if(size != 0) - ._then([&] { + _if(size != 0)._then([&] { auto tmp = stack(vlen * sizeof(float)); tmp.clear(); @@ -112,24 +106,19 @@ class jit_convert_array : public jit_kernel { typedef void (*fn_t)(const args_t*); - typedef void (*convert_vec_t)(jit_generator &, - const RegExp &, - const RegExp &); + typedef void (*convert_vec_t)(jit_generator&, const RegExp&, const RegExp&); - jit_convert_array(convert_vec_t convert_vec, - size_t src_size, - size_t dst_size) - : jit_kernel(jit_name()) - , _convert_vec(convert_vec) - , _src_size(src_size) - , _dst_size(dst_size) {} + jit_convert_array(convert_vec_t convert_vec, size_t src_size, size_t dst_size) + : jit_kernel(jit_name()), + _convert_vec(convert_vec), + _src_size(src_size), + _dst_size(dst_size) {} - template + template static fn_t get() { - if (mayiuse(cpu_isa_t::avx2) - && dnnl::impl::cpu::x64::cpu().has(Xbyak::util::Cpu::tF16C)) { + if (mayiuse(cpu_isa_t::avx2) && dnnl::impl::cpu::x64::cpu().has(Xbyak::util::Cpu::tF16C)) { static jit_convert_array converter(convert_vec, sizeof(src_t), sizeof(dst_t)); - auto & generator = static_cast(converter); + auto& generator = static_cast(converter); generator.create_kernel(); return (fn_t)generator.jit_ker(); } @@ -148,7 +137,7 @@ void jit_convert(const TI* arg, TO* out, size_t count) { static auto converter = jit_impl::get(); if (converter) { - typename jit_impl::args_t args = { arg, out, count }; + typename jit_impl::args_t args = {arg, out, count}; converter(&args); } else { for (size_t i = 0; i < count; ++i) { @@ -179,44 +168,41 @@ struct PrecisionInfo { using value_type = uint8_t; }; -template::value - || std::is_same::value, - float, T>::type> +template ::value || + std::is_same::value, + float, + T>::type> struct Range { - const std::tuple & fit(const ov::element::Type & prec); + const std::tuple& fit(const ov::element::Type& prec); private: - std::tuple _range { - std::numeric_limits::lowest(), - std::numeric_limits::max() - }; + std::tuple _range{std::numeric_limits::lowest(), std::numeric_limits::max()}; }; -template -const std::tuple & Range::fit(const ov::element::Type & prec) { +template +const std::tuple& Range::fit(const ov::element::Type& prec) { if (prec.is_real()) { double lbound, ubound; switch (prec) { - case ov::element::bf16: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::f16: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::f32: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::f64: - lbound = std::numeric_limits::lowest(); - ubound = std::numeric_limits::max(); - break; - default: - OPENVINO_THROW("Unsupported precision"); + case ov::element::bf16: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::f16: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::f32: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::f64: + lbound = std::numeric_limits::lowest(); + ubound = std::numeric_limits::max(); + break; + default: + OPENVINO_THROW("Unsupported precision"); } // If U is integral, its range always less than float, so not need update _range // Else it will be overflow, for example static_cast double to int64_t: @@ -224,73 +210,71 @@ const std::tuple & Range::fit(const ov::element::Type & prec) { // double dd_ubound = static_cast(ubbound) // static_cast(dd_ubound) will return -9223372036854775808 if (!std::is_integral::value) { - std::get<0>(_range) = static_cast(std::max(static_cast(std::get<0>(_range)), lbound)); - std::get<1>(_range) = static_cast(std::min(static_cast(std::get<1>(_range)), ubound)); + std::get<0>(_range) = static_cast(std::max(static_cast(std::get<0>(_range)), lbound)); + std::get<1>(_range) = static_cast(std::min(static_cast(std::get<1>(_range)), ubound)); } } else { int64_t lbound; uint64_t ubound; switch (prec) { - case ov::element::boolean: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::u8: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::i8: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::u16: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::i16: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::u32: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::i32: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::u64: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - case ov::element::i64: - lbound = static_cast(std::numeric_limits::lowest()); - ubound = static_cast(std::numeric_limits::max()); - break; - default: - OPENVINO_THROW("Unsupported precision"); + case ov::element::boolean: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::u8: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::i8: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::u16: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::i16: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::u32: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::i32: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::u64: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + case ov::element::i64: + lbound = static_cast(std::numeric_limits::lowest()); + ubound = static_cast(std::numeric_limits::max()); + break; + default: + OPENVINO_THROW("Unsupported precision"); } - using ltype = typename std::conditional< - std::is_floating_point::value, - double, int64_t>::type; - using utype = typename std::conditional< - std::is_floating_point::value, - double, uint64_t>::type; - std::get<0>(_range) = static_cast(std::max(static_cast(std::get<0>(_range)), static_cast(lbound))); - std::get<1>(_range) = static_cast(std::min(static_cast(std::get<1>(_range)), static_cast(ubound))); + using ltype = typename std::conditional::value, double, int64_t>::type; + using utype = typename std::conditional::value, double, uint64_t>::type; + std::get<0>(_range) = + static_cast(std::max(static_cast(std::get<0>(_range)), static_cast(lbound))); + std::get<1>(_range) = + static_cast(std::min(static_cast(std::get<1>(_range)), static_cast(ubound))); } return _range; } struct ConvertContext { - const void *srcPtr; - void *dstPtr; + const void* srcPtr; + void* dstPtr; size_t size; ov::element::Type interimPrc; ov::element::Type dstPrc; bool converted; - template + template std::tuple range() const { Range r; r.fit(interimPrc); @@ -298,20 +282,18 @@ struct ConvertContext { } }; -template +template struct ConvertPrecision; -template +template struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); src_t lbound, ubound; std::tie(lbound, ubound) = ctx.range(); - if (std::is_integral::value - || ctx.interimPrc.is_real() - || std::is_integral::value) { + if (std::is_integral::value || ctx.interimPrc.is_real() || std::is_integral::value) { parallel_for(ctx.size, [&](size_t i) { dst[i] = static_cast(std::max(std::min(src[i], ubound), lbound)); }); @@ -325,11 +307,11 @@ struct ConvertPrecision> { } }; -template<> +template <> struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); if (ctx.interimPrc.is_real()) { parallel_for(ctx.size, [&](size_t i) { @@ -347,11 +329,11 @@ struct ConvertPrecision> { } }; -template<> +template <> struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); if (ctx.interimPrc.is_real()) { parallel_for(ctx.size, [&](size_t i) { @@ -370,11 +352,11 @@ struct ConvertPrecision> { }; #if defined(OPENVINO_ARCH_X86_64) -template +template struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); constexpr size_t batch = 64; const size_t iterations = ov::intel_cpu::div_up(ctx.size, batch); @@ -388,16 +370,16 @@ struct ConvertPrecision> { batch_type tmp; const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); - for (size_t j = 0; j < current_batch_size; ++j) // src_t -> fp32 + for (size_t j = 0; j < current_batch_size; ++j) // src_t -> fp32 tmp[j] = static_cast(std::max(std::min(src[offset + j], ubound), lbound)); - jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 + jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 }); } else if (ctx.interimPrc.is_real()) { parallel_for(iterations, [&](size_t i) { const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); if (std::is_same::type, float>::value) { // fp32 -> fp16 - jit_convert(reinterpret_cast(src) + offset, dst + offset, current_batch_size); + jit_convert(reinterpret_cast(src) + offset, dst + offset, current_batch_size); } else { batch_type tmp; for (size_t j = 0; j < current_batch_size; ++j) // src_t -> fp32 @@ -410,9 +392,9 @@ struct ConvertPrecision> { batch_type tmp; const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); - for (size_t j = 0; j < current_batch_size; ++j) // src_t -> fp32 + for (size_t j = 0; j < current_batch_size; ++j) // src_t -> fp32 tmp[j] = static_cast(std::trunc(std::max(std::min(src[offset + j], ubound), lbound))); - jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 + jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 }); } @@ -420,11 +402,11 @@ struct ConvertPrecision> { } }; -template +template struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); constexpr size_t batch = 64; const size_t iterations = ov::intel_cpu::div_up(ctx.size, batch); @@ -438,8 +420,8 @@ struct ConvertPrecision> { batch_type tmp; const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); - jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 - for (size_t j = 0; j < current_batch_size; ++j) // fp32 -> dst_t + jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 + for (size_t j = 0; j < current_batch_size; ++j) // fp32 -> dst_t dst[offset + j] = static_cast(std::max(std::min(tmp[j], ubound), lbound)); }); } else if (ctx.interimPrc.is_real()) { @@ -447,7 +429,7 @@ struct ConvertPrecision> { const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); if (std::is_same::type, float>::value) { // fp16 -> fp32 - jit_convert(src + offset, reinterpret_cast(dst) + offset, current_batch_size); + jit_convert(src + offset, reinterpret_cast(dst) + offset, current_batch_size); } else { batch_type tmp; jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 @@ -460,8 +442,8 @@ struct ConvertPrecision> { batch_type tmp; const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); - jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 - for (size_t j = 0; j < current_batch_size; ++j) // fp32 -> dst_t + jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 + for (size_t j = 0; j < current_batch_size; ++j) // fp32 -> dst_t dst[offset + j] = static_cast(std::trunc(std::max(std::min(tmp[j], ubound), lbound))); }); } @@ -470,11 +452,11 @@ struct ConvertPrecision> { } }; -template<> +template <> struct ConvertPrecision> { - void operator()(ConvertContext & ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); constexpr size_t batch = 64; const size_t iterations = ov::intel_cpu::div_up(ctx.size, batch); @@ -490,10 +472,10 @@ struct ConvertPrecision> { batch_type tmp; const size_t offset = i * batch; const size_t current_batch_size = std::min(ctx.size - offset, batch); - jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 - for (size_t j = 0; j < current_batch_size; ++j) // truncate fp32 + jit_convert(src + offset, tmp, current_batch_size); // fp16 -> fp32 + for (size_t j = 0; j < current_batch_size; ++j) // truncate fp32 tmp[j] = std::trunc(std::max(std::min(tmp[j], ubound), lbound)); - jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 + jit_convert(tmp, dst + offset, current_batch_size); // fp32 -> fp16 }); } @@ -502,7 +484,7 @@ struct ConvertPrecision> { }; #endif -} // namespace +} // namespace #define INTEL_CPU_CVT(ST, DT) \ OV_CASE2(ov::element::ST, \ @@ -510,74 +492,72 @@ struct ConvertPrecision> { PrecisionInfo::value_type, \ PrecisionInfo::value_type) -#define INTEL_CPU_CVT_LIST \ - INTEL_CPU_CVT(u8, i8), INTEL_CPU_CVT(u8, u16), INTEL_CPU_CVT(u8, i16), INTEL_CPU_CVT(u8, u32), \ - INTEL_CPU_CVT(u8, i32), INTEL_CPU_CVT(u8, u64), INTEL_CPU_CVT(u8, i64), INTEL_CPU_CVT(u8, f32), \ - INTEL_CPU_CVT(u8, f16), INTEL_CPU_CVT(u8, bf16), INTEL_CPU_CVT(u8, f64), INTEL_CPU_CVT(u8, boolean), \ - INTEL_CPU_CVT(i8, u8), INTEL_CPU_CVT(i8, u16), INTEL_CPU_CVT(i8, i16), INTEL_CPU_CVT(i8, u32), \ - INTEL_CPU_CVT(i8, i32), INTEL_CPU_CVT(i8, u64), INTEL_CPU_CVT(i8, i64), INTEL_CPU_CVT(i8, f32), \ - INTEL_CPU_CVT(i8, f16), INTEL_CPU_CVT(i8, bf16), INTEL_CPU_CVT(i8, f64), INTEL_CPU_CVT(i8, boolean), \ - INTEL_CPU_CVT(u16, u8), INTEL_CPU_CVT(u16, i8), INTEL_CPU_CVT(u16, i16), INTEL_CPU_CVT(u16, u32), \ - INTEL_CPU_CVT(u16, i32), INTEL_CPU_CVT(u16, u64), INTEL_CPU_CVT(u16, i64), INTEL_CPU_CVT(u16, f32), \ - INTEL_CPU_CVT(u16, f16), INTEL_CPU_CVT(u16, bf16), INTEL_CPU_CVT(u16, f64), INTEL_CPU_CVT(u16, boolean), \ - INTEL_CPU_CVT(i16, u8), INTEL_CPU_CVT(i16, i8), INTEL_CPU_CVT(i16, u16), INTEL_CPU_CVT(i16, u32), \ - INTEL_CPU_CVT(i16, i32), INTEL_CPU_CVT(i16, u64), INTEL_CPU_CVT(i16, i64), INTEL_CPU_CVT(i16, f32), \ - INTEL_CPU_CVT(i16, f16), INTEL_CPU_CVT(i16, bf16), INTEL_CPU_CVT(i16, f64), INTEL_CPU_CVT(i16, boolean), \ - INTEL_CPU_CVT(u32, u8), INTEL_CPU_CVT(u32, i8), INTEL_CPU_CVT(u32, u16), INTEL_CPU_CVT(u32, i16), \ - INTEL_CPU_CVT(u32, i32), INTEL_CPU_CVT(u32, u64), INTEL_CPU_CVT(u32, i64), INTEL_CPU_CVT(u32, f32), \ - INTEL_CPU_CVT(u32, f16), INTEL_CPU_CVT(u32, bf16), INTEL_CPU_CVT(u32, f64), INTEL_CPU_CVT(u32, boolean), \ - INTEL_CPU_CVT(i32, u8), INTEL_CPU_CVT(i32, i8), INTEL_CPU_CVT(i32, u16), INTEL_CPU_CVT(i32, i16), \ - INTEL_CPU_CVT(i32, u32), INTEL_CPU_CVT(i32, u64), INTEL_CPU_CVT(i32, i64), INTEL_CPU_CVT(i32, f32), \ - INTEL_CPU_CVT(i32, f16), INTEL_CPU_CVT(i32, bf16), INTEL_CPU_CVT(i32, f64), INTEL_CPU_CVT(i32, boolean), \ - INTEL_CPU_CVT(u64, u8), INTEL_CPU_CVT(u64, i8), INTEL_CPU_CVT(u64, u16), INTEL_CPU_CVT(u64, i16), \ - INTEL_CPU_CVT(u64, u32), INTEL_CPU_CVT(u64, i32), INTEL_CPU_CVT(u64, i64), INTEL_CPU_CVT(u64, f32), \ - INTEL_CPU_CVT(u64, f16), INTEL_CPU_CVT(u64, bf16), INTEL_CPU_CVT(u64, f64), INTEL_CPU_CVT(u64, boolean), \ - INTEL_CPU_CVT(i64, u8), INTEL_CPU_CVT(i64, i8), INTEL_CPU_CVT(i64, u16), INTEL_CPU_CVT(i64, i16), \ - INTEL_CPU_CVT(i64, u32), INTEL_CPU_CVT(i64, i32), INTEL_CPU_CVT(i64, u64), INTEL_CPU_CVT(i64, f32), \ - INTEL_CPU_CVT(i64, f16), INTEL_CPU_CVT(i64, bf16), INTEL_CPU_CVT(i64, f64), INTEL_CPU_CVT(i64, boolean), \ - INTEL_CPU_CVT(f32, u8), INTEL_CPU_CVT(f32, i8), INTEL_CPU_CVT(f32, u16), INTEL_CPU_CVT(f32, i16), \ - INTEL_CPU_CVT(f32, u32), INTEL_CPU_CVT(f32, i32), INTEL_CPU_CVT(f32, u64), INTEL_CPU_CVT(f32, i64), \ - INTEL_CPU_CVT(f32, f16), INTEL_CPU_CVT(f32, bf16), INTEL_CPU_CVT(f32, f64), INTEL_CPU_CVT(f32, boolean), \ - INTEL_CPU_CVT(f16, u8), INTEL_CPU_CVT(f16, i8), INTEL_CPU_CVT(f16, u16), INTEL_CPU_CVT(f16, i16), \ - INTEL_CPU_CVT(f16, u32), INTEL_CPU_CVT(f16, i32), INTEL_CPU_CVT(f16, u64), INTEL_CPU_CVT(f16, i64), \ - INTEL_CPU_CVT(f16, f32), INTEL_CPU_CVT(f16, bf16), INTEL_CPU_CVT(f16, f64), INTEL_CPU_CVT(f16, boolean), \ - INTEL_CPU_CVT(bf16, u8), INTEL_CPU_CVT(bf16, i8), INTEL_CPU_CVT(bf16, u16), INTEL_CPU_CVT(bf16, i16), \ - INTEL_CPU_CVT(bf16, u32), INTEL_CPU_CVT(bf16, i32), INTEL_CPU_CVT(bf16, u64), INTEL_CPU_CVT(bf16, i64), \ - INTEL_CPU_CVT(bf16, f32), INTEL_CPU_CVT(bf16, f16), INTEL_CPU_CVT(bf16, f64), INTEL_CPU_CVT(bf16, boolean), \ - INTEL_CPU_CVT(f64, u8), INTEL_CPU_CVT(f64, i8), INTEL_CPU_CVT(f64, u16), INTEL_CPU_CVT(f64, i16), \ - INTEL_CPU_CVT(f64, u32), INTEL_CPU_CVT(f64, i32), INTEL_CPU_CVT(f64, u64), INTEL_CPU_CVT(f64, i64), \ - INTEL_CPU_CVT(f64, f32), INTEL_CPU_CVT(f64, f16), INTEL_CPU_CVT(f64, bf16), INTEL_CPU_CVT(f64, boolean), \ - INTEL_CPU_CVT(boolean, u8), INTEL_CPU_CVT(boolean, i8), INTEL_CPU_CVT(boolean, u16), \ - INTEL_CPU_CVT(boolean, i16), INTEL_CPU_CVT(boolean, u32), INTEL_CPU_CVT(boolean, i32), \ - INTEL_CPU_CVT(boolean, u64), INTEL_CPU_CVT(boolean, i64), INTEL_CPU_CVT(boolean, f32), \ - INTEL_CPU_CVT(boolean, f16), INTEL_CPU_CVT(boolean, bf16), INTEL_CPU_CVT(boolean, f64), INTEL_CPU_CVT(u8, u8), \ - INTEL_CPU_CVT(i8, i8), INTEL_CPU_CVT(u16, u16), INTEL_CPU_CVT(i16, i16), INTEL_CPU_CVT(u32, u32), \ - INTEL_CPU_CVT(i32, i32), INTEL_CPU_CVT(u64, u64), INTEL_CPU_CVT(i64, i64), INTEL_CPU_CVT(f32, f32), \ - INTEL_CPU_CVT(f16, f16), INTEL_CPU_CVT(bf16, bf16), INTEL_CPU_CVT(f64, f64), INTEL_CPU_CVT(boolean, boolean) - - -#define INTEL_CPU_CVT_FROM_BIN_LIST \ - INTEL_CPU_CVT(u1, f32), INTEL_CPU_CVT(u1, f16), INTEL_CPU_CVT(u1, bf16), \ - INTEL_CPU_CVT(u1, f64), INTEL_CPU_CVT(u1, i16), INTEL_CPU_CVT(u1, u8), \ - INTEL_CPU_CVT(u1, i8), INTEL_CPU_CVT(u1, u16), INTEL_CPU_CVT(u1, i32), \ - INTEL_CPU_CVT(u1, u32), INTEL_CPU_CVT(u1, i64), INTEL_CPU_CVT(u1, u64), \ - INTEL_CPU_CVT(u1, boolean) +#define INTEL_CPU_CVT_LIST \ + INTEL_CPU_CVT(u8, i8), INTEL_CPU_CVT(u8, u16), INTEL_CPU_CVT(u8, i16), INTEL_CPU_CVT(u8, u32), \ + INTEL_CPU_CVT(u8, i32), INTEL_CPU_CVT(u8, u64), INTEL_CPU_CVT(u8, i64), INTEL_CPU_CVT(u8, f32), \ + INTEL_CPU_CVT(u8, f16), INTEL_CPU_CVT(u8, bf16), INTEL_CPU_CVT(u8, f64), INTEL_CPU_CVT(u8, boolean), \ + INTEL_CPU_CVT(i8, u8), INTEL_CPU_CVT(i8, u16), INTEL_CPU_CVT(i8, i16), INTEL_CPU_CVT(i8, u32), \ + INTEL_CPU_CVT(i8, i32), INTEL_CPU_CVT(i8, u64), INTEL_CPU_CVT(i8, i64), INTEL_CPU_CVT(i8, f32), \ + INTEL_CPU_CVT(i8, f16), INTEL_CPU_CVT(i8, bf16), INTEL_CPU_CVT(i8, f64), INTEL_CPU_CVT(i8, boolean), \ + INTEL_CPU_CVT(u16, u8), INTEL_CPU_CVT(u16, i8), INTEL_CPU_CVT(u16, i16), INTEL_CPU_CVT(u16, u32), \ + INTEL_CPU_CVT(u16, i32), INTEL_CPU_CVT(u16, u64), INTEL_CPU_CVT(u16, i64), INTEL_CPU_CVT(u16, f32), \ + INTEL_CPU_CVT(u16, f16), INTEL_CPU_CVT(u16, bf16), INTEL_CPU_CVT(u16, f64), INTEL_CPU_CVT(u16, boolean), \ + INTEL_CPU_CVT(i16, u8), INTEL_CPU_CVT(i16, i8), INTEL_CPU_CVT(i16, u16), INTEL_CPU_CVT(i16, u32), \ + INTEL_CPU_CVT(i16, i32), INTEL_CPU_CVT(i16, u64), INTEL_CPU_CVT(i16, i64), INTEL_CPU_CVT(i16, f32), \ + INTEL_CPU_CVT(i16, f16), INTEL_CPU_CVT(i16, bf16), INTEL_CPU_CVT(i16, f64), INTEL_CPU_CVT(i16, boolean), \ + INTEL_CPU_CVT(u32, u8), INTEL_CPU_CVT(u32, i8), INTEL_CPU_CVT(u32, u16), INTEL_CPU_CVT(u32, i16), \ + INTEL_CPU_CVT(u32, i32), INTEL_CPU_CVT(u32, u64), INTEL_CPU_CVT(u32, i64), INTEL_CPU_CVT(u32, f32), \ + INTEL_CPU_CVT(u32, f16), INTEL_CPU_CVT(u32, bf16), INTEL_CPU_CVT(u32, f64), INTEL_CPU_CVT(u32, boolean), \ + INTEL_CPU_CVT(i32, u8), INTEL_CPU_CVT(i32, i8), INTEL_CPU_CVT(i32, u16), INTEL_CPU_CVT(i32, i16), \ + INTEL_CPU_CVT(i32, u32), INTEL_CPU_CVT(i32, u64), INTEL_CPU_CVT(i32, i64), INTEL_CPU_CVT(i32, f32), \ + INTEL_CPU_CVT(i32, f16), INTEL_CPU_CVT(i32, bf16), INTEL_CPU_CVT(i32, f64), INTEL_CPU_CVT(i32, boolean), \ + INTEL_CPU_CVT(u64, u8), INTEL_CPU_CVT(u64, i8), INTEL_CPU_CVT(u64, u16), INTEL_CPU_CVT(u64, i16), \ + INTEL_CPU_CVT(u64, u32), INTEL_CPU_CVT(u64, i32), INTEL_CPU_CVT(u64, i64), INTEL_CPU_CVT(u64, f32), \ + INTEL_CPU_CVT(u64, f16), INTEL_CPU_CVT(u64, bf16), INTEL_CPU_CVT(u64, f64), INTEL_CPU_CVT(u64, boolean), \ + INTEL_CPU_CVT(i64, u8), INTEL_CPU_CVT(i64, i8), INTEL_CPU_CVT(i64, u16), INTEL_CPU_CVT(i64, i16), \ + INTEL_CPU_CVT(i64, u32), INTEL_CPU_CVT(i64, i32), INTEL_CPU_CVT(i64, u64), INTEL_CPU_CVT(i64, f32), \ + INTEL_CPU_CVT(i64, f16), INTEL_CPU_CVT(i64, bf16), INTEL_CPU_CVT(i64, f64), INTEL_CPU_CVT(i64, boolean), \ + INTEL_CPU_CVT(f32, u8), INTEL_CPU_CVT(f32, i8), INTEL_CPU_CVT(f32, u16), INTEL_CPU_CVT(f32, i16), \ + INTEL_CPU_CVT(f32, u32), INTEL_CPU_CVT(f32, i32), INTEL_CPU_CVT(f32, u64), INTEL_CPU_CVT(f32, i64), \ + INTEL_CPU_CVT(f32, f16), INTEL_CPU_CVT(f32, bf16), INTEL_CPU_CVT(f32, f64), INTEL_CPU_CVT(f32, boolean), \ + INTEL_CPU_CVT(f16, u8), INTEL_CPU_CVT(f16, i8), INTEL_CPU_CVT(f16, u16), INTEL_CPU_CVT(f16, i16), \ + INTEL_CPU_CVT(f16, u32), INTEL_CPU_CVT(f16, i32), INTEL_CPU_CVT(f16, u64), INTEL_CPU_CVT(f16, i64), \ + INTEL_CPU_CVT(f16, f32), INTEL_CPU_CVT(f16, bf16), INTEL_CPU_CVT(f16, f64), INTEL_CPU_CVT(f16, boolean), \ + INTEL_CPU_CVT(bf16, u8), INTEL_CPU_CVT(bf16, i8), INTEL_CPU_CVT(bf16, u16), INTEL_CPU_CVT(bf16, i16), \ + INTEL_CPU_CVT(bf16, u32), INTEL_CPU_CVT(bf16, i32), INTEL_CPU_CVT(bf16, u64), INTEL_CPU_CVT(bf16, i64), \ + INTEL_CPU_CVT(bf16, f32), INTEL_CPU_CVT(bf16, f16), INTEL_CPU_CVT(bf16, f64), INTEL_CPU_CVT(bf16, boolean), \ + INTEL_CPU_CVT(f64, u8), INTEL_CPU_CVT(f64, i8), INTEL_CPU_CVT(f64, u16), INTEL_CPU_CVT(f64, i16), \ + INTEL_CPU_CVT(f64, u32), INTEL_CPU_CVT(f64, i32), INTEL_CPU_CVT(f64, u64), INTEL_CPU_CVT(f64, i64), \ + INTEL_CPU_CVT(f64, f32), INTEL_CPU_CVT(f64, f16), INTEL_CPU_CVT(f64, bf16), INTEL_CPU_CVT(f64, boolean), \ + INTEL_CPU_CVT(boolean, u8), INTEL_CPU_CVT(boolean, i8), INTEL_CPU_CVT(boolean, u16), \ + INTEL_CPU_CVT(boolean, i16), INTEL_CPU_CVT(boolean, u32), INTEL_CPU_CVT(boolean, i32), \ + INTEL_CPU_CVT(boolean, u64), INTEL_CPU_CVT(boolean, i64), INTEL_CPU_CVT(boolean, f32), \ + INTEL_CPU_CVT(boolean, f16), INTEL_CPU_CVT(boolean, bf16), INTEL_CPU_CVT(boolean, f64), INTEL_CPU_CVT(u8, u8), \ + INTEL_CPU_CVT(i8, i8), INTEL_CPU_CVT(u16, u16), INTEL_CPU_CVT(i16, i16), INTEL_CPU_CVT(u32, u32), \ + INTEL_CPU_CVT(i32, i32), INTEL_CPU_CVT(u64, u64), INTEL_CPU_CVT(i64, i64), INTEL_CPU_CVT(f32, f32), \ + INTEL_CPU_CVT(f16, f16), INTEL_CPU_CVT(bf16, bf16), INTEL_CPU_CVT(f64, f64), INTEL_CPU_CVT(boolean, boolean) + +#define INTEL_CPU_CVT_FROM_BIN_LIST \ + INTEL_CPU_CVT(u1, f32), INTEL_CPU_CVT(u1, f16), INTEL_CPU_CVT(u1, bf16), INTEL_CPU_CVT(u1, f64), \ + INTEL_CPU_CVT(u1, i16), INTEL_CPU_CVT(u1, u8), INTEL_CPU_CVT(u1, i8), INTEL_CPU_CVT(u1, u16), \ + INTEL_CPU_CVT(u1, i32), INTEL_CPU_CVT(u1, u32), INTEL_CPU_CVT(u1, i64), INTEL_CPU_CVT(u1, u64), \ + INTEL_CPU_CVT(u1, boolean) struct ConvertFromBinContext { - const void *srcPtr; - void *dstPtr; + const void* srcPtr; + void* dstPtr; size_t size; bool converted; }; -template +template struct ConvertFromBinPrecision; -template +template struct ConvertFromBinPrecision> { - void operator()(ConvertFromBinContext &ctx) { - auto src = static_cast(ctx.srcPtr); - auto dst = static_cast(ctx.dstPtr); + void operator()(ConvertFromBinContext& ctx) { + auto src = static_cast(ctx.srcPtr); + auto dst = static_cast(ctx.dstPtr); const size_t nBits = 8; const size_t nBytes = rnd_up(ctx.size, nBits); parallel_for(nBytes, [&](size_t byteIndex) { @@ -590,16 +570,17 @@ struct ConvertFromBinPrecision> { } }; -#define INTEL_CPU_CVT_FROM_4BIT_LIST \ - INTEL_CPU_CVT(u4, f32), INTEL_CPU_CVT(u4, bf16), INTEL_CPU_CVT(u4, f16), INTEL_CPU_CVT(u4, i8), INTEL_CPU_CVT(u4, u8), \ - INTEL_CPU_CVT(i4, f32), INTEL_CPU_CVT(i4, bf16), INTEL_CPU_CVT(i4, f16), INTEL_CPU_CVT(i4, i8), INTEL_CPU_CVT(i4, u8), \ - INTEL_CPU_CVT(nf4, f32), INTEL_CPU_CVT(nf4, bf16), INTEL_CPU_CVT(nf4, f16), INTEL_CPU_CVT(nf4, i8), INTEL_CPU_CVT(nf4, u8), \ - INTEL_CPU_CVT(f4e2m1, f32), INTEL_CPU_CVT(f4e2m1, bf16), INTEL_CPU_CVT(f4e2m1, f16), INTEL_CPU_CVT(f4e2m1, i8), INTEL_CPU_CVT(f4e2m1, u8) +#define INTEL_CPU_CVT_FROM_4BIT_LIST \ + INTEL_CPU_CVT(u4, f32), INTEL_CPU_CVT(u4, bf16), INTEL_CPU_CVT(u4, f16), INTEL_CPU_CVT(u4, i8), \ + INTEL_CPU_CVT(u4, u8), INTEL_CPU_CVT(i4, f32), INTEL_CPU_CVT(i4, bf16), INTEL_CPU_CVT(i4, f16), \ + INTEL_CPU_CVT(i4, i8), INTEL_CPU_CVT(i4, u8), INTEL_CPU_CVT(nf4, f32), INTEL_CPU_CVT(nf4, bf16), \ + INTEL_CPU_CVT(nf4, f16), INTEL_CPU_CVT(nf4, i8), INTEL_CPU_CVT(nf4, u8), INTEL_CPU_CVT(f4e2m1, f32), \ + INTEL_CPU_CVT(f4e2m1, bf16), INTEL_CPU_CVT(f4e2m1, f16), INTEL_CPU_CVT(f4e2m1, i8), INTEL_CPU_CVT(f4e2m1, u8) struct ConvertFrom4BitContext { ov::element::Type_t inType; - const void *srcPtr; - void *dstPtr; + const void* srcPtr; + void* dstPtr; size_t size; bool converted; }; @@ -624,12 +605,12 @@ static int8_t get_u4(const uint8_t& val, bool high) { return high ? (val >> 4) : (val & 0xF); } -template +template struct ConvertFrom4BitPrecision; -template +template struct ConvertFrom4BitPrecision> { - void operator()(ConvertFrom4BitContext &ctx) { + void operator()(ConvertFrom4BitContext& ctx) { auto src = static_cast(ctx.srcPtr); auto dst = static_cast(ctx.dstPtr); if (ctx.inType == ov::element::nf4) { @@ -655,23 +636,23 @@ struct ConvertFrom4BitPrecision> { } }; -#define INTEL_CPU_CVT_FROM_BYTE_FP_LIST \ +#define INTEL_CPU_CVT_FROM_BYTE_FP_LIST \ INTEL_CPU_CVT(f8e8m0, f32), INTEL_CPU_CVT(f8e8m0, bf16), INTEL_CPU_CVT(f8e8m0, f16) struct ConvertFromByteFPContext { ov::element::Type_t inType; - const void *srcPtr; - void *dstPtr; + const void* srcPtr; + void* dstPtr; size_t size; bool converted; }; -template +template struct ConvertFromByteFPPrecision; -template +template struct ConvertFromByteFPPrecision> { - void operator()(ConvertFromByteFPContext &ctx) { + void operator()(ConvertFromByteFPContext& ctx) { auto src = static_cast(ctx.srcPtr); auto dst = static_cast(ctx.dstPtr); if (ctx.inType == ov::element::f8e8m0) { @@ -685,12 +666,16 @@ struct ConvertFromByteFPPrecision> { } }; -void cpu_convert(const void *srcPtr, void *dstPtr, ov::element::Type srcPrc, ov::element::Type dstPrc, const size_t size) { +void cpu_convert(const void* srcPtr, + void* dstPtr, + ov::element::Type srcPrc, + ov::element::Type dstPrc, + const size_t size) { cpu_convert(srcPtr, dstPtr, srcPrc, dstPrc, dstPrc, size); } -void cpu_convert(const void *srcPtr, - void *dstPtr, +void cpu_convert(const void* srcPtr, + void* dstPtr, ov::element::Type srcPrc, ov::element::Type interimPrc, ov::element::Type dstPrc, @@ -705,12 +690,12 @@ void cpu_convert(const void *srcPtr, const size_t L2_cache_size = dnnl::utils::get_cache_size(2, true); const size_t totalSize = size * dstPrc.size(); if (srcPrc == element::string) { - auto str_src = reinterpret_cast(srcPtr); - auto str_dst = reinterpret_cast(dstPtr); + auto str_src = reinterpret_cast(srcPtr); + auto str_dst = reinterpret_cast(dstPtr); std::copy(str_src, str_src + size, str_dst); } else if (totalSize >= L2_cache_size) { - auto src = static_cast(srcPtr); - auto dst = static_cast(dstPtr); + auto src = static_cast(srcPtr); + auto dst = static_cast(dstPtr); parallel_nt(0, [&](const size_t ithr, const size_t nthr) { size_t start = 0, end = 0; splitter(totalSize, nthr, ithr, start, end); @@ -728,12 +713,7 @@ void cpu_convert(const void *srcPtr, "> precision to: ", dstPrc, ". Not implemented."); - ConvertFromBinContext ctx { - srcPtr, - dstPtr, - size, - false - }; + ConvertFromBinContext ctx{srcPtr, dstPtr, size, false}; OV_SWITCH(intel_cpu, ConvertFromBinPrecision, ctx, std::tie(srcPrc, dstPrc), INTEL_CPU_CVT_FROM_BIN_LIST); if (!ctx.converted) OPENVINO_THROW("cpu_convert can't convert from: ", @@ -749,18 +729,15 @@ void cpu_convert(const void *srcPtr, OPENVINO_THROW("cpu_convert can't convert from: ", srcPrc, " precision to: ", dstPrc); } else if (srcPrc.bitwidth() == 8u && srcPrc.is_real()) { ConvertFromByteFPContext ctx{srcPrc, srcPtr, dstPtr, size, false}; - OV_SWITCH(intel_cpu, ConvertFromByteFPPrecision, ctx, std::tie(srcPrc, dstPrc), INTEL_CPU_CVT_FROM_BYTE_FP_LIST); + OV_SWITCH(intel_cpu, + ConvertFromByteFPPrecision, + ctx, + std::tie(srcPrc, dstPrc), + INTEL_CPU_CVT_FROM_BYTE_FP_LIST); if (!ctx.converted) OPENVINO_THROW("cpu_convert can't convert from: ", srcPrc, " precision to: ", dstPrc); } else { - ConvertContext ctx { - srcPtr, - dstPtr, - size, - interimPrc, - dstPrc, - false - }; + ConvertContext ctx{srcPtr, dstPtr, size, interimPrc, dstPrc, false}; OV_SWITCH(intel_cpu, ConvertPrecision, ctx, std::tie(srcPrc, dstPrc), INTEL_CPU_CVT_LIST); if (!ctx.converted) OPENVINO_THROW("cpu_convert can't convert from: ", srcPrc, " precision to: ", dstPrc); @@ -773,7 +750,7 @@ struct isSupportedContext { template struct isSupported { - void operator()(isSupportedContext &ctx) { + void operator()(isSupportedContext& ctx) { ctx.isSupported = true; } }; @@ -790,5 +767,5 @@ bool is_supported_convert(ov::element::Type srcPrc, ov::element::Type dstPrc) { #undef INTEL_CPU_CVT #undef INTEL_CPU_CVT_LIST -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.h b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.h index 8390849ff8adc7..11228dbd1dcfdb 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.h +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.h @@ -22,8 +22,8 @@ namespace intel_cpu { * number of elements in buffers to be converted * @return none. */ -void cpu_convert(const void *srcPtr, - void *dstPtr, +void cpu_convert(const void* srcPtr, + void* dstPtr, ov::element::Type srcPrc, ov::element::Type dstPrc, const size_t size); @@ -45,14 +45,14 @@ void cpu_convert(const void *srcPtr, * number of elements in buffers to be converted * @return none. */ -void cpu_convert(const void *srcPtr, - void *dstPtr, +void cpu_convert(const void* srcPtr, + void* dstPtr, ov::element::Type srcPrc, ov::element::Type interimPrc, ov::element::Type dstPrc, const size_t size); - bool is_supported_convert(ov::element::Type srcPrc, ov::element::Type dstPrc); +bool is_supported_convert(ov::element::Type srcPrc, ov::element::Type dstPrc); -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/cpu_memcpy.h b/src/plugins/intel_cpu/src/nodes/common/cpu_memcpy.h old mode 100755 new mode 100644 index 95b0267bd4757c..e827d35a11c2ad --- a/src/plugins/intel_cpu/src/nodes/common/cpu_memcpy.h +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_memcpy.h @@ -5,8 +5,9 @@ #pragma once #include -#include "openvino/core/parallel.hpp" + #include "onednn/dnnl.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -36,8 +37,7 @@ inline void cpu_memcpy(void* dst, const void* src, size_t count) { } inline int cpu_memcpy_s(void* dst, size_t dst_size, const void* src, size_t count) { - if (!src || - count > dst_size || + if (!src || count > dst_size || count > (dst > src ? ((uintptr_t)dst - (uintptr_t)src) : ((uintptr_t)src - (uintptr_t)dst))) { // zero out dest if error detected std::memset(dst, 0, dst_size); @@ -55,8 +55,8 @@ inline int cpu_memcpy_s(void* dst, size_t dst_size, const void* src, size_t coun inline void cpu_parallel_memcpy(void* dst, const void* src, size_t count) { const size_t l2_cache_size = dnnl::utils::get_cache_size(2, true); if (count >= l2_cache_size) { - auto src_int8 = static_cast(src); - auto dst_int8 = static_cast(dst); + auto src_int8 = static_cast(src); + auto dst_int8 = static_cast(dst); parallel_nt(0, [&](const size_t ithr, const size_t nthr) { size_t start = 0, end = 0; splitter(count, nthr, ithr, start, end); @@ -67,5 +67,5 @@ inline void cpu_parallel_memcpy(void* dst, const void* src, size_t count) { } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/defs.h b/src/plugins/intel_cpu/src/nodes/common/defs.h index 6d8574de0939a4..a8a07a2cc8942a 100644 --- a/src/plugins/intel_cpu/src/nodes/common/defs.h +++ b/src/plugins/intel_cpu/src/nodes/common/defs.h @@ -4,10 +4,10 @@ #pragma once -#if defined (HAVE_SSE) || defined (HAVE_AVX2) -# if defined (_WIN32) -# include -# else -# include -# endif +#if defined(HAVE_SSE) || defined(HAVE_AVX2) +# if defined(_WIN32) +# include +# else +# include +# endif #endif diff --git a/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.cpp b/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.cpp index 51aa54c2f50463..695fdbe823ea15 100644 --- a/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.cpp @@ -18,7 +18,9 @@ DnnlExecutor::DnnlExecutor(const dnnl::primitive_desc& pd) { DnnlExecutor::IntermReorder::IntermReorder(const dnnl::memory::desc& descSrc, const dnnl::memory::desc& descDst, - const dnnl::engine& engine) : m_descSrc(descSrc), m_descDst(descDst) { + const dnnl::engine& engine) + : m_descSrc(descSrc), + m_descDst(descDst) { auto reorderPd = dnnl::reorder::primitive_desc(engine, descSrc, engine, descDst); m_reorder = dnnl::reorder(reorderPd); } @@ -36,7 +38,7 @@ void DnnlExecutor::exec(const std::unordered_map& primArgs, d } void DnnlExecutor::reorder_exec(std::unordered_map primArgs, dnnl::stream strm) { - for (auto &inReorder : inputReorders) { + for (auto& inReorder : inputReorders) { if (primArgs.count(inReorder.first)) { dnnl::memory memDst(inReorder.second.getDstDesc(), strm.get_engine()); inReorder.second.exec(primArgs[inReorder.first], memDst, strm); @@ -46,17 +48,19 @@ void DnnlExecutor::reorder_exec(std::unordered_map primArgs, } } std::unordered_map outputMem; - for (auto &outReorder : outputReorders) { + for (auto& outReorder : outputReorders) { if (primArgs.count(outReorder.first)) { dnnl::memory memSrc(outReorder.second.getSrcDesc(), strm.get_engine()); outputMem[outReorder.first] = primArgs[outReorder.first]; primArgs[outReorder.first] = memSrc; } else { - OPENVINO_THROW("DnnlExecutor has reorder for output ", outReorder.first, ", but doesn't have destination memory"); + OPENVINO_THROW("DnnlExecutor has reorder for output ", + outReorder.first, + ", but doesn't have destination memory"); } } execPrim.execute(strm, primArgs); - for (auto &outReorder : outputReorders) { + for (auto& outReorder : outputReorders) { outReorder.second.exec(primArgs[outReorder.first], outputMem[outReorder.first], strm); } } @@ -79,4 +83,4 @@ impl_desc_type DnnlExecutor::getImplementationType() const { } } // namespace intel_cpu -} // namespace ov +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.h b/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.h index 3cc6749857816c..32739a38d37028 100644 --- a/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.h +++ b/src/plugins/intel_cpu/src/nodes/common/dnnl_executor.h @@ -6,74 +6,79 @@ #include #include + #include "memory_desc/dnnl_memory_desc.h" namespace ov { namespace intel_cpu { class DnnlExecutor { - protected: - class IntermReorder { - public: - IntermReorder(const dnnl::memory::desc& descSrc, const dnnl::memory::desc& descDst, const dnnl::engine& engine); - void exec(dnnl::memory& memSrc, dnnl::memory& memDst, dnnl::stream strm); - const dnnl::memory::desc& getSrcDesc() const { return m_descSrc; } - const dnnl::memory::desc& getDstDesc() const { return m_descDst; } - - private: - dnnl::reorder m_reorder; - dnnl::memory::desc m_descSrc; - dnnl::memory::desc m_descDst; - }; - +protected: + class IntermReorder { public: - explicit DnnlExecutor(const dnnl::primitive_desc& pd); - void exec(const std::unordered_map& primArgs, dnnl::stream strm); - bool needReordering() const; - virtual ~DnnlExecutor() = default; - dnnl::primitive getExecPrim() const; - const_dnnl_primitive_desc_t getPrimitiveDesc() const; - impl_desc_type getImplementationType() const; - - DnnlMemoryDescPtr getSrcDesc() const { - return src_md; + IntermReorder(const dnnl::memory::desc& descSrc, const dnnl::memory::desc& descDst, const dnnl::engine& engine); + void exec(dnnl::memory& memSrc, dnnl::memory& memDst, dnnl::stream strm); + const dnnl::memory::desc& getSrcDesc() const { + return m_descSrc; } - DnnlMemoryDescPtr getWeightDesc() const { - return wghts_md; - } - DnnlMemoryDescPtr getDstDesc() const { - return dst_md; - } - DnnlMemoryDescPtr getScratchPadDesc() const { - return scrch_md; + const dnnl::memory::desc& getDstDesc() const { + return m_descDst; } - const dnnl::memory::desc& getDnnlSrcDesc() const { - return src_md->getDnnlDesc(); - } - const dnnl::memory::desc& getDnnlWeightDesc() const { - return wghts_md->getDnnlDesc(); - } - const dnnl::memory::desc& getDnnlDstDesc() const { - return dst_md->getDnnlDesc(); - } - const dnnl::memory::desc& getDnnlScratchPadDesc() const { - return scrch_md->getDnnlDesc(); - } + private: + dnnl::reorder m_reorder; + dnnl::memory::desc m_descSrc; + dnnl::memory::desc m_descDst; + }; + +public: + explicit DnnlExecutor(const dnnl::primitive_desc& pd); + void exec(const std::unordered_map& primArgs, dnnl::stream strm); + bool needReordering() const; + virtual ~DnnlExecutor() = default; + dnnl::primitive getExecPrim() const; + const_dnnl_primitive_desc_t getPrimitiveDesc() const; + impl_desc_type getImplementationType() const; + + DnnlMemoryDescPtr getSrcDesc() const { + return src_md; + } + DnnlMemoryDescPtr getWeightDesc() const { + return wghts_md; + } + DnnlMemoryDescPtr getDstDesc() const { + return dst_md; + } + DnnlMemoryDescPtr getScratchPadDesc() const { + return scrch_md; + } + + const dnnl::memory::desc& getDnnlSrcDesc() const { + return src_md->getDnnlDesc(); + } + const dnnl::memory::desc& getDnnlWeightDesc() const { + return wghts_md->getDnnlDesc(); + } + const dnnl::memory::desc& getDnnlDstDesc() const { + return dst_md->getDnnlDesc(); + } + const dnnl::memory::desc& getDnnlScratchPadDesc() const { + return scrch_md->getDnnlDesc(); + } - protected: - virtual void reorder_exec(std::unordered_map primArgs, dnnl::stream strm); +protected: + virtual void reorder_exec(std::unordered_map primArgs, dnnl::stream strm); - protected: - dnnl::primitive execPrim; - // key is the port number for the primitive that needs memory reordering - std::unordered_map inputReorders; - std::unordered_map outputReorders; - DnnlMemoryDescPtr src_md; - DnnlMemoryDescPtr wghts_md; - DnnlMemoryDescPtr dst_md; - DnnlMemoryDescPtr scrch_md; +protected: + dnnl::primitive execPrim; + // key is the port number for the primitive that needs memory reordering + std::unordered_map inputReorders; + std::unordered_map outputReorders; + DnnlMemoryDescPtr src_md; + DnnlMemoryDescPtr wghts_md; + DnnlMemoryDescPtr dst_md; + DnnlMemoryDescPtr scrch_md; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/fp16_utils.h b/src/plugins/intel_cpu/src/nodes/common/fp16_utils.h index daedcc4bf23ca4..b6622f7ae54d0b 100644 --- a/src/plugins/intel_cpu/src/nodes/common/fp16_utils.h +++ b/src/plugins/intel_cpu/src/nodes/common/fp16_utils.h @@ -13,7 +13,7 @@ typedef short ie_fp16; // F32: exp_bias:127 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM. // F16: exp_bias:15 SEEEEEMM MMMMMMMM #define EXP_MASK_F32 0x7F800000U -#define EXP_MASK_F16 0x7C00U +#define EXP_MASK_F16 0x7C00U // small helper function to represent uint32_t value as float32 inline float asfloat(uint32_t v) { @@ -83,5 +83,5 @@ inline float f16tof32(ie_fp16 x) { return asfloat(u); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/permute_kernel.cpp b/src/plugins/intel_cpu/src/nodes/common/permute_kernel.cpp index 396cebc1ba82e1..60bd675d726e4a 100644 --- a/src/plugins/intel_cpu/src/nodes/common/permute_kernel.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/permute_kernel.cpp @@ -6,15 +6,14 @@ #include -#include "dnnl_types.h" -#include "dnnl_extension_utils.h" -#include "cpu_memcpy.h" -#include "utils/bfloat16.hpp" - -#include "cpu/x64/jit_generator.hpp" #include "common/primitive_hashing_utils.hpp" -#include "nodes/executors/transpose.hpp" +#include "cpu/x64/jit_generator.hpp" +#include "cpu_memcpy.h" +#include "dnnl_extension_utils.h" +#include "dnnl_types.h" #include "nodes/executors/common/ref_transpose.hpp" +#include "nodes/executors/transpose.hpp" +#include "utils/bfloat16.hpp" using namespace dnnl; using namespace dnnl::impl; @@ -33,7 +32,9 @@ template struct jit_uni_permute_kernel_f32 : public jit_uni_permute_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_permute_kernel_f32) - explicit jit_uni_permute_kernel_f32(jit_permute_config_params jcp_) : jit_uni_permute_kernel(jcp_), jit_generator(jit_name()) {} + explicit jit_uni_permute_kernel_f32(jit_permute_config_params jcp_) + : jit_uni_permute_kernel(jcp_), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -51,23 +52,43 @@ struct jit_uni_permute_kernel_f32 : public jit_uni_permute_kernel, public jit_ge this->postamble(); } - void load(const Xbyak::Xmm &xmm, const Xbyak::Address &addr) { + void load(const Xbyak::Xmm& xmm, const Xbyak::Address& addr) { switch (jcp.data_size) { - case 16: uni_vmovups(xmm, addr); break; - case 8: uni_vmovsd(xmm, addr); break; - case 4: uni_vmovss(xmm, addr); break; - case 2: uni_vpinsrw(xmm, xmm, addr, 0x0); break; - case 1: uni_vpinsrb(xmm, xmm, addr, 0x0); break; + case 16: + uni_vmovups(xmm, addr); + break; + case 8: + uni_vmovsd(xmm, addr); + break; + case 4: + uni_vmovss(xmm, addr); + break; + case 2: + uni_vpinsrw(xmm, xmm, addr, 0x0); + break; + case 1: + uni_vpinsrb(xmm, xmm, addr, 0x0); + break; } } - void store(const Xbyak::Address &addr, const Xbyak::Xmm &xmm) { + void store(const Xbyak::Address& addr, const Xbyak::Xmm& xmm) { switch (jcp.data_size) { - case 16: uni_vmovups(addr, xmm); break; - case 8: uni_vmovsd(addr, xmm); break; - case 4: uni_vmovss(addr, xmm); break; - case 2: uni_vpextrw(addr, xmm, 0x0); break; - case 1: uni_vpextrb(addr, xmm, 0x0); break; + case 16: + uni_vmovups(addr, xmm); + break; + case 8: + uni_vmovsd(addr, xmm); + break; + case 4: + uni_vmovss(addr, xmm); + break; + case 2: + uni_vpextrw(addr, xmm, 0x0); + break; + case 1: + uni_vpextrb(addr, xmm, 0x0); + break; } } @@ -99,7 +120,8 @@ struct jit_uni_permute_kernel_f32 : public jit_uni_permute_kernel, public jit_ge } } - L(tail_loop_label); { + L(tail_loop_label); + { cmp(reg_work_amount, 0); je(exit_label, T_NEAR); @@ -129,7 +151,8 @@ struct jit_uni_permute_kernel_f32 : public jit_uni_permute_kernel, public jit_ge } private: - using Vmm = typename conditional3::type; + using Vmm = + typename conditional3::type; uint32_t vlen = cpu_isa_traits::vlen; Xbyak::Reg64 reg_src = r8; @@ -144,7 +167,7 @@ struct jit_uni_permute_kernel_f32 : public jit_uni_permute_kernel, public jit_ge Xbyak::Xmm xmm = Xbyak::Xmm(1); }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 PermuteKernel::PermuteKernel(const PermuteParams& params) : params(params) { jcp = TransposeExecutor::prepareParams(params); @@ -156,7 +179,7 @@ PermuteKernel::PermuteKernel(const PermuteParams& params) : params(params) { } else if (mayiuse(cpu::x64::sse41)) { permute_kernel.reset(new jit_uni_permute_kernel_f32(jcp)); } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 if (permute_kernel) permute_kernel->create_ker(); @@ -178,7 +201,7 @@ void PermuteKernel::execute(const uint8_t* src_data, uint8_t* dst_data) { return; } - RefTransposeExecutor::referenceExecute(src_data, dst_data, jcp, dst_dims[0]); + RefTransposeExecutor::referenceExecute(src_data, dst_data, jcp, dst_dims[0]); } void PermuteKernel::optimizedExecute(const uint8_t* src_data, uint8_t* dst_data, const int mb) { @@ -190,42 +213,42 @@ void PermuteKernel::optimizedExecute(const uint8_t* src_data, uint8_t* dst_data, dst_dims[0] = mb; switch (jcp.n) { - case 1: - parallel_for(dst_dims[0], [&](int i0) { - auto arg = jit_args_permute(); - - size_t dst_off = i0 * dst_strides[0]; - size_t src_off = i0 * src_strides[0]; - arg.src = &src_data[src_off * jcp.data_size]; - arg.dst = &dst_data[dst_off * jcp.data_size]; - - (*permute_kernel)(&arg); - }); - break; - case 2: - parallel_for2d(dst_dims[0], dst_dims[1], [&](int i0, int i1) { - auto arg = jit_args_permute(); - - size_t dst_off = i0 * dst_strides[0] + i1 * dst_strides[1]; - size_t src_off = i0 * src_strides[0] + i1 * src_strides[1]; - arg.src = &src_data[src_off * jcp.data_size]; - arg.dst = &dst_data[dst_off * jcp.data_size]; - - (*permute_kernel)(&arg); - }); - break; - case 3: - parallel_for3d(dst_dims[0], dst_dims[1], dst_dims[2], [&](int i0, int i1, int i2) { - auto arg = jit_args_permute(); - - size_t dst_off = i0 * dst_strides[0] + i1 * dst_strides[1] + i2 * dst_strides[2]; - size_t src_off = i0 * src_strides[0] + i1 * src_strides[1] + i2 * src_strides[2]; - arg.src = &src_data[src_off * jcp.data_size]; - arg.dst = &dst_data[dst_off * jcp.data_size]; - - (*permute_kernel)(&arg); - }); - break; + case 1: + parallel_for(dst_dims[0], [&](int i0) { + auto arg = jit_args_permute(); + + size_t dst_off = i0 * dst_strides[0]; + size_t src_off = i0 * src_strides[0]; + arg.src = &src_data[src_off * jcp.data_size]; + arg.dst = &dst_data[dst_off * jcp.data_size]; + + (*permute_kernel)(&arg); + }); + break; + case 2: + parallel_for2d(dst_dims[0], dst_dims[1], [&](int i0, int i1) { + auto arg = jit_args_permute(); + + size_t dst_off = i0 * dst_strides[0] + i1 * dst_strides[1]; + size_t src_off = i0 * src_strides[0] + i1 * src_strides[1]; + arg.src = &src_data[src_off * jcp.data_size]; + arg.dst = &dst_data[dst_off * jcp.data_size]; + + (*permute_kernel)(&arg); + }); + break; + case 3: + parallel_for3d(dst_dims[0], dst_dims[1], dst_dims[2], [&](int i0, int i1, int i2) { + auto arg = jit_args_permute(); + + size_t dst_off = i0 * dst_strides[0] + i1 * dst_strides[1] + i2 * dst_strides[2]; + size_t src_off = i0 * src_strides[0] + i1 * src_strides[1] + i2 * src_strides[2]; + arg.src = &src_data[src_off * jcp.data_size]; + arg.dst = &dst_data[dst_off * jcp.data_size]; + + (*permute_kernel)(&arg); + }); + break; } return; } @@ -245,12 +268,10 @@ size_t PermuteParams::hash() const { } bool PermuteParams::operator==(const PermuteParams& rhs) const { - return (src_block_dims == rhs.src_block_dims) && - (dst_block_dims == rhs.dst_block_dims) && - (src_block_order == rhs.src_block_order) && - (dst_block_order == rhs.dst_block_order) && (order == rhs.order) && - (data_size == rhs.data_size); + return (src_block_dims == rhs.src_block_dims) && (dst_block_dims == rhs.dst_block_dims) && + (src_block_order == rhs.src_block_order) && (dst_block_order == rhs.dst_block_order) && + (order == rhs.order) && (data_size == rhs.data_size); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/permute_kernel.h b/src/plugins/intel_cpu/src/nodes/common/permute_kernel.h index ac665efb4f0bb6..ba7a89d746d945 100644 --- a/src/plugins/intel_cpu/src/nodes/common/permute_kernel.h +++ b/src/plugins/intel_cpu/src/nodes/common/permute_kernel.h @@ -38,9 +38,9 @@ struct jit_args_permute { }; struct jit_uni_permute_kernel { - void (*ker_)(const jit_args_permute *); + void (*ker_)(const jit_args_permute*); - void operator()(const jit_args_permute *args) { + void operator()(const jit_args_permute* args) { assert(ker_); ker_(args); } @@ -71,5 +71,5 @@ class PermuteKernel { PermuteParams params; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/reorder_prim.cpp b/src/plugins/intel_cpu/src/nodes/common/reorder_prim.cpp index 93e145b25b9e95..dd07a721260aac 100644 --- a/src/plugins/intel_cpu/src/nodes/common/reorder_prim.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/reorder_prim.cpp @@ -4,15 +4,14 @@ #include "reorder_prim.h" -#include "dnnl_extension_utils.h" -#include "dnnl_types.h" - #include -#include "common/primitive_hashing_utils.hpp" -#include "cpu/x64/cpu_isa_traits.hpp" #include #include +#include "common/primitive_hashing_utils.hpp" +#include "cpu/x64/cpu_isa_traits.hpp" +#include "dnnl_extension_utils.h" +#include "dnnl_types.h" #include "utils/general_utils.h" namespace ov { diff --git a/src/plugins/intel_cpu/src/nodes/common/softmax.cpp b/src/plugins/intel_cpu/src/nodes/common/softmax.cpp index 66a6ca9c1b6f53..0fcc87f8978752 100644 --- a/src/plugins/intel_cpu/src/nodes/common/softmax.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/softmax.cpp @@ -4,17 +4,17 @@ #include "softmax.h" -#include "openvino/core/parallel.hpp" -#include "cpu/x64/jit_generator.hpp" -#include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" -#include "onednn/dnnl.h" -#include "utils/bfloat16.hpp" -#include "emitters/plugin/x64/jit_bf16_emitters.hpp" - #include #include #include +#include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" +#include "cpu/x64/jit_generator.hpp" +#include "emitters/plugin/x64/jit_bf16_emitters.hpp" +#include "onednn/dnnl.h" +#include "openvino/core/parallel.hpp" +#include "utils/bfloat16.hpp" + using namespace dnnl; using namespace dnnl::impl::cpu; using namespace dnnl::impl::cpu::x64; @@ -38,11 +38,13 @@ struct jit_softmax_config_params { ov::element::Type dst_dt; }; - struct jit_uni_softmax_kernel { - void (*ker_)(const jit_args_softmax *); + void (*ker_)(const jit_args_softmax*); - void operator()(const jit_args_softmax *args) { assert(ker_); ker_(args); } + void operator()(const jit_args_softmax* args) { + assert(ker_); + ker_(args); + } jit_uni_softmax_kernel() : ker_(nullptr) {} virtual ~jit_uni_softmax_kernel() {} @@ -54,7 +56,10 @@ template struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_softmax_kernel_f32) - jit_uni_softmax_kernel_f32(jit_softmax_config_params jcp) : jit_uni_softmax_kernel(), jit_generator(jit_name()), jcp_(jcp) {} + jit_uni_softmax_kernel_f32(jit_softmax_config_params jcp) + : jit_uni_softmax_kernel(), + jit_generator(jit_name()), + jcp_(jcp) {} void create_ker() override { jit_generator::create_kernel(); @@ -62,14 +67,14 @@ struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_ge } void generate() override { - exp_injector.reset(new jit_uni_eltwise_injector_f32(this, dnnl::impl::alg_kind::eltwise_exp, 0.f, 0.f, 1.0f)); + exp_injector.reset( + new jit_uni_eltwise_injector_f32(this, dnnl::impl::alg_kind::eltwise_exp, 0.f, 0.f, 1.0f)); if (mayiuse(avx512_core)) uni_vcvtneps2bf16.reset(new jit_uni_vcvtneps2bf16(this, isa)); this->preamble(); - mov(reg_src, ptr[reg_params + GET_OFF(src)]); mov(reg_dst, ptr[reg_params + GET_OFF(dst)]); mov(reg_src_stride, ptr[reg_params + GET_OFF(src_stride)]); @@ -86,7 +91,8 @@ struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_ge mov(aux_reg_work_amount, reg_work_amount); mov(aux_reg_src, reg_src); load_vector(vmm_max, ptr[aux_reg_src], jcp_.src_dt); - L(max_loop_label); { + L(max_loop_label); + { cmp(aux_reg_work_amount, 0); jle(max_loop_end_label, T_NEAR); @@ -120,7 +126,8 @@ struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_ge mov(aux_reg_src, reg_src); mov(aux_reg_dst, reg_dst); uni_vpxor(vmm_exp_sum, vmm_exp_sum, vmm_exp_sum); - L(exp_loop_label); { + L(exp_loop_label); + { cmp(aux_reg_work_amount, 0); jle(exp_loop_end_label, T_NEAR); @@ -143,7 +150,8 @@ struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_ge mov(aux_reg_work_amount, reg_work_amount); mov(aux_reg_dst, reg_dst); - L(div_loop_label); { + L(div_loop_label); + { cmp(aux_reg_work_amount, 0); jle(div_loop_end_label, T_NEAR); @@ -196,38 +204,40 @@ struct jit_uni_softmax_kernel_f32 : public jit_uni_softmax_kernel, public jit_ge jit_softmax_config_params jcp_; - inline void load_vector(Vmm vmm_src, const Xbyak::Address &op, ov::element::Type src_dt) { + inline void load_vector(Vmm vmm_src, const Xbyak::Address& op, ov::element::Type src_dt) { switch (src_dt) { - case ov::element::f32: - uni_vmovups(vmm_src, op); - break; - case ov::element::bf16: - vpmovzxwd(vmm_src, op); - uni_vpslld(vmm_src, vmm_src, 16); - break; - default: - assert(!"unknown src_dt"); + case ov::element::f32: + uni_vmovups(vmm_src, op); + break; + case ov::element::bf16: + vpmovzxwd(vmm_src, op); + uni_vpslld(vmm_src, vmm_src, 16); + break; + default: + assert(!"unknown src_dt"); } } - inline void store_vector(const Xbyak::Address &op, Vmm vmm_dst, ov::element::Type dst_dt) { + inline void store_vector(const Xbyak::Address& op, Vmm vmm_dst, ov::element::Type dst_dt) { Xbyak::Ymm ymm_dst = Xbyak::Ymm(vmm_dst.getIdx()); switch (dst_dt) { - case ov::element::f32: - uni_vmovups(op, vmm_dst); - break; - case ov::element::bf16: - uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, {static_cast(ymm_dst.getIdx())}); - vmovdqu16(op, ymm_dst); - break; - default: - assert(!"unknown dst_dt"); + case ov::element::f32: + uni_vmovups(op, vmm_dst); + break; + case ov::element::bf16: + uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, + {static_cast(ymm_dst.getIdx())}); + vmovdqu16(op, ymm_dst); + break; + default: + assert(!"unknown dst_dt"); } } }; #endif SoftmaxGeneric::SoftmaxGeneric(ov::element::Type inpPrc, ov::element::Type outPrc) - : input_prec(inpPrc), output_prec(outPrc) { + : input_prec(inpPrc), + output_prec(outPrc) { if (ov::element::bf16 == output_prec) { if (!mayiuse(avx512_core)) { OPENVINO_THROW("SoftmaxGeneric doesn't support BF16 precision on this target."); @@ -255,27 +265,27 @@ SoftmaxGeneric::SoftmaxGeneric(ov::element::Type inpPrc, ov::element::Type outPr #endif } -template -void SoftmaxGeneric::calculate(const in_data_t *src_data, out_data_t *dst_data, int B, int C, int H, int W) { +template +void SoftmaxGeneric::calculate(const in_data_t* src_data, out_data_t* dst_data, int B, int C, int H, int W) { for (int b = 0; b < B; b++) { int tail_start = 0; if (softmax_kernel) { - int blocks_num = H*W / block_size; + int blocks_num = H * W / block_size; parallel_for(blocks_num, [&](int ib) { auto arg = jit_args_softmax(); arg.src = src_data + b * C * H * W + ib * block_size; arg.dst = dst_data + b * C * H * W + ib * block_size; - arg.src_stride = static_cast((size_t)(H) * W * sizeof(in_data_t)); - arg.dst_stride = static_cast((size_t)(H) * W * sizeof(out_data_t)); + arg.src_stride = static_cast((size_t)(H)*W * sizeof(in_data_t)); + arg.dst_stride = static_cast((size_t)(H)*W * sizeof(out_data_t)); arg.work_amount = static_cast(C); (*softmax_kernel)(&arg); }); - tail_start = (H*W / block_size) * block_size; + tail_start = (H * W / block_size) * block_size; } parallel_for(H * W - tail_start, [&](int i) { @@ -283,7 +293,8 @@ void SoftmaxGeneric::calculate(const in_data_t *src_data, out_data_t *dst_data, float max = src_data[b * C * H * W + offset]; for (int c = 0; c < C; c++) { float val = src_data[b * C * H * W + c * H * W + offset]; - if (val > max) max = val; + if (val > max) + max = val; } float expSum = 0; @@ -299,7 +310,7 @@ void SoftmaxGeneric::calculate(const in_data_t *src_data, out_data_t *dst_data, } } -void SoftmaxGeneric::execute(const uint8_t *src_data, uint8_t *dst_data, int B, int C, int H, int W) { +void SoftmaxGeneric::execute(const uint8_t* src_data, uint8_t* dst_data, int B, int C, int H, int W) { if (ov::element::f32 == input_prec) { auto float_src_data = reinterpret_cast(src_data); if (ov::element::f32 == output_prec) { @@ -327,5 +338,5 @@ void SoftmaxGeneric::execute(const uint8_t *src_data, uint8_t *dst_data, int B, } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/softmax.h b/src/plugins/intel_cpu/src/nodes/common/softmax.h index 2e3d5caa4becee..bb450c2ac5a303 100644 --- a/src/plugins/intel_cpu/src/nodes/common/softmax.h +++ b/src/plugins/intel_cpu/src/nodes/common/softmax.h @@ -4,27 +4,28 @@ #pragma once -#include #include -#include "openvino/core/type/element_type.hpp" +#include + #include "defs.h" #include "openvino/core/parallel.hpp" +#include "openvino/core/type/element_type.hpp" namespace ov { namespace intel_cpu { struct jit_uni_softmax_kernel; -static inline -void softmax_many_batches(const float *src_data, float *dst_data, int B, int C, int H, int W) { +static inline void softmax_many_batches(const float* src_data, float* dst_data, int B, int C, int H, int W) { ov::parallel_for(B * H * W, [&](size_t i) { - const float *psrc = src_data + (i / (H * W)) * C * H * W - (i / (H * W)) * H * W; - float *pdst = dst_data + (i / (H * W)) * C * H * W - (i / (H * W)) * H * W; + const float* psrc = src_data + (i / (H * W)) * C * H * W - (i / (H * W)) * H * W; + float* pdst = dst_data + (i / (H * W)) * C * H * W - (i / (H * W)) * H * W; float max = psrc[i]; for (int c = 0; c < C; c++) { float val = psrc[c * H * W + i]; - if (val > max) max = val; + if (val > max) + max = val; } float expSum = 0; @@ -43,9 +44,10 @@ class SoftmaxGeneric { public: SoftmaxGeneric(ov::element::Type inpPrc, ov::element::Type outPrc); - void execute(const uint8_t *src_data, uint8_t *dst_data, int B, int C, int H, int W); + void execute(const uint8_t* src_data, uint8_t* dst_data, int B, int C, int H, int W); + private: - template + template void calculate(const in_data_t* src_data, out_data_t* dst_data, int B, int C, int H, int W); private: @@ -54,5 +56,5 @@ class SoftmaxGeneric { std::shared_ptr softmax_kernel; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.cpp b/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.cpp index 6c62304ab22da7..f482b0876b3f4c 100644 --- a/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.cpp @@ -4,18 +4,17 @@ #include "tile_broadcast_utils.h" +#include + #include "cpu_convert.h" #include "cpu_memcpy.h" -#include "openvino/core/parallel.hpp" -#include #include "memory_desc/dnnl_blocked_memory_desc.h" - - +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { -VectorDims TileBroadcastCommon::calculateDenseStrides(const VectorDims &dims) { +VectorDims TileBroadcastCommon::calculateDenseStrides(const VectorDims& dims) { VectorDims strides(dims.size(), 1); for (int i = strides.size() - 2; i >= 0; i--) { @@ -25,8 +24,10 @@ VectorDims TileBroadcastCommon::calculateDenseStrides(const VectorDims &dims) { return strides; } -void TileBroadcastCommon::fillOptimizedDimsAndSrcStrides(const VectorDims& srcBlockedDims, const VectorDims& blockedRepeats, - VectorDims& optimizedDims, VectorDims& optimizedSrcStrides) { +void TileBroadcastCommon::fillOptimizedDimsAndSrcStrides(const VectorDims& srcBlockedDims, + const VectorDims& blockedRepeats, + VectorDims& optimizedDims, + VectorDims& optimizedSrcStrides) { optimizedDims.clear(); optimizedSrcStrides.clear(); VectorDims srcBlockedStrides = calculateDenseStrides(srcBlockedDims); @@ -60,10 +61,11 @@ void TileBroadcastCommon::fillOptimizedDimsAndSrcStrides(const VectorDims& srcBl } } -bool TileBroadcastCommon::canBeExecutedInBlockedLayout(VectorDims srcBlockedDims, VectorDims blockedRepeats, - const size_t elemsInBlock) { - if (srcBlockedDims.empty() || blockedRepeats.empty() || elemsInBlock == 0lu || srcBlockedDims[1] == Shape::UNDEFINED_DIM || - (blockedRepeats[1] != 1 && srcBlockedDims[1] % elemsInBlock != 0)) +bool TileBroadcastCommon::canBeExecutedInBlockedLayout(VectorDims srcBlockedDims, + VectorDims blockedRepeats, + const size_t elemsInBlock) { + if (srcBlockedDims.empty() || blockedRepeats.empty() || elemsInBlock == 0lu || + srcBlockedDims[1] == Shape::UNDEFINED_DIM || (blockedRepeats[1] != 1 && srcBlockedDims[1] % elemsInBlock != 0)) return false; srcBlockedDims[1] = div_up(srcBlockedDims[1], elemsInBlock); @@ -90,7 +92,7 @@ bool TileBroadcastCommon::canBeExecutedInNSPCLayout(VectorDims srcBlockedDims, V return optimizedDims.size() <= maxNDims; } -std::vector TileBroadcastCommon::getSupportedConfigs(const Node *node, size_t outSize) { +std::vector TileBroadcastCommon::getSupportedConfigs(const Node* node, size_t outSize) { std::vector supportedPrimitiveDescriptors; auto precision = node->getOriginalInputPrecisionAtPort(0); auto dataType = DnnlExtensionUtils::ElementTypeToDataType(precision); @@ -115,26 +117,31 @@ std::vector TileBroadcastCommon::getSupportedConfigs(const Node *node, config.inConfs[0].constant(constMap[0]); config.inConfs[1].inPlace(-1); config.inConfs[1].constant(constMap[1]); - config.inConfs[1].setMemDesc(std::make_shared(ov::element::i32, node->getInputShapeAtPort(1))); + config.inConfs[1].setMemDesc( + std::make_shared(ov::element::i32, node->getInputShapeAtPort(1))); if (config.inConfs.size() == 3) { config.inConfs[2].inPlace(-1); config.inConfs[2].constant(constMap[2]); - config.inConfs[2].setMemDesc(std::make_shared(ov::element::i32, node->getInputShapeAtPort(2))); + config.inConfs[2].setMemDesc( + std::make_shared(ov::element::i32, node->getInputShapeAtPort(2))); } config.outConfs.resize(outSize); auto pushDesc = [&](dnnl::memory::format_tag inFormat, dnnl::memory::format_tag outFormat) { - config.inConfs[0].setMemDesc(std::make_shared(node->getInputShapeAtPort(0), dataType, inFormat)); + config.inConfs[0].setMemDesc( + std::make_shared(node->getInputShapeAtPort(0), dataType, inFormat)); for (size_t i = 0; i < config.outConfs.size(); i++) { config.outConfs[i].inPlace(-1); config.outConfs[i].constant(false); - config.outConfs[i].setMemDesc(std::make_shared(node->getOutputShapeAtPort(0), dataType, outFormat)); + config.outConfs[i].setMemDesc( + std::make_shared(node->getOutputShapeAtPort(0), dataType, outFormat)); } supportedPrimitiveDescriptors.push_back({config, impl_desc_type::ref}); }; - if (!repeats.empty() && inDataShape.getRank() == outDataShapeRank && (outDataShapeRank == 4 || outDataShapeRank == 5)) { + if (!repeats.empty() && inDataShape.getRank() == outDataShapeRank && + (outDataShapeRank == 4 || outDataShapeRank == 5)) { if (canBeExecutedInBlockedLayout(srcDims, repeats, 16)) { if (outDataShapeRank == 4) { pushDesc(dnnl::memory::format_tag::nChw16c, dnnl::memory::format_tag::nChw16c); @@ -165,7 +172,8 @@ std::vector TileBroadcastCommon::getSupportedConfigs(const Node *node, for (size_t i = 0; i < config.outConfs.size(); i++) { config.outConfs[i].inPlace(-1); config.outConfs[i].constant(false); - config.outConfs[i].setMemDesc(std::make_shared(precision, node->getOutputShapeAtPort(i))); + config.outConfs[i].setMemDesc( + std::make_shared(precision, node->getOutputShapeAtPort(i))); } supportedPrimitiveDescriptors.push_back({config, impl_desc_type::ref}); } else { @@ -175,7 +183,9 @@ std::vector TileBroadcastCommon::getSupportedConfigs(const Node *node, return supportedPrimitiveDescriptors; } -bool TileBroadcastCommon::prepareOptimizedParams(const Node *node, VectorDims& srcBlockedDims, VectorDims& dstBlockedDims) { +bool TileBroadcastCommon::prepareOptimizedParams(const Node* node, + VectorDims& srcBlockedDims, + VectorDims& dstBlockedDims) { while (srcBlockedDims.size() < dstBlockedDims.size()) { srcBlockedDims.insert(srcBlockedDims.begin(), 1); } @@ -186,7 +196,8 @@ bool TileBroadcastCommon::prepareOptimizedParams(const Node *node, VectorDims& s blockedRepeats.push_back(1); } // for NSPC layouts - if (node->getBaseMemDescAtInputPort(0)->hasLayoutType(LayoutType::nspc) && one_of(node->getBaseMemDescAtInputPort(0)->getShape().getRank(), 4u, 5u)) { + if (node->getBaseMemDescAtInputPort(0)->hasLayoutType(LayoutType::nspc) && + one_of(node->getBaseMemDescAtInputPort(0)->getShape().getRank(), 4u, 5u)) { blockedRepeats.push_back(blockedRepeats[1]); blockedRepeats.erase(blockedRepeats.begin() + 1); } @@ -205,7 +216,8 @@ bool TileBroadcastCommon::prepareOptimizedParams(const Node *node, VectorDims& s VectorDims optimizedDstStrides = calculateDenseStrides(optimizedDims); - size_t dataSize = node->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->getPrecision().size(); + size_t dataSize = + node->getSelectedPrimitiveDescriptor()->getConfig().inConfs[0].getMemDesc()->getPrecision().size(); for (size_t i = 0; i < optimizedDims.size(); i++) { optimizedSrcStrides[i] *= dataSize; optimizedDstStrides[i] *= dataSize; @@ -221,9 +233,9 @@ bool TileBroadcastCommon::prepareOptimizedParams(const Node *node, VectorDims& s // Broadcast 1 element to N continuous elements based on cpu_memcpy // Step 1: Get the binary format of the number N -// Step 2: Use cpu_memcpy to form fragments containing pow(2, k) (ie. 2, 4, 8, ...) elements, based on the given 1 element -// Step 3: Form N continuous elements, who's a combination of those fragments, demonstrated by its binary format -void TileBroadcastCommon::broadcastScalar(const char *srcData, char *dstData, size_t elt_cnt, size_t data_size) { +// Step 2: Use cpu_memcpy to form fragments containing pow(2, k) (ie. 2, 4, 8, ...) elements, based on the given 1 +// element Step 3: Form N continuous elements, who's a combination of those fragments, demonstrated by its binary format +void TileBroadcastCommon::broadcastScalar(const char* srcData, char* dstData, size_t elt_cnt, size_t data_size) { std::vector binary_digits; binary_digits.clear(); @@ -275,32 +287,44 @@ void TileBroadcastCommon::optimizedExecute(const MemoryPtr& srcMemory, const Mem broadcastScalar(srcData, dstData, elt_cnt, data_size); } } else { - parallel_for5d(optimizedParams.dims[0], optimizedParams.dims[1], optimizedParams.dims[2], optimizedParams.dims[3], optimizedParams.dims[4], - [&](int i0, int i1, int i2, int i3, int i4) { - auto srcData2 = srcData + (i0 * optimizedParams.srcStrides[0] + i1 * optimizedParams.srcStrides[1] + - i2 * optimizedParams.srcStrides[2] + i3 * optimizedParams.srcStrides[3] + - i4 * optimizedParams.srcStrides[4]); - auto dstData2 = dstData + (i0 * optimizedParams.dstStrides[0] + i1 * optimizedParams.dstStrides[1] + - i2 * optimizedParams.dstStrides[2] + i3 * optimizedParams.dstStrides[3] + - i4 * optimizedParams.dstStrides[4]); - for (size_t i = 0; i < optimizedParams.dims[5]; i++) { - cpu_memcpy(dstData2 + i * optimizedParams.dstStrides[5], srcData2, optimizedParams.dstStrides[5]); - } - }); + parallel_for5d( + optimizedParams.dims[0], + optimizedParams.dims[1], + optimizedParams.dims[2], + optimizedParams.dims[3], + optimizedParams.dims[4], + [&](int i0, int i1, int i2, int i3, int i4) { + auto srcData2 = srcData + (i0 * optimizedParams.srcStrides[0] + i1 * optimizedParams.srcStrides[1] + + i2 * optimizedParams.srcStrides[2] + i3 * optimizedParams.srcStrides[3] + + i4 * optimizedParams.srcStrides[4]); + auto dstData2 = dstData + (i0 * optimizedParams.dstStrides[0] + i1 * optimizedParams.dstStrides[1] + + i2 * optimizedParams.dstStrides[2] + i3 * optimizedParams.dstStrides[3] + + i4 * optimizedParams.dstStrides[4]); + for (size_t i = 0; i < optimizedParams.dims[5]; i++) { + cpu_memcpy(dstData2 + i * optimizedParams.dstStrides[5], + srcData2, + optimizedParams.dstStrides[5]); + } + }); } } else { - parallel_for5d(optimizedParams.dims[0], optimizedParams.dims[1], optimizedParams.dims[2], optimizedParams.dims[3], optimizedParams.dims[4], - [&](int i0, int i1, int i2, int i3, int i4) { - auto srcData2 = srcData + (i0 * optimizedParams.srcStrides[0] + i1 * optimizedParams.srcStrides[1] + - i2 * optimizedParams.srcStrides[2] + i3 * optimizedParams.srcStrides[3] + - i4 * optimizedParams.srcStrides[4]); - auto dstData2 = dstData + (i0 * optimizedParams.dstStrides[0] + i1 * optimizedParams.dstStrides[1] + + parallel_for5d( + optimizedParams.dims[0], + optimizedParams.dims[1], + optimizedParams.dims[2], + optimizedParams.dims[3], + optimizedParams.dims[4], + [&](int i0, int i1, int i2, int i3, int i4) { + auto srcData2 = srcData + (i0 * optimizedParams.srcStrides[0] + i1 * optimizedParams.srcStrides[1] + + i2 * optimizedParams.srcStrides[2] + i3 * optimizedParams.srcStrides[3] + + i4 * optimizedParams.srcStrides[4]); + auto dstData2 = dstData + (i0 * optimizedParams.dstStrides[0] + i1 * optimizedParams.dstStrides[1] + i2 * optimizedParams.dstStrides[2] + i3 * optimizedParams.dstStrides[3] + i4 * optimizedParams.dstStrides[4]); - cpu_memcpy(dstData2, srcData2, optimizedParams.copySize); - }); + cpu_memcpy(dstData2, srcData2, optimizedParams.copySize); + }); } } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.h b/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.h index 7ae0eacbccd373..6638eba7f88a39 100644 --- a/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.h +++ b/src/plugins/intel_cpu/src/nodes/common/tile_broadcast_utils.h @@ -9,27 +9,28 @@ #include #include - namespace ov { namespace intel_cpu { class TileBroadcastCommon { protected: - static VectorDims calculateDenseStrides(const VectorDims &dims); - std::vector getSupportedConfigs(const Node *node, size_t outSize); - bool prepareOptimizedParams(const Node *node, VectorDims& srcBlockedDims, VectorDims& dstBlockedDims); + static VectorDims calculateDenseStrides(const VectorDims& dims); + std::vector getSupportedConfigs(const Node* node, size_t outSize); + bool prepareOptimizedParams(const Node* node, VectorDims& srcBlockedDims, VectorDims& dstBlockedDims); void optimizedExecute(const MemoryPtr& srcMemory, const MemoryPtr& dstMemory); VectorDims repeats; bool optimizedCase = false; - bool constMap[3] = { false }; + bool constMap[3] = {false}; mutable bool needPrepareParamsVar = false; private: - static void fillOptimizedDimsAndSrcStrides(const VectorDims &srcBlockedDims, const VectorDims &blockedRepeats, - VectorDims &optimizedDims, VectorDims &optimizedSrcStrides); - static void broadcastScalar(const char *srcData, char *dstData, size_t elt_cnt, size_t data_size); + static void fillOptimizedDimsAndSrcStrides(const VectorDims& srcBlockedDims, + const VectorDims& blockedRepeats, + VectorDims& optimizedDims, + VectorDims& optimizedSrcStrides); + static void broadcastScalar(const char* srcData, char* dstData, size_t elt_cnt, size_t data_size); static bool canBeExecutedInBlockedLayout(VectorDims srcDims, VectorDims repeats, const size_t elemsInBlock); static bool canBeExecutedInNSPCLayout(VectorDims srcDims, VectorDims repeats); @@ -42,5 +43,5 @@ class TileBroadcastCommon { } optimizedParams; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/common/uni_simd.h b/src/plugins/intel_cpu/src/nodes/common/uni_simd.h index 7f2cdc7bed4821..dbcec60baa7d4c 100644 --- a/src/plugins/intel_cpu/src/nodes/common/uni_simd.h +++ b/src/plugins/intel_cpu/src/nodes/common/uni_simd.h @@ -5,7 +5,7 @@ #pragma once #if defined(HAVE_SSE) || defined(HAVE_AVX2) || defined(HAVE_AVX512F) -#include +# include #endif namespace ov { @@ -14,348 +14,350 @@ namespace Cpu { #if defined(HAVE_AVX512F) namespace AVX512F { - static inline __m512 _mm_uni_any_ps() { - return __m512{}; - } - - static inline __m512i _mm_uni_any_epi32() { - return __m512i{}; - } - - static inline __m512 _mm_uni_loadu_ps(const float* psrc) { - return _mm512_mask_loadu_ps(_mm_uni_any_ps(), (__mmask16)-1, psrc); - } - - static inline void _mm_uni_storeu_ps(float* pdst, const __m512& vec) { - _mm512_storeu_ps(pdst, vec); - } - - static inline void _mm_uni_storeu_si(void* pdst, const __m512i vec) { - _mm512_storeu_si512(pdst, vec); - } - - static inline __m512 _mm_uni_setzero_ps() { - return _mm512_setzero_ps(); - } - - static inline __m512 _mm_uni_set1_ps(float value) { - return _mm512_set1_ps(value); - } - - static inline __m512 _mm_uni_add_ps(__m512 vec0, __m512 vec1) { - return _mm512_add_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_sub_ps(__m512 vec0, __m512 vec1) { - return _mm512_sub_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_mul_ps(__m512 vec0, __m512 vec1) { - return _mm512_mul_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_div_ps(__m512 vec0, __m512 vec1) { - return _mm512_div_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_sqrt_ps(__m512 vec) { - return _mm512_sqrt_ps(vec); - } - - static inline __m512 _mm_uni_and_ps(__m512 vec0, __m512 vec1) { - return _mm512_castsi512_ps(_mm512_and_epi32(_mm512_castps_si512(vec0), _mm512_castps_si512(vec1))); - } - - static inline __m512 _mm_uni_or_ps(__m512 vec0, __m512 vec1) { - return _mm512_castsi512_ps(_mm512_or_epi32(_mm512_castps_si512(vec0), _mm512_castps_si512(vec1))); - } - - static inline __m512i _mm_uni_set1_epi32(int value) { - return _mm512_mask_set1_epi32(_mm_uni_any_epi32(), (__mmask16)-1, value); - } - - static inline __m512 _mm_uni_blendv_ps(__m512 vec0, __m512 vec1, __m512 vmask) { - return _mm512_mask_blend_ps(_mm512_cmpneq_epi32_mask(_mm512_castps_si512(vmask), _mm_uni_set1_epi32(0)), vec0, vec1); - } - - static inline __m512 _mm_uni_blendv_ps(__m512 vec0, __m512 vec1, __mmask16 vmask) { - return _mm512_mask_blend_ps(vmask, vec0, vec1); - } - - static inline __m512 _mm_uni_min_ps(__m512 vec0, __m512 vec1) { - return _mm512_min_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_max_ps(__m512 vec0, __m512 vec1) { - return _mm512_max_ps(vec0, vec1); - } - - static inline __m512 _mm_uni_floor_ps(__m512 vec) { - return _mm512_floor_ps(vec); - } - - static inline __m512i _mm_uni_cvtps_epi32(__m512 vec) { - return _mm512_cvtps_epi32(vec); - } - - static inline __m512i _mm_uni_add_epi32(__m512i vec0, __m512i vec1) { - return _mm512_add_epi32(vec0, vec1); - } - - static inline __m512i _mm_uni_slli_epi32(__m512i vec, int value) { - return _mm512_sll_epi32(vec, _mm_set1_epi64x(value)); - } - - static inline __m512 _mm_uni_castsi_ps(__m512i vec) { - return _mm512_castsi512_ps(vec); - } - - static inline __m512i _mm_uni_setzero_si() { - return _mm512_setzero_si512(); - } - - static inline __mmask16 _mm_uni_cmpgt_ps(__m512 vec0, __m512 vec1) { - return _mm512_cmp_ps_mask(vec0, vec1, 14); - } - - static inline __mmask16 _mm_uni_cmpgt_i32(__m512i vec0, __m512i vec1) { - return _mm512_cmp_epi32_mask(vec1, vec0, 1); - } - - static inline __m512i _mm_uni_castps_si(__m512 vec) { - return _mm512_castps_si512(vec); - } - - static inline __m512 _mm_uni_cvtepi32_ps(__m512i vec) { - return _mm512_mask_cvtepi32_ps(_mm_uni_any_ps(), (__mmask16)-1, vec); - } +static inline __m512 _mm_uni_any_ps() { + return __m512{}; +} + +static inline __m512i _mm_uni_any_epi32() { + return __m512i{}; +} + +static inline __m512 _mm_uni_loadu_ps(const float* psrc) { + return _mm512_mask_loadu_ps(_mm_uni_any_ps(), (__mmask16)-1, psrc); +} + +static inline void _mm_uni_storeu_ps(float* pdst, const __m512& vec) { + _mm512_storeu_ps(pdst, vec); +} + +static inline void _mm_uni_storeu_si(void* pdst, const __m512i vec) { + _mm512_storeu_si512(pdst, vec); +} + +static inline __m512 _mm_uni_setzero_ps() { + return _mm512_setzero_ps(); +} + +static inline __m512 _mm_uni_set1_ps(float value) { + return _mm512_set1_ps(value); +} + +static inline __m512 _mm_uni_add_ps(__m512 vec0, __m512 vec1) { + return _mm512_add_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_sub_ps(__m512 vec0, __m512 vec1) { + return _mm512_sub_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_mul_ps(__m512 vec0, __m512 vec1) { + return _mm512_mul_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_div_ps(__m512 vec0, __m512 vec1) { + return _mm512_div_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_sqrt_ps(__m512 vec) { + return _mm512_sqrt_ps(vec); +} + +static inline __m512 _mm_uni_and_ps(__m512 vec0, __m512 vec1) { + return _mm512_castsi512_ps(_mm512_and_epi32(_mm512_castps_si512(vec0), _mm512_castps_si512(vec1))); +} + +static inline __m512 _mm_uni_or_ps(__m512 vec0, __m512 vec1) { + return _mm512_castsi512_ps(_mm512_or_epi32(_mm512_castps_si512(vec0), _mm512_castps_si512(vec1))); +} + +static inline __m512i _mm_uni_set1_epi32(int value) { + return _mm512_mask_set1_epi32(_mm_uni_any_epi32(), (__mmask16)-1, value); +} + +static inline __m512 _mm_uni_blendv_ps(__m512 vec0, __m512 vec1, __m512 vmask) { + return _mm512_mask_blend_ps(_mm512_cmpneq_epi32_mask(_mm512_castps_si512(vmask), _mm_uni_set1_epi32(0)), + vec0, + vec1); +} + +static inline __m512 _mm_uni_blendv_ps(__m512 vec0, __m512 vec1, __mmask16 vmask) { + return _mm512_mask_blend_ps(vmask, vec0, vec1); +} + +static inline __m512 _mm_uni_min_ps(__m512 vec0, __m512 vec1) { + return _mm512_min_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_max_ps(__m512 vec0, __m512 vec1) { + return _mm512_max_ps(vec0, vec1); +} + +static inline __m512 _mm_uni_floor_ps(__m512 vec) { + return _mm512_floor_ps(vec); +} + +static inline __m512i _mm_uni_cvtps_epi32(__m512 vec) { + return _mm512_cvtps_epi32(vec); +} + +static inline __m512i _mm_uni_add_epi32(__m512i vec0, __m512i vec1) { + return _mm512_add_epi32(vec0, vec1); +} + +static inline __m512i _mm_uni_slli_epi32(__m512i vec, int value) { + return _mm512_sll_epi32(vec, _mm_set1_epi64x(value)); +} + +static inline __m512 _mm_uni_castsi_ps(__m512i vec) { + return _mm512_castsi512_ps(vec); +} + +static inline __m512i _mm_uni_setzero_si() { + return _mm512_setzero_si512(); +} + +static inline __mmask16 _mm_uni_cmpgt_ps(__m512 vec0, __m512 vec1) { + return _mm512_cmp_ps_mask(vec0, vec1, 14); +} + +static inline __mmask16 _mm_uni_cmpgt_i32(__m512i vec0, __m512i vec1) { + return _mm512_cmp_epi32_mask(vec1, vec0, 1); +} + +static inline __m512i _mm_uni_castps_si(__m512 vec) { + return _mm512_castps_si512(vec); +} + +static inline __m512 _mm_uni_cvtepi32_ps(__m512i vec) { + return _mm512_mask_cvtepi32_ps(_mm_uni_any_ps(), (__mmask16)-1, vec); +} } // namespace AVX512F #elif defined(HAVE_AVX2) namespace AVX2 { - static inline __m256 _mm_uni_loadu_ps(const float* psrc) { - return _mm256_loadu_ps(psrc); - } +static inline __m256 _mm_uni_loadu_ps(const float* psrc) { + return _mm256_loadu_ps(psrc); +} - static inline void _mm_uni_storeu_ps(float* pdst, const __m256 vec) { - _mm256_storeu_ps(pdst, vec); - } +static inline void _mm_uni_storeu_ps(float* pdst, const __m256 vec) { + _mm256_storeu_ps(pdst, vec); +} - static inline void _mm_uni_storeu_si(__m256i* pdst, const __m256i vec) { - _mm256_storeu_si256(pdst, vec); - } +static inline void _mm_uni_storeu_si(__m256i* pdst, const __m256i vec) { + _mm256_storeu_si256(pdst, vec); +} - static inline __m256 _mm_uni_setzero_ps() { - return _mm256_setzero_ps(); - } +static inline __m256 _mm_uni_setzero_ps() { + return _mm256_setzero_ps(); +} - static inline __m256 _mm_uni_set1_ps(float value) { - return _mm256_set1_ps(value); - } +static inline __m256 _mm_uni_set1_ps(float value) { + return _mm256_set1_ps(value); +} - static inline __m256 _mm_uni_add_ps(__m256 vec0, __m256 vec1) { - return _mm256_add_ps(vec0, vec1); - } +static inline __m256 _mm_uni_add_ps(__m256 vec0, __m256 vec1) { + return _mm256_add_ps(vec0, vec1); +} - static inline __m256 _mm_uni_sub_ps(__m256 vec0, __m256 vec1) { - return _mm256_sub_ps(vec0, vec1); - } +static inline __m256 _mm_uni_sub_ps(__m256 vec0, __m256 vec1) { + return _mm256_sub_ps(vec0, vec1); +} - static inline __m256 _mm_uni_mul_ps(__m256 vec0, __m256 vec1) { - return _mm256_mul_ps(vec0, vec1); - } +static inline __m256 _mm_uni_mul_ps(__m256 vec0, __m256 vec1) { + return _mm256_mul_ps(vec0, vec1); +} - static inline __m256 _mm_uni_div_ps(__m256 vec0, __m256 vec1) { - return _mm256_div_ps(vec0, vec1); - } +static inline __m256 _mm_uni_div_ps(__m256 vec0, __m256 vec1) { + return _mm256_div_ps(vec0, vec1); +} - static inline __m256 _mm_uni_sqrt_ps(__m256 vec) { - return _mm256_sqrt_ps(vec); - } +static inline __m256 _mm_uni_sqrt_ps(__m256 vec) { + return _mm256_sqrt_ps(vec); +} - static inline __m256 _mm_uni_and_ps(__m256 vec0, __m256 vec1) { - return _mm256_and_ps(vec0, vec1); - } +static inline __m256 _mm_uni_and_ps(__m256 vec0, __m256 vec1) { + return _mm256_and_ps(vec0, vec1); +} - static inline __m256 _mm_uni_or_ps(__m256 vec0, __m256 vec1) { - return _mm256_or_ps(vec0, vec1); - } +static inline __m256 _mm_uni_or_ps(__m256 vec0, __m256 vec1) { + return _mm256_or_ps(vec0, vec1); +} - static inline __m256 _mm_uni_blendv_ps(__m256 vec0, __m256 vec1, __m256 vmask) { - return _mm256_blendv_ps(vec0, vec1, vmask); - } +static inline __m256 _mm_uni_blendv_ps(__m256 vec0, __m256 vec1, __m256 vmask) { + return _mm256_blendv_ps(vec0, vec1, vmask); +} - static inline __m256 _mm_uni_min_ps(__m256 vec0, __m256 vec1) { - return _mm256_min_ps(vec0, vec1); - } +static inline __m256 _mm_uni_min_ps(__m256 vec0, __m256 vec1) { + return _mm256_min_ps(vec0, vec1); +} - static inline __m256 _mm_uni_max_ps(__m256 vec0, __m256 vec1) { - return _mm256_max_ps(vec0, vec1); - } +static inline __m256 _mm_uni_max_ps(__m256 vec0, __m256 vec1) { + return _mm256_max_ps(vec0, vec1); +} - static inline __m256 _mm_uni_floor_ps(__m256 vec) { - return _mm256_floor_ps(vec); - } +static inline __m256 _mm_uni_floor_ps(__m256 vec) { + return _mm256_floor_ps(vec); +} - static inline __m256i _mm_uni_cvtps_epi32(__m256 vec) { - return _mm256_cvtps_epi32(vec); - } +static inline __m256i _mm_uni_cvtps_epi32(__m256 vec) { + return _mm256_cvtps_epi32(vec); +} - static inline __m256i _mm_uni_add_epi32(__m256i vec0, __m256i vec1) { - return _mm256_add_epi32(vec0, vec1); - } +static inline __m256i _mm_uni_add_epi32(__m256i vec0, __m256i vec1) { + return _mm256_add_epi32(vec0, vec1); +} - static inline __m256i _mm_uni_set1_epi32(int value) { - return _mm256_set1_epi32(value); - } +static inline __m256i _mm_uni_set1_epi32(int value) { + return _mm256_set1_epi32(value); +} - static inline __m256i _mm_uni_slli_epi32(__m256i vec, int value) { - return _mm256_slli_epi32(vec, value); - } +static inline __m256i _mm_uni_slli_epi32(__m256i vec, int value) { + return _mm256_slli_epi32(vec, value); +} - static inline __m256 _mm_uni_castsi_ps(__m256i vec) { - return _mm256_castsi256_ps(vec); - } +static inline __m256 _mm_uni_castsi_ps(__m256i vec) { + return _mm256_castsi256_ps(vec); +} - static inline __m256i _mm_uni_setzero_si() { - return _mm256_setzero_si256(); - } +static inline __m256i _mm_uni_setzero_si() { + return _mm256_setzero_si256(); +} - static inline __m256 _mm_uni_cmpgt_ps(__m256 vec0, __m256 vec1) { - return _mm256_cmp_ps(vec0, vec1, 14); - } +static inline __m256 _mm_uni_cmpgt_ps(__m256 vec0, __m256 vec1) { + return _mm256_cmp_ps(vec0, vec1, 14); +} - static inline __m256 _mm_uni_cmpgt_i32(__m256i vec0, __m256i vec1) { - return _mm256_cvtepi32_ps(_mm256_cmpgt_epi32(vec0, vec1)); - } +static inline __m256 _mm_uni_cmpgt_i32(__m256i vec0, __m256i vec1) { + return _mm256_cvtepi32_ps(_mm256_cmpgt_epi32(vec0, vec1)); +} - static inline __m256i _mm_uni_blendv_epi8(__m256i vec0, __m256i vec1, __m256i vmask) { - return _mm256_blendv_epi8(vec0, vec1, vmask); - } +static inline __m256i _mm_uni_blendv_epi8(__m256i vec0, __m256i vec1, __m256i vmask) { + return _mm256_blendv_epi8(vec0, vec1, vmask); +} - static inline __m256i _mm_uni_castps_si(__m256 vec) { - return _mm256_castps_si256(vec); - } +static inline __m256i _mm_uni_castps_si(__m256 vec) { + return _mm256_castps_si256(vec); +} - static inline __m256 _mm_uni_cvtepi32_ps(__m256i vec) { - return _mm256_cvtepi32_ps(vec); - } +static inline __m256 _mm_uni_cvtepi32_ps(__m256i vec) { + return _mm256_cvtepi32_ps(vec); +} - static inline int _mm_uni_movemask_ps(__m256 vec) { - return _mm256_movemask_ps(vec); - } +static inline int _mm_uni_movemask_ps(__m256 vec) { + return _mm256_movemask_ps(vec); +} } // namespace AVX2 #elif defined(HAVE_SSE42) namespace SSE42 { - static inline __m128 _mm_uni_loadu_ps(const float* psrc) { - return _mm_loadu_ps(psrc); - } +static inline __m128 _mm_uni_loadu_ps(const float* psrc) { + return _mm_loadu_ps(psrc); +} - static inline void _mm_uni_storeu_ps(float* pdst, const __m128 vec) { - _mm_storeu_ps(pdst, vec); - } - - static inline void _mm_uni_storeu_si(__m128i* pdst, const __m128i vec) { - _mm_storeu_si128(pdst, vec); - } - - static inline __m128 _mm_uni_setzero_ps() { - return _mm_setzero_ps(); - } - - static inline __m128 _mm_uni_set1_ps(float value) { - return _mm_set1_ps(value); - } - - static inline __m128 _mm_uni_add_ps(__m128 vec0, __m128 vec1) { - return _mm_add_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_sub_ps(__m128 vec0, __m128 vec1) { - return _mm_sub_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_mul_ps(__m128 vec0, __m128 vec1) { - return _mm_mul_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_div_ps(__m128 vec0, __m128 vec1) { - return _mm_div_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_sqrt_ps(__m128 vec) { - return _mm_sqrt_ps(vec); - } - - static inline __m128 _mm_uni_and_ps(__m128 vec0, __m128 vec1) { - return _mm_and_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_or_ps(__m128 vec0, __m128 vec1) { - return _mm_or_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_blendv_ps(__m128 vec0, __m128 vec1, __m128 vmask) { - return _mm_blendv_ps(vec0, vec1, vmask); - } - - static inline __m128 _mm_uni_min_ps(__m128 vec0, __m128 vec1) { - return _mm_min_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_max_ps(__m128 vec0, __m128 vec1) { - return _mm_max_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_floor_ps(__m128 vec) { - return _mm_floor_ps(vec); - } - - static inline __m128i _mm_uni_cvtps_epi32(__m128 vec) { - return _mm_cvtps_epi32(vec); - } - - static inline __m128i _mm_uni_add_epi32(__m128i vec0, __m128i vec1) { - return _mm_add_epi32(vec0, vec1); - } - - static inline __m128i _mm_uni_set1_epi32(int value) { - return _mm_set1_epi32(value); - } - - static inline __m128i _mm_uni_slli_epi32(__m128i vec, int value) { - return _mm_slli_epi32(vec, value); - } - - static inline __m128 _mm_uni_castsi_ps(__m128i vec) { - return _mm_castsi128_ps(vec); - } - - static inline __m128i _mm_uni_setzero_si() { - return _mm_setzero_si128(); - } - - static inline __m128 _mm_uni_cmpgt_ps(__m128 vec0, __m128 vec1) { - return _mm_cmpgt_ps(vec0, vec1); - } - - static inline __m128 _mm_uni_cmpgt_i32(__m128i vec0, __m128i vec1) { - return _mm_cvtepi32_ps(_mm_cmpgt_epi32(vec0, vec1)); - } - - static inline __m128i _mm_uni_blendv_epi8(__m128i vec0, __m128i vec1, __m128i vmask) { - return _mm_blendv_epi8(vec0, vec1, vmask); - } - - static inline __m128i _mm_uni_castps_si(__m128 vec) { - return _mm_castps_si128(vec); - } +static inline void _mm_uni_storeu_ps(float* pdst, const __m128 vec) { + _mm_storeu_ps(pdst, vec); +} + +static inline void _mm_uni_storeu_si(__m128i* pdst, const __m128i vec) { + _mm_storeu_si128(pdst, vec); +} + +static inline __m128 _mm_uni_setzero_ps() { + return _mm_setzero_ps(); +} + +static inline __m128 _mm_uni_set1_ps(float value) { + return _mm_set1_ps(value); +} + +static inline __m128 _mm_uni_add_ps(__m128 vec0, __m128 vec1) { + return _mm_add_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_sub_ps(__m128 vec0, __m128 vec1) { + return _mm_sub_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_mul_ps(__m128 vec0, __m128 vec1) { + return _mm_mul_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_div_ps(__m128 vec0, __m128 vec1) { + return _mm_div_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_sqrt_ps(__m128 vec) { + return _mm_sqrt_ps(vec); +} + +static inline __m128 _mm_uni_and_ps(__m128 vec0, __m128 vec1) { + return _mm_and_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_or_ps(__m128 vec0, __m128 vec1) { + return _mm_or_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_blendv_ps(__m128 vec0, __m128 vec1, __m128 vmask) { + return _mm_blendv_ps(vec0, vec1, vmask); +} + +static inline __m128 _mm_uni_min_ps(__m128 vec0, __m128 vec1) { + return _mm_min_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_max_ps(__m128 vec0, __m128 vec1) { + return _mm_max_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_floor_ps(__m128 vec) { + return _mm_floor_ps(vec); +} + +static inline __m128i _mm_uni_cvtps_epi32(__m128 vec) { + return _mm_cvtps_epi32(vec); +} + +static inline __m128i _mm_uni_add_epi32(__m128i vec0, __m128i vec1) { + return _mm_add_epi32(vec0, vec1); +} + +static inline __m128i _mm_uni_set1_epi32(int value) { + return _mm_set1_epi32(value); +} + +static inline __m128i _mm_uni_slli_epi32(__m128i vec, int value) { + return _mm_slli_epi32(vec, value); +} + +static inline __m128 _mm_uni_castsi_ps(__m128i vec) { + return _mm_castsi128_ps(vec); +} + +static inline __m128i _mm_uni_setzero_si() { + return _mm_setzero_si128(); +} + +static inline __m128 _mm_uni_cmpgt_ps(__m128 vec0, __m128 vec1) { + return _mm_cmpgt_ps(vec0, vec1); +} + +static inline __m128 _mm_uni_cmpgt_i32(__m128i vec0, __m128i vec1) { + return _mm_cvtepi32_ps(_mm_cmpgt_epi32(vec0, vec1)); +} + +static inline __m128i _mm_uni_blendv_epi8(__m128i vec0, __m128i vec1, __m128i vmask) { + return _mm_blendv_epi8(vec0, vec1, vmask); +} + +static inline __m128i _mm_uni_castps_si(__m128 vec) { + return _mm_castps_si128(vec); +} - static inline __m128 _mm_uni_cvtepi32_ps(__m128i vec) { - return _mm_cvtepi32_ps(vec); - } - static inline int _mm_uni_movemask_ps(__m128 vec) { - return _mm_movemask_ps(vec); - } +static inline __m128 _mm_uni_cvtepi32_ps(__m128i vec) { + return _mm_cvtepi32_ps(vec); +} +static inline int _mm_uni_movemask_ps(__m128 vec) { + return _mm_movemask_ps(vec); +} } // namespace SSE42 #endif diff --git a/src/plugins/intel_cpu/src/nodes/composite.cpp b/src/plugins/intel_cpu/src/nodes/composite.cpp index a1ceabd6942db1..616d3df6950e9a 100644 --- a/src/plugins/intel_cpu/src/nodes/composite.cpp +++ b/src/plugins/intel_cpu/src/nodes/composite.cpp @@ -4,11 +4,11 @@ #include "composite.h" -#include "nodes/input.h" #include "cpu_memory.h" +#include "nodes/input.h" +#include "shape_inference/shape_inference_internal_dyn.hpp" #include "transformations/cpu_opset/common/op/submodel.hpp" #include "utils/debug_capabilities.h" -#include "shape_inference/shape_inference_internal_dyn.hpp" namespace ov { namespace intel_cpu { diff --git a/src/plugins/intel_cpu/src/nodes/concat.cpp b/src/plugins/intel_cpu/src/nodes/concat.cpp index 635f37b2d05b3a..ef621947d723a7 100644 --- a/src/plugins/intel_cpu/src/nodes/concat.cpp +++ b/src/plugins/intel_cpu/src/nodes/concat.cpp @@ -4,29 +4,29 @@ #include "concat.h" -#include "openvino/op/concat.hpp" +#include +#include +#include +#include +#include #include #include #include -#include "dnnl_extension_utils.h" +#include "common/blocked_desc_creator.h" +#include "common/cpu_memcpy.h" +#include "dnnl_extension_utils.h" #include "onednn/dnnl.h" -#include -#include -#include #include "openvino/core/parallel.hpp" -#include "common/cpu_memcpy.h" -#include "common/blocked_desc_creator.h" -#include -#include +#include "openvino/op/concat.hpp" using namespace dnnl; namespace ov { namespace intel_cpu { namespace node { namespace { - constexpr size_t channelAxis = 1lu; +constexpr size_t channelAxis = 1lu; } bool Concat::isExecutable() const { @@ -86,11 +86,14 @@ void Concat::getSupportedDescriptors() { } } - // we need the first dims before axis to be 1 to avoid the reorder in the edge between the first parent and this concat + // we need the first dims before axis to be 1 to avoid the reorder in the edge between the first parent and this + // concat const auto& childDims = outputShapes[0].getDims(); if (childDims[axis] != Shape::UNDEFINED_DIM && - std::all_of(childDims.begin(), childDims.begin() + axis, [](size_t dim) { return dim == 1; })) + std::all_of(childDims.begin(), childDims.begin() + axis, [](size_t dim) { + return dim == 1; + })) canBeInPlace = true; } @@ -118,11 +121,11 @@ void Concat::initSupportedPrimitiveDescriptors() { const auto& dstShape = getOutputShapeAtPort(0); std::vector tdCreatorTypes = {LayoutType::ncsp, LayoutType::nspc}; - // check if blocked layouts are available the channels size should be evenly divided by the block size to avoid slow oneDNN ref implementation and allow - // inPlace memory usage if possible + // check if blocked layouts are available the channels size should be evenly divided by the block size to avoid slow + // oneDNN ref implementation and allow inPlace memory usage if possible if (dstShape.getRank() > channelAxis) { - for (auto& item : { std::make_pair(8lu, LayoutType::nCsp8c), std::make_pair(16lu, LayoutType::nCsp16c)}) { - const VectorDims &blkDims = dstShape.getDims(); + for (auto& item : {std::make_pair(8lu, LayoutType::nCsp8c), std::make_pair(16lu, LayoutType::nCsp16c)}) { + const VectorDims& blkDims = dstShape.getDims(); if (blkDims[channelAxis] == Shape::UNDEFINED_DIM || blkDims[channelAxis] % item.first != 0) continue; @@ -144,7 +147,8 @@ void Concat::initSupportedPrimitiveDescriptors() { auto& creatorsMap = BlockedDescCreator::getCommonCreators(); - auto itrRange = BlockedDescCreator::makeFilteredRange(creatorsMap, static_cast(dstShape.getRank()), tdCreatorTypes); + auto itrRange = + BlockedDescCreator::makeFilteredRange(creatorsMap, static_cast(dstShape.getRank()), tdCreatorTypes); for (auto itr = itrRange.first; itr != itrRange.second; ++itr) { NodeConfig config; @@ -183,12 +187,15 @@ void Concat::initSupportedPrimitiveDescriptors() { } } - if (!canBeInPlace || std::any_of(inputShapes.begin(), inputShapes.end(), [](const Shape& shape) { return shape.hasZeroDims(); })) + if (!canBeInPlace || std::any_of(inputShapes.begin(), inputShapes.end(), [](const Shape& shape) { + return shape.hasZeroDims(); + })) return; // Optimized inplace case for (auto refPdIndex : pdIndexesToReuse) { - auto config = supportedPrimitiveDescriptors[refPdIndex].getConfig();; + auto config = supportedPrimitiveDescriptors[refPdIndex].getConfig(); + ; for (size_t i = 0; i < config.inConfs.size(); i++) { config.inConfs[i].inPlace(0); } @@ -204,12 +211,16 @@ void Concat::selectOptimalPrimitiveDescriptor() { // for that case. for (size_t i = 0; i < getParentEdges().size(); i++) { for (size_t j = i + 1; j < getParentEdges().size(); j++) { - if (getParentEdgeAt(i) == getParentEdgeAt(j)) canBeInPlace = false; + if (getParentEdgeAt(i) == getParentEdgeAt(j)) + canBeInPlace = false; } } std::map formatFrequency; - std::vector supportedLayouts = {LayoutType::ncsp, LayoutType::nspc, LayoutType::nCsp8c, LayoutType::nCsp16c}; + std::vector supportedLayouts = {LayoutType::ncsp, + LayoutType::nspc, + LayoutType::nCsp8c, + LayoutType::nCsp16c}; for (size_t i = 0; i < getParentEdges().size(); i++) { auto parentEdge = getParentEdgeAt(i); auto parent = parentEdge->getParent(); @@ -218,11 +229,11 @@ void Concat::selectOptimalPrimitiveDescriptor() { if (parent_pdesc == nullptr) continue; - const auto &parent_config = parent_pdesc->getConfig(); + const auto& parent_config = parent_pdesc->getConfig(); int outputIndex = parentEdge->getInputNum(); if (outputIndex < 0 || outputIndex >= static_cast(parent_config.outConfs.size())) OPENVINO_THROW("Cannot find index of output node"); - const auto &port_desc = parent_config.outConfs[outputIndex].getMemDesc(); + const auto& port_desc = parent_config.outConfs[outputIndex].getMemDesc(); for (auto& item : supportedLayouts) { if (port_desc->hasLayoutType(item)) { formatFrequency[item] += 1; @@ -232,15 +243,15 @@ void Concat::selectOptimalPrimitiveDescriptor() { for (size_t i = 0; i < getChildEdges().size(); i++) { auto childEdge = getChildEdgeAt(i); auto child = childEdge->getChild(); - const auto *prim_desc = child->getSelectedPrimitiveDescriptor(); + const auto* prim_desc = child->getSelectedPrimitiveDescriptor(); if (prim_desc == nullptr) continue; - const auto &config = prim_desc->getConfig(); + const auto& config = prim_desc->getConfig(); int inputIndex = childEdge->getOutputNum(); if (inputIndex < 0 || inputIndex >= static_cast(config.inConfs.size())) OPENVINO_THROW("Cannot find index of output node"); - const auto &port_desc = config.inConfs[inputIndex].getMemDesc(); + const auto& port_desc = config.inConfs[inputIndex].getMemDesc(); for (auto& item : supportedLayouts) { if (port_desc->hasLayoutType(item)) { formatFrequency[item] += 1; @@ -249,9 +260,9 @@ void Concat::selectOptimalPrimitiveDescriptor() { } size_t maxCount = 0; - const auto &outDims = getOutputShapeAtPort(0).getDims(); + const auto& outDims = getOutputShapeAtPort(0).getDims(); LayoutType convertTo = LayoutType::ncsp; - for (auto &it : formatFrequency) { + for (auto& it : formatFrequency) { if (it.second > maxCount) { maxCount = it.second; convertTo = it.first; @@ -264,7 +275,7 @@ void Concat::selectOptimalPrimitiveDescriptor() { } } - for (auto& item : { std::make_pair(8lu, LayoutType::nCsp8c), std::make_pair(16lu, LayoutType::nCsp16c) }) { + for (auto& item : {std::make_pair(8lu, LayoutType::nCsp8c), std::make_pair(16lu, LayoutType::nCsp16c)}) { if (convertTo == item.second) { if (outDims[channelAxis] == Shape::UNDEFINED_DIM || outDims[1] % item.first != 0) { convertTo = LayoutType::ncsp; @@ -282,7 +293,8 @@ void Concat::selectOptimalPrimitiveDescriptor() { for (size_t i = 0; i < supportedPrimitiveDescriptors.size(); ++i) { if (supportedPrimitiveDescriptors[i].getConfig().outConfs[0].getMemDesc()->hasLayoutType(convertTo)) { - if (IMPLICATION(supportedPrimitiveDescriptors[i].getImplementationType() == impl_desc_type::unknown, canBeInPlace)) { + if (IMPLICATION(supportedPrimitiveDescriptors[i].getImplementationType() == impl_desc_type::unknown, + canBeInPlace)) { canSelectPrimitive.push_back(i); } } @@ -444,24 +456,26 @@ void Concat::initOptimalPrimitiveDescriptor() { if (selected_pd == nullptr) OPENVINO_THROW("Preferable primitive descriptor is not set."); - if (!isInPlace()) { - Node::initOptimalPrimitiveDescriptor(); + if (!isInPlace()) { + Node::initOptimalPrimitiveDescriptor(); auto config = selected_pd->getConfig(); if (!isConfigDefined(config)) { for (size_t i = 0; i < config.inConfs.size(); i++) { // Concat doesn't support different precision on inputs - config.inConfs[i].setMemDesc(getConsistentInputDesc(config, i)->getMemDesc()->cloneWithNewPrecision(inputPrecision)); + config.inConfs[i].setMemDesc( + getConsistentInputDesc(config, i)->getMemDesc()->cloneWithNewPrecision(inputPrecision)); } for (size_t i = 0; i < config.outConfs.size(); i++) { - config.outConfs[i].setMemDesc(getConsistentOutputDesc(config, i)->getMemDesc()->cloneWithNewPrecision(outputPrecision)); + config.outConfs[i].setMemDesc( + getConsistentOutputDesc(config, i)->getMemDesc()->cloneWithNewPrecision(outputPrecision)); } initDescriptor(config); } } - //block layout may have axis greater than rank, disable ref_concat + // block layout may have axis greater than rank, disable ref_concat auto primDesc = getSelectedPrimitiveDescriptor(); auto memDesc = primDesc->getConfig().outConfs[0].getMemDesc()->as(); auto rank = memDesc->getShape().getRank(); @@ -474,7 +488,9 @@ void Concat::initOptimalPrimitiveDescriptor() { srcPtrs.resize(getParentEdges().size()); } // check if selected Tensor descriptor has nspc layout and concat axis is C - canOptimizeNspc = axis == channelAxis && getSelectedPrimitiveDescriptor()->getConfig().outConfs.front().getMemDesc()->hasLayoutType(LayoutType::nspc); + canOptimizeNspc = + axis == channelAxis && + getSelectedPrimitiveDescriptor()->getConfig().outConfs.front().getMemDesc()->hasLayoutType(LayoutType::nspc); } void Concat::execute(dnnl::stream strm) { @@ -497,7 +513,7 @@ void Concat::execute(dnnl::stream strm) { } else { const auto& dst_memory = getChildEdgeAt(0)->getMemory(); const size_t num_src = getParentEdges().size(); - std::unordered_map mem_ags {{DNNL_ARG_DST, dst_memory.getPrimitive()}}; + std::unordered_map mem_ags{{DNNL_ARG_DST, dst_memory.getPrimitive()}}; size_t nonZeroInShapes = 0; for (size_t i = 0; i < num_src; i++) { const auto& srcMem = getParentEdgeAt(i)->getMemory(); @@ -580,7 +596,7 @@ void Concat::execRef() { } if (!hasOuterLoop) { - if (nelemTotal < 64*1024 || parallel_get_max_threads() == 1) { + if (nelemTotal < 64 * 1024 || parallel_get_max_threads() == 1) { for (size_t a = 0; a < srcPtrs.size(); ++a) { const auto inData = srcPtrs[a]; auto outputData = &dstPtr[dstOffset[a]]; @@ -612,63 +628,65 @@ void Concat::execRef() { physDims[i] = outputShape[i]; } const auto L1Size = dnnl::utils::get_cache_size(1, true); - UNUSED(L1Size); // for Windows - parallel_for6d(physDims[0], physDims[1], physDims[2], physDims[3], physDims[4], numSrc, - [&](size_t n0, size_t n1, size_t n2, size_t n3, size_t n4, size_t a) { - // check if zero memory - if (srcPtrs[a] == nullptr) return; - - size_t inOff = inputStrides[a][0] * n0 + inputStrides[a][1] * n1 + inputStrides[a][2] * n2 - + inputStrides[a][3] * n3 + inputStrides[a][4] * n4; - size_t outOff = outputStrides[0] * n0 + outputStrides[1] * n1 + outputStrides[2] * n2 - + outputStrides[3] * n3 + outputStrides[4] * n4; - const uint8_t *i = &srcPtrs[a][inOff]; - uint8_t *o = &dstPtr[dstOffset[a] + outOff]; + UNUSED(L1Size); // for Windows + parallel_for6d(physDims[0], + physDims[1], + physDims[2], + physDims[3], + physDims[4], + numSrc, + [&](size_t n0, size_t n1, size_t n2, size_t n3, size_t n4, size_t a) { + // check if zero memory + if (srcPtrs[a] == nullptr) + return; + + size_t inOff = inputStrides[a][0] * n0 + inputStrides[a][1] * n1 + inputStrides[a][2] * n2 + + inputStrides[a][3] * n3 + inputStrides[a][4] * n4; + size_t outOff = outputStrides[0] * n0 + outputStrides[1] * n1 + outputStrides[2] * n2 + + outputStrides[3] * n3 + outputStrides[4] * n4; + const uint8_t* i = &srcPtrs[a][inOff]; + uint8_t* o = &dstPtr[dstOffset[a] + outOff]; #if defined(__GNUC__) - // Heuristic: - // memcpy works generally faster for data sizes not - // exceeding L1 cache. - if (nelemToCopy[a] > L1Size) { - // The code below performs data copying: o[e] = i[e] - // and uses a workaround to make GNU compilers optimize it - uint8_t *ptro = o; - const uint8_t *ptri = i; - // head part: bytes before 4 byte-align's address - const size_t headPart = sizeof(uint32_t) - - reinterpret_cast(ptro) - % sizeof(uint32_t); - - // main part: bytes in 4 byte-align - const size_t mainPart - = (nelemToCopy[a] - headPart) / sizeof(uint32_t); - // tail part: bytes after 4 byte-align - const size_t tailPart - = (nelemToCopy[a]) - headPart - - (mainPart * sizeof(uint32_t)); - // copy head part - for (size_t e = 0; e < headPart; ++e) { - *ptro = *ptri; - ++ptro; - ++ptri; - } - // copy main part - std::memcpy(ptro, ptri, mainPart * sizeof(uint32_t)); - ptro += mainPart * sizeof(uint32_t); - ptri += mainPart * sizeof(uint32_t); - // copy tail part - for (size_t e = 0; e < tailPart; ++e) { - *ptro = *ptri; - ++ptro; - ++ptri; - } - } else { - std::memcpy(o, i, nelemToCopy[a]); - } + // Heuristic: + // memcpy works generally faster for data sizes not + // exceeding L1 cache. + if (nelemToCopy[a] > L1Size) { + // The code below performs data copying: o[e] = i[e] + // and uses a workaround to make GNU compilers optimize it + uint8_t* ptro = o; + const uint8_t* ptri = i; + // head part: bytes before 4 byte-align's address + const size_t headPart = + sizeof(uint32_t) - reinterpret_cast(ptro) % sizeof(uint32_t); + + // main part: bytes in 4 byte-align + const size_t mainPart = (nelemToCopy[a] - headPart) / sizeof(uint32_t); + // tail part: bytes after 4 byte-align + const size_t tailPart = (nelemToCopy[a]) - headPart - (mainPart * sizeof(uint32_t)); + // copy head part + for (size_t e = 0; e < headPart; ++e) { + *ptro = *ptri; + ++ptro; + ++ptri; + } + // copy main part + std::memcpy(ptro, ptri, mainPart * sizeof(uint32_t)); + ptro += mainPart * sizeof(uint32_t); + ptri += mainPart * sizeof(uint32_t); + // copy tail part + for (size_t e = 0; e < tailPart; ++e) { + *ptro = *ptri; + ++ptro; + ++ptri; + } + } else { + std::memcpy(o, i, nelemToCopy[a]); + } #else std::memcpy(o, i, nelemToCopy[a]); #endif - }); + }); } } @@ -691,8 +709,10 @@ void Concat::resolveInPlaceEdges(Edge::LOOK look) { " can't use inPlace memory with concatenation on dynamic dimension"); auto edges = getChildEdgesAtPort(inplaceOutIndx); - auto itr = std::find_if(edges.begin(), edges.end(), [](const EdgePtr& edge) { return edge->getStatus() == Edge::Status::Allocated; }); - OPENVINO_ASSERT(itr != edges.end(), " Could not find allocated child edge for concat node: " , getName()); + auto itr = std::find_if(edges.begin(), edges.end(), [](const EdgePtr& edge) { + return edge->getStatus() == Edge::Status::Allocated; + }); + OPENVINO_ASSERT(itr != edges.end(), " Could not find allocated child edge for concat node: ", getName()); auto baseMemBlock = (*itr)->getMemory().getMemoryBlock(); OPENVINO_ASSERT(baseMemBlock != nullptr, " NULL base memory block in concat node: ", getName()); @@ -726,6 +746,6 @@ void Concat::resolveInPlaceEdges(Edge::LOOK look) { } } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/concat.h b/src/plugins/intel_cpu/src/nodes/concat.h index 9ed331bee4f16d..8b75e3839a372d 100644 --- a/src/plugins/intel_cpu/src/nodes/concat.h +++ b/src/plugins/intel_cpu/src/nodes/concat.h @@ -4,8 +4,8 @@ #pragma once -#include "node.h" #include "graph_context.h" +#include "node.h" namespace ov { namespace intel_cpu { @@ -22,7 +22,9 @@ class Concat : public Node { void selectOptimalPrimitiveDescriptor() override; bool created() const override; void execute(dnnl::stream strm) override; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } void resolveInPlaceEdges(Edge::LOOK look) override; ov::element::Type getRuntimePrecision() const override; @@ -42,9 +44,9 @@ class Concat : public Node { void execNspcSpecCase(); void exec1DCase(); std::vector inputStrides; - std::vector nelemToCopy; // byte moved in each iter + std::vector nelemToCopy; // byte moved in each iter size_t nelemTotal = 0; - std::vector dstOffset; // dst offset for each input + std::vector dstOffset; // dst offset for each input std::vector srcPtrs; bool hasOuterLoop = false; ov::element::Type inputPrecision = ov::element::f32; @@ -54,6 +56,6 @@ class Concat : public Node { dnnl::primitive prim; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/conv.cpp b/src/plugins/intel_cpu/src/nodes/conv.cpp index 53d53d093cfabf..4cb2dc9058551f 100644 --- a/src/plugins/intel_cpu/src/nodes/conv.cpp +++ b/src/plugins/intel_cpu/src/nodes/conv.cpp @@ -4,8 +4,11 @@ #include "conv.h" -#include "openvino/op/convolution.hpp" -#include "openvino/op/group_conv.hpp" +#include +#include +#include +#include + #include "common/c_types_map.hpp" #include "common/cpu_convert.h" #include "common/primitive_desc.hpp" @@ -27,17 +30,14 @@ #include "oneapi/dnnl/dnnl_common.hpp" #include "oneapi/dnnl/dnnl_types.h" #include "onednn/dnnl.h" +#include "openvino/op/convolution.hpp" +#include "openvino/op/group_conv.hpp" #include "pooling.h" #include "reorder.h" #include "utils/cpu_utils.hpp" #include "utils/debug_capabilities.h" #include "utils/general_utils.h" -#include -#include -#include -#include - using namespace dnnl; namespace ov { @@ -88,7 +88,7 @@ size_t ConvKey::hash() const { return seed; } -bool ConvKey::operator==(const ConvKey &rhs) const { +bool ConvKey::operator==(const ConvKey& rhs) const { bool retVal = true; if (inp0 != rhs.inp0) { retVal = retVal && inp0 && rhs.inp0 && inp0->getDnnlDesc() == rhs.inp0->getDnnlDesc(); @@ -112,11 +112,11 @@ bool ConvKey::operator==(const ConvKey &rhs) const { return retVal; } -} // namespace +} // namespace class Convolution::FusedSubgraph { public: - FusedSubgraph(const std::vector &opList, const Convolution &conv, const GraphContext::CPtr context) { + FusedSubgraph(const std::vector& opList, const Convolution& conv, const GraphContext::CPtr context) { _graph = std::unique_ptr(new Graph()); std::unordered_set nodesSet; @@ -130,16 +130,16 @@ class Convolution::FusedSubgraph { nodesSet.insert(child); }; - //Make inputs - const auto &inpMemDesc1 = conv.getBaseMemDescAtOutputPort(0); + // Make inputs + const auto& inpMemDesc1 = conv.getBaseMemDescAtOutputPort(0); auto inp0 = std::make_shared(inpMemDesc1, "inp0", "Parameter", context); inputs.push_back(inp0); const size_t sumPortNum = conv.getParentEdges().size() - 1; - const auto &inpMemDesc2 = conv.getBaseMemDescAtInputPort(sumPortNum); + const auto& inpMemDesc2 = conv.getBaseMemDescAtInputPort(sumPortNum); auto inp1 = std::make_shared(inpMemDesc2, "inp1", "Parameter", context); inputs.push_back(inp1); - auto itr = std::find_if(opList.begin(), opList.end(), [](const NodePtr &node) { + auto itr = std::find_if(opList.begin(), opList.end(), [](const NodePtr& node) { if (auto eltwise = std::dynamic_pointer_cast(node)) { return eltwise->isSpecialConvolutionAddFusing(); } @@ -153,7 +153,7 @@ class Convolution::FusedSubgraph { addEdge(inp0, sumNode, 0, 0); addEdge(inp1, sumNode, 0, 1); - //Replicate the rest of the subgraph + // Replicate the rest of the subgraph auto parentItr = itr; while (++itr != opList.end()) { auto parentNode = *parentItr; @@ -173,8 +173,8 @@ class Convolution::FusedSubgraph { } } - //Make output - const auto &outMemDesc = conv.getBaseMemDescAtOutputPort(0); + // Make output + const auto& outMemDesc = conv.getBaseMemDescAtOutputPort(0); auto out = std::make_shared(outMemDesc, "out", "Result", context); addEdge(*parentItr, out, 0, 0); outputs.push_back(out); @@ -240,9 +240,20 @@ bool Convolution::isSupportedOperation(const std::shared_ptr& op } Convolution::Convolution(const std::shared_ptr& op, const GraphContext::CPtr context) - : Node(op, context, NgraphShapeInferFactory(op)), withBiases(false), withSum(false), withDWConv(false), - isGrouped(false), dw_conv_oc(0), dw_conv_ih(0), dw_conv_iw(0), dw_conv_in_dt(memory::data_type::undef), - groupNum(1lu), IC(1), groupIC(1), groupOC(1), eltwisePrecision(ov::element::f32) { + : Node(op, context, NgraphShapeInferFactory(op)), + withBiases(false), + withSum(false), + withDWConv(false), + isGrouped(false), + dw_conv_oc(0), + dw_conv_ih(0), + dw_conv_iw(0), + dw_conv_in_dt(memory::data_type::undef), + groupNum(1lu), + IC(1), + groupIC(1), + groupOC(1), + eltwisePrecision(ov::element::f32) { std::string errorMessage; if (!isSupportedOperation(op, errorMessage)) { OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); @@ -296,12 +307,12 @@ Convolution::Convolution(const std::shared_ptr& op, const GraphContext } paddingL = groupConvolutionOp->get_pads_begin(); paddingR = groupConvolutionOp->get_pads_end(); - autoPadding = one_of(groupConvolutionOp->get_auto_pad(), ov::op::PadType::SAME_UPPER, ov::op::PadType::SAME_LOWER); + autoPadding = + one_of(groupConvolutionOp->get_auto_pad(), ov::op::PadType::SAME_UPPER, ov::op::PadType::SAME_LOWER); } // Only apply this heuristic logic on FP32 IR. IC=1 ,OC=1 would disable brgconv on avx2. const bool isAvx2FP32 = !dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core) && - dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx2) && - !context->isGraphQuantized(); + dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx2) && !context->isGraphQuantized(); useJitPlanar = ((IC == 1 && groupOC * groupNum == 1) && isAvx2FP32); } @@ -315,7 +326,8 @@ bool Convolution::canBeExecutedInInt8() const { if (!legacyWeightsZeroPoints.empty()) weightsDataType = memory::data_type::s8; - return one_of(inputDataType, memory::data_type::u8, memory::data_type::s8) && weightsDataType == memory::data_type::s8; + return one_of(inputDataType, memory::data_type::u8, memory::data_type::s8) && + weightsDataType == memory::data_type::s8; } ov::element::Type Convolution::fusedEltwisePrecision(const NodePtr& fusingNode) const { @@ -338,62 +350,63 @@ ov::element::Type Convolution::fusedEltwisePrecision(const NodePtr& fusingNode) const std::vector& Convolution::getDefaultImplPriority() { static const std::vector priorities = { - impl_desc_type::unknown, - impl_desc_type::dw_acl, - impl_desc_type::winograd_acl, - impl_desc_type::gemm_acl, - impl_desc_type::acl, - impl_desc_type::brgconv_avx512_dw, - impl_desc_type::brgconv_avx512_amx_1x1, - impl_desc_type::brgconv_avx512_amx, - impl_desc_type::jit_avx512_amx_dw, - impl_desc_type::jit_avx512_amx_1x1, - impl_desc_type::jit_avx512_amx, - impl_desc_type::brgconv_avx512_1x1, - impl_desc_type::brgconv_avx512, - impl_desc_type::jit_avx512_dw, - impl_desc_type::jit_avx512_1x1, - impl_desc_type::jit_avx512, - impl_desc_type::brgconv_avx2_dw, - impl_desc_type::brgconv_avx2_1x1, - impl_desc_type::brgconv_avx2, - impl_desc_type::jit_uni_dw, - impl_desc_type::jit_uni_1x1, - impl_desc_type::jit_uni, - impl_desc_type::jit_avx2_dw, - impl_desc_type::jit_avx2_1x1, - impl_desc_type::jit_avx2, - impl_desc_type::jit_avx_dw, - impl_desc_type::jit_avx_1x1, - impl_desc_type::jit_avx, - impl_desc_type::jit_sse42_dw, - impl_desc_type::jit_sse42_1x1, - impl_desc_type::jit_sse42, - impl_desc_type::gemm_any, - impl_desc_type::gemm_blas, - impl_desc_type::gemm_avx512, - impl_desc_type::gemm_avx2, - impl_desc_type::gemm_avx, - impl_desc_type::gemm_sse42, - impl_desc_type::jit_gemm, - impl_desc_type::ref_any, - impl_desc_type::ref, - }; - if (isBrgConvAvailable()) - return priorities; - - static const std::vector priorities_wo_brgemm = [&] { - std::vectorresult; - std::copy_if(priorities.begin(), priorities.end(), std::back_inserter(result), - [](impl_desc_type type) { return !(type & impl_desc_type::brgconv); }); - return result;}(); - return priorities_wo_brgemm; + impl_desc_type::unknown, + impl_desc_type::dw_acl, + impl_desc_type::winograd_acl, + impl_desc_type::gemm_acl, + impl_desc_type::acl, + impl_desc_type::brgconv_avx512_dw, + impl_desc_type::brgconv_avx512_amx_1x1, + impl_desc_type::brgconv_avx512_amx, + impl_desc_type::jit_avx512_amx_dw, + impl_desc_type::jit_avx512_amx_1x1, + impl_desc_type::jit_avx512_amx, + impl_desc_type::brgconv_avx512_1x1, + impl_desc_type::brgconv_avx512, + impl_desc_type::jit_avx512_dw, + impl_desc_type::jit_avx512_1x1, + impl_desc_type::jit_avx512, + impl_desc_type::brgconv_avx2_dw, + impl_desc_type::brgconv_avx2_1x1, + impl_desc_type::brgconv_avx2, + impl_desc_type::jit_uni_dw, + impl_desc_type::jit_uni_1x1, + impl_desc_type::jit_uni, + impl_desc_type::jit_avx2_dw, + impl_desc_type::jit_avx2_1x1, + impl_desc_type::jit_avx2, + impl_desc_type::jit_avx_dw, + impl_desc_type::jit_avx_1x1, + impl_desc_type::jit_avx, + impl_desc_type::jit_sse42_dw, + impl_desc_type::jit_sse42_1x1, + impl_desc_type::jit_sse42, + impl_desc_type::gemm_any, + impl_desc_type::gemm_blas, + impl_desc_type::gemm_avx512, + impl_desc_type::gemm_avx2, + impl_desc_type::gemm_avx, + impl_desc_type::gemm_sse42, + impl_desc_type::jit_gemm, + impl_desc_type::ref_any, + impl_desc_type::ref, + }; + if (isBrgConvAvailable()) + return priorities; + + static const std::vector priorities_wo_brgemm = [&] { + std::vector result; + std::copy_if(priorities.begin(), priorities.end(), std::back_inserter(result), [](impl_desc_type type) { + return !(type & impl_desc_type::brgconv); + }); + return result; + }(); + return priorities_wo_brgemm; } const bool Convolution::isBrgConvAvailable() { - //When avx2 brgconv heuristic case, disable brgconv to WA the regression. - const bool isBrgConvAvailable = dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx2) && - !useJitPlanar; + // When avx2 brgconv heuristic case, disable brgconv to WA the regression. + const bool isBrgConvAvailable = dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx2) && !useJitPlanar; return isBrgConvAvailable; } @@ -413,7 +426,7 @@ void Convolution::getSupportedDescriptors() { } if (fusedWith[i]->getAlgorithm() == Algorithm::EltwiseAdd) { - auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); + auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); if (eltwiseNode && eltwiseNode->isSpecialConvolutionAddFusing()) { expectedInputEdgesNum++; } @@ -427,17 +440,19 @@ void Convolution::getSupportedDescriptors() { outputDataType = DnnlExtensionUtils::ElementTypeToDataType(getOriginalOutputPrecisionAtPort(0)); eltwisePrecision = DnnlExtensionUtils::DataTypeToElementType(outputDataType); if (!fusedWith.empty()) { - outputDataType = DnnlExtensionUtils::ElementTypeToDataType(fusedWith[fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0)); + outputDataType = DnnlExtensionUtils::ElementTypeToDataType( + fusedWith[fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0)); eltwisePrecision = DnnlExtensionUtils::DataTypeToElementType(outputDataType); } // We need to make sure that convolution output and second input of fused Eltwise operation - // have equal precision sizes since they use the same physical memory. In case precisions are different we upscale to FP32. + // have equal precision sizes since they use the same physical memory. In case precisions are different we upscale + // to FP32. if (outputDataType != memory::data_type::f32 && outputDataType != memory::data_type::bf16 && outputDataType != memory::data_type::f16 && withSum) { for (size_t i = 0; i < fusedWith.size(); i++) { if (fusedWith[i]->getAlgorithm() == Algorithm::EltwiseAdd) { - auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); + auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); if (eltwiseNode && eltwiseNode->isSpecialConvolutionAddFusing()) { eltwisePrecision = fusedEltwisePrecision(fusedWith[i]); if (DnnlExtensionUtils::DataTypeToElementType(outputDataType).size() != eltwisePrecision.size()) { @@ -468,7 +483,7 @@ void Convolution::getSupportedDescriptors() { } for (size_t i = 0; i < fusedWith.size(); i++) { - auto *convolutionNode = dynamic_cast(fusedWith[i].get()); + auto* convolutionNode = dynamic_cast(fusedWith[i].get()); if (convolutionNode) { auto& inActivationDims = convolutionNode->inputShapes[0].getStaticDims(); dw_conv_ih = inActivationDims[convolutionNode->inputShapes[0].getRank() - 2]; @@ -477,7 +492,7 @@ void Convolution::getSupportedDescriptors() { auto& outDims = convolutionNode->outputShapes[0].getStaticDims(); dw_conv_oc = outDims[1]; - const auto &dwWeightsDims = convolutionNode->inputShapes[1].getStaticDims(); + const auto& dwWeightsDims = convolutionNode->inputShapes[1].getStaticDims(); dw_conv_kernel.push_back(dwWeightsDims[dwWeightsDims.size() - 1]); dw_conv_kernel.push_back(dwWeightsDims[dwWeightsDims.size() - 2]); dw_conv_strides = convolutionNode->getStride(); @@ -486,7 +501,8 @@ void Convolution::getSupportedDescriptors() { if (i == 0) { dw_conv_in_dt = DnnlExtensionUtils::ElementTypeToDataType(getOriginalOutputPrecisionAtPort(0)); } else { - dw_conv_in_dt = DnnlExtensionUtils::ElementTypeToDataType(fusedWith[i - 1]->getOriginalOutputPrecisionAtPort(0)); + dw_conv_in_dt = DnnlExtensionUtils::ElementTypeToDataType( + fusedWith[i - 1]->getOriginalOutputPrecisionAtPort(0)); } } else { dw_conv_in_dt = memory::data_type::f32; @@ -498,7 +514,7 @@ void Convolution::getSupportedDescriptors() { int src = getInputShapeAtPort(0).getStaticDims()[2 + j]; int dst = getOutputShapeAtPort(0).getStaticDims()[2 + j]; - krn = (krn - 1)*(dilation[j] + 1) + 1; + krn = (krn - 1) * (dilation[j] + 1) + 1; int calc_dst = (src - krn + paddingL[j]) / stride[j] + 1; paddingR[j] = (dst - calc_dst) * stride[j]; } @@ -506,10 +522,14 @@ void Convolution::getSupportedDescriptors() { } MemoryDescPtr in_candidate, out_candidate; - memory::format_tag nspc = ndims == 3 ? memory::format_tag::nwc : (ndims == 4 ? memory::format_tag::nhwc : memory::format_tag::ndhwc); - memory::format_tag ncsp = ndims == 3 ? memory::format_tag::ncw : (ndims == 4 ? memory::format_tag::nchw : memory::format_tag::ncdhw); - memory::format_tag nCsp8c = ndims == 3 ? memory::format_tag::nCw8c : (ndims == 4 ? memory::format_tag::nChw8c : memory::format_tag::nCdhw8c); - memory::format_tag nCsp16c = ndims == 3 ? memory::format_tag::nCw16c : (ndims == 4 ? memory::format_tag::nChw16c : memory::format_tag::nCdhw16c); + memory::format_tag nspc = + ndims == 3 ? memory::format_tag::nwc : (ndims == 4 ? memory::format_tag::nhwc : memory::format_tag::ndhwc); + memory::format_tag ncsp = + ndims == 3 ? memory::format_tag::ncw : (ndims == 4 ? memory::format_tag::nchw : memory::format_tag::ncdhw); + memory::format_tag nCsp8c = ndims == 3 ? memory::format_tag::nCw8c + : (ndims == 4 ? memory::format_tag::nChw8c : memory::format_tag::nCdhw8c); + memory::format_tag nCsp16c = ndims == 3 ? memory::format_tag::nCw16c + : (ndims == 4 ? memory::format_tag::nChw16c : memory::format_tag::nCdhw16c); if (canBeExecutedInInt8()) { DEBUG_LOG(getName(), "Creating I8 descriptor"); @@ -524,7 +544,7 @@ void Convolution::getSupportedDescriptors() { in_candidate = std::make_shared(getInputShapeAtPort(0), inputDataType, nspc); out_candidate = std::make_shared(getOutputShapeAtPort(0), outputDataType, nspc); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); return; } @@ -549,7 +569,7 @@ void Convolution::getSupportedDescriptors() { eltwisePrecision = ov::element::f32; for (size_t i = 0; i < fusedWith.size(); i++) { if (fusedWith[i]->getAlgorithm() == Algorithm::EltwiseAdd) { - auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); + auto* eltwiseNode = dynamic_cast(fusedWith[i].get()); if (eltwiseNode && eltwiseNode->isSpecialConvolutionAddFusing()) { eltwisePrecision = fusedEltwisePrecision(fusedWith[i]); // TODO(amalyshe): there might be situation when convolution can be executed in BF16, @@ -581,42 +601,44 @@ void Convolution::getSupportedDescriptors() { #if defined(OPENVINO_ARCH_X86_64) // nspc shows better performance only with brgconv implementation - bool nspcFirst = isBrgConvAvailable() && one_of(inputDataType, memory::data_type::f16, memory::data_type::bf16, memory::data_type::f32); + bool nspcFirst = isBrgConvAvailable() && + one_of(inputDataType, memory::data_type::f16, memory::data_type::bf16, memory::data_type::f32); bool nspcAdded = false; if (nspcFirst) { in_candidate = std::make_shared(inputShape, inputDataType, nspc); out_candidate = std::make_shared(outputShape, outputDataType, nspc); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); nspcAdded = true; } if (IC == 1 && groupOC == 1) { in_candidate = std::make_shared(inputShape, inputDataType, ncsp); out_candidate = std::make_shared(outputShape, outputDataType, ncsp); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); } else if (IC < 4) { in_candidate = std::make_shared(inputShape, inputDataType, ncsp); out_candidate = std::make_shared(outputShape, outputDataType, nCsp16c); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); out_candidate = std::make_shared(outputShape, outputDataType, nCsp8c); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); } else { in_candidate = std::make_shared(inputShape, inputDataType, nCsp16c); out_candidate = std::make_shared(outputShape, outputDataType, nCsp16c); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); in_candidate = std::make_shared(inputShape, inputDataType, nCsp8c); out_candidate = std::make_shared(outputShape, outputDataType, nCsp8c); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); } in_candidate = std::make_shared(inputShape, inputDataType, ncsp); out_candidate = std::make_shared(outputShape, outputDataType, ncsp); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); - if (!nspcAdded && (inputDataType != memory::data_type::bf16 && inputDataType != memory::data_type::f16 && isNspcAvailable())) { + if (!nspcAdded && + (inputDataType != memory::data_type::bf16 && inputDataType != memory::data_type::f16 && isNspcAvailable())) { in_candidate = std::make_shared(inputShape, inputDataType, nspc); out_candidate = std::make_shared(outputShape, outputDataType, nspc); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); } #else (void)ncsp; @@ -625,7 +647,7 @@ void Convolution::getSupportedDescriptors() { in_candidate = std::make_shared(inputShape, inputDataType, nspc); out_candidate = std::make_shared(outputShape, outputDataType, nspc); - createDescriptor({ in_candidate }, { out_candidate }); + createDescriptor({in_candidate}, {out_candidate}); #endif } @@ -636,9 +658,11 @@ void Convolution::setPostOps(dnnl::primitive_attr& attr, dnnl::post_ops ops; auto& args = convPostOpsArgs[useLegacyPostOps]; bool isINT8 = canBeExecutedInInt8(); - // Weight dims in NON-Group CONV: [OC, IC, KH, KW], perchannel weight scale applied on OC DIM, weiScaleMaskPerChannel = 1 << 0 - // Weight dims in Group CONV:[Group, OC, IC, KH, KW], perchannel weight scale applied on GROUP and OC DIM, weiScaleMaskPerChannel = ( 1 << 0 | 1<< 1) = 0x03 - DnnlPostOpsComposerLegacy dnnlpoc(getEngine(), attr, ops, args, dims, 1, isINT8, isGrouped ? 3 : 1 << 0, getDQScales(), withBiases); + // Weight dims in NON-Group CONV: [OC, IC, KH, KW], perchannel weight scale applied on OC DIM, + // weiScaleMaskPerChannel = 1 << 0 Weight dims in Group CONV:[Group, OC, IC, KH, KW], perchannel weight scale + // applied on GROUP and OC DIM, weiScaleMaskPerChannel = ( 1 << 0 | 1<< 1) = 0x03 + DnnlPostOpsComposerLegacy + dnnlpoc(getEngine(), attr, ops, args, dims, 1, isINT8, isGrouped ? 3 : 1 << 0, getDQScales(), withBiases); DEBUG_LOG(getName(), " useLegacyPostOps=", useLegacyPostOps, " initWeights=", initWeights); @@ -681,14 +705,14 @@ void Convolution::setPostOps(dnnl::primitive_attr& attr, bool hasSubsequentSum = false; bool hasSubsequentFQ = false; for (size_t j = i + 1; j < fusedWith.size(); j++) { - auto &nextNode = fusedWith[j]; + auto& nextNode = fusedWith[j]; - auto *nextEltwiseNode = dynamic_cast(nextNode.get()); + auto* nextEltwiseNode = dynamic_cast(nextNode.get()); if (nextEltwiseNode && nextEltwiseNode->isSpecialConvolutionAddFusing()) { hasSubsequentSum = true; } - auto *nextQuantizeNode = dynamic_cast(nextNode.get()); + auto* nextQuantizeNode = dynamic_cast(nextNode.get()); if (nextQuantizeNode) { hasSubsequentFQ = true; } @@ -781,12 +805,16 @@ void Convolution::initSupportedPrimitiveDescriptors() { const std::vector dwWeightsDims{dw_conv_oc, 1, 1, dw_conv_kernel[Y_AXIS], dw_conv_kernel[X_AXIS]}; const std::vector dwBiasesDims{dw_conv_oc}; - const auto dwWeightsPrc = DnnlExtensionUtils::ElementTypeToDataType(dw_conv_in_dt == dnnl_u8 ? ov::element::i8 : ov::element::f32); - const auto dwWeightsDesc = std::make_shared(Shape(dwWeightsDims), dwWeightsPrc, memory::format_tag::Goihw8g); + const auto dwWeightsPrc = DnnlExtensionUtils::ElementTypeToDataType( + dw_conv_in_dt == dnnl_u8 ? ov::element::i8 : ov::element::f32); + const auto dwWeightsDesc = std::make_shared(Shape(dwWeightsDims), + dwWeightsPrc, + memory::format_tag::Goihw8g); inConfs.emplace_back(dwWeightsDesc); const auto dwBiasPrc = memory::data_type::f32; - const auto dwBiasDesc = std::make_shared(Shape(dwBiasesDims), dwBiasPrc, memory::format_tag::x); + const auto dwBiasDesc = + std::make_shared(Shape(dwBiasesDims), dwBiasPrc, memory::format_tag::x); inConfs.emplace_back(dwBiasDesc); } @@ -809,15 +837,21 @@ void Convolution::initSupportedPrimitiveDescriptors() { }; #ifdef CPU_DEBUG_CAPS { - if (!customImplPriorities.empty()) { - DEBUG_LOG("#", getName(), " customImplPriorities [", 0 , "/", customImplPriorities.size(), - "]: ", impl_type_to_string(customImplPriorities[0])); - } + if (!customImplPriorities.empty()) { + DEBUG_LOG("#", + getName(), + " customImplPriorities [", + 0, + "/", + customImplPriorities.size(), + "]: ", + impl_type_to_string(customImplPriorities[0])); + } } #endif for (size_t dIdx = 0; dIdx < descs.size(); dIdx++) { auto& desc = descs[dIdx]; - auto primitive_desc = desc.get(true); //true mean allow empty + auto primitive_desc = desc.get(true); // true mean allow empty if (primitive_desc == nullptr) { continue; } @@ -829,16 +863,25 @@ void Convolution::initSupportedPrimitiveDescriptors() { }; const bool first_match = customImplPriorities.empty(); - DEBUG_LOG("#", getName(), ",descIndex:", dIdx + 1, "/", descs.size(), - ", itpd.impl_info_str(): ", desc.impl_info_str(), - ", parsed imp_type: ", impl_type_to_string(parse_impl_name(desc.impl_info_str())), - ", first_match: ", first_match ? "true" : "false"); - DnnlExtensionUtils::for_each_implementation(desc, - first_match, - [&](impl_desc_type implType) { - return contains(getImplPriority(), implType); - }, - add_supported_desc); + DEBUG_LOG("#", + getName(), + ",descIndex:", + dIdx + 1, + "/", + descs.size(), + ", itpd.impl_info_str(): ", + desc.impl_info_str(), + ", parsed imp_type: ", + impl_type_to_string(parse_impl_name(desc.impl_info_str())), + ", first_match: ", + first_match ? "true" : "false"); + DnnlExtensionUtils::for_each_implementation( + desc, + first_match, + [&](impl_desc_type implType) { + return contains(getImplPriority(), implType); + }, + add_supported_desc); // fallback. if none of the primitive types is present in the priority list just add first implementation // @todo this fallback is not necessary if primitive priority list is filled correctly @@ -852,46 +895,48 @@ bool Convolution::created() const { } namespace { -dnnl::convolution_forward::primitive_desc -createDescriptorInternal(const dnnl::engine& engine, - const dnnl::memory::desc& inputDesc, - const dnnl::memory::desc& weightDesc, - const dnnl::memory::desc& biasDesc, - const dnnl::memory::desc& outputDesc, - bool withBiases, - const std::vector& stride, - const std::vector& dilation, - const std::vector& paddingL, - const std::vector& paddingR, - dnnl::algorithm alg, - const dnnl::primitive_attr& attr) { +dnnl::convolution_forward::primitive_desc createDescriptorInternal(const dnnl::engine& engine, + const dnnl::memory::desc& inputDesc, + const dnnl::memory::desc& weightDesc, + const dnnl::memory::desc& biasDesc, + const dnnl::memory::desc& outputDesc, + bool withBiases, + const std::vector& stride, + const std::vector& dilation, + const std::vector& paddingL, + const std::vector& paddingR, + dnnl::algorithm alg, + const dnnl::primitive_attr& attr) { if (withBiases) { - return dnnl::convolution_forward::primitive_desc( - engine, - prop_kind::forward_inference, - alg, - inputDesc, weightDesc, biasDesc, outputDesc, - dnnl::memory::dims(stride.begin(), stride.end()), - dnnl::memory::dims(dilation.begin(), dilation.end()), - dnnl::memory::dims(paddingL.begin(), paddingL.end()), - dnnl::memory::dims(paddingR.begin(), paddingR.end()), - attr, - true); // allow_empty + return dnnl::convolution_forward::primitive_desc(engine, + prop_kind::forward_inference, + alg, + inputDesc, + weightDesc, + biasDesc, + outputDesc, + dnnl::memory::dims(stride.begin(), stride.end()), + dnnl::memory::dims(dilation.begin(), dilation.end()), + dnnl::memory::dims(paddingL.begin(), paddingL.end()), + dnnl::memory::dims(paddingR.begin(), paddingR.end()), + attr, + true); // allow_empty } else { - return dnnl::convolution_forward::primitive_desc( - engine, - prop_kind::forward_inference, - alg, - inputDesc, weightDesc, outputDesc, - dnnl::memory::dims(stride.begin(), stride.end()), - dnnl::memory::dims(dilation.begin(), dilation.end()), - dnnl::memory::dims(paddingL.begin(), paddingL.end()), - dnnl::memory::dims(paddingR.begin(), paddingR.end()), - attr, - true); // allow_empty + return dnnl::convolution_forward::primitive_desc(engine, + prop_kind::forward_inference, + alg, + inputDesc, + weightDesc, + outputDesc, + dnnl::memory::dims(stride.begin(), stride.end()), + dnnl::memory::dims(dilation.begin(), dilation.end()), + dnnl::memory::dims(paddingL.begin(), paddingL.end()), + dnnl::memory::dims(paddingR.begin(), paddingR.end()), + attr, + true); // allow_empty } } -} // namespace +} // namespace static memory::data_type deriveWeightDataType(memory::data_type src_dt) { memory::data_type wdt = src_dt; @@ -916,7 +961,7 @@ void Convolution::createDescriptor(const std::vector& inputDesc, if (outputDesc[0]->isDefined()) { definedOutMemDesc = MemoryDescUtils::convertToDnnlMemoryDesc(outputDesc[0]); } else { - std::vector shapes = { definedInpMemDesc->getShape(), Shape(weightDims) }; + std::vector shapes = {definedInpMemDesc->getShape(), Shape(weightDims)}; auto outDims = shapeInferGeneric(shapes); definedOutMemDesc = MemoryDescUtils::convertToDnnlMemoryDesc(outputDesc[0]->cloneWithNewDims(outDims.front())); } @@ -930,13 +975,14 @@ void Convolution::createDescriptor(const std::vector& inputDesc, dnnl::memory::desc biasDnnlDesc; if (withBiases) { - //oneDNN ARM Convolution primitive supports only identical in/out data types + // oneDNN ARM Convolution primitive supports only identical in/out data types #if defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64) memory::data_type bdt = outDnnlDesc.get_data_type(); #else memory::data_type bdt = memory::data_type::f32; #endif - biasDnnlDesc = dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(expectedBiasDims), bdt, memory::format_tag::any); + biasDnnlDesc = + dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(expectedBiasDims), bdt, memory::format_tag::any); } std::vector algorithms; @@ -948,8 +994,17 @@ void Convolution::createDescriptor(const std::vector& inputDesc, for (const auto alg : algorithms) { for (const auto& attr : attrs) { const auto desc = createDescriptorInternal(getEngine(), - inDnnlDesc, weightDnnlDesc, biasDnnlDesc, outDnnlDesc, withBiases, - stride, dilation, paddingL, paddingR, alg, attr); + inDnnlDesc, + weightDnnlDesc, + biasDnnlDesc, + outDnnlDesc, + withBiases, + stride, + dilation, + paddingL, + paddingR, + alg, + attr); descs.emplace_back(desc); } } @@ -983,7 +1038,8 @@ void Convolution::addLegacyZeroPoints(dnnl::primitive_attr& attr) { if (!legacyWeightsZeroPointsMemPtr) { DnnlBlockedMemoryDesc memoryDesc(ov::element::f32, {legacyWeightsZeroPoints.size()}); - legacyWeightsZeroPointsMemPtr = std::make_shared(getEngine(), memoryDesc, legacyWeightsZeroPoints.data()); + legacyWeightsZeroPointsMemPtr = + std::make_shared(getEngine(), memoryDesc, legacyWeightsZeroPoints.data()); } } @@ -993,7 +1049,8 @@ void Convolution::addLegacyZeroPoints(dnnl::primitive_attr& attr) { if (!legacyOutputCompensationMemPtr) { DnnlBlockedMemoryDesc memoryDesc(ov::element::i32, {legacyOutputCompensation.size()}); - legacyOutputCompensationMemPtr = std::make_shared(getEngine(), memoryDesc, legacyOutputCompensation.data()); + legacyOutputCompensationMemPtr = + std::make_shared(getEngine(), memoryDesc, legacyOutputCompensation.data()); } } } @@ -1004,7 +1061,7 @@ static bool attrContainsPostOp(const dnnl::primitive_attr& attr, const dnnl::imp } // See the src/plugins/intel_cpu/src/docs/convPostOps.md for details -void Convolution::SetPostOpsAndZeroPoints(std::vector &attrs) { +void Convolution::SetPostOpsAndZeroPoints(std::vector& attrs) { attrs.resize(1); auto outputShape = outputStaticShape(); // attr[0] - Legacy post ops + Legacy zero points. @@ -1012,14 +1069,13 @@ void Convolution::SetPostOpsAndZeroPoints(std::vector &att setPostOps(attrs[0], outputShape, true); addLegacyZeroPoints(attrs[0]); - //dw-conv would be fused into conv only on AVX2 platform. no need attr[1]. Avoid extra useless attribute. + // dw-conv would be fused into conv only on AVX2 platform. no need attr[1]. Avoid extra useless attribute. if (attrContainsPostOp(attrs[0], dnnl::impl::primitive_kind::convolution)) { return; } // no matter if brgconv is available, 1 attribute is enough. Avoid duplicated attribute - if (inputZeroPointType == zpType::None && - !attrContainsPostOp(attrs[0], dnnl::impl::primitive_kind::depthwise) && + if (inputZeroPointType == zpType::None && !attrContainsPostOp(attrs[0], dnnl::impl::primitive_kind::depthwise) && !attrContainsPostOp(attrs[0], dnnl::impl::primitive_kind::quantization)) { return; } @@ -1034,10 +1090,11 @@ void Convolution::SetPostOpsAndZeroPoints(std::vector &att } // Try 2 attributes. attrs.resize(2); - if (inputZeroPointType == zpType::PerTensor && dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core_amx)) { - //WR to ONEDNN limitation. attr[1] - legacy post ops + stock zero point. + if (inputZeroPointType == zpType::PerTensor && + dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core_amx)) { + // WR to ONEDNN limitation. attr[1] - legacy post ops + stock zero point. //@todo:Unify to use binary postops+stock zero point when limitation is fixed. - //For now, have to adapt to JIT_AMX kernel for performance. + // For now, have to adapt to JIT_AMX kernel for performance. DEBUG_LOG(getName(), ": set post ops, attr 1, useLegacyPostOps=true"); setPostOps(attrs[1], outputShape, true); } else { @@ -1048,7 +1105,7 @@ void Convolution::SetPostOpsAndZeroPoints(std::vector &att } void Convolution::initDescriptor(const NodeConfig& config) { - auto *selectedPD = getSelectedPrimitiveDescriptor(); + auto* selectedPD = getSelectedPrimitiveDescriptor(); if (!selectedPD) { return; @@ -1057,24 +1114,29 @@ void Convolution::initDescriptor(const NodeConfig& config) { // attr[0] for legacy post ops; // attr[1] is mostly for binaryPostops except when having per-tensor zp on AMX. const int descId = descIdx[selectedPrimitiveDescriptorIndex]; - int attrId = attrs.size() == 1 ? 0 : - descId % 2 == 0 ? 0 : 1; + int attrId = attrs.size() == 1 ? 0 : descId % 2 == 0 ? 0 : 1; preferLegacyPostOps = (attrId == 0 || (attrId == 1 && (inputZeroPointType == zpType::PerTensor) && - dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core_amx))); - //attr[0] for legacy zero point. - //attr[1] for stock per-tensor zero point. + dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::avx512_core_amx))); + // attr[0] for legacy zero point. + // attr[1] for stock per-tensor zero point. preferLegacyZeroPoint = (attrId == 0); DEBUG_LOG(getName(), - " selectedPrimitiveDescriptorIndex: ", selectedPrimitiveDescriptorIndex, - " DescIdx: ", descId, - " Selected impl type: ", selectedPD->getImplementationType(), - " Desc impl type: ", parse_impl_name(descs[descId].impl_info_str()), - " preferLegacyPostOps: ", preferLegacyPostOps, - " preferLegacyZeroPoint: ", preferLegacyZeroPoint); - - auto updateNodeConfig = [&](const NodeConfig& cfg){ + " selectedPrimitiveDescriptorIndex: ", + selectedPrimitiveDescriptorIndex, + " DescIdx: ", + descId, + " Selected impl type: ", + selectedPD->getImplementationType(), + " Desc impl type: ", + parse_impl_name(descs[descId].impl_info_str()), + " preferLegacyPostOps: ", + preferLegacyPostOps, + " preferLegacyZeroPoint: ", + preferLegacyZeroPoint); + + auto updateNodeConfig = [&](const NodeConfig& cfg) { auto updatedConfig = cfg; for (size_t i = 0; i < descInputNumbers(); i++) { @@ -1097,7 +1159,7 @@ void Convolution::initDescriptor(const NodeConfig& config) { return updatedConfig; }; - if (!canBeExecutedInInt8()) { // strided blobs are suppoted only for FP32 convolutions + if (!canBeExecutedInInt8()) { // strided blobs are suppoted only for FP32 convolutions descs.clear(); createDescriptor({config.inConfs[0].getMemDesc()}, {config.outConfs[0].getMemDesc()}); @@ -1115,7 +1177,7 @@ void Convolution::initDescriptor(const NodeConfig& config) { selectedPD->setConfig(updatedConfig); } -std::shared_ptr Convolution::getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const { +std::shared_ptr Convolution::getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const { if (idx == 1) { // report original plain layout for weight since it needs to be reordered dynamically at runtime return std::make_shared(getOriginalInputPrecisionAtPort(idx), @@ -1151,7 +1213,8 @@ ov::element::Type Convolution::getRuntimePrecision() const { for (size_t i = 0; i < std::min(getParentEdges().size(), inputsNumLimit); i++) { auto parentEdge = getParentEdgeAt(i); if (parentEdge && parentEdge->getStatus() == Edge::Status::Validated) { - inputPrecisions.emplace_back(DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); + inputPrecisions.emplace_back( + DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); } } @@ -1183,8 +1246,9 @@ bool Convolution::isNspcAvailable() const { return false; } } else { - // it was empirically observed that the nspc convolutions perform much slower than the blocked ones if the channels number more than the specific value - size_t spatialRank = ndims - 2; //two means batch dim plus channels dim + // it was empirically observed that the nspc convolutions perform much slower than the blocked ones if the + // channels number more than the specific value + size_t spatialRank = ndims - 2; // two means batch dim plus channels dim bool is1x1 = false; @@ -1195,24 +1259,24 @@ bool Convolution::isNspcAvailable() const { auto paddingRreversItr = paddingR.crbegin(); for (size_t i = 0; i < spatialRank; ++i) { - is1x1 = true - && *(weightDimsReversItr++) == 1 - && *(strideReversItr++) == 1 - && *(paddingLreversItr++) == 0 - && *(paddingRreversItr++) == 0; + is1x1 = true && *(weightDimsReversItr++) == 1 && *(strideReversItr++) == 1 && + *(paddingLreversItr++) == 0 && *(paddingRreversItr++) == 0; } } - // if the activation field size is 1x1 the avx512 1x1 nspc convolution pollutes caches so that the layer after the convolution performs slow + // if the activation field size is 1x1 the avx512 1x1 nspc convolution pollutes caches so that the layer after + // the convolution performs slow if (mayiuse(impl::cpu::x64::avx512_core) && is1x1) { auto end = inpDims.rbegin(); std::advance(end, spatialRank); - if (std::all_of(inpDims.rbegin(), end, [](size_t x) { return dimsEqualStrong(1, x); })) { + if (std::all_of(inpDims.rbegin(), end, [](size_t x) { + return dimsEqualStrong(1, x); + })) { return false; } } - unsigned thresholdNumChannels = 128u; // for avx and below + unsigned thresholdNumChannels = 128u; // for avx and below if (is1x1) { thresholdNumChannels = 2048u; } else if (mayiuse(impl::cpu::x64::avx512_core)) { @@ -1224,7 +1288,8 @@ bool Convolution::isNspcAvailable() const { return false; } if (!mayiuse(impl::cpu::x64::avx)) { - // SSE41 nspc convolutions do not support ic and oc tails yet and the blocked implementation will be much better than gemm + // SSE41 nspc convolutions do not support ic and oc tails yet and the blocked implementation will be much + // better than gemm if ((IC % 8) || (OC % 8)) { return false; } @@ -1251,7 +1316,7 @@ void Convolution::prepareParams() { OPENVINO_THROW("Input memory is undefined."); } - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (selected_pd == nullptr) OPENVINO_THROW("Preferable primitive descriptor is not set for node ", getName(), "."); @@ -1324,44 +1389,41 @@ void Convolution::prepareParams() { dnnlBiasDesc = biasDescPtr->getDnnlDesc(); } - return createDescriptorInternal( - engine, - srcDesc, - wghDesc, - dnnlBiasDesc, - dstDesc, - (biasDescPtr != nullptr), - stride, - dilation, - paddingL, - paddingR, - alg, - attr); + return createDescriptorInternal(engine, + srcDesc, + wghDesc, + dnnlBiasDesc, + dstDesc, + (biasDescPtr != nullptr), + stride, + dilation, + paddingL, + paddingR, + alg, + attr); }; - dnnl::primitive_desc prim_desc = createDnnlConvDesc( - engine, - key.inp0->getDnnlDesc(), - wghDescAny, - key.out->getDnnlDesc(), - key.bias, - key.stride, - key.dilation, - key.paddingL, - key.paddingR, - convAlg, - key.attr); + dnnl::primitive_desc prim_desc = createDnnlConvDesc(engine, + key.inp0->getDnnlDesc(), + wghDescAny, + key.out->getDnnlDesc(), + key.bias, + key.stride, + key.dilation, + key.paddingL, + key.paddingR, + convAlg, + key.attr); const bool found = DnnlExtensionUtils::find_implementation(prim_desc, key.implType); if (found) { - return std::make_shared( - prim_desc, - key.inp0->getDnnlDesc(), - key.inp1->getDnnlDesc(), - key.out->getDnnlDesc(), - engine, - key.constWeight); + return std::make_shared(prim_desc, + key.inp0->getDnnlDesc(), + key.inp1->getDnnlDesc(), + key.out->getDnnlDesc(), + engine, + key.constWeight); } // primitive desc with proper implementation type not found, use the first available @@ -1372,40 +1434,37 @@ void Convolution::prepareParams() { key.out->getDataType(), memory::format_tag::any); - auto reorderConvDesc = createDnnlConvDesc( - engine, - inDesc, - wghDescAny, - outDesc, - key.bias, - key.stride, - key.dilation, - key.paddingL, - key.paddingR, - convAlg, - key.attr); + auto reorderConvDesc = createDnnlConvDesc(engine, + inDesc, + wghDescAny, + outDesc, + key.bias, + key.stride, + key.dilation, + key.paddingL, + key.paddingR, + convAlg, + key.attr); // unable to create a primitive desc if (!reorderConvDesc) return nullptr; if (key.attr.get()->post_ops_.count(dnnl::impl::primitive_kind::sum)) { - return std::make_shared( - reorderConvDesc, - key.inp0->getDnnlDesc(), - key.inp1->getDnnlDesc(), - key.out->getDnnlDesc(), - engine, - key.constWeight); + return std::make_shared(reorderConvDesc, + key.inp0->getDnnlDesc(), + key.inp1->getDnnlDesc(), + key.out->getDnnlDesc(), + engine, + key.constWeight); } - return std::make_shared( - reorderConvDesc, - key.inp0->getDnnlDesc(), - key.inp1->getDnnlDesc(), - key.out->getDnnlDesc(), - engine, - key.constWeight); + return std::make_shared(reorderConvDesc, + key.inp0->getDnnlDesc(), + key.inp1->getDnnlDesc(), + key.out->getDnnlDesc(), + engine, + key.constWeight); }; auto prevExecPtr = execPtr; @@ -1460,7 +1519,8 @@ Convolution::ConvolutionExecutor::ConvolutionExecutor(const dnnl::primitive_desc const dnnl::memory::desc& weightMemDesc, const dnnl::memory::desc& outMemDesc, const dnnl::engine& engine, - bool constWeight) : DnnlExecutor(pd) { + bool constWeight) + : DnnlExecutor(pd) { if (inMemDesc != getDnnlSrcDesc()) { inputReorders.insert({DNNL_ARG_SRC, IntermReorder(inMemDesc, getDnnlSrcDesc(), engine)}); } @@ -1480,7 +1540,8 @@ Convolution::ConvolutionSumExecutor::ConvolutionSumExecutor(const dnnl::primitiv const dnnl::memory::desc& weightMemDesc, const dnnl::memory::desc& outMemDesc, const dnnl::engine& engine, - bool constWeight) : DnnlExecutor(pd) { + bool constWeight) + : DnnlExecutor(pd) { if (inMemDesc != getDnnlSrcDesc()) { inputReorders.insert({DNNL_ARG_SRC, IntermReorder(inMemDesc, getDnnlSrcDesc(), engine)}); } @@ -1498,9 +1559,10 @@ Convolution::ConvolutionSumExecutor::ConvolutionSumExecutor(const dnnl::primitiv } } -void Convolution::ConvolutionSumExecutor::reorder_exec(std::unordered_map primArgs, dnnl::stream strm) { +void Convolution::ConvolutionSumExecutor::reorder_exec(std::unordered_map primArgs, + dnnl::stream strm) { auto outputMem = primArgs.at(DNNL_ARG_DST); - for (auto &inReorder : inputReorders) { + for (auto& inReorder : inputReorders) { if (primArgs.count(inReorder.first)) { dnnl::memory memDst(inReorder.second.getDstDesc(), strm.get_engine()); inReorder.second.exec(primArgs[inReorder.first], memDst, strm); @@ -1549,14 +1611,14 @@ void Convolution::executeDynamicImpl(dnnl::stream strm) { } void Convolution::updatePadding() { - //update padding. + // update padding. if (isDynamicNode() && autoPadding) { paddingL = shapeInference->get_pads_begin(); paddingR = shapeInference->get_pads_end(); } } -void Convolution::redefineOutputMemory(const std::vector &newOutputShapes) { +void Convolution::redefineOutputMemory(const std::vector& newOutputShapes) { if (withSum) { const size_t sumPortNum = getParentEdges().size() - 1; const auto& sumInpMem = getParentEdgeAt(sumPortNum)->getMemory(); @@ -1570,7 +1632,8 @@ void Convolution::redefineOutputMemory(const std::vector &newOutputS auto inp1 = subgraph->getInput(1); inp1->redefineOutputMemory({sumInpMem.getStaticDims()}); - // here we postpone output memory reallocation due to the fact that it is the same memory with the sum second input + // here we postpone output memory reallocation due to the fact that it is the same memory with the sum + // second input return; } else { withSumBroadcast = false; @@ -1579,12 +1642,10 @@ void Convolution::redefineOutputMemory(const std::vector &newOutputS Node::redefineOutputMemory(newOutputShapes); } -MemoryDescPtr Convolution::getSumMemDesc(const primitive_desc &primitive_desc_it) { +MemoryDescPtr Convolution::getSumMemDesc(const primitive_desc& primitive_desc_it) { if (getOutputShapeAtPort(0).isDynamic()) { - // When we set input shape with ranged dims, sum node input shape maybe mismatch with output shape, we just change - // ranged min value to 1 to meet this case. - // For example: - // Output shape = {1, 160, {128, 256}, {128, 256}} + // When we set input shape with ranged dims, sum node input shape maybe mismatch with output shape, we just + // change ranged min value to 1 to meet this case. For example: Output shape = {1, 160, {128, 256}, {128, 256}} // Sum input shape = {1, 160, 1, 1} // Update sum shape to {1, 160, {1, 256}, {1, 256}} auto shape = getOutputShapeAtPort(0); @@ -1622,7 +1683,7 @@ MemoryPtr Convolution::getOutputMemory() const { } } -void Convolution::addFusedNode(const NodePtr &fusingNode) { +void Convolution::addFusedNode(const NodePtr& fusingNode) { if (Type::Eltwise == fusingNode->getType()) { if (fusingNode->getAlgorithm() == Algorithm::EltwiseAdd) { auto eltwiseNode = std::dynamic_pointer_cast(fusingNode); @@ -1655,7 +1716,6 @@ void Convolution::appendLegacyZeroPointsArgs() { } } - void Convolution::appendZeroPointsArgs() { if (stockInputZeroPointsMemPtr != nullptr) { primArgs[DNNL_ARG_ATTR_ZERO_POINTS | DNNL_ARG_SRC] = stockInputZeroPointsMemPtr->getPrimitive(); @@ -1673,10 +1733,9 @@ void Convolution::initializeInputZeroPoints(const uint8_t* inputZpData, const si inputZeroPointType = zpType::PerChannel; } // Only enable per-tensor zero point on avx512-amx and avx512-core-vnni, avx2_vnni_2. - // avx2_vnni is not enabled per-tensor z because of perf regression brgconv with per-tensor zpcompared with jit per-channel zp - // If zero point is pertensor, both legacy zp and stock zp - // would be passed into conv node. The conv node would determine how to create - // post-ops attribute and prioritize to choose final onednn kernel. + // avx2_vnni is not enabled per-tensor z because of perf regression brgconv with per-tensor zpcompared with jit + // per-channel zp If zero point is pertensor, both legacy zp and stock zp would be passed into conv node. The conv + // node would determine how to create post-ops attribute and prioritize to choose final onednn kernel. if (inputZeroPointType == zpType::PerTensor && (impl::cpu::x64::mayiuse(impl::cpu::x64::avx512_core_amx) || impl::cpu::x64::mayiuse(impl::cpu::x64::avx512_core_vnni) || impl::cpu::x64::mayiuse(impl::cpu::x64::avx2_vnni_2))) @@ -1694,15 +1753,14 @@ VectorDims Convolution::makeInputDummyShape(const Shape& inpShape) const { const size_t filterStartIndx = weightDims.size() - spatialRank; VectorDims dummyInputShapeVals(inpShape.getRank(), dummyInputDim); - dummyInputShapeVals[1] = IC; //channels + dummyInputShapeVals[1] = IC; // channels for (size_t i = 0; i < spatialRank; i++) { if (weightDims[filterStartIndx + i] > dummyInputShapeVals[2 + i]) { constexpr Dim dummyOutputDim = 16; - dummyInputShapeVals[2 + i] = (dummyOutputDim - 1) * stride[i] - - (paddingL[i] + paddingR[i]) + - weightDims[filterStartIndx + i] + - (weightDims[filterStartIndx + i]- 1) * (dilation[i]); + dummyInputShapeVals[2 + i] = (dummyOutputDim - 1) * stride[i] - (paddingL[i] + paddingR[i]) + + weightDims[filterStartIndx + i] + + (weightDims[filterStartIndx + i] - 1) * (dilation[i]); } } return MemoryDescUtils::makeDummyShape(inpShape, dummyInputShapeVals).getStaticDims(); @@ -1712,12 +1770,12 @@ VectorDims Convolution::outputStaticShape() const { auto& outputShape = getOutputShapeAtPort(0); if (outputShape.isDynamic()) { auto inpDummyShape = makeInputDummyShape(getInputShapeAtPort(0)); - auto outputDims = shapeInferGeneric({ Shape(inpDummyShape), Shape(weightDims) }); + auto outputDims = shapeInferGeneric({Shape(inpDummyShape), Shape(weightDims)}); return Shape(outputDims.front()).getStaticDims(); } return outputShape.getStaticDims(); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/conv.h b/src/plugins/intel_cpu/src/nodes/conv.h index a7cac9bced1241..8da3193e5760cf 100644 --- a/src/plugins/intel_cpu/src/nodes/conv.h +++ b/src/plugins/intel_cpu/src/nodes/conv.h @@ -29,7 +29,7 @@ class Convolution : public Node { return false; } ov::element::Type getRuntimePrecision() const override; - std::shared_ptr getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const override; + std::shared_ptr getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const override; dnnl::memory getWeights() const; dnnl::memory getBias() const; @@ -39,23 +39,35 @@ class Convolution : public Node { } bool canBeExecutedInInt8() const override; - size_t getGroupNum() const { return groupNum; } - //OV Legacy input zero point mechanism can support per-channel zero point. - //Hold legacy input zero point. + size_t getGroupNum() const { + return groupNum; + } + // OV Legacy input zero point mechanism can support per-channel zero point. + // Hold legacy input zero point. std::vector legacyInputZeroPoints; - //Hold legacy weight zero point. + // Hold legacy weight zero point. std::vector legacyWeightsZeroPoints; - //Hold legacy pre-calculated output compensation + // Hold legacy pre-calculated output compensation std::vector legacyOutputCompensation; - //Hold stock per-tensor input zero point. Pass to onednn to calculate output compensation. + // Hold stock per-tensor input zero point. Pass to onednn to calculate output compensation. std::vector inputZeroPoints; void initializeInputZeroPoints(const uint8_t* inputZpData, const size_t inputZpSize); - const VectorDims &getWeightDims() { return weightDims; } - const std::vector &getStride() { return stride; } - const std::vector &getDilation() { return dilation; } - const std::vector &getPaddingL() { return paddingL; } - const std::vector &getPaddingR() { return paddingR; } + const VectorDims& getWeightDims() { + return weightDims; + } + const std::vector& getStride() { + return stride; + } + const std::vector& getDilation() { + return dilation; + } + const std::vector& getPaddingL() { + return paddingL; + } + const std::vector& getPaddingR() { + return paddingR; + } bool canFuse(const NodePtr& node) const override; bool isDepthWise() const { @@ -64,16 +76,12 @@ class Convolution : public Node { protected: ov::element::Type fusedEltwisePrecision(const NodePtr& fusingNode) const; - void redefineOutputMemory(const std::vector &newOutputShapes) override; - void addFusedNode(const NodePtr &fusingNode) override; + void redefineOutputMemory(const std::vector& newOutputShapes) override; + void addFusedNode(const NodePtr& fusingNode) override; const std::vector& getDefaultImplPriority() override; private: - enum class zpType { - None, - PerTensor, - PerChannel - }; + enum class zpType { None, PerTensor, PerChannel }; class FusedSubgraph; using FusedSubgraphPtr = std::shared_ptr; @@ -81,26 +89,26 @@ class Convolution : public Node { executorPtr execPtr = nullptr; class ConvolutionExecutor : public DnnlExecutor { - public: - ConvolutionExecutor(const dnnl::primitive_desc& pd, - const dnnl::memory::desc& inMemDesc, - const dnnl::memory::desc& weightMemDesc, - const dnnl::memory::desc& outMemDesc, - const dnnl::engine& engine, - bool constWeight); + public: + ConvolutionExecutor(const dnnl::primitive_desc& pd, + const dnnl::memory::desc& inMemDesc, + const dnnl::memory::desc& weightMemDesc, + const dnnl::memory::desc& outMemDesc, + const dnnl::engine& engine, + bool constWeight); }; class ConvolutionSumExecutor : public DnnlExecutor { - public: - ConvolutionSumExecutor(const dnnl::primitive_desc& pd, - const dnnl::memory::desc& inMemDesc, - const dnnl::memory::desc& weightMemDesc, - const dnnl::memory::desc& outMemDesc, - const dnnl::engine& engine, - bool constWeight); - - private: - void reorder_exec(std::unordered_map primArgs, dnnl::stream strm) override; + public: + ConvolutionSumExecutor(const dnnl::primitive_desc& pd, + const dnnl::memory::desc& inMemDesc, + const dnnl::memory::desc& weightMemDesc, + const dnnl::memory::desc& outMemDesc, + const dnnl::engine& engine, + bool constWeight); + + private: + void reorder_exec(std::unordered_map primArgs, dnnl::stream strm) override; }; void prepareParams() override; @@ -108,13 +116,16 @@ class Convolution : public Node { void executeDynamicImpl(dnnl::stream strm) override; void addLegacyZeroPoints(dnnl::primitive_attr& attr); void addZeroPoints(dnnl::primitive_attr& attr); - void setPostOps(dnnl::primitive_attr &attr, const VectorDims &dims, bool useLegacyPostOps, bool initWeights = false); - void SetPostOpsAndZeroPoints(std::vector &attrs); + void setPostOps(dnnl::primitive_attr& attr, + const VectorDims& dims, + bool useLegacyPostOps, + bool initWeights = false); + void SetPostOpsAndZeroPoints(std::vector& attrs); void filterSupportedDescriptors(); bool isNspcAvailable() const; void updatePadding(); - MemoryDescPtr getSumMemDesc(const dnnl::primitive_desc &primitive_desc_it); + MemoryDescPtr getSumMemDesc(const dnnl::primitive_desc& primitive_desc_it); MemoryPtr getOutputMemory() const; VectorDims makeInputDummyShape(const Shape& inpShape) const; VectorDims outputStaticShape() const; @@ -131,7 +142,7 @@ class Convolution : public Node { zpType inputZeroPointType = zpType::None; // maps each supportedPrimitiveDescriptor to corresponding desc from descs std::vector descIdx; - VectorDims expectedBiasDims {}; + VectorDims expectedBiasDims{}; std::vector stride; std::vector dilation; @@ -179,6 +190,6 @@ class Convolution : public Node { #endif }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/convert.cpp b/src/plugins/intel_cpu/src/nodes/convert.cpp index 1987c9cc83d5f2..d01a56aac1b86d 100644 --- a/src/plugins/intel_cpu/src/nodes/convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/convert.cpp @@ -26,7 +26,8 @@ bool Convert::isSupportedOperation(const std::shared_ptr& op, st auto srcPrc = op->get_input_element_type(0); auto dstPrc = op->get_output_element_type(0); if (!CommonConvertExecutor::isSupported(srcPrc, dstPrc)) { - errorMessage = "cpu_convert can't convert from: " + srcPrc.to_string() + " precision to: " + dstPrc.to_string(); + errorMessage = + "cpu_convert can't convert from: " + srcPrc.to_string() + " precision to: " + dstPrc.to_string(); return false; } } catch (...) { @@ -36,7 +37,7 @@ bool Convert::isSupportedOperation(const std::shared_ptr& op, st } Convert::Convert(const std::shared_ptr& op, const GraphContext::CPtr context) - : Node(op, context, PassThroughShapeInferFactory()) { + : Node(op, context, PassThroughShapeInferFactory()) { std::string errorMessage; if (isSupportedOperation(op, errorMessage)) { errorPrefix = "Convert node with name '" + getName() + "'"; @@ -48,8 +49,11 @@ Convert::Convert(const std::shared_ptr& op, const GraphContext::CPtr c convertParams.origPrc = convert->get_destination_type(); } -Convert::Convert(const Shape &shape, const ov::element::Type &inPrc, const ov::element::Type &outPrc, - const std::string &nodeName, const GraphContext::CPtr context) +Convert::Convert(const Shape& shape, + const ov::element::Type& inPrc, + const ov::element::Type& outPrc, + const std::string& nodeName, + const GraphContext::CPtr context) : Node("Convert", {shape}, {shape}, {inPrc}, {outPrc}, nodeName, context) { convertParams.origPrc = outPrc; @@ -74,7 +78,7 @@ void Convert::getSupportedDescriptors() { OPENVINO_THROW(errorPrefix, " has incorrect number of output edges"); } -bool Convert::isSupportedDesc(const MemoryDesc &desc) { +bool Convert::isSupportedDesc(const MemoryDesc& desc) { bool isSupported = desc.getType() & MemoryDescType::Blocked; if (desc.getType() == MemoryDescType::DnnlBlocked) isSupported &= desc.as()->hasEmptyExtraData(); @@ -101,13 +105,16 @@ void Convert::initSupportedPrimitiveDescriptors() { MemoryDescPtr dstMemoryDesc = config.outConfs[0].getMemDesc(); convertParams.srcPrc = srcMemoryDesc->getPrecision(); convertParams.dstPrc = dstMemoryDesc->getPrecision(); - auto factory = std::make_shared(convertParams, srcMemoryDesc, dstMemoryDesc, - std::make_shared(context, getImplPriority())); + auto factory = + std::make_shared(convertParams, + srcMemoryDesc, + dstMemoryDesc, + std::make_shared(context, getImplPriority())); supportedPrimitiveDescriptors.emplace_back(config, impl_desc_type::unknown, factory); }; - // if input and output pointers are not null and not contain extra data, then the inp/output tensor descriptors were set using setDescs method, so - // they should be used as the actual descriptors. + // if input and output pointers are not null and not contain extra data, then the inp/output tensor descriptors were + // set using setDescs method, so they should be used as the actual descriptors. if (canInitExternalDesc) { dataIn.setMemDesc(input); config.inConfs.push_back(dataIn); @@ -142,8 +149,10 @@ void Convert::initSupportedPrimitiveDescriptors() { : BlockedDescCreator::makeFilteredRange(creators, insShape.getRank()); for (auto itr = range.first; itr != range.second; ++itr) { - config.inConfs[0].setMemDesc(std::make_shared(itr->second->createDesc(insPrecision, insShape))); - config.outConfs[0].setMemDesc(std::make_shared(itr->second->createDesc(outPrecision, outputShape))); + config.inConfs[0].setMemDesc( + std::make_shared(itr->second->createDesc(insPrecision, insShape))); + config.outConfs[0].setMemDesc( + std::make_shared(itr->second->createDesc(outPrecision, outputShape))); supportedPrimitiveDescriptorsBuilder(config); } @@ -159,10 +168,8 @@ void Convert::prepareParams() { auto selectedPD = getSelectedPrimitiveDescriptor(); MemoryDescPtr srcDesc = getSrcMemoryAtPort(0)->getDescPtr(); MemoryDescPtr dstDesc = getDstMemoryAtPort(0)->getDescPtr(); - execPtr = selectedPD->getExecutorFactoryAs()->makeExecutor(convertParams, - srcDesc, - dstDesc, - {}); + execPtr = + selectedPD->getExecutorFactoryAs()->makeExecutor(convertParams, srcDesc, dstDesc, {}); selectedPD->setImplementationType(execPtr->implType()); } @@ -189,6 +196,6 @@ bool Convert::created() const { return getType() == Type::Convert; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/convert.h b/src/plugins/intel_cpu/src/nodes/convert.h index 2a257bd1d31cd8..3bc911d118fd7a 100644 --- a/src/plugins/intel_cpu/src/nodes/convert.h +++ b/src/plugins/intel_cpu/src/nodes/convert.h @@ -14,8 +14,11 @@ namespace node { class Convert : public Node { public: Convert(const std::shared_ptr& op, const GraphContext::CPtr context); - Convert(const Shape &shape, const ov::element::Type &inPrc, const ov::element::Type &outPrc, - const std::string &nodeName, const GraphContext::CPtr context); + Convert(const Shape& shape, + const ov::element::Type& inPrc, + const ov::element::Type& outPrc, + const std::string& nodeName, + const GraphContext::CPtr context); void getSupportedDescriptors() override; void initSupportedPrimitiveDescriptors() override; @@ -28,22 +31,28 @@ class Convert : public Node { } // This is the interface extension designed to provide inp and output tensor descriptors without the CNNLayer. - // In that case the Convert node is instantiated with default CNNLayer and inp/out tensor descriptors are set via this method. - // This is useful if the Convert node is added to the graph as an auxiliary operation at the Graph + // In that case the Convert node is instantiated with default CNNLayer and inp/out tensor descriptors are set via + // this method. This is useful if the Convert node is added to the graph as an auxiliary operation at the Graph // initialization stage. void setDescs(const MemoryDesc& input, const MemoryDesc& output) { this->input = input.clone(); this->output = output.clone(); } - const MemoryDesc& getInput() const { return *input; } - const MemoryDesc& getOutput() const { return *output; } + const MemoryDesc& getInput() const { + return *input; + } + const MemoryDesc& getOutput() const { + return *output; + } - bool needPrepareParams() const override { return inputShapesModified(); } + bool needPrepareParams() const override { + return inputShapesModified(); + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; - static bool isSupportedDesc(const MemoryDesc &desc); + static bool isSupportedDesc(const MemoryDesc& desc); private: MemoryDescPtr input; @@ -55,6 +64,6 @@ class Convert : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.cpp b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.cpp index 0b467fe452e061..2869d782cdb445 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.cpp +++ b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.cpp @@ -2,18 +2,20 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/ctc_greedy_decoder.hpp" + #include #include -#include "openvino/op/ctc_greedy_decoder.hpp" -#include "openvino/core/parallel.hpp" #include "ctc_greedy_decoder.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { namespace node { -bool CTCGreedyDecoder::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool CTCGreedyDecoder::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto greedyDecOp = ov::as_type_ptr(op); if (!greedyDecOp) { @@ -61,8 +63,7 @@ void CTCGreedyDecoder::initSupportedPrimitiveDescriptors() { if (!one_of(seqLenPrecision, ov::element::f32, ov::element::bf16, ov::element::f16)) OPENVINO_THROW(errorPrefix, "has unsupported 'sequence_length' input precision: ", seqLenPrecision); - addSupportedPrimDesc({{LayoutType::ncsp, ov::element::f32}, - {LayoutType::ncsp, ov::element::f32}}, + addSupportedPrimDesc({{LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}}, {{LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } @@ -141,7 +142,7 @@ void CTCGreedyDecoder::execute(dnnl::stream strm) { } tStart = 0lu; } - }; // thread body + }; // thread body parallel_nt(0, threadBody); @@ -151,8 +152,7 @@ void CTCGreedyDecoder::execute(dnnl::stream strm) { const size_t sequenceLength = sequenceLengths[b]; float* shiftedOut = outputSequences + b * T; for (size_t t = 0; t < sequenceLength; ++t) { - if (*shiftedOut < blankIndex && - !(mergeRepeated && *shiftedOut == prevClassIdx)) { + if (*shiftedOut < blankIndex && !(mergeRepeated && *shiftedOut == prevClassIdx)) { outputSequences[outputIndex++] = *shiftedOut; } prevClassIdx = *shiftedOut; @@ -174,6 +174,6 @@ bool CTCGreedyDecoder::needPrepareParams() const { return false; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.h b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.h index 1f3179edb904d2..a552ff7db3c566 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.h +++ b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder.h @@ -14,7 +14,7 @@ class CTCGreedyDecoder : public Node { public: CTCGreedyDecoder(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -22,6 +22,7 @@ class CTCGreedyDecoder : public Node { bool needPrepareParams() const override; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; + private: const size_t DATA_INDEX = 0lu; const size_t SEQUENCE_LENGTH_INDEX = 1lu; @@ -30,6 +31,6 @@ class CTCGreedyDecoder : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.cpp b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.cpp index 63db3968094c3a..3eb02f2583e551 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.cpp +++ b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.cpp @@ -2,18 +2,20 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "ctc_greedy_decoder_seq_len.h" + +#include #include #include -#include #include "openvino/core/parallel.hpp" -#include "ctc_greedy_decoder_seq_len.h" namespace ov { namespace intel_cpu { namespace node { -bool CTCGreedyDecoderSeqLen::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool CTCGreedyDecoderSeqLen::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto greedyDecOp = ov::as_type_ptr(op); if (!greedyDecOp) { @@ -67,33 +69,35 @@ void CTCGreedyDecoderSeqLen::initSupportedPrimitiveDescriptors() { inDataConf.emplace_back(LayoutType::ncsp, ov::element::i32); addSupportedPrimDesc(inDataConf, - {{LayoutType::ncsp, ov::element::i32}, - {LayoutType::ncsp, ov::element::i32}}, + {{LayoutType::ncsp, ov::element::i32}, {LayoutType::ncsp, ov::element::i32}}, impl_desc_type::ref_any); } void CTCGreedyDecoderSeqLen::execute(dnnl::stream strm) { const float* probabilities = getSrcDataAtPortAs(DATA_INDEX); const int* sequenceLengths = getSrcDataAtPortAs(SEQUENCE_LENGTH_INDEX); - int* decodedClasses = getDstDataAtPortAs(DECODED_CLASSES_INDEX); + int* decodedClasses = getDstDataAtPortAs(DECODED_CLASSES_INDEX); int* decodedClassesLength = getDstDataAtPortAs(DECODED_CLASSES_LENGTH_INDEX); - const size_t B = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[0];; - const size_t T = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[1];; - const int C = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[2];; + const size_t B = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[0]; + ; + const size_t T = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[1]; + ; + const int C = getParentEdgeAt(DATA_INDEX)->getMemory().getStaticDims()[2]; + ; const size_t TC = T * C; int blankIndex = C - 1; if (inputShapes.size() > BLANK_INDEX) - blankIndex = (getSrcDataAtPortAs(BLANK_INDEX))[0]; + blankIndex = (getSrcDataAtPortAs(BLANK_INDEX))[0]; size_t workAmount = 0; for (size_t b = 0; b < B; b++) { if (sequenceLengths[b] > static_cast(T)) { - std::string errorMsg = errorPrefix - + ". Sequence length " + std::to_string(sequenceLengths[b]) - + " cannot be greater than according decoded classes dimension size " - + std::to_string(getChildEdgeAt(DECODED_CLASSES_INDEX)->getMemory().getStaticDims()[1]); + std::string errorMsg = + errorPrefix + ". Sequence length " + std::to_string(sequenceLengths[b]) + + " cannot be greater than according decoded classes dimension size " + + std::to_string(getChildEdgeAt(DECODED_CLASSES_INDEX)->getMemory().getStaticDims()[1]); OPENVINO_THROW(errorMsg); } workAmount += sequenceLengths[b]; @@ -142,7 +146,7 @@ void CTCGreedyDecoderSeqLen::execute(dnnl::stream strm) { } tStart = 0lu; } - }; // thread body + }; // thread body parallel_nt(0, threadBody); @@ -153,8 +157,7 @@ void CTCGreedyDecoderSeqLen::execute(dnnl::stream strm) { int* shiftedOut = decodedClasses + b * T; for (size_t t = 0; t < actualSeqLen; ++t) { - if (*shiftedOut != blankIndex && - !(mergeRepeated && *shiftedOut == prevClassIdx)) { + if (*shiftedOut != blankIndex && !(mergeRepeated && *shiftedOut == prevClassIdx)) { decodedClasses[outputIndex++] = *shiftedOut; } prevClassIdx = *shiftedOut; @@ -177,6 +180,6 @@ bool CTCGreedyDecoderSeqLen::needPrepareParams() const { return false; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.h b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.h index 4e7d14fd23556a..95ab8ef84b07eb 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.h +++ b/src/plugins/intel_cpu/src/nodes/ctc_greedy_decoder_seq_len.h @@ -14,7 +14,7 @@ class CTCGreedyDecoderSeqLen : public Node { public: CTCGreedyDecoderSeqLen(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -34,6 +34,6 @@ class CTCGreedyDecoderSeqLen : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_loss.cpp b/src/plugins/intel_cpu/src/nodes/ctc_loss.cpp index 6d09b0aea7e934..0ed3d95503eb62 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_loss.cpp +++ b/src/plugins/intel_cpu/src/nodes/ctc_loss.cpp @@ -2,11 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/ctc_loss.hpp" + #include -#include "openvino/op/ctc_loss.hpp" -#include "openvino/core/parallel.hpp" #include "ctc_loss.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -53,9 +54,7 @@ void CTCLoss::initSupportedPrimitiveDescriptors() { for (size_t i = 1; i < inputShapes.size(); ++i) inDataConf.emplace_back(LayoutType::ncsp, ov::element::i32); - addSupportedPrimDesc(inDataConf, - {{LayoutType::ncsp, ov::element::f32}}, - impl_desc_type::ref_any); + addSupportedPrimDesc(inDataConf, {{LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } void CTCLoss::executeDynamicImpl(dnnl::stream strm) { @@ -71,7 +70,7 @@ void CTCLoss::execute(dnnl::stream strm) { const int* labelsLength = getSrcDataAtPortAs(3); float* dstData = getDstDataAtPortAs(0); - const auto &inDims = getParentEdgeAt(0)->getMemory().getStaticDims(); + const auto& inDims = getParentEdgeAt(0)->getMemory().getStaticDims(); const size_t batchNum = inDims[0]; const size_t maxTime = inDims[1]; const size_t classesNum = inDims[2]; @@ -96,11 +95,11 @@ void CTCLoss::execute(dnnl::stream strm) { for (size_t b = start; b < end; b++) { if (logitsLength[b] < 0 || labelsLength[b] < 0 || logitsLength[b] > static_cast(maxTime) || labelsLength[b] > logitsLength[b]) { - errorMsgB[ithr] = errorPrefix + ". Logit length cannot be greater than max sequence length. " - + "Label length cannot be greater than a logit length" - + " and both cannot be negative.\nMaxSeqLen: " - + std::to_string(maxTime) + "; Logit len: " + std::to_string(logitsLength[b]) - + "; Label len: " + std::to_string(labelsLength[b]); + errorMsgB[ithr] = errorPrefix + ". Logit length cannot be greater than max sequence length. " + + "Label length cannot be greater than a logit length" + + " and both cannot be negative.\nMaxSeqLen: " + std::to_string(maxTime) + + "; Logit len: " + std::to_string(logitsLength[b]) + + "; Label len: " + std::to_string(labelsLength[b]); returnCode = -1; return; } @@ -151,8 +150,8 @@ void CTCLoss::execute(dnnl::stream strm) { for (size_t ll = 0; ll < actualLogitLen; ll++) { logProbabilities[ll].resize(decodedTargetLen); } - } // for batch - }; // threadBody_1 + } // for batch + }; // threadBody_1 parallel_nt(threads_num, threadBody_1); if (returnCode != 0) { @@ -211,7 +210,7 @@ void CTCLoss::execute(dnnl::stream strm) { } sT = 0lu; } // for batch - }; // threadBody_2 + }; // threadBody_2 parallel_nt(0, threadBody_2); @@ -236,8 +235,8 @@ void CTCLoss::execute(dnnl::stream strm) { if (start >= end) return; - // As per Connectionist Temporal Classification - Labeling Unsegmented Sequence Data with Recurrent Neural Networks: - // Graves et al., 2016, paragraph 4.1 (10) + // As per Connectionist Temporal Classification - Labeling Unsegmented Sequence Data with Recurrent Neural + // Networks: Graves et al., 2016, paragraph 4.1 (10) for (size_t b = start; b < end; b++) { auto& targetD = targetDB[b]; auto& logProbabilities = logProbabilitiesB[b]; @@ -250,21 +249,19 @@ void CTCLoss::execute(dnnl::stream strm) { for (int t = actualLogitLen - 2; t >= 0; t--) { const int t_1 = t + 1; for (int s = std::max(0, decodedTargetLen - (2 * (actualLogitLen - t))); - s < std::min(decodedTargetLen, 2 * (t_1)); s++) { + s < std::min(decodedTargetLen, 2 * (t_1)); + s++) { if (ctcMergeRepeated || targetD[s] == blankIndex) { - logBwd[s][t] = sumLogs(logBwd[s][t], - logBwd[s][t_1] + logProbabilities[t_1][s]); + logBwd[s][t] = sumLogs(logBwd[s][t], logBwd[s][t_1] + logProbabilities[t_1][s]); } if (s + 1 < decodedTargetLen) { - logBwd[s][t] = sumLogs(logBwd[s][t], - logBwd[s + 1][t_1] + logProbabilities[t_1][s + 1]); + logBwd[s][t] = sumLogs(logBwd[s][t], logBwd[s + 1][t_1] + logProbabilities[t_1][s + 1]); } if (s + 2 < decodedTargetLen) { if (targetD[s] != blankIndex && (!ctcMergeRepeated || (targetD[s] != targetD[s + 2]))) { - logBwd[s][t] = sumLogs(logBwd[s][t], - logBwd[s + 2][t_1] + logProbabilities[t_1][s + 2]); + logBwd[s][t] = sumLogs(logBwd[s][t], logBwd[s + 2][t_1] + logProbabilities[t_1][s + 2]); } } } @@ -274,8 +271,8 @@ void CTCLoss::execute(dnnl::stream strm) { logBwd[1][0] += logProbabilities[0][(decodedTargetLen > 1) ? 1 : 0]; dstData[b] = -sumLogs(logBwd[0][0], logBwd[1][0]); - } // for batch - }; // threadBody_3 + } // for batch + }; // threadBody_3 parallel_nt(0, threadBody_3); } @@ -284,6 +281,6 @@ bool CTCLoss::created() const { return getType() == Type::CTCLoss; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/ctc_loss.h b/src/plugins/intel_cpu/src/nodes/ctc_loss.h index a07d8f0fc59479..d1a66df3b92b89 100644 --- a/src/plugins/intel_cpu/src/nodes/ctc_loss.h +++ b/src/plugins/intel_cpu/src/nodes/ctc_loss.h @@ -14,7 +14,7 @@ class CTCLoss : public Node { public: CTCLoss(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -22,7 +22,9 @@ class CTCLoss : public Node { static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; void executeDynamicImpl(dnnl::stream strm) override; - bool needPrepareParams() const override { return false; }; + bool needPrepareParams() const override { + return false; + }; private: bool ctcMergeRepeated; @@ -32,6 +34,6 @@ class CTCLoss : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/cum_sum.cpp b/src/plugins/intel_cpu/src/nodes/cum_sum.cpp index e411283e661585..43e69e29916430 100644 --- a/src/plugins/intel_cpu/src/nodes/cum_sum.cpp +++ b/src/plugins/intel_cpu/src/nodes/cum_sum.cpp @@ -3,15 +3,16 @@ // #include "cum_sum.h" + +#include +#include + #include "openvino/core/parallel.hpp" #include "openvino/core/type/float16.hpp" #include "openvino/opsets/opset1.hpp" #include "openvino/opsets/opset3.hpp" #include "utils/bfloat16.hpp" -#include -#include - namespace ov { namespace intel_cpu { namespace node { @@ -38,10 +39,11 @@ CumSum::CumSum(const std::shared_ptr& op, const GraphContext::CPtr con errorPrefix = "CumSum layer with name '" + op->get_friendly_name() + "' "; - if ((getOriginalInputsNumber() != numOfInputs && getOriginalInputsNumber() != (numOfInputs - 1)) || getOriginalOutputsNumber() != 1) + if ((getOriginalInputsNumber() != numOfInputs && getOriginalInputsNumber() != (numOfInputs - 1)) || + getOriginalOutputsNumber() != 1) OPENVINO_THROW(errorPrefix, " has incorrect number of input/output edges!"); - const auto &dataShape = getInputShapeAtPort(CUM_SUM_DATA); + const auto& dataShape = getInputShapeAtPort(CUM_SUM_DATA); numOfDims = dataShape.getRank(); if (numOfDims < 1) { OPENVINO_THROW(errorPrefix, " doesn't support 'data' input tensor with rank: ", numOfDims); @@ -70,13 +72,19 @@ void CumSum::initSupportedPrimitiveDescriptors() { dataPrecision = getOriginalInputPrecisionAtPort(CUM_SUM_DATA); if (!one_of(dataPrecision, - ov::element::i8, ov::element::u8, - ov::element::i16, ov::element::i32, ov::element::i64, ov::element::u64, - ov::element::bf16, ov::element::f16, ov::element::f32)) + ov::element::i8, + ov::element::u8, + ov::element::i16, + ov::element::i32, + ov::element::i64, + ov::element::u64, + ov::element::bf16, + ov::element::f16, + ov::element::f32)) OPENVINO_THROW(errorPrefix, " has unsupported 'data' input precision: ", dataPrecision.get_type_name()); if (inputShapes.size() == numOfInputs) { - const auto &axisTensorPrec = getOriginalInputPrecisionAtPort(AXIS); + const auto& axisTensorPrec = getOriginalInputPrecisionAtPort(AXIS); if (axisTensorPrec != ov::element::i32 && axisTensorPrec != ov::element::i64) OPENVINO_THROW(errorPrefix, " has unsupported 'axis' input precision: ", axisTensorPrec.get_type_name()); } @@ -87,16 +95,17 @@ void CumSum::initSupportedPrimitiveDescriptors() { for (size_t i = 1; i < inputShapes.size(); ++i) inDataConf.emplace_back(LayoutType::ncsp, ov::element::i32); - addSupportedPrimDesc(inDataConf, - {{LayoutType::ncsp, dataPrecision}}, - impl_desc_type::ref_any); + addSupportedPrimDesc(inDataConf, {{LayoutType::ncsp, dataPrecision}}, impl_desc_type::ref_any); } void CumSum::execute(dnnl::stream strm) { if (inputShapes.size() == numOfInputs) axis = getAxis(getParentEdgeAt(AXIS)->getMemory(), getParentEdgeAt(CUM_SUM_DATA)->getMemory()); - OV_SWITCH(intel_cpu, CumSumExecute, this, dataPrecision, + OV_SWITCH(intel_cpu, + CumSumExecute, + this, + dataPrecision, OV_CASE(ov::element::i8, int8_t), OV_CASE(ov::element::u8, uint8_t), OV_CASE(ov::element::i16, int16_t), @@ -110,9 +119,10 @@ void CumSum::execute(dnnl::stream strm) { template void CumSum::exec() { - const auto *input = getSrcDataAtPortAs(CUM_SUM_DATA); - auto *output = getDstDataAtPortAs(0); - const VectorDims strides = getParentEdgeAt(CUM_SUM_DATA)->getMemory().getDescWithType()->getStrides(); + const auto* input = getSrcDataAtPortAs(CUM_SUM_DATA); + auto* output = getDstDataAtPortAs(0); + const VectorDims strides = + getParentEdgeAt(CUM_SUM_DATA)->getMemory().getDescWithType()->getStrides(); if (reverse) { if (exclusive) { @@ -130,16 +140,17 @@ void CumSum::exec() { } template -void CumSum::cumSum(const dataType *input, dataType *output, const VectorDims &strides) { +void CumSum::cumSum(const dataType* input, dataType* output, const VectorDims& strides) { VectorDims iterationRange(numOfDims - 1); size_t j = 0; - const auto &shape = getParentEdgeAt(CUM_SUM_DATA)->getMemory().getStaticDims(); + const auto& shape = getParentEdgeAt(CUM_SUM_DATA)->getMemory().getStaticDims(); for (size_t i = 0; i < shape.size(); i++) { if (i == axis) continue; iterationRange[j++] = shape[i]; } - size_t work_amount_dst = std::accumulate(iterationRange.begin(), iterationRange.end(), size_t(1), std::multiplies()); + size_t work_amount_dst = + std::accumulate(iterationRange.begin(), iterationRange.end(), size_t(1), std::multiplies()); parallel_nt(0, [&](const int ithr, const int nthr) { size_t start = 0, end = 0; VectorDims counters(numOfDims - 1, 0); @@ -159,32 +170,32 @@ void CumSum::cumSum(const dataType *input, dataType *output, const VectorDims &s size_t startOffset = getStartOffset(forStartOffset, strides); - const dataType *inputStart = input + startOffset; - dataType *outputStart = output + startOffset; + const dataType* inputStart = input + startOffset; + dataType* outputStart = output + startOffset; size_t offset = strides[axis]; if (reverse) { if (exclusive) { - outputStart[offset*(shape[axis] - 1)] = 0; + outputStart[offset * (shape[axis] - 1)] = 0; for (int64_t i = shape[axis] - 2; i >= 0; i--) { - outputStart[i*offset] = inputStart[(i+1)*offset] + outputStart[(i+1)*offset]; + outputStart[i * offset] = inputStart[(i + 1) * offset] + outputStart[(i + 1) * offset]; } } else { - outputStart[offset*(shape[axis] - 1)] = inputStart[offset * (shape[axis] - 1)]; + outputStart[offset * (shape[axis] - 1)] = inputStart[offset * (shape[axis] - 1)]; for (int64_t i = shape[axis] - 2; i >= 0; i--) { - outputStart[i*offset] = inputStart[i*offset] + outputStart[(i+1)*offset]; + outputStart[i * offset] = inputStart[i * offset] + outputStart[(i + 1) * offset]; } } } else { if (exclusive) { outputStart[0] = 0; for (size_t i = 1; i < shape[axis]; i++) { - outputStart[i*offset] = inputStart[(i-1)*offset] + outputStart[(i-1)*offset]; + outputStart[i * offset] = inputStart[(i - 1) * offset] + outputStart[(i - 1) * offset]; } } else { outputStart[0] = inputStart[0]; for (size_t i = 1; i < shape[axis]; i++) { - outputStart[i*offset] = inputStart[i*offset] + outputStart[(i-1)*offset]; + outputStart[i * offset] = inputStart[i * offset] + outputStart[(i - 1) * offset]; } } } @@ -219,7 +230,8 @@ inline void CumSum::parallelItStep(std::vector& counters, const std::vec } } -inline size_t CumSum::getStartOffset(const std::vector &forStartOffset, const std::vector& strides) const { +inline size_t CumSum::getStartOffset(const std::vector& forStartOffset, + const std::vector& strides) const { size_t startOffset = 0; for (size_t idx = 0; idx < forStartOffset.size(); ++idx) { startOffset += forStartOffset[idx] * strides[idx]; @@ -232,19 +244,19 @@ size_t CumSum::getAxis(const IMemory& _axis, const IMemory& _data) const { const int64_t dataShapeSize = static_cast(_data.getShape().getRank()); int64_t axisValueFromBlob = 0; switch (axisPrecision) { - case ov::element::i32 : { - const auto *axisPtr = _axis.getDataAs(); - axisValueFromBlob = static_cast(axisPtr[0]); - break; - } - case ov::element::i64 : { - const auto *axisPtr = _axis.getDataAs(); - axisValueFromBlob = axisPtr[0]; - break; - } - default : { - OPENVINO_THROW(errorPrefix, " doesn't support 'axis' input with precision: ", axisPrecision.get_type_name()); - } + case ov::element::i32: { + const auto* axisPtr = _axis.getDataAs(); + axisValueFromBlob = static_cast(axisPtr[0]); + break; + } + case ov::element::i64: { + const auto* axisPtr = _axis.getDataAs(); + axisValueFromBlob = axisPtr[0]; + break; + } + default: { + OPENVINO_THROW(errorPrefix, " doesn't support 'axis' input with precision: ", axisPrecision.get_type_name()); + } } if (axisValueFromBlob < -dataShapeSize || axisValueFromBlob > dataShapeSize - 1) OPENVINO_THROW(errorPrefix, " has axis with a value out of range: ", axisValueFromBlob); @@ -263,6 +275,6 @@ void CumSum::executeDynamicImpl(dnnl::stream strm) { execute(strm); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/cum_sum.h b/src/plugins/intel_cpu/src/nodes/cum_sum.h index b0aad351d55f93..139c7205e81fcc 100644 --- a/src/plugins/intel_cpu/src/nodes/cum_sum.h +++ b/src/plugins/intel_cpu/src/nodes/cum_sum.h @@ -14,7 +14,7 @@ class CumSum : public Node { public: CumSum(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -29,13 +29,13 @@ class CumSum : public Node { void exec(); template - void cumSum(const dataType *input, dataType *output, const std::vector &strides); + void cumSum(const dataType* input, dataType* output, const std::vector& strides); void parallelItInit(size_t start, std::vector& counters, const std::vector& iterationRange); inline void parallelItStep(std::vector& counters, const std::vector& iterationRange); - inline size_t getStartOffset(const std::vector &forStartOffset, const std::vector& strides) const; + inline size_t getStartOffset(const std::vector& forStartOffset, const std::vector& strides) const; size_t getAxis(const IMemory& _axis, const IMemory& _data) const; @@ -48,7 +48,7 @@ class CumSum : public Node { ov::element::Type dataPrecision; std::string errorPrefix; - template + template struct CumSumExecute { void operator()(CumSum* node) { node->exec(); @@ -56,6 +56,6 @@ class CumSum : public Node { }; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/deconv.cpp b/src/plugins/intel_cpu/src/nodes/deconv.cpp index 537f9111b0ceec..f30e3481afbb3d 100644 --- a/src/plugins/intel_cpu/src/nodes/deconv.cpp +++ b/src/plugins/intel_cpu/src/nodes/deconv.cpp @@ -4,16 +4,15 @@ #include "deconv.h" -#include "dnnl_extension_utils.h" #include #include -#include "common/primitive_hashing_utils.hpp" #include #include -#include "cpu/x64/cpu_isa_traits.hpp" -#include "shape_inference/shape_inference.hpp" +#include "common/primitive_hashing_utils.hpp" +#include "cpu/x64/cpu_isa_traits.hpp" +#include "dnnl_extension_utils.h" #include "eltwise.h" #include "fake_quantize.h" #include "input.h" @@ -21,16 +20,16 @@ #include "openvino/core/parallel.hpp" #include "openvino/opsets/opset1.hpp" #include "openvino/runtime/make_tensor.hpp" -#include "utils/general_utils.h" +#include "shape_inference/shape_inference.hpp" #include "utils/cpu_utils.hpp" +#include "utils/general_utils.h" #if defined(OV_CPU_WITH_ACL) -#include "executors/acl/acl_utils.hpp" -#include "utils/debug_capabilities.h" +# include "executors/acl/acl_utils.hpp" +# include "utils/debug_capabilities.h" #endif #include - #include #include @@ -40,8 +39,8 @@ namespace ov { namespace intel_cpu { namespace node { -using DefaultDeconvDescs = std::pair; +using DefaultDeconvDescs = + std::pair; using Int8DeconvDesc = dnnl::deconvolution_forward::primitive_desc; namespace { @@ -92,7 +91,7 @@ size_t DeconvKey::hash() const { return seed; } -bool DeconvKey::operator==(const DeconvKey &rhs) const { +bool DeconvKey::operator==(const DeconvKey& rhs) const { bool retVal = true; if (inp0 != rhs.inp0) { retVal = retVal && inp0 && rhs.inp0 && inp0->getDnnlDesc() == rhs.inp0->getDnnlDesc(); @@ -122,8 +121,8 @@ bool DeconvKey::operator==(const DeconvKey &rhs) const { } /** - * Deconvolution shape inference factory. It defines the input mask depending on the existence of the `output_shape` input. - * Since in case it exists, plugin should pass the input data to the shape inference function. + * Deconvolution shape inference factory. It defines the input mask depending on the existence of the `output_shape` + * input. Since in case it exists, plugin should pass the input data to the shape inference function. * */ class DeconfolutionShapeInferFactory : public ShapeInferFactory { @@ -134,16 +133,19 @@ class DeconfolutionShapeInferFactory : public ShapeInferFactory { const auto port_mask = (m_op->get_input_size() > 2) ? PortMask(2) : EMPTY_PORT_MASK; return make_shape_inference(m_op, port_mask); } + private: std::shared_ptr m_op; }; -} // namespace +} // namespace -bool Deconvolution::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool Deconvolution::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { if (std::dynamic_pointer_cast(op) == nullptr && - std::dynamic_pointer_cast(op) == nullptr) { - errorMessage = "Only opset1 ConvolutionBackpropData and GroupConvolutionBackpropData operations are supported"; + std::dynamic_pointer_cast(op) == nullptr) { + errorMessage = + "Only opset1 ConvolutionBackpropData and GroupConvolutionBackpropData operations are supported"; return false; } size_t ndims = op->get_input_partial_shape(0).rank().get_length(); @@ -151,7 +153,8 @@ bool Deconvolution::isSupportedOperation(const std::shared_ptr& errorMessage = "Only 3D, 4D and 5D blobs are supported as input"; return false; } - if (op->get_input_partial_shape(1).is_dynamic() || (op->get_input_size() > 2 && op->get_input_partial_shape(2).is_dynamic())) { + if (op->get_input_partial_shape(1).is_dynamic() || + (op->get_input_size() > 2 && op->get_input_partial_shape(2).is_dynamic())) { errorMessage = "Doesn't support dynamic shapes for 'weights' and 'output_shape' inputs"; return false; } @@ -161,8 +164,8 @@ bool Deconvolution::isSupportedOperation(const std::shared_ptr& return true; } -Deconvolution::Deconvolution(const std::shared_ptr& op, - const GraphContext::CPtr context) : Node(op, context, DeconfolutionShapeInferFactory(op)) { +Deconvolution::Deconvolution(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, DeconfolutionShapeInferFactory(op)) { std::string errorMessage; errorPrefix = "Deconvolution node with name '" + getName() + "' "; if (!isSupportedOperation(op, errorMessage)) @@ -175,7 +178,7 @@ Deconvolution::Deconvolution(const std::shared_ptr& op, IC = weightDims[0]; OC = weightDims[1]; - expectedBiasDims = {OC}; + expectedBiasDims = {OC}; groupNum = 1; withGroups = false; @@ -198,7 +201,7 @@ Deconvolution::Deconvolution(const std::shared_ptr& op, groupNum = weightDims[0]; IC = groupNum * weightDims[1]; OC = groupNum * weightDims[2]; - expectedBiasDims = {OC}; + expectedBiasDims = {OC}; withGroups = groupNum > 1; isDW = withGroups && groupNum == OC && groupNum == IC; @@ -228,8 +231,11 @@ Deconvolution::Deconvolution(const std::shared_ptr& op, lastOutputSpatialDims = ov::as_type(op->get_input_node_ptr(2))->cast_vector(); if (externOutShape && isDynamicNode()) { const auto spDimsNum = getInputShapeAtPort(0).getRank() - 2; - if (getInputShapeAtPort(2).getStaticDims()[0] != spDimsNum || (isConstOutShape && lastOutputSpatialDims.size() != spDimsNum)) { - OPENVINO_THROW(errorPrefix, "'output_shape' input has incorrect number of elements. Expected = ", spDimsNum); + if (getInputShapeAtPort(2).getStaticDims()[0] != spDimsNum || + (isConstOutShape && lastOutputSpatialDims.size() != spDimsNum)) { + OPENVINO_THROW(errorPrefix, + "'output_shape' input has incorrect number of elements. Expected = ", + spDimsNum); } } @@ -239,8 +245,10 @@ Deconvolution::Deconvolution(const std::shared_ptr& op, for (size_t i = 0; i < spatialRank; ++i) is1x1 = is1x1 && *(weightDimsReversItr++) == 1; // 1x1 deconv has some test case failed. The cause is upstream ONEDNN unsupported brgemm implementation cases are - // enabled in forked ONEDNNN https://github.com/openvinotoolkit/oneDNN/blob/117e287000b48a34a7218fcaa274a91571141728/src/common/convolution.cpp#L138. - // Some test cases on 1x1 kernel failed on accuracy check, current WA is disabling brgemm deconv implementation for such cases. + // enabled in forked ONEDNNN + // https://github.com/openvinotoolkit/oneDNN/blob/117e287000b48a34a7218fcaa274a91571141728/src/common/convolution.cpp#L138. + // Some test cases on 1x1 kernel failed on accuracy check, current WA is disabling brgemm deconv implementation for + // such cases. if (is1x1 && deconvAttrs.paddingL != deconvAttrs.paddingR) { // case1: Specify asymmetric padding explicitly asymmetricPaddingAnd1x1 = true; @@ -289,7 +297,9 @@ bool Deconvolution::canBeExecutedInInt8() const { return false; if (!impl::cpu::x64::mayiuse(impl::cpu::x64::avx512_core)) { const auto& inMaxDims = getOutputShapeAtPort(0).getMaxDims(); - if (std::any_of(inMaxDims.begin(), inMaxDims.end(), [](Dim dim) { return dim == Shape::UNDEFINED_DIM; })) { + if (std::any_of(inMaxDims.begin(), inMaxDims.end(), [](Dim dim) { + return dim == Shape::UNDEFINED_DIM; + })) { return false; } // heuristicConst = 2^26 @@ -309,7 +319,8 @@ bool Deconvolution::canBeExecutedInInt8() const { // not supported in oneDNN int channelBlock = impl::cpu::x64::mayiuse(impl::cpu::x64::avx512_core) ? 16 - : impl::cpu::x64::mayiuse(impl::cpu::x64::avx2) ? 8 : 4; + : impl::cpu::x64::mayiuse(impl::cpu::x64::avx2) ? 8 + : 4; if (withGroups && !isDW && (IC % channelBlock != 0 || OC % channelBlock != 0)) return false; if (!impl::cpu::x64::mayiuse(impl::cpu::x64::avx512_core) && deconvAttrs.stride.back() > 3) @@ -330,16 +341,18 @@ bool Deconvolution::canBeExecutedInInt8() const { bool Deconvolution::canFuse(const NodePtr& node) const { if (canBeExecutedInInt8()) return canFuseSimpleOperation(node); - // Upstream ONEDNN conv_backward_data primitive can't support any post-ops, fork onednn added depthwise support in conv_backward_data JIT implementation. - // ONEDNN deconv primitive can support most of post-ops, but the post-ops implementation details are different. - // So current deconv implementation list in onednn has 2 kinds of implements: + // Upstream ONEDNN conv_backward_data primitive can't support any post-ops, fork onednn added depthwise support in + // conv_backward_data JIT implementation. ONEDNN deconv primitive can support most of post-ops, but the post-ops + // implementation details are different. So current deconv implementation list in onednn has 2 kinds of implements: // 1. deconv implementation with JIT post-ops supported in the kernel (such as brgdeconv) - // 2. forked conv_data_backwards implementation with JIT depthwise post-ops + reference implementation for other post ops. - // Considering that some deconv fallback on the JIT implementation, we limit the post ops fusing to avoid regressions. - // Regression with stylegan2 int8 model pattern: - // none-quantzied deconv(with none-const weight) + FQ pattern fall back on JIT because of onednn limitation. (fall back ticket MFDNN-11577). - // If FQ is fused, it runs with the ref post-ops implementation. - // @todo: if onednn can ensure all the deconv run with the brgemm implementation, we can unify the fuse criteria between int8 and fp32 use cases. + // 2. forked conv_data_backwards implementation with JIT depthwise post-ops + reference implementation for other + // post ops. + // Considering that some deconv fallback on the JIT implementation, we limit the post ops fusing to avoid + // regressions. Regression with stylegan2 int8 model pattern: none-quantzied deconv(with none-const weight) + FQ + // pattern fall back on JIT because of onednn limitation. (fall back ticket MFDNN-11577). If FQ is fused, it runs + // with the ref post-ops implementation. + // @todo: if onednn can ensure all the deconv run with the brgemm implementation, we can unify the fuse criteria + // between int8 and fp32 use cases. return (fusedWith.empty() && node->canBePerformedAsScaleShift(this)); } @@ -360,8 +373,10 @@ std::pair Deconvolution::makeDummyInOutShape() { const auto& maxDims = shape.getMaxDims(); const auto& dims = shape.getDims(); for (size_t i = 0; i < dims.size() - 2; ++i) { - lastOutputSpatialDims[i] = dims[i + 2] == Shape::UNDEFINED_DIM ? std::min(maxDims[i + 2], - std::max(minDims[i + 2], static_cast(64))) : dims[i + 2]; + lastOutputSpatialDims[i] = + dims[i + 2] == Shape::UNDEFINED_DIM + ? std::min(maxDims[i + 2], std::max(minDims[i + 2], static_cast(64))) + : dims[i + 2]; } } @@ -380,14 +395,18 @@ std::pair Deconvolution::makeDummyInOutShape() { for (size_t i = 0; i < origInDims.size() - 2; i++) { if (origInDims[i + 2] == Shape::UNDEFINED_DIM && (origInMinDims[i + 2] != 0 || origInMaxDims[i + 2] != Shape::UNDEFINED_DIM)) { - // if input shape is dynamic and bounded, paddings should be computed basing on the following limitations: + // if input shape is dynamic and bounded, paddings should be computed basing on the following + // limitations: // 1. paddings must not be negative - // 2. the result padding must have such a value to keep the dummy dimensions inside the predefined interval - auto c1 = lastOutputSpatialDims[i] - deconvAttrs.outputPadding[i] - 1 - - (deconvAttrs.dilation[i] + 1) * static_cast(weightDims[wghOffset + 2 + i] - 1); + // 2. the result padding must have such a value to keep the dummy dimensions inside the + // predefined interval + auto c1 = + lastOutputSpatialDims[i] - deconvAttrs.outputPadding[i] - 1 - + (deconvAttrs.dilation[i] + 1) * static_cast(weightDims[wghOffset + 2 + i] - 1); if (origInMaxDims[i + 2] != Shape::UNDEFINED_DIM) { - auto upper_bound = deconvAttrs.stride[i] * static_cast(origInMaxDims[i + 2] - 1) - c1; + auto upper_bound = + deconvAttrs.stride[i] * static_cast(origInMaxDims[i + 2] - 1) - c1; if (upper_bound < 0) { OPENVINO_THROW(errorPrefix, ": paddings for dummy shapes can't be computed"); } @@ -403,9 +422,11 @@ std::pair Deconvolution::makeDummyInOutShape() { for (size_t i = 0; i < inputDims.size() - 2; i++) { if (origInDims[2 + i] == Shape::UNDEFINED_DIM) { - inputDims[2 + i] = (lastOutputSpatialDims[i] - (deconvAttrs.dilation[i] + 1) * - (weightDims[wghOffset + 2 + i] - 1) - 1 + paddings[i] - deconvAttrs.outputPadding[i]) / - deconvAttrs.stride[i] + 1; + inputDims[2 + i] = (lastOutputSpatialDims[i] - + (deconvAttrs.dilation[i] + 1) * (weightDims[wghOffset + 2 + i] - 1) - 1 + + paddings[i] - deconvAttrs.outputPadding[i]) / + deconvAttrs.stride[i] + + 1; } } } @@ -456,12 +477,14 @@ void Deconvolution::getSupportedDescriptors() { if (!descs.empty()) return; isInt8 = canBeExecutedInInt8(); - deconvAttrs.withBiasesParam = withBiases = externOutShape ? getOriginalInputsNumber() == 4 : getOriginalInputsNumber() == 3; + deconvAttrs.withBiasesParam = withBiases = + externOutShape ? getOriginalInputsNumber() == 4 : getOriginalInputsNumber() == 3; ov::element::Type inPrecision = getOriginalInputPrecisionAtPort(0); ov::element::Type outPrecision = getOriginalOutputPrecisionAtPort(0); if (isInt8) { - // TODO: We have to extend jit_avx512_core_x8s8s32x_deconv_fwd_kernel from oneDNN to support BF16 output data type + // TODO: We have to extend jit_avx512_core_x8s8s32x_deconv_fwd_kernel from oneDNN to support BF16 output data + // type if (ov::element::bf16 == inPrecision) inPrecision = ov::element::f32; if (ov::element::bf16 == outPrecision) @@ -475,11 +498,12 @@ void Deconvolution::getSupportedDescriptors() { auto inputDataType = DnnlExtensionUtils::ElementTypeToDataType(inPrecision); outputDataType = DnnlExtensionUtils::ElementTypeToDataType(outPrecision); if (inputDataType == memory::data_type::bf16 || outputDataType == memory::data_type::bf16) - inputDataType = outputDataType = memory::data_type::bf16; + inputDataType = outputDataType = memory::data_type::bf16; if (inputDataType == memory::data_type::f16 || outputDataType == memory::data_type::f16) - inputDataType = outputDataType = memory::data_type::f16; + inputDataType = outputDataType = memory::data_type::f16; if (!fusedWith.empty()) { - outputDataType = DnnlExtensionUtils::ElementTypeToDataType(fusedWith[fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0)); + outputDataType = DnnlExtensionUtils::ElementTypeToDataType( + fusedWith[fusedWith.size() - 1]->getOriginalOutputPrecisionAtPort(0)); } if (getParentEdges().size() != (withBiases ? (biasPort + 1) : biasPort)) { OPENVINO_THROW(errorPrefix, " has incorrect number of input edges"); @@ -489,7 +513,7 @@ void Deconvolution::getSupportedDescriptors() { } VectorDims inDims, outDims; std::tie(inDims, outDims) = makeDummyInOutShape(); - inShape = Shape(inDims); + inShape = Shape(inDims); outShape = Shape(outDims); initPaddingR(inShape, outShape); @@ -505,17 +529,18 @@ void Deconvolution::getSupportedDescriptors() { config.outConfs.resize(getOriginalOutputsNumber()); // ACL use same precision for all inputs config.inConfs[0].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(0))); + creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(0))); config.inConfs[1].setMemDesc( - creatorsMap.at(weights_format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(1))); + creatorsMap.at(weights_format) + ->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(1))); for (size_t i = 2; i < getParentEdges().size(); ++i) { config.inConfs[i].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(i))); + creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(i))); } for (size_t i = 0; i < config.outConfs.size(); ++i) { config.outConfs[i].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalOutputPrecisionAtPort(0), getOutputShapeAtPort(i))); + creatorsMap.at(format)->createSharedDesc(getOriginalOutputPrecisionAtPort(0), getOutputShapeAtPort(i))); } std::vector srcMemoryDescs; @@ -532,7 +557,8 @@ void Deconvolution::getSupportedDescriptors() { return AclDeconvExecutorBuilder::customIsSupported(deconvAttrs, srcMemoryDescs, dstMemoryDescs); }; useACL = checkDesc(LayoutType::nspc) || checkDesc(LayoutType::ncsp); - if (useACL) return; + if (useACL) + return; #endif dnnlCompatibleWeiDims = getWeightDims(); // Construct the ONEDNN deconv OP weight shape. @@ -547,26 +573,30 @@ void Deconvolution::getSupportedDescriptors() { auto format = rank == 5 ? dnnl::memory::format_tag::ndhwc : rank == 4 ? dnnl::memory::format_tag::nhwc : dnnl::memory::format_tag::nwc; - MemoryDescPtr in_candidate = std::make_shared(getInputShapeAtPort(0), inputDataType, format); - MemoryDescPtr out_candidate = std::make_shared(getOutputShapeAtPort(0), outputDataType, format); + MemoryDescPtr in_candidate = + std::make_shared(getInputShapeAtPort(0), inputDataType, format); + MemoryDescPtr out_candidate = + std::make_shared(getOutputShapeAtPort(0), outputDataType, format); createDescriptor({in_candidate}, {out_candidate}); } else { for (auto format : getAvailableFormatsForDims(getInputShapeAtPort(0))) { - MemoryDescPtr in_candidate = std::make_shared(getInputShapeAtPort(0), inputDataType, format); - MemoryDescPtr out_candidate = std::make_shared(getOutputShapeAtPort(0), outputDataType, format); + MemoryDescPtr in_candidate = + std::make_shared(getInputShapeAtPort(0), inputDataType, format); + MemoryDescPtr out_candidate = + std::make_shared(getOutputShapeAtPort(0), outputDataType, format); createDescriptor({in_candidate}, {out_candidate}); } } } -void Deconvolution::initPaddingR(const Shape &inShape, const Shape &outShape) { +void Deconvolution::initPaddingR(const Shape& inShape, const Shape& outShape) { for (size_t i = 0; i < deconvAttrs.paddingR.size(); i++) { int with_group = getAlgorithm() == Algorithm::DeconvolutionGrouped ? 1 : 0; const auto& weightDims = getWeightDims(); int krn = weightDims[with_group + 2 + i]; int src = outShape.getStaticDims()[2 + i]; int dst = inShape.getStaticDims()[2 + i]; - krn = (krn - 1)*(deconvAttrs.dilation[i] + 1) + 1; + krn = (krn - 1) * (deconvAttrs.dilation[i] + 1) + 1; deconvAttrs.paddingR[i] = (dst - 1) * deconvAttrs.stride[i] - (src - krn + deconvAttrs.paddingL[i]); } } @@ -584,11 +614,22 @@ void Deconvolution::setPostOps(dnnl::primitive_attr& attr, const VectorDims& dim // For deconv OP, Deconv_OC = IC, Deconv_IC = OC. // Openvino per-channel weight scales are applied on IC/Deconv_OC dimension. // So for deconvolution, - // Weight dims in NON-Group deconv: [Deconv_OC, Deconv_IC, KH, KW], perchannel weight scale is applied on Deconv_OC DIM + // Weight dims in NON-Group deconv: [Deconv_OC, Deconv_IC, KH, KW], perchannel weight scale is applied on Deconv_OC + // DIM // weiScaleMaskPerChannel = 1 << 0 - // Weight dims in Group deconv: [Group, Deconv_OC, Deconv_IC, KH, KW], perchannel weight scale is applied on GROUP and Deconv_OC, + // Weight dims in Group deconv: [Group, Deconv_OC, Deconv_IC, KH, KW], perchannel weight scale is applied on + // GROUP and Deconv_OC, // weiScaleMaskPerChannel = ( 1 << 0 | 1 << 1) = 0x03 - DnnlPostOpsComposerLegacy dnnlpoc(getEngine(), attr, ops, postOpsArgs, dims, 1, isInt8, withGroups ? 3 : 1 << 0, getDQScales(), withBiases); + DnnlPostOpsComposerLegacy dnnlpoc(getEngine(), + attr, + ops, + postOpsArgs, + dims, + 1, + isInt8, + withGroups ? 3 : 1 << 0, + getDQScales(), + withBiases); for (size_t i = 0; i < fusedWith.size(); ++i) { auto& node = fusedWith[i]; @@ -633,7 +674,7 @@ bool Deconvolution::needShapeInfer() const { return false; } -VectorDims Deconvolution::shapeInferInternal(const VectorDims &inDims, std::vector outSpDims) const { +VectorDims Deconvolution::shapeInferInternal(const VectorDims& inDims, std::vector outSpDims) const { std::vector> inputShapesRefs{std::ref(inDims), std::ref(getWeightDims())}; std::unordered_map inputValues; VectorDims outSpDimsVecShape; @@ -678,7 +719,7 @@ void Deconvolution::execute(dnnl::stream strm) { for (size_t i = 0; i < getOriginalOutputsNumber(); i++) { dstMemory.push_back(getDstMemoryAtPort(i)); } - //TODO: need to pass post ops data + // TODO: need to pass post ops data execPtrDeconvACL->exec(srcMemory, dstMemory, nullptr); return; } @@ -696,43 +737,50 @@ void Deconvolution::execute(dnnl::stream strm) { namespace { dnnl::primitive_desc createDescriptorInternal(const dnnl::memory::desc& in_candidate, - const dnnl::memory::desc& wgh_candidate, - const dnnl::memory::desc& bias_candidate, - const dnnl::memory::desc& out_candidate, - const bool with_bias, - const std::vector& stride, - const std::vector& dilation, - const ov::CoordinateDiff& paddingL, - const ov::CoordinateDiff& paddingR, - const dnnl::primitive_attr& attr, - const dnnl::engine& engine) { - auto convertDims = [] (const std::vector& orig_dims) { + const dnnl::memory::desc& wgh_candidate, + const dnnl::memory::desc& bias_candidate, + const dnnl::memory::desc& out_candidate, + const bool with_bias, + const std::vector& stride, + const std::vector& dilation, + const ov::CoordinateDiff& paddingL, + const ov::CoordinateDiff& paddingR, + const dnnl::primitive_attr& attr, + const dnnl::engine& engine) { + auto convertDims = [](const std::vector& orig_dims) { return memory::dims(orig_dims.begin(), orig_dims.end()); }; if (with_bias) { - return dnnl::deconvolution_forward::primitive_desc( - engine, - prop_kind::forward_inference, - dnnl::algorithm::deconvolution_direct, - in_candidate, wgh_candidate, bias_candidate, out_candidate, - convertDims(stride), convertDims(dilation), - convertDims(paddingL), convertDims(paddingR), - attr); + return dnnl::deconvolution_forward::primitive_desc(engine, + prop_kind::forward_inference, + dnnl::algorithm::deconvolution_direct, + in_candidate, + wgh_candidate, + bias_candidate, + out_candidate, + convertDims(stride), + convertDims(dilation), + convertDims(paddingL), + convertDims(paddingR), + attr); } else { - return dnnl::deconvolution_forward::primitive_desc( - engine, - prop_kind::forward_inference, - dnnl::algorithm::deconvolution_direct, - in_candidate, wgh_candidate, out_candidate, - convertDims(stride), convertDims(dilation), - convertDims(paddingL), convertDims(paddingR), - attr); + return dnnl::deconvolution_forward::primitive_desc(engine, + prop_kind::forward_inference, + dnnl::algorithm::deconvolution_direct, + in_candidate, + wgh_candidate, + out_candidate, + convertDims(stride), + convertDims(dilation), + convertDims(paddingL), + convertDims(paddingR), + attr); } } -} // namespace +} // namespace -Node::AttrPtr Deconvolution::makePrimitiveAttr(const VectorDims &dims) { +Node::AttrPtr Deconvolution::makePrimitiveAttr(const VectorDims& dims) { auto attr = std::make_shared(dnnl::primitive_attr()); setPostOps(*attr, dims); @@ -747,81 +795,61 @@ Node::AttrPtr Deconvolution::initPrimitiveAttr() { const std::vector& Deconvolution::getDefaultImplPriority() { static const std::vector priorities { impl_desc_type::unknown, - // Undef impl type is used to express use-cases there real type is unkown during compilation - // Undef has higher priority than defined types in order to force primitive selection logic to make decision based on other properties - impl_desc_type::undef, - impl_desc_type::brgconv_avx512_amx_1x1, - impl_desc_type::brgconv_avx512_amx, - impl_desc_type::jit_avx512_amx_dw, - impl_desc_type::jit_avx512_amx_1x1, - impl_desc_type::jit_avx512_amx, - impl_desc_type::brgconv_avx512_1x1, - impl_desc_type::brgconv_avx512, - impl_desc_type::jit_avx512_dw, - impl_desc_type::jit_avx512_1x1, - impl_desc_type::jit_avx512, - impl_desc_type::brgconv_avx2_1x1, - impl_desc_type::brgconv_avx2, - impl_desc_type::jit_uni_dw, - impl_desc_type::jit_uni_1x1, - impl_desc_type::jit_uni, - impl_desc_type::jit_avx2_dw, - impl_desc_type::jit_avx2_1x1, - impl_desc_type::jit_avx2, - impl_desc_type::jit_avx_dw, - impl_desc_type::jit_avx_1x1, - impl_desc_type::jit_avx, - impl_desc_type::jit_sse42_dw, - impl_desc_type::jit_sse42_1x1, - impl_desc_type::jit_sse42, + // Undef impl type is used to express use-cases there real type is unkown during compilation + // Undef has higher priority than defined types in order to force primitive selection logic to make decision + // based on other properties + impl_desc_type::undef, impl_desc_type::brgconv_avx512_amx_1x1, impl_desc_type::brgconv_avx512_amx, + impl_desc_type::jit_avx512_amx_dw, impl_desc_type::jit_avx512_amx_1x1, impl_desc_type::jit_avx512_amx, + impl_desc_type::brgconv_avx512_1x1, impl_desc_type::brgconv_avx512, impl_desc_type::jit_avx512_dw, + impl_desc_type::jit_avx512_1x1, impl_desc_type::jit_avx512, impl_desc_type::brgconv_avx2_1x1, + impl_desc_type::brgconv_avx2, impl_desc_type::jit_uni_dw, impl_desc_type::jit_uni_1x1, + impl_desc_type::jit_uni, impl_desc_type::jit_avx2_dw, impl_desc_type::jit_avx2_1x1, + impl_desc_type::jit_avx2, impl_desc_type::jit_avx_dw, impl_desc_type::jit_avx_1x1, impl_desc_type::jit_avx, + impl_desc_type::jit_sse42_dw, impl_desc_type::jit_sse42_1x1, impl_desc_type::jit_sse42, #if defined(OPENVINO_ARCH_ARM64) - impl_desc_type::jit_asimd, + impl_desc_type::jit_asimd, #endif - impl_desc_type::gemm_any, - impl_desc_type::gemm_blas, - impl_desc_type::gemm_avx512, - impl_desc_type::gemm_avx2, - impl_desc_type::gemm_avx, - impl_desc_type::gemm_sse42, - impl_desc_type::gemm_acl, - impl_desc_type::acl, - impl_desc_type::jit_gemm, - impl_desc_type::ref_any, - impl_desc_type::ref, + impl_desc_type::gemm_any, impl_desc_type::gemm_blas, impl_desc_type::gemm_avx512, impl_desc_type::gemm_avx2, + impl_desc_type::gemm_avx, impl_desc_type::gemm_sse42, impl_desc_type::gemm_acl, impl_desc_type::acl, + impl_desc_type::jit_gemm, impl_desc_type::ref_any, impl_desc_type::ref, }; if (!asymmetricPaddingAnd1x1) return priorities; static const std::vector priorities_wo_brgemm = [&] { - std::vectorresult; - std::copy_if(priorities.begin(), priorities.end(), std::back_inserter(result), - [](impl_desc_type type) { return !(type & impl_desc_type::brgconv); }); - return result;}(); + std::vector result; + std::copy_if(priorities.begin(), priorities.end(), std::back_inserter(result), [](impl_desc_type type) { + return !(type & impl_desc_type::brgconv); + }); + return result; + }(); return priorities_wo_brgemm; } bool Deconvolution::isImplicit1x1PaddingAsymmetric(const VectorDims& inputDims) { - auto isZero = [](std::ptrdiff_t i) { return i == 0; }; + auto isZero = [](std::ptrdiff_t i) { + return i == 0; + }; size_t spatialRank = getInputShapeAtPort(0).getRank() - 2; - if (is1x1 && std::all_of(deconvAttrs.paddingR.begin(), deconvAttrs.paddingR.end(), isZero) - && std::all_of(deconvAttrs.paddingL.begin(), deconvAttrs.paddingL.end(), isZero) - && std::all_of(deconvAttrs.outputPadding.begin(), deconvAttrs.outputPadding.end(), isZero) - ) { - auto calPaddingEnd = [](int64_t i, int64_t o, int64_t s) -> int64_t { - // Accoriding to https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html, - // output[i] = (input[i] -1) * stride[i] - 2 x padding[i] + dilation[i] x (kernel_size[i] - 1) + output_padding[i] + 1. - // When kernel_size[i] = 1, output_padding = 0, output[i] = (input[i] -1) * stride[i] - 2 x padding[i] + 1. - // implicit padding end = 2 x padding[i] = (input[i] -1) * stride[i] + 1 - output[i] - return (i - 1) * s + 1 - o;}; - for (size_t i = 0; i < spatialRank; i++) { - int64_t inputDim = static_cast(inputDims[i + 2]); - int64_t outputDim = static_cast(lastOutputSpatialDims[i]); - int64_t stride = static_cast(deconvAttrs.stride[i]); - if (calPaddingEnd(inputDim, outputDim, stride) > 0) { - return true; - } + if (is1x1 && std::all_of(deconvAttrs.paddingR.begin(), deconvAttrs.paddingR.end(), isZero) && + std::all_of(deconvAttrs.paddingL.begin(), deconvAttrs.paddingL.end(), isZero) && + std::all_of(deconvAttrs.outputPadding.begin(), deconvAttrs.outputPadding.end(), isZero)) { + auto calPaddingEnd = [](int64_t i, int64_t o, int64_t s) -> int64_t { + // Accoriding to https://pytorch.org/docs/stable/generated/torch.nn.ConvTranspose2d.html, + // output[i] = (input[i] -1) * stride[i] - 2 x padding[i] + dilation[i] x (kernel_size[i] - 1) + + // output_padding[i] + 1. When kernel_size[i] = 1, output_padding = 0, output[i] = (input[i] -1) * stride[i] + // - 2 x padding[i] + 1. implicit padding end = 2 x padding[i] = (input[i] -1) * stride[i] + 1 - output[i] + return (i - 1) * s + 1 - o; + }; + for (size_t i = 0; i < spatialRank; i++) { + int64_t inputDim = static_cast(inputDims[i + 2]); + int64_t outputDim = static_cast(lastOutputSpatialDims[i]); + int64_t stride = static_cast(deconvAttrs.stride[i]); + if (calPaddingEnd(inputDim, outputDim, stride) > 0) { + return true; } + } } return false; } @@ -854,8 +882,10 @@ void Deconvolution::prepareParams() { dstMemoryDescs.push_back(getChildEdgeAt(i)->getMemory().getDescWithType()); } - execPtrDeconvACL = selected_pd->getExecutorFactoryAs()->makeExecutor(deconvAttrs, srcMemoryDescs, - dstMemoryDescs, *attr); + execPtrDeconvACL = selected_pd->getExecutorFactoryAs()->makeExecutor(deconvAttrs, + srcMemoryDescs, + dstMemoryDescs, + *attr); selected_pd->setImplementationType(execPtrDeconvACL->getImplType()); return; } @@ -891,7 +921,7 @@ void Deconvolution::prepareParams() { OPENVINO_THROW("Bias memory memory is undefined."); biasDesc = biasMemPtr->getDescWithType(); } - bool is1x1PaddingAsymmetric = false; + bool is1x1PaddingAsymmetric = false; if (externOutShape && (!isConstOutShape || isDynamicNode())) { // Check implicit asymmetric padding case for dynamic case and runtime output shape. is1x1PaddingAsymmetric = isImplicit1x1PaddingAsymmetric(getSrcMemoryAtPort(0)->getShape().getStaticDims()); @@ -917,34 +947,41 @@ void Deconvolution::prepareParams() { dnnl::memory::desc dnnlBiasDesc; const auto& weiDims = key.inp1->getShape().getStaticDims(); const auto srcDataType = key.inp0->getDataType(); - const auto weiDataType = (one_of(srcDataType, memory::data_type::s8, memory::data_type::u8)) ? - memory::data_type::s8 : srcDataType; + const auto weiDataType = + (one_of(srcDataType, memory::data_type::s8, memory::data_type::u8)) ? memory::data_type::s8 : srcDataType; auto wghDescAny = - dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(weiDims), - weiDataType, - memory::format_tag::any); + dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(weiDims), weiDataType, memory::format_tag::any); if (key.bias) dnnlBiasDesc = key.bias->getDnnlDesc(); - desc = createDescriptorInternal(key.inp0->getDnnlDesc(), wghDescAny, dnnlBiasDesc, key.out->getDnnlDesc(), - key.bias != nullptr, key.stride, key.dilation, key.paddingL, key.paddingR, key.attr, engine); + desc = createDescriptorInternal(key.inp0->getDnnlDesc(), + wghDescAny, + dnnlBiasDesc, + key.out->getDnnlDesc(), + key.bias != nullptr, + key.stride, + key.dilation, + key.paddingL, + key.paddingR, + key.attr, + engine); primitive_desc_iterator itpd = desc; executorPtr execPtr = nullptr; while (static_cast(itpd)) { impl_desc_type impl_type = parse_impl_name(itpd.impl_info_str()); - //Skip the brgemm implemenation for asymmetric padding case because of the accuracy issue. + // Skip the brgemm implemenation for asymmetric padding case because of the accuracy issue. if (key.isImplicit1x1PaddingAsymmetric && (impl_type & impl_desc_type::brgconv)) continue; if (impl_type == key.implType) { auto prim_desc = deconvolution_forward::primitive_desc(itpd.get()); execPtr = std::make_shared(prim_desc, - key.inp0->getDnnlDesc(), - key.inp1->getDnnlDesc(), - key.out->getDnnlDesc(), - engine, - key.constWeight); + key.inp0->getDnnlDesc(), + key.inp1->getDnnlDesc(), + key.out->getDnnlDesc(), + engine, + key.constWeight); break; } @@ -954,16 +991,27 @@ void Deconvolution::prepareParams() { } if (!execPtr) { - auto inDesc = dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(key.inp0->getShape().getStaticDims()), - key.inp0->getDataType(), - memory::format_tag::any); - auto outDesc = dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(key.out->getShape().getStaticDims()), - key.out->getDataType(), - memory::format_tag::any); + auto inDesc = + dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(key.inp0->getShape().getStaticDims()), + key.inp0->getDataType(), + memory::format_tag::any); + auto outDesc = + dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(key.out->getShape().getStaticDims()), + key.out->getDataType(), + memory::format_tag::any); dnnl::primitive_desc anyDeconvDesc; - anyDeconvDesc = createDescriptorInternal(inDesc, wghDescAny, dnnlBiasDesc, outDesc, key.bias != nullptr, - key.stride, key.dilation, key.paddingL, key.paddingR, key.attr, engine); + anyDeconvDesc = createDescriptorInternal(inDesc, + wghDescAny, + dnnlBiasDesc, + outDesc, + key.bias != nullptr, + key.stride, + key.dilation, + key.paddingL, + key.paddingR, + key.attr, + engine); if (anyDeconvDesc) { auto prim_desc = deconvolution_forward::primitive_desc(anyDeconvDesc.get()); execPtr = std::make_shared(prim_desc, @@ -983,13 +1031,12 @@ void Deconvolution::prepareParams() { auto cache = context->getParamsCache(); auto result = cache->getOrCreate(key, builder); - execPtr = result.first; if (!execPtr) OPENVINO_THROW("Primitive descriptor was not found for node ", getName(), "."); primArgs[DNNL_ARG_SRC] = srcMemPtr->getPrimitive(); - primArgs[DNNL_ARG_DST]= dstMemPtr->getPrimitive(); + primArgs[DNNL_ARG_DST] = dstMemPtr->getPrimitive(); if (weightIsConst) { // const weight preparation/reordering needs to be done once at next execution // when the input weight data is guaranteed to be ready (considering possible const-folding @@ -1017,8 +1064,8 @@ void Deconvolution::prepareParams() { #endif } -void Deconvolution::createDescriptor(const std::vector &inputDesc, - const std::vector &outputDesc) { +void Deconvolution::createDescriptor(const std::vector& inputDesc, + const std::vector& outputDesc) { auto inDesc = inputDesc[0]->isDefined() ? inputDesc[0] : inputDesc[0]->cloneWithNewDims(inShape.getStaticDims()); auto dnnlInDesc = MemoryDescUtils::convertToDnnlBlockedMemoryDesc(*inDesc); const auto& in_candidate = dnnlInDesc.getDnnlDesc(); @@ -1039,26 +1086,38 @@ void Deconvolution::createDescriptor(const std::vector &inputDesc AttrPtr attr = initPrimitiveAttr(); if (withBiases) { memory::data_type bdt = memory::data_type::f32; - bias_candidate = dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(expectedBiasDims), bdt, memory::format_tag::any); + bias_candidate = + dnnl::memory::desc(DnnlExtensionUtils::convertToDnnlDims(expectedBiasDims), bdt, memory::format_tag::any); } - dnnl::memory::desc wgh_candidate(DnnlExtensionUtils::convertToDnnlDims(dnnlCompatibleWeiDims), isInt8 ? memory::data_type::s8 : dnnlInDesc.getDataType(), - memory::format_tag::any); - descs.emplace_back(createDescriptorInternal(in_candidate, wgh_candidate, bias_candidate, - out_candidate, withBiases, deconvAttrs.stride, deconvAttrs.dilation, - deconvAttrs.paddingL, deconvAttrs.paddingR, *attr, getEngine())); + dnnl::memory::desc wgh_candidate(DnnlExtensionUtils::convertToDnnlDims(dnnlCompatibleWeiDims), + isInt8 ? memory::data_type::s8 : dnnlInDesc.getDataType(), + memory::format_tag::any); + descs.emplace_back(createDescriptorInternal(in_candidate, + wgh_candidate, + bias_candidate, + out_candidate, + withBiases, + deconvAttrs.stride, + deconvAttrs.dilation, + deconvAttrs.paddingL, + deconvAttrs.paddingR, + *attr, + getEngine())); } -std::shared_ptr Deconvolution::getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const { +std::shared_ptr Deconvolution::getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const { if (idx == 2 && !withBiases) { - //Expected dest shape; + // Expected dest shape; return std::make_shared(ov::element::i32, Shape(getInputShapeAtPort(2).getStaticDims())); } else if (idx > 0) { // weight and bias are exposed with the planar layout. // we need to store 'weight' input as edge, - // because at this moment we can't simple replace internal blob with input, since we need to save weight data as is, but with different order - return std::make_shared(getOriginalInputPrecisionAtPort(idx), Shape(getInputShapeAtPort(idx).getStaticDims())); + // because at this moment we can't simple replace internal blob with input, since we need to save weight data as + // is, but with different order + return std::make_shared(getOriginalInputPrecisionAtPort(idx), + Shape(getInputShapeAtPort(idx).getStaticDims())); } - //idx =0 case + // idx =0 case auto desc = prim_desc.src_desc(idx); if (getInputShapeAtPort(idx).isDynamic()) { return DnnlExtensionUtils::makeUndefinedDesc(desc, getInputShapeAtPort(idx)); @@ -1066,8 +1125,8 @@ std::shared_ptr Deconvolution::getSrcMemDesc(const dnnl::primitive_d return DnnlExtensionUtils::makeDescriptor(desc); } -std::shared_ptr Deconvolution::getDstMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const { - auto desc = prim_desc.dst_desc(idx); +std::shared_ptr Deconvolution::getDstMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const { + auto desc = prim_desc.dst_desc(idx); if (getOutputShapeAtPort(idx).isDynamic()) { return DnnlExtensionUtils::makeUndefinedDesc(desc, getOutputShapeAtPort(idx)); } @@ -1081,7 +1140,8 @@ ov::element::Type Deconvolution::getRuntimePrecision() const { for (size_t i = 0; i < std::min(getParentEdges().size(), inputsNumLimit); i++) { auto parentEdge = getParentEdgeAt(i); if (parentEdge && parentEdge->getStatus() == Edge::Status::Validated) { - inputPrecisions.emplace_back(DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); + inputPrecisions.emplace_back( + DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); } } @@ -1089,11 +1149,12 @@ ov::element::Type Deconvolution::getRuntimePrecision() const { } Deconvolution::DeconvDNNLExecutor::DeconvDNNLExecutor(const dnnl::deconvolution_forward::primitive_desc& pd, - const dnnl::memory::desc& inMemDesc, - const dnnl::memory::desc& weightMemDesc, - const dnnl::memory::desc& outMemDesc, - const dnnl::engine& engine, - bool constWeight) : DnnlExecutor(pd) { + const dnnl::memory::desc& inMemDesc, + const dnnl::memory::desc& weightMemDesc, + const dnnl::memory::desc& outMemDesc, + const dnnl::engine& engine, + bool constWeight) + : DnnlExecutor(pd) { if (inMemDesc != getDnnlSrcDesc()) { inputReorders.insert({DNNL_ARG_SRC, IntermReorder(inMemDesc, getDnnlSrcDesc(), engine)}); } @@ -1111,7 +1172,7 @@ std::vector Deconvolution::readOutputSpatialDims() const { if (getParentEdges().size() < 3) { OPENVINO_THROW("Can't get output spatial dims. Inputs number = ", getParentEdges().size()); } - const auto &shapeMemPtr = getSrcMemoryAtPort(2); + const auto& shapeMemPtr = getSrcMemoryAtPort(2); if (!shapeMemPtr || !shapeMemPtr->isDefined()) { OPENVINO_THROW("'output_shape' input memory is undefined."); } @@ -1119,20 +1180,20 @@ std::vector Deconvolution::readOutputSpatialDims() const { if (shapeMemPtr->getStaticDims()[0] != spDimsNum) { OPENVINO_THROW("Can't read output spatial dims, beause 'output_shape' input has incorrect number of elements"); } - const int32_t *outShapePtr = shapeMemPtr->getDataAs(); + const int32_t* outShapePtr = shapeMemPtr->getDataAs(); std::vector outSpDims(outShapePtr, outShapePtr + shapeMemPtr->getStaticDims()[0]); return outSpDims; } bool Deconvolution::canFuseBias() const { - //ONEDNN deconvolution_fwd_t primitive can support bias fusing. but has different implementations. - //For the brgdeconv implementation in the deconv list, bias is implemented via JIT kernel. - //For the fall back ref implementation entry(previous conv_backward_data), bias is implemented via reference post-ops. - //It is difficult to recognize whether the deconv will run with brg or fall back to backwards data implementation on the fusing - //transformation stage. In the end, all the deconv should run with brg implement. - //And in model zoo only limited deconv has bias or other post-ops in IR. - //Based on above, enable the bias fusing for all deconv implementations. - return (externOutShape ? getParentEdges().size() == 3 : getParentEdges().size() == 2); + // ONEDNN deconvolution_fwd_t primitive can support bias fusing. but has different implementations. + // For the brgdeconv implementation in the deconv list, bias is implemented via JIT kernel. + // For the fall back ref implementation entry(previous conv_backward_data), bias is implemented via reference + // post-ops. It is difficult to recognize whether the deconv will run with brg or fall back to backwards data + // implementation on the fusing transformation stage. In the end, all the deconv should run with brg implement. And + // in model zoo only limited deconv has bias or other post-ops in IR. Based on above, enable the bias fusing for all + // deconv implementations. + return (externOutShape ? getParentEdges().size() == 3 : getParentEdges().size() == 2); } void Deconvolution::initSupportedPrimitiveDescriptors() { @@ -1143,7 +1204,7 @@ void Deconvolution::initSupportedPrimitiveDescriptors() { VectorDims inDims, outDims; std::tie(inDims, outDims) = makeDummyInOutShape(); - auto tmpInShape = Shape(inDims); + auto tmpInShape = Shape(inDims); auto tmpOutShape = Shape(outDims); initPaddingR(tmpInShape, tmpOutShape); @@ -1154,18 +1215,19 @@ void Deconvolution::initSupportedPrimitiveDescriptors() { config.outConfs.resize(getOriginalOutputsNumber()); config.inConfs[0].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(0))); + creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(0))); config.inConfs[1].setMemDesc( - creatorsMap.at(weights_format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(1))); + creatorsMap.at(weights_format) + ->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(1))); for (size_t i = 2; i < getParentEdges().size(); ++i) { config.inConfs[i].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(i))); + creatorsMap.at(format)->createSharedDesc(getOriginalInputPrecisionAtPort(0), getInputShapeAtPort(i))); } for (size_t i = 0; i < config.outConfs.size(); ++i) { config.outConfs[i].setMemDesc( - creatorsMap.at(format)->createSharedDesc(getOriginalOutputPrecisionAtPort(0), getOutputShapeAtPort(i))); + creatorsMap.at(format)->createSharedDesc(getOriginalOutputPrecisionAtPort(0), getOutputShapeAtPort(i))); } std::vector srcMemoryDescs; @@ -1179,8 +1241,11 @@ void Deconvolution::initSupportedPrimitiveDescriptors() { dstMemoryDescs.push_back(config.outConfs[i].getMemDesc()->clone()); } - auto factory = std::make_shared(deconvAttrs, srcMemoryDescs, dstMemoryDescs, - std::make_shared(context, getImplPriority())); + auto factory = + std::make_shared(deconvAttrs, + srcMemoryDescs, + dstMemoryDescs, + std::make_shared(context, getImplPriority())); supportedPrimitiveDescriptors.emplace_back(config, impl_desc_type::gemm_acl, factory); }; @@ -1188,7 +1253,6 @@ void Deconvolution::initSupportedPrimitiveDescriptors() { pushDesc(LayoutType::ncsp); } - -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/deconv.h b/src/plugins/intel_cpu/src/nodes/deconv.h index d94bcd8bcaca13..1c3e1fe8978918 100644 --- a/src/plugins/intel_cpu/src/nodes/deconv.h +++ b/src/plugins/intel_cpu/src/nodes/deconv.h @@ -29,27 +29,32 @@ class Deconvolution : public Node { return static_cast(getParentEdges().size()); } - std::shared_ptr getSrcMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const override; - std::shared_ptr getDstMemDesc(const dnnl::primitive_desc &prim_desc, size_t idx) const override; + std::shared_ptr getSrcMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const override; + std::shared_ptr getDstMemDesc(const dnnl::primitive_desc& prim_desc, size_t idx) const override; ov::element::Type getRuntimePrecision() const override; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; bool canFuse(const NodePtr& node) const override; - const VectorDims& getWeightDims() const { return getInputShapeAtPort(1).getStaticDims(); } - const std::vector& getStride() const { return deconvAttrs.stride; } + const VectorDims& getWeightDims() const { + return getInputShapeAtPort(1).getStaticDims(); + } + const std::vector& getStride() const { + return deconvAttrs.stride; + } void prepareParams() override; void execute(dnnl::stream strm) override; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } bool needShapeInfer() const override; bool canFuseBias() const; bool canBeExecutedInInt8() const override; const std::vector& getDefaultImplPriority() override; - protected: AttrPtr initPrimitiveAttr() override; AttrPtr makePrimitiveAttr(const VectorDims& dims); @@ -60,13 +65,13 @@ class Deconvolution : public Node { using executorPtr = std::shared_ptr; executorPtr execPtr = nullptr; class DeconvDNNLExecutor : public DnnlExecutor { - public: - DeconvDNNLExecutor(const dnnl::deconvolution_forward::primitive_desc& pd, - const dnnl::memory::desc& inMemDesc, - const dnnl::memory::desc& weightMemDesc, - const dnnl::memory::desc& outMemDesc, - const dnnl::engine& engine, - bool constWeight); + public: + DeconvDNNLExecutor(const dnnl::deconvolution_forward::primitive_desc& pd, + const dnnl::memory::desc& inMemDesc, + const dnnl::memory::desc& weightMemDesc, + const dnnl::memory::desc& outMemDesc, + const dnnl::engine& engine, + bool constWeight); }; bool isImplicit1x1PaddingAsymmetric(const VectorDims& inputDims); @@ -79,8 +84,8 @@ class Deconvolution : public Node { size_t IC = 0; size_t OC = 0; std::vector lastOutputSpatialDims; - VectorDims dnnlCompatibleWeiDims {}; - VectorDims expectedBiasDims {}; + VectorDims dnnlCompatibleWeiDims{}; + VectorDims expectedBiasDims{}; bool useACL = false; DeconvAttrs deconvAttrs; @@ -93,9 +98,9 @@ class Deconvolution : public Node { MemoryPtr dnnlCompatibleWeights = nullptr; std::shared_ptr attr; - void setPostOps(dnnl::primitive_attr &attr, const VectorDims &dims); - VectorDims shapeInferInternal(const VectorDims &inDims, std::vector outSpDims) const; - void initPaddingR(const Shape &inShape, const Shape &outShape); + void setPostOps(dnnl::primitive_attr& attr, const VectorDims& dims); + VectorDims shapeInferInternal(const VectorDims& inDims, std::vector outSpDims) const; + void initPaddingR(const Shape& inShape, const Shape& outShape); std::vector readOutputSpatialDims() const; std::pair makeDummyInOutShape(); bool withBiases = false; @@ -110,6 +115,6 @@ class Deconvolution : public Node { bool isConstOutShape = false; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/def_conv.cpp b/src/plugins/intel_cpu/src/nodes/def_conv.cpp index 0167a18673c444..7c5427d0def045 100644 --- a/src/plugins/intel_cpu/src/nodes/def_conv.cpp +++ b/src/plugins/intel_cpu/src/nodes/def_conv.cpp @@ -4,21 +4,20 @@ #include "def_conv.h" -#include +#include +#include +#include #include #include -#include -#include "openvino/core/parallel.hpp" -#include "memory_desc/dnnl_blocked_memory_desc.h" #include "common/primitive_hashing_utils.hpp" -#include "openvino/util/pp.hpp" - -#include "dnnl_types.h" -#include "dnnl_extension_utils.h" #include "cpu/x64/jit_generator.hpp" -#include +#include "dnnl_extension_utils.h" +#include "dnnl_types.h" +#include "memory_desc/dnnl_blocked_memory_desc.h" +#include "openvino/core/parallel.hpp" +#include "openvino/util/pp.hpp" using namespace dnnl; using namespace dnnl::impl; @@ -30,7 +29,7 @@ namespace ov { namespace intel_cpu { namespace node { #if defined(OPENVINO_ARCH_X86_64) -#define GET_OFF(field) offsetof(jit_def_conv_call_args, field) +# define GET_OFF(field) offsetof(jit_def_conv_call_args, field) template struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_generator { @@ -38,7 +37,9 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ constexpr static int sampledPointsPerPixel = DeformableConvolution::sampledPointsPerPixel; - explicit jit_uni_def_conv_kernel_f32(const jit_def_conv_params& jcp) : jit_uni_def_conv_kernel(jcp), jit_generator(jit_name()) {} + explicit jit_uni_def_conv_kernel_f32(const jit_def_conv_params& jcp) + : jit_uni_def_conv_kernel(jcp), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -72,8 +73,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ } private: - using Vmm = typename conditional3::type; + using Vmm = + typename conditional3::type; const int vlen = cpu_isa_traits::vlen; using Ymm = const Xbyak::Ymm; @@ -113,18 +114,29 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ Xbyak::Opmask ktail_mask = Xbyak::Opmask(2); - inline Xbyak::Address table_val(int index) - { return ptr[reg_table + index * vlen]; } + inline Xbyak::Address table_val(int index) { + return ptr[reg_table + index * vlen]; + } - inline Vmm get_vmm_ker(int idx) { return Vmm(idx + 0); } - inline Vmm get_vmm_src(int idx) { return Vmm(idx + 1); } - inline Vmm get_vmm_acc(int idx) { return Vmm(idx + jcp_.ur_w + 1); } - inline Ymm get_ymm_acc(int idx) { return Ymm(idx + jcp_.ur_w + 1); } - inline Xmm get_xmm_acc(int idx) { return Xmm(idx + jcp_.ur_w + 1); } + inline Vmm get_vmm_ker(int idx) { + return Vmm(idx + 0); + } + inline Vmm get_vmm_src(int idx) { + return Vmm(idx + 1); + } + inline Vmm get_vmm_acc(int idx) { + return Vmm(idx + jcp_.ur_w + 1); + } + inline Ymm get_ymm_acc(int idx) { + return Ymm(idx + jcp_.ur_w + 1); + } + inline Xmm get_xmm_acc(int idx) { + return Xmm(idx + jcp_.ur_w + 1); + } Xbyak::Label l_table; - inline void checkZeroWei(const Xbyak::Xmm &x1, Label &nullifyLabel) { + inline void checkZeroWei(const Xbyak::Xmm& x1, Label& nullifyLabel) { ptest(x1, x1); jz(nullifyLabel); } @@ -135,13 +147,16 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ mov(reg_ow_pos, 0); - L(ow_loop_main); { + L(ow_loop_main); + { cmp(reg_ow_pos, jcp_.ow - jcp_.ur_w); jg(ow_tail, T_NEAR); oc_loop(jcp_.ur_w); - add(reg_sampled_wei, jcp_.ur_w * jcp_.kh * jcp_.kw * sampledPointsPerPixel * jcp_.typesize_sampled_wei); // type = float - add(reg_sampled_offs, jcp_.ur_w * jcp_.kh * jcp_.kw * sampledPointsPerPixel * jcp_.typesize_sampled_offsets); // type = int + add(reg_sampled_wei, + jcp_.ur_w * jcp_.kh * jcp_.kw * sampledPointsPerPixel * jcp_.typesize_sampled_wei); // type = float + add(reg_sampled_offs, + jcp_.ur_w * jcp_.kh * jcp_.kw * sampledPointsPerPixel * jcp_.typesize_sampled_offsets); // type = int add(reg_output, jcp_.ur_w * jcp_.oc * jcp_.typesize_out); @@ -149,7 +164,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jmp(ow_loop_main, T_NEAR); } - L(ow_tail); { + L(ow_tail); + { if (jcp_.ow % jcp_.ur_w != 0) oc_loop(jcp_.ow % jcp_.ur_w); } @@ -191,7 +207,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ for (int ic = 0; ic < ic_step; ic++) { for (int ow = 0; ow < ow_step; ow++) { Vmm vmm_src = get_vmm_src(ow); - size_t inp_off = (size_t) ow * jcp_.kh * jcp_.kw * jcp_.ic + kh * jcp_.kw * jcp_.ic + kw * jcp_.ic + ic; + size_t inp_off = + (size_t)ow * jcp_.kh * jcp_.kw * jcp_.ic + kh * jcp_.kw * jcp_.ic + kw * jcp_.ic + ic; uni_vbroadcastss(vmm_src, ptr[aux2_reg_input_buffer + inp_off * jcp_.typesize_in]); } @@ -199,10 +216,10 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ for (int r = 0; r < repeats; r++) { for (int ocb = 0; ocb < oc_blocks_step; ocb++) { Vmm vmm_ker = get_vmm_ker(0); - size_t ker_off = (size_t) ocb * jcp_.nb_ic * jcp_.kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block + - kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block + - kw * jcp_.ic_block * jcp_.oc_block + - ic * jcp_.oc_block + r * jcp_.oc_block / 2; + size_t ker_off = + (size_t)ocb * jcp_.nb_ic * jcp_.kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block + + kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block + kw * jcp_.ic_block * jcp_.oc_block + + ic * jcp_.oc_block + r * jcp_.oc_block / 2; uni_vmovups(vmm_ker, ptr[aux2_reg_kernel + ker_off * jcp_.typesize_in]); for (int ow = 0; ow < ow_step; ow++) { @@ -248,7 +265,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ init_accums(ow_step, oc_blocks_step, oc_step); - L(ic_main_loop); { + L(ic_main_loop); + { cmp(reg_ic_iter, jcp_.ic_block); jl(ic_tail, T_NEAR); @@ -259,7 +277,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jmp(ic_main_loop, T_NEAR); } - L(ic_tail); { + L(ic_tail); + { if (jcp_.ic % jcp_.ic_block != 0) { apply_filter(ow_step, oc_blocks_step, oc_step, jcp_.ic % jcp_.ic_block); } @@ -283,7 +302,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ xor_(reg_dg_iter, reg_dg_iter); const int ic_per_def_group = jcp_.ic / jcp_.dg; - L(dg_loop); { + L(dg_loop); + { cmp(reg_dg_iter, jcp_.dg); jge(dg_loop_end, T_NEAR); @@ -326,7 +346,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ Xmm xmm_w4 = Xmm(5); Xmm xmm_v1 = Xmm(2); - Xmm xmm_v2 = Xmm(3);; + Xmm xmm_v2 = Xmm(3); + ; Xmm xmm_v3 = Xmm(6); Xmm xmm_v4 = Xmm(7); @@ -341,7 +362,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ Vmm vmm_v4 = Vmm(xmm_v4.getIdx()); // offsets computation - size_t ind_off_hh = sampledPointsPerPixel * (((size_t) kh * jcp_.kw + kw) + ow * (jcp_.kh * jcp_.kw)); + size_t ind_off_hh = + sampledPointsPerPixel * (((size_t)kh * jcp_.kw + kw) + ow * (jcp_.kh * jcp_.kw)); size_t ind_off_hl = ind_off_hh + 1; size_t ind_off_lh = ind_off_hl + 1; size_t ind_off_ll = ind_off_lh + 1; @@ -366,12 +388,16 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jl(ic_loop_tail, T_NEAR); // check zero markers - uni_vbroadcastss(xmm_v1, dword[aux_reg_sampled_wei + ind_off_ll * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v2, dword[aux_reg_sampled_wei + ind_off_hl * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v3, dword[aux_reg_sampled_wei + ind_off_lh * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v4, dword[aux_reg_sampled_wei + ind_off_hh * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v1, + dword[aux_reg_sampled_wei + ind_off_ll * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v2, + dword[aux_reg_sampled_wei + ind_off_hl * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v3, + dword[aux_reg_sampled_wei + ind_off_lh * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v4, + dword[aux_reg_sampled_wei + ind_off_hh * jcp_.typesize_sampled_wei]); - size_t input_buffer_off = (size_t) kh * jcp_.kw * jcp_.ic + kw * jcp_.ic; + size_t input_buffer_off = (size_t)kh * jcp_.kw * jcp_.ic + kw * jcp_.ic; uni_vpmovsxdq(xmm_v1_off, xmm_v1_off); uni_vmovq(reg_tmp_64, xmm_v1_off); @@ -382,9 +408,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulps(vmm_v1, vmm_v1, vmm_w1); jmp(nullify_v1_end, T_NEAR); L(nullify_v1); - { - uni_vpxor(vmm_v1, vmm_v1, vmm_v1); - } + { uni_vpxor(vmm_v1, vmm_v1, vmm_v1); } L(nullify_v1_end); uni_vpmovsxdq(xmm_v2_off, xmm_v2_off); @@ -396,9 +420,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulps(vmm_v2, vmm_v2, vmm_w2); jmp(nullify_v2_end, T_NEAR); L(nullify_v2); - { - uni_vpxor(vmm_v2, vmm_v2, vmm_v2); - } + { uni_vpxor(vmm_v2, vmm_v2, vmm_v2); } L(nullify_v2_end); uni_vpmovsxdq(xmm_v3_off, xmm_v3_off); @@ -410,9 +432,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulps(vmm_v3, vmm_v3, vmm_w3); jmp(nullify_v3_end, T_NEAR); L(nullify_v3); - { - uni_vpxor(vmm_v3, vmm_v3, vmm_v3); - } + { uni_vpxor(vmm_v3, vmm_v3, vmm_v3); } L(nullify_v3_end); uni_vpmovsxdq(xmm_v4_off, xmm_v4_off); @@ -424,9 +444,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulps(vmm_v4, vmm_v4, vmm_w4); jmp(nullify_v4_end, T_NEAR); L(nullify_v4); - { - uni_vpxor(vmm_v4, vmm_v4, vmm_v4); - } + { uni_vpxor(vmm_v4, vmm_v4, vmm_v4); } L(nullify_v4_end); uni_vaddps(vmm_v1, vmm_v1, vmm_v2); @@ -446,12 +464,16 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jl(loop_end, T_NEAR); // check zero markers - uni_vbroadcastss(xmm_v1, dword[aux_reg_sampled_wei + ind_off_ll * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v2, dword[aux_reg_sampled_wei + ind_off_hl * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v3, dword[aux_reg_sampled_wei + ind_off_lh * jcp_.typesize_sampled_wei]); - uni_vbroadcastss(xmm_v4, dword[aux_reg_sampled_wei + ind_off_hh * jcp_.typesize_sampled_wei]); - - size_t input_buffer_off = (size_t) kh * jcp_.kw * jcp_.ic + kw * jcp_.ic; + uni_vbroadcastss(xmm_v1, + dword[aux_reg_sampled_wei + ind_off_ll * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v2, + dword[aux_reg_sampled_wei + ind_off_hl * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v3, + dword[aux_reg_sampled_wei + ind_off_lh * jcp_.typesize_sampled_wei]); + uni_vbroadcastss(xmm_v4, + dword[aux_reg_sampled_wei + ind_off_hh * jcp_.typesize_sampled_wei]); + + size_t input_buffer_off = (size_t)kh * jcp_.kw * jcp_.ic + kw * jcp_.ic; uni_vpmovsxdq(xmm_v1_off, xmm_v1_off); uni_vmovq(reg_tmp_64, xmm_v1_off); imul(reg_tmp_64, reg_tmp_64, jcp_.ic * jcp_.typesize_in); @@ -461,9 +483,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulss(xmm_v1, xmm_v1, xmm_w1); jmp(nullify_v1_end_tail, T_NEAR); L(nullify_v1_tail); - { - uni_vpxor(xmm_v1, xmm_v1, xmm_v1); - } + { uni_vpxor(xmm_v1, xmm_v1, xmm_v1); } L(nullify_v1_end_tail); uni_vpmovsxdq(xmm_v2_off, xmm_v2_off); @@ -475,9 +495,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulss(xmm_v2, xmm_v2, xmm_w2); jmp(nullify_v2_end_tail, T_NEAR); L(nullify_v2_tail); - { - uni_vpxor(xmm_v2, xmm_v2, xmm_v2); - } + { uni_vpxor(xmm_v2, xmm_v2, xmm_v2); } L(nullify_v2_end_tail); uni_vpmovsxdq(xmm_v3_off, xmm_v3_off); @@ -489,9 +507,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulss(xmm_v3, xmm_v3, xmm_w3); jmp(nullify_v3_end_tail, T_NEAR); L(nullify_v3_tail); - { - uni_vpxor(xmm_v3, xmm_v3, xmm_v3); - } + { uni_vpxor(xmm_v3, xmm_v3, xmm_v3); } L(nullify_v3_end_tail); uni_vpmovsxdq(xmm_v4_off, xmm_v4_off); @@ -503,9 +519,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ uni_vmulss(xmm_v4, xmm_v4, xmm_w4); jmp(nullify_v4_end_tail, T_NEAR); L(nullify_v4_tail); - { - uni_vpxor(xmm_v4, xmm_v4, xmm_v4); - } + { uni_vpxor(xmm_v4, xmm_v4, xmm_v4); } L(nullify_v4_end_tail); uni_vaddss(xmm_v1, xmm_v1, xmm_v2); @@ -524,8 +538,10 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ } } - add(aux_reg_sampled_wei, sampledPointsPerPixel * jcp_.kh * jcp_.kw * jcp_.oh * jcp_.ow * jcp_.typesize_sampled_wei); - add(aux_reg_sampled_offs, sampledPointsPerPixel * jcp_.kh * jcp_.kw * jcp_.oh * jcp_.ow * jcp_.typesize_sampled_offsets); + add(aux_reg_sampled_wei, + sampledPointsPerPixel * jcp_.kh * jcp_.kw * jcp_.oh * jcp_.ow * jcp_.typesize_sampled_wei); + add(aux_reg_sampled_offs, + sampledPointsPerPixel * jcp_.kh * jcp_.kw * jcp_.oh * jcp_.ow * jcp_.typesize_sampled_offsets); add(aux_reg_input, ic_per_def_group * jcp_.typesize_in); add(aux2_reg_input_buffer, ic_per_def_group * jcp_.typesize_in); inc(reg_dg_iter); @@ -542,7 +558,7 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ if (jcp_.with_bias) { for (int r = 0; r < repeats; r++) { for (int ocb = 0; ocb < oc_blocks_step; ocb++) { - size_t bias_off = (size_t) ocb * jcp_.oc_block + r * jcp_.oc_block / 2; + size_t bias_off = (size_t)ocb * jcp_.oc_block + r * jcp_.oc_block / 2; uni_vmovups(Vmm(0), ptr[aux_reg_bias + bias_off * jcp_.typesize_bia]); for (int ow = 0; ow < ow_step; ow++) { @@ -560,7 +576,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ } for (int r = 0; r < repeats; r++) { - int tail_size = isa == cpu::x64::sse41 ? std::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; + int tail_size = + isa == cpu::x64::sse41 ? std::min(jcp_.oc_block / 2, oc_step - r * jcp_.oc_block / 2) : oc_step; bool is_scalar_store = isa == cpu::x64::sse41 ? tail_size < jcp_.oc_block / 2 : tail_size < jcp_.oc_block; if (is_scalar_store) { for (int ow = 0; ow < ow_step; ow++) { @@ -568,11 +585,11 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ Xmm xmm_dst = get_xmm_acc(r * jcp_.ur_w * jcp_.nb_oc_blocking + ow); if (isa == avx512_core) { - size_t out_off = (size_t) ow * jcp_.oc; + size_t out_off = (size_t)ow * jcp_.oc; uni_vmovups(ptr[aux_reg_output + out_off * jcp_.typesize_out], vmm_dst | ktail_mask); } else { for (int oc = 0; oc < tail_size; oc++) { - size_t out_off = (size_t) ow * jcp_.oc + oc + r * (jcp_.oc_block / 2); + size_t out_off = (size_t)ow * jcp_.oc + oc + r * (jcp_.oc_block / 2); uni_vmovq(reg_tmp_64, xmm_dst); mov(ptr[aux_reg_output + out_off * jcp_.typesize_out], reg_tmp_32); @@ -593,7 +610,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ for (int ocb = 0; ocb < oc_blocks_step; ocb++) { for (int ow = 0; ow < ow_step; ow++) { Vmm vmm_acc = get_vmm_acc(r * jcp_.ur_w * jcp_.nb_oc_blocking + ocb * ow_step + ow); - size_t out_off = (size_t) ow * jcp_.oc * jcp_.ngroups + ocb * jcp_.oc_block + r * (jcp_.oc_block / 2); + size_t out_off = + (size_t)ow * jcp_.oc * jcp_.ngroups + ocb * jcp_.oc_block + r * (jcp_.oc_block / 2); uni_vmovups(ptr[aux_reg_output + out_off * jcp_.typesize_out], vmm_acc); } } @@ -629,14 +647,17 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ mov(aux_reg_bias, reg_bias); mov(reg_oc_work, jcp_.oc); - L(oc_unrolled_loop); { + L(oc_unrolled_loop); + { cmp(reg_oc_work, jcp_.nb_oc_blocking * jcp_.oc_block); jl(oc_main_loop, T_NEAR); ic_loop(ow_step, jcp_.nb_oc_blocking, jcp_.oc_block); store_output(ow_step, jcp_.nb_oc_blocking, jcp_.oc_block); - add(aux_reg_kernel, jcp_.nb_oc_blocking * jcp_.nb_ic * jcp_.kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block * jcp_.typesize_in); + add(aux_reg_kernel, + jcp_.nb_oc_blocking * jcp_.nb_ic * jcp_.kh * jcp_.kw * jcp_.ic_block * jcp_.oc_block * + jcp_.typesize_in); add(aux_reg_output, jcp_.nb_oc_blocking * jcp_.oc_block * jcp_.typesize_out); add(aux_reg_bias, jcp_.nb_oc_blocking * jcp_.oc_block * jcp_.typesize_bia); sub(reg_oc_work, jcp_.nb_oc_blocking * jcp_.oc_block); @@ -644,7 +665,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jmp(oc_unrolled_loop, T_NEAR); } - L(oc_main_loop); { + L(oc_main_loop); + { cmp(reg_oc_work, jcp_.oc_block); jl(oc_tail, T_NEAR); @@ -659,7 +681,8 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ jmp(oc_main_loop, T_NEAR); } - L(oc_tail); { + L(oc_tail); + { if (jcp_.oc % jcp_.oc_block != 0) { ic_loop(ow_step, 1, jcp_.oc % jcp_.oc_block); store_output(ow_step, 1, jcp_.oc % jcp_.oc_block); @@ -672,11 +695,12 @@ struct jit_uni_def_conv_kernel_f32 : public jit_uni_def_conv_kernel, public jit_ } }; #endif -bool DeformableConvolution::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool DeformableConvolution::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { if (!one_of(op->get_type_info(), - ov::op::v1::DeformableConvolution::get_type_info_static(), - ov::op::v8::DeformableConvolution::get_type_info_static())) { + ov::op::v1::DeformableConvolution::get_type_info_static(), + ov::op::v8::DeformableConvolution::get_type_info_static())) { errorMessage = "Node is not an instance of DeformableConvolution form the operation set v1 or v8."; return false; } @@ -721,16 +745,16 @@ size_t DefConvKey::hash() const { return seed; } -bool DefConvKey::operator==(const DefConvKey &rhs) const { +bool DefConvKey::operator==(const DefConvKey& rhs) const { bool retVal = true; for (size_t i = 0; i < descVector.size(); i++) { if (descVector[i] != rhs.descVector[i]) { retVal = retVal && descVector[i] && rhs.descVector[i] && - descVector[i]->getBlockDims() == rhs.descVector[i]->getBlockDims() && - descVector[i]->getStrides() == rhs.descVector[i]->getStrides() && - descVector[i]->getOrder() == rhs.descVector[i]->getOrder() && - descVector[i]->getOffsetPaddingToData() == rhs.descVector[i]->getOffsetPaddingToData() && - descVector[i]->getOffsetPadding() == rhs.descVector[i]->getOffsetPadding(); + descVector[i]->getBlockDims() == rhs.descVector[i]->getBlockDims() && + descVector[i]->getStrides() == rhs.descVector[i]->getStrides() && + descVector[i]->getOrder() == rhs.descVector[i]->getOrder() && + descVector[i]->getOffsetPaddingToData() == rhs.descVector[i]->getOffsetPaddingToData() && + descVector[i]->getOffsetPadding() == rhs.descVector[i]->getOffsetPadding(); } } @@ -742,7 +766,7 @@ bool DefConvKey::operator==(const DefConvKey &rhs) const { return retVal; } -} // namespace +} // namespace DeformableConvolution::DeformableConvolution(const std::shared_ptr& op, const GraphContext::CPtr context) : Node(op, context, NgraphShapeInferFactory(op)) { @@ -825,13 +849,14 @@ void DeformableConvolution::initSupportedPrimitiveDescriptors() { impl_desc_type impl_type; const int simd_w = mayiuse(cpu::x64::avx512_core) ? 16 : 8; - auto &weiDims = getInputShapeAtPort(WEI_ID).getDims(); + auto& weiDims = getInputShapeAtPort(WEI_ID).getDims(); if (weiDims[1] == Shape::UNDEFINED_DIM || weiDims[0] == Shape::UNDEFINED_DIM || // 1. strict fallback, until devising of multigroup handling in common case defConvAttr.group != 1 || // 2. common fallback, except specific n_group / n_channel combinations - (defConvAttr.group != 1 && ((weiDims[1] % simd_w != 0) // in_channels_per_gr !% simd_w - || ((weiDims[0] / defConvAttr.group) % simd_w != 0)))) { // out_channels_per_gr !% simd_w + (defConvAttr.group != 1 && + ((weiDims[1] % simd_w != 0) // in_channels_per_gr !% simd_w + || ((weiDims[0] / defConvAttr.group) % simd_w != 0)))) { // out_channels_per_gr !% simd_w enforceRef = true; } else { enforceRef = false; @@ -854,41 +879,48 @@ void DeformableConvolution::initSupportedPrimitiveDescriptors() { auto dataFormat = memory::format_tag::nhwc; auto offFormat = memory::format_tag::nchw; auto weiFormat = mayiuse(avx512_core) ? memory::format_tag::OIhw16i16o : memory::format_tag::OIhw8i8o; - config.inConfs[DATA_ID].setMemDesc(std::make_shared(getInputShapeAtPort(DATA_ID), - memory::data_type::f32, dataFormat)); - config.inConfs[OFF_ID].setMemDesc(std::make_shared(getInputShapeAtPort(OFF_ID), - memory::data_type::f32, offFormat)); + config.inConfs[DATA_ID].setMemDesc( + std::make_shared(getInputShapeAtPort(DATA_ID), memory::data_type::f32, dataFormat)); + config.inConfs[OFF_ID].setMemDesc( + std::make_shared(getInputShapeAtPort(OFF_ID), memory::data_type::f32, offFormat)); - config.inConfs[WEI_ID].setMemDesc(std::make_shared(getInputShapeAtPort(WEI_ID), - memory::data_type::f32, weiFormat)); + config.inConfs[WEI_ID].setMemDesc( + std::make_shared(getInputShapeAtPort(WEI_ID), memory::data_type::f32, weiFormat)); if (inputsNumber > 3) { config.inConfs[MOD_ID].setMemDesc(std::make_shared(getInputShapeAtPort(MOD_ID), - memory::data_type::f32, memory::format_tag::nchw)); + memory::data_type::f32, + memory::format_tag::nchw)); } - config.outConfs[0].setMemDesc(std::make_shared(getOutputShapeAtPort(DATA_ID), - memory::data_type::f32, dataFormat)); + config.outConfs[0].setMemDesc( + std::make_shared(getOutputShapeAtPort(DATA_ID), memory::data_type::f32, dataFormat)); supportedPrimitiveDescriptors.push_back({config, impl_type}); } else { // reference implementation - config.inConfs[DATA_ID].setMemDesc(std::make_shared(getInputShapeAtPort(DATA_ID), memory::data_type::f32, + config.inConfs[DATA_ID].setMemDesc(std::make_shared(getInputShapeAtPort(DATA_ID), + memory::data_type::f32, memory::format_tag::nchw)); - config.inConfs[OFF_ID].setMemDesc(std::make_shared(getInputShapeAtPort(OFF_ID), memory::data_type::f32, + config.inConfs[OFF_ID].setMemDesc(std::make_shared(getInputShapeAtPort(OFF_ID), + memory::data_type::f32, memory::format_tag::nchw)); - config.inConfs[WEI_ID].setMemDesc(std::make_shared(getInputShapeAtPort(WEI_ID), memory::data_type::f32, + config.inConfs[WEI_ID].setMemDesc(std::make_shared(getInputShapeAtPort(WEI_ID), + memory::data_type::f32, memory::format_tag::oihw)); if (inputsNumber > 3) { - config.inConfs[MOD_ID].setMemDesc(std::make_shared(getInputShapeAtPort(MOD_ID), memory::data_type::f32, + config.inConfs[MOD_ID].setMemDesc(std::make_shared(getInputShapeAtPort(MOD_ID), + memory::data_type::f32, memory::format_tag::nchw)); } - config.outConfs[0].setMemDesc(std::make_shared(getOutputShapeAtPort(DATA_ID), memory::data_type::f32, + config.outConfs[0].setMemDesc(std::make_shared(getOutputShapeAtPort(DATA_ID), + memory::data_type::f32, memory::format_tag::nchw)); supportedPrimitiveDescriptors.push_back({config, impl_type}); } } -void DeformableConvolution::DefConvExecutor::prepareSamplingWeights( - const float* offsets, const float* modulation, bool enforceRef) { +void DeformableConvolution::DefConvExecutor::prepareSamplingWeights(const float* offsets, + const float* modulation, + bool enforceRef) { const int MB = jcp.mb; const int OH = jcp.oh; const int OW = jcp.ow; @@ -918,45 +950,45 @@ void DeformableConvolution::DefConvExecutor::prepareSamplingWeights( const int h_in = oh * KSH - padT; const int w_in = ow * KSW - padL; - const float *data_offset_ptr = offsets + mb * offStrides[0] + (dg * 2 * KH * KW) * offStrides[1]; - const float *modulation_offset_ptr = nullptr; + const float* data_offset_ptr = offsets + mb * offStrides[0] + (dg * 2 * KH * KW) * offStrides[1]; + const float* modulation_offset_ptr = nullptr; if (modulation != nullptr) { modulation_offset_ptr = modulation + mb * modStrides[0] + (dg * ker_size) * modStrides[1]; } for (int kh = 0; kh < KH; kh++) { for (int kw = 0; kw < KW; kw++) { - const size_t data_offset_h_index = 2 * ((size_t) kh * KW + kw) * offStrides[1] + oh * offStrides[2] + ow * offStrides[3]; - const size_t data_offset_w_index = (2 * ((size_t) kh * KW + kw) + 1) * offStrides[1] + oh * offStrides[2] + ow * offStrides[3]; + const size_t data_offset_h_index = + 2 * ((size_t)kh * KW + kw) * offStrides[1] + oh * offStrides[2] + ow * offStrides[3]; + const size_t data_offset_w_index = + (2 * ((size_t)kh * KW + kw) + 1) * offStrides[1] + oh * offStrides[2] + ow * offStrides[3]; const float offset_h = data_offset_ptr[data_offset_h_index]; const float offset_w = data_offset_ptr[data_offset_w_index]; float map_h = h_in + kh * (KDH + 1) + offset_h; float map_w = w_in + kw * (KDW + 1) + offset_w; bool skip_compute; if (with_bi_pad) { - skip_compute = !(static_cast(map_w) > -1 && - static_cast(map_w) < IW && - static_cast(map_h) > -1 && - static_cast(map_h) < IH); + skip_compute = !(static_cast(map_w) > -1 && static_cast(map_w) < IW && + static_cast(map_h) > -1 && static_cast(map_h) < IH); } else { - skip_compute = !(map_w >= 0 && map_w < IW && - map_h >= 0 && map_h < IH); + skip_compute = !(map_w >= 0 && map_w < IW && map_h >= 0 && map_h < IH); } if (!skip_compute) { // modulations precomp. float modulation_scalar = 1.0f; if (modulation_offset_ptr != nullptr) { - size_t modulation_index = (kh * KW + kw) * modStrides[1] + oh * modStrides[2] + ow * modStrides[3]; + size_t modulation_index = + (kh * KW + kw) * modStrides[1] + oh * modStrides[2] + ow * modStrides[3]; modulation_scalar = modulation_offset_ptr[modulation_index]; } // interpolation precomp. const int cur_h_end = IH; const int cur_w_end = IW; - int h_low = with_bi_pad ? static_cast(floorf(map_h)) : - std::max(static_cast(floorf(map_h)), 0); - int w_low = with_bi_pad ? static_cast(floorf(map_w)) : - std::max(static_cast(floorf(map_w)), 0); + int h_low = + with_bi_pad ? static_cast(floorf(map_h)) : std::max(static_cast(floorf(map_h)), 0); + int w_low = + with_bi_pad ? static_cast(floorf(map_w)) : std::max(static_cast(floorf(map_w)), 0); int h_high = with_bi_pad ? h_low + 1 : std::min(static_cast(ceilf(map_h)), cur_h_end - 1); int w_high = with_bi_pad ? w_low + 1 : std::min(static_cast(ceilf(map_w)), cur_w_end - 1); @@ -976,7 +1008,7 @@ void DeformableConvolution::DefConvExecutor::prepareSamplingWeights( const int h_off_low = h_ind_low * (srcStrides[2] / srcStrides[3]); const int h_off_high = h_ind_high * (srcStrides[2] / srcStrides[3]); - const int w_off_low = w_ind_low; + const int w_off_low = w_ind_low; const int w_off_high = w_ind_high; pSampledCoordsVector[sampledCoordIndex] = h_off_high + w_off_high; pSampledCoordsVector[sampledCoordIndex + 1] = h_off_high + w_off_low; @@ -984,7 +1016,7 @@ void DeformableConvolution::DefConvExecutor::prepareSamplingWeights( pSampledCoordsVector[sampledCoordIndex + 3] = h_off_low + w_off_low; float w22 = hh * hw * modulation_scalar, w21 = hh * lw * modulation_scalar, - w12 = lh * hw * modulation_scalar, w11 = lh * lw * modulation_scalar; + w12 = lh * hw * modulation_scalar, w11 = lh * lw * modulation_scalar; pInterpWeightsVector[sampledCoordIndex] = w11; pInterpWeightsVector[sampledCoordIndex + 1] = w12; @@ -1007,15 +1039,16 @@ void DeformableConvolution::DefConvExecutor::prepareSamplingWeights( }); } -DeformableConvolution::DefConvExecutor::DefConvExecutor(const DefConvAttr &defConvAttr, - const std::vector> &descVector) { +DeformableConvolution::DefConvExecutor::DefConvExecutor( + const DefConvAttr& defConvAttr, + const std::vector>& descVector) { if (descVector.size() != 4 && descVector.size() != 5) { OPENVINO_THROW("Deformable Convolution executor got incorrect desc's count (", descVector.size(), ")"); } bool withModulation = descVector.size() == 5; - auto &srcDesc = descVector[DATA_ID]; - auto &dstDesc = descVector[descVector.size() - 1]; + auto& srcDesc = descVector[DATA_ID]; + auto& dstDesc = descVector[descVector.size() - 1]; srcStrides = std::vector(srcDesc->getStrides().size()); offStrides = descVector[OFF_ID]->getStrides(); weiStrides = descVector[WEI_ID]->getStrides(); @@ -1085,9 +1118,10 @@ DeformableConvolution::DefConvExecutor::DefConvExecutor(const DefConvAttr &defCo jcp.nthr = dnnl_get_max_threads(); } -DeformableConvolution::DefConvJitExecutor::DefConvJitExecutor(const DefConvAttr &defConvAttr, - const std::vector> &descVector) : - DefConvExecutor(defConvAttr, descVector) { +DeformableConvolution::DefConvJitExecutor::DefConvJitExecutor( + const DefConvAttr& defConvAttr, + const std::vector>& descVector) + : DefConvExecutor(defConvAttr, descVector) { #if defined(OPENVINO_ARCH_X86_64) if (mayiuse(cpu::x64::avx512_core)) { def_conv_kernel.reset(new jit_uni_def_conv_kernel_f32(jcp)); @@ -1106,9 +1140,13 @@ DeformableConvolution::DefConvJitExecutor::DefConvJitExecutor(const DefConvAttr #endif } -void DeformableConvolution::DefConvRefExecutor::exec(const float* src, const float* offsets, - const float* weights, const float* modulation, float* dst, - int *pSampledCoordsVector, float *pInterpWeightsVector) { +void DeformableConvolution::DefConvRefExecutor::exec(const float* src, + const float* offsets, + const float* weights, + const float* modulation, + float* dst, + int* pSampledCoordsVector, + float* pInterpWeightsVector) { this->pSampledCoordsVector = pSampledCoordsVector; this->pInterpWeightsVector = pInterpWeightsVector; prepareSamplingWeights(offsets, modulation, true); @@ -1133,17 +1171,18 @@ void DeformableConvolution::DefConvRefExecutor::exec(const float* src, const flo auto compKer = [OV_CAPTURE_CPY_AND_THIS](int g, int mb, int oc, int oh, int ow) { float d = 0; for (int ic = 0; ic < IC; ic++) { - const float *data_im_ptr = src + mb * srcStrides[0] + (g * IC + ic) * srcStrides[1]; + const float* data_im_ptr = src + mb * srcStrides[0] + (g * IC + ic) * srcStrides[1]; const int deformable_group_index = (IC * g + ic) / channel_per_deformable_group; - int sampledCoordIndex = (mb * DGHW + deformable_group_index * HW + oh * OW + ow) * ker_size * sampledPointsPerPixel; - size_t weiIndex = (size_t) g * group_wei_stride + oc * weiStrides[0] + ic * weiStrides[1]; + int sampledCoordIndex = + (mb * DGHW + deformable_group_index * HW + oh * OW + ow) * ker_size * sampledPointsPerPixel; + size_t weiIndex = (size_t)g * group_wei_stride + oc * weiStrides[0] + ic * weiStrides[1]; for (size_t kh_off = 0; kh_off < KH * weiStrides[2]; kh_off += weiStrides[2]) { for (size_t kw_off = 0; kw_off < KW * weiStrides[3]; kw_off += weiStrides[3]) { // check if current addendum marked as equal zero if (pSampledCoordsVector[sampledCoordIndex] != -1) { const int v11 = pSampledCoordsVector[sampledCoordIndex]; const int v12 = pSampledCoordsVector[sampledCoordIndex + 1]; - const int v21 = pSampledCoordsVector[sampledCoordIndex + 2]; + const int v21 = pSampledCoordsVector[sampledCoordIndex + 2]; const int v22 = pSampledCoordsVector[sampledCoordIndex + 3]; float val = 0; @@ -1174,8 +1213,9 @@ void DeformableConvolution::DefConvRefExecutor::exec(const float* src, const flo }; parallel_nd(G, MB, OC, OH, OW, [&](dnnl_dim_t g, dnnl_dim_t mb, dnnl_dim_t oc, dnnl_dim_t oh, dnnl_dim_t ow) { - dst[mb * dstStrides[0] + (g * OC + oc) * dstStrides[1] + oh * dstStrides[2] + ow * dstStrides[3]] = compKer(g, mb, oc, oh, ow); - }); + dst[mb * dstStrides[0] + (g * OC + oc) * dstStrides[1] + oh * dstStrides[2] + ow * dstStrides[3]] = + compKer(g, mb, oc, oh, ow); + }); } void DeformableConvolution::prepareParams() { @@ -1208,22 +1248,17 @@ void DeformableConvolution::prepareParams() { updatePadding(); - std::vector> descVector { + std::vector> descVector{ getParentEdgeAt(DATA_ID)->getMemory().getDescWithType(), getParentEdgeAt(OFF_ID)->getMemory().getDescWithType(), - getParentEdgeAt(WEI_ID)->getMemory().getDescWithType() - }; + getParentEdgeAt(WEI_ID)->getMemory().getDescWithType()}; if (withModulation) { descVector.push_back(getParentEdgeAt(MOD_ID)->getMemory().getDescWithType()); } descVector.push_back(getChildEdgeAt(0)->getMemory().getDescWithType()); - DefConvKey key = { - descVector, - defConvAttr, - getSelectedPrimitiveDescriptor()->getImplementationType() - }; + DefConvKey key = {descVector, defConvAttr, getSelectedPrimitiveDescriptor()->getImplementationType()}; const int MB = getParentEdgeAt(DATA_ID)->getMemory().getStaticDims()[0]; const int OH = getChildEdgeAt(0)->getMemory().getStaticDims()[2]; @@ -1241,7 +1276,7 @@ void DeformableConvolution::prepareParams() { execPtr = nullptr; auto cache = context->getParamsCache(); - auto result = cache->getOrCreate(key, [] (const DefConvKey& key) -> std::shared_ptr { + auto result = cache->getOrCreate(key, [](const DefConvKey& key) -> std::shared_ptr { if (key.implType == impl_desc_type::ref) { return std::make_shared(key.defConvAttr, key.descVector); } @@ -1258,9 +1293,13 @@ void DeformableConvolution::executeDynamicImpl(dnnl::stream strm) { execute(strm); } -void DeformableConvolution::DefConvJitExecutor::exec(const float* src, const float* offsets, - const float* weights, const float* modulation, float* dst, - int *pSampledCoordsVector, float *pInterpWeightsVector) { +void DeformableConvolution::DefConvJitExecutor::exec(const float* src, + const float* offsets, + const float* weights, + const float* modulation, + float* dst, + int* pSampledCoordsVector, + float* pInterpWeightsVector) { this->pSampledCoordsVector = pSampledCoordsVector; this->pInterpWeightsVector = pInterpWeightsVector; prepareSamplingWeights(offsets, modulation, false); @@ -1276,9 +1315,11 @@ void DeformableConvolution::DefConvJitExecutor::exec(const float* src, const flo const size_t _oc = g * jcp.nb_oc; const size_t _ic = g * jcp.nb_ic; - par_conv.src = &src[n * srcStrides[0] + _ic*jcp.ic_block * srcStrides[1]]; - par_conv.sampledWei = &(pInterpWeightsVector[(n * jcp.dg * jcp.oh + oh) * jcp.kh * jcp.kw * jcp.ow * sampledPointsPerPixel]); - par_conv.sampledCoords = &(pSampledCoordsVector[(n * jcp.dg * jcp.oh + oh) * jcp.kh * jcp.kw * jcp.ow * sampledPointsPerPixel]); + par_conv.src = &src[n * srcStrides[0] + _ic * jcp.ic_block * srcStrides[1]]; + par_conv.sampledWei = + &(pInterpWeightsVector[(n * jcp.dg * jcp.oh + oh) * jcp.kh * jcp.kw * jcp.ow * sampledPointsPerPixel]); + par_conv.sampledCoords = + &(pSampledCoordsVector[(n * jcp.dg * jcp.oh + oh) * jcp.kh * jcp.kw * jcp.ow * sampledPointsPerPixel]); par_conv.filt = &weights[g * jcp.nb_oc * jcp.nb_ic * jcp.kh * jcp.kw * jcp.ic_block * jcp.oc_block]; par_conv.dst = &dst[n * dstStrides[0] + _oc * jcp.oc_block * dstStrides[1] + oh * dstStrides[2]]; par_conv.buf = input_buffer_ptr + ithr * jcp.ur_w * jcp.kh * jcp.kw * jcp.ic; @@ -1292,20 +1333,20 @@ void DeformableConvolution::DefConvJitExecutor::exec(const float* src, const flo void DeformableConvolution::execute(dnnl::stream strm) { const size_t inputsNumber = getOriginalInputsNumber(); - auto &srcMemory0 = getParentEdgeAt(0)->getMemory(); - auto &srcMemory1 = getParentEdgeAt(1)->getMemory(); - auto &srcMemory2 = getParentEdgeAt(2)->getMemory(); - auto &dstMemory = getChildEdgeAt(0)->getMemory(); + auto& srcMemory0 = getParentEdgeAt(0)->getMemory(); + auto& srcMemory1 = getParentEdgeAt(1)->getMemory(); + auto& srcMemory2 = getParentEdgeAt(2)->getMemory(); + auto& dstMemory = getChildEdgeAt(0)->getMemory(); - const auto *src = srcMemory0.getDataAs(); - const auto *offsets = srcMemory1.getDataAs(); - const auto *weights = srcMemory2.getDataAs(); + const auto* src = srcMemory0.getDataAs(); + const auto* offsets = srcMemory1.getDataAs(); + const auto* weights = srcMemory2.getDataAs(); float* modulation = nullptr; if (inputsNumber > 3) { modulation = getSrcDataAtPortAs(3); } - float *dst = dstMemory.getDataAs(); + float* dst = dstMemory.getDataAs(); auto selectedPrimitiveDescriptor = getSelectedPrimitiveDescriptor(); if (!selectedPrimitiveDescriptor) @@ -1333,6 +1374,6 @@ ov::element::Type DeformableConvolution::getRuntimePrecision() const { return getMaxPrecision(getInputPrecisions()); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/def_conv.h b/src/plugins/intel_cpu/src/nodes/def_conv.h index 127fd00eb2bf00..ed5800a19a0e84 100644 --- a/src/plugins/intel_cpu/src/nodes/def_conv.h +++ b/src/plugins/intel_cpu/src/nodes/def_conv.h @@ -5,6 +5,7 @@ #pragma once #include + #include #include #include @@ -43,20 +44,20 @@ struct jit_def_conv_params { }; struct jit_def_conv_call_args { - const void *src; - const void *sampledWei; - const void *sampledCoords; - const void *filt; - const void *bias; - const void *dst; - const void *buf; + const void* src; + const void* sampledWei; + const void* sampledCoords; + const void* filt; + const void* bias; + const void* dst; + const void* buf; size_t oh_pos; }; struct jit_uni_def_conv_kernel { - void (*ker_)(const jit_def_conv_call_args *); + void (*ker_)(const jit_def_conv_call_args*); - void operator()(const jit_def_conv_call_args *args) { + void operator()(const jit_def_conv_call_args* args) { assert(ker_); ker_(args); } @@ -109,53 +110,66 @@ class DeformableConvolution : public Node { static constexpr size_t MOD_ID = 3; std::string errorPrefix; class DefConvExecutor { - public: - DefConvExecutor(const DefConvAttr &defConvAttr, - const std::vector> &descVector); - - virtual void exec(const float* src, const float* offsets, - const float* weights, const float* modulation, float* dst, - int *pSampledCoordsVector, float *pInterpWeightsVector) = 0; - virtual ~DefConvExecutor() = default; - - protected: - void prepareSamplingWeights(const float* offsets, const float* modulation = nullptr, bool enforceRef = false); - jit_def_conv_params jcp = {}; - VectorDims srcStrides; - VectorDims offStrides; - VectorDims weiStrides; - VectorDims modStrides; - VectorDims dstStrides; - int *pSampledCoordsVector; - float *pInterpWeightsVector; + public: + DefConvExecutor(const DefConvAttr& defConvAttr, + const std::vector>& descVector); + + virtual void exec(const float* src, + const float* offsets, + const float* weights, + const float* modulation, + float* dst, + int* pSampledCoordsVector, + float* pInterpWeightsVector) = 0; + virtual ~DefConvExecutor() = default; + + protected: + void prepareSamplingWeights(const float* offsets, const float* modulation = nullptr, bool enforceRef = false); + jit_def_conv_params jcp = {}; + VectorDims srcStrides; + VectorDims offStrides; + VectorDims weiStrides; + VectorDims modStrides; + VectorDims dstStrides; + int* pSampledCoordsVector; + float* pInterpWeightsVector; }; class DefConvRefExecutor : public DefConvExecutor { - public: - DefConvRefExecutor(const DefConvAttr &defConvAttr, - const std::vector> &descVector) : - DefConvExecutor(defConvAttr, descVector) {} - - void exec(const float* src, const float* offsets, - const float* weights, const float* modulation, float* dst, - int *pSampledCoordsVector, float *pInterpWeightsVector) override; + public: + DefConvRefExecutor(const DefConvAttr& defConvAttr, + const std::vector>& descVector) + : DefConvExecutor(defConvAttr, descVector) {} + + void exec(const float* src, + const float* offsets, + const float* weights, + const float* modulation, + float* dst, + int* pSampledCoordsVector, + float* pInterpWeightsVector) override; }; class DefConvJitExecutor : public DefConvExecutor { - std::shared_ptr def_conv_kernel = nullptr; - public: - DefConvJitExecutor(const DefConvAttr &defConvAttr, - const std::vector> &descVector); - - void exec(const float* src, const float* offsets, - const float* weights, const float* modulation, float* dst, - int *pSampledCoordsVector, float *pInterpWeightsVector) override; + std::shared_ptr def_conv_kernel = nullptr; + + public: + DefConvJitExecutor(const DefConvAttr& defConvAttr, + const std::vector>& descVector); + + void exec(const float* src, + const float* offsets, + const float* weights, + const float* modulation, + float* dst, + int* pSampledCoordsVector, + float* pInterpWeightsVector) override; }; std::shared_ptr execPtr = nullptr; bool autoPadding = false; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/depth_to_space.cpp b/src/plugins/intel_cpu/src/nodes/depth_to_space.cpp index eb3789068adca1..a8629ce2592d76 100644 --- a/src/plugins/intel_cpu/src/nodes/depth_to_space.cpp +++ b/src/plugins/intel_cpu/src/nodes/depth_to_space.cpp @@ -4,16 +4,15 @@ #include "depth_to_space.h" -#include "dnnl_extension_utils.h" -#include "utils/general_utils.h" - #include -#include "common/primitive_hashing_utils.hpp" -#include "cpu/x64/jit_generator.hpp" -#include "openvino/opsets/opset1.hpp" #include #include "common/blocked_desc_creator.h" +#include "common/primitive_hashing_utils.hpp" +#include "cpu/x64/jit_generator.hpp" +#include "dnnl_extension_utils.h" +#include "openvino/opsets/opset1.hpp" +#include "utils/general_utils.h" #define THROW_ERROR(...) OPENVINO_THROW("DepthToSpace layer with name '", getName(), "' ", __VA_ARGS__) @@ -40,9 +39,8 @@ size_t DepthToSpace::DepthToSpaceAttrs::hash() const { } bool DepthToSpace::DepthToSpaceAttrs::operator==(const DepthToSpaceAttrs& rhs) const { - bool result = layoutType == rhs.layoutType && mode == rhs.mode && - blockSize == rhs.blockSize && blockStep == rhs.blockStep && - dataSize == rhs.dataSize && nSpatialDims == rhs.nSpatialDims && + bool result = layoutType == rhs.layoutType && mode == rhs.mode && blockSize == rhs.blockSize && + blockStep == rhs.blockStep && dataSize == rhs.dataSize && nSpatialDims == rhs.nSpatialDims && srcBlockedDims == rhs.srcBlockedDims; return result; @@ -56,7 +54,9 @@ bool DepthToSpace::isSupportedOperation(const std::shared_ptr& o return false; } const auto mode = depthToSpace->get_mode(); - if (!one_of(mode, ov::op::v0::DepthToSpace::DepthToSpaceMode::BLOCKS_FIRST, ov::op::v0::DepthToSpace::DepthToSpaceMode::DEPTH_FIRST)) { + if (!one_of(mode, + ov::op::v0::DepthToSpace::DepthToSpaceMode::BLOCKS_FIRST, + ov::op::v0::DepthToSpace::DepthToSpaceMode::DEPTH_FIRST)) { errorMessage = "Does not support mode: " + ov::as_string(mode); return false; } @@ -138,7 +138,8 @@ void DepthToSpace::initSupportedPrimitiveDescriptors() { if (inputDataShape.getRank() > 2) { const auto& srcDims = inputDataShape.getDims(); auto canUseBlocked = [OV_CAPTURE_CPY_AND_THIS](const size_t block) { - return srcDims[1] != Shape::UNDEFINED_DIM && srcDims[1] % block == 0 && (srcDims[1] / block) % attrs.blockStep == 0 && + return srcDims[1] != Shape::UNDEFINED_DIM && srcDims[1] % block == 0 && + (srcDims[1] / block) % attrs.blockStep == 0 && (attrs.mode == Mode::DEPTH_FIRST ? block % attrs.blockStep == 0 : true); }; @@ -172,9 +173,10 @@ void DepthToSpace::createPrimitive() { const auto& memoryDesc = srcMemPtr->getDesc(); attrs.dataSize = memoryDesc.getPrecision().size(); attrs.nSpatialDims = memoryDesc.getShape().getRank() - 2; - attrs.layoutType = memoryDesc.hasLayoutType(LayoutType::nCsp16c) ? LayoutType::nCsp16c : - memoryDesc.hasLayoutType(LayoutType::nCsp8c) ? LayoutType::nCsp8c : - memoryDesc.hasLayoutType(LayoutType::nspc) ? LayoutType::nspc : LayoutType::ncsp; + attrs.layoutType = memoryDesc.hasLayoutType(LayoutType::nCsp16c) ? LayoutType::nCsp16c + : memoryDesc.hasLayoutType(LayoutType::nCsp8c) ? LayoutType::nCsp8c + : memoryDesc.hasLayoutType(LayoutType::nspc) ? LayoutType::nspc + : LayoutType::ncsp; if (inputShapesDefined()) { if (needPrepareParams()) @@ -205,7 +207,8 @@ DepthToSpace::DepthToSpaceExecutor::DepthToSpaceExecutor(const DepthToSpaceAttrs const bool isBlocked = one_of(attrs.layoutType, LayoutType::nCsp16c, LayoutType::nCsp8c); const bool isChannelsFirst = attrs.layoutType == LayoutType::nspc; const size_t nDims = attrs.srcBlockedDims.size(); - const size_t reshapedRank = nDims + attrs.nSpatialDims + static_cast(isBlocked && attrs.mode == Mode::DEPTH_FIRST); + const size_t reshapedRank = + nDims + attrs.nSpatialDims + static_cast(isBlocked && attrs.mode == Mode::DEPTH_FIRST); const size_t lastIdx = reshapedRank - 1; size_t firstSpatialOrder = 2; @@ -219,21 +222,24 @@ DepthToSpace::DepthToSpaceExecutor::DepthToSpaceExecutor(const DepthToSpaceAttrs params.src_block_dims[0] = attrs.srcBlockedDims[0]; // reshaping of src dimensions and creating the permutation order for each layout: - // new shape: mode = blocks_first [N, block_size, block_size, ..., block_size, C / (block_size ^ K), D1, D2, ..., DK] - // mode = depth_first [N, C / (block_size ^ K), block_size, block_size, ..., block_size, D1, D2, ..., DK] + // new shape: mode = blocks_first [N, block_size, block_size, ..., block_size, C / (block_size ^ K), D1, D2, ..., + // DK] + // mode = depth_first [N, C / (block_size ^ K), block_size, block_size, ..., block_size, D1, D2, ..., + // DK] // order : mode = blocks_first : [0, K + 1, K + 2, 1, K + 3, 2, K + 4, 3, ..., K + (K + 1), K] // mode = depth_first : [0, 1, K + 2, 2, K + 3, 3, K + 4, 4, ..., K + (K + 1), K + 1] // where `k` is number of spatial dimensions - auto reshapeAndSetPermOrder = [&](const size_t idx1, const size_t idx2, const size_t shift, const VectorDims& dims) { - for (size_t i = 0; i < attrs.nSpatialDims; i++) { - params.order[i * 2 + shift] = i + idx1; - params.order[i * 2 + shift + 1] = i + idx2; + auto reshapeAndSetPermOrder = + [&](const size_t idx1, const size_t idx2, const size_t shift, const VectorDims& dims) { + for (size_t i = 0; i < attrs.nSpatialDims; i++) { + params.order[i * 2 + shift] = i + idx1; + params.order[i * 2 + shift + 1] = i + idx2; - params.src_block_dims[params.order[i * 2 + shift]] = dims[i + shift]; - params.src_block_dims[params.order[i * 2 + shift + 1]] = attrs.blockSize; - } - }; + params.src_block_dims[params.order[i * 2 + shift]] = dims[i + shift]; + params.src_block_dims[params.order[i * 2 + shift + 1]] = attrs.blockSize; + } + }; if (isBlocked) { size_t orderShiftForBlocks, orderShiftForDims; @@ -314,6 +320,6 @@ bool DepthToSpace::created() const { return getType() == Type::DepthToSpace; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/depth_to_space.h b/src/plugins/intel_cpu/src/nodes/depth_to_space.h index 2eda39f60394af..21eca73f97318c 100644 --- a/src/plugins/intel_cpu/src/nodes/depth_to_space.h +++ b/src/plugins/intel_cpu/src/nodes/depth_to_space.h @@ -54,6 +54,6 @@ class DepthToSpace : public Node { executorPtr execPtr = nullptr; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/detection_output.cpp b/src/plugins/intel_cpu/src/nodes/detection_output.cpp index 99702780b83034..9cf52e7042c6ba 100644 --- a/src/plugins/intel_cpu/src/nodes/detection_output.cpp +++ b/src/plugins/intel_cpu/src/nodes/detection_output.cpp @@ -16,8 +16,7 @@ namespace node { namespace { template -bool SortScorePairDescend(const std::pair& pair1, - const std::pair& pair2) { +bool SortScorePairDescend(const std::pair& pair1, const std::pair& pair2) { return (pair1.first > pair2.first) || (pair1.first == pair2.first && pair1.second < pair2.second); } @@ -27,9 +26,10 @@ bool SortScorePairDescend>(const std::pair pair2.first) || (pair1.first == pair2.first && pair1.second.second < pair2.second.second); } -} // namespace +} // namespace -bool DetectionOutput::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool DetectionOutput::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto doOp = ov::as_type_ptr(op); if (!doOp) { @@ -58,7 +58,7 @@ DetectionOutput::DetectionOutput(const std::shared_ptr& op, const Grap errorPrefix = "DetectionOutput node with name '" + getName() + "' "; if (getOriginalInputsNumber() != 3 && getOriginalInputsNumber() != 5) - OPENVINO_THROW(errorPrefix, "has incorrect number of input edges."); + OPENVINO_THROW(errorPrefix, "has incorrect number of input edges."); if (getOriginalOutputsNumber() != 1) OPENVINO_THROW(errorPrefix, "has incorrect number of output edges."); @@ -93,7 +93,7 @@ DetectionOutput::DetectionOutput(const std::shared_ptr& op, const Grap void DetectionOutput::prepareParams() { const auto& idPriorDims = getParentEdgeAt(ID_PRIOR)->getMemory().getShape().getStaticDims(); - const auto &idConfDims = getParentEdgeAt(ID_CONF)->getMemory().getShape().getStaticDims(); + const auto& idConfDims = getParentEdgeAt(ID_CONF)->getMemory().getShape().getStaticDims(); priorsNum = static_cast(idPriorDims.back() / priorSize); isPriorsPerImg = idPriorDims.front() != 1; classesNum = static_cast(idConfDims.back() / priorsNum); @@ -130,9 +130,8 @@ void DetectionOutput::prepareParams() { // --> g_topk(vector<>(all detections) --> indices per class)) // MXNet: max conf for prior within img, filter(indices) --> topk_img(buffer) --> nms_cls(indices) // --> g_topk(vector<>(all detections) --> indices per class)) - isSparsityWorthwhile = - (confidenceThreshold > sparsityThreshold) && - ((classesNum * priorsNum * sizeof(float) * 2) > static_cast(cacheSizeL3)); + isSparsityWorthwhile = (confidenceThreshold > sparsityThreshold) && + ((classesNum * priorsNum * sizeof(float) * 2) > static_cast(cacheSizeL3)); confInfoLen = (!decreaseClassId && isSparsityWorthwhile) ? (2 * priorsNum + 1) : priorsNum; reorderedConf.resize(imgNum * classesNum * confInfoLen); @@ -149,17 +148,17 @@ void DetectionOutput::initSupportedPrimitiveDescriptors() { for (size_t i = 0; i < inputShapes.size(); ++i) inDataConf.emplace_back(LayoutType::ncsp, ov::element::f32); - addSupportedPrimDesc(inDataConf, - {{LayoutType::ncsp, ov::element::f32}}, - impl_desc_type::ref_any); + addSupportedPrimDesc(inDataConf, {{LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } struct ConfidenceComparatorDO { explicit ConfidenceComparatorDO(const float* confDataIn) : confData(confDataIn) {} bool operator()(int idx1, int idx2) { - if (confData[idx1] > confData[idx2]) return true; - if (confData[idx1] < confData[idx2]) return false; + if (confData[idx1] > confData[idx2]) + return true; + if (confData[idx1] < confData[idx2]) + return false; return idx1 < idx2; } @@ -171,31 +170,29 @@ void DetectionOutput::executeDynamicImpl(dnnl::stream strm) { } void DetectionOutput::execute(dnnl::stream strm) { - float *dstData = getDstDataAtPortAs(0); + float* dstData = getDstDataAtPortAs(0); - const float *locData = getSrcDataAtPortAs(ID_LOC); - const float *confData = getSrcDataAtPortAs(ID_CONF); - const float *priorData = getSrcDataAtPortAs(ID_PRIOR); - const float *ARMConfData = inputShapes.size() > 3 ? - getSrcDataAtPortAs(ID_ARM_CONF) : nullptr; - const float *ARMLocData = inputShapes.size() > 4 ? - getSrcDataAtPortAs(ID_ARM_LOC) : nullptr; + const float* locData = getSrcDataAtPortAs(ID_LOC); + const float* confData = getSrcDataAtPortAs(ID_CONF); + const float* priorData = getSrcDataAtPortAs(ID_PRIOR); + const float* ARMConfData = inputShapes.size() > 3 ? getSrcDataAtPortAs(ID_ARM_CONF) : nullptr; + const float* ARMLocData = inputShapes.size() > 4 ? getSrcDataAtPortAs(ID_ARM_LOC) : nullptr; - float *reorderedConfData = reorderedConf.data(); - int *reorderedConfDataIndices = reinterpret_cast(reorderedConf.data()); + float* reorderedConfData = reorderedConf.data(); + int* reorderedConfDataIndices = reinterpret_cast(reorderedConf.data()); - float *decodedBboxesData = decodedBboxes.data(); - float *bboxSizesData = bboxSizes.data(); - int *indicesData = indices.data(); - int *indicesBufData = indicesBuffer.data(); - int *detectionsData = detectionsCount.data(); + float* decodedBboxesData = decodedBboxes.data(); + float* bboxSizesData = bboxSizes.data(); + int* indicesData = indices.data(); + int* indicesBufData = indicesBuffer.data(); + int* detectionsData = detectionsCount.data(); memset(detectionsData, 0, imgNum * classesNum * sizeof(int)); int priorsBatch = isPriorsPerImg ? imgNum : 1; - int *numPriorsActualdata = numPriorsActual.data(); + int* numPriorsActualdata = numPriorsActual.data(); for (int n = 0; n < priorsBatch; ++n) { - const float *ppriors = priorData; + const float* ppriors = priorData; ppriors += varianceEncodedInTarget ? (n * priorsNum * priorSize) : (2 * n * priorsNum * priorSize); getActualPriorNum(ppriors, numPriorsActualdata, n); } @@ -204,21 +201,32 @@ void DetectionOutput::execute(dnnl::stream strm) { if (!isSparsityWorthwhile) { confReorderDense(confData, ARMConfData, reorderedConfData); - } else { // sparsity + } else { // sparsity if (!decreaseClassId) { - confReorderAndFilterSparsityCF(confData, ARMConfData, reorderedConfData, indicesData, indicesBufData, detectionsData); + confReorderAndFilterSparsityCF(confData, + ARMConfData, + reorderedConfData, + indicesData, + indicesBufData, + detectionsData); } else { - confReorderAndFilterSparsityMX(confData, ARMConfData, reorderedConfData, indicesData, indicesBufData, detectionsData); + confReorderAndFilterSparsityMX(confData, + ARMConfData, + reorderedConfData, + indicesData, + indicesBufData, + detectionsData); } } - int *confInfoV = confInfoForPrior.data(); + int* confInfoV = confInfoForPrior.data(); for (int n = 0; n < imgNum; ++n) { - const float *ppriors = priorData; - const float *priorVariances = priorData + priorsNum * priorSize; + const float* ppriors = priorData; + const float* priorVariances = priorData + priorsNum * priorSize; if (isPriorsPerImg) { - int priorSizePerImg = varianceEncodedInTarget ? (n * priorsNum * priorSize) : (2 * n * priorsNum * priorSize); + int priorSizePerImg = + varianceEncodedInTarget ? (n * priorsNum * priorSize) : (2 * n * priorsNum * priorSize); ppriors += priorSizePerImg; priorVariances += varianceEncodedInTarget ? 0 : priorSizePerImg; } @@ -226,17 +234,50 @@ void DetectionOutput::execute(dnnl::stream strm) { if (isShareLoc) { int locShift = n * priorsNum; int coordShift = locShift * 4; - const float *ploc = locData + coordShift; - float *pboxes = decodedBboxesData + coordShift; - float *psizes = bboxSizesData + locShift; - int *confInfoVB = confInfoV + locShift; + const float* ploc = locData + coordShift; + float* pboxes = decodedBboxesData + coordShift; + float* psizes = bboxSizesData + locShift; + int* confInfoVB = confInfoV + locShift; if (withAddBoxPred) { - const float *pARMLoc = ARMLocData + coordShift; - decodeBBoxes(ppriors, pARMLoc, priorVariances, pboxes, psizes, numPriorsActualdata, n, coordOffset, priorSize, true, nullptr, confInfoVB); - decodeBBoxes(pboxes, ploc, priorVariances, pboxes, psizes, numPriorsActualdata, n, 0, 4, false, nullptr, confInfoVB); + const float* pARMLoc = ARMLocData + coordShift; + decodeBBoxes(ppriors, + pARMLoc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + coordOffset, + priorSize, + true, + nullptr, + confInfoVB); + decodeBBoxes(pboxes, + ploc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + 0, + 4, + false, + nullptr, + confInfoVB); } else { - decodeBBoxes(ppriors, ploc, priorVariances, pboxes, psizes, numPriorsActualdata, n, coordOffset, priorSize, true, nullptr, confInfoVB); + decodeBBoxes(ppriors, + ploc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + coordOffset, + priorSize, + true, + nullptr, + confInfoVB); } } else { for (int c = 0; c < locNumForClasses; ++c) { @@ -245,16 +286,46 @@ void DetectionOutput::execute(dnnl::stream strm) { } int locShift = n * priorsNum * locNumForClasses; int coordShift = locShift * 4; - const float *ploc = locData + coordShift + c * 4; - float *pboxes = decodedBboxesData + coordShift + c * 4 * priorsNum; - float *psizes = bboxSizesData + locShift + c * priorsNum; - int *confInfoHBC = reorderedConfDataIndices + n * confInfoLen * classesNum + c*confInfoLen; + const float* ploc = locData + coordShift + c * 4; + float* pboxes = decodedBboxesData + coordShift + c * 4 * priorsNum; + float* psizes = bboxSizesData + locShift + c * priorsNum; + int* confInfoHBC = reorderedConfDataIndices + n * confInfoLen * classesNum + c * confInfoLen; if (withAddBoxPred) { - const float *pARMLoc = ARMLocData + n * 4 * locNumForClasses * priorsNum + c * 4; - decodeBBoxes(ppriors, pARMLoc, priorVariances, pboxes, psizes, numPriorsActualdata, n, coordOffset, priorSize, true, confInfoHBC); - decodeBBoxes(pboxes, ploc, priorVariances, pboxes, psizes, numPriorsActualdata, n, 0, 4, false, confInfoHBC); + const float* pARMLoc = ARMLocData + n * 4 * locNumForClasses * priorsNum + c * 4; + decodeBBoxes(ppriors, + pARMLoc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + coordOffset, + priorSize, + true, + confInfoHBC); + decodeBBoxes(pboxes, + ploc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + 0, + 4, + false, + confInfoHBC); } else { - decodeBBoxes(ppriors, ploc, priorVariances, pboxes, psizes, numPriorsActualdata, n, coordOffset, priorSize, true, confInfoHBC); + decodeBBoxes(ppriors, + ploc, + priorVariances, + pboxes, + psizes, + numPriorsActualdata, + n, + coordOffset, + priorSize, + true, + confInfoHBC); } } } @@ -267,16 +338,16 @@ void DetectionOutput::execute(dnnl::stream strm) { parallel_for(classesNum, [&](int c) { if (c != backgroundClassId) { // Ignore background class const int off = n * priorsNum * classesNum + c * priorsNum; - const float *pconfReorder = reorderedConfData + off; - int *pindices = indicesData + off; - int *pbuffer = indicesBufData + off; - int *pdetections = detectionsData + n * classesNum + c; + const float* pconfReorder = reorderedConfData + off; + int* pindices = indicesData + off; + int* pbuffer = indicesBufData + off; + int* pdetections = detectionsData + n * classesNum + c; if (!isSparsityWorthwhile) confFilterCF(pconfReorder, pindices, pbuffer, pdetections, n); - const float *pboxes; - const float *psizes; + const float* pboxes; + const float* psizes; if (isShareLoc) { pboxes = decodedBboxesData + n * 4 * priorsNum; psizes = bboxSizesData + n * priorsNum; @@ -291,23 +362,23 @@ void DetectionOutput::execute(dnnl::stream strm) { } else { // MXNet style const int offImg = n * priorsNum * classesNum; - const float *pconf = confData + offImg; - float *pconfReorder = reorderedConfData + offImg; - int *pbuffer = indicesBufData + offImg; - int *pindices = indicesData + offImg; - int *pdetections = detectionsData + n * classesNum; + const float* pconf = confData + offImg; + float* pconfReorder = reorderedConfData + offImg; + int* pbuffer = indicesBufData + offImg; + int* pindices = indicesData + offImg; + int* pdetections = detectionsData + n * classesNum; if (!isSparsityWorthwhile) confFilterMX(pconf, ARMConfData, pconfReorder, pindices, pbuffer, pdetections, n); - const float *pboxes = decodedBboxesData + n * 4 * locNumForClasses * priorsNum; - const float *psizes = bboxSizesData + n * locNumForClasses * priorsNum; + const float* pboxes = decodedBboxesData + n * 4 * locNumForClasses * priorsNum; + const float* psizes = bboxSizesData + n * locNumForClasses * priorsNum; NMSMX(pbuffer, pdetections, pindices, pboxes, psizes); } int detectionsTotal = 0; - detectionsTotal = parallel_sum(classesNum, detectionsTotal, [&](size_t c)->int { + detectionsTotal = parallel_sum(classesNum, detectionsTotal, [&](size_t c) -> int { return detectionsData[n * classesNum + c]; }); @@ -318,9 +389,9 @@ void DetectionOutput::execute(dnnl::stream strm) { std::mutex mtx; parallel_for(classesNum, [&](int c) { const int detections = detectionsData[n * classesNum + c]; - int *pindices = indicesData + n * classesNum * priorsNum + c * priorsNum; + int* pindices = indicesData + n * classesNum * priorsNum + c * priorsNum; - float *pconf = reorderedConfData + n * classesNum * confInfoLen + c * confInfoLen; + float* pconf = reorderedConfData + n * classesNum * confInfoLen + c * confInfoLen; for (int i = 0; i < detections; ++i) { int pr = pindices[i]; @@ -330,7 +401,8 @@ void DetectionOutput::execute(dnnl::stream strm) { } }); - std::sort(confIndicesClassMap.begin(), confIndicesClassMap.end(), + std::sort(confIndicesClassMap.begin(), + confIndicesClassMap.end(), SortScorePairDescend>); confIndicesClassMap.resize(keepTopK); @@ -340,7 +412,7 @@ void DetectionOutput::execute(dnnl::stream strm) { for (size_t j = 0; j < confIndicesClassMap.size(); ++j) { const int cls = confIndicesClassMap[j].second.first; const int pr = confIndicesClassMap[j].second.second; - int *pindices = indicesData + n * classesNum * priorsNum + cls * priorsNum; + int* pindices = indicesData + n * classesNum * priorsNum + cls * priorsNum; pindices[detectionsData[n * classesNum + cls]] = pr; detectionsData[n * classesNum + cls]++; } @@ -351,7 +423,11 @@ void DetectionOutput::execute(dnnl::stream strm) { generateOutput(reorderedConfData, indicesData, detectionsData, decodedBboxesData, dstData); } -inline void DetectionOutput::confFilterCF(const float* pconf, int* pindices, int* pbuffer, int* detectionsData, const int& n) { +inline void DetectionOutput::confFilterCF(const float* pconf, + int* pindices, + int* pbuffer, + int* detectionsData, + const int& n) { // in: reorderedConf // out: pindices count int count = 0; @@ -371,21 +447,27 @@ inline void DetectionOutput::confFilterCF(const float* pconf, int* pindices, int // MX filter is per image filter, max output is prior num(select max for all class within this prior) // NMS is per class, keep topk is per image, final output is per class -inline void DetectionOutput::confFilterMX(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData, const int& n) { +inline void DetectionOutput::confFilterMX(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData, + const int& n) { std::mutex mtx; parallel_for(numPriorsActual[n], [&](size_t p) { // in: origin conf // out: pindices, detectionCount // intentionally code branch from higher level if (withAddBoxPred) { - const bool isARMPrior = ARMConfData[n*priorsNum*2 + p * 2 + 1] < objScore; + const bool isARMPrior = ARMConfData[n * priorsNum * 2 + p * 2 + 1] < objScore; float maxConf = -1; int maxCIdx = 0; for (int c = 1; c < classesNum; ++c) { float conf = confData[p * classesNum + c]; if (isARMPrior) - conf = (c == backgroundClassId) ? 1.0f : 0.0f; // still need refresh conf due to read from origin conf + conf = + (c == backgroundClassId) ? 1.0f : 0.0f; // still need refresh conf due to read from origin conf if (conf >= confidenceThreshold && conf > maxConf) { maxConf = conf; maxCIdx = c; @@ -394,7 +476,7 @@ inline void DetectionOutput::confFilterMX(const float* confData, const float* AR if (maxCIdx > 0) { // include this prior mtx.lock(); - indicesData[detectionsData[0]] = maxCIdx*priorsNum + p; // de-refer to get prior and class id. + indicesData[detectionsData[0]] = maxCIdx * priorsNum + p; // de-refer to get prior and class id. detectionsData[0]++; mtx.unlock(); } @@ -411,7 +493,7 @@ inline void DetectionOutput::confFilterMX(const float* confData, const float* AR if (maxCIdx > 0) { // include this prior and class with max conf mtx.lock(); - indicesData[detectionsData[0]] = maxCIdx*priorsNum + p; // de-refer to get prior and class id. + indicesData[detectionsData[0]] = maxCIdx * priorsNum + p; // de-refer to get prior and class id. detectionsData[0]++; mtx.unlock(); } @@ -423,14 +505,14 @@ inline void DetectionOutput::confFilterMX(const float* confData, const float* AR int count = detectionsData[0]; int k = (topK == -1 ? count : (std::min)(topK, count)); - const float *pconf = reorderedConfData; + const float* pconf = reorderedConfData; // int *indices = indicesData; // int *pbuffer = indicesBufData; topk(indicesData, indicesBufData, pconf, count, k); detectionsData[0] = k; } -inline void DetectionOutput::getActualPriorNum(const float *priorData, int* numPriorsActual, int n) { +inline void DetectionOutput::getActualPriorNum(const float* priorData, int* numPriorsActual, int n) { numPriorsActual[n] = priorsNum; if (!normalized) { int num = 0; @@ -444,16 +526,20 @@ inline void DetectionOutput::getActualPriorNum(const float *priorData, int* numP } } -inline void DetectionOutput::confReorderDense(const float *confData, const float *ARMConfData, float *reorderedConfData) { +inline void DetectionOutput::confReorderDense(const float* confData, + const float* ARMConfData, + float* reorderedConfData) { if (withAddBoxPred) { parallel_for2d(imgNum, priorsNum, [&](size_t n, size_t p) { if (ARMConfData[n * priorsNum * 2 + p * 2 + 1] < objScore) { for (int c = 0; c < classesNum; ++c) { - reorderedConfData[n * priorsNum * classesNum + c * priorsNum + p] = c == backgroundClassId ? 1.0f : 0.0f; + reorderedConfData[n * priorsNum * classesNum + c * priorsNum + p] = + c == backgroundClassId ? 1.0f : 0.0f; } } else { for (int c = 0; c < classesNum; ++c) { - reorderedConfData[n * priorsNum * classesNum + c * priorsNum + p] = confData[n * priorsNum * classesNum + p * classesNum + c]; + reorderedConfData[n * priorsNum * classesNum + c * priorsNum + p] = + confData[n * priorsNum * classesNum + p * classesNum + c]; } } }); @@ -463,20 +549,23 @@ inline void DetectionOutput::confReorderDense(const float *confData, const float parallel_for2d(imgNum, classesNum, [&](size_t n, size_t c) { const int offset = n * priorsNum * classesNum; for (int p = 0; p < priorsNum; ++p) { - reorderedConfData[offset + c * priorsNum + p] = - confData[offset + p * classesNum + c]; + reorderedConfData[offset + c * priorsNum + p] = confData[offset + p * classesNum + c]; } }); } -inline void DetectionOutput::confReorderAndFilterSparsityCF(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData) { +inline void DetectionOutput::confReorderAndFilterSparsityCF(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData) { int* reorderedConfDataIndices = reinterpret_cast(reorderedConfData); for (int n = 0; n < imgNum; ++n) { const int off = n * priorsNum * classesNum; const int offV = n * priorsNum; // vertical info - const int offH = n * confInfoLen * classesNum; // horizontal info + const int offH = n * confInfoLen * classesNum; // horizontal info // reset count parallel_for(classesNum, [&](size_t c) { const int countIdx = offH + c * confInfoLen + priorsNum; @@ -506,7 +595,7 @@ inline void DetectionOutput::confReorderAndFilterSparsityCF(const float* confDat // vertical info for isShareLoc(flag to decode for each prior) if (!priorStatusSet && isShareLoc) { - confInfoForPrior[offV + p] = 1; // 1 for decode + confInfoForPrior[offV + p] = 1; // 1 for decode } } } @@ -542,9 +631,9 @@ inline void DetectionOutput::confReorderAndFilterSparsityCF(const float* confDat const int count = reorderedConfDataIndices[countIdx]; const int k = (topK == -1 ? count : (std::min)(topK, count)); - int *reorderedConfIndices = reorderedConfDataIndices + countIdx + 1; - int *pbuffer = indicesBufData + off + c * priorsNum; - const float *pconf = reorderedConfData + offH + c * confInfoLen; + int* reorderedConfIndices = reorderedConfDataIndices + countIdx + 1; + int* pbuffer = indicesBufData + off + c * priorsNum; + const float* pconf = reorderedConfData + offH + c * confInfoLen; topk(reorderedConfIndices, pbuffer, pconf, count, k); detectionsData[n * classesNum + c] = k; @@ -552,8 +641,12 @@ inline void DetectionOutput::confReorderAndFilterSparsityCF(const float* confDat } } -inline void DetectionOutput::confReorderAndFilterSparsityMX(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData) { +inline void DetectionOutput::confReorderAndFilterSparsityMX(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData) { for (int n = 0; n < imgNum; ++n) { const int off = n * priorsNum * classesNum; const int offV = n * priorsNum; // vertical info @@ -579,7 +672,7 @@ inline void DetectionOutput::confReorderAndFilterSparsityMX(const float* confDat // vertical info for isShareLoc(flag to decode for each prior) if (!priorStatusSet && isShareLoc) { - confInfoForPrior[offV + p] = 1; // 1 for decode + confInfoForPrior[offV + p] = 1; // 1 for decode } // vertical info for MXNet style(max conf for each prior) if (c != 0) { @@ -593,7 +686,8 @@ inline void DetectionOutput::confReorderAndFilterSparsityMX(const float* confDat // MXNet statistic, indices and detectionCount is for each image if (maxCIdx > 0) { mtx.lock(); - indicesData[off + detectionsData[n * classesNum]] = maxCIdx * priorsNum + p; // de-refer to get prior and class id. + indicesData[off + detectionsData[n * classesNum]] = + maxCIdx * priorsNum + p; // de-refer to get prior and class id. detectionsData[n * classesNum]++; mtx.unlock(); } @@ -604,27 +698,27 @@ inline void DetectionOutput::confReorderAndFilterSparsityMX(const float* confDat const int count = detectionsData[n * classesNum]; const int k = (topK == -1 ? count : (std::min)(topK, count)); - const float *pconf = reorderedConfData + off; - int *indices = indicesData + off; - int *pbuffer = indicesBufData + off; + const float* pconf = reorderedConfData + off; + int* indices = indicesData + off; + int* pbuffer = indicesBufData + off; topk(indices, pbuffer, pconf, count, k); detectionsData[n * classesNum] = k; } } // apply locData(offset) to priordata, generate decodedBox -inline void DetectionOutput::decodeBBoxes(const float *priorData, - const float *locData, - const float *varianceData, - float *decodedBboxes, - float *decodedBboxSizes, - int* numPriorsActual, - int n, - const int& offs, - const int& priorSize, - bool decodeType, - const int *confInfoH, - const int *confInfoV) { +inline void DetectionOutput::decodeBBoxes(const float* priorData, + const float* locData, + const float* varianceData, + float* decodedBboxes, + float* decodedBboxSizes, + int* numPriorsActual, + int n, + const int& offs, + const int& priorSize, + bool decodeType, + const int* confInfoH, + const int* confInfoV) { int prNum = numPriorsActual[n]; if (!decodeType) { prNum = priorsNum; @@ -672,8 +766,8 @@ inline void DetectionOutput::decodeBBoxes(const float *priorData, newYMax = priorYMax + varianceData[p * 4 + 3] * locYMax; } } else if (codeType == CodeType::CENTER_SIZE) { - float priorWidth = priorXMax - priorXMin; - float priorHeight = priorYMax - priorYMin; + float priorWidth = priorXMax - priorXMin; + float priorHeight = priorYMax - priorYMin; float priorCenterX = (priorXMin + priorXMax) / 2.0f; float priorCenterY = (priorYMin + priorYMax) / 2.0f; @@ -682,21 +776,21 @@ inline void DetectionOutput::decodeBBoxes(const float *priorData, if (varianceEncodedInTarget) { // variance is encoded in target, we simply need to restore the offset predictions. - decodeBboxCenterX = locXMin * priorWidth + priorCenterX; + decodeBboxCenterX = locXMin * priorWidth + priorCenterX; decodeBboxCenterY = locYMin * priorHeight + priorCenterY; - decodeBboxWidth = std::exp(locXMax) * priorWidth; + decodeBboxWidth = std::exp(locXMax) * priorWidth; decodeBboxHeight = std::exp(locYMax) * priorHeight; } else { // variance is encoded in bbox, we need to scale the offset accordingly. - decodeBboxCenterX = varianceData[p*4 + 0] * locXMin * priorWidth + priorCenterX; - decodeBboxCenterY = varianceData[p*4 + 1] * locYMin * priorHeight + priorCenterY; - decodeBboxWidth = std::exp(varianceData[p*4 + 2] * locXMax) * priorWidth; - decodeBboxHeight = std::exp(varianceData[p*4 + 3] * locYMax) * priorHeight; + decodeBboxCenterX = varianceData[p * 4 + 0] * locXMin * priorWidth + priorCenterX; + decodeBboxCenterY = varianceData[p * 4 + 1] * locYMin * priorHeight + priorCenterY; + decodeBboxWidth = std::exp(varianceData[p * 4 + 2] * locXMax) * priorWidth; + decodeBboxHeight = std::exp(varianceData[p * 4 + 3] * locYMax) * priorHeight; } - newXMin = decodeBboxCenterX - decodeBboxWidth / 2.0f; + newXMin = decodeBboxCenterX - decodeBboxWidth / 2.0f; newYMin = decodeBboxCenterY - decodeBboxHeight / 2.0f; - newXMax = decodeBboxCenterX + decodeBboxWidth / 2.0f; + newXMax = decodeBboxCenterX + decodeBboxWidth / 2.0f; newYMax = decodeBboxCenterY + decodeBboxHeight / 2.0f; } @@ -707,25 +801,20 @@ inline void DetectionOutput::decodeBBoxes(const float *priorData, newYMax = (std::max)(0.0f, (std::min)(1.0f, newYMax)); } - decodedBboxes[p*4 + 0] = newXMin; - decodedBboxes[p*4 + 1] = newYMin; - decodedBboxes[p*4 + 2] = newXMax; - decodedBboxes[p*4 + 3] = newYMax; + decodedBboxes[p * 4 + 0] = newXMin; + decodedBboxes[p * 4 + 1] = newYMin; + decodedBboxes[p * 4 + 2] = newXMax; + decodedBboxes[p * 4 + 3] = newYMax; decodedBboxSizes[p] = (newXMax - newXMin) * (newYMax - newYMin); }); } -inline void DetectionOutput::topk(const int *indicesIn, int *indicesOut, const float *conf, int n, int k) { - std::partial_sort_copy(indicesIn, indicesIn + n, - indicesOut, indicesOut + k, - ConfidenceComparatorDO(conf)); +inline void DetectionOutput::topk(const int* indicesIn, int* indicesOut, const float* conf, int n, int k) { + std::partial_sort_copy(indicesIn, indicesIn + n, indicesOut, indicesOut + k, ConfidenceComparatorDO(conf)); } -static inline float JaccardOverlap(const float *decodedBbox, - const float *bboxSizes, - const int idx1, - const int idx2) { +static inline float JaccardOverlap(const float* decodedBbox, const float* bboxSizes, const int idx1, const int idx2) { const float xmin1 = decodedBbox[idx1 * 4 + 0]; const float ymin1 = decodedBbox[idx1 * 4 + 1]; const float xmax1 = decodedBbox[idx1 * 4 + 2]; @@ -745,7 +834,7 @@ static inline float JaccardOverlap(const float *decodedBbox, float intersectXMax = (std::min)(xmax1, xmax2); float intersectYMax = (std::min)(ymax1, ymax2); - float intersectWidth = intersectXMax - intersectXMin; + float intersectWidth = intersectXMax - intersectXMin; float intersectHeight = intersectYMax - intersectYMin; if (intersectWidth <= 0 || intersectHeight <= 0) { @@ -760,10 +849,10 @@ static inline float JaccardOverlap(const float *decodedBbox, } inline void DetectionOutput::NMSCF(int* indicesIn, - int& detections, - int* indicesOut, - const float* bboxes, - const float* boxSizes) { + int& detections, + int* indicesOut, + const float* bboxes, + const float* boxSizes) { // nms for this class int countIn = detections; detections = 0; @@ -787,10 +876,10 @@ inline void DetectionOutput::NMSCF(int* indicesIn, } inline void DetectionOutput::NMSMX(int* indicesIn, - int* detections, - int* indicesOut, - const float* bboxes, - const float* sizes) { + int* detections, + int* indicesOut, + const float* bboxes, + const float* sizes) { // Input is candidate for image, output is candidate for each class within image int countIn = detections[0]; detections[0] = 0; @@ -801,8 +890,8 @@ inline void DetectionOutput::NMSMX(int* indicesIn, const int prior = idx % priorsNum; // nms within this class - int &ndetection = detections[cls]; - int *pindices = indicesOut + cls * priorsNum; + int& ndetection = detections[cls]; + int* pindices = indicesOut + cls * priorsNum; bool keep = true; for (int k = 0; k < ndetection; ++k) { @@ -825,8 +914,11 @@ inline void DetectionOutput::NMSMX(int* indicesIn, } } -inline void DetectionOutput::generateOutput(float* reorderedConfData, int* indicesData, int* detectionsData, float* decodedBboxesData, - float* dstData) { +inline void DetectionOutput::generateOutput(float* reorderedConfData, + int* indicesData, + int* detectionsData, + float* decodedBboxesData, + float* dstData) { const auto& outDims = getChildEdgeAt(0)->getMemory().getStaticDims(); const int numResults = outDims[2]; const int DETECTION_SIZE = outDims[3]; @@ -850,26 +942,22 @@ inline void DetectionOutput::generateOutput(float* reorderedConfData, int* indic // set final detection result to output blob int count = 0; for (int n = 0; n < imgNum; ++n) { - const float *pconf = reorderedConfData + n * confInfoLen * classesNum; - const float *pboxes = decodedBboxesData + n * priorsNum * 4 * locNumForClasses; - const int *pindices = indicesData + n * classesNum * priorsNum; + const float* pconf = reorderedConfData + n * confInfoLen * classesNum; + const float* pboxes = decodedBboxesData + n * priorsNum * 4 * locNumForClasses; + const int* pindices = indicesData + n * classesNum * priorsNum; for (int c = 0; c < classesNum; ++c) { for (int i = 0; i < detectionsData[n * classesNum + c]; ++i) { int prIdx = pindices[c * priorsNum + i]; dstData[count * DETECTION_SIZE + 0] = static_cast(n); - dstData[count * DETECTION_SIZE + 1] = static_cast(decreaseClassId ? c-1 : c); + dstData[count * DETECTION_SIZE + 1] = static_cast(decreaseClassId ? c - 1 : c); dstData[count * DETECTION_SIZE + 2] = pconf[c * confInfoLen + prIdx]; - float xmin = isShareLoc ? pboxes[prIdx * 4 + 0] : - pboxes[c * 4 * priorsNum + prIdx * 4 + 0]; - float ymin = isShareLoc ? pboxes[prIdx * 4 + 1] : - pboxes[c * 4 * priorsNum + prIdx * 4 + 1]; - float xmax = isShareLoc ? pboxes[prIdx * 4 + 2] : - pboxes[c * 4 * priorsNum + prIdx * 4 + 2]; - float ymax = isShareLoc ? pboxes[prIdx * 4 + 3] : - pboxes[c * 4 * priorsNum + prIdx * 4 + 3]; + float xmin = isShareLoc ? pboxes[prIdx * 4 + 0] : pboxes[c * 4 * priorsNum + prIdx * 4 + 0]; + float ymin = isShareLoc ? pboxes[prIdx * 4 + 1] : pboxes[c * 4 * priorsNum + prIdx * 4 + 1]; + float xmax = isShareLoc ? pboxes[prIdx * 4 + 2] : pboxes[c * 4 * priorsNum + prIdx * 4 + 2]; + float ymax = isShareLoc ? pboxes[prIdx * 4 + 3] : pboxes[c * 4 * priorsNum + prIdx * 4 + 3]; if (clipAfterNMS) { xmin = (std::max)(0.0f, (std::min)(1.0f, xmin)); @@ -898,6 +986,6 @@ bool DetectionOutput::created() const { return getType() == Type::DetectionOutput; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/detection_output.h b/src/plugins/intel_cpu/src/nodes/detection_output.h index 418898f011f313..1a42bfa9b2980a 100644 --- a/src/plugins/intel_cpu/src/nodes/detection_output.h +++ b/src/plugins/intel_cpu/src/nodes/detection_output.h @@ -15,7 +15,7 @@ class DetectionOutput : public Node { public: DetectionOutput(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -47,8 +47,8 @@ class DetectionOutput : public Node { float sparsityThreshold = 0.03f; int topK = 0; float NMSThreshold = 0.0f; - bool clipBeforeNMS = false; - bool clipAfterNMS = false; + bool clipBeforeNMS = false; + bool clipAfterNMS = false; int backgroundClassId = 0; bool decreaseClassId = false; int keepTopK = 0; @@ -75,28 +75,52 @@ class DetectionOutput : public Node { inline void confFilterCF(const float* pConf, int* pindices, int* pbuffer, int* detectionsData, const int& n); - inline void confFilterMX(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData, const int& n); - - inline void confReorderAndFilterSparsityCF(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData); - - inline void confReorderAndFilterSparsityMX(const float* confData, const float* ARMConfData, float* reorderedConfData, - int* indicesData, int* indicesBufData, int* detectionsData); - - inline void decodeBBoxes(const float* prior_data, const float* loc_data, const float* variance_data, - float* decoded_bboxes, float* decoded_bbox_sizes, int* num_priors_actual, int n, const int& offs, const int& pr_size, - bool decodeType = true, const int* conf_info_h = nullptr, const int* conf_info_v = nullptr); // decodeType is false after ARM - - inline void NMSCF(int* indicesIn, int& detections, int* indicesOut, - const float* bboxes, const float* boxSizes); - - inline void NMSMX(int* indicesIn, int* detections, int* indicesOut, - const float* bboxes, const float* sizes); + inline void confFilterMX(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData, + const int& n); + + inline void confReorderAndFilterSparsityCF(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData); + + inline void confReorderAndFilterSparsityMX(const float* confData, + const float* ARMConfData, + float* reorderedConfData, + int* indicesData, + int* indicesBufData, + int* detectionsData); + + inline void decodeBBoxes(const float* prior_data, + const float* loc_data, + const float* variance_data, + float* decoded_bboxes, + float* decoded_bbox_sizes, + int* num_priors_actual, + int n, + const int& offs, + const int& pr_size, + bool decodeType = true, + const int* conf_info_h = nullptr, + const int* conf_info_v = nullptr); // decodeType is false after ARM + + inline void NMSCF(int* indicesIn, int& detections, int* indicesOut, const float* bboxes, const float* boxSizes); + + inline void NMSMX(int* indicesIn, int* detections, int* indicesOut, const float* bboxes, const float* sizes); inline void topk(const int* indicesIn, int* indicesOut, const float* conf, int n, int k); - inline void generateOutput(float* reorderedConfData, int* indicesData, int* detectionsData, float* decodedBboxesData, float* dstData); + inline void generateOutput(float* reorderedConfData, + int* indicesData, + int* detectionsData, + float* decodedBboxesData, + float* dstData); std::vector decodedBboxes; std::vector indicesBuffer; @@ -110,6 +134,6 @@ class DetectionOutput : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/dft.cpp b/src/plugins/intel_cpu/src/nodes/dft.cpp index 76ecbbb36617f5..5fa8053d7024d7 100644 --- a/src/plugins/intel_cpu/src/nodes/dft.cpp +++ b/src/plugins/intel_cpu/src/nodes/dft.cpp @@ -4,17 +4,17 @@ #include "dft.h" +#include +#include #include #include -#include -#include "dnnl_extension_utils.h" -#include "openvino/core/parallel.hpp" +#include "common/cpu_memcpy.h" +#include "dnnl_extension_utils.h" #include "onednn/dnnl.h" +#include "openvino/core/parallel.hpp" #include "utils/general_utils.h" -#include "common/cpu_memcpy.h" #include "utils/ngraph_utils.hpp" -#include using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64; @@ -104,10 +104,10 @@ void DFT::initSupportedPrimitiveDescriptors() { } } - std::vector inDataConfigurators({{LayoutType::ncsp, ov::element::f32}, - {LayoutType::ncsp, ov::element::i32}}); + std::vector inDataConfigurators( + {{LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::i32}}); if (inputShapes.size() > SIGNAL_SIZE_INDEX) - inDataConfigurators.push_back({LayoutType::ncsp, ov::element::i32}); + inDataConfigurators.push_back({LayoutType::ncsp, ov::element::i32}); addSupportedPrimDesc(inDataConfigurators, {{LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } @@ -172,8 +172,12 @@ size_t calculateOffsetFromStrides(const std::vector& coords, const std:: return offset; } -void gatherToBufferND(float* buffer, const float* data, size_t axis, const std::vector& dimIndexes, - const std::vector& shape, const std::vector& strides) { +void gatherToBufferND(float* buffer, + const float* data, + size_t axis, + const std::vector& dimIndexes, + const std::vector& shape, + const std::vector& strides) { size_t numberOfComplex = shape[axis]; size_t offset = calculateOffsetFromStrides(dimIndexes, strides); @@ -184,8 +188,12 @@ void gatherToBufferND(float* buffer, const float* data, size_t axis, const std:: } } -void applyBufferND(const float* buffer, float* output, size_t axis, const std::vector& dimIndexes, - const std::vector& shape, const std::vector& strides) { +void applyBufferND(const float* buffer, + float* output, + size_t axis, + const std::vector& dimIndexes, + const std::vector& shape, + const std::vector& strides) { size_t numberOfComplex = shape[axis]; size_t offset = calculateOffsetFromStrides(dimIndexes, strides); @@ -196,8 +204,12 @@ void applyBufferND(const float* buffer, float* output, size_t axis, const std::v } } -void copyDataToOutputWithSignalSize(const float* input, const std::vector& inputShape, const std::vector& inputStrides, - float* output, const std::vector& outputShape, const std::vector& outputStrides) { +void copyDataToOutputWithSignalSize(const float* input, + const std::vector& inputShape, + const std::vector& inputStrides, + float* output, + const std::vector& outputShape, + const std::vector& outputStrides) { auto totalInput = std::accumulate(inputShape.begin(), inputShape.end(), size_t(1), std::multiplies()); auto totalOutput = std::accumulate(outputShape.begin(), outputShape.end(), size_t(1), std::multiplies()); std::fill_n(output, totalOutput, 0.f); @@ -221,7 +233,10 @@ void copyDataToOutputWithSignalSize(const float* input, const std::vector inputStridesRange(inputStrides.begin(), inputStrides.begin() + iterationRange.size()); const std::vector outputStridesRange(outputStrides.begin(), outputStrides.begin() + iterationRange.size()); - const size_t blockSize = std::accumulate(inputShape.begin() + lastChangedDim + 1, inputShape.end(), size_t(1), std::multiplies()); + const size_t blockSize = std::accumulate(inputShape.begin() + lastChangedDim + 1, + inputShape.end(), + size_t(1), + std::multiplies()); const size_t blockSizeBytes = blockSize * sizeof(float); std::vector iterationCounter(iterationRange.size(), 0); do { @@ -231,7 +246,7 @@ void copyDataToOutputWithSignalSize(const float* input, const std::vectorgetMemory().getStaticDims(); @@ -269,7 +284,8 @@ void DFT::execute(dnnl::stream strm) { if (inputShape != outputShape) { copyDataToOutputWithSignalSize(src, inputShape, inputStrides, dst, outputShape, outputStrides); } else { - auto totalElements = std::accumulate(inputShape.begin(), inputShape.end(), size_t(1), std::multiplies()); + auto totalElements = + std::accumulate(inputShape.begin(), inputShape.end(), size_t(1), std::multiplies()); cpu_memcpy(dst, src, totalElements * sizeof(float)); } @@ -315,17 +331,32 @@ void DFT::dftNd(float* output, std::vector gatheredData(outputLen * 2); auto parallelIterationCounter = iterationCounter; parallelIterationCounter[parallelDimIndex] = dim; - gatherToBufferND(gatheredData.data(), output, currentAxis, parallelIterationCounter, outputShape, outputStrides); + gatherToBufferND(gatheredData.data(), + output, + currentAxis, + parallelIterationCounter, + outputShape, + outputStrides); const float* resultBufPtr; fft(gatheredData.data(), gatheredData.data() + outputLen, outputLen, inverse, false, &resultBufPtr); - applyBufferND(resultBufPtr, output, currentAxis, parallelIterationCounter, outputShape, outputStrides); + applyBufferND(resultBufPtr, + output, + currentAxis, + parallelIterationCounter, + outputShape, + outputStrides); }); iterationCounter[parallelDimIndex] = iterationRange[parallelDimIndex] - 1; } while (nextIterationStep(iterationCounter, iterationRange, currentAxis)); } else { std::vector gatheredData(outputLen); do { - gatherToBufferND(gatheredData.data(), output, currentAxis, iterationCounter, outputShape, outputStrides); + gatherToBufferND(gatheredData.data(), + output, + currentAxis, + iterationCounter, + outputShape, + outputStrides); naiveDFT(gatheredData.data(), outputLen, inverse); applyBufferND(gatheredData.data(), output, currentAxis, iterationCounter, outputShape, outputStrides); } while (nextIterationStep(iterationCounter, iterationRange, currentAxis)); @@ -585,6 +616,6 @@ void DFT::createJITKernels(bool hasDFT, bool hasFFT) { } #endif } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/dft.h b/src/plugins/intel_cpu/src/nodes/dft.h index 82b6ea3b33a618..eef5e2ea529066 100644 --- a/src/plugins/intel_cpu/src/nodes/dft.h +++ b/src/plugins/intel_cpu/src/nodes/dft.h @@ -63,6 +63,6 @@ class DFT : public Node { bool lastInverse; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/eltwise.cpp b/src/plugins/intel_cpu/src/nodes/eltwise.cpp index 54cf435009059d..5daefa01eddfab 100644 --- a/src/plugins/intel_cpu/src/nodes/eltwise.cpp +++ b/src/plugins/intel_cpu/src/nodes/eltwise.cpp @@ -3,6 +3,18 @@ // #include "eltwise.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "common/cpu_convert.h" #include "common/float16.hpp" #include "common/primitive_hashing_utils.hpp" @@ -10,6 +22,10 @@ #include "cpu/ref_eltwise.hpp" #include "cpu_types.h" #include "dnnl_extension_utils.h" +#include "emitters/plugin/x64/jit_bf16_emitters.hpp" +#include "emitters/plugin/x64/jit_dnnl_emitters.hpp" +#include "emitters/plugin/x64/jit_eltwise_emitters.hpp" +#include "emitters/plugin/x64/jit_emitter.hpp" #include "fake_quantize.h" #include "input.h" #include "memory_desc/dnnl_blocked_memory_desc.h" @@ -17,13 +33,13 @@ #include "onednn/dnnl.h" #include "openvino/core/except.hpp" #include "openvino/core/parallel.hpp" -#include "openvino/opsets/opset1.hpp" #include "openvino/op/bitwise_and.hpp" #include "openvino/op/bitwise_left_shift.hpp" #include "openvino/op/bitwise_not.hpp" #include "openvino/op/bitwise_or.hpp" #include "openvino/op/bitwise_right_shift.hpp" #include "openvino/op/bitwise_xor.hpp" +#include "openvino/opsets/opset1.hpp" #include "pooling.h" #include "selective_build.h" #include "shape_inference/custom/eltwise.hpp" @@ -35,27 +51,10 @@ #include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "emitters/plugin/x64/jit_emitter.hpp" -#include "emitters/plugin/x64/jit_eltwise_emitters.hpp" -#include "emitters/plugin/x64/jit_dnnl_emitters.hpp" -#include "emitters/plugin/x64/jit_bf16_emitters.hpp" - #if defined(OPENVINO_ARCH_ARM64) -#include "cpu/aarch64/cpu_isa_traits.hpp" -#include "kernels/aarch64/jit_uni_eltwise_generic.hpp" -#include "executors/aarch64/jit_eltwise.hpp" +# include "cpu/aarch64/cpu_isa_traits.hpp" +# include "executors/aarch64/jit_eltwise.hpp" +# include "kernels/aarch64/jit_uni_eltwise_generic.hpp" #endif using namespace dnnl::impl::utils; @@ -92,60 +91,72 @@ bool jitIsSupported(const Node* node, beta, gamma); } -} // namespace +} // namespace #endif #if defined(OPENVINO_ARCH_X86_64) -template +template struct SupportedPrecisions { - void operator()(std::set> &precisions) { + void operator()(std::set>& precisions) { precisions = T::get_supported_precisions(); } }; struct EltwiseEmitterContext { std::shared_ptr emitter; - jit_generator *host; + jit_generator* host; cpu_isa_t host_isa; const EltwiseData& opData; ov::element::Type exec_prc; }; -template +template struct EltwiseEmitter { - void operator()(EltwiseEmitterContext & ctx) { + void operator()(EltwiseEmitterContext& ctx) { ctx.emitter = std::make_shared(ctx.host, ctx.host_isa, ctx.exec_prc); } }; -template<> +template <> struct EltwiseEmitter { - void operator()(EltwiseEmitterContext & ctx) { + void operator()(EltwiseEmitterContext& ctx) { auto algKind = static_cast(ctx.opData.onednnAlgorithm); - ctx.emitter = std::make_shared(ctx.host, ctx.host_isa, algKind, - ctx.opData.alpha, ctx.opData.beta, ctx.exec_prc); + ctx.emitter = std::make_shared(ctx.host, + ctx.host_isa, + algKind, + ctx.opData.alpha, + ctx.opData.beta, + ctx.exec_prc); } }; -template<> +template <> struct EltwiseEmitter { - void operator()(EltwiseEmitterContext & ctx) { - ctx.emitter = std::make_shared(ctx.host, ctx.host_isa, ctx.opData.alpha, - ctx.opData.beta, ctx.opData.gamma, ctx.exec_prc); + void operator()(EltwiseEmitterContext& ctx) { + ctx.emitter = std::make_shared(ctx.host, + ctx.host_isa, + ctx.opData.alpha, + ctx.opData.beta, + ctx.opData.gamma, + ctx.exec_prc); } }; -template<> +template <> struct EltwiseEmitter { - void operator()(EltwiseEmitterContext & ctx) { - ctx.emitter = std::make_shared(ctx.host, ctx.host_isa, ctx.exec_prc, ctx.opData.alpha, ctx.opData.beta); + void operator()(EltwiseEmitterContext& ctx) { + ctx.emitter = std::make_shared(ctx.host, + ctx.host_isa, + ctx.exec_prc, + ctx.opData.alpha, + ctx.opData.beta); } }; static void set_intersection(const std::set>& precisions1, - const std::set>& precisions2, - std::set>& intersection) { + const std::set>& precisions2, + std::set>& intersection) { std::map intersection_types; for (auto it1 = precisions1.begin(); it1 != precisions1.end(); ++it1) { @@ -195,15 +206,8 @@ ov::element::Type eltwise_precision_helper::get_precision(const size_t inputs_nu supported_precision_intersection = prcs_intersect; } - static const element::Type exec_precisions_priority[] = { - element::u8, - element::i8, - element::u16, - element::i16, - element::bf16, - element::i32, - element::f32 - }; + static const element::Type exec_precisions_priority[] = + {element::u8, element::i8, element::u16, element::i16, element::bf16, element::i32, element::f32}; for (const auto prc : exec_precisions_priority) { if (std::any_of(supported_precision_intersection.begin(), @@ -234,59 +238,62 @@ ov::element::Type eltwise_precision_helper::get_precision(const size_t inputs_nu std::set> eltwise_precision_helper::get_supported_precisions(const Algorithm& algo) { std::set> precisions; - OV_SWITCH(intel_cpu, SupportedPrecisions, precisions, algo, - OV_CASE(Algorithm::EltwiseRelu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseGeluErf, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseGeluTanh, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseElu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseTanh, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSigmoid, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseAbs, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSqrt, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSoftRelu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseClamp, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSwish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseHswish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseMish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseHsigmoid, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseRoundHalfToEven, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseRoundHalfAwayFromZero, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseAdd, jit_add_emitter), - OV_CASE(Algorithm::EltwiseMulAdd, jit_mul_add_emitter), - OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter), - OV_CASE(Algorithm::EltwiseMultiply, jit_multiply_emitter), - OV_CASE(Algorithm::EltwiseDivide, jit_divide_emitter), - OV_CASE(Algorithm::EltwiseFloor, jit_floor_emitter), - OV_CASE(Algorithm::EltwiseCeiling, jit_ceiling_emitter), - OV_CASE(Algorithm::EltwiseFloorMod, jit_floor_mod_emitter), - OV_CASE(Algorithm::EltwiseMod, jit_mod_emitter), - OV_CASE(Algorithm::EltwiseMaximum, jit_maximum_emitter), - OV_CASE(Algorithm::EltwiseMinimum, jit_minimum_emitter), - OV_CASE(Algorithm::EltwiseExp, jit_exp_emitter), - OV_CASE(Algorithm::EltwiseSquaredDifference, jit_squared_difference_emitter), - OV_CASE(Algorithm::EltwisePowerDynamic, jit_power_dynamic_emitter), - OV_CASE(Algorithm::EltwiseEqual, jit_equal_emitter), - OV_CASE(Algorithm::EltwiseNotEqual, jit_not_equal_emitter), - OV_CASE(Algorithm::EltwiseGreater, jit_greater_emitter), - OV_CASE(Algorithm::EltwiseGreaterEqual, jit_greater_equal_emitter), - OV_CASE(Algorithm::EltwiseLess, jit_less_emitter), - OV_CASE(Algorithm::EltwiseLessEqual, jit_less_equal_emitter), - OV_CASE(Algorithm::EltwiseLogicalAnd, jit_logical_and_emitter), - OV_CASE(Algorithm::EltwiseLogicalOr, jit_logical_or_emitter), - OV_CASE(Algorithm::EltwiseLogicalXor, jit_logical_xor_emitter), - OV_CASE(Algorithm::EltwiseLogicalNot, jit_logical_not_emitter), - OV_CASE(Algorithm::EltwisePowerStatic, jit_power_static_emitter), - OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), - OV_CASE(Algorithm::EltwiseErf, jit_erf_emitter), - OV_CASE(Algorithm::EltwiseSoftSign, jit_soft_sign_emitter), - OV_CASE(Algorithm::EltwiseIsFinite, jit_is_finite_emitter), - OV_CASE(Algorithm::EltwiseIsInf, jit_is_inf_emitter), - OV_CASE(Algorithm::EltwiseIsNaN, jit_is_nan_emitter), - OV_CASE(Algorithm::EltwiseSelect, jit_select_emitter), - OV_CASE(Algorithm::EltwiseBitwiseAnd, jit_bitwise_and_emitter), - OV_CASE(Algorithm::EltwiseBitwiseNot, jit_bitwise_not_emitter), - OV_CASE(Algorithm::EltwiseBitwiseOr, jit_bitwise_or_emitter), - OV_CASE(Algorithm::EltwiseBitwiseXor, jit_bitwise_xor_emitter)); + OV_SWITCH(intel_cpu, + SupportedPrecisions, + precisions, + algo, + OV_CASE(Algorithm::EltwiseRelu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseGeluErf, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseGeluTanh, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseElu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseTanh, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSigmoid, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseAbs, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSqrt, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSoftRelu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseClamp, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSwish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseHswish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseMish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseHsigmoid, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseRoundHalfToEven, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseRoundHalfAwayFromZero, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseAdd, jit_add_emitter), + OV_CASE(Algorithm::EltwiseMulAdd, jit_mul_add_emitter), + OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter), + OV_CASE(Algorithm::EltwiseMultiply, jit_multiply_emitter), + OV_CASE(Algorithm::EltwiseDivide, jit_divide_emitter), + OV_CASE(Algorithm::EltwiseFloor, jit_floor_emitter), + OV_CASE(Algorithm::EltwiseCeiling, jit_ceiling_emitter), + OV_CASE(Algorithm::EltwiseFloorMod, jit_floor_mod_emitter), + OV_CASE(Algorithm::EltwiseMod, jit_mod_emitter), + OV_CASE(Algorithm::EltwiseMaximum, jit_maximum_emitter), + OV_CASE(Algorithm::EltwiseMinimum, jit_minimum_emitter), + OV_CASE(Algorithm::EltwiseExp, jit_exp_emitter), + OV_CASE(Algorithm::EltwiseSquaredDifference, jit_squared_difference_emitter), + OV_CASE(Algorithm::EltwisePowerDynamic, jit_power_dynamic_emitter), + OV_CASE(Algorithm::EltwiseEqual, jit_equal_emitter), + OV_CASE(Algorithm::EltwiseNotEqual, jit_not_equal_emitter), + OV_CASE(Algorithm::EltwiseGreater, jit_greater_emitter), + OV_CASE(Algorithm::EltwiseGreaterEqual, jit_greater_equal_emitter), + OV_CASE(Algorithm::EltwiseLess, jit_less_emitter), + OV_CASE(Algorithm::EltwiseLessEqual, jit_less_equal_emitter), + OV_CASE(Algorithm::EltwiseLogicalAnd, jit_logical_and_emitter), + OV_CASE(Algorithm::EltwiseLogicalOr, jit_logical_or_emitter), + OV_CASE(Algorithm::EltwiseLogicalXor, jit_logical_xor_emitter), + OV_CASE(Algorithm::EltwiseLogicalNot, jit_logical_not_emitter), + OV_CASE(Algorithm::EltwisePowerStatic, jit_power_static_emitter), + OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), + OV_CASE(Algorithm::EltwiseErf, jit_erf_emitter), + OV_CASE(Algorithm::EltwiseSoftSign, jit_soft_sign_emitter), + OV_CASE(Algorithm::EltwiseIsFinite, jit_is_finite_emitter), + OV_CASE(Algorithm::EltwiseIsInf, jit_is_inf_emitter), + OV_CASE(Algorithm::EltwiseIsNaN, jit_is_nan_emitter), + OV_CASE(Algorithm::EltwiseSelect, jit_select_emitter), + OV_CASE(Algorithm::EltwiseBitwiseAnd, jit_bitwise_and_emitter), + OV_CASE(Algorithm::EltwiseBitwiseNot, jit_bitwise_not_emitter), + OV_CASE(Algorithm::EltwiseBitwiseOr, jit_bitwise_or_emitter), + OV_CASE(Algorithm::EltwiseBitwiseXor, jit_bitwise_xor_emitter)); if (precisions.empty()) OPENVINO_THROW("Unsupported operation type for Eltwise emitter"); @@ -302,7 +309,11 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener const std::vector& eltwise_data, const std::vector& ops_list, const dnnl::post_ops& post_ops) - : jit_uni_eltwise_kernel(jep), jit_generator(jit_name()), eltwise_data_(eltwise_data), ops_list_(ops_list), post_ops_(post_ops) {} + : jit_uni_eltwise_kernel(jep), + jit_generator(jit_name()), + eltwise_data_(eltwise_data), + ops_list_(ops_list), + post_ops_(post_ops) {} void create_ker() override { jit_generator::create_kernel(); @@ -322,14 +333,18 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener if (!p->entry_[i].is_quantization()) { OPENVINO_THROW("Eltwise jitter error. Unsupported post op detected"); } - quantization_injectors.push_back(std::make_shared>( - this, p->entry_[i], vmm_d_weights, vmm_d_bias, reg_d_weights, reg_d_bias)); + quantization_injectors.push_back(std::make_shared>(this, + p->entry_[i], + vmm_d_weights, + vmm_d_bias, + reg_d_weights, + reg_d_bias)); } if (mayiuse(avx512_core) || mayiuse(avx2_vnni_2)) uni_vcvtneps2bf16.reset(new jit_uni_vcvtneps2bf16(this, isa)); - const auto &jep = jep_; + const auto& jep = jep_; this->preamble(); @@ -435,7 +450,11 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener for (size_t j = 0; j < min_src_size / vec_step; j++) { for (size_t i = 0; i < jep.inputs_number; i++) { if (jep.src_size[i] != 1) - load_vector(get_vmm_reg(i), ptr[get_src_reg(i) + j * vec_step * jep.src_prc[i].size()], jep.src_prc[i], exec_prc, false); + load_vector(get_vmm_reg(i), + ptr[get_src_reg(i) + j * vec_step * jep.src_prc[i].size()], + jep.src_prc[i], + exec_prc, + false); } compute_eltwise_op(); @@ -449,7 +468,10 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener for (size_t j = tail_start; j < min_src_size; j++) { for (size_t i = 0; i < jep.inputs_number; i++) { if (jep.src_size[i] != 1) - load_scalar(get_xmm_reg(i), ptr[get_src_reg(i) + j * jep.src_prc[i].size()], jep.src_prc[i], exec_prc); + load_scalar(get_xmm_reg(i), + ptr[get_src_reg(i) + j * jep.src_prc[i].size()], + jep.src_prc[i], + exec_prc); } compute_eltwise_op(); @@ -571,7 +593,7 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener } Reg64 reg_post_op_ptrs = rax; - Reg64 start_to_offsets = reg_post_op_ptrs; // rax + Reg64 start_to_offsets = reg_post_op_ptrs; // rax Reg64 reg_dst = rbx; Reg64 reg_work_amount = rdx; @@ -606,67 +628,64 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener const dnnl::post_ops& post_ops_; std::shared_ptr create_eltwise_emitter(const EltwiseData& data, ov::element::Type exec_prec) { - EltwiseEmitterContext ctx = { - nullptr, - this, - isa, - data, - exec_prec - }; - - OV_SWITCH(intel_cpu, EltwiseEmitter, ctx, data.algo, - OV_CASE(Algorithm::EltwiseRelu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseGeluErf, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseGeluTanh, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseElu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseTanh, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSigmoid, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseAbs, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSqrt, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSoftRelu, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseClamp, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseSwish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseHswish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseMish, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseHsigmoid, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseRoundHalfToEven, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseRoundHalfAwayFromZero, jit_dnnl_aux_emitter), - OV_CASE(Algorithm::EltwiseAdd, jit_add_emitter), - OV_CASE(Algorithm::EltwiseMulAdd, jit_mul_add_emitter), - OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter), - OV_CASE(Algorithm::EltwiseMultiply, jit_multiply_emitter), - OV_CASE(Algorithm::EltwiseDivide, jit_divide_emitter), - OV_CASE(Algorithm::EltwiseFloor, jit_floor_emitter), - OV_CASE(Algorithm::EltwiseCeiling, jit_ceiling_emitter), - OV_CASE(Algorithm::EltwiseFloorMod, jit_floor_mod_emitter), - OV_CASE(Algorithm::EltwiseMod, jit_mod_emitter), - OV_CASE(Algorithm::EltwiseMaximum, jit_maximum_emitter), - OV_CASE(Algorithm::EltwiseMinimum, jit_minimum_emitter), - OV_CASE(Algorithm::EltwiseExp, jit_exp_emitter), - OV_CASE(Algorithm::EltwiseSquaredDifference, jit_squared_difference_emitter), - OV_CASE(Algorithm::EltwisePowerDynamic, jit_power_dynamic_emitter), - OV_CASE(Algorithm::EltwiseEqual, jit_equal_emitter), - OV_CASE(Algorithm::EltwiseNotEqual, jit_not_equal_emitter), - OV_CASE(Algorithm::EltwiseGreater, jit_greater_emitter), - OV_CASE(Algorithm::EltwiseGreaterEqual, jit_greater_equal_emitter), - OV_CASE(Algorithm::EltwiseLess, jit_less_emitter), - OV_CASE(Algorithm::EltwiseLessEqual, jit_less_equal_emitter), - OV_CASE(Algorithm::EltwiseLogicalAnd, jit_logical_and_emitter), - OV_CASE(Algorithm::EltwiseLogicalOr, jit_logical_or_emitter), - OV_CASE(Algorithm::EltwiseLogicalXor, jit_logical_xor_emitter), - OV_CASE(Algorithm::EltwiseLogicalNot, jit_logical_not_emitter), - OV_CASE(Algorithm::EltwisePowerStatic, jit_power_static_emitter), - OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), - OV_CASE(Algorithm::EltwiseErf, jit_erf_emitter), - OV_CASE(Algorithm::EltwiseSoftSign, jit_soft_sign_emitter), - OV_CASE(Algorithm::EltwiseIsFinite, jit_is_finite_emitter), - OV_CASE(Algorithm::EltwiseIsInf, jit_is_inf_emitter), - OV_CASE(Algorithm::EltwiseIsNaN, jit_is_nan_emitter), - OV_CASE(Algorithm::EltwiseSelect, jit_select_emitter), - OV_CASE(Algorithm::EltwiseBitwiseAnd, jit_bitwise_and_emitter), - OV_CASE(Algorithm::EltwiseBitwiseNot, jit_bitwise_not_emitter), - OV_CASE(Algorithm::EltwiseBitwiseOr, jit_bitwise_or_emitter), - OV_CASE(Algorithm::EltwiseBitwiseXor, jit_bitwise_xor_emitter)); + EltwiseEmitterContext ctx = {nullptr, this, isa, data, exec_prec}; + + OV_SWITCH(intel_cpu, + EltwiseEmitter, + ctx, + data.algo, + OV_CASE(Algorithm::EltwiseRelu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseGeluErf, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseGeluTanh, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseElu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseTanh, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSigmoid, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseAbs, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSqrt, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSoftRelu, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseClamp, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseSwish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseHswish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseMish, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseHsigmoid, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseRoundHalfToEven, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseRoundHalfAwayFromZero, jit_dnnl_aux_emitter), + OV_CASE(Algorithm::EltwiseAdd, jit_add_emitter), + OV_CASE(Algorithm::EltwiseMulAdd, jit_mul_add_emitter), + OV_CASE(Algorithm::EltwiseSubtract, jit_subtract_emitter), + OV_CASE(Algorithm::EltwiseMultiply, jit_multiply_emitter), + OV_CASE(Algorithm::EltwiseDivide, jit_divide_emitter), + OV_CASE(Algorithm::EltwiseFloor, jit_floor_emitter), + OV_CASE(Algorithm::EltwiseCeiling, jit_ceiling_emitter), + OV_CASE(Algorithm::EltwiseFloorMod, jit_floor_mod_emitter), + OV_CASE(Algorithm::EltwiseMod, jit_mod_emitter), + OV_CASE(Algorithm::EltwiseMaximum, jit_maximum_emitter), + OV_CASE(Algorithm::EltwiseMinimum, jit_minimum_emitter), + OV_CASE(Algorithm::EltwiseExp, jit_exp_emitter), + OV_CASE(Algorithm::EltwiseSquaredDifference, jit_squared_difference_emitter), + OV_CASE(Algorithm::EltwisePowerDynamic, jit_power_dynamic_emitter), + OV_CASE(Algorithm::EltwiseEqual, jit_equal_emitter), + OV_CASE(Algorithm::EltwiseNotEqual, jit_not_equal_emitter), + OV_CASE(Algorithm::EltwiseGreater, jit_greater_emitter), + OV_CASE(Algorithm::EltwiseGreaterEqual, jit_greater_equal_emitter), + OV_CASE(Algorithm::EltwiseLess, jit_less_emitter), + OV_CASE(Algorithm::EltwiseLessEqual, jit_less_equal_emitter), + OV_CASE(Algorithm::EltwiseLogicalAnd, jit_logical_and_emitter), + OV_CASE(Algorithm::EltwiseLogicalOr, jit_logical_or_emitter), + OV_CASE(Algorithm::EltwiseLogicalXor, jit_logical_xor_emitter), + OV_CASE(Algorithm::EltwiseLogicalNot, jit_logical_not_emitter), + OV_CASE(Algorithm::EltwisePowerStatic, jit_power_static_emitter), + OV_CASE(Algorithm::EltwisePrelu, jit_prelu_emitter), + OV_CASE(Algorithm::EltwiseErf, jit_erf_emitter), + OV_CASE(Algorithm::EltwiseSoftSign, jit_soft_sign_emitter), + OV_CASE(Algorithm::EltwiseIsFinite, jit_is_finite_emitter), + OV_CASE(Algorithm::EltwiseIsInf, jit_is_inf_emitter), + OV_CASE(Algorithm::EltwiseIsNaN, jit_is_nan_emitter), + OV_CASE(Algorithm::EltwiseSelect, jit_select_emitter), + OV_CASE(Algorithm::EltwiseBitwiseAnd, jit_bitwise_and_emitter), + OV_CASE(Algorithm::EltwiseBitwiseNot, jit_bitwise_not_emitter), + OV_CASE(Algorithm::EltwiseBitwiseOr, jit_bitwise_or_emitter), + OV_CASE(Algorithm::EltwiseBitwiseXor, jit_bitwise_xor_emitter)); if (!ctx.emitter) OPENVINO_THROW("Unsupported operation type for Eltwise emitter"); @@ -714,17 +733,31 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener bool do_rounding = do_dequantization || jep_.dst_prc == ov::element::f32 || i != ops_list_.size() - 1; int s_idx = vmm_dst.getIdx(); - size_t ptrs_table_off = quantization_post_op_idx * quantization_injectors[quantization_post_op_idx]->memoryStep(); - - quantization_injectors[quantization_post_op_idx]->init_crop_ptrs(reg_post_op_ptrs + ptrs_table_off, reg_oc_off); - quantization_injectors[quantization_post_op_idx]->compute_crop(s_idx, s_idx + 1, offset, is_scalar, jep_.oc_size == 1); - - quantization_injectors[quantization_post_op_idx]->init_input_scale_shift_ptrs(reg_post_op_ptrs + ptrs_table_off, reg_oc_off); - quantization_injectors[quantization_post_op_idx]->compute_input_scale_shift(s_idx, s_idx + 1, offset, do_rounding, - is_scalar, jep_.oc_size == 1); - - quantization_injectors[quantization_post_op_idx]->init_output_scale_shift_ptrs(reg_post_op_ptrs + ptrs_table_off, reg_oc_off); - quantization_injectors[quantization_post_op_idx]->compute_output_scale_shift(s_idx, s_idx + 1, offset, is_scalar, jep_.oc_size == 1); + size_t ptrs_table_off = + quantization_post_op_idx * quantization_injectors[quantization_post_op_idx]->memoryStep(); + + quantization_injectors[quantization_post_op_idx]->init_crop_ptrs(reg_post_op_ptrs + ptrs_table_off, + reg_oc_off); + quantization_injectors[quantization_post_op_idx]->compute_crop(s_idx, + s_idx + 1, + offset, + is_scalar, + jep_.oc_size == 1); + + quantization_injectors[quantization_post_op_idx]->init_input_scale_shift_ptrs( + reg_post_op_ptrs + ptrs_table_off, + reg_oc_off); + quantization_injectors[quantization_post_op_idx] + ->compute_input_scale_shift(s_idx, s_idx + 1, offset, do_rounding, is_scalar, jep_.oc_size == 1); + + quantization_injectors[quantization_post_op_idx]->init_output_scale_shift_ptrs( + reg_post_op_ptrs + ptrs_table_off, + reg_oc_off); + quantization_injectors[quantization_post_op_idx]->compute_output_scale_shift(s_idx, + s_idx + 1, + offset, + is_scalar, + jep_.oc_size == 1); quantization_post_op_idx++; } else { @@ -733,7 +766,11 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener } } - inline void load_vector(Vmm vmm_src, const Xbyak::Address &op, ov::element::Type src_prc, ov::element::Type dst_prc, bool broadcast) { + inline void load_vector(Vmm vmm_src, + const Xbyak::Address& op, + ov::element::Type src_prc, + ov::element::Type dst_prc, + bool broadcast) { Xmm xmm_src = Xmm(vmm_src.getIdx()); if (src_prc == dst_prc) { @@ -751,120 +788,126 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener uni_vbroadcastss(vmm_src, xmm_src); } else { switch (src_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(vmm_src, op); - break; - case ov::element::bf16: - vpmovzxwd(vmm_src, op); - uni_vpslld(vmm_src, vmm_src, 16); - break; - case ov::element::f16: - vcvtph2ps(vmm_src, op); - break; - case ov::element::u16: - uni_vpmovzxwd(vmm_src, op); - break; - case ov::element::i16: - uni_vpmovsxwd(vmm_src, op); - break; - case ov::element::i8: - uni_vpmovsxbd(vmm_src, op); - break; - case ov::element::u8: - uni_vpmovzxbd(vmm_src, op); - break; - default: - OPENVINO_THROW("unknown src_prc"); - } - - switch (dst_prc) { - case ov::element::f32: - if (!src_prc.is_real()) - uni_vcvtdq2ps(vmm_src, vmm_src); - break; - case ov::element::i32: - if (src_prc.is_real()) - uni_vcvtps2dq(vmm_src, vmm_src); - break; - default: - OPENVINO_THROW("unknown dst_prc"); - } - } - } - - inline void load_scalar(Xmm xmm_src, const Xbyak::Address &op, ov::element::Type src_prc, ov::element::Type dst_prc) { - if (src_prc == dst_prc) { - switch (src_prc.size()) { - case 4: - uni_vmovss(xmm_src, op); - break; - case 1: - mov(reg_tmp_8, op); - movzx(reg_tmp_32, reg_tmp_8); - uni_vmovd(xmm_src, reg_tmp_32); - break; - default: - OPENVINO_THROW("unknown prc"); - } - return; - } - - switch (src_prc) { case ov::element::f32: case ov::element::i32: - uni_vmovss(xmm_src, op); + uni_vmovups(vmm_src, op); break; case ov::element::bf16: - if (isa == x64::avx2_vnni_2) { - vbcstnebf162ps(xmm_src, op); - } else { - uni_vpinsrw(xmm_src, xmm_src, op, 0); - uni_vpslld(xmm_src, xmm_src, 16); - } + vpmovzxwd(vmm_src, op); + uni_vpslld(vmm_src, vmm_src, 16); break; case ov::element::f16: - if (isa == x64::avx2_vnni_2) { - vbcstnesh2ps(xmm_src, op); - } else { - vcvtph2ps(xmm_src, op); - } - break; - case ov::element::i16: - uni_vpinsrw(xmm_src, xmm_src, op, 0); - uni_vpmovsxwd(xmm_src, op); + vcvtph2ps(vmm_src, op); break; case ov::element::u16: - uni_vpinsrw(xmm_src, xmm_src, op, 0); - uni_vpmovzxwd(xmm_src, op); + uni_vpmovzxwd(vmm_src, op); + break; + case ov::element::i16: + uni_vpmovsxwd(vmm_src, op); break; case ov::element::i8: - movsx(reg_tmp_32, op); - uni_vmovq(xmm_src, reg_tmp_64); + uni_vpmovsxbd(vmm_src, op); break; case ov::element::u8: - movzx(reg_tmp_32, op); - uni_vmovq(xmm_src, reg_tmp_64); + uni_vpmovzxbd(vmm_src, op); break; default: OPENVINO_THROW("unknown src_prc"); - } + } - switch (dst_prc) { + switch (dst_prc) { case ov::element::f32: if (!src_prc.is_real()) - uni_vcvtdq2ps(xmm_src, xmm_src); + uni_vcvtdq2ps(vmm_src, vmm_src); break; case ov::element::i32: if (src_prc.is_real()) - uni_vcvtps2dq(xmm_src, xmm_src); + uni_vcvtps2dq(vmm_src, vmm_src); break; default: OPENVINO_THROW("unknown dst_prc"); + } + } + } + + inline void load_scalar(Xmm xmm_src, + const Xbyak::Address& op, + ov::element::Type src_prc, + ov::element::Type dst_prc) { + if (src_prc == dst_prc) { + switch (src_prc.size()) { + case 4: + uni_vmovss(xmm_src, op); + break; + case 1: + mov(reg_tmp_8, op); + movzx(reg_tmp_32, reg_tmp_8); + uni_vmovd(xmm_src, reg_tmp_32); + break; + default: + OPENVINO_THROW("unknown prc"); + } + return; + } + + switch (src_prc) { + case ov::element::f32: + case ov::element::i32: + uni_vmovss(xmm_src, op); + break; + case ov::element::bf16: + if (isa == x64::avx2_vnni_2) { + vbcstnebf162ps(xmm_src, op); + } else { + uni_vpinsrw(xmm_src, xmm_src, op, 0); + uni_vpslld(xmm_src, xmm_src, 16); + } + break; + case ov::element::f16: + if (isa == x64::avx2_vnni_2) { + vbcstnesh2ps(xmm_src, op); + } else { + vcvtph2ps(xmm_src, op); + } + break; + case ov::element::i16: + uni_vpinsrw(xmm_src, xmm_src, op, 0); + uni_vpmovsxwd(xmm_src, op); + break; + case ov::element::u16: + uni_vpinsrw(xmm_src, xmm_src, op, 0); + uni_vpmovzxwd(xmm_src, op); + break; + case ov::element::i8: + movsx(reg_tmp_32, op); + uni_vmovq(xmm_src, reg_tmp_64); + break; + case ov::element::u8: + movzx(reg_tmp_32, op); + uni_vmovq(xmm_src, reg_tmp_64); + break; + default: + OPENVINO_THROW("unknown src_prc"); + } + + switch (dst_prc) { + case ov::element::f32: + if (!src_prc.is_real()) + uni_vcvtdq2ps(xmm_src, xmm_src); + break; + case ov::element::i32: + if (src_prc.is_real()) + uni_vcvtps2dq(xmm_src, xmm_src); + break; + default: + OPENVINO_THROW("unknown dst_prc"); } } - inline void store_vector(const Xbyak::Address &op, Vmm vmm_dst, ov::element::Type src_prc, ov::element::Type dst_prc) { + inline void store_vector(const Xbyak::Address& op, + Vmm vmm_dst, + ov::element::Type src_prc, + ov::element::Type dst_prc) { Xmm xmm_dst = Xmm(vmm_dst.getIdx()); Ymm ymm_dst = Ymm(vmm_dst.getIdx()); @@ -874,170 +917,173 @@ struct jit_uni_eltwise_generic : public jit_uni_eltwise_kernel, public jit_gener } switch (src_prc) { - case ov::element::f32: - if (!dst_prc.is_real()) - uni_vcvtps2dq(vmm_dst, vmm_dst); - break; - case ov::element::i32: - if (dst_prc.is_real()) - uni_vcvtdq2ps(vmm_dst, vmm_dst); - break; - default: - OPENVINO_THROW("unknown src_prc"); + case ov::element::f32: + if (!dst_prc.is_real()) + uni_vcvtps2dq(vmm_dst, vmm_dst); + break; + case ov::element::i32: + if (dst_prc.is_real()) + uni_vcvtdq2ps(vmm_dst, vmm_dst); + break; + default: + OPENVINO_THROW("unknown src_prc"); } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(op, vmm_dst); - break; - case ov::element::bf16: - if (isa == x64::avx512_core) { - uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, - {static_cast(ymm_dst.getIdx())}); - vmovdqu16(op, ymm_dst); - } else { - uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, - {static_cast(xmm_dst.getIdx())}); + case ov::element::f32: + case ov::element::i32: + uni_vmovups(op, vmm_dst); + break; + case ov::element::bf16: + if (isa == x64::avx512_core) { + uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, + {static_cast(ymm_dst.getIdx())}); + vmovdqu16(op, ymm_dst); + } else { + uni_vcvtneps2bf16->emit_code({static_cast(vmm_dst.getIdx())}, + {static_cast(xmm_dst.getIdx())}); + uni_vmovdqu(op, xmm_dst); + } + break; + case ov::element::f16: + vcvtps2ph(op, vmm_dst, 0x4); + break; + case ov::element::i16: + if (isa == x64::avx512_core) { + vpmovsdw(op, vmm_dst); + } else { + uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) { + vpermq(ymm_dst, ymm_dst, 0x08); uni_vmovdqu(op, xmm_dst); - } - break; - case ov::element::f16: - vcvtps2ph(op, vmm_dst, 0x4); - break; - case ov::element::i16: - if (isa == x64::avx512_core) { - vpmovsdw(op, vmm_dst); } else { - uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) { - vpermq(ymm_dst, ymm_dst, 0x08); - uni_vmovdqu(op, xmm_dst); - } else { - movq(op, xmm_dst); - } + movq(op, xmm_dst); } - break; - case ov::element::u16: - if (isa == x64::avx512_core) { - vpmaxsd(vmm_dst, vmm_zero, vmm_dst); - vpmovusdw(op, vmm_dst); - } else { - uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) { - vpermq(ymm_dst, ymm_dst, 0x08); - uni_vmovdqu(op, xmm_dst); - } else { - movq(op, xmm_dst); - } - } - break; - case ov::element::i8: - if (isa == x64::avx512_core) { - vpmovsdb(op, vmm_dst); - } else { - uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) - vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpacksswb(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) - vmovq(op, xmm_dst); - else - movd(op, xmm_dst); - } - break; - case ov::element::u8: - if (isa == x64::avx512_core) { - vpmaxsd(vmm_dst, vmm_zero, vmm_dst); - vpmovusdb(op, vmm_dst); + } + break; + case ov::element::u16: + if (isa == x64::avx512_core) { + vpmaxsd(vmm_dst, vmm_zero, vmm_dst); + vpmovusdw(op, vmm_dst); + } else { + uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) { + vpermq(ymm_dst, ymm_dst, 0x08); + uni_vmovdqu(op, xmm_dst); } else { - uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) - vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpackuswb(vmm_dst, vmm_dst, vmm_dst); - if (isa != x64::sse41) - vmovq(op, xmm_dst); - else - movd(op, xmm_dst); + movq(op, xmm_dst); } - break; - default: - OPENVINO_THROW("unknown dst_prc"); + } + break; + case ov::element::i8: + if (isa == x64::avx512_core) { + vpmovsdb(op, vmm_dst); + } else { + uni_vpackssdw(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) + vpermq(ymm_dst, ymm_dst, 0x08); + uni_vpacksswb(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) + vmovq(op, xmm_dst); + else + movd(op, xmm_dst); + } + break; + case ov::element::u8: + if (isa == x64::avx512_core) { + vpmaxsd(vmm_dst, vmm_zero, vmm_dst); + vpmovusdb(op, vmm_dst); + } else { + uni_vpackusdw(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) + vpermq(ymm_dst, ymm_dst, 0x08); + uni_vpackuswb(vmm_dst, vmm_dst, vmm_dst); + if (isa != x64::sse41) + vmovq(op, xmm_dst); + else + movd(op, xmm_dst); + } + break; + default: + OPENVINO_THROW("unknown dst_prc"); } } - inline void store_scalar(const Xbyak::Address &op, Xmm xmm_dst, ov::element::Type src_prc, ov::element::Type dst_prc) { + inline void store_scalar(const Xbyak::Address& op, + Xmm xmm_dst, + ov::element::Type src_prc, + ov::element::Type dst_prc) { if (src_prc == dst_prc) { switch (src_prc.size()) { - case 4: - uni_vmovss(op, xmm_dst); - break; - case 1: - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - break; - default: - OPENVINO_THROW("unknown prc"); + case 4: + uni_vmovss(op, xmm_dst); + break; + case 1: + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + break; + default: + OPENVINO_THROW("unknown prc"); } return; } switch (src_prc) { - case ov::element::f32: - if (!dst_prc.is_real()) - uni_vcvtps2dq(xmm_dst, xmm_dst); - break; - case ov::element::i32: - if (dst_prc.is_real()) - uni_vcvtdq2ps(xmm_dst, xmm_dst); - break; - default: - OPENVINO_THROW("unknown src_prc"); + case ov::element::f32: + if (!dst_prc.is_real()) + uni_vcvtps2dq(xmm_dst, xmm_dst); + break; + case ov::element::i32: + if (dst_prc.is_real()) + uni_vcvtdq2ps(xmm_dst, xmm_dst); + break; + default: + OPENVINO_THROW("unknown src_prc"); } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovss(op, xmm_dst); - break; - case ov::element::bf16: - uni_vpsrld(xmm_dst, xmm_dst, 16); - uni_vpextrw(op, xmm_dst, 0x0); - break; - case ov::element::f16: - vcvtps2ph(xmm_dst, xmm_dst, 0x4); - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_16); - break; - case ov::element::i16: - uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_16); - break; - case ov::element::u16: - uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_16); - break; - case ov::element::i8: - uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - break; - case ov::element::u8: - uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); - movq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - break; - default: - OPENVINO_THROW("unknown dst_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovss(op, xmm_dst); + break; + case ov::element::bf16: + uni_vpsrld(xmm_dst, xmm_dst, 16); + uni_vpextrw(op, xmm_dst, 0x0); + break; + case ov::element::f16: + vcvtps2ph(xmm_dst, xmm_dst, 0x4); + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_16); + break; + case ov::element::i16: + uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_16); + break; + case ov::element::u16: + uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_16); + break; + case ov::element::i8: + uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + break; + case ov::element::u8: + uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); + movq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + break; + default: + OPENVINO_THROW("unknown dst_prc"); } } }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 Eltwise::BroadcastingPolicy Eltwise::determineBroadcastingPolicy(const std::shared_ptr& op) { const auto const1 = ov::as_type_ptr(op->get_input_node_shared_ptr(0)); @@ -1297,7 +1343,6 @@ const std::map& Eltwise::getIn return initializers; } - namespace { struct EltwiseKey { @@ -1353,12 +1398,8 @@ struct EltwiseKey { return false; } - bool result = eltwise_data == rhs.eltwise_data && - ops_list == rhs.ops_list && - inpPrc == rhs.inpPrc && - outPrc == rhs.outPrc && - *postOps.get() == *rhs.postOps.get() && - implType == rhs.implType; + bool result = eltwise_data == rhs.eltwise_data && ops_list == rhs.ops_list && inpPrc == rhs.inpPrc && + outPrc == rhs.outPrc && *postOps.get() == *rhs.postOps.get() && implType == rhs.implType; if (result) { if (implType == EltwiseImplType::optimizedShapeAgnostic) { @@ -1370,8 +1411,7 @@ struct EltwiseKey { return false; } } else { - result = result && outOrder == rhs.outOrder && - outBlkDims == rhs.outBlkDims; + result = result && outOrder == rhs.outOrder && outBlkDims == rhs.outBlkDims; for (size_t i = 0; i < inpDims.size() && result; ++i) { result = result && (inpDims[i] == rhs.inpDims[i]); } @@ -1426,7 +1466,8 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { auto collapseLastOffsets = [](std::vector& dims, int dimsToCollapse) { for (size_t i = dims.size() - 2; i > dims.size() - dimsToCollapse - 2; i--) { if (dims[dims.size() - 1] > 0 || dims[i] > 0) - dims[dims.size() - 1] = std::max(dims[dims.size() - 1], static_cast(1)) * std::max(dims[i], static_cast(1)); + dims[dims.size() - 1] = std::max(dims[dims.size() - 1], static_cast(1)) * + std::max(dims[i], static_cast(1)); else dims[dims.size() - 1] *= dims[i]; } @@ -1442,8 +1483,10 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { auto isFusedWith = [&](Type type_) { auto start_itr = ops_list.begin(); - std::advance(start_itr, 1); // apply offset since the first op in the list is the op itself - return any_of(start_itr, ops_list.end(), [=](Type type) { return type == type_; }); + std::advance(start_itr, 1); // apply offset since the first op in the list is the op itself + return any_of(start_itr, ops_list.end(), [=](Type type) { + return type == type_; + }); }; if (inpDims.empty()) { @@ -1493,7 +1536,8 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { int oc_dim_idx = i + (jep.input_size - outOrder.size()); jep.oc_offsets[oc_dim_idx] = offset_oc; offset_oc *= jep.dims[oc_dim_idx]; - if (oc_dim_idx + 1 != static_cast(jep.input_size)) { // since in nspc case we can safely collapse the last axis + if (oc_dim_idx + 1 != + static_cast(jep.input_size)) { // since in nspc case we can safely collapse the last axis lastUnchangedAxis = oc_dim_idx; } } @@ -1514,7 +1558,8 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { int collapsedDims = 0; bool hasDifferentDims = false; - while (!useRuntimePtrs && currentJitWorkAmount < minimalJitWorkAmount && currentJitWorkAmount < fullWorkAmount) { + while (!useRuntimePtrs && currentJitWorkAmount < minimalJitWorkAmount && + currentJitWorkAmount < fullWorkAmount) { if (collapsedDims >= maxCollapsedDims) break; @@ -1595,8 +1640,9 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { jep.work_amount = jep.dst_size = jep.dims.back(); jep.oc_size = oc_size; - std::transform(jep.oc_offsets.begin(), jep.oc_offsets.end(), jep.oc_offsets.begin(), - [](size_t& offset) { return offset * sizeof(float);}); + std::transform(jep.oc_offsets.begin(), jep.oc_offsets.end(), jep.oc_offsets.begin(), [](size_t& offset) { + return offset * sizeof(float); + }); #if defined(OPENVINO_ARCH_X86_64) if (mayiuse(x64::avx512_core)) { @@ -1608,7 +1654,7 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { } else { OPENVINO_THROW("Can't create jit eltwise kernel"); } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 #if defined(OPENVINO_ARCH_ARM64) if (mayiuse(aarch64::asimd)) { @@ -1616,28 +1662,28 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { } else { OPENVINO_THROW("Can't create jit eltwise kernel"); } -#endif // OPENVINO_ARCH_ARM64 +#endif // OPENVINO_ARCH_ARM64 if (_pKernel) _pKernel->create_ker(); } - void exec(const jit_eltwise_call_args_ptrs &args_ptrs, const VectorDims &dims_out) override { + void exec(const jit_eltwise_call_args_ptrs& args_ptrs, const VectorDims& dims_out) override { if (!_pKernel) OPENVINO_THROW("Can't execute, kernel for eltwise node is not compiled"); if (_pKernel->jep_.input_size == optimalTensorRank) { // execute Optimized 6D auto d6_loop = [&](size_t i0, size_t i1, size_t i2, size_t i3, size_t i4) { - auto args = jit_eltwise_call_args_indexes(); - args.indexes[0] = i0; - args.indexes[1] = i1; - args.indexes[2] = i2; - args.indexes[3] = i3; - args.indexes[4] = i4; + auto args = jit_eltwise_call_args_indexes(); + args.indexes[0] = i0; + args.indexes[1] = i1; + args.indexes[2] = i2; + args.indexes[3] = i3; + args.indexes[4] = i4; - (*_pKernel)(&args_ptrs, &args); - }; + (*_pKernel)(&args_ptrs, &args); + }; parallel_nt_static(m_threads_num, [&](const int ithr, const int nthr) { for_5d(ithr, nthr, dims_out[0], dims_out[1], dims_out[2], dims_out[3], dims_out[4], d6_loop); @@ -1693,13 +1739,14 @@ class EltwiseJitExecutor : public Eltwise::IEltwiseExecutor { /* enabled only for float at float16_t at the moment * can be extended in the future */ -template +template class EltwiseRefBaseExecutor : public Eltwise::IEltwiseExecutor { public: EltwiseRefBaseExecutor(const EltwiseData& opData, const VectorDims& outBlkDims, const std::vector& inpDims) - : _opData(std::move(opData)), _inpDims(inpDims) { + : _opData(std::move(opData)), + _inpDims(inpDims) { if (inpDims.empty()) { OPENVINO_THROW("Can not make Eltwise executor from empty input dims array"); } else if (inpDims.front().empty()) { @@ -1750,18 +1797,18 @@ class EltwiseRefBaseExecutor : public Eltwise::IEltwiseExecutor { protected: void init_ptr(const jit_eltwise_call_args_ptrs& args_ptrs, - const VectorDims& dims_out, - std::vector& counters, - const size_t iwork, - std::vector& src_f, - T*& dst_ptr_f) { + const VectorDims& dims_out, + std::vector& counters, + const size_t iwork, + std::vector& src_f, + T*& dst_ptr_f) { size_t tmp = iwork; for (ptrdiff_t j = dims_out.size() - 1; j >= 0; j--) { counters[j] = tmp % dims_out[j]; tmp /= dims_out[j]; } - size_t index_in[MAX_ELTWISE_INPUTS] = { 0 }; + size_t index_in[MAX_ELTWISE_INPUTS] = {0}; for (size_t i = 0; i < _inputNum; i++) { index_in[i] = 0; for (size_t j = 0; j < counters.size(); j++) { @@ -1776,7 +1823,7 @@ class EltwiseRefBaseExecutor : public Eltwise::IEltwiseExecutor { } index_out /= sizeof(T); - //std::vector src_f(_inputNum); + // std::vector src_f(_inputNum); for (size_t i = 0; i < _inputNum; i++) { src_f[i] = (reinterpret_cast(args_ptrs.src_ptr[i]) + index_in[i])[0]; } @@ -1795,19 +1842,15 @@ class EltwiseRefBaseExecutor : public Eltwise::IEltwiseExecutor { /* enabled only for float at float16_t at the moment * can be extended in the future */ -template::value || - std::is_same::value> - ::type * = nullptr> +template ::value || + std::is_same::value>::type* = nullptr> class EltwiseRefExecutor : public EltwiseRefBaseExecutor { public: - EltwiseRefExecutor(const EltwiseData& opData, - const VectorDims& outBlkDims, - std::vector inpDims) : EltwiseRefBaseExecutor(opData, outBlkDims, inpDims) { - } + EltwiseRefExecutor(const EltwiseData& opData, const VectorDims& outBlkDims, std::vector inpDims) + : EltwiseRefBaseExecutor(opData, outBlkDims, inpDims) {} - void exec(const jit_eltwise_call_args_ptrs &args_ptrs, const VectorDims &dims_out) override { + void exec(const jit_eltwise_call_args_ptrs& args_ptrs, const VectorDims& dims_out) override { if (this->_opData.algo == Algorithm::EltwiseLog) { const T* src_ptr_f = reinterpret_cast(args_ptrs.src_ptr[0]); T* dst_ptr_f = reinterpret_cast(args_ptrs.dst_ptr); @@ -1857,8 +1900,11 @@ class EltwiseRefExecutor : public EltwiseRefBaseExecutor { std::shared_ptr ref_eltwise_injector = nullptr; if (this->_opData.onednnAlgorithm != dnnl::algorithm::undef) { - ref_eltwise_injector = std::make_shared( - static_cast(this->_opData.onednnAlgorithm), this->_opData.alpha, this->_opData.beta, 1.f); + ref_eltwise_injector = + std::make_shared(static_cast(this->_opData.onednnAlgorithm), + this->_opData.alpha, + this->_opData.beta, + 1.f); } parallel_nt(0, [&](const int ithr, const int nthr) { @@ -1873,86 +1919,144 @@ class EltwiseRefExecutor : public EltwiseRefBaseExecutor { this->init_ptr(args_ptrs, dims_out, counters, iwork, src_f, dst_ptr_f); switch (this->_opData.algo) { - case Algorithm::EltwiseRelu: - case Algorithm::EltwiseGeluErf: - case Algorithm::EltwiseGeluTanh: - case Algorithm::EltwiseElu: - case Algorithm::EltwiseTanh: - case Algorithm::EltwiseSigmoid: - case Algorithm::EltwiseAbs: - case Algorithm::EltwiseSqrt: - case Algorithm::EltwiseSoftRelu: - case Algorithm::EltwiseClamp: - case Algorithm::EltwiseSwish: - case Algorithm::EltwiseHswish: - case Algorithm::EltwiseMish: - case Algorithm::EltwiseHsigmoid: - case Algorithm::EltwiseRoundHalfToEven: - case Algorithm::EltwiseRoundHalfAwayFromZero: - *dst_ptr_f = ref_eltwise_injector->compute_scalar(src_f[0]); - break; - case Algorithm::EltwiseAdd: *dst_ptr_f = src_f[0] + src_f[1]; break; - case Algorithm::EltwiseMulAdd: *dst_ptr_f = src_f[0] * src_f[1] + src_f[2]; break; - case Algorithm::EltwiseSubtract: *dst_ptr_f = src_f[0] - src_f[1]; break; - case Algorithm::EltwiseMultiply: *dst_ptr_f = src_f[0] * src_f[1]; break; - case Algorithm::EltwiseDivide: *dst_ptr_f = src_f[0] / src_f[1]; break; - case Algorithm::EltwiseCeiling: *dst_ptr_f = ceilf(src_f[0]); break; - case Algorithm::EltwiseFloor: *dst_ptr_f = floorf(src_f[0]); break; - case Algorithm::EltwiseFloorMod: *dst_ptr_f = src_f[0] - floorf(src_f[0] / src_f[1]) * src_f[1]; break; - case Algorithm::EltwiseMod: *dst_ptr_f = src_f[0] - truncf(src_f[0] / src_f[1]) * src_f[1]; break; - case Algorithm::EltwiseMaximum: *dst_ptr_f = std::max(src_f[0], src_f[1]); break; - case Algorithm::EltwiseMinimum: *dst_ptr_f = std::min(src_f[0], src_f[1]); break; - case Algorithm::EltwiseExp: *dst_ptr_f = expf(src_f[0]); break; - case Algorithm::EltwiseSquaredDifference: *dst_ptr_f = powf((src_f[0] - src_f[1]), 2.f); break; - case Algorithm::EltwisePowerDynamic: *dst_ptr_f = powf(src_f[0], src_f[1]); break; - case Algorithm::EltwiseEqual: *dst_ptr_f = src_f[0] == src_f[1]; break; - case Algorithm::EltwiseNotEqual: *dst_ptr_f = src_f[0] != src_f[1]; break; - case Algorithm::EltwiseGreater: *dst_ptr_f = src_f[0] > src_f[1]; break; - case Algorithm::EltwiseGreaterEqual: *dst_ptr_f = src_f[0] >= src_f[1]; break; - case Algorithm::EltwiseLess: *dst_ptr_f = src_f[0] < src_f[1]; break; - case Algorithm::EltwiseLessEqual: *dst_ptr_f = src_f[0] <= src_f[1]; break; - case Algorithm::EltwiseLogicalAnd: *dst_ptr_f = src_f[0] && src_f[1]; break; - case Algorithm::EltwiseLogicalOr: *dst_ptr_f = src_f[0] || src_f[1]; break; - case Algorithm::EltwiseLogicalXor: *dst_ptr_f = (src_f[0] || src_f[1]) - (src_f[0] && src_f[1]); break; - case Algorithm::EltwiseLogicalNot: *dst_ptr_f = !src_f[0]; break; - case Algorithm::EltwisePrelu: *dst_ptr_f = src_f[0] > 0 ? src_f[0] : static_cast(src_f[0] * src_f[1]); break; - case Algorithm::EltwiseErf: *dst_ptr_f = std::erf(src_f[0]); break; - case Algorithm::EltwiseSoftSign: *dst_ptr_f = src_f[0] / (1 + std::fabs(src_f[0])); break; - // @todo implement proper isinfinite for non-float precisions - case Algorithm::EltwiseIsFinite: *dst_ptr_f = std::isfinite(static_cast(src_f[0])); break; - case Algorithm::EltwiseIsInf: - *dst_ptr_f = (this->_opData.alpha && (src_f[0] == -std::numeric_limits::infinity())) || - (this->_opData.beta && (src_f[0] == std::numeric_limits::infinity())); - break; - case Algorithm::EltwiseIsNaN: *dst_ptr_f = std::isnan(src_f[0]); break; - case Algorithm::EltwiseSelect: *dst_ptr_f = src_f[0] ? src_f[1] : src_f[2]; break; - default: OPENVINO_THROW("Unsupported operation type for Eltwise executor"); + case Algorithm::EltwiseRelu: + case Algorithm::EltwiseGeluErf: + case Algorithm::EltwiseGeluTanh: + case Algorithm::EltwiseElu: + case Algorithm::EltwiseTanh: + case Algorithm::EltwiseSigmoid: + case Algorithm::EltwiseAbs: + case Algorithm::EltwiseSqrt: + case Algorithm::EltwiseSoftRelu: + case Algorithm::EltwiseClamp: + case Algorithm::EltwiseSwish: + case Algorithm::EltwiseHswish: + case Algorithm::EltwiseMish: + case Algorithm::EltwiseHsigmoid: + case Algorithm::EltwiseRoundHalfToEven: + case Algorithm::EltwiseRoundHalfAwayFromZero: + *dst_ptr_f = ref_eltwise_injector->compute_scalar(src_f[0]); + break; + case Algorithm::EltwiseAdd: + *dst_ptr_f = src_f[0] + src_f[1]; + break; + case Algorithm::EltwiseMulAdd: + *dst_ptr_f = src_f[0] * src_f[1] + src_f[2]; + break; + case Algorithm::EltwiseSubtract: + *dst_ptr_f = src_f[0] - src_f[1]; + break; + case Algorithm::EltwiseMultiply: + *dst_ptr_f = src_f[0] * src_f[1]; + break; + case Algorithm::EltwiseDivide: + *dst_ptr_f = src_f[0] / src_f[1]; + break; + case Algorithm::EltwiseCeiling: + *dst_ptr_f = ceilf(src_f[0]); + break; + case Algorithm::EltwiseFloor: + *dst_ptr_f = floorf(src_f[0]); + break; + case Algorithm::EltwiseFloorMod: + *dst_ptr_f = src_f[0] - floorf(src_f[0] / src_f[1]) * src_f[1]; + break; + case Algorithm::EltwiseMod: + *dst_ptr_f = src_f[0] - truncf(src_f[0] / src_f[1]) * src_f[1]; + break; + case Algorithm::EltwiseMaximum: + *dst_ptr_f = std::max(src_f[0], src_f[1]); + break; + case Algorithm::EltwiseMinimum: + *dst_ptr_f = std::min(src_f[0], src_f[1]); + break; + case Algorithm::EltwiseExp: + *dst_ptr_f = expf(src_f[0]); + break; + case Algorithm::EltwiseSquaredDifference: + *dst_ptr_f = powf((src_f[0] - src_f[1]), 2.f); + break; + case Algorithm::EltwisePowerDynamic: + *dst_ptr_f = powf(src_f[0], src_f[1]); + break; + case Algorithm::EltwiseEqual: + *dst_ptr_f = src_f[0] == src_f[1]; + break; + case Algorithm::EltwiseNotEqual: + *dst_ptr_f = src_f[0] != src_f[1]; + break; + case Algorithm::EltwiseGreater: + *dst_ptr_f = src_f[0] > src_f[1]; + break; + case Algorithm::EltwiseGreaterEqual: + *dst_ptr_f = src_f[0] >= src_f[1]; + break; + case Algorithm::EltwiseLess: + *dst_ptr_f = src_f[0] < src_f[1]; + break; + case Algorithm::EltwiseLessEqual: + *dst_ptr_f = src_f[0] <= src_f[1]; + break; + case Algorithm::EltwiseLogicalAnd: + *dst_ptr_f = src_f[0] && src_f[1]; + break; + case Algorithm::EltwiseLogicalOr: + *dst_ptr_f = src_f[0] || src_f[1]; + break; + case Algorithm::EltwiseLogicalXor: + *dst_ptr_f = (src_f[0] || src_f[1]) - (src_f[0] && src_f[1]); + break; + case Algorithm::EltwiseLogicalNot: + *dst_ptr_f = !src_f[0]; + break; + case Algorithm::EltwisePrelu: + *dst_ptr_f = src_f[0] > 0 ? src_f[0] : static_cast(src_f[0] * src_f[1]); + break; + case Algorithm::EltwiseErf: + *dst_ptr_f = std::erf(src_f[0]); + break; + case Algorithm::EltwiseSoftSign: + *dst_ptr_f = src_f[0] / (1 + std::fabs(src_f[0])); + break; + // @todo implement proper isinfinite for non-float precisions + case Algorithm::EltwiseIsFinite: + *dst_ptr_f = std::isfinite(static_cast(src_f[0])); + break; + case Algorithm::EltwiseIsInf: + *dst_ptr_f = (this->_opData.alpha && (src_f[0] == -std::numeric_limits::infinity())) || + (this->_opData.beta && (src_f[0] == std::numeric_limits::infinity())); + break; + case Algorithm::EltwiseIsNaN: + *dst_ptr_f = std::isnan(src_f[0]); + break; + case Algorithm::EltwiseSelect: + *dst_ptr_f = src_f[0] ? src_f[1] : src_f[2]; + break; + default: + OPENVINO_THROW("Unsupported operation type for Eltwise executor"); } } }); } }; -template::value || - std::is_same::value || - std::is_same::value || - std::is_same::value || - std::is_same::value> - ::type * = nullptr> +template ::value || std::is_same::value || + std::is_same::value || std::is_same::value || + std::is_same::value>::type* = nullptr> class BitwiseRefExecutor : public EltwiseRefBaseExecutor { public: - BitwiseRefExecutor(const EltwiseData& opData, - const VectorDims& outBlkDims, - const std::vector& inpDims) : EltwiseRefBaseExecutor(opData, outBlkDims, inpDims) { - } + BitwiseRefExecutor(const EltwiseData& opData, const VectorDims& outBlkDims, const std::vector& inpDims) + : EltwiseRefBaseExecutor(opData, outBlkDims, inpDims) {} - void exec(const jit_eltwise_call_args_ptrs &args_ptrs, const VectorDims &dims_out) override { + void exec(const jit_eltwise_call_args_ptrs& args_ptrs, const VectorDims& dims_out) override { std::shared_ptr ref_eltwise_injector = nullptr; if (this->_opData.onednnAlgorithm != dnnl::algorithm::undef) { - ref_eltwise_injector = std::make_shared( - static_cast(this->_opData.onednnAlgorithm), this->_opData.alpha, this->_opData.beta, 1.f); + ref_eltwise_injector = + std::make_shared(static_cast(this->_opData.onednnAlgorithm), + this->_opData.alpha, + this->_opData.beta, + 1.f); } parallel_nt(0, [&](const int ithr, const int nthr) { @@ -1967,81 +2071,79 @@ class BitwiseRefExecutor : public EltwiseRefBaseExecutor { this->init_ptr(args_ptrs, dims_out, counters, iwork, src_f, dst_ptr_f); switch (this->_opData.algo) { - case Algorithm::EltwiseBitwiseAnd: { - *dst_ptr_f = src_f[0] & src_f[1]; - break; - } - case Algorithm::EltwiseBitwiseNot: { - *dst_ptr_f = ~src_f[0]; - break; - } - case Algorithm::EltwiseBitwiseOr: { - *dst_ptr_f = src_f[0] | src_f[1]; - break; - } - case Algorithm::EltwiseBitwiseXor: { - *dst_ptr_f = src_f[0] ^ src_f[1]; - break; - } - case Algorithm::EltwiseBitwiseLeftShift: { - *dst_ptr_f = src_f[0] << src_f[1]; - break; - } - case Algorithm::EltwiseBitwiseRightShift: { - *dst_ptr_f = src_f[0] >> src_f[1]; - break; - } - default: - OPENVINO_THROW("Unsupported operation type for Eltwise executor"); + case Algorithm::EltwiseBitwiseAnd: { + *dst_ptr_f = src_f[0] & src_f[1]; + break; + } + case Algorithm::EltwiseBitwiseNot: { + *dst_ptr_f = ~src_f[0]; + break; + } + case Algorithm::EltwiseBitwiseOr: { + *dst_ptr_f = src_f[0] | src_f[1]; + break; + } + case Algorithm::EltwiseBitwiseXor: { + *dst_ptr_f = src_f[0] ^ src_f[1]; + break; + } + case Algorithm::EltwiseBitwiseLeftShift: { + *dst_ptr_f = src_f[0] << src_f[1]; + break; + } + case Algorithm::EltwiseBitwiseRightShift: { + *dst_ptr_f = src_f[0] >> src_f[1]; + break; + } + default: + OPENVINO_THROW("Unsupported operation type for Eltwise executor"); } } }); } }; -} // namespace +} // namespace static Eltwise::executorPtr buildRefExecutor(const EltwiseKey& key) { switch (key.outPrc) { - case ov::element::f16: - return std::make_shared>(key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); - case ov::element::i8: - return std::make_shared::value_type>>( - key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); - - case ov::element::u8: - return std::make_shared::value_type>>( - key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); - - case ov::element::i16: - return std::make_shared::value_type>>( - key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); - - case ov::element::u16: - return std::make_shared::value_type>>( - key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); + case ov::element::f16: + return std::make_shared>(key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); + case ov::element::i8: + return std::make_shared::value_type>>( + key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); + + case ov::element::u8: + return std::make_shared::value_type>>( + key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); + + case ov::element::i16: + return std::make_shared::value_type>>( + key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); + + case ov::element::u16: + return std::make_shared::value_type>>( + key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); # - case ov::element::i32: - return std::make_shared::value_type>>( - key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); + case ov::element::i32: + return std::make_shared::value_type>>( + key.eltwise_data.front(), + key.outBlkDims, + key.inpDims); - default: - // use float reference executor for any other precision for now - return std::make_shared>(key.eltwise_data.front(), - key.outBlkDims, - key.inpDims); + default: + // use float reference executor for any other precision for now + return std::make_shared>(key.eltwise_data.front(), key.outBlkDims, key.inpDims); } } @@ -2064,7 +2166,7 @@ static Eltwise::executorPtr buildExecutor(const EltwiseKey& key) { bool Eltwise::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { try { if (getInitializers().find(op->get_type_info()) == getInitializers().end()) { - errorMessage = "Doesn't support Eltwise algorithm: " + std::string(op->get_type_name()); + errorMessage = "Doesn't support Eltwise algorithm: " + std::string(op->get_type_name()); return false; } if (const auto binOp = ov::as_type_ptr(op)) { @@ -2087,8 +2189,9 @@ bool Eltwise::isSupportedOperation(const std::shared_ptr& op, st return true; } -Eltwise::Eltwise(const std::shared_ptr& op, const GraphContext::CPtr context) : - Node(op, context, EltwiseShapeInferFactory()), broadcastingPolicy(Undefined) { +Eltwise::Eltwise(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, EltwiseShapeInferFactory()), + broadcastingPolicy(Undefined) { std::string errorMessage; if (!isSupportedOperation(op, errorMessage)) { OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); @@ -2098,67 +2201,68 @@ Eltwise::Eltwise(const std::shared_ptr& op, const GraphContext::CPtr c size_t Eltwise::getOpInputsNum() const { switch (getAlgorithm()) { - case Algorithm::EltwiseIsFinite: - case Algorithm::EltwiseIsInf: - case Algorithm::EltwiseIsNaN: - case Algorithm::EltwiseRelu: - case Algorithm::EltwiseGeluErf: - case Algorithm::EltwiseGeluTanh: - case Algorithm::EltwiseCeiling: - case Algorithm::EltwiseFloor: - case Algorithm::EltwiseElu: - case Algorithm::EltwiseTanh: - case Algorithm::EltwiseSigmoid: - case Algorithm::EltwiseAbs: - case Algorithm::EltwiseSqrt: - case Algorithm::EltwiseSoftRelu: - case Algorithm::EltwiseExp: - case Algorithm::EltwiseClamp: - case Algorithm::EltwiseErf: - case Algorithm::EltwiseLogicalNot: - case Algorithm::EltwisePowerStatic: - case Algorithm::EltwiseSwish: - case Algorithm::EltwiseHswish: - case Algorithm::EltwiseMish: - case Algorithm::EltwiseHsigmoid: - case Algorithm::EltwiseRoundHalfToEven: - case Algorithm::EltwiseRoundHalfAwayFromZero: - case Algorithm::EltwiseSoftSign: - case Algorithm::EltwiseLog: - return 1; - case Algorithm::EltwiseAdd: - case Algorithm::EltwiseSubtract: - case Algorithm::EltwiseMultiply: - case Algorithm::EltwiseDivide: - case Algorithm::EltwiseFloorMod: - case Algorithm::EltwiseMod: - case Algorithm::EltwiseMaximum: - case Algorithm::EltwiseMinimum: - case Algorithm::EltwiseSquaredDifference: - case Algorithm::EltwisePowerDynamic: - case Algorithm::EltwiseEqual: - case Algorithm::EltwiseNotEqual: - case Algorithm::EltwiseGreater: - case Algorithm::EltwiseGreaterEqual: - case Algorithm::EltwiseLess: - case Algorithm::EltwiseLessEqual: - case Algorithm::EltwiseLogicalAnd: - case Algorithm::EltwiseLogicalOr: - case Algorithm::EltwiseLogicalXor: - case Algorithm::EltwiseBitwiseAnd: - case Algorithm::EltwiseBitwiseOr: - case Algorithm::EltwiseBitwiseXor: - case Algorithm::EltwiseBitwiseLeftShift: - case Algorithm::EltwiseBitwiseRightShift: - return 2; - case Algorithm::EltwiseBitwiseNot: - return 1; - case Algorithm::EltwisePrelu: - return 2; - case Algorithm::EltwiseMulAdd: - case Algorithm::EltwiseSelect: - return 3; - default: OPENVINO_THROW("Unsupported operation for Eltwise node with name `", getName(), "`."); + case Algorithm::EltwiseIsFinite: + case Algorithm::EltwiseIsInf: + case Algorithm::EltwiseIsNaN: + case Algorithm::EltwiseRelu: + case Algorithm::EltwiseGeluErf: + case Algorithm::EltwiseGeluTanh: + case Algorithm::EltwiseCeiling: + case Algorithm::EltwiseFloor: + case Algorithm::EltwiseElu: + case Algorithm::EltwiseTanh: + case Algorithm::EltwiseSigmoid: + case Algorithm::EltwiseAbs: + case Algorithm::EltwiseSqrt: + case Algorithm::EltwiseSoftRelu: + case Algorithm::EltwiseExp: + case Algorithm::EltwiseClamp: + case Algorithm::EltwiseErf: + case Algorithm::EltwiseLogicalNot: + case Algorithm::EltwisePowerStatic: + case Algorithm::EltwiseSwish: + case Algorithm::EltwiseHswish: + case Algorithm::EltwiseMish: + case Algorithm::EltwiseHsigmoid: + case Algorithm::EltwiseRoundHalfToEven: + case Algorithm::EltwiseRoundHalfAwayFromZero: + case Algorithm::EltwiseSoftSign: + case Algorithm::EltwiseLog: + return 1; + case Algorithm::EltwiseAdd: + case Algorithm::EltwiseSubtract: + case Algorithm::EltwiseMultiply: + case Algorithm::EltwiseDivide: + case Algorithm::EltwiseFloorMod: + case Algorithm::EltwiseMod: + case Algorithm::EltwiseMaximum: + case Algorithm::EltwiseMinimum: + case Algorithm::EltwiseSquaredDifference: + case Algorithm::EltwisePowerDynamic: + case Algorithm::EltwiseEqual: + case Algorithm::EltwiseNotEqual: + case Algorithm::EltwiseGreater: + case Algorithm::EltwiseGreaterEqual: + case Algorithm::EltwiseLess: + case Algorithm::EltwiseLessEqual: + case Algorithm::EltwiseLogicalAnd: + case Algorithm::EltwiseLogicalOr: + case Algorithm::EltwiseLogicalXor: + case Algorithm::EltwiseBitwiseAnd: + case Algorithm::EltwiseBitwiseOr: + case Algorithm::EltwiseBitwiseXor: + case Algorithm::EltwiseBitwiseLeftShift: + case Algorithm::EltwiseBitwiseRightShift: + return 2; + case Algorithm::EltwiseBitwiseNot: + return 1; + case Algorithm::EltwisePrelu: + return 2; + case Algorithm::EltwiseMulAdd: + case Algorithm::EltwiseSelect: + return 3; + default: + OPENVINO_THROW("Unsupported operation for Eltwise node with name `", getName(), "`."); } } @@ -2183,40 +2287,37 @@ void Eltwise::getSupportedDescriptors() { void Eltwise::initSupportedPrimitiveDescriptors() { const auto isBitwise = [](const Algorithm& algorithm) { - return one_of( - algorithm, - Algorithm::EltwiseBitwiseAnd, - Algorithm::EltwiseBitwiseNot, - Algorithm::EltwiseBitwiseOr, - Algorithm::EltwiseBitwiseXor, - Algorithm::EltwiseBitwiseLeftShift, - Algorithm::EltwiseBitwiseRightShift); + return one_of(algorithm, + Algorithm::EltwiseBitwiseAnd, + Algorithm::EltwiseBitwiseNot, + Algorithm::EltwiseBitwiseOr, + Algorithm::EltwiseBitwiseXor, + Algorithm::EltwiseBitwiseLeftShift, + Algorithm::EltwiseBitwiseRightShift); }; - std::vector supportedPrecisions = isBitwise(algorithm) ? - std::vector { - ov::element::u8, - ov::element::i8, - ov::element::u16, - ov::element::i16, - ov::element::i32 - } : std::vector { - ov::element::f32, - ov::element::u8, - ov::element::i8, - ov::element::u16, - ov::element::i16, - ov::element::bf16, - ov::element::f16, - ov::element::i32 - }; + std::vector supportedPrecisions = isBitwise(algorithm) + ? std::vector{ov::element::u8, + ov::element::i8, + ov::element::u16, + ov::element::i16, + ov::element::i32} + : std::vector{ov::element::f32, + ov::element::u8, + ov::element::i8, + ov::element::u16, + ov::element::i16, + ov::element::bf16, + ov::element::f16, + ov::element::i32}; if (!supportedPrimitiveDescriptors.empty()) return; - // if dim rank is greater than the maximum possible, we should use the reference execution -#if defined (OPENVINO_ARCH_ARM64) - bool canUseOptimizedImpl = mayiuse(dnnl::impl::cpu::aarch64::asimd) && (getInputShapeAtPort(0).getRank() <= MAX_ELTWISE_DIM_RANK); + // if dim rank is greater than the maximum possible, we should use the reference execution +#if defined(OPENVINO_ARCH_ARM64) + bool canUseOptimizedImpl = + mayiuse(dnnl::impl::cpu::aarch64::asimd) && (getInputShapeAtPort(0).getRank() <= MAX_ELTWISE_DIM_RANK); bool canUseOptimizedShapeAgnosticImpl = isDynamicNode() && canUseOptimizedImpl; #else bool canUseOptimizedImpl = mayiuse(x64::sse41) && getInputShapeAtPort(0).getRank() <= MAX_ELTWISE_DIM_RANK; @@ -2261,7 +2362,7 @@ void Eltwise::initSupportedPrimitiveDescriptors() { ")"); std::vector inputPrecisions; - for (const auto &prec : getOriginalInputPrecisions()) { + for (const auto& prec : getOriginalInputPrecisions()) { inputPrecisions.push_back(prec); } @@ -2288,31 +2389,32 @@ void Eltwise::initSupportedPrimitiveDescriptors() { } #ifndef OPENVINO_ARCH_ARM64 - implType = canUseOptimizedShapeAgnosticImpl ? EltwiseImplType::optimizedShapeAgnostic : - canUseOptimizedImpl ? EltwiseImplType::optimized : EltwiseImplType::reference; + implType = canUseOptimizedShapeAgnosticImpl ? EltwiseImplType::optimizedShapeAgnostic + : canUseOptimizedImpl ? EltwiseImplType::optimized + : EltwiseImplType::reference; if (!hasHardwareSupport(ov::element::bf16)) { bool hasBF16 = false; - for (auto &inPrc : inputPrecisions) + for (auto& inPrc : inputPrecisions) if (inPrc == ov::element::bf16) hasBF16 = true; if (outputPrecision == ov::element::bf16 || hasBF16) OPENVINO_THROW("Eltwise node with name `", getName(), "` doesn't support BF16 precision on this target."); } -#if defined(OV_CPU_WITH_ACL) +# if defined(OV_CPU_WITH_ACL) const bool useJit = false; -#endif +# endif #elif defined(OPENVINO_ARCH_ARM64) - const bool useJit = canUseOptimizedImpl && - jitIsSupported(this, getAlpha(), getBeta(), getGamma()); + const bool useJit = canUseOptimizedImpl && jitIsSupported(this, getAlpha(), getBeta(), getGamma()); if (!useJit) { canUseOptimizedImpl = false; } - implType = (useJit && canUseOptimizedImpl) ? - (canUseOptimizedShapeAgnosticImpl ? EltwiseImplType::optimizedShapeAgnostic : EltwiseImplType::optimized) : - EltwiseImplType::reference; + implType = + (useJit && canUseOptimizedImpl) + ? (canUseOptimizedShapeAgnosticImpl ? EltwiseImplType::optimizedShapeAgnostic : EltwiseImplType::optimized) + : EltwiseImplType::reference; #else OPENVINO_THROW("Unknow CPU architecture"); #endif @@ -2330,66 +2432,74 @@ void Eltwise::initSupportedPrimitiveDescriptors() { const bool useAcl = !useJit; if (useAcl) { - // Use original output precision as a reference point since some eltwise algorithms have non-float inputs (i.e. EltwiseSelect) - ov::element::Type forcedPrec = getOriginalOutputPrecisionAtPort(0) == ov::element::f16 ? ov::element::f16 : ov::element::f32; - // ACL implementation supports only identical precisions on inputs/outputs so they are aligned it to highest one - if (AclEltwiseExecutor::isEltwiseAlgorithmSupported(getAlgorithm())) { - for (size_t i = 0; i < getParentEdges().size(); i++) { - if (!getParentEdgeAt(i)->getParent()->isConstant()) { - if (getOriginalInputPrecisionAtPort(i).size() > forcedPrec.size()) { - forcedPrec = getOriginalInputPrecisionAtPort(i); + // Use original output precision as a reference point since some eltwise algorithms have non-float inputs (i.e. + // EltwiseSelect) + ov::element::Type forcedPrec = + getOriginalOutputPrecisionAtPort(0) == ov::element::f16 ? ov::element::f16 : ov::element::f32; + // ACL implementation supports only identical precisions on inputs/outputs so they are aligned it to highest one + if (AclEltwiseExecutor::isEltwiseAlgorithmSupported(getAlgorithm())) { + for (size_t i = 0; i < getParentEdges().size(); i++) { + if (!getParentEdgeAt(i)->getParent()->isConstant()) { + if (getOriginalInputPrecisionAtPort(i).size() > forcedPrec.size()) { + forcedPrec = getOriginalInputPrecisionAtPort(i); + } } } + if (!forcedPrec.is_real()) { + forcedPrec = ov::element::f32; + } } - if (!forcedPrec.is_real()) { - forcedPrec = ov::element::f32; - } - } - for (size_t i = 0; i < inputPrecisions.size(); i++) { - inputPrecisions[i] = filterPrecision(inputPrecisions[i], forcedPrec); - } - outputPrecision = filterPrecision(outputPrecision, forcedPrec); - } else { -#endif -#if defined(OV_CPU_WITH_SHL) - if (ShlEltwiseExecutor::isEltwiseAlgorithmSupported(getAlgorithm())) { - // SHL implementation supports only identical precisions on inputs/outputs and only FP32 for now - const ov::element::Type forcedPrec = ov::element::f32; for (size_t i = 0; i < inputPrecisions.size(); i++) { - inputPrecisions[i] = forcedPrec; + inputPrecisions[i] = filterPrecision(inputPrecisions[i], forcedPrec); } - outputPrecision = forcedPrec; + outputPrecision = filterPrecision(outputPrecision, forcedPrec); } else { #endif - auto filterPrecision = [&](const ov::element::Type& prc) { - if (implType == EltwiseImplType::reference) { - if (isBitwise(algorithm)) { - if (std::find(supportedPrecisions.begin(), supportedPrecisions.end(), prc) == supportedPrecisions.end()) { - OPENVINO_THROW("Eltwise node with name `", getName(), "` doesn't support ", prc, " precision."); - } - return prc; - } - return ov::element::f32; - } else if (std::find(supportedPrecisions.begin(), supportedPrecisions.end(), prc) == supportedPrecisions.end()) { - if (prc == ov::element::u32 || prc == ov::element::i64 || prc == ov::element::u64) { - return ov::element::i32; - } else if (prc == ov::element::f64) { - return ov::element::f32; - } else { - OPENVINO_THROW("Eltwise node with name `", getName(), "` doesn't support ", prc, " precision."); +#if defined(OV_CPU_WITH_SHL) + if (ShlEltwiseExecutor::isEltwiseAlgorithmSupported(getAlgorithm())) { + // SHL implementation supports only identical precisions on inputs/outputs and only FP32 for now + const ov::element::Type forcedPrec = ov::element::f32; + for (size_t i = 0; i < inputPrecisions.size(); i++) { + inputPrecisions[i] = forcedPrec; } + outputPrecision = forcedPrec; } else { - return prc; - } - }; +#endif + auto filterPrecision = [&](const ov::element::Type& prc) { + if (implType == EltwiseImplType::reference) { + if (isBitwise(algorithm)) { + if (std::find(supportedPrecisions.begin(), supportedPrecisions.end(), prc) == + supportedPrecisions.end()) { + OPENVINO_THROW("Eltwise node with name `", + getName(), + "` doesn't support ", + prc, + " precision."); + } + return prc; + } + return ov::element::f32; + } else if (std::find(supportedPrecisions.begin(), supportedPrecisions.end(), prc) == + supportedPrecisions.end()) { + if (prc == ov::element::u32 || prc == ov::element::i64 || prc == ov::element::u64) { + return ov::element::i32; + } else if (prc == ov::element::f64) { + return ov::element::f32; + } else { + OPENVINO_THROW("Eltwise node with name `", getName(), "` doesn't support ", prc, " precision."); + } + } else { + return prc; + } + }; - for (size_t i = 0; i < inputPrecisions.size(); i++) { - inputPrecisions[i] = filterPrecision(inputPrecisions[i]); - } - outputPrecision = filterPrecision(outputPrecision); + for (size_t i = 0; i < inputPrecisions.size(); i++) { + inputPrecisions[i] = filterPrecision(inputPrecisions[i]); + } + outputPrecision = filterPrecision(outputPrecision); #if defined(OV_CPU_WITH_SHL) - } + } #endif #if defined(OV_CPU_WITH_ACL) } @@ -2398,22 +2508,19 @@ void Eltwise::initSupportedPrimitiveDescriptors() { // TODO: delete after new LPT (ngraph based) is merged // WA is needed to handle bug in LPT that produces wrong precision after average pooling (I8/U8 instead of FP32) if ((getAlgorithm() == Algorithm::EltwiseMulAdd || getAlgorithm() == Algorithm::EltwisePowerStatic) && - (inputPrecisions[0] == ov::element::u8 || inputPrecisions[0] == ov::element::i8)) { + (inputPrecisions[0] == ov::element::u8 || inputPrecisions[0] == ov::element::i8)) { auto parentNode = getParentEdgeAt(0)->getParent(); if (getParentEdgeAt(0)->getParent()->getAlgorithm() == Algorithm::PoolingAvg) { inputPrecisions[0] = ov::element::f32; } } - enum LayoutType { - Planar, - ChannelsFirst, - Blocked - }; + enum LayoutType { Planar, ChannelsFirst, Blocked }; - auto initDesc = [&] (LayoutType lt, const bool useEltwiseExecutor = false, const bool useJit = false) -> NodeDesc { - auto createMemoryDesc = [lt](const Shape &shape, ov::element::Type prc, size_t offset) -> std::shared_ptr { - const auto &dims = shape.getDims(); + auto initDesc = [&](LayoutType lt, const bool useEltwiseExecutor = false, const bool useJit = false) -> NodeDesc { + auto createMemoryDesc = + [lt](const Shape& shape, ov::element::Type prc, size_t offset) -> std::shared_ptr { + const auto& dims = shape.getDims(); if (lt == ChannelsFirst && shape.getRank() != 1) { auto ndims = shape.getRank(); VectorDims order(ndims); @@ -2429,10 +2536,11 @@ void Eltwise::initSupportedPrimitiveDescriptors() { } return std::make_shared(prc, shape, blocks, order, offset); - // TODO: need investigate - // bad accuracy for shape {1, 1, 4, 11}, {2, 5, 1, 1} - // same for disabled collapse dims - } else if (lt == Blocked && shape.getRank() != 1 && (shape.getMinDims()[1] != Shape::UNDEFINED_DIM && shape.getMinDims()[1] > 1)) { + // TODO: need investigate + // bad accuracy for shape {1, 1, 4, 11}, {2, 5, 1, 1} + // same for disabled collapse dims + } else if (lt == Blocked && shape.getRank() != 1 && + (shape.getMinDims()[1] != Shape::UNDEFINED_DIM && shape.getMinDims()[1] > 1)) { size_t blockSize = dnnl::impl::cpu::x64::mayiuse(x64::avx512_core) ? 16 : 8; VectorDims blocks = dims; VectorDims order(blocks.size()); @@ -2463,9 +2571,9 @@ void Eltwise::initSupportedPrimitiveDescriptors() { portConfig.inPlace((!i && canBeInPlace() && inputPrecisions[i] == outputPrecision) ? 0 : -1); portConfig.constant(false); - const auto &srcShape = getInputShapeAtPort(i); + const auto& srcShape = getInputShapeAtPort(i); if (!isDynamicNode() && srcShape.getDims()[0] == 1) { - inputMask.reset(0); // accepts any stride on the batch axis + inputMask.reset(0); // accepts any stride on the batch axis } portConfig.setMemDesc(createMemoryDesc(srcShape, inputPrecisions[i], offset), inputMask); @@ -2476,10 +2584,10 @@ void Eltwise::initSupportedPrimitiveDescriptors() { portConfig.inPlace(-1); portConfig.constant(false); - const auto &dstShape = getOutputShapeAtPort(0); + const auto& dstShape = getOutputShapeAtPort(0); BlockedMemoryDesc::CmpMask outputMask = BlockedMemoryDesc::SKIP_OFFSET_MASK; if (!isDynamicNode() && dstShape.getDims()[0] == 1) { - outputMask.reset(0); // accepts any stride on the batch axis + outputMask.reset(0); // accepts any stride on the batch axis } portConfig.setMemDesc(createMemoryDesc(dstShape, outputPrecision, offset), outputMask); @@ -2487,13 +2595,13 @@ void Eltwise::initSupportedPrimitiveDescriptors() { if (useEltwiseExecutor || useJit) { impl_desc_type impl_type; - #if defined (OPENVINO_ARCH_ARM64) +#if defined(OPENVINO_ARCH_ARM64) if (useJit) { impl_type = impl_desc_type::jit_asimd; } - #else +#else impl_type = impl_desc_type::undef; - #endif +#endif std::vector srcMemoryDescs; for (size_t i = 0; i < config.inConfs.size(); i++) { @@ -2504,20 +2612,23 @@ void Eltwise::initSupportedPrimitiveDescriptors() { dstMemoryDescs.push_back(config.outConfs[i].getMemDesc()); } - auto factory = std::make_shared(eltwiseAttrs, srcMemoryDescs, dstMemoryDescs, - std::make_shared(context, getImplPriority())); + auto factory = + std::make_shared(eltwiseAttrs, + srcMemoryDescs, + dstMemoryDescs, + std::make_shared(context, getImplPriority())); return {config, impl_type, !factory->isEmpty() ? factory : nullptr}; } else { impl_desc_type impl_type = impl_desc_type::ref; if (canUseOptimizedImpl) { - #if defined (OPENVINO_ARCH_ARM64) +#if defined(OPENVINO_ARCH_ARM64) if (mayiuse(dnnl::impl::cpu::aarch64::asimd)) { impl_type = impl_desc_type::jit_asimd; } else { OPENVINO_THROW("not supported architecture"); } - #else +#else if (mayiuse(x64::avx512_core)) { impl_type = impl_desc_type::jit_avx512; } else if (mayiuse(x64::avx2)) { @@ -2525,7 +2636,7 @@ void Eltwise::initSupportedPrimitiveDescriptors() { } else if (mayiuse(x64::sse41)) { impl_type = impl_desc_type::jit_sse42; } - #endif +#endif } return {config, impl_type}; @@ -2534,10 +2645,11 @@ void Eltwise::initSupportedPrimitiveDescriptors() { bool isChannelsFirstApplicable = one_of(getOutputShapeAtPort(0).getRank(), 1u, 2u, 3u, 4u, 5u); for (size_t i = 0; i < getParentEdges().size(); i++) { - isChannelsFirstApplicable = isChannelsFirstApplicable && one_of(getInputShapeAtPort(i).getRank(), 1u, 2u, 3u, 4u, 5u); - isChannelsFirstApplicable = isChannelsFirstApplicable && implication(getInputShapeAtPort(i).getRank() != 1, - getOutputShapeAtPort(0).getRank() == - getInputShapeAtPort(i).getRank()); + isChannelsFirstApplicable = + isChannelsFirstApplicable && one_of(getInputShapeAtPort(i).getRank(), 1u, 2u, 3u, 4u, 5u); + isChannelsFirstApplicable = isChannelsFirstApplicable && + implication(getInputShapeAtPort(i).getRank() != 1, + getOutputShapeAtPort(0).getRank() == getInputShapeAtPort(i).getRank()); } #if defined(OPENVINO_ARCH_ARM64) @@ -2547,13 +2659,14 @@ void Eltwise::initSupportedPrimitiveDescriptors() { #endif for (size_t i = 0; i < getParentEdges().size(); i++) { - const auto &inShape = getInputShapeAtPort(i); + const auto& inShape = getInputShapeAtPort(i); isBlockedApplicable = isBlockedApplicable && one_of(inShape.getRank(), 1u, 3u, 4u, 5u); - isBlockedApplicable = isBlockedApplicable && implication(inShape.getRank() != 1, - getOutputShapeAtPort(0).getRank() == - inShape.getRank()); + isBlockedApplicable = + isBlockedApplicable && + implication(inShape.getRank() != 1, getOutputShapeAtPort(0).getRank() == inShape.getRank()); if (isDynamicNode() && inShape.getRank() != 1) - isBlockedApplicable = isBlockedApplicable && inShape.getMinDims()[1] != Shape::UNDEFINED_DIM && inShape.getMinDims()[1] > 1; + isBlockedApplicable = + isBlockedApplicable && inShape.getMinDims()[1] != Shape::UNDEFINED_DIM && inShape.getMinDims()[1] > 1; } inputNum = getParentEdges().size(); @@ -2561,28 +2674,29 @@ void Eltwise::initSupportedPrimitiveDescriptors() { #if defined(OV_CPU_WITH_ACL) if (useAcl || useJit) { - eltwiseAttrs = {algorithm, alpha, beta, gamma}; + eltwiseAttrs = {algorithm, alpha, beta, gamma}; - auto addDesc = [&initDesc, &useJit](std::vector& supportedPrimitiveDescriptors, const LayoutType layoutType) { - auto nodeDesc = initDesc(layoutType, !useJit, useJit); - if (nodeDesc.getExecutorFactory()) - supportedPrimitiveDescriptors.emplace_back(nodeDesc); - }; + auto addDesc = [&initDesc, &useJit](std::vector& supportedPrimitiveDescriptors, + const LayoutType layoutType) { + auto nodeDesc = initDesc(layoutType, !useJit, useJit); + if (nodeDesc.getExecutorFactory()) + supportedPrimitiveDescriptors.emplace_back(nodeDesc); + }; - // @todo should be handled in scope of selectPreferPrimitiveDescriptor - if (context->getConfig().modelType == Config::ModelType::CNN) { - if (isChannelsFirstApplicable) - addDesc(supportedPrimitiveDescriptors, ChannelsFirst); - addDesc(supportedPrimitiveDescriptors, Planar); - } else { - addDesc(supportedPrimitiveDescriptors, Planar); - if (isChannelsFirstApplicable) - addDesc(supportedPrimitiveDescriptors, ChannelsFirst); - } + // @todo should be handled in scope of selectPreferPrimitiveDescriptor + if (context->getConfig().modelType == Config::ModelType::CNN) { + if (isChannelsFirstApplicable) + addDesc(supportedPrimitiveDescriptors, ChannelsFirst); + addDesc(supportedPrimitiveDescriptors, Planar); + } else { + addDesc(supportedPrimitiveDescriptors, Planar); + if (isChannelsFirstApplicable) + addDesc(supportedPrimitiveDescriptors, ChannelsFirst); + } - canUseEltwiseExecPtr = !supportedPrimitiveDescriptors.empty() && !useJit; - if (!supportedPrimitiveDescriptors.empty()) - return; + canUseEltwiseExecPtr = !supportedPrimitiveDescriptors.empty() && !useJit; + if (!supportedPrimitiveDescriptors.empty()) + return; } #endif @@ -2652,15 +2766,18 @@ void Eltwise::prepareParams() { dstMemoryDescs.push_back(getDstMemoryAtPort(0)->getDescPtr()); auto selectedPD = getSelectedPrimitiveDescriptor(); - eltwiseExecPtr = selectedPD->getExecutorFactoryAs()->makeExecutor(eltwiseAttrs, srcMemoryDescs, dstMemoryDescs, {}); + eltwiseExecPtr = selectedPD->getExecutorFactoryAs()->makeExecutor(eltwiseAttrs, + srcMemoryDescs, + dstMemoryDescs, + {}); selectedPD->setImplementationType(eltwiseExecPtr->getImplType()); return; } auto outBlockingDesc = getChildEdgeAt(0)->getMemory().getDescWithType(); - const auto &outOrder = outBlockingDesc->getOrder(); - const auto ¤tOutBlkDims = outBlockingDesc->getBlockDims(); + const auto& outOrder = outBlockingDesc->getOrder(); + const auto& currentOutBlkDims = outBlockingDesc->getBlockDims(); size_t input_size = std::max(static_cast(EltwiseJitExecutor::optimalTensorRank), currentOutBlkDims.size()); @@ -2679,13 +2796,16 @@ void Eltwise::prepareParams() { size_t inRank = currentInBlkDims[i].size(); // WA to normalize blocked and planar layouts - const auto &inOrder = inBlockingDesc->getOrder(); + const auto& inOrder = inBlockingDesc->getOrder(); size_t startOff = outOrder.size() != outBlockingDesc->getShape().getRank() && - outOrder[outOrder.size() - 1] != inOrder[inOrder.size() - 1] ? 1 : 0; + outOrder[outOrder.size() - 1] != inOrder[inOrder.size() - 1] + ? 1 + : 0; // WA to handle nspc layout with 1D tensors if (1 == inRank) { - if (outRank > 2 && 1 == outOrder.back()) startOff = 1; + if (outRank > 2 && 1 == outOrder.back()) + startOff = 1; } for (size_t j = 0; j < inRank; j++) { @@ -2718,14 +2838,18 @@ void Eltwise::prepareParams() { if (!canSkipSearchInCache) { EltwiseData thisOp{getAlgorithm(), getOneDnnAlgorithm(), getAlpha(), getBeta(), getGamma()}; - EltwiseKey key = {{thisOp}, {getType()}, currentOutBlkDims, outOrder, dims_in, inpPrc, outPrc, dnnl::post_ops(), implType}; + EltwiseKey key = + {{thisOp}, {getType()}, currentOutBlkDims, outOrder, dims_in, inpPrc, outPrc, dnnl::post_ops(), implType}; fqDataPtrs.clear(); - for (const auto &node : fusedWith) { + for (const auto& node : fusedWith) { key.ops_list.push_back(node->getType()); if (node->getType() == Type::Eltwise) { if (auto eltwise = std::dynamic_pointer_cast(node)) { - key.eltwise_data.push_back({eltwise->getAlgorithm(), eltwise->getOneDnnAlgorithm(), eltwise->getAlpha(), - eltwise->getBeta(), eltwise->getGamma()}); + key.eltwise_data.push_back({eltwise->getAlgorithm(), + eltwise->getOneDnnAlgorithm(), + eltwise->getAlpha(), + eltwise->getBeta(), + eltwise->getGamma()}); } } else if (node->getType() == Type::FakeQuantize) { node->appendPostOps(key.postOps, {}, fqDataPtrs); @@ -2745,9 +2869,9 @@ void Eltwise::prepareParams() { // update execParams for shape agnostic kernel if (implType == EltwiseImplType::optimizedShapeAgnostic) { - auto &outDims = execParams.outDims; - auto &inOffsets = execParams.inOffsets; - auto &outOffsets = execParams.outOffsets; + auto& outDims = execParams.outDims; + auto& inOffsets = execParams.inOffsets; + auto& outOffsets = execParams.outOffsets; // outDims recalculation outDims.resize(dims_in[0].size(), 1); @@ -2805,7 +2929,8 @@ void Eltwise::selectOptimalPrimitiveDescriptor() { void Eltwise::execute(dnnl::stream strm) { if (execPtr) { jit_eltwise_call_args_ptrs args_ptrs = {}; - VectorDims dims_out = implType == EltwiseImplType::optimizedShapeAgnostic ? execParams.outDims : execPtr->getOutDims(); + VectorDims dims_out = + implType == EltwiseImplType::optimizedShapeAgnostic ? execParams.outDims : execPtr->getOutDims(); for (size_t i = 0; i < memPtrs.size() - 1; i++) args_ptrs.src_ptr[i] = memPtrs[i]->getDataAs() + start_offset_in[i]; args_ptrs.dst_ptr = memPtrs.back()->getDataAs() + start_offset_out; @@ -2873,15 +2998,14 @@ void Eltwise::fuseInto(NodePtr& parentNode) { getAlgorithm() == Algorithm::EltwiseAdd && dimsEqualWeak(getInputShapeAtPort(0).getDims(), getInputShapeAtPort(1).getDims()) && !getParentEdgeAt(0)->getParent()->isConstant() && !getParentEdgeAt(1)->getParent()->isConstant(); - if ((scales.empty() && shifts.empty()) && - !specialConvolutionAddFusing && + if ((scales.empty() && shifts.empty()) && !specialConvolutionAddFusing && canBePerformedAsScaleShift(parentNode.get())) { std::tie(scales, shifts) = getScalesAndShifts(parentNode.get()); } Node::fuseInto(parentNode); } -void Eltwise::appendMemory(const std::vector &data, MemoryPtr &memPtr, std::vector& postOpsMem) { +void Eltwise::appendMemory(const std::vector& data, MemoryPtr& memPtr, std::vector& postOpsMem) { if (!memPtr) { DnnlBlockedMemoryDesc memoryDesc(ov::element::f32, {data.size()}); memPtr = std::make_shared(getEngine(), memoryDesc, data.data()); @@ -2889,12 +3013,15 @@ void Eltwise::appendMemory(const std::vector &data, MemoryPtr &memPtr, st } } -void Eltwise::appendMemory(const std::vector &data, MemoryPtr &memPtr, std::vector& postOpsMem) { +void Eltwise::appendMemory(const std::vector& data, MemoryPtr& memPtr, std::vector& postOpsMem) { postOpsMem.push_back(data.data()); } template -void Eltwise::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis) { +void Eltwise::appendPostOpsImpl(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis) { const std::string errorPrefix = "Appending Eltwise node with name '" + getName() + "' "; if (getOneDnnAlgorithm() != dnnl::algorithm::undef) { @@ -2920,7 +3047,8 @@ void Eltwise::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDim case dnnl::algorithm::eltwise_round_half_away_from_zero: ops.append_eltwise(getOneDnnAlgorithm(), getAlpha(), getBeta()); break; - default: OPENVINO_THROW(errorPrefix, "as post operation is not supported"); + default: + OPENVINO_THROW(errorPrefix, "as post operation is not supported"); } } else { // per-tensor EltwisePowerStatic can be implemented with more well-supported eltwise postOps @@ -2938,7 +3066,8 @@ void Eltwise::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDim const auto chIdx = postOpDims.size() > 1 ? channelAxis : 0; channelSize = postOpDims[chIdx]; } - // since legacy depthwise post ops mechanism requires broadcasted data we need to reinitilize it in case of changed shape + // since legacy depthwise post ops mechanism requires broadcasted data we need to reinitilize it in case of + // changed shape if (depthwiseData.empty() || depthwiseDataSize != 2 * channelSize) { depthwiseData.clear(); depthwiseMemory.reset(); @@ -2995,7 +3124,10 @@ void Eltwise::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDim } } -void Eltwise::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::unordered_map& postOpsMem, const int channelAxis) { +void Eltwise::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, + const int channelAxis) { std::vector postOpsMemPtrs; appendPostOpsImpl(ops, postOpDims, postOpsMemPtrs, channelAxis); @@ -3006,11 +3138,17 @@ void Eltwise::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, s } } -void Eltwise::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis) { +void Eltwise::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis) { appendPostOpsImpl(ops, postOpDims, postOpsMem, channelAxis); } -bool Eltwise::appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, bool isLastPostOp, dnnl::memory::data_type outDataType, bool allowBinary) { +bool Eltwise::appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, + bool isLastPostOp, + dnnl::memory::data_type outDataType, + bool allowBinary) { const std::string errorPrefix = "Appending Eltwise node with name '" + getName() + "' as binary post op "; if (getOneDnnAlgorithm() != dnnl::algorithm::undef) { @@ -3039,7 +3177,8 @@ bool Eltwise::appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, bool isLastP // call dnnlpoc's specialized API to generate optimized postOps sequence dnnlpoc.appendLinear({getAlpha()}, {getBeta()}, isLastPostOp); break; - default: OPENVINO_THROW(errorPrefix, "as post operation is not supported"); + default: + OPENVINO_THROW(errorPrefix, "as post operation is not supported"); } } else { switch (getAlgorithm()) { @@ -3054,9 +3193,9 @@ bool Eltwise::appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, bool isLastP case Algorithm::EltwisePowerStatic: if (beta != 1.0f && gamma != 0.0f) { return dnnlpoc.appendLinear(scales, shifts, isLastPostOp, allowBinary); - } else if (beta != 1.0f) {// Multiply if has scales + } else if (beta != 1.0f) { // Multiply if has scales return dnnlpoc.appendScale(scales, isLastPostOp, allowBinary); - } else if (gamma != 0.0f) {// Add only if has shifts + } else if (gamma != 0.0f) { // Add only if has shifts return dnnlpoc.appendShift(shifts, allowBinary); } break; @@ -3103,16 +3242,17 @@ bool Eltwise::canFuseParent(const NodePtr& parentNode) const { bool Eltwise::canFuse(const NodePtr& node) const { auto isIntegerComputeSupported = [](const Node* node) { - if (!one_of(node->getAlgorithm(), Algorithm::EltwiseAdd, - Algorithm::EltwiseMultiply, - Algorithm::EltwiseMulAdd, - Algorithm::EltwiseSubtract, - Algorithm::EltwiseDivide, - Algorithm::EltwiseSquaredDifference)) { + if (!one_of(node->getAlgorithm(), + Algorithm::EltwiseAdd, + Algorithm::EltwiseMultiply, + Algorithm::EltwiseMulAdd, + Algorithm::EltwiseSubtract, + Algorithm::EltwiseDivide, + Algorithm::EltwiseSquaredDifference)) { return false; } - for (const auto &originalInputPrecision : node->getOriginalInputPrecisions()) { + for (const auto& originalInputPrecision : node->getOriginalInputPrecisions()) { if (originalInputPrecision != ov::element::i32) { return false; } @@ -3121,7 +3261,7 @@ bool Eltwise::canFuse(const NodePtr& node) const { return true; }; -#if defined (OPENVINO_ARCH_ARM64) +#if defined(OPENVINO_ARCH_ARM64) if (!mayiuse(dnnl::impl::cpu::aarch64::asimd) || (getInputShapeAtPort(0).getRank() > MAX_ELTWISE_DIM_RANK)) return false; @@ -3129,10 +3269,8 @@ bool Eltwise::canFuse(const NodePtr& node) const { return false; } const auto eltwise = dynamic_cast(node.get()); - if ((eltwise == nullptr) || (!jitIsSupported(eltwise, - eltwise->getAlpha(), - eltwise->getBeta(), - eltwise->getGamma()))) { + if ((eltwise == nullptr) || + (!jitIsSupported(eltwise, eltwise->getAlpha(), eltwise->getBeta(), eltwise->getGamma()))) { return false; } #else @@ -3170,29 +3308,30 @@ bool Eltwise::canFuse(const NodePtr& node) const { return false; if (node->getType() == Type::Eltwise) { - // [WA] Since execution precision change from I32 to FP32 for arithmetic operations may lead to incorrect results - // we disable fusing cases which may lead to invalid precision conversions inside the kernel - // [TODO] We need to rewrite support for different precisions at all to avoid implicit conversions to FP32 - // (all should be handled via explicit convert operations) + // [WA] Since execution precision change from I32 to FP32 for arithmetic operations may lead to incorrect + // results we disable fusing cases which may lead to invalid precision conversions inside the kernel [TODO] We + // need to rewrite support for different precisions at all to avoid implicit conversions to FP32 (all should be + // handled via explicit convert operations) bool isIntegerFusingNode = isIntegerComputeSupported(node.get()); - if ((isIntegerNode && !isIntegerFusingNode) || - (!isIntegerNode && isIntegerFusingNode)) { + if ((isIntegerNode && !isIntegerFusingNode) || (!isIntegerNode && isIntegerFusingNode)) { return false; } if (node->getParentEdgeAt(0)->getParent().get() != this) { - // Eltwise jitter doesn't respect commutative property, so fusing is disabled in case it applied not for 0-th port. - if (one_of(node->getAlgorithm(), Algorithm::EltwiseSubtract, - Algorithm::EltwiseDivide, - Algorithm::EltwiseFloorMod, - Algorithm::EltwiseMod, - Algorithm::EltwisePowerDynamic, - Algorithm::EltwiseGreater, - Algorithm::EltwiseGreaterEqual, - Algorithm::EltwiseLess, - Algorithm::EltwiseLessEqual, - Algorithm::EltwiseMulAdd, - Algorithm::EltwiseSelect)) { + // Eltwise jitter doesn't respect commutative property, so fusing is disabled in case it applied not for + // 0-th port. + if (one_of(node->getAlgorithm(), + Algorithm::EltwiseSubtract, + Algorithm::EltwiseDivide, + Algorithm::EltwiseFloorMod, + Algorithm::EltwiseMod, + Algorithm::EltwisePowerDynamic, + Algorithm::EltwiseGreater, + Algorithm::EltwiseGreaterEqual, + Algorithm::EltwiseLess, + Algorithm::EltwiseLessEqual, + Algorithm::EltwiseMulAdd, + Algorithm::EltwiseSelect)) { return false; } @@ -3205,7 +3344,8 @@ bool Eltwise::canFuse(const NodePtr& node) const { } } - // We can use optimized execution with fusions only in cases when dim rank is less or equal to the maximum possible + // We can use optimized execution with fusions only in cases when dim rank is less or equal to the maximum + // possible if (node->getInputShapeAtPort(0).getRank() > MAX_ELTWISE_DIM_RANK) return false; @@ -3224,13 +3364,15 @@ ov::element::Type Eltwise::getRuntimePrecision() const { // Don't take bias precision into account for (size_t i = 0; i < getParentEdges().size(); i++) { auto parentEdge = getParentEdgeAt(i); - if (parentEdge && parentEdge->getStatus() == Edge::Status::Validated && !parentEdge->getParent()->isConstant()) { - inputPrecisions.emplace_back(DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); + if (parentEdge && parentEdge->getStatus() == Edge::Status::Validated && + !parentEdge->getParent()->isConstant()) { + inputPrecisions.emplace_back( + DnnlExtensionUtils::DataTypeToElementType((parentEdge->getMemoryPtr()->getDataType()))); } } return getMaxPrecision(inputPrecisions); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/eltwise.h b/src/plugins/intel_cpu/src/nodes/eltwise.h index 6013ce732ee5fc..d0ca94e08824c8 100644 --- a/src/plugins/intel_cpu/src/nodes/eltwise.h +++ b/src/plugins/intel_cpu/src/nodes/eltwise.h @@ -5,17 +5,18 @@ #pragma once #include + +#include #include #include -#include #include "dnnl_postops_composer_legacy.h" -#include "nodes/executors/eltwise.hpp" #include "executors/eltwise_list.hpp" +#include "nodes/executors/eltwise.hpp" #include "nodes/kernels/jit_eltwise_call_args_ptrs.hpp" #if defined(OPENVINO_ARCH_ARM64) -#include "kernels/aarch64/jit_uni_eltwise_generic.hpp" +# include "kernels/aarch64/jit_uni_eltwise_generic.hpp" #endif namespace ov { @@ -68,18 +69,14 @@ struct jit_uni_eltwise_kernel { #endif -enum class EltwiseImplType { - reference = 0, - optimized = 1, - optimizedShapeAgnostic = 2 -}; +enum class EltwiseImplType { reference = 0, optimized = 1, optimizedShapeAgnostic = 2 }; class Eltwise : public Node { public: class IEltwiseExecutor { public: IEltwiseExecutor() = default; - virtual void exec(const jit_eltwise_call_args_ptrs &args_ptrs, const VectorDims &dims_out) = 0; + virtual void exec(const jit_eltwise_call_args_ptrs& args_ptrs, const VectorDims& dims_out) = 0; virtual size_t getBatchDimIdx() const = 0; virtual const VectorDims& getOutDims() const = 0; virtual ~IEltwiseExecutor() = default; @@ -98,22 +95,45 @@ class Eltwise : public Node { bool canBeInPlace() const override; bool canFuseParent(const NodePtr& parentNode) const; bool canFuse(const NodePtr& node) const override; - void appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::unordered_map& postOpsMem, const int channelAxis = 1) override; - void appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis = 1) override; - bool appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, bool isLastPostOp, dnnl::memory::data_type outDataType, bool allowBinary = true); + void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, + const int channelAxis = 1) override; + void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis = 1) override; + bool appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, + bool isLastPostOp, + dnnl::memory::data_type outDataType, + bool allowBinary = true); void fuseInto(NodePtr& parentNode) override; ov::element::Type getRuntimePrecision() const override; - float getAlpha() const { return alpha; } - float getBeta() const { return beta; } - float getGamma() const { return gamma; } - const std::vector& getScales() const { return scales; } - const std::vector& getShifts() const { return shifts; } + float getAlpha() const { + return alpha; + } + float getBeta() const { + return beta; + } + float getGamma() const { + return gamma; + } + const std::vector& getScales() const { + return scales; + } + const std::vector& getShifts() const { + return shifts; + } - dnnl::algorithm getOneDnnAlgorithm() const { return onednnAlgorithm; } + dnnl::algorithm getOneDnnAlgorithm() const { + return onednnAlgorithm; + } bool isWithBroadcast(); - bool isSpecialConvolutionAddFusing() const { return specialConvolutionAddFusing; } + bool isSpecialConvolutionAddFusing() const { + return specialConvolutionAddFusing; + } bool needPrepareParams() const override; void prepareParams() override; @@ -127,7 +147,9 @@ class Eltwise : public Node { Undefined, }; - BroadcastingPolicy getBroadcastingPolicy() const { return broadcastingPolicy; } + BroadcastingPolicy getBroadcastingPolicy() const { + return broadcastingPolicy; + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; @@ -181,10 +203,13 @@ class Eltwise : public Node { size_t getOpInputsNum() const; template - void appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis = 1); + void appendPostOpsImpl(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis = 1); - void appendMemory(const std::vector &data, MemoryPtr &memPtr, std::vector& postOpsMem); - void appendMemory(const std::vector &data, MemoryPtr &memPtr, std::vector& postOpsMem); + void appendMemory(const std::vector& data, MemoryPtr& memPtr, std::vector& postOpsMem); + void appendMemory(const std::vector& data, MemoryPtr& memPtr, std::vector& postOpsMem); bool canUseEltwiseExecPtr = false; EltwiseAttrs eltwiseAttrs; @@ -201,6 +226,6 @@ class eltwise_precision_helper { static std::set> get_supported_precisions(const Algorithm& algo); }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag.cpp b/src/plugins/intel_cpu/src/nodes/embedding_bag.cpp index 8b144e90c865bc..2dcb93f9fc6c1b 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag.cpp +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag.cpp @@ -18,10 +18,10 @@ namespace intel_cpu { namespace node { EmbeddingBag::EmbeddingBag(const std::shared_ptr& op, - size_t requiredInputNum, - size_t indicesIdx, - size_t perSampleWeightsIdx, - size_t defaultIndexIdx) + size_t requiredInputNum, + size_t indicesIdx, + size_t perSampleWeightsIdx, + size_t defaultIndexIdx) : INDICES_IDX(indicesIdx), PER_SAMPLE_WEIGHTS_IDX(perSampleWeightsIdx), DEFAULT_INDEX_IDX(defaultIndexIdx) { @@ -47,9 +47,9 @@ void EmbeddingBag::prepareParams(const VectorDims& indexStaticShape) { template void EmbeddingBag::processData(const T* srcData, - const T* weightsData, - const VectorDims& inDataDims, - const MemoryPtr& outMemory) { + const T* weightsData, + const VectorDims& inDataDims, + const MemoryPtr& outMemory) { std::string msgPrefix = std::string("Node EmbeddingBag with name '") + _layerName + "' "; initFromInputs(); @@ -127,10 +127,10 @@ void EmbeddingBag::processData(const T* srcData, } void EmbeddingBag::execute(const uint8_t* srcData, - const uint8_t* weightsData, - const ov::element::Type& srcPrc, - const VectorDims& inDims, - const MemoryPtr& outMemory) { + const uint8_t* weightsData, + const ov::element::Type& srcPrc, + const VectorDims& inDims, + const MemoryPtr& outMemory) { switch (srcPrc) { case ov::element::f32: { return processData::value_type>( @@ -157,8 +157,7 @@ void EmbeddingBag::execute(const uint8_t* srcData, outMemory); } default: { - OPENVINO_THROW("EmbeddingBag layer does not support precision '" + std::string(srcPrc.get_type_name()) + - "'"); + OPENVINO_THROW("EmbeddingBag layer does not support precision '" + std::string(srcPrc.get_type_name()) + "'"); } } } diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag.h b/src/plugins/intel_cpu/src/nodes/embedding_bag.h index 28c8666233fa1a..d804ea06c2b317 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag.h +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag.h @@ -13,32 +13,32 @@ namespace node { class EmbeddingBag { public: enum class Reduction { SUM, MEAN }; - EmbeddingBag( - const std::shared_ptr&, - size_t requiredInputsNum, - size_t indicesIdx, - size_t perSampleWeightsIdx, - size_t defaultIndexIdx); - - void execute(const uint8_t* srcData, const uint8_t* weightsData, const ov::element::Type &srcPrc, - const VectorDims& inDims, const MemoryPtr& outMemory); + EmbeddingBag(const std::shared_ptr&, + size_t requiredInputsNum, + size_t indicesIdx, + size_t perSampleWeightsIdx, + size_t defaultIndexIdx); + + void execute(const uint8_t* srcData, + const uint8_t* weightsData, + const ov::element::Type& srcPrc, + const VectorDims& inDims, + const MemoryPtr& outMemory); ~EmbeddingBag() = default; protected: virtual void initFromInputs() = 0; - virtual void getIndices( - size_t embIndex, - const int*& indicesRef, - size_t& size, - int& weightsIdx, - bool& withWeights) = 0; + virtual void getIndices(size_t embIndex, + const int*& indicesRef, + size_t& size, + int& weightsIdx, + bool& withWeights) = 0; void prepareParams(const VectorDims& indexStaticShape); - template - void processData(const T* srcData, const T* weightsData, - const VectorDims& inDataDims, const MemoryPtr& outMemory); + template + void processData(const T* srcData, const T* weightsData, const VectorDims& inDataDims, const MemoryPtr& outMemory); const size_t EMB_TABLE_IDX = 0lu; const size_t INDICES_IDX; @@ -51,6 +51,6 @@ class EmbeddingBag { std::string _layerName; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.cpp b/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.cpp index b5fbaee982808d..8da557a823a948 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.cpp +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.cpp @@ -2,24 +2,27 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "embedding_bag_offsets.h" + #include -#include #include -#include "embedding_bag_offsets.h" -#include "openvino/op/embeddingbag_offsets_sum.hpp" -#include "openvino/op/embeddingbag_offsets.hpp" +#include +#include "openvino/op/embeddingbag_offsets.hpp" +#include "openvino/op/embeddingbag_offsets_sum.hpp" namespace ov { namespace intel_cpu { namespace node { -bool EmbeddingBagOffset::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool EmbeddingBagOffset::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto embBagOffsetSumOp = ov::as_type_ptr(op); const auto embBagOffsetOp = ov::as_type_ptr(op); if (!embBagOffsetSumOp && !embBagOffsetOp) { - errorMessage = "Node is not an instance of the v3::EmbeddingBagOffsetsSum or v15::EmbeddingBagOffsets operation."; + errorMessage = + "Node is not an instance of the v3::EmbeddingBagOffsetsSum or v15::EmbeddingBagOffsets operation."; return false; } } catch (...) { @@ -46,7 +49,8 @@ EmbeddingBagOffset::EmbeddingBagOffset(const std::shared_ptr& op, cons _reduction = Reduction::MEAN; break; default: - THROW_CPU_NODE_ERR("EmbeddingBagOffsets does not support reduction mode: ", ov::as_string(offsets_op->get_reduction())); + THROW_CPU_NODE_ERR("EmbeddingBagOffsets does not support reduction mode: ", + ov::as_string(offsets_op->get_reduction())); } } if (getInputShapeAtPort(INDICES_IDX).getRank() != 1ul) @@ -61,8 +65,10 @@ void EmbeddingBagOffset::initSupportedPrimitiveDescriptors() { return; std::string logPrefix = std::string("Layer EmbeddingBag with name '") + _layerName + "' "; - static const std::set supportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set supportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; auto inDataPrecision = getOriginalInputPrecisionAtPort(EMB_TABLE_IDX); if (one_of(inDataPrecision, ov::element::bf16, ov::element::f16)) @@ -71,8 +77,10 @@ void EmbeddingBagOffset::initSupportedPrimitiveDescriptors() { if (supportedPrecisions.find(inDataPrecision) == supportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } else { - static const std::set defaultSupportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set defaultSupportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; if (defaultSupportedPrecisions.find(inDataPrecision) == defaultSupportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } @@ -103,7 +111,11 @@ void EmbeddingBagOffset::initFromInputs() { } } -void EmbeddingBagOffset::getIndices(size_t embIndex, const int*& indices, size_t& size, int& weightsIdx, bool& withWeight) { +void EmbeddingBagOffset::getIndices(size_t embIndex, + const int*& indices, + size_t& size, + int& weightsIdx, + bool& withWeight) { if (static_cast(embIndex) >= _offsetsLen) { OPENVINO_THROW("Invalid embedding bag index."); } @@ -145,20 +157,23 @@ bool EmbeddingBagOffset::isExecutable() const { } void EmbeddingBagOffset::execute(dnnl::stream strm) { - const auto *srcData = getSrcDataAtPortAs(0); + const auto* srcData = getSrcDataAtPortAs(0); const uint8_t* weightsData = nullptr; if (_withWeights) weightsData = getSrcDataAtPortAs(PER_SAMPLE_WEIGHTS_IDX); - const auto &inputMem = getParentEdgeAt(0)->getMemory(); - EmbeddingBag::execute(srcData, weightsData, inputMem.getDesc().getPrecision(), - inputMem.getStaticDims(), getDstMemoryAtPort(0)); + const auto& inputMem = getParentEdgeAt(0)->getMemory(); + EmbeddingBag::execute(srcData, + weightsData, + inputMem.getDesc().getPrecision(), + inputMem.getStaticDims(), + getDstMemoryAtPort(0)); } bool EmbeddingBagOffset::created() const { return getType() == Type::EmbeddingBagOffsets; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.h b/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.h index a31b518e7891a9..f8a28152a26642 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.h +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag_offsets.h @@ -15,7 +15,7 @@ class EmbeddingBagOffset : public Node, public EmbeddingBag { public: EmbeddingBagOffset(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -41,6 +41,6 @@ class EmbeddingBagOffset : public Node, public EmbeddingBag { size_t _offsetsLen = 0; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.cpp b/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.cpp index fd2e0b6141f1fc..c1a06835a67af3 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.cpp +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.cpp @@ -2,23 +2,27 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "embedding_bag_packed.h" + #include -#include #include -#include "embedding_bag_packed.h" -#include "openvino/op/embeddingbag_packedsum.hpp" +#include + #include "openvino/op/embeddingbag_packed.hpp" +#include "openvino/op/embeddingbag_packedsum.hpp" namespace ov { namespace intel_cpu { namespace node { -bool EmbeddingBagPacked::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool EmbeddingBagPacked::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto embBagPackedSumOp = ov::as_type_ptr(op); const auto embBagPackedOp = ov::as_type_ptr(op); if (!embBagPackedSumOp && !embBagPackedOp) { - errorMessage = "Node is not an instance of the v3::EmbeddingBagPackedSum or v15::EmbeddingBagPacked operations."; + errorMessage = + "Node is not an instance of the v3::EmbeddingBagPackedSum or v15::EmbeddingBagPacked operations."; return false; } } catch (...) { @@ -45,7 +49,8 @@ EmbeddingBagPacked::EmbeddingBagPacked(const std::shared_ptr& op, cons _reduction = Reduction::MEAN; break; default: - THROW_CPU_NODE_ERR("EmbeddingBagPacked does not support reduction mode: ", ov::as_string(packed_op->get_reduction())); + THROW_CPU_NODE_ERR("EmbeddingBagPacked does not support reduction mode: ", + ov::as_string(packed_op->get_reduction())); } } if (getInputShapeAtPort(INDICES_IDX).getRank() != 2ul) @@ -57,8 +62,10 @@ void EmbeddingBagPacked::initSupportedPrimitiveDescriptors() { return; std::string logPrefix = std::string("Layer EmbeddingBag with name '") + _layerName + "' "; - static const std::set supportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set supportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; auto inDataPrecision = getOriginalInputPrecisionAtPort(EMB_TABLE_IDX); if (one_of(inDataPrecision, ov::element::bf16, ov::element::f16)) @@ -67,14 +74,16 @@ void EmbeddingBagPacked::initSupportedPrimitiveDescriptors() { if (supportedPrecisions.find(inDataPrecision) == supportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } else { - static const std::set defaultSupportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set defaultSupportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; if (defaultSupportedPrecisions.find(inDataPrecision) == defaultSupportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } - std::vector inDataConfigurators({{LayoutType::ncsp, inDataPrecision}, - {LayoutType::ncsp, ov::element::i32}}); + std::vector inDataConfigurators( + {{LayoutType::ncsp, inDataPrecision}, {LayoutType::ncsp, ov::element::i32}}); if (inputShapes.size() > PER_SAMPLE_WEIGHTS_IDX) inDataConfigurators.push_back({LayoutType::ncsp, inDataPrecision}); @@ -91,7 +100,11 @@ void EmbeddingBagPacked::initFromInputs() { _indices = getSrcDataAtPortAs(INDICES_IDX); } -void EmbeddingBagPacked::getIndices(size_t embIndex, const int*& indices, size_t& size, int& weightsIdx, bool& withWeight) { +void EmbeddingBagPacked::getIndices(size_t embIndex, + const int*& indices, + size_t& size, + int& weightsIdx, + bool& withWeight) { if (static_cast(embIndex) >= _batch * _indicesPerBag) OPENVINO_THROW("Invalid embedding bag index."); @@ -112,20 +125,23 @@ bool EmbeddingBagPacked::isExecutable() const { } void EmbeddingBagPacked::execute(dnnl::stream strm) { - const auto *srcData = getSrcDataAtPortAs(0); + const auto* srcData = getSrcDataAtPortAs(0); const uint8_t* weightsData = nullptr; if (_withWeights) weightsData = getSrcDataAtPortAs(PER_SAMPLE_WEIGHTS_IDX); - const auto &inputMem = getParentEdgeAt(0)->getMemory(); - EmbeddingBag::execute(srcData, weightsData, inputMem.getDesc().getPrecision(), - inputMem.getStaticDims(), getDstMemoryAtPort(0)); + const auto& inputMem = getParentEdgeAt(0)->getMemory(); + EmbeddingBag::execute(srcData, + weightsData, + inputMem.getDesc().getPrecision(), + inputMem.getStaticDims(), + getDstMemoryAtPort(0)); } bool EmbeddingBagPacked::created() const { return getType() == Type::EmbeddingBagPacked; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.h b/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.h index 6a9d33fe3afccb..a018d1b48929e1 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.h +++ b/src/plugins/intel_cpu/src/nodes/embedding_bag_packed.h @@ -15,7 +15,7 @@ class EmbeddingBagPacked : public Node, public EmbeddingBag { public: EmbeddingBagPacked(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -36,6 +36,6 @@ class EmbeddingBagPacked : public Node, public EmbeddingBag { size_t _indicesPerBag = 0; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.cpp b/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.cpp index 2a012c6b941831..8bd91799834bad 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.cpp +++ b/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.cpp @@ -2,17 +2,20 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "embedding_segments_sum.h" + #include -#include #include -#include "embedding_segments_sum.h" +#include + #include "openvino/opsets/opset3.hpp" namespace ov { namespace intel_cpu { namespace node { -bool EmbeddingSegmentsSum::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool EmbeddingSegmentsSum::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto embBagSegSumOp = ov::as_type_ptr(op); if (!embBagSegSumOp) { @@ -46,8 +49,10 @@ void EmbeddingSegmentsSum::initSupportedPrimitiveDescriptors() { return; std::string logPrefix = std::string("Layer EmbeddingBag with name '") + _layerName + "' "; - static const std::set supportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set supportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; auto inDataPrecision = getOriginalInputPrecisionAtPort(EMB_TABLE_IDX); if (one_of(inDataPrecision, ov::element::bf16, ov::element::f16)) @@ -56,8 +61,10 @@ void EmbeddingSegmentsSum::initSupportedPrimitiveDescriptors() { if (supportedPrecisions.find(inDataPrecision) == supportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } else { - static const std::set defaultSupportedPrecisions = - {ov::element::f32, ov::element::i8, ov::element::u8, ov::element::i32}; + static const std::set defaultSupportedPrecisions = {ov::element::f32, + ov::element::i8, + ov::element::u8, + ov::element::i32}; if (defaultSupportedPrecisions.find(inDataPrecision) == defaultSupportedPrecisions.end()) OPENVINO_THROW(logPrefix, "has unsupported precision: ", inDataPrecision.get_type_name()); } @@ -90,7 +97,11 @@ void EmbeddingSegmentsSum::initFromInputs() { } } -void EmbeddingSegmentsSum::getIndices(size_t embIndex, const int*& indices, size_t& size, int& weightsIdx, bool& withWeight) { +void EmbeddingSegmentsSum::getIndices(size_t embIndex, + const int*& indices, + size_t& size, + int& weightsIdx, + bool& withWeight) { if (embIndex >= static_cast(lastNumSegments_)) OPENVINO_THROW("Invalid embedding bag index."); @@ -143,20 +154,23 @@ bool EmbeddingSegmentsSum::isExecutable() const { } void EmbeddingSegmentsSum::execute(dnnl::stream strm) { - const auto *srcData = getSrcDataAtPortAs(0); + const auto* srcData = getSrcDataAtPortAs(0); const uint8_t* weightsData = nullptr; if (_withWeights) weightsData = getSrcDataAtPortAs(PER_SAMPLE_WEIGHTS_IDX); - const auto &inputMem = getParentEdgeAt(0)->getMemory(); - EmbeddingBag::execute(srcData, weightsData, inputMem.getDesc().getPrecision(), - inputMem.getStaticDims(), getDstMemoryAtPort(0)); + const auto& inputMem = getParentEdgeAt(0)->getMemory(); + EmbeddingBag::execute(srcData, + weightsData, + inputMem.getDesc().getPrecision(), + inputMem.getStaticDims(), + getDstMemoryAtPort(0)); } bool EmbeddingSegmentsSum::created() const { return getType() == Type::EmbeddingSegmentsSum; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.h b/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.h index bb312b4dd47246..984b9de68690b2 100644 --- a/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.h +++ b/src/plugins/intel_cpu/src/nodes/embedding_segments_sum.h @@ -15,7 +15,7 @@ class EmbeddingSegmentsSum : public Node, public EmbeddingBag { public: EmbeddingSegmentsSum(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -45,6 +45,6 @@ class EmbeddingSegmentsSum : public Node, public EmbeddingBag { size_t indicesSize_ = 0; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.cpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.cpp index 2bba0f5e73c0fe..de65176fb72235 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.cpp @@ -3,6 +3,7 @@ // #include "ref_convert.hpp" + #include "nodes/common/cpu_convert.h" namespace ov { @@ -13,9 +14,9 @@ bool CommonConvertExecutor::isSupported(ov::element::Type srcPrc, ov::element::T } bool CommonConvertExecutor::init(const ConvertParams& convertParams, - const MemoryDescPtr& srcDesc, - const MemoryDescPtr& dstDesc, - const dnnl::primitive_attr& attr) { + const MemoryDescPtr& srcDesc, + const MemoryDescPtr& dstDesc, + const dnnl::primitive_attr& attr) { commonConvertParams = convertParams; return true; } @@ -32,5 +33,5 @@ void CommonConvertExecutor::exec(const std::vector& src, const std:: commonConvertParams.size); } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.hpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.hpp index 337d377f3b3339..4bc3a709d2bcd2 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_convert.hpp @@ -15,9 +15,11 @@ class CommonConvertExecutor : public ConvertExecutor { bool init(const ConvertParams& convertParams, const MemoryDescPtr& srcDesc, const MemoryDescPtr& dstDesc, - const dnnl::primitive_attr &attr) override; + const dnnl::primitive_attr& attr) override; void exec(const std::vector& src, const std::vector& dst) override; - impl_desc_type implType() const override { return implDescType; }; + impl_desc_type implType() const override { + return implDescType; + }; static bool isSupported(ov::element::Type srcPrc, ov::element::Type dstPrc); protected: @@ -26,7 +28,6 @@ class CommonConvertExecutor : public ConvertExecutor { const ExecutorContext::CPtr convertContext; }; - class CommonConvertExecutorBuilder : public ConvertExecutorBuilder { public: ~CommonConvertExecutorBuilder() = default; @@ -40,5 +41,5 @@ class CommonConvertExecutorBuilder : public ConvertExecutorBuilder { } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.cpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.cpp index 0e1d43b48f6224..dd0cea3d238a4e 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.cpp @@ -3,6 +3,7 @@ // #include "ref_opt_transpose.hpp" + #include "openvino/core/parallel.hpp" namespace ov { @@ -26,21 +27,15 @@ void transpose_to_0312(const int MB, const MemoryCPtr& srcMemPtr, MemoryPtr& dst parallel_for3d(MB, DIM1, DIM2, [&](const int n, const int dim1, const int dim2) { for (int dim3 = 0; dim3 < DIM3; ++dim3) { - const int src_off = n * DIM1 * DIM2 * DIM3 + - dim1 * DIM2 * DIM3 + - dim2 * DIM3 + - dim3; - const int dst_off = n * DIM1 * DIM2 * DIM3 + - dim3 * DIM1 * DIM2 + - dim1 * DIM2 + - dim2; + const int src_off = n * DIM1 * DIM2 * DIM3 + dim1 * DIM2 * DIM3 + dim2 * DIM3 + dim3; + const int dst_off = n * DIM1 * DIM2 * DIM3 + dim3 * DIM1 * DIM2 + dim1 * DIM2 + dim2; dst_data[dst_off] = src_data[src_off]; } }); } -template +template void transpose_to_04123(const int MB, const MemoryCPtr& srcMemPtr, MemoryPtr& dstMemPtr) { const auto src_data = srcMemPtr->getDataAs(); auto dst_data = dstMemPtr->getDataAs(); @@ -52,23 +47,17 @@ void transpose_to_04123(const int MB, const MemoryCPtr& srcMemPtr, MemoryPtr& ds parallel_for4d(MB, DIM1, DIM2, DIM3, [&](const int n, const int dim1, const int dim2, const int dim3) { for (int dim4 = 0; dim4 < DIM4; ++dim4) { - const int src_off = n * DIM1 * DIM2 * DIM3 * DIM4 + - dim1 * DIM2 * DIM3 * DIM4 + - dim2 * DIM3 * DIM4 + - dim3 * DIM4 + - dim4; - const int dst_off = n * DIM1 * DIM2 * DIM3 * DIM4 + - dim4 * DIM1 * DIM2 * DIM3 + - dim1 * DIM2 * DIM3 + - dim2 * DIM3 + - dim3; + const int src_off = + n * DIM1 * DIM2 * DIM3 * DIM4 + dim1 * DIM2 * DIM3 * DIM4 + dim2 * DIM3 * DIM4 + dim3 * DIM4 + dim4; + const int dst_off = + n * DIM1 * DIM2 * DIM3 * DIM4 + dim4 * DIM1 * DIM2 * DIM3 + dim1 * DIM2 * DIM3 + dim2 * DIM3 + dim3; dst_data[dst_off] = src_data[src_off]; } }); } -template +template void transpose_to_051234(const int MB, const MemoryCPtr& srcMemPtr, MemoryPtr& dstMemPtr) { const auto src_data = srcMemPtr->getDataAs(); auto dst_data = dstMemPtr->getDataAs(); @@ -79,61 +68,61 @@ void transpose_to_051234(const int MB, const MemoryCPtr& srcMemPtr, MemoryPtr& d const int DIM4 = srcMemPtr->getStaticDims()[4]; const int DIM5 = srcMemPtr->getStaticDims()[5]; - parallel_for5d(MB, DIM1, DIM2, DIM3, DIM4, [&](const int n, const int dim1, const int dim2, const int dim3, const int dim4) { - for (int dim5 = 0; dim5 < DIM5; ++dim5) { - const int src_off = n * DIM1 * DIM2 * DIM3 * DIM4 * DIM5 + - dim1 * DIM2 * DIM3 * DIM4 * DIM5 + - dim2 * DIM3 * DIM4 * DIM5 + - dim3 * DIM4 * DIM5 + - dim4 * DIM5 + - dim5; - const int dst_off = n * DIM5 * DIM1 * DIM2 * DIM3 * DIM4 + - dim5 * DIM1 * DIM2 * DIM3 * DIM4 + - dim1 * DIM2 * DIM3 * DIM4 + - dim2 * DIM3 * DIM4 + - dim3 * DIM4 + - dim4; - - dst_data[dst_off] = src_data[src_off]; - } - }); + parallel_for5d(MB, + DIM1, + DIM2, + DIM3, + DIM4, + [&](const int n, const int dim1, const int dim2, const int dim3, const int dim4) { + for (int dim5 = 0; dim5 < DIM5; ++dim5) { + const int src_off = n * DIM1 * DIM2 * DIM3 * DIM4 * DIM5 + dim1 * DIM2 * DIM3 * DIM4 * DIM5 + + dim2 * DIM3 * DIM4 * DIM5 + dim3 * DIM4 * DIM5 + dim4 * DIM5 + dim5; + const int dst_off = n * DIM5 * DIM1 * DIM2 * DIM3 * DIM4 + dim5 * DIM1 * DIM2 * DIM3 * DIM4 + + dim1 * DIM2 * DIM3 * DIM4 + dim2 * DIM3 * DIM4 + dim3 * DIM4 + dim4; + + dst_data[dst_off] = src_data[src_off]; + } + }); } -template +template struct TransposeOptimizedEmitter { void operator()(TransposeContext& ctx) { switch (ctx.srcMemPtr->getStaticDims().size()) { - case 4: - transpose_to_0312(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); - break; - case 5: - transpose_to_04123(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); - break; - case 6: - transpose_to_051234(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); - break; - default: - OPENVINO_THROW("Transpose supports optimized execution with only 4D, 5D and 6D shapes"); + case 4: + transpose_to_0312(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); + break; + case 5: + transpose_to_04123(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); + break; + case 6: + transpose_to_051234(ctx.MB, ctx.srcMemPtr, ctx.dstMemPtr); + break; + default: + OPENVINO_THROW("Transpose supports optimized execution with only 4D, 5D and 6D shapes"); } } }; -} // namespace +} // namespace void RefOptimizedTransposeExecutor::exec(const std::vector& src, const std::vector& dst) { const size_t dataSize = src[0]->getDesc().getPrecision().size(); const int MB = src[0]->getStaticDims()[0]; TransposeContext ctx = {src[0], dst[0], MB}; - OV_SWITCH(intel_cpu, TransposeOptimizedEmitter, ctx, dataSize, + OV_SWITCH(intel_cpu, + TransposeOptimizedEmitter, + ctx, + dataSize, OV_CASE(1u, element_type_traits::value_type), OV_CASE(2u, element_type_traits::value_type), OV_CASE(4u, element_type_traits::value_type)); } -bool RefOptimizedTransposeExecutor::init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) { +bool RefOptimizedTransposeExecutor::init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { return true; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.hpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.hpp index be420bfb009e5a..65da099caa0f33 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_opt_transpose.hpp @@ -13,12 +13,14 @@ class RefOptimizedTransposeExecutor : public TransposeExecutor { public: using TransposeExecutor::TransposeExecutor; - bool init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) override; - void exec(const std::vector &src, const std::vector &dst) override; - impl_desc_type implType() const override { return impl_desc_type::ref; } + bool init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) override; + void exec(const std::vector& src, const std::vector& dst) override; + impl_desc_type implType() const override { + return impl_desc_type::ref; + } }; class RefOptimizedTransposeExecutorBuilder : public TransposeExecutorBuilder { @@ -27,12 +29,13 @@ class RefOptimizedTransposeExecutorBuilder : public TransposeExecutorBuilder { const std::vector& srcDescs, const std::vector& dstDescs) const override { static const std::vector> optimizedOrders = { - std::vector{0, 3, 1, 2}, - std::vector{0, 4, 1, 2, 3}, - std::vector{0, 5, 1, 2, 3, 4}, + std::vector{0, 3, 1, 2}, + std::vector{0, 4, 1, 2, 3}, + std::vector{0, 5, 1, 2, 3, 4}, }; if (srcDescs[0]->hasLayoutType(LayoutType::ncsp) && - std::find(optimizedOrders.begin(), optimizedOrders.end(), transposeParams.permuteParams.order) != optimizedOrders.end()) { + std::find(optimizedOrders.begin(), optimizedOrders.end(), transposeParams.permuteParams.order) != + optimizedOrders.end()) { return true; } DEBUG_LOG("RefOptimizedTransposeExecutor is not supported, because passed order is not optimized"); @@ -44,5 +47,5 @@ class RefOptimizedTransposeExecutorBuilder : public TransposeExecutorBuilder { } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.cpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.cpp index 8db8798ef8eaff..1716f008027fe9 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.cpp @@ -3,8 +3,9 @@ // #include "ref_transpose.hpp" -#include "openvino/core/parallel.hpp" + #include "nodes/common/cpu_memcpy.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -27,7 +28,10 @@ static inline void parallel_step(size_t nDims, const VectorDims& dims, VectorDim } } -void RefTransposeExecutor::referenceExecute(const uint8_t* src_data, uint8_t* dst_data, jit_permute_config_params jcp, const int mb) { +void RefTransposeExecutor::referenceExecute(const uint8_t* src_data, + uint8_t* dst_data, + jit_permute_config_params jcp, + const int mb) { VectorDims dst_dims = jcp.dst_block_dims; const VectorDims dst_strides = jcp.dst_strides; const VectorDims src_strides = jcp.src_strides; @@ -70,13 +74,13 @@ void RefTransposeExecutor::exec(const std::vector& src, const std::v referenceExecute(src_data, dst_data, jcp, MB); } -bool RefTransposeExecutor::init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) { +bool RefTransposeExecutor::init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { jcp = TransposeExecutor::prepareParams(transposeParams.permuteParams); return true; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.hpp b/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.hpp index 206d610368a9df..00c1602c0bd119 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/common/ref_transpose.hpp @@ -11,13 +11,19 @@ namespace intel_cpu { class RefTransposeExecutor : public TransposeExecutor { public: using TransposeExecutor::TransposeExecutor; - static void referenceExecute(const uint8_t* src_data, uint8_t* dst_data, jit_permute_config_params jcp, const int mb); - bool init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) override; - void exec(const std::vector &src, const std::vector &dst) override; - impl_desc_type implType() const override { return impl_desc_type::ref; } + static void referenceExecute(const uint8_t* src_data, + uint8_t* dst_data, + jit_permute_config_params jcp, + const int mb); + bool init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) override; + void exec(const std::vector& src, const std::vector& dst) override; + impl_desc_type implType() const override { + return impl_desc_type::ref; + } + private: jit_permute_config_params jcp; }; @@ -35,5 +41,5 @@ class RefTransposeExecutorBuilder : public TransposeExecutorBuilder { } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/convert.cpp b/src/plugins/intel_cpu/src/nodes/executors/convert.cpp index c8d7ce8addaf22..32141d53b10ee5 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/convert.cpp @@ -4,4 +4,5 @@ #include "convert.hpp" -ov::intel_cpu::ConvertExecutor::ConvertExecutor(const ov::intel_cpu::ExecutorContext::CPtr context) : convertContext(context) {} \ No newline at end of file +ov::intel_cpu::ConvertExecutor::ConvertExecutor(const ov::intel_cpu::ExecutorContext::CPtr context) + : convertContext(context) {} \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/convert.hpp b/src/plugins/intel_cpu/src/nodes/executors/convert.hpp index ce766663a0b653..dcb0bdde2ce219 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/convert.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/convert.hpp @@ -5,8 +5,8 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "executor.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -24,8 +24,9 @@ class ConvertExecutor : public Executor { virtual bool init(const ConvertParams& convertParams, const MemoryDescPtr& srcDesc, const MemoryDescPtr& dstDesc, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; virtual ~ConvertExecutor() = default; + protected: ConvertParams convertParams; const ExecutorContext::CPtr convertContext; @@ -45,5 +46,5 @@ class ConvertExecutorBuilder { using ConvertExecutorBuilderPtr = std::shared_ptr; using ConvertExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/convert_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/convert_list.cpp index 504c310ca15124..5375bd21166cc4 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/convert_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/convert_list.cpp @@ -9,9 +9,8 @@ namespace intel_cpu { const std::vector& getConvertExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) + OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared())}; return descs; } @@ -45,5 +44,5 @@ ConvertExecutorPtr ConvertExecutorFactory::makeExecutor(const ConvertParams& con OPENVINO_THROW("Supported executor is not found"); } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/convert_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/convert_list.hpp index a7ed05ceb634e4..9ea47f916d859f 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/convert_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/convert_list.hpp @@ -4,17 +4,15 @@ #pragma once -#include "executor.hpp" - #include "convert.hpp" +#include "executor.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_convert.hpp" +# include "acl/acl_convert.hpp" #endif +#include "common/primitive_cache.hpp" #include "common/ref_convert.hpp" - #include "onednn/iml_type_mapper.h" -#include "common/primitive_cache.hpp" namespace ov { namespace intel_cpu { @@ -31,7 +29,8 @@ class ConvertExecutorFactory : public ExecutorFactoryLegacy { ConvertExecutorFactory(const ConvertParams& convertParams, const MemoryDescPtr& srcDesc, const MemoryDescPtr& dstDesc, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getConvertExecutorsList()) { if (desc.builder->isSupported(convertParams, srcDesc, dstDesc)) { supportedDescs.push_back(desc); @@ -43,7 +42,7 @@ class ConvertExecutorFactory : public ExecutorFactoryLegacy { virtual ConvertExecutorPtr makeExecutor(const ConvertParams& convertParams, const MemoryDescPtr& srcDesc, const MemoryDescPtr& dstDesc, - const dnnl::primitive_attr &attr); + const dnnl::primitive_attr& attr); private: std::vector supportedDescs; @@ -53,5 +52,5 @@ class ConvertExecutorFactory : public ExecutorFactoryLegacy { using ConvertExecutorFactoryPtr = std::shared_ptr; using ConvertExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/debug_messages.hpp b/src/plugins/intel_cpu/src/nodes/executors/debug_messages.hpp index 26ae6ace59631b..222779a00ee18f 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/debug_messages.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/debug_messages.hpp @@ -4,25 +4,25 @@ #pragma once -#define UNSUPPORTED_SPARSE_WEIGHTS " sparse weights are not supported" +#define UNSUPPORTED_SPARSE_WEIGHTS " sparse weights are not supported" #define UNSUPPORTED_WEIGHTS_DECOMPRESSION " weights decompression is not supported" -#define UNSUPPORTED_POST_OPS " post ops are not supported" -#define UNSUPPORTED_NUMBER_OF_POSTOPS " the number of post ops is not supported" -#define UNSUPPORTED_TYPE_OF_POSTOPS " the type of post ops is not supported" -#define UNSUPPORTED_SRC_PRECISIONS " unsupported src precisions" -#define UNSUPPORTED_WEI_PRECISIONS " unsupported wei precisions" -#define UNSUPPORTED_DST_PRECISIONS " unsupported dst precisions" -#define UNSUPPORTED_ISA " unsupported isa" -#define UNSUPPORTED_SRC_RANK " unsupported src rank" -#define UNSUPPORTED_WEI_RANK " unsupported wei rank" -#define UNSUPPORTED_DST_RANK " unsupported dst rank" -#define UNSUPPORTED_DST_STRIDES " unsupported dst strides" -#define HEURISTICS_MISMATCH " heuristics mismatch" +#define UNSUPPORTED_POST_OPS " post ops are not supported" +#define UNSUPPORTED_NUMBER_OF_POSTOPS " the number of post ops is not supported" +#define UNSUPPORTED_TYPE_OF_POSTOPS " the type of post ops is not supported" +#define UNSUPPORTED_SRC_PRECISIONS " unsupported src precisions" +#define UNSUPPORTED_WEI_PRECISIONS " unsupported wei precisions" +#define UNSUPPORTED_DST_PRECISIONS " unsupported dst precisions" +#define UNSUPPORTED_ISA " unsupported isa" +#define UNSUPPORTED_SRC_RANK " unsupported src rank" +#define UNSUPPORTED_WEI_RANK " unsupported wei rank" +#define UNSUPPORTED_DST_RANK " unsupported dst rank" +#define UNSUPPORTED_DST_STRIDES " unsupported dst strides" +#define HEURISTICS_MISMATCH " heuristics mismatch" -#define VERIFY(condition, ...) \ - do { \ - if (!(condition)) { \ +#define VERIFY(condition, ...) \ + do { \ + if (!(condition)) { \ DEBUG_LOG(__VA_ARGS__); \ - return false; \ - } \ + return false; \ + } \ } while (0) diff --git a/src/plugins/intel_cpu/src/nodes/executors/deconv.cpp b/src/plugins/intel_cpu/src/nodes/executors/deconv.cpp index 23e0910bd0c82c..e485815e950af4 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/deconv.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/deconv.cpp @@ -5,8 +5,5 @@ #include "deconv.hpp" namespace ov { -namespace intel_cpu { - - -} // namespace intel_cpu -} // namespace ov +namespace intel_cpu {} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/deconv.hpp b/src/plugins/intel_cpu/src/nodes/executors/deconv.hpp index c632cc0cf99ad1..11920c0ab35b49 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/deconv.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/deconv.hpp @@ -34,11 +34,11 @@ class DeconvExecutor { virtual bool init(const DeconvAttrs& deconvAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; virtual void exec(const std::vector& src, const std::vector& dst, - const void *post_ops_data_) = 0; + const void* post_ops_data_) = 0; virtual ~DeconvExecutor() = default; virtual impl_desc_type getImplType() const = 0; @@ -53,12 +53,14 @@ using DeconvExecutorCPtr = std::shared_ptr; class DeconvExecutorBuilder { public: ~DeconvExecutorBuilder() = default; - virtual bool isSupported(const DeconvAttrs& convAttrs, const std::vector& srcDescs, const std::vector& dstDescs) const = 0; + virtual bool isSupported(const DeconvAttrs& convAttrs, + const std::vector& srcDescs, + const std::vector& dstDescs) const = 0; virtual DeconvExecutorPtr makeExecutor(const ExecutorContext::CPtr context) const = 0; }; using DeconvExecutorBuilderPtr = std::shared_ptr; using DeconvExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/deconv_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/deconv_list.cpp index f5b897c2d1b6e1..c093057e47413f 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/deconv_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/deconv_list.cpp @@ -9,11 +9,10 @@ namespace intel_cpu { const std::vector& getDeconvExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/deconv_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/deconv_list.hpp index 4c63a565aac2e0..fd114094303808 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/deconv_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/deconv_list.hpp @@ -4,15 +4,14 @@ #pragma once -#include "executor.hpp" - #include "deconv.hpp" +#include "executor.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_deconv.hpp" +# include "acl/acl_deconv.hpp" #endif -#include "onednn/iml_type_mapper.h" #include "common/primitive_cache.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -29,7 +28,8 @@ class DeconvExecutorFactory : public ExecutorFactoryLegacy { DeconvExecutorFactory(const DeconvAttrs& deconvAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getDeconvExecutorsList()) { if (desc.builder->isSupported(deconvAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -41,7 +41,7 @@ class DeconvExecutorFactory : public ExecutorFactoryLegacy { virtual DeconvExecutorPtr makeExecutor(const DeconvAttrs& deconvAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const dnnl::primitive_attr& attr) { auto build = [&](const DeconvExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(deconvAttrs, srcDescs, dstDescs, attr)) { @@ -75,5 +75,5 @@ class DeconvExecutorFactory : public ExecutorFactoryLegacy { using DeconvExecutorFactoryPtr = std::shared_ptr; using DeconvExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_aliases.hpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_aliases.hpp index a611e94f617e44..27fa7dd38d7a99 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_aliases.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_aliases.hpp @@ -4,8 +4,8 @@ #pragma once -#include #include +#include namespace ov { namespace intel_cpu { diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected.hpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected.hpp index 1d078feaa6549b..db5c8bed2e43e1 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected.hpp @@ -8,10 +8,10 @@ #include #include "cpu_memory.h" +#include "memory_desc/cpu_memory_desc_utils.h" #include "nodes/executors/dnnl/dnnl_aliases.hpp" #include "nodes/executors/dnnl/dnnl_utils.hpp" #include "nodes/executors/executor.hpp" -#include "memory_desc/cpu_memory_desc_utils.h" #include "nodes/executors/memory_arguments.hpp" #include "post_ops.hpp" @@ -123,7 +123,8 @@ class DnnlFCExecutor : public Executor { if (currentPrimitive && currentPrimitive->weightsDesc()->isCompatible(*newPrimMemDesc)) return; - originalMemDesc = Primitive::makeTransposedWeightDescriptor(originalMemDesc, newPrimMemDesc, m_attrs.weightsNonTransposed); + originalMemDesc = + Primitive::makeTransposedWeightDescriptor(originalMemDesc, newPrimMemDesc, m_attrs.weightsNonTransposed); const auto weiMemory = utils::prepareWeightsMemory(originalMemDesc, newPrimMemDesc, memory, m_context, true); m_primArgs[DNNL_ARG_WEIGHTS] = weiMemory->getPrimitive(); @@ -143,9 +144,7 @@ class DnnlFCExecutor : public Executor { m_primArgs[DNNL_ARG_SCRATCHPAD] = m_scratchPadMemory->getPrimitive(); } - void updateMemory(const PrimitivePtr currentPrimitive, - const PrimitivePtr newPrimitive, - const MemoryArgs& memory) { + void updateMemory(const PrimitivePtr currentPrimitive, const PrimitivePtr newPrimitive, const MemoryArgs& memory) { const auto& srcDesc = MemoryDescUtils::convertToDnnlMemoryDesc(memory.at(ARG_SRC)->getDescPtr()); const auto& weiDesc = MemoryDescUtils::convertToDnnlMemoryDesc(memory.at(ARG_WEI)->getDescPtr()); const auto& dstDesc = MemoryDescUtils::convertToDnnlMemoryDesc(memory.at(ARG_DST)->getDescPtr()); diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected_primitive.cpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected_primitive.cpp index 780dbb6f2f3f11..52434a1eeb8461 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected_primitive.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_fullyconnected_primitive.cpp @@ -74,9 +74,8 @@ bool DnnlFCPrimitive::Key::operator==(const Key& rhs) const { result = result && dst && rhs.dst && dst->getDnnlDesc() == rhs.dst->getDnnlDesc(); } - result = result && *attr.get() == *rhs.attr.get() && - sparseWeights == rhs.sparseWeights && - modelType == rhs.modelType; + result = + result && *attr.get() == *rhs.attr.get() && sparseWeights == rhs.sparseWeights && modelType == rhs.modelType; return result; } @@ -158,7 +157,8 @@ static bool useDynamicQuantizationImpl(size_t dqGroupSize, if (srcDesc->getPrecision() != ov::element::f32) return false; - MemoryCPtr zpPtr = memory.count(ARG_WEI | ARG_ATTR_ZERO_POINTS) ? memory.at(ARG_WEI | ARG_ATTR_ZERO_POINTS) : nullptr; + MemoryCPtr zpPtr = + memory.count(ARG_WEI | ARG_ATTR_ZERO_POINTS) ? memory.at(ARG_WEI | ARG_ATTR_ZERO_POINTS) : nullptr; // For dynamic quantization, VNNI accumulation requires weight to be unsigned. // To support dynamic quantization with weights symmetrically quantized as i8/i4 // w/o zero-point, we will transform weight to u8/u4 weight with zp 128/8. @@ -220,14 +220,8 @@ static DnnlPrimitiveAttrs createPrimitiveAttrs(const FCAttrs& attrs, one_of(srcDesc->getPrecision(), ov::element::u8, ov::element::i8) && weiDesc->getPrecision() == ov::element::i8; auto outputDataType = DnnlExtensionUtils::ElementTypeToDataType(dstDesc->getPrecision()); - DnnlPostOpsComposer dnnlpoc(postOps, - context->getEngine(), - dims, - dims.size() - 1, - isINT8, - 1 << 0, - memory, - outputDataType); + DnnlPostOpsComposer + dnnlpoc(postOps, context->getEngine(), dims, dims.size() - 1, isINT8, 1 << 0, memory, outputDataType); if (memory.count(ARG_WEI | ARG_ATTR_SCALES)) { auto dstPrc = memory.at(ARG_WEI | ARG_ATTR_SCALES)->getPrecision(); @@ -239,7 +233,9 @@ static DnnlPrimitiveAttrs createPrimitiveAttrs(const FCAttrs& attrs, if (memory.count(ARG_WEI | ARG_ATTR_ZERO_POINTS)) { auto dstPrc = useDynamicQuantization ? ov::element::u8 : ov::element::f32; - dnnlpoc.appendDecompressionZeroPoints(memory.at(ARG_WEI | ARG_ATTR_ZERO_POINTS), !attrs.weightsNonTransposed, dstPrc); + dnnlpoc.appendDecompressionZeroPoints(memory.at(ARG_WEI | ARG_ATTR_ZERO_POINTS), + !attrs.weightsNonTransposed, + dstPrc); } if (useDynamicQuantization) { diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_matmul_primitive.cpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_matmul_primitive.cpp index 40c365ee5f4da5..86b22607111833 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_matmul_primitive.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_matmul_primitive.cpp @@ -129,14 +129,8 @@ static DnnlPrimitiveAttrs createPrimitiveAttrs(const MatMulAttrs& attrs, one_of(srcDesc->getPrecision(), ov::element::u8, ov::element::i8) && weiDesc->getPrecision() == ov::element::i8; auto outputDataType = DnnlExtensionUtils::ElementTypeToDataType(dstDesc->getPrecision()); - DnnlPostOpsComposer dnnlpoc(postOps, - context->getEngine(), - dims, - dims.size() - 1, - isINT8, - 1 << 0, - memory, - outputDataType); + DnnlPostOpsComposer + dnnlpoc(postOps, context->getEngine(), dims, dims.size() - 1, isINT8, 1 << 0, memory, outputDataType); return dnnlpoc.compose(); } @@ -185,8 +179,7 @@ static dnnl::matmul::primitive_desc createDescriptorInternal(const dnnl::memory: wdt = memory::data_type::s8; } - const dnnl::memory::desc weightsDesc = - dnnl::memory::desc(weiDims, wdt, memory::format_tag::any); + const dnnl::memory::desc weightsDesc = dnnl::memory::desc(weiDims, wdt, memory::format_tag::any); return dnnl::matmul::primitive_desc(engine, inputsDesc, weightsDesc, newBiasDesc, outputsDesc, attr); } @@ -335,7 +328,8 @@ DnnlMatMulPrimitive::DnnlMatMulPrimitive(const Key& key, m_prim(primitive(m_primDesc)) {} void DnnlMatMulPrimitive::execute(const dnnl_primitive_args& primArgs) const { - std::cout << "Executing MM primitive" << "\n"; + std::cout << "Executing MM primitive" + << "\n"; m_prim.execute(m_stream, primArgs); } diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_shape_agnostic_data.hpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_shape_agnostic_data.hpp index d76e1984bd87d9..6a1b128be307ce 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_shape_agnostic_data.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_shape_agnostic_data.hpp @@ -12,8 +12,7 @@ namespace ov { namespace intel_cpu { struct DnnlShapeAgnosticData { - DnnlShapeAgnosticData(DnnlPrimitiveAttrs primAttrs) - : primAttrs(std::move(primAttrs)) {} + DnnlShapeAgnosticData(DnnlPrimitiveAttrs primAttrs) : primAttrs(std::move(primAttrs)) {} DnnlPrimitiveAttrs primAttrs; }; diff --git a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_utils.cpp b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_utils.cpp index fa273ac3d6c3ff..f23fd317d3546d 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_utils.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/dnnl/dnnl_utils.cpp @@ -8,8 +8,8 @@ #include #include "cpu_memory.h" -#include "memory_desc/dnnl_memory_desc.h" #include "memory_desc/cpu_memory_desc_utils.h" +#include "memory_desc/dnnl_memory_desc.h" #include "nodes/executors/executor.hpp" #include "nodes/reorder.h" #include "utils/cpu_utils.hpp" @@ -79,9 +79,9 @@ MemoryPtr prepareWeightsMemory(const DnnlMemoryDescPtr srcWeightDesc, auto globalWeightCache = context->getWeightsCache(); MemoryPtr ptr; - if (globalWeightCache && - dnnl::memory::format_kind::blocked == dstWeightDesc->getDnnlDesc().get_format_kind()) { - ptr = *globalWeightCache->findOrCreate(DnnlExtensionUtils::computeWeightsStringHash(weightsMem, dstWeightDesc), create); + if (globalWeightCache && dnnl::memory::format_kind::blocked == dstWeightDesc->getDnnlDesc().get_format_kind()) { + ptr = *globalWeightCache->findOrCreate(DnnlExtensionUtils::computeWeightsStringHash(weightsMem, dstWeightDesc), + create); } else { ptr = create(); } diff --git a/src/plugins/intel_cpu/src/nodes/executors/eltwise.cpp b/src/plugins/intel_cpu/src/nodes/executors/eltwise.cpp index 12bce382424e5c..8e7c470984b4f2 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/eltwise.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/eltwise.cpp @@ -9,5 +9,5 @@ namespace intel_cpu { EltwiseExecutor::EltwiseExecutor(const ExecutorContext::CPtr context) : context(context) {} -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/eltwise.hpp b/src/plugins/intel_cpu/src/nodes/executors/eltwise.hpp index 4b1271c49d5df0..b33c0eca10dae7 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/eltwise.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/eltwise.hpp @@ -5,8 +5,8 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "executor.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -19,10 +19,7 @@ struct EltwiseData { float gamma; bool operator==(const EltwiseData& rhs) const noexcept { - return algo == rhs.algo && - onednnAlgorithm == rhs.onednnAlgorithm && - alpha == rhs.alpha && - beta == rhs.beta && + return algo == rhs.algo && onednnAlgorithm == rhs.onednnAlgorithm && alpha == rhs.alpha && beta == rhs.beta && gamma == rhs.gamma; } }; @@ -34,24 +31,21 @@ struct EltwiseAttrs { float gamma; EltwiseAttrs() : algorithm(Algorithm::Default), alpha(0), beta(0), gamma(0) {} - EltwiseAttrs(Algorithm algorithm, float alpha, float beta, float gamma) : algorithm(algorithm), alpha(alpha), beta(beta), gamma(gamma) {} + EltwiseAttrs(Algorithm algorithm, float alpha, float beta, float gamma) + : algorithm(algorithm), + alpha(alpha), + beta(beta), + gamma(gamma) {} bool operator==(const EltwiseAttrs& rhs) const { bool retVal = true; - retVal = algorithm == rhs.algorithm && - alpha == rhs.alpha && - beta == rhs.beta && - gamma == rhs.gamma; + retVal = algorithm == rhs.algorithm && alpha == rhs.alpha && beta == rhs.beta && gamma == rhs.gamma; return retVal; } }; -enum class EltwisePostOpType { - Undefined, - Eltwise, - Dnnl -}; +enum class EltwisePostOpType { Undefined, Eltwise, Dnnl }; class EltwisePostOp { public: @@ -72,17 +66,20 @@ class EltwisePostOp { EltwisePostOpType type = EltwisePostOpType::Undefined; - bool operator==(const EltwisePostOp &rhs) const { - if (type != rhs.type) { return false; } + bool operator==(const EltwisePostOp& rhs) const { + if (type != rhs.type) { + return false; + } bool ret = true; switch (type) { - case EltwisePostOpType::Eltwise: - ret = eltwise == rhs.eltwise; - break; - case EltwisePostOpType::Dnnl: - ret = dnnlPostOps == rhs.dnnlPostOps; - break; - default: assert(!"unsupported eltwise post operation type"); + case EltwisePostOpType::Eltwise: + ret = eltwise == rhs.eltwise; + break; + case EltwisePostOpType::Dnnl: + ret = dnnlPostOps == rhs.dnnlPostOps; + break; + default: + assert(!"unsupported eltwise post operation type"); } return ret; } @@ -96,7 +93,9 @@ class EltwiseExecutor { const std::vector& dstDescs, const std::vector& postOps) = 0; - virtual void exec(const std::vector& src, const std::vector& dst, const void *post_ops_data_) = 0; + virtual void exec(const std::vector& src, + const std::vector& dst, + const void* post_ops_data_) = 0; virtual ~EltwiseExecutor() = default; virtual impl_desc_type getImplType() const = 0; @@ -121,5 +120,5 @@ class EltwiseExecutorBuilder { using EltwiseExecutorBuilderPtr = std::shared_ptr; using EltwiseExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.cpp index 1bd6647310d387..5b9479bdf502b6 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.cpp @@ -10,11 +10,10 @@ namespace intel_cpu { const std::vector& getEltwiseExecutorsList() { static std::vector descs = { OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - OV_CPU_INSTANCE_SHL(ExecutorType::Shl, std::make_shared()) - }; + OV_CPU_INSTANCE_SHL(ExecutorType::Shl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.hpp index 618e3499dc10a7..ac5c27c0ad36dc 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/eltwise_list.hpp @@ -4,19 +4,18 @@ #pragma once -#include "executor.hpp" - #include "eltwise.hpp" +#include "executor.hpp" #if defined(OV_CPU_WITH_ACL) -#include "aarch64/jit_eltwise.hpp" -#include "acl/acl_eltwise.hpp" +# include "aarch64/jit_eltwise.hpp" +# include "acl/acl_eltwise.hpp" #endif #if defined(OV_CPU_WITH_SHL) -#include "shl/shl_eltwise.hpp" +# include "shl/shl_eltwise.hpp" #endif -#include "onednn/iml_type_mapper.h" #include "common/primitive_cache.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -31,9 +30,10 @@ const std::vector& getEltwiseExecutorsList(); class EltwiseExecutorFactory : public ExecutorFactoryLegacy { public: EltwiseExecutorFactory(const EltwiseAttrs& eltwiseAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getEltwiseExecutorsList()) { if (desc.builder->isSupported(eltwiseAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -43,9 +43,9 @@ class EltwiseExecutorFactory : public ExecutorFactoryLegacy { ~EltwiseExecutorFactory() = default; virtual EltwiseExecutorPtr makeExecutor(const EltwiseAttrs& eltwiseAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const std::vector& postOps) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const std::vector& postOps) { auto build = [&](const EltwiseExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(eltwiseAttrs, srcDescs, dstDescs, postOps)) { @@ -84,5 +84,5 @@ class EltwiseExecutorFactory : public ExecutorFactoryLegacy { using EltwiseExecutorFactoryPtr = std::shared_ptr; using EltwiseExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/executor.cpp b/src/plugins/intel_cpu/src/nodes/executors/executor.cpp index 236f51c6d16149..399dab3d5499b9 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/executor.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/executor.cpp @@ -2,15 +2,17 @@ // SPDX-License-Identifier: Apache-2.0 // -#include - #include "executor.hpp" +#include + namespace ov { namespace intel_cpu { std::string ExecutorTypeToString(const ExecutorType type) { -#define CASE(_type) case ExecutorType::_type: return #_type; +#define CASE(_type) \ + case ExecutorType::_type: \ + return #_type; switch (type) { CASE(Undefined); CASE(Graph); @@ -27,7 +29,10 @@ std::string ExecutorTypeToString(const ExecutorType type) { } ExecutorType ExecutorTypeFromString(const std::string& typeStr) { -#define CASE(_type) if (typeStr == #_type) { return ExecutorType::_type; } +#define CASE(_type) \ + if (typeStr == #_type) { \ + return ExecutorType::_type; \ + } CASE(Undefined); CASE(Graph); CASE(Common); @@ -41,5 +46,5 @@ ExecutorType ExecutorTypeFromString(const std::string& typeStr) { return ExecutorType::Undefined; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/executor.hpp b/src/plugins/intel_cpu/src/nodes/executors/executor.hpp index 2016e8f5820dee..16a419c95d5efc 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/executor.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/executor.hpp @@ -4,15 +4,15 @@ #pragma once -#include "openvino/core/except.hpp" -#include "openvino/core/visibility.hpp" #include #include "cache/multi_cache.h" #include "cpu_memory.h" #include "graph_context.h" -#include "onednn/iml_type_mapper.h" #include "memory_arguments.hpp" +#include "onednn/iml_type_mapper.h" +#include "openvino/core/except.hpp" +#include "openvino/core/visibility.hpp" namespace ov { namespace intel_cpu { @@ -24,25 +24,25 @@ namespace intel_cpu { #endif #if defined(OV_CPU_WITH_ACL) -# if defined(OPENVINO_ARCH_ARM) -# define OV_CPU_INSTANCE_ACL32(...) {__VA_ARGS__}, -# else -# define OV_CPU_INSTANCE_ACL32(...) -# endif -# if defined(OPENVINO_ARCH_ARM64) -# define OV_CPU_INSTANCE_ACL64(...) {__VA_ARGS__}, -# else -# define OV_CPU_INSTANCE_ACL64(...) -# endif -# if defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64) -# define OV_CPU_INSTANCE_ACL(...) {__VA_ARGS__}, -# else -# define OV_CPU_INSTANCE_ACL(...) -# endif +# if defined(OPENVINO_ARCH_ARM) +# define OV_CPU_INSTANCE_ACL32(...) {__VA_ARGS__}, +# else +# define OV_CPU_INSTANCE_ACL32(...) +# endif +# if defined(OPENVINO_ARCH_ARM64) +# define OV_CPU_INSTANCE_ACL64(...) {__VA_ARGS__}, +# else +# define OV_CPU_INSTANCE_ACL64(...) +# endif +# if defined(OPENVINO_ARCH_ARM) || defined(OPENVINO_ARCH_ARM64) +# define OV_CPU_INSTANCE_ACL(...) {__VA_ARGS__}, +# else +# define OV_CPU_INSTANCE_ACL(...) +# endif #else -# define OV_CPU_INSTANCE_ACL32(...) -# define OV_CPU_INSTANCE_ACL64(...) -# define OV_CPU_INSTANCE_ACL(...) +# define OV_CPU_INSTANCE_ACL32(...) +# define OV_CPU_INSTANCE_ACL64(...) +# define OV_CPU_INSTANCE_ACL(...) #endif #if defined(OV_CPU_WITH_DNNL) @@ -72,28 +72,11 @@ namespace intel_cpu { #define OV_CPU_INSTANCE_COMMON(...) {__VA_ARGS__}, // @todo another option is to determine shape relation by executor type -enum class ShapeTolerance { - Agnostic, - Dependant -}; +enum class ShapeTolerance { Agnostic, Dependant }; -enum class ExecutorType { - Undefined, - Graph, - Common, - jit_x64, - Dnnl, - Acl, - Mlas, - jit_aarch64, - Shl -}; +enum class ExecutorType { Undefined, Graph, Common, jit_x64, Dnnl, Acl, Mlas, jit_aarch64, Shl }; -enum class OperationType { - FullyConnected, - MatMul, - Convolution -}; +enum class OperationType { FullyConnected, MatMul, Convolution }; std::string ExecutorTypeToString(const ExecutorType type); ExecutorType ExecutorTypeFromString(const std::string& typeStr); diff --git a/src/plugins/intel_cpu/src/nodes/executors/executor_config.hpp b/src/plugins/intel_cpu/src/nodes/executors/executor_config.hpp index d08c4ad8127325..cd9bcaf7a119f7 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/executor_config.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/executor_config.hpp @@ -4,8 +4,8 @@ #pragma once -#include "post_ops.hpp" #include "memory_arguments.hpp" +#include "post_ops.hpp" namespace ov { namespace intel_cpu { diff --git a/src/plugins/intel_cpu/src/nodes/executors/executor_implementation.hpp b/src/plugins/intel_cpu/src/nodes/executors/executor_implementation.hpp index 3459d1fe35e19e..07a58b0fa6cfa7 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/executor_implementation.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/executor_implementation.hpp @@ -19,22 +19,22 @@ template class ExecutorImplementation { public: using SupportsPredicate = std::function&)>; - using RequiresFallbackPredicate = std::function>(const executor::Config&)>; + using RequiresFallbackPredicate = + std::function>(const executor::Config&)>; using AcceptsShapePredicate = std::function; using CreateFunction = std::function; - ExecutorImplementation( - const char* name, - const ExecutorType type, - const OperationType operationType, - const ShapeTolerance shapeRelation, - SupportsPredicate supports, - RequiresFallbackPredicate requiresFallback, - AcceptsShapePredicate acceptsShape, - CreateFunction create) + ExecutorImplementation(const char* name, + const ExecutorType type, + const OperationType operationType, + const ShapeTolerance shapeRelation, + SupportsPredicate supports, + RequiresFallbackPredicate requiresFallback, + AcceptsShapePredicate acceptsShape, + CreateFunction create) : m_name(name), m_type(type), m_operationType(operationType), diff --git a/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp b/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp index 10f472ddcd7283..42101ce3fca257 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/fullyconnected_implementations.cpp @@ -11,14 +11,14 @@ #include "memory_desc/cpu_memory_desc.h" #include "nodes/executors/convolution_config.hpp" #include "nodes/executors/dnnl/dnnl_convolution_primitive.hpp" -#include "nodes/executors/dnnl/dnnl_fullyconnected_primitive.hpp" #include "nodes/executors/dnnl/dnnl_fullyconnected.hpp" +#include "nodes/executors/dnnl/dnnl_fullyconnected_primitive.hpp" #include "nodes/executors/dnnl/dnnl_matmul_primitive.hpp" #include "nodes/executors/dnnl/dnnl_shape_agnostic_data.hpp" #include "nodes/executors/executor.hpp" #include "nodes/executors/executor_implementation.hpp" -#include "nodes/executors/implementations.hpp" #include "nodes/executors/fullyconnected_config.hpp" +#include "nodes/executors/implementations.hpp" #include "nodes/executors/memory_arguments.hpp" #include "nodes/executors/mlas/mlas_gemm.hpp" #include "nodes/executors/precision_matcher.hpp" @@ -30,7 +30,7 @@ #include "utils/debug_capabilities.h" #if defined(OV_CPU_WITH_ACL) -#include "nodes/executors/acl/acl_fullyconnected.hpp" +# include "nodes/executors/acl/acl_fullyconnected.hpp" #endif #if defined(OV_CPU_WITH_SHL) @@ -50,7 +50,7 @@ using LayoutConfig = std::vector; static const LayoutConfig dnnlFCLayoutConfig{LayoutType::ncsp, LayoutType::ncsp, LayoutType::ncsp, LayoutType::ncsp}; static const LayoutConfig aclFCLayoutConfig{LayoutType::ncsp, LayoutType::ncsp, LayoutType::ncsp, LayoutType::ncsp}; -template +template struct Require { bool operator()() { return dnnl::impl::cpu::x64::mayiuse(ISA); @@ -144,10 +144,10 @@ static bool fullyMatchConfiguration(const MemoryDescArgs& currentDescriptors, continue; if (desc->getPrecision() != type) - return false; // type mismatch + return false; // type mismatch if (!desc->hasLayoutType(layoutConfig[i])) - return false; // layout mismatch + return false; // layout mismatch } return true; @@ -207,6 +207,8 @@ OV_CPU_MAYBE_UNUSED_FUNCTION static inline bool noPostOps(const FCConfig& config return config.postOps.empty(); } +// to keep OV_CPU_INSTANCE macros aligned +// clang-format off template <> const std::vector>& getImplementations() { static const std::vector> fullyconnectedImplementations { @@ -492,5 +494,7 @@ const std::vector>& getImplementations() { return fullyconnectedImplementations; } +// clang-format on + } // namespace intel_cpu } // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/graph_emitter.hpp b/src/plugins/intel_cpu/src/nodes/executors/graph_emitter.hpp index 784ed8bc778840..347ac4c981f4f1 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/graph_emitter.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/graph_emitter.hpp @@ -82,9 +82,7 @@ class GraphEmitter { return memoryDescs; } - static executor::Config createConfig(const MemoryArgs& memory, - const Attrs& attrs, - const PostOps& postOps) { + static executor::Config createConfig(const MemoryArgs& memory, const Attrs& attrs, const PostOps& postOps) { return executor::Config{memoryDescsFromMemory(memory), attrs, postOps}; } @@ -104,11 +102,11 @@ class GraphEmitter { const auto& graphExecutor = graphEmitter.createGraph(fallbackConfig.descs, fallbackConfig.attrs, fallbackConfig.postOps, context) - .ensureAttrsMatch() - .ensureSrcDescsMatch() - .ensureDstDescsMatch() - .ensurePostOpsMatch() - .emit(); + .ensureAttrsMatch() + .ensureSrcDescsMatch() + .ensureDstDescsMatch() + .ensurePostOpsMatch() + .emit(); (void)graphExecutor; OPENVINO_THROW("Fallback logic is not implemented yet"); // return graphExecutor; diff --git a/src/plugins/intel_cpu/src/nodes/executors/implementation_utils.hpp b/src/plugins/intel_cpu/src/nodes/executors/implementation_utils.hpp index cd029283a09c50..bee82af305c9d2 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/implementation_utils.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/implementation_utils.hpp @@ -5,6 +5,7 @@ #pragma once #include + #include "cpu_types.h" #include "memory_desc/cpu_memory_desc.h" #include "nodes/executors/memory_arguments.hpp" @@ -13,80 +14,80 @@ namespace ov { namespace intel_cpu { -template +template ov::element::Type memoryDescType(const Config& config) { return config.descs.at(idx)->getPrecision(); } -template +template ov::element::Type srcType(const Config& config) { return memoryDescType(config); } -template +template ov::element::Type weiType(const Config& config) { return memoryDescType(config); } -template +template ov::element::Type biaType(const Config& config) { return memoryDescType(config); } -template +template ov::element::Type dstType(const Config& config) { return memoryDescType(config); } -template +template ov::element::Type dims(const Config& config) { return config.descs.at(idx)->getShape().getDims(); } -template +template const VectorDims& srcDims(const Config& config) { return dims(config); } -template +template const VectorDims& weiDims(const Config& config) { return dims(config); } -template +template size_t rank(const Config& config) { return config.descs.at(idx)->getShape().getRank(); } -template +template size_t srcRank(const Config& config) { return rank(config); } -template +template size_t weiRank(const Config& config) { return rank(config); } -template +template size_t memSize(const Config& config) { return config.descs.at(idx)->getCurrentMemSize(); } -template +template size_t srcMemSize(const Config& config) { return memSize(config); } -template +template size_t weiMemSize(const Config& config) { return memSize(config); } -template +template size_t postOpsNumbers(const Config& config) { return config.postOps.size(); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/interpolate.cpp b/src/plugins/intel_cpu/src/nodes/executors/interpolate.cpp index d0a006b1bea0fa..cb830a36f03cb1 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/interpolate.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/interpolate.cpp @@ -3,18 +3,19 @@ // #include "interpolate.hpp" -#include "openvino/core/parallel.hpp" -#include "nodes/common/cpu_memcpy.h" + #include "emitters/plugin/x64/jit_load_store_emitters.hpp" +#include "nodes/common/cpu_memcpy.h" +#include "openvino/core/parallel.hpp" using namespace ov::intel_cpu; bool ov::intel_cpu::InterpolateExecutor::init(const InterpolateAttrs& interpolateAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { - const auto &srcDims = srcDescs[0]->getShape().getStaticDims(); - const auto &dstDims = dstDescs[0]->getShape().getStaticDims(); + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { + const auto& srcDims = srcDescs[0]->getShape().getStaticDims(); + const auto& dstDims = dstDescs[0]->getShape().getStaticDims(); interpAttrs = interpolateAttrs; srcDimPad5d = to5Dim(getPaddedInputShape(srcDims, interpolateAttrs.padBegin, interpolateAttrs.padEnd)); dstDim5d = to5Dim(dstDims); @@ -24,38 +25,49 @@ bool ov::intel_cpu::InterpolateExecutor::init(const InterpolateAttrs& interpolat spatialDimSize = getSpatialDimsNum(dataRank); switch (interpAttrs.mode) { - case InterpolateMode::nearest: { - buildTblNN(srcDimPad5d, dstDim5d, interpAttrs.dataScales, interpolateAttrs.layout, interpolateAttrs.nearestMode); - break; - } - case InterpolateMode::linear_onnx: { - buildTblLinearOnnx(srcDimPad5d, dstDim5d, interpAttrs.dataScales, interpolateAttrs.layout); - break; - } - case InterpolateMode::linear: { - static constexpr int LINEAR_KERNEL = 2; - buildTblLinear(srcDimPad5d, dstDim5d, interpAttrs.dataScales, LINEAR_KERNEL, interpolateAttrs.antialias); - break; - } - case InterpolateMode::cubic: { - buildTblCubic(srcDimPad5d, dstDim5d, interpAttrs.dataScales, interpolateAttrs.cubeCoeff, interpolateAttrs.layout); - break; - } - default: { - OPENVINO_THROW("Interpolate executor does not support interpolate mode: ", interpAttrs.mode); - break; - } + case InterpolateMode::nearest: { + buildTblNN(srcDimPad5d, + dstDim5d, + interpAttrs.dataScales, + interpolateAttrs.layout, + interpolateAttrs.nearestMode); + break; + } + case InterpolateMode::linear_onnx: { + buildTblLinearOnnx(srcDimPad5d, dstDim5d, interpAttrs.dataScales, interpolateAttrs.layout); + break; + } + case InterpolateMode::linear: { + static constexpr int LINEAR_KERNEL = 2; + buildTblLinear(srcDimPad5d, dstDim5d, interpAttrs.dataScales, LINEAR_KERNEL, interpolateAttrs.antialias); + break; + } + case InterpolateMode::cubic: { + buildTblCubic(srcDimPad5d, + dstDim5d, + interpAttrs.dataScales, + interpolateAttrs.cubeCoeff, + interpolateAttrs.layout); + break; + } + default: { + OPENVINO_THROW("Interpolate executor does not support interpolate mode: ", interpAttrs.mode); + break; + } } return true; } // ===================================================================================================================== // index layout: // d_0............d_OD-1, h_0..............h_OH-1, w_0................w_OW-1 -void ov::intel_cpu::InterpolateExecutor::buildTblNN(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, InterpolateLayoutType layout, InterpolateNearestMode nearestMode) { +void ov::intel_cpu::InterpolateExecutor::buildTblNN(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout, + InterpolateNearestMode nearestMode) { const int dimSize = dataRank; float fz = (dimSize == 5) ? dataScales[dimSize - 3] : 1.f; - float fy = dataScales[dimSize - 2]; + float fy = dataScales[dimSize - 2]; float fx = dataScales[dimSize - 1]; size_t ID = srcDimPad5d[2], IH = srcDimPad5d[3], IW = srcDimPad5d[4]; size_t OD = dstDim5d[2], OH = dstDim5d[3], OW = dstDim5d[4]; @@ -84,80 +96,91 @@ void ov::intel_cpu::InterpolateExecutor::buildTblNN(const VectorDims& srcDimPad5 // scale is float(outShape) / float(inShape) // strictly consistent with onnx calc manner(div scale, not multiply inverse), given this is done offline // the slight precison diff can produce obvious wrong value due to "nearest round" behavior for NN mode -float ov::intel_cpu::InterpolateExecutor::coordTransToInput(int outCoord, float scale, int inShape, int outShape) const { +float ov::intel_cpu::InterpolateExecutor::coordTransToInput(int outCoord, + float scale, + int inShape, + int outShape) const { if (scale == 1.0f || (inShape == outShape)) { return outCoord; } switch (interpAttrs.coordTransMode) { - case InterpolateCoordTransMode::half_pixel: { + case InterpolateCoordTransMode::half_pixel: { + return (outCoord + 0.5f) / scale - 0.5f; + break; + } + case InterpolateCoordTransMode::pytorch_half_pixel: { + if (outShape > 1) return (outCoord + 0.5f) / scale - 0.5f; - break; - } - case InterpolateCoordTransMode::pytorch_half_pixel: { - if (outShape > 1) - return (outCoord + 0.5f) / scale - 0.5f; - else - return 0; - break; - } - case InterpolateCoordTransMode::asymmetric: { - return static_cast(outCoord) / scale; - break; - } - case InterpolateCoordTransMode::tf_half_pixel_for_nn: { - return (outCoord + 0.5f) / scale; - break; - } - case InterpolateCoordTransMode::align_corners: { - if (outShape > 1) - return outCoord * (static_cast(inShape - 1) / static_cast(outShape - 1)); - else - return 0; - break; - } - default: { - OPENVINO_THROW("errorPrefix", " does not support specified coordinate transformation mode"); - break; - } + else + return 0; + break; + } + case InterpolateCoordTransMode::asymmetric: { + return static_cast(outCoord) / scale; + break; + } + case InterpolateCoordTransMode::tf_half_pixel_for_nn: { + return (outCoord + 0.5f) / scale; + break; + } + case InterpolateCoordTransMode::align_corners: { + if (outShape > 1) + return outCoord * (static_cast(inShape - 1) / static_cast(outShape - 1)); + else + return 0; + break; + } + default: { + OPENVINO_THROW("errorPrefix", " does not support specified coordinate transformation mode"); + break; + } } } -int ov::intel_cpu::InterpolateExecutor::nearestRound(float originCoord, bool isDownsample, InterpolateNearestMode nearestMode) const { +int ov::intel_cpu::InterpolateExecutor::nearestRound(float originCoord, + bool isDownsample, + InterpolateNearestMode nearestMode) const { switch (nearestMode) { - case InterpolateNearestMode::round_prefer_floor: { - if (originCoord == (static_cast(originCoord) + 0.5f)) - return static_cast(std::floor(originCoord)); - else - return static_cast(std::round(originCoord)); - break; - } - case InterpolateNearestMode::round_prefer_ceil: { - return static_cast(std::round(originCoord)); - break; - } - case InterpolateNearestMode::floor: { + case InterpolateNearestMode::round_prefer_floor: { + if (originCoord == (static_cast(originCoord) + 0.5f)) return static_cast(std::floor(originCoord)); - break; - } - case InterpolateNearestMode::ceil: { + else + return static_cast(std::round(originCoord)); + break; + } + case InterpolateNearestMode::round_prefer_ceil: { + return static_cast(std::round(originCoord)); + break; + } + case InterpolateNearestMode::floor: { + return static_cast(std::floor(originCoord)); + break; + } + case InterpolateNearestMode::ceil: { + return static_cast(std::ceil(originCoord)); + break; + } + case InterpolateNearestMode::simple: { + if (isDownsample) return static_cast(std::ceil(originCoord)); - break; - } - case InterpolateNearestMode::simple: { - if (isDownsample) - return static_cast(std::ceil(originCoord)); - else - return static_cast(originCoord); - } - default: { - OPENVINO_THROW("errorPrefix", " does not support specified nearest round mode"); - break; - } + else + return static_cast(originCoord); + } + default: { + OPENVINO_THROW("errorPrefix", " does not support specified nearest round mode"); + break; + } } } -void ov::intel_cpu::InterpolateExecutor::linearOnnxCF(int outCoord, float scale, int inShape, int outShape, - int& index0, int& index1, float& weight0, float& weight1) { +void ov::intel_cpu::InterpolateExecutor::linearOnnxCF(int outCoord, + float scale, + int inShape, + int outShape, + int& index0, + int& index1, + float& weight0, + float& weight1) { float inCoord = coordTransToInput(outCoord, scale, inShape, outShape); inCoord = std::max(0.0f, std::min(inCoord, static_cast(inShape - 1))); index0 = std::min(static_cast(inCoord), inShape - 1); @@ -171,8 +194,10 @@ void ov::intel_cpu::InterpolateExecutor::linearOnnxCF(int outCoord, float scale, } } -void ov::intel_cpu::InterpolateExecutor::buildTblLinearOnnx(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, InterpolateLayoutType layout) { +void ov::intel_cpu::InterpolateExecutor::buildTblLinearOnnx(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout) { int dimSize = dataRank; float fz = (spatialDimSize > 2) ? dataScales[dimSize - 3] : 1.f; float fy = (spatialDimSize > 1) ? dataScales[dimSize - 2] : 1.f; @@ -231,7 +256,7 @@ void ov::intel_cpu::InterpolateExecutor::buildTblLinearOnnx(const VectorDims& sr indexPtr[1][idxOzOyOx] = (izF * IH * IW + iyT * IW + ixR) * scale; weightPtr[0][idxOzOyOx] = weightL; weightPtr[1][idxOzOyOx] = weightR; - if (spatialDimSize > 1) { + if (spatialDimSize > 1) { indexPtr[2][idxOzOyOx] = (izF * IH * IW + iyB * IW + ixL) * scale; indexPtr[3][idxOzOyOx] = (izF * IH * IW + iyB * IW + ixR) * scale; weightPtr[2][idxOzOyOx] = weightT; @@ -284,8 +309,11 @@ void ov::intel_cpu::InterpolateExecutor::buildTblLinearOnnx(const VectorDims& sr // wd .........wd, wh............wh, ww.............ww, id...........id, ih............ih, iw..............iw // | | // wh0.....wh_diameter ih0.....ih_diameter -void ov::intel_cpu::InterpolateExecutor::buildTblLinear(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, int kernel_width, bool antialias) { +void ov::intel_cpu::InterpolateExecutor::buildTblLinear(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + int kernel_width, + bool antialias) { int dimSize = dataRank; float fz = (dimSize == 5) ? dataScales[dimSize - 3] : 1.f; float fy = dataScales[dimSize - 2]; @@ -309,15 +337,15 @@ void ov::intel_cpu::InterpolateExecutor::buildTblLinear(const VectorDims& srcDim int sizeOH = OH * diaOH; int sizeOW = OW * diaOW; indexTable.resize((sizeOD + sizeOH + sizeOW) * 2); - float *weightTable = reinterpret_cast(&indexTable[0]); - float *weightOD = static_cast(&weightTable[0]); - float *weightOH = static_cast(&weightTable[sizeOD]); - float *weightOW = static_cast(&weightTable[sizeOD + sizeOH]); + float* weightTable = reinterpret_cast(&indexTable[0]); + float* weightOD = static_cast(&weightTable[0]); + float* weightOH = static_cast(&weightTable[sizeOD]); + float* weightOW = static_cast(&weightTable[sizeOD + sizeOH]); - int *idxTable = static_cast(&indexTable[sizeOD + sizeOH + sizeOW]); - int *idxOD = static_cast(&idxTable[0]); - int *idxOH = static_cast(&idxTable[sizeOD]); - int *idxOW = static_cast(&idxTable[sizeOD + sizeOH]); + int* idxTable = static_cast(&indexTable[sizeOD + sizeOH + sizeOW]); + int* idxOD = static_cast(&idxTable[0]); + int* idxOH = static_cast(&idxTable[sizeOD]); + int* idxOW = static_cast(&idxTable[sizeOD + sizeOH]); for (int oz = 0; oz < static_cast(OD); oz++) { float iz = coordTransToInput(oz, fz, ID, OD); @@ -375,8 +403,11 @@ std::vector ov::intel_cpu::InterpolateExecutor::getCubicCoeffs(float mant // table layout: // OW OW OW OW OW OH OH OH OH OH // x_idx x_weight0 x_weight1 x_weight2 x_weight3 y_idx y_weight0 y_weight1 y_weight2 y_weight3 -void ov::intel_cpu::InterpolateExecutor::buildTblCubic(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - float cubicCoeff, InterpolateLayoutType layout) { +void ov::intel_cpu::InterpolateExecutor::buildTblCubic(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, + InterpolateLayoutType layout) { int dimSize = dataRank; float fy = dataScales[dimSize - 2]; float fx = dataScales[dimSize - 1]; @@ -394,9 +425,9 @@ void ov::intel_cpu::InterpolateExecutor::buildTblCubic(const VectorDims& srcDimP } int tblAdvance = 0; - int *xOrigin = static_cast(&indexTable[tblAdvance]); + int* xOrigin = static_cast(&indexTable[tblAdvance]); tblAdvance += OW; - float *xFactor = reinterpret_cast(&indexTable[tblAdvance]); + float* xFactor = reinterpret_cast(&indexTable[tblAdvance]); for (int ox = 0; ox < OW; ox++) { float ix = coordTransToInput(ox, fx, IW, OW); int ix_r = static_cast(std::floor(ix)); @@ -410,9 +441,9 @@ void ov::intel_cpu::InterpolateExecutor::buildTblCubic(const VectorDims& srcDimP } tblAdvance += CUBIC_GRID_LEN * OW; - int *yOrigin = static_cast(&indexTable[tblAdvance]); + int* yOrigin = static_cast(&indexTable[tblAdvance]); tblAdvance += OH; - float *yFactor = reinterpret_cast(&indexTable[tblAdvance]); + float* yFactor = reinterpret_cast(&indexTable[tblAdvance]); for (int oy = 0; oy < OH; oy++) { float iy = coordTransToInput(oy, fy, IH, OH); int iy_r = static_cast(std::floor(iy)); @@ -427,9 +458,9 @@ void ov::intel_cpu::InterpolateExecutor::buildTblCubic(const VectorDims& srcDimP if (layout == InterpolateLayoutType::planar) { tblAdvance += CUBIC_GRID_LEN * OH; - int *sequenceOH = static_cast(&indexTable[tblAdvance]); + int* sequenceOH = static_cast(&indexTable[tblAdvance]); tblAdvance += OH * OW; - int *sequenceOW = static_cast(&indexTable[tblAdvance]); + int* sequenceOW = static_cast(&indexTable[tblAdvance]); for (int h = 0; h < OH; ++h) { int offset = h * OW; for (int w = 0; w < OW; ++w) { @@ -447,16 +478,17 @@ inline VectorDims getBlockND(const VectorDims& shape) { int shapeRank = shape.size(); VectorDims blockND(shapeRank + 1, 1); for (int i = shapeRank - 1; i >= 0; i--) { - blockND[i] = shape[i] * blockND[i+1]; + blockND[i] = shape[i] * blockND[i + 1]; } return blockND; } -const uint8_t* ov::intel_cpu::InterpolateExecutor::padPreprocess(const std::vector& src, const std::vector& dst) { - const uint8_t *src_data_origin = src[0]->getDataAs(); +const uint8_t* ov::intel_cpu::InterpolateExecutor::padPreprocess(const std::vector& src, + const std::vector& dst) { + const uint8_t* src_data_origin = src[0]->getDataAs(); - const auto &srcDim = src[0]->getStaticDims(); - const auto &dstDim = dst[0]->getStaticDims(); + const auto& srcDim = src[0]->getStaticDims(); + const auto& dstDim = dst[0]->getStaticDims(); size_t dimSize = srcDim.size(); auto srcDimPad = getSrcDimPad5d(); @@ -465,7 +497,7 @@ const uint8_t* ov::intel_cpu::InterpolateExecutor::padPreprocess(const std::vect const auto dstDim5d = to5Dim(dstDim); const auto srcDataSize = src[0]->getDesc().getPrecision().size(); - const uint8_t *src_data = nullptr; + const uint8_t* src_data = nullptr; std::vector srcPadded; if (interpAttrs.hasPad) { int padB0 = (dimSize > 2) ? interpAttrs.padBegin[0] : 0; @@ -479,23 +511,32 @@ const uint8_t* ov::intel_cpu::InterpolateExecutor::padPreprocess(const std::vect if (interpAttrs.layout == InterpolateLayoutType::planar) { srcPadded.resize(inShapePadBlock[0] * srcDataSize, 0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); parallel_for4d(srcDim5d[0], srcDim5d[1], srcDim5d[2], srcDim5d[3], [&](int n, int c, int d, int h) { - const uint8_t *src = src_data_origin + (inShapeBlock[1] * n + inShapeBlock[2] * c + inShapeBlock[3] * d + inShapeBlock[4] * h) * srcDataSize; - uint8_t *srcPad = src_data_pad + (inShapePadBlock[1] * (n + padB0) + inShapePadBlock[2] * (c + padB1) + - inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + padB4) * srcDataSize; + const uint8_t* src = src_data_origin + (inShapeBlock[1] * n + inShapeBlock[2] * c + + inShapeBlock[3] * d + inShapeBlock[4] * h) * + srcDataSize; + uint8_t* srcPad = + src_data_pad + (inShapePadBlock[1] * (n + padB0) + inShapePadBlock[2] * (c + padB1) + + inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + padB4) * + srcDataSize; cpu_memcpy(srcPad, src, srcDim5d[4] * srcDataSize); }); src_data = src_data_pad; } else if (interpAttrs.layout == InterpolateLayoutType::by_channel) { srcPadded.resize(inShapePadBlock[0] * srcDataSize, 0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); parallel_for4d(srcDim5d[0], srcDim5d[2], srcDim5d[3], srcDim5d[4], [&](int n, int d, int h, int w) { - const uint8_t *src = src_data_origin + (inShapeBlock[1] * n + - (inShapeBlock[3] * d + inShapeBlock[4] * h + inShapeBlock[5] * w) * srcDim5d[1]) * srcDataSize; - uint8_t *srcPad = src_data_pad + (inShapePadBlock[1] * (n + padB0) + (inShapePadBlock[3] * (d + padB2) + - inShapePadBlock[4] * (h + padB3) + - inShapePadBlock[5] * (w + padB4)) * srcDimPad5d[1] + padB1) * srcDataSize; + const uint8_t* src = src_data_origin + + (inShapeBlock[1] * n + + (inShapeBlock[3] * d + inShapeBlock[4] * h + inShapeBlock[5] * w) * srcDim5d[1]) * + srcDataSize; + uint8_t* srcPad = src_data_pad + (inShapePadBlock[1] * (n + padB0) + + (inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + + inShapePadBlock[5] * (w + padB4)) * + srcDimPad5d[1] + + padB1) * + srcDataSize; cpu_memcpy(srcPad, src, srcDim5d[1] * srcDataSize); }); src_data = src_data_pad; @@ -504,23 +545,30 @@ const uint8_t* ov::intel_cpu::InterpolateExecutor::padPreprocess(const std::vect size_t CB = div_up(srcDimPad5d[1], blkSize); size_t eltsTotal = srcDimPad5d[0] * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize; srcPadded.resize(eltsTotal * srcDataSize, 0x0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); if ((srcDim5d[0] != srcDimPad5d[0]) || (srcDim5d[1] != srcDimPad5d[1])) { OPENVINO_THROW("Interpolate layer with name does not support padding on batch and channel dimensions"); } - parallel_for5d(srcDim5d[0], CB, srcDim5d[2], srcDim5d[3], srcDim5d[4], [&](int n, int cb, int d, int h, int w) { - const uint8_t *src = src_data_origin + (n * CB * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (cb * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (d * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (h * srcDim5d[4] * blkSize) * srcDataSize - + (w * blkSize) * srcDataSize; - uint8_t *srcPad = src_data_pad + (n * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + (cb * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + ((d + padB2) * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + ((h + padB3) * srcDimPad5d[4] * blkSize) * srcDataSize - + ((w + padB4) * blkSize) * srcDataSize; - cpu_memcpy(srcPad, src, blkSize * srcDataSize); - }); + parallel_for5d( + srcDim5d[0], + CB, + srcDim5d[2], + srcDim5d[3], + srcDim5d[4], + [&](int n, int cb, int d, int h, int w) { + const uint8_t* src = src_data_origin + + (n * CB * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (cb * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (d * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (h * srcDim5d[4] * blkSize) * srcDataSize + (w * blkSize) * srcDataSize; + uint8_t* srcPad = + src_data_pad + + (n * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize + + (cb * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize + + ((d + padB2) * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize + + ((h + padB3) * srcDimPad5d[4] * blkSize) * srcDataSize + ((w + padB4) * blkSize) * srcDataSize; + cpu_memcpy(srcPad, src, blkSize * srcDataSize); + }); src_data = src_data_pad; } } else { diff --git a/src/plugins/intel_cpu/src/nodes/executors/interpolate.hpp b/src/plugins/intel_cpu/src/nodes/executors/interpolate.hpp index 15df4eed5f0471..041589c0ab9f6a 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/interpolate.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/interpolate.hpp @@ -11,41 +11,15 @@ namespace ov { namespace intel_cpu { -enum InterpolateLayoutType { - planar, - block, - by_channel -}; +enum InterpolateLayoutType { planar, block, by_channel }; -enum InterpolateMode { - nearest, - linear, - linear_onnx, - cubic, - bilinear_pillow, - bicubic_pillow -}; +enum InterpolateMode { nearest, linear, linear_onnx, cubic, bilinear_pillow, bicubic_pillow }; -enum InterpolateCoordTransMode { - half_pixel, - pytorch_half_pixel, - asymmetric, - tf_half_pixel_for_nn, - align_corners -}; +enum InterpolateCoordTransMode { half_pixel, pytorch_half_pixel, asymmetric, tf_half_pixel_for_nn, align_corners }; -enum class InterpolateNearestMode { - round_prefer_floor, - round_prefer_ceil, - floor, - ceil, - simple -}; +enum class InterpolateNearestMode { round_prefer_floor, round_prefer_ceil, floor, ceil, simple }; -enum class InterpolateShapeCalcMode { - sizes, - scales -}; +enum class InterpolateShapeCalcMode { sizes, scales }; struct InterpolateAttrs { InterpolateShapeCalcMode shapeCalcMode = InterpolateShapeCalcMode::sizes; @@ -63,9 +37,9 @@ struct InterpolateAttrs { bool hasPad = false; }; -inline VectorDims getPaddedInputShape(const VectorDims &srcDims, - const std::vector &padBegin, - const std::vector &padEnd) { +inline VectorDims getPaddedInputShape(const VectorDims& srcDims, + const std::vector& padBegin, + const std::vector& padEnd) { VectorDims paddedShape; int dataRank = srcDims.size(); for (int i = 0; i < dataRank; i++) { @@ -80,16 +54,16 @@ inline int clipCoord(int pos, int length) { inline size_t getSpatialDimsNum(const Dim rank) { switch (rank) { - case 1: - case 3: - return 1; - case 2: - case 4: - return 2; - case 5: - return 3; - default: - OPENVINO_THROW("Can't define number spatial"); + case 1: + case 3: + return 1; + case 2: + case 4: + return 2; + case 5: + return 3; + default: + OPENVINO_THROW("Can't define number spatial"); } } @@ -133,27 +107,49 @@ class InterpolateExecutor { virtual bool init(const InterpolateAttrs& interpolateAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr); - virtual void exec(const std::vector& src, const std::vector& dst, const void *post_ops_data_) = 0; + const dnnl::primitive_attr& attr); + virtual void exec(const std::vector& src, + const std::vector& dst, + const void* post_ops_data_) = 0; virtual impl_desc_type getImplType() const = 0; virtual ~InterpolateExecutor() = default; - VectorDims getSrcDimPad5d() const { return srcDimPad5d; } + VectorDims getSrcDimPad5d() const { + return srcDimPad5d; + } const uint8_t* padPreprocess(const std::vector& src, const std::vector& dst); private: - void buildTblNN(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - InterpolateLayoutType layout, InterpolateNearestMode nearestMode); - void buildTblLinearOnnx(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, + void buildTblNN(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout, + InterpolateNearestMode nearestMode); + void buildTblLinearOnnx(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, InterpolateLayoutType layout); - void buildTblLinear(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, int kernel_width, + void buildTblLinear(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + int kernel_width, bool antialias); - void buildTblCubic(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, float cubicCoeff, + void buildTblCubic(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, InterpolateLayoutType layout); float coordTransToInput(int outCoord, float scale, int inShape, int outShape) const; int nearestRound(float origin, bool isDownsample, InterpolateNearestMode nearestMode) const; - void linearOnnxCF(int outCoord, float scale, int inShape, int outShape, int& index0, int& index1, float& weight0, float& weight1); + void linearOnnxCF(int outCoord, + float scale, + int inShape, + int outShape, + int& index0, + int& index1, + float& weight0, + float& weight1); std::vector getCubicCoeffs(float mantissa, float a); protected: @@ -180,5 +176,5 @@ class InterpolateExecutorBuilder { using InterpolateExecutorBuilderPtr = std::shared_ptr; using InterpolateExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.cpp index 2362b644583763..21ae249757bf9c 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.cpp @@ -9,11 +9,10 @@ namespace intel_cpu { const std::vector& getInterpolateExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.hpp index 2ed16ea04b1852..a0c1fc240731fb 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/interpolate_list.hpp @@ -5,14 +5,13 @@ #pragma once #include "executor.hpp" - #include "interpolate.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_interpolate.hpp" +# include "acl/acl_interpolate.hpp" #endif -#include "onednn/iml_type_mapper.h" #include "common/primitive_cache.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -27,9 +26,10 @@ const std::vector& getInterpolateExecutorsList(); class InterpolateExecutorFactory : public ExecutorFactoryLegacy { public: InterpolateExecutorFactory(const InterpolateAttrs& InterpolateAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getInterpolateExecutorsList()) { if (desc.builder->isSupported(InterpolateAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -39,9 +39,9 @@ class InterpolateExecutorFactory : public ExecutorFactoryLegacy { ~InterpolateExecutorFactory() = default; virtual InterpolateExecutorPtr makeExecutor(const InterpolateAttrs& interpolateAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { auto build = [&](const InterpolateExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(interpolateAttrs, srcDescs, dstDescs, attr)) { @@ -52,7 +52,6 @@ class InterpolateExecutorFactory : public ExecutorFactoryLegacy { return ptr; }; - if (chosenDesc) { if (auto executor = build(chosenDesc)) { return executor; @@ -81,5 +80,5 @@ class InterpolateExecutorFactory : public ExecutorFactoryLegacy { using InterpolateExecutorFactoryPtr = std::shared_ptr; using InterpolateExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/memory_arguments.hpp b/src/plugins/intel_cpu/src/nodes/executors/memory_arguments.hpp index 7150226d27c601..05c3cf0d5df259 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/memory_arguments.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/memory_arguments.hpp @@ -12,7 +12,7 @@ namespace ov { namespace intel_cpu { using MemoryDescArgs = std::unordered_map; -using MemoryArgs = std::unordered_map; +using MemoryArgs = std::unordered_map; // basic inputs #define ARG_SRC_0 1 diff --git a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_gemm.cpp b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_gemm.cpp index 8fd945b773f262..7e50c8086789a0 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_gemm.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_gemm.cpp @@ -104,8 +104,7 @@ MlasGemmExecutor::MlasGemmExecutor(const FCAttrs& attrs, m_memoryArgs(memory), packedWeights(prepareWeightMemory(memory.at(ARG_WEI), context, !attrs.weightsNonTransposed)), N(batchDim(memory.at(ARG_WEI)->getStaticDims())), - K(memory.at(ARG_WEI)->getStaticDims().back()) -{} + K(memory.at(ARG_WEI)->getStaticDims().back()) {} bool MlasGemmExecutor::update(const MemoryArgs& memory) { const auto& dstDesc = memory.at(ARG_DST)->getDescPtr(); diff --git a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.cpp b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.cpp index 678fe5a5c22176..2b8b71bfbced0b 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.cpp @@ -3,9 +3,10 @@ // #include "mlas_transpose.hpp" -#include "openvino/core/parallel.hpp" -#include "nodes/common/cpu_memcpy.h" + #include "mlas.h" +#include "nodes/common/cpu_memcpy.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -24,7 +25,12 @@ struct has_mlas_transpose : std::true_type {}; template typename std::enable_if::value, void>::type SimpleTransposeSingleAxisOutwards( - const T* input_data, T* output_data, int64_t num_loops, int64_t num_writers, int64_t writes_per_loop, int64_t writes_per_writer_per_loop) { + const T* input_data, + T* output_data, + int64_t num_loops, + int64_t num_writers, + int64_t writes_per_loop, + int64_t writes_per_writer_per_loop) { const T* end; for (int64_t l = 0; l < num_loops; ++l) { T* output_for_first_writer = output_data; @@ -44,9 +50,17 @@ typename std::enable_if::value, void>::type SimpleTranspo template typename std::enable_if::value, void>::type SimpleTransposeSingleAxisOutwards( - const T* input_data, T* output_data, int64_t num_loops, int64_t num_writers, int64_t writes_per_loop, int64_t writes_per_writer_per_loop) { + const T* input_data, + T* output_data, + int64_t num_loops, + int64_t num_writers, + int64_t writes_per_loop, + int64_t writes_per_writer_per_loop) { for (int64_t l = 0; l < num_loops; ++l) { - MlasTranspose(input_data, output_data, static_cast(writes_per_writer_per_loop), static_cast(num_writers)); + MlasTranspose(input_data, + output_data, + static_cast(writes_per_writer_per_loop), + static_cast(num_writers)); input_data += writes_per_loop; output_data += writes_per_loop; } @@ -54,7 +68,12 @@ typename std::enable_if::value, void>::type SimpleTranspos template typename std::enable_if::value, void>::type SimpleTransposeSingleAxisInwards( - const T* input_data, T* output_data, int64_t num_loops, int64_t num_readers, int64_t reads_per_loop, int64_t reads_per_reader_per_loop) { + const T* input_data, + T* output_data, + int64_t num_loops, + int64_t num_readers, + int64_t reads_per_loop, + int64_t reads_per_reader_per_loop) { T* end; for (int64_t l = 0; l < num_loops; ++l) { const T* input_for_first_reader = input_data; @@ -74,9 +93,17 @@ typename std::enable_if::value, void>::type SimpleTranspo template typename std::enable_if::value, void>::type SimpleTransposeSingleAxisInwards( - const T* input_data, T* output_data, int64_t num_loops, int64_t num_readers, int64_t reads_per_loop, int64_t reads_per_reader_per_loop) { + const T* input_data, + T* output_data, + int64_t num_loops, + int64_t num_readers, + int64_t reads_per_loop, + int64_t reads_per_reader_per_loop) { for (int64_t l = 0; l < num_loops; ++l) { - MlasTranspose(input_data, output_data, static_cast(num_readers), static_cast(reads_per_reader_per_loop)); + MlasTranspose(input_data, + output_data, + static_cast(num_readers), + static_cast(reads_per_reader_per_loop)); input_data += reads_per_loop; output_data += reads_per_loop; } @@ -148,7 +175,10 @@ bool MlasTransposeExecutor::IsTransposeMovingSingleAxis(VectorDims permutations, return single_axis_moved; } -void MlasTransposeExecutor::TransposeSingleAxisOutwards(const MemoryCPtr& input, const MemoryPtr& output, size_t from, size_t to) { +void MlasTransposeExecutor::TransposeSingleAxisOutwards(const MemoryCPtr& input, + const MemoryPtr& output, + size_t from, + size_t to) { const auto& input_shape = input->getShape(); const auto& input_dims = input_shape.getDims(); const auto element_size = input->getDesc().getPrecision().size(); @@ -165,52 +195,68 @@ void MlasTransposeExecutor::TransposeSingleAxisOutwards(const MemoryCPtr& input, const size_t bytes_per_write = static_cast(block_size) * element_size; switch (bytes_per_write) { - case (sizeof(uint8_t)): { - SimpleTransposeSingleAxisOutwards(input_data, output_data, num_loops, num_writers, writes_per_loop, - writes_per_writer_per_loop); - break; - } - case (sizeof(uint16_t)): { - SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_writers, - writes_per_loop, writes_per_writer_per_loop); - break; - } - case (sizeof(uint32_t)): { - SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_writers, - writes_per_loop, writes_per_writer_per_loop); - break; - } - case (sizeof(uint64_t)): { - SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_writers, - writes_per_loop, writes_per_writer_per_loop); - break; - } - default: { - // we need to use memcpy for each block - for (int64_t l = 0; l < num_loops; ++l) { - uint8_t* output_for_first_writer = output_data; + case (sizeof(uint8_t)): { + SimpleTransposeSingleAxisOutwards(input_data, + output_data, + num_loops, + num_writers, + writes_per_loop, + writes_per_writer_per_loop); + break; + } + case (sizeof(uint16_t)): { + SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_writers, + writes_per_loop, + writes_per_writer_per_loop); + break; + } + case (sizeof(uint32_t)): { + SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_writers, + writes_per_loop, + writes_per_writer_per_loop); + break; + } + case (sizeof(uint64_t)): { + SimpleTransposeSingleAxisOutwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_writers, + writes_per_loop, + writes_per_writer_per_loop); + break; + } + default: { + // we need to use memcpy for each block + for (int64_t l = 0; l < num_loops; ++l) { + uint8_t* output_for_first_writer = output_data; - for (auto wwpl = 0; wwpl < writes_per_writer_per_loop; ++wwpl) { - uint8_t* output_for_current_writer = output_for_first_writer; + for (auto wwpl = 0; wwpl < writes_per_writer_per_loop; ++wwpl) { + uint8_t* output_for_current_writer = output_for_first_writer; - for (uint64_t w = 0; w < num_writers; ++w) { - memcpy(output_for_current_writer, input_data, bytes_per_write); - // skip to output position for next writer - output_for_current_writer += (writes_per_writer_per_loop * bytes_per_write); - input_data += bytes_per_write; - } - output_for_first_writer += bytes_per_write; + for (uint64_t w = 0; w < num_writers; ++w) { + memcpy(output_for_current_writer, input_data, bytes_per_write); + // skip to output position for next writer + output_for_current_writer += (writes_per_writer_per_loop * bytes_per_write); + input_data += bytes_per_write; } - output_data += writes_per_loop * bytes_per_write; + output_for_first_writer += bytes_per_write; } + output_data += writes_per_loop * bytes_per_write; } } + } } -void MlasTransposeExecutor::TransposeSingleAxisInwards(const MemoryCPtr& input, const MemoryPtr& output, size_t from, size_t to) { +void MlasTransposeExecutor::TransposeSingleAxisInwards(const MemoryCPtr& input, + const MemoryPtr& output, + size_t from, + size_t to) { const auto& input_shape = input->getShape(); const auto& input_dims = input_shape.getDims(); @@ -227,61 +273,74 @@ void MlasTransposeExecutor::TransposeSingleAxisInwards(const MemoryCPtr& input, const size_t bytes_per_read = static_cast(block_size) * element_size; switch (bytes_per_read) { - case (sizeof(uint8_t)): { - SimpleTransposeSingleAxisInwards(input_data, output_data, num_loops, num_readers, reads_per_loop, - reads_per_reader_per_loop); - break; - } - case (sizeof(uint16_t)): { - SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_readers, reads_per_loop, - reads_per_reader_per_loop); - break; - } - case (sizeof(uint32_t)): { - SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_readers, reads_per_loop, - reads_per_reader_per_loop); - break; - } - case (sizeof(uint64_t)): { - SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), - reinterpret_cast(output_data), num_loops, num_readers, reads_per_loop, - reads_per_reader_per_loop); - break; - } - default: { - // we need to use memcpy for each block - for (int64_t l = 0; l < num_loops; ++l) { - const uint8_t* input_for_first_reader = input_data; - for (auto rrpl = 0; rrpl < reads_per_reader_per_loop; ++rrpl) { - const uint8_t* input_for_current_reader = input_for_first_reader; - for (uint64_t r = 0; r < num_readers; ++r) { - memcpy(output_data, input_for_current_reader, bytes_per_read); - output_data += bytes_per_read; - // skip to input position for next reader - input_for_current_reader += (reads_per_reader_per_loop * bytes_per_read); - } - input_for_first_reader += bytes_per_read; + case (sizeof(uint8_t)): { + SimpleTransposeSingleAxisInwards(input_data, + output_data, + num_loops, + num_readers, + reads_per_loop, + reads_per_reader_per_loop); + break; + } + case (sizeof(uint16_t)): { + SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_readers, + reads_per_loop, + reads_per_reader_per_loop); + break; + } + case (sizeof(uint32_t)): { + SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_readers, + reads_per_loop, + reads_per_reader_per_loop); + break; + } + case (sizeof(uint64_t)): { + SimpleTransposeSingleAxisInwards(reinterpret_cast(input_data), + reinterpret_cast(output_data), + num_loops, + num_readers, + reads_per_loop, + reads_per_reader_per_loop); + break; + } + default: { + // we need to use memcpy for each block + for (int64_t l = 0; l < num_loops; ++l) { + const uint8_t* input_for_first_reader = input_data; + for (auto rrpl = 0; rrpl < reads_per_reader_per_loop; ++rrpl) { + const uint8_t* input_for_current_reader = input_for_first_reader; + for (uint64_t r = 0; r < num_readers; ++r) { + memcpy(output_data, input_for_current_reader, bytes_per_read); + output_data += bytes_per_read; + // skip to input position for next reader + input_for_current_reader += (reads_per_reader_per_loop * bytes_per_read); } - input_data += reads_per_loop * bytes_per_read; + input_for_first_reader += bytes_per_read; } + input_data += reads_per_loop * bytes_per_read; } } + } } void MlasTransposeExecutor::exec(const std::vector& src, const std::vector& dst) { if (from > to) { - TransposeSingleAxisOutwards(src[0], dst[0], from, to); + TransposeSingleAxisOutwards(src[0], dst[0], from, to); } else { - TransposeSingleAxisInwards(src[0], dst[0], from, to); + TransposeSingleAxisInwards(src[0], dst[0], from, to); } } -bool MlasTransposeExecutor::init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) { +bool MlasTransposeExecutor::init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { if (!IsTransposeMovingSingleAxis(transposeParams.permuteParams.order, from, to)) { DEBUG_LOG("MLAS Transpose executor supports moving single axis only"); return false; @@ -292,8 +351,7 @@ bool MlasTransposeExecutor::init(const TransposeParams &transposeParams, bool MlasTransposeExecutorBuilder::isSupported(const TransposeParams& transposeParams, const std::vector& srcDescs, const std::vector& dstDescs) const { - if (!srcDescs[0]->hasLayoutType(LayoutType::ncsp) || - !dstDescs[0]->hasLayoutType(LayoutType::ncsp)) { + if (!srcDescs[0]->hasLayoutType(LayoutType::ncsp) || !dstDescs[0]->hasLayoutType(LayoutType::ncsp)) { DEBUG_LOG("MLAS Transpose executor supports NCHW layout only"); return false; } @@ -308,5 +366,5 @@ TransposeExecutorPtr MlasTransposeExecutorBuilder::makeExecutor(const ExecutorCo return std::make_shared(context); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.hpp b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.hpp index d7e0307414aac9..8f7cd1bf8c22bd 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mlas/mlas_transpose.hpp @@ -11,13 +11,16 @@ namespace intel_cpu { class MlasTransposeExecutor : public TransposeExecutor { public: using TransposeExecutor::TransposeExecutor; - bool init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, - const dnnl::primitive_attr &attr) override; - void exec(const std::vector &src, const std::vector &dst) override; + bool init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) override; + void exec(const std::vector& src, const std::vector& dst) override; + + impl_desc_type implType() const override { + return impl_desc_type::mlas; + } - impl_desc_type implType() const override { return impl_desc_type::mlas; } private: static int64_t calcShapeSize(const Shape& shape, size_t start, size_t end); static bool IsTransposeMovingSingleAxis(VectorDims permutations, size_t& from, size_t& to); @@ -37,5 +40,5 @@ class MlasTransposeExecutorBuilder : public TransposeExecutorBuilder { TransposeExecutorPtr makeExecutor(const ExecutorContext::CPtr context) const override; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/mvn.cpp b/src/plugins/intel_cpu/src/nodes/executors/mvn.cpp index 9b522ed9887344..eec9d2a8947975 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mvn.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mvn.cpp @@ -11,26 +11,34 @@ MVNExecutor::MVNExecutor(const ExecutorContext::CPtr context) : context(context) VectorDims MVNExecutor::transformTo5DCase(const VectorDims& shape, bool initAcrossChannels) { switch (shape.size()) { - // for 1 and 2 rank, if initAcrossChannels_ is true, adjust shape to fully vectorize under unified 5d procedure. - // otherwise there are not enough data in spatial dimension to process in one kernel. - case 1 : // C - if (initAcrossChannels) { - return VectorDims({1, 1, 1, 1, shape[0]}); - } else { - return VectorDims({1, shape[0], 1, 1, 1}); - } - case 2 : // NC - if (initAcrossChannels) { - return VectorDims({1, shape[0], 1, shape[1], 1}); - } else { - return VectorDims({shape[0], shape[1], 1, 1, 1}); - } - case 3 : { return VectorDims({shape[0], shape[1], 1, shape[2], 1}); } - case 4 : { return VectorDims({shape[0], shape[1], 1, shape[2], shape[3]}); } - case 5 : { return VectorDims({shape[0], shape[1], shape[2], shape[3], shape[4]}); } - default : { OPENVINO_THROW("MVN executor doesn't support planar layout with rank: ", shape.size()); } + // for 1 and 2 rank, if initAcrossChannels_ is true, adjust shape to fully vectorize under unified 5d procedure. + // otherwise there are not enough data in spatial dimension to process in one kernel. + case 1: // C + if (initAcrossChannels) { + return VectorDims({1, 1, 1, 1, shape[0]}); + } else { + return VectorDims({1, shape[0], 1, 1, 1}); + } + case 2: // NC + if (initAcrossChannels) { + return VectorDims({1, shape[0], 1, shape[1], 1}); + } else { + return VectorDims({shape[0], shape[1], 1, 1, 1}); + } + case 3: { + return VectorDims({shape[0], shape[1], 1, shape[2], 1}); + } + case 4: { + return VectorDims({shape[0], shape[1], 1, shape[2], shape[3]}); + } + case 5: { + return VectorDims({shape[0], shape[1], shape[2], shape[3], shape[4]}); + } + default: { + OPENVINO_THROW("MVN executor doesn't support planar layout with rank: ", shape.size()); + } } } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/mvn.hpp b/src/plugins/intel_cpu/src/nodes/executors/mvn.hpp index 759115a4b4b794..da51b5d1ef67e9 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mvn.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mvn.hpp @@ -5,29 +5,22 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "executor.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { -enum MVNLayoutType { - mvn_planar, - mvn_block, - mvn_by_channel -}; +enum MVNLayoutType { mvn_planar, mvn_block, mvn_by_channel }; // Defines way to add epsilon: inside sqrt or outside. -enum MVNEpsMode { - INSIDE_SQRT, - OUTSIDE_SQRT -}; +enum MVNEpsMode { INSIDE_SQRT, OUTSIDE_SQRT }; struct MVNAttrs { MVNLayoutType layout = mvn_planar; bool initAcrossChannels_ = false; bool execAcrossChannels_ = false; - bool normalizeVariance_ = false; + bool normalizeVariance_ = false; float epsValue_ = 0.0f; MVNEpsMode epsMode_ = INSIDE_SQRT; ov::element::Type src_prc; @@ -40,9 +33,11 @@ class MVNExecutor { virtual bool init(const MVNAttrs& mvnAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; - virtual void exec(const std::vector& src, const std::vector& dst, const void *post_ops_data_) = 0; + virtual void exec(const std::vector& src, + const std::vector& dst, + const void* post_ops_data_) = 0; virtual ~MVNExecutor() = default; virtual impl_desc_type getImplType() const = 0; @@ -60,12 +55,14 @@ using MVNExecutorCPtr = std::shared_ptr; class MVNExecutorBuilder { public: ~MVNExecutorBuilder() = default; - virtual bool isSupported(const MVNAttrs& mvnAttrs, const std::vector& srcDescs, const std::vector& dstDescs) const = 0; + virtual bool isSupported(const MVNAttrs& mvnAttrs, + const std::vector& srcDescs, + const std::vector& dstDescs) const = 0; virtual MVNExecutorPtr makeExecutor(const ExecutorContext::CPtr context) const = 0; }; using MVNExecutorBuilderPtr = std::shared_ptr; using MVNExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/mvn_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/mvn_list.cpp index c27751b7a2d2b4..99a55d79f58177 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mvn_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mvn_list.cpp @@ -9,11 +9,10 @@ namespace intel_cpu { const std::vector& getMVNExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/mvn_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/mvn_list.hpp index 3a8d3cc61fe585..82f8e868ac2d81 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/mvn_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/mvn_list.hpp @@ -5,14 +5,13 @@ #pragma once #include "executor.hpp" - #include "mvn.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_mvn.hpp" +# include "acl/acl_mvn.hpp" #endif -#include "onednn/iml_type_mapper.h" #include "common/primitive_cache.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -29,7 +28,8 @@ class MVNExecutorFactory : public ExecutorFactoryLegacy { MVNExecutorFactory(const MVNAttrs& mvnAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getMVNExecutorsList()) { if (desc.builder->isSupported(mvnAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -41,7 +41,7 @@ class MVNExecutorFactory : public ExecutorFactoryLegacy { virtual MVNExecutorPtr makeExecutor(const MVNAttrs& mvnAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const dnnl::primitive_attr& attr) { auto build = [&](const MVNExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(mvnAttrs, srcDescs, dstDescs, attr)) { @@ -80,5 +80,5 @@ class MVNExecutorFactory : public ExecutorFactoryLegacy { using MVNExecutorFactoryPtr = std::shared_ptr; using MVNExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/pooling.cpp b/src/plugins/intel_cpu/src/nodes/executors/pooling.cpp index e15d1a4ef15b8d..95448640e3b125 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/pooling.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/pooling.cpp @@ -9,5 +9,5 @@ namespace intel_cpu { PoolingExecutor::PoolingExecutor(const ExecutorContext::CPtr context) : context(context) {} -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/pooling.hpp b/src/plugins/intel_cpu/src/nodes/executors/pooling.hpp index 5ea358c68afc8e..e826d3a37250db 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/pooling.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/pooling.hpp @@ -5,8 +5,8 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "executor.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -44,9 +44,11 @@ class PoolingExecutor { virtual bool init(const PoolingAttrs& poolingAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; - virtual void exec(const std::vector& src, const std::vector& dst, std::unordered_map postOpsArgs) = 0; + virtual void exec(const std::vector& src, + const std::vector& dst, + std::unordered_map postOpsArgs) = 0; virtual ~PoolingExecutor() = default; virtual impl_desc_type getImplType() const = 0; @@ -71,5 +73,5 @@ class PoolingExecutorBuilder { using PoolingExecutorBuilderPtr = std::shared_ptr; using PoolingExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/pooling_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/pooling_list.cpp index 4b130f37bfff57..d0ee9f7da574c6 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/pooling_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/pooling_list.cpp @@ -9,11 +9,10 @@ namespace intel_cpu { const std::vector& getPoolingExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/pooling_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/pooling_list.hpp index d6ce5489105b19..1c051ae7d2959d 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/pooling_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/pooling_list.hpp @@ -5,10 +5,9 @@ #pragma once #include "executor.hpp" - #include "pooling.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_pooling.hpp" +# include "acl/acl_pooling.hpp" #endif namespace ov { @@ -24,9 +23,10 @@ const std::vector& getPoolingExecutorsList(); class PoolingExecutorFactory : public ExecutorFactoryLegacy { public: PoolingExecutorFactory(const PoolingAttrs& poolingAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getPoolingExecutorsList()) { if (desc.builder->isSupported(poolingAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -36,9 +36,9 @@ class PoolingExecutorFactory : public ExecutorFactoryLegacy { ~PoolingExecutorFactory() = default; virtual PoolingExecutorPtr makeExecutor(const PoolingAttrs& poolingAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { auto build = [&](const PoolingExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(poolingAttrs, srcDescs, dstDescs, attr)) { @@ -49,7 +49,6 @@ class PoolingExecutorFactory : public ExecutorFactoryLegacy { return ptr; }; - if (chosenDesc) { if (auto executor = build(chosenDesc)) { return executor; @@ -74,5 +73,5 @@ class PoolingExecutorFactory : public ExecutorFactoryLegacy { using PoolingExecutorFactoryPtr = std::shared_ptr; using PoolingExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/precision_matcher.cpp b/src/plugins/intel_cpu/src/nodes/executors/precision_matcher.cpp index 95044a9e205595..ced50dd2ec3dd5 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/precision_matcher.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/precision_matcher.cpp @@ -15,9 +15,12 @@ namespace intel_cpu { bool match(const InOutTypeMask& patterns, const InOutTypes& values) { assert(patterns.size() == values.size()); - return std::equal(values.begin(), values.end(), patterns.begin(), [](const ov::element::Type value, const TypeMask pattern) { - return pattern & value; - }); + return std::equal(values.begin(), + values.end(), + patterns.begin(), + [](const ov::element::Type value, const TypeMask pattern) { + return pattern & value; + }); return true; } diff --git a/src/plugins/intel_cpu/src/nodes/executors/precision_translation.cpp b/src/plugins/intel_cpu/src/nodes/executors/precision_translation.cpp index 73aac151843b08..36aab4f8fddc77 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/precision_translation.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/precision_translation.cpp @@ -14,7 +14,9 @@ namespace ov { namespace intel_cpu { -InOutTypes getTypeConfiguration(const MemoryDescArgs& descriptors, const TypeMapping& mapping, const MappingNotation& notation) { +InOutTypes getTypeConfiguration(const MemoryDescArgs& descriptors, + const TypeMapping& mapping, + const MappingNotation& notation) { InOutTypes types; std::transform(notation.begin(), notation.end(), std::back_inserter(types), [&descriptors](int id) { return descriptors.at(id)->getPrecision(); diff --git a/src/plugins/intel_cpu/src/nodes/executors/precision_translation.hpp b/src/plugins/intel_cpu/src/nodes/executors/precision_translation.hpp index 374b584dd0ffb5..20e613eea2c236 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/precision_translation.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/precision_translation.hpp @@ -18,24 +18,21 @@ namespace intel_cpu { template struct use { - ov::element::Type operator()(const std::vector& types, - size_t idx) const { + ov::element::Type operator()(const std::vector& types, size_t idx) const { assert(bypassId < types.size()); return types[bypassId]; } }; struct bypass { - ov::element::Type operator()(const std::vector& types, - size_t idx) const { + ov::element::Type operator()(const std::vector& types, size_t idx) const { return types[idx]; } }; template struct just { - ov::element::Type operator()(const std::vector& types, - size_t idx) const { + ov::element::Type operator()(const std::vector& types, size_t idx) const { // ignore everything (void)types; (void)idx; @@ -45,8 +42,7 @@ struct just { template <> struct just { - ov::element::Type operator()(const std::vector& types, - size_t idx) const { + ov::element::Type operator()(const std::vector& types, size_t idx) const { // ignore everything (void)types; (void)idx; @@ -58,11 +54,9 @@ using policy = std::function - PortsTranslation(Policies... policies) : - m_policies{policies...} {} + PortsTranslation(Policies... policies) : m_policies{policies...} {} - std::vector operator()( - const std::vector& types) const { + std::vector operator()(const std::vector& types) const { assert(types.size() == m_policies.size()); std::vector result; @@ -73,6 +67,7 @@ struct PortsTranslation { return result; } + private: std::vector m_policies; }; @@ -88,9 +83,7 @@ class TypeMappingEntry { public: using EnabledPredicate = std::function; - TypeMappingEntry(InOutTypeMask mask, - TypeTranslationFunction translation, - EnabledPredicate enabled = {}) + TypeMappingEntry(InOutTypeMask mask, TypeTranslationFunction translation, EnabledPredicate enabled = {}) : m_mask(std::move(mask)), m_translation(std::move(translation)), m_enabled(std::move(enabled)) {} @@ -121,7 +114,9 @@ using TypeMapping = std::vector; using MappingNotation = std::vector; using pt = PortsTranslation; -InOutTypes getTypeConfiguration(const MemoryDescArgs& descriptors, const TypeMapping& mapping, const MappingNotation& notation); +InOutTypes getTypeConfiguration(const MemoryDescArgs& descriptors, + const TypeMapping& mapping, + const MappingNotation& notation); } // namespace intel_cpu } // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/printers.cpp b/src/plugins/intel_cpu/src/nodes/executors/printers.cpp index ac52b25a069541..1bce932225827d 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/printers.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/printers.cpp @@ -4,25 +4,27 @@ #ifdef CPU_DEBUG_CAPS -#include -#include "printers.hpp" -#include "post_ops.hpp" -#include "fullyconnected_config.hpp" +# include "printers.hpp" + +# include + +# include "fullyconnected_config.hpp" +# include "post_ops.hpp" namespace ov { namespace intel_cpu { -std::ostream & operator<<(std::ostream & os, const FCAttrs& attrs) { +std::ostream& operator<<(std::ostream& os, const FCAttrs& attrs) { // @todo print Attrs return os; } -std::ostream & operator<<(std::ostream & os, const PostOps& postOps) { +std::ostream& operator<<(std::ostream& os, const PostOps& postOps) { // @todo print PostOps return os; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov -#endif // CPU_DEBUG_CAPS +#endif // CPU_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/nodes/executors/printers.hpp b/src/plugins/intel_cpu/src/nodes/executors/printers.hpp index d37ab633ba8036..7a96550b3f225c 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/printers.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/printers.hpp @@ -3,25 +3,27 @@ // #ifdef CPU_DEBUG_CAPS -#pragma once +# pragma once -#include -#include "executor_config.hpp" +# include + +# include "executor_config.hpp" namespace ov { namespace intel_cpu { namespace executor { -template struct Config; +template +struct Config; } struct FCAttrs; -std::ostream & operator<<(std::ostream & os, const FCAttrs& attrs); -std::ostream & operator<<(std::ostream & os, const PostOps& postOps); +std::ostream& operator<<(std::ostream& os, const FCAttrs& attrs); +std::ostream& operator<<(std::ostream& os, const PostOps& postOps); -template -std::ostream & operator<<(std::ostream & os, const executor::Config& config) { +template +std::ostream& operator<<(std::ostream& os, const executor::Config& config) { for (const auto& desc : config.descs) { const auto id = desc.first; const auto descPtr = desc.second; @@ -34,7 +36,7 @@ std::ostream & operator<<(std::ostream & os, const executor::Config& conf return os; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov -#endif // CPU_DEBUG_CAPS +#endif // CPU_DEBUG_CAPS diff --git a/src/plugins/intel_cpu/src/nodes/executors/reduce.cpp b/src/plugins/intel_cpu/src/nodes/executors/reduce.cpp index 8e091f0282eb5d..6039813d8fdd28 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/reduce.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/reduce.cpp @@ -9,5 +9,5 @@ namespace intel_cpu { ReduceExecutor::ReduceExecutor(const ExecutorContext::CPtr context) : context(context) {} -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/reduce.hpp b/src/plugins/intel_cpu/src/nodes/executors/reduce.hpp index 8aa6e8f0aaa4ac..21b730a197df3a 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/reduce.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/reduce.hpp @@ -5,9 +5,9 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "dnnl_scratch_pad.h" #include "executor.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -24,9 +24,11 @@ class ReduceExecutor { virtual bool init(const ReduceAttrs& reduceAttrs, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; - virtual void exec(const std::vector& src, const std::vector& dst, const void *post_ops_data_) = 0; + virtual void exec(const std::vector& src, + const std::vector& dst, + const void* post_ops_data_) = 0; virtual ~ReduceExecutor() = default; virtual impl_desc_type getImplType() const = 0; @@ -51,5 +53,5 @@ class ReduceExecutorBuilder { using ReduceExecutorBuilderPtr = std::shared_ptr; using ReduceExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/reduce_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/reduce_list.cpp index aec5c7eb905865..e6f035879a2cc6 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/reduce_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/reduce_list.cpp @@ -9,11 +9,10 @@ namespace intel_cpu { const std::vector& getReduceExecutorsList() { static std::vector descs = { - OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - }; + OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared())}; return descs; } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/reduce_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/reduce_list.hpp index ea2543a495e64c..faffdebc947c02 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/reduce_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/reduce_list.hpp @@ -5,14 +5,13 @@ #pragma once #include "executor.hpp" - #include "reduce.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_reduce.hpp" +# include "acl/acl_reduce.hpp" #endif -#include "onednn/iml_type_mapper.h" #include "common/primitive_cache.hpp" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -27,9 +26,10 @@ const std::vector& getReduceExecutorsList(); class ReduceExecutorFactory : public ExecutorFactoryLegacy { public: ReduceExecutorFactory(const ReduceAttrs& reduceAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { for (auto& desc : getReduceExecutorsList()) { if (desc.builder->isSupported(reduceAttrs, srcDescs, dstDescs)) { supportedDescs.push_back(desc); @@ -39,9 +39,9 @@ class ReduceExecutorFactory : public ExecutorFactoryLegacy { ~ReduceExecutorFactory() = default; virtual ReduceExecutorPtr makeExecutor(const ReduceAttrs& reduceAttrs, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { auto build = [&](const ReduceExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(reduceAttrs, srcDescs, dstDescs, attr)) { @@ -52,7 +52,6 @@ class ReduceExecutorFactory : public ExecutorFactoryLegacy { return ptr; }; - if (chosenDesc) { if (auto executor = build(chosenDesc)) { return executor; @@ -81,5 +80,5 @@ class ReduceExecutorFactory : public ExecutorFactoryLegacy { using ReduceExecutorFactoryPtr = std::shared_ptr; using ReduceExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/transpose.cpp b/src/plugins/intel_cpu/src/nodes/executors/transpose.cpp index 57e2e028827a62..b63e32e39ebf8d 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/transpose.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/transpose.cpp @@ -2,9 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "transpose.hpp" + #include + #include "openvino/core/parallel.hpp" -#include "transpose.hpp" namespace ov { namespace intel_cpu { @@ -33,27 +35,27 @@ jit_permute_config_params TransposeExecutor::prepareParams(const PermuteParams& } for (int i = tmp_order.size() - 1; i >= 0; i--) { - int pos = std::distance(std::find( - src_block_order.rbegin(), src_block_order.rend(), tmp_order[i]), src_block_order.rend() - 1); + int pos = std::distance(std::find(src_block_order.rbegin(), src_block_order.rend(), tmp_order[i]), + src_block_order.rend() - 1); if (pos != -1) { new_src_block_strides[i] = src_block_strides[pos]; src_block_order.erase(src_block_order.begin() + pos); src_block_strides.erase(src_block_strides.begin() + pos); mask[i] = 0; } else { - new_src_block_strides[i] = new_src_block_strides[tmp_order.size() - 1] * params.dst_block_dims[tmp_order.size() - 1]; + new_src_block_strides[i] = + new_src_block_strides[tmp_order.size() - 1] * params.dst_block_dims[tmp_order.size() - 1]; mask[i] = 1; mask[tmp_order.size() - 1] = 1; } } if (!src_block_order.empty()) { int pos = std::distance(tmp_order.begin(), std::find(tmp_order.begin(), tmp_order.end(), src_block_order[0])); - new_src_block_strides.insert(new_src_block_strides.begin() + pos, - src_block_strides[0]); - new_dst_block_strides.insert(new_dst_block_strides.begin() + pos, - new_dst_block_strides[pos] * params.src_block_dims[params.src_block_dims.size() - 1]); - new_dst_block_order.insert(new_dst_block_order.begin() + pos, - new_dst_block_order[pos]); + new_src_block_strides.insert(new_src_block_strides.begin() + pos, src_block_strides[0]); + new_dst_block_strides.insert( + new_dst_block_strides.begin() + pos, + new_dst_block_strides[pos] * params.src_block_dims[params.src_block_dims.size() - 1]); + new_dst_block_order.insert(new_dst_block_order.begin() + pos, new_dst_block_order[pos]); new_dst_block_dims.insert(new_dst_block_dims.begin() + pos + 1, params.src_block_dims[params.src_block_dims.size() - 1]); new_dst_block_dims[pos] = div_up(new_dst_block_dims[pos], new_dst_block_dims[pos + 1]); @@ -107,12 +109,12 @@ jit_permute_config_params TransposeExecutor::prepareParams(const PermuteParams& } int max_threads = parallel_get_max_threads(); - const int n_max = 3; // max count dims for parallel + const int n_max = 3; // max count dims for parallel int n = 0; int work_amount = sorted_dst_dims[0]; for (size_t i = 1; i < sorted_dst_dims.size() && n < n_max; i++) { n++; - if (work_amount >= 4 * max_threads) { // 4 * max_threads is a specially selected value for best performance + if (work_amount >= 4 * max_threads) { // 4 * max_threads is a specially selected value for best performance break; } work_amount *= sorted_dst_dims[i]; @@ -128,5 +130,5 @@ jit_permute_config_params TransposeExecutor::prepareParams(const PermuteParams& return jcp; } -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/executors/transpose.hpp b/src/plugins/intel_cpu/src/nodes/executors/transpose.hpp index 15f2d5085cd5ad..99e0b0a2742a78 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/transpose.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/transpose.hpp @@ -5,9 +5,9 @@ #pragma once #include "cpu_memory.h" -#include "onednn/iml_type_mapper.h" #include "executor.hpp" #include "nodes/common/permute_kernel.h" +#include "onednn/iml_type_mapper.h" namespace ov { namespace intel_cpu { @@ -23,8 +23,9 @@ class TransposeExecutor : public Executor { virtual bool init(const TransposeParams& transposeParams, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) = 0; + const dnnl::primitive_attr& attr) = 0; virtual ~TransposeExecutor() = default; + protected: PermuteParams permuteParams; const ExecutorContext::CPtr context; @@ -44,5 +45,5 @@ class TransposeExecutorBuilder { using TransposeExecutorBuilderPtr = std::shared_ptr; using TransposeExecutorBuilderCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/transpose_list.cpp b/src/plugins/intel_cpu/src/nodes/executors/transpose_list.cpp index 31db070d04ffe3..f0e72f4bec1ae2 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/transpose_list.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/transpose_list.cpp @@ -9,20 +9,19 @@ namespace intel_cpu { const std::vector& getTransposeExecutorsList() { static const std::vector descs = { - OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared()) + OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared()) OV_CPU_INSTANCE_ACL(ExecutorType::Acl, std::make_shared()) - OV_CPU_INSTANCE_MLAS_ARM64(ExecutorType::Mlas, std::make_shared()) - OV_CPU_INSTANCE_X64(ExecutorType::jit_x64, std::make_shared()) - OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared()) - }; + OV_CPU_INSTANCE_MLAS_ARM64(ExecutorType::Mlas, std::make_shared()) + OV_CPU_INSTANCE_X64(ExecutorType::jit_x64, std::make_shared()) + OV_CPU_INSTANCE_COMMON(ExecutorType::Common, std::make_shared())}; return descs; } TransposeExecutorPtr TransposeExecutorFactory::makeExecutor(const TransposeParams& transposeParams, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr) { + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { auto build = [&](const TransposeExecutorDesc* desc) { auto executor = desc->builder->makeExecutor(context); if (executor->init(transposeParams, srcDescs, dstDescs, attr)) { @@ -48,5 +47,5 @@ TransposeExecutorPtr TransposeExecutorFactory::makeExecutor(const TransposeParam OPENVINO_THROW("Supported executor is not found"); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/transpose_list.hpp b/src/plugins/intel_cpu/src/nodes/executors/transpose_list.hpp index 90141a6194592e..c81769fd1d0539 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/transpose_list.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/transpose_list.hpp @@ -5,19 +5,17 @@ #pragma once #include "executor.hpp" - #include "transpose.hpp" #if defined(OV_CPU_WITH_ACL) -#include "acl/acl_transpose.hpp" +# include "acl/acl_transpose.hpp" #endif +#include "common/primitive_cache.hpp" #include "common/ref_opt_transpose.hpp" #include "common/ref_transpose.hpp" #include "mlas/mlas_transpose.hpp" -#include "x64/jit_transpose.hpp" - #include "onednn/iml_type_mapper.h" -#include "common/primitive_cache.hpp" +#include "x64/jit_transpose.hpp" namespace ov { namespace intel_cpu { @@ -31,22 +29,23 @@ const std::vector& getTransposeExecutorsList(); class TransposeExecutorFactory : public ExecutorFactoryLegacy { public: -TransposeExecutorFactory(const TransposeParams& transposeParams, - const std::vector& srcDescs, - const std::vector& dstDescs, - const ExecutorContext::CPtr context) : ExecutorFactoryLegacy(context) { - for (auto& desc : getTransposeExecutorsList()) { - if (desc.builder->isSupported(transposeParams, srcDescs, dstDescs)) { - supportedDescs.push_back(desc); + TransposeExecutorFactory(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const ExecutorContext::CPtr context) + : ExecutorFactoryLegacy(context) { + for (auto& desc : getTransposeExecutorsList()) { + if (desc.builder->isSupported(transposeParams, srcDescs, dstDescs)) { + supportedDescs.push_back(desc); + } } } -} -~TransposeExecutorFactory() = default; -virtual TransposeExecutorPtr makeExecutor(const TransposeParams& transposeParams, - const std::vector& srcDescs, - const std::vector& dstDescs, - const dnnl::primitive_attr &attr); + ~TransposeExecutorFactory() = default; + virtual TransposeExecutorPtr makeExecutor(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr); private: std::vector supportedDescs; @@ -56,5 +55,5 @@ virtual TransposeExecutorPtr makeExecutor(const TransposeParams& transposeParams using TransposeExecutorFactoryPtr = std::shared_ptr; using TransposeExecutorFactoryCPtr = std::shared_ptr; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/type_mask.hpp b/src/plugins/intel_cpu/src/nodes/executors/type_mask.hpp index d492bd6b6f368a..ef9fdac7f19208 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/type_mask.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/type_mask.hpp @@ -14,29 +14,29 @@ namespace intel_cpu { struct TypeMask { enum Value : uint64_t { _undefined = 1 << 0, - _dynamic = 1 << 1, - _boolean = 1 << 2, - _bf16 = 1 << 3, - _f16 = 1 << 4, - _f32 = 1 << 5, - _f64 = 1 << 6, - _i4 = 1 << 7, - _i8 = 1 << 8, - _i16 = 1 << 9, - _i32 = 1 << 10, - _i64 = 1 << 11, - _u1 = 1 << 12, - _u4 = 1 << 13, - _u8 = 1 << 14, - _u16 = 1 << 15, - _u32 = 1 << 16, - _u64 = 1 << 17, - _nf4 = 1 << 18, - _f8e4m3 = 1 << 19, - _f8e5m2 = 1 << 20, - _string = 1 << 21, - _f4e2m1 = 1 << 22, - _f8e8m0 = 1 << 23, + _dynamic = 1 << 1, + _boolean = 1 << 2, + _bf16 = 1 << 3, + _f16 = 1 << 4, + _f32 = 1 << 5, + _f64 = 1 << 6, + _i4 = 1 << 7, + _i8 = 1 << 8, + _i16 = 1 << 9, + _i32 = 1 << 10, + _i64 = 1 << 11, + _u1 = 1 << 12, + _u4 = 1 << 13, + _u8 = 1 << 14, + _u16 = 1 << 15, + _u32 = 1 << 16, + _u64 = 1 << 17, + _nf4 = 1 << 18, + _f8e4m3 = 1 << 19, + _f8e5m2 = 1 << 20, + _string = 1 << 21, + _f4e2m1 = 1 << 22, + _f8e8m0 = 1 << 23, }; TypeMask(const ov::element::Type precision) : value(generateMask(precision)), precision(precision) {} diff --git a/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.cpp b/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.cpp index bfcc7ad4ae672a..79c578aaacda61 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.cpp +++ b/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.cpp @@ -3,6 +3,7 @@ // #include "jit_transpose.hpp" + #include "cpu/x64/cpu_isa_traits.hpp" using namespace dnnl::impl::cpu; @@ -21,9 +22,10 @@ void JitTransposeExecutor::exec(const std::vector& src, const std::v pKernel->execute(srcData, dstData, MB); } -bool JitTransposeExecutor::init(const TransposeParams &transposeParams, - const std::vector &srcDescs, - const std::vector &dstDescs, const dnnl::primitive_attr &attr) { +bool JitTransposeExecutor::init(const TransposeParams& transposeParams, + const std::vector& srcDescs, + const std::vector& dstDescs, + const dnnl::primitive_attr& attr) { pKernel = std::make_shared(transposeParams.permuteParams); return true; } @@ -35,9 +37,9 @@ bool JitTransposeExecutorBuilder::isSupported(const TransposeParams& transposePa if (mayiuse(x64::sse41)) { return true; } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 return false; } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.hpp b/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.hpp index d37ac9e5db5ef5..fd6d54257f1489 100644 --- a/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.hpp +++ b/src/plugins/intel_cpu/src/nodes/executors/x64/jit_transpose.hpp @@ -16,9 +16,12 @@ class JitTransposeExecutor : public TransposeExecutor { bool init(const TransposeParams& transposeParams, const std::vector& srcDescs, const std::vector& dstDescs, - const dnnl::primitive_attr &attr) override; + const dnnl::primitive_attr& attr) override; void exec(const std::vector& src, const std::vector& dst) override; - impl_desc_type implType() const override { return impl_desc_type::jit; } + impl_desc_type implType() const override { + return impl_desc_type::jit; + } + private: std::shared_ptr pKernel; }; @@ -33,5 +36,5 @@ class JitTransposeExecutorBuilder : public TransposeExecutorBuilder { } }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.cpp b/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.cpp index 441e013af2cbbf..dc58aabe26635d 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.cpp +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.cpp @@ -2,12 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/experimental_detectron_detection_output.hpp" + #include #include -#include "openvino/op/experimental_detectron_detection_output.hpp" -#include "openvino/core/parallel.hpp" #include "experimental_detectron_detection_output.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -36,13 +37,19 @@ struct Indexer { } }; -static -void refine_boxes(const float* boxes, const float* deltas, const float* weights, const float* scores, - float* refined_boxes, float* refined_boxes_areas, float* refined_scores, - const int rois_num, const int classes_num, - const float img_H, const float img_W, - const float max_delta_log_wh, - float coordinates_offset) { +static void refine_boxes(const float* boxes, + const float* deltas, + const float* weights, + const float* scores, + float* refined_boxes, + float* refined_boxes_areas, + float* refined_scores, + const int rois_num, + const int classes_num, + const float img_H, + const float img_W, + const float max_delta_log_wh, + float coordinates_offset) { Indexer box_idx({rois_num, 4}); Indexer delta_idx({rois_num, classes_num, 4}); Indexer score_idx({rois_num, classes_num}); @@ -114,21 +121,22 @@ static bool SortScorePairDescend(const std::pair>& pa return (pair1.first > pair2.first) || ((pair1.first == pair2.first) && (pair1.second.second < pair2.second.second)); } - struct ConfidenceComparator { explicit ConfidenceComparator(const float* conf_data) : _conf_data(conf_data) {} bool operator()(int idx1, int idx2) { - if (_conf_data[idx1] > _conf_data[idx2]) return true; - if (_conf_data[idx1] < _conf_data[idx2]) return false; + if (_conf_data[idx1] > _conf_data[idx2]) + return true; + if (_conf_data[idx1] < _conf_data[idx2]) + return false; return idx1 < idx2; } const float* _conf_data; }; -static inline float JaccardOverlap(const float *decoded_bbox, - const float *bbox_sizes, +static inline float JaccardOverlap(const float* decoded_bbox, + const float* bbox_sizes, const int idx1, const int idx2, const float coordinates_offset = 1) { @@ -151,7 +159,7 @@ static inline float JaccardOverlap(const float *decoded_bbox, float intersect_xmax = (std::min)(xmax1, xmax2); float intersect_ymax = (std::min)(ymax1, ymax2); - float intersect_width = intersect_xmax - intersect_xmin + coordinates_offset; + float intersect_width = intersect_xmax - intersect_xmin + coordinates_offset; float intersect_height = intersect_ymax - intersect_ymin + coordinates_offset; if (intersect_width <= 0 || intersect_height <= 0) { @@ -165,7 +173,6 @@ static inline float JaccardOverlap(const float *decoded_bbox, return intersect_size / (bbox1_size + bbox2_size - intersect_size); } - static void nms_cf(const float* conf_data, const float* bboxes, const float* sizes, @@ -187,8 +194,10 @@ static void nms_cf(const float* conf_data, int num_output_scores = (pre_nms_topn == -1 ? count : (std::min)(pre_nms_topn, count)); - std::partial_sort_copy(indices, indices + count, - buffer, buffer + num_output_scores, + std::partial_sort_copy(indices, + indices + count, + buffer, + buffer + num_output_scores, ConfidenceComparator(conf_data)); detections = 0; @@ -221,11 +230,13 @@ bool ExperimentalDetectronDetectionOutput::needPrepareParams() const { return false; } -bool ExperimentalDetectronDetectionOutput::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool ExperimentalDetectronDetectionOutput::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto doOp = ov::as_type_ptr(op); if (!doOp) { - errorMessage = "Node is not an instance of the ExperimentalDetectronDetectionOutput from the operations set v6."; + errorMessage = + "Node is not an instance of the ExperimentalDetectronDetectionOutput from the operations set v6."; return false; } } catch (...) { @@ -294,10 +305,17 @@ void ExperimentalDetectronDetectionOutput::execute(dnnl::stream strm) { Indexer refined_box_idx({classes_num_, rois_num, 4}); Indexer refined_score_idx({classes_num_, rois_num}); - refine_boxes(boxes, deltas, &deltas_weights_[0], scores, - &refined_boxes[0], &refined_boxes_areas[0], &refined_scores[0], - rois_num, classes_num_, - img_H, img_W, + refine_boxes(boxes, + deltas, + &deltas_weights_[0], + scores, + &refined_boxes[0], + &refined_boxes_areas[0], + &refined_scores[0], + rois_num, + classes_num_, + img_H, + img_W, max_delta_log_wh_, 1.0f); @@ -353,7 +371,7 @@ void ExperimentalDetectronDetectionOutput::execute(dnnl::stream strm) { memset(output_classes, 0, max_detections_per_image_ * sizeof(output_classes[0])); int i = 0; - for (const auto & detection : conf_index_class_map) { + for (const auto& detection : conf_index_class_map) { float score = detection.first; int cls = detection.second.first; int idx = detection.second.second; @@ -371,6 +389,6 @@ bool ExperimentalDetectronDetectionOutput::created() const { return getType() == Type::ExperimentalDetectronDetectionOutput; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.h b/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.h index 2f76f1004face5..206f807585de7d 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.h +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_detection_output.h @@ -14,25 +14,27 @@ class ExperimentalDetectronDetectionOutput : public Node { public: ExperimentalDetectronDetectionOutput(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; bool needShapeInfer() const override; bool needPrepareParams() const override; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; private: - const int INPUT_ROIS {0}; - const int INPUT_DELTAS {1}; - const int INPUT_SCORES {2}; - const int INPUT_IM_INFO {3}; + const int INPUT_ROIS{0}; + const int INPUT_DELTAS{1}; + const int INPUT_SCORES{2}; + const int INPUT_IM_INFO{3}; - const int OUTPUT_BOXES {0}; - const int OUTPUT_CLASSES {1}; - const int OUTPUT_SCORES {2}; + const int OUTPUT_BOXES{0}; + const int OUTPUT_CLASSES{1}; + const int OUTPUT_SCORES{2}; float score_threshold_; float nms_threshold_; @@ -44,6 +46,6 @@ class ExperimentalDetectronDetectionOutput : public Node { std::vector deltas_weights_; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.cpp b/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.cpp index 33f17c8d95f093..778e796aacc11a 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.cpp +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.cpp @@ -2,22 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // -#include +#include #include #include +#include #include -#include #include -#include +#include #if defined(HAVE_AVX2) -#include +# include #endif -#include "openvino/op/experimental_detectron_generate_proposals.hpp" -#include "openvino/core/parallel.hpp" #include "common/cpu_memcpy.h" #include "experimental_detectron_generate_proposals_single_image.h" +#include "openvino/core/parallel.hpp" +#include "openvino/op/experimental_detectron_generate_proposals.hpp" namespace ov { namespace intel_cpu { @@ -29,20 +29,29 @@ struct Indexer4d { int dim23_; int dim123_; - explicit Indexer4d(int dim0, int dim1, int dim2, int dim3): - dim3_(dim3), dim23_(dim2 * dim3), dim123_(dim1 * dim2 * dim3) { + explicit Indexer4d(int dim0, int dim1, int dim2, int dim3) + : dim3_(dim3), + dim23_(dim2 * dim3), + dim123_(dim1 * dim2 * dim3) { (void)dim0; } int operator()(int i, int j, int k, int n) const { - return i * dim123_ + j * dim23_ + k * dim3_ + n; + return i * dim123_ + j * dim23_ + k * dim3_ + n; } }; -void refine_anchors(const float* deltas, const float* scores, const float* anchors, - float* proposals, const int anchors_num, const int bottom_H, - const int bottom_W, const float img_H, const float img_W, - const float min_box_H, const float min_box_W, +void refine_anchors(const float* deltas, + const float* scores, + const float* anchors, + float* proposals, + const int anchors_num, + const int bottom_H, + const int bottom_W, + const float img_H, + const float img_W, + const float min_box_H, + const float min_box_W, const float max_delta_log_wh, float coordinates_offset) { Indexer4d delta_idx(anchors_num, 4, bottom_H, bottom_W); @@ -108,17 +117,22 @@ void refine_anchors(const float* deltas, const float* scores, const float* ancho void unpack_boxes(const float* p_proposals, float* unpacked_boxes, int pre_nms_topn) { parallel_for(pre_nms_topn, [&](size_t i) { - unpacked_boxes[0*pre_nms_topn + i] = p_proposals[5*i + 0]; - unpacked_boxes[1*pre_nms_topn + i] = p_proposals[5*i + 1]; - unpacked_boxes[2*pre_nms_topn + i] = p_proposals[5*i + 2]; - unpacked_boxes[3*pre_nms_topn + i] = p_proposals[5*i + 3]; - unpacked_boxes[4*pre_nms_topn + i] = p_proposals[5*i + 4]; + unpacked_boxes[0 * pre_nms_topn + i] = p_proposals[5 * i + 0]; + unpacked_boxes[1 * pre_nms_topn + i] = p_proposals[5 * i + 1]; + unpacked_boxes[2 * pre_nms_topn + i] = p_proposals[5 * i + 2]; + unpacked_boxes[3 * pre_nms_topn + i] = p_proposals[5 * i + 3]; + unpacked_boxes[4 * pre_nms_topn + i] = p_proposals[5 * i + 4]; }); } -void nms_cpu(const int num_boxes, int is_dead[], - const float* boxes, int index_out[], int* const num_out, - const int base_index, const float nms_thresh, const int max_num_out, +void nms_cpu(const int num_boxes, + int is_dead[], + const float* boxes, + int index_out[], + int* const num_out, + const int base_index, + const float nms_thresh, + const int max_num_out, float coordinates_offset) { const int num_proposals = num_boxes; int count = 0; @@ -131,9 +145,9 @@ void nms_cpu(const int num_boxes, int is_dead[], std::memset(is_dead, 0, num_boxes * sizeof(int)); #if defined(HAVE_AVX2) - __m256 vc_fone = _mm256_set1_ps(coordinates_offset); + __m256 vc_fone = _mm256_set1_ps(coordinates_offset); __m256i vc_ione = _mm256_set1_epi32(1); - __m256 vc_zero = _mm256_set1_ps(0.0f); + __m256 vc_zero = _mm256_set1_ps(0.0f); __m256 vc_nms_thresh = _mm256_set1_ps(nms_thresh); #endif @@ -154,13 +168,13 @@ void nms_cpu(const int num_boxes, int is_dead[], __m256 vx1i = _mm256_set1_ps(x1[box]); __m256 vy1i = _mm256_set1_ps(y1[box]); - __m256 vA_width = _mm256_sub_ps(vx1i, vx0i); + __m256 vA_width = _mm256_sub_ps(vx1i, vx0i); __m256 vA_height = _mm256_sub_ps(vy1i, vy0i); - __m256 vA_area = _mm256_mul_ps(_mm256_add_ps(vA_width, vc_fone), _mm256_add_ps(vA_height, vc_fone)); + __m256 vA_area = _mm256_mul_ps(_mm256_add_ps(vA_width, vc_fone), _mm256_add_ps(vA_height, vc_fone)); for (; tail <= num_boxes - 8; tail += 8) { - __m256i *pdst = reinterpret_cast<__m256i*>(is_dead + tail); - __m256i vdst = _mm256_loadu_si256(pdst); + __m256i* pdst = reinterpret_cast<__m256i*>(is_dead + tail); + __m256i vdst = _mm256_loadu_si256(pdst); __m256 vx0j = _mm256_loadu_ps(x0 + tail); __m256 vy0j = _mm256_loadu_ps(y0 + tail); @@ -172,13 +186,13 @@ void nms_cpu(const int num_boxes, int is_dead[], __m256 vx1 = _mm256_min_ps(vx1i, vx1j); __m256 vy1 = _mm256_min_ps(vy1i, vy1j); - __m256 vwidth = _mm256_add_ps(_mm256_sub_ps(vx1, vx0), vc_fone); + __m256 vwidth = _mm256_add_ps(_mm256_sub_ps(vx1, vx0), vc_fone); __m256 vheight = _mm256_add_ps(_mm256_sub_ps(vy1, vy0), vc_fone); __m256 varea = _mm256_mul_ps(_mm256_max_ps(vc_zero, vwidth), _mm256_max_ps(vc_zero, vheight)); - __m256 vB_width = _mm256_sub_ps(vx1j, vx0j); + __m256 vB_width = _mm256_sub_ps(vx1j, vx0j); __m256 vB_height = _mm256_sub_ps(vy1j, vy0j); - __m256 vB_area = _mm256_mul_ps(_mm256_add_ps(vB_width, vc_fone), _mm256_add_ps(vB_height, vc_fone)); + __m256 vB_area = _mm256_mul_ps(_mm256_add_ps(vB_width, vc_fone), _mm256_add_ps(vB_height, vc_fone)); __m256 vdivisor = _mm256_sub_ps(_mm256_add_ps(vA_area, vB_area), varea); __m256 vintersection_area = _mm256_div_ps(varea, vdivisor); @@ -219,9 +233,9 @@ void nms_cpu(const int num_boxes, int is_dead[], const float y1 = std::min(y1i, y1j); // intersection area - const float width = std::max(0.0f, x1 - x0 + coordinates_offset); - const float height = std::max(0.0f, y1 - y0 + coordinates_offset); - const float area = width * height; + const float width = std::max(0.0f, x1 - x0 + coordinates_offset); + const float height = std::max(0.0f, y1 - y0 + coordinates_offset); + const float area = width * height; // area of A, B const float A_area = (x1i - x0i + coordinates_offset) * (y1i - y0i + coordinates_offset); @@ -239,14 +253,18 @@ void nms_cpu(const int num_boxes, int is_dead[], *num_out = count; } -void fill_output_blobs(const float* proposals, const int* roi_indices, - float* rois, float* scores, - const int num_proposals, const int num_rois, const int post_nms_topn) { - const float *src_x0 = proposals + 0 * num_proposals; - const float *src_y0 = proposals + 1 * num_proposals; - const float *src_x1 = proposals + 2 * num_proposals; - const float *src_y1 = proposals + 3 * num_proposals; - const float *src_score = proposals + 4 * num_proposals; +void fill_output_blobs(const float* proposals, + const int* roi_indices, + float* rois, + float* scores, + const int num_proposals, + const int num_rois, + const int post_nms_topn) { + const float* src_x0 = proposals + 0 * num_proposals; + const float* src_y0 = proposals + 1 * num_proposals; + const float* src_x1 = proposals + 2 * num_proposals; + const float* src_y1 = proposals + 3 * num_proposals; + const float* src_score = proposals + 4 * num_proposals; parallel_for(num_rois, [&](size_t i) { int index = roi_indices[i]; @@ -269,10 +287,11 @@ void fill_output_blobs(const float* proposals, const int* roi_indices, } // namespace -bool ExperimentalDetectronGenerateProposalsSingleImage::isSupportedOperation - (const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool ExperimentalDetectronGenerateProposalsSingleImage::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { - const auto proposalOp = ov::as_type_ptr(op); + const auto proposalOp = + ov::as_type_ptr(op); if (!proposalOp) { errorMessage = "Node is not an instance of the Proposal from the operations set v0."; return false; @@ -313,8 +332,7 @@ void ExperimentalDetectronGenerateProposalsSingleImage::initSupportedPrimitiveDe {LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}}, - {{LayoutType::ncsp, ov::element::f32}, - {LayoutType::ncsp, ov::element::f32}}, + {{LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } @@ -325,13 +343,13 @@ void ExperimentalDetectronGenerateProposalsSingleImage::execute(dnnl::stream str } size_t anchor_dims_size = 1; - const auto &anchorDims = getParentEdgeAt(INPUT_ANCHORS)->getMemory().getStaticDims(); + const auto& anchorDims = getParentEdgeAt(INPUT_ANCHORS)->getMemory().getStaticDims(); for (size_t i = 0; i < anchorDims.size(); i++) { anchor_dims_size *= anchorDims[i]; } size_t deltas_dims_size = 1; - const auto &deltaDims = getParentEdgeAt(INPUT_DELTAS)->getMemory().getStaticDims(); + const auto& deltaDims = getParentEdgeAt(INPUT_DELTAS)->getMemory().getStaticDims(); for (size_t i = 0; i < deltaDims.size(); i++) { deltas_dims_size *= deltaDims[i]; } @@ -339,7 +357,7 @@ void ExperimentalDetectronGenerateProposalsSingleImage::execute(dnnl::stream str OPENVINO_THROW("'Anchors' blob size for ONNXProposal is incompatible with 'deltas' blob size!"); size_t score_dims_size = 1; - const auto &scoreDims = getParentEdgeAt(INPUT_SCORES)->getMemory().getStaticDims(); + const auto& scoreDims = getParentEdgeAt(INPUT_SCORES)->getMemory().getStaticDims(); for (size_t i = 0; i < scoreDims.size(); i++) { score_dims_size *= scoreDims[i]; } @@ -347,13 +365,13 @@ void ExperimentalDetectronGenerateProposalsSingleImage::execute(dnnl::stream str OPENVINO_THROW("'Deltas' blob size for ONNXProposal is incompatible with 'scores' blob size!"); // Prepare memory - const float *p_deltas_item = getSrcDataAtPortAs(INPUT_DELTAS); - const float *p_scores_item = getSrcDataAtPortAs(INPUT_SCORES); - const float *p_anchors_item = getSrcDataAtPortAs(INPUT_ANCHORS); - const float *p_img_info_cpu = getSrcDataAtPortAs(INPUT_IM_INFO); + const float* p_deltas_item = getSrcDataAtPortAs(INPUT_DELTAS); + const float* p_scores_item = getSrcDataAtPortAs(INPUT_SCORES); + const float* p_anchors_item = getSrcDataAtPortAs(INPUT_ANCHORS); + const float* p_img_info_cpu = getSrcDataAtPortAs(INPUT_IM_INFO); - float *p_roi_item = getDstDataAtPortAs(OUTPUT_ROIS); - float *p_roi_score_item = getDstDataAtPortAs(OUTPUT_SCORES); + float* p_roi_item = getDstDataAtPortAs(OUTPUT_ROIS); + float* p_roi_score_item = getDstDataAtPortAs(OUTPUT_SCORES); const int anchors_num = scoreDims[0]; @@ -398,24 +416,45 @@ void ExperimentalDetectronGenerateProposalsSingleImage::execute(dnnl::stream str // Execute int batch_size = 1; // inputs[INPUT_DELTAS]->getTensorDesc().getDims()[0]; for (int n = 0; n < batch_size; ++n) { - refine_anchors(p_deltas_item, p_scores_item, p_anchors_item, - reinterpret_cast(&proposals_[0]), anchors_num, bottom_H, - bottom_W, img_H, img_W, - min_box_H, min_box_W, + refine_anchors(p_deltas_item, + p_scores_item, + p_anchors_item, + reinterpret_cast(&proposals_[0]), + anchors_num, + bottom_H, + bottom_W, + img_H, + img_W, + min_box_H, + min_box_W, static_cast(std::log(1000. / 16.)), 1.0f); - std::partial_sort(proposals_.begin(), proposals_.begin() + pre_nms_topn, proposals_.end(), - [](const ProposalBox &struct1, const ProposalBox &struct2) { + std::partial_sort(proposals_.begin(), + proposals_.begin() + pre_nms_topn, + proposals_.end(), + [](const ProposalBox& struct1, const ProposalBox& struct2) { return (struct1.score > struct2.score); }); - unpack_boxes(reinterpret_cast(&proposals_[0]), &unpacked_boxes[0], pre_nms_topn); - nms_cpu(pre_nms_topn, &is_dead[0], &unpacked_boxes[0], &roi_indices_[0], &num_rois, 0, - nms_thresh_, post_nms_topn_, coordinates_offset); - fill_output_blobs(&unpacked_boxes[0], &roi_indices_[0], p_roi_item, p_roi_score_item, - pre_nms_topn, num_rois, post_nms_topn_); + unpack_boxes(reinterpret_cast(&proposals_[0]), &unpacked_boxes[0], pre_nms_topn); + nms_cpu(pre_nms_topn, + &is_dead[0], + &unpacked_boxes[0], + &roi_indices_[0], + &num_rois, + 0, + nms_thresh_, + post_nms_topn_, + coordinates_offset); + fill_output_blobs(&unpacked_boxes[0], + &roi_indices_[0], + p_roi_item, + p_roi_score_item, + pre_nms_topn, + num_rois, + post_nms_topn_); } - } catch (const std::exception &e) { + } catch (const std::exception& e) { std::string errorMsg = e.what(); OPENVINO_THROW(errorMsg); } @@ -433,6 +472,6 @@ bool ExperimentalDetectronGenerateProposalsSingleImage::needPrepareParams() cons return false; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.h b/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.h index 41aaf63f637e76..d747813e10b258 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.h +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_generate_proposals_single_image.h @@ -13,16 +13,18 @@ namespace node { class ExperimentalDetectronGenerateProposalsSingleImage : public Node { public: ExperimentalDetectronGenerateProposalsSingleImage(const std::shared_ptr& op, - const GraphContext::CPtr context); + const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; bool needShapeInfer() const override; bool needPrepareParams() const override; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; private: @@ -32,12 +34,12 @@ class ExperimentalDetectronGenerateProposalsSingleImage : public Node { // Outputs: // top_rois, shape [max_rois, 4] - const int INPUT_IM_INFO {0}; - const int INPUT_ANCHORS {1}; - const int INPUT_DELTAS {2}; - const int INPUT_SCORES {3}; - const int OUTPUT_ROIS {0}; - const int OUTPUT_SCORES {1}; + const int INPUT_IM_INFO{0}; + const int INPUT_ANCHORS{1}; + const int INPUT_DELTAS{2}; + const int INPUT_SCORES{3}; + const int OUTPUT_ROIS{0}; + const int OUTPUT_SCORES{1}; float min_size_; int pre_nms_topn_; @@ -48,6 +50,6 @@ class ExperimentalDetectronGenerateProposalsSingleImage : public Node { std::vector roi_indices_; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.cpp b/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.cpp index eead95def0a8fb..f7df0e533778ed 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.cpp +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.cpp @@ -2,20 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // -#include +#include "experimental_detectron_priorgridgenerator.h" #include +#include + #include "openvino/core/parallel.hpp" -#include "experimental_detectron_priorgridgenerator.h" namespace ov { namespace intel_cpu { namespace node { bool ExperimentalDetectronPriorGridGenerator::isSupportedOperation(const std::shared_ptr& op, - std::string& errorMessage) noexcept { + std::string& errorMessage) noexcept { try { - const auto priorGridGen = std::dynamic_pointer_cast(op); + const auto priorGridGen = + std::dynamic_pointer_cast(op); if (!priorGridGen) { errorMessage = "Only opset6 ExperimentalDetectronPriorGridGenerator operation is supported"; return false; @@ -39,7 +41,7 @@ ExperimentalDetectronPriorGridGenerator::ExperimentalDetectronPriorGridGenerator if (getOriginalInputsNumber() != 3 || getOriginalOutputsNumber() != 1) OPENVINO_THROW(errorPrefix, " has incorrect number of input/output edges!"); - const auto &attr = priorGridGen->get_attrs(); + const auto& attr = priorGridGen->get_attrs(); grid_w_ = attr.w; grid_h_ = attr.h; stride_h_ = attr.stride_y; @@ -64,11 +66,15 @@ void ExperimentalDetectronPriorGridGenerator::execute(dnnl::stream strm) { // Execute const int layer_width = grid_w_ ? grid_w_ : getParentEdgeAt(INPUT_FEATUREMAP)->getMemory().getStaticDims()[3]; const int layer_height = grid_h_ ? grid_h_ : getParentEdgeAt(INPUT_FEATUREMAP)->getMemory().getStaticDims()[2]; - const float step_w = stride_w_ ? stride_w_ : static_cast(getParentEdgeAt(INPUT_IMAGE)->getMemory().getStaticDims()[3]) / layer_width; - const float step_h = stride_h_ ? stride_h_ : static_cast(getParentEdgeAt(INPUT_IMAGE)->getMemory().getStaticDims()[2]) / layer_height; + const float step_w = + stride_w_ ? stride_w_ + : static_cast(getParentEdgeAt(INPUT_IMAGE)->getMemory().getStaticDims()[3]) / layer_width; + const float step_h = + stride_h_ ? stride_h_ + : static_cast(getParentEdgeAt(INPUT_IMAGE)->getMemory().getStaticDims()[2]) / layer_height; - const auto *bottom_data_0 = getSrcDataAtPortAs(0); - auto *top_data_0 = getDstDataAtPortAs(OUTPUT_ROIS); + const auto* bottom_data_0 = getSrcDataAtPortAs(0); + auto* top_data_0 = getDstDataAtPortAs(OUTPUT_ROIS); for (int h = 0; h < layer_height; ++h) { for (int w = 0; w < layer_width; ++w) { @@ -91,6 +97,6 @@ bool ExperimentalDetectronPriorGridGenerator::needPrepareParams() const { return false; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.h b/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.h index cf52b4e5c9b934..47c2c16dc558b9 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.h +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_priorgridgenerator.h @@ -14,13 +14,15 @@ class ExperimentalDetectronPriorGridGenerator : public Node { public: ExperimentalDetectronPriorGridGenerator(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; bool needPrepareParams() const override; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; private: @@ -31,11 +33,11 @@ class ExperimentalDetectronPriorGridGenerator : public Node { // Outputs: // priors_grid, shape [m, 4] - const int INPUT_PRIORS {0}; - const int INPUT_FEATUREMAP {1}; - const int INPUT_IMAGE {2}; + const int INPUT_PRIORS{0}; + const int INPUT_FEATUREMAP{1}; + const int INPUT_IMAGE{2}; - const int OUTPUT_ROIS {0}; + const int OUTPUT_ROIS{0}; int grid_w_; int grid_h_; @@ -45,6 +47,6 @@ class ExperimentalDetectronPriorGridGenerator : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.cpp b/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.cpp index c92e3c2594d4a9..05f2202537f986 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.cpp +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.cpp @@ -2,14 +2,15 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "experimental_detectron_roifeatureextractor.h" + +#include +#include #include #include -#include -#include -#include "openvino/core/parallel.hpp" #include "common/cpu_memcpy.h" -#include "experimental_detectron_roifeatureextractor.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { @@ -30,31 +31,28 @@ struct PreCalc { }; template -void pre_calc_for_bilinear_interpolate( - const int height, - const int width, - const int pooled_height, - const int pooled_width, - const int iy_upper, - const int ix_upper, - T roi_start_h, - T roi_start_w, - T bin_size_h, - T bin_size_w, - int roi_bin_grid_h, - int roi_bin_grid_w, - std::vector>& pre_calc) { +void pre_calc_for_bilinear_interpolate(const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int iy_upper, + const int ix_upper, + T roi_start_h, + T roi_start_w, + T bin_size_h, + T bin_size_w, + int roi_bin_grid_h, + int roi_bin_grid_w, + std::vector>& pre_calc) { int pre_calc_index = 0; for (int ph = 0; ph < pooled_height; ph++) { for (int pw = 0; pw < pooled_width; pw++) { for (int iy = 0; iy < iy_upper; iy++) { const T yy = roi_start_h + ph * bin_size_h + - static_cast(iy + .5f) * bin_size_h / - static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 + static_cast(iy + .5f) * bin_size_h / static_cast(roi_bin_grid_h); // e.g., 0.5, 1.5 for (int ix = 0; ix < ix_upper; ix++) { const T xx = roi_start_w + pw * bin_size_w + - static_cast(ix + .5f) * bin_size_w / - static_cast(roi_bin_grid_w); + static_cast(ix + .5f) * bin_size_w / static_cast(roi_bin_grid_w); T x = xx; T y = yy; @@ -126,19 +124,18 @@ void pre_calc_for_bilinear_interpolate( } template -void ROIAlignForward_cpu_kernel( - const int nthreads, - const T* bottom_data, - const T& spatial_scale, - const int channels, - const int height, - const int width, - const int pooled_height, - const int pooled_width, - const int sampling_ratio, - const T* bottom_rois, - const bool aligned, - T* top_data) { +void ROIAlignForward_cpu_kernel(const int nthreads, + const T* bottom_data, + const T& spatial_scale, + const int channels, + const int height, + const int width, + const int pooled_height, + const int pooled_width, + const int sampling_ratio, + const T* bottom_rois, + const bool aligned, + T* top_data) { int roi_cols = 4; int n_rois = nthreads / channels / pooled_width / pooled_height; @@ -168,38 +165,33 @@ void ROIAlignForward_cpu_kernel( T bin_size_w = static_cast(roi_width) / static_cast(pooled_width); // We use roi_bin_grid to sample the grid and mimic integral - int roi_bin_grid_h = (sampling_ratio > 0) - ? sampling_ratio - : static_cast(ceil(roi_height / pooled_height)); // e.g., = 2 - int roi_bin_grid_w = - (sampling_ratio > 0) ? sampling_ratio : static_cast(ceil(roi_width / pooled_width)); + int roi_bin_grid_h = + (sampling_ratio > 0) ? sampling_ratio : static_cast(ceil(roi_height / pooled_height)); // e.g., = 2 + int roi_bin_grid_w = (sampling_ratio > 0) ? sampling_ratio : static_cast(ceil(roi_width / pooled_width)); // We do average (integral) pooling inside a bin const T count = static_cast(roi_bin_grid_h * roi_bin_grid_w); // e.g. = 4 // we want to precalculate indices and weights shared by all chanels, // this is the key point of optimiation - std::vector> pre_calc( - roi_bin_grid_h * roi_bin_grid_w * pooled_width * pooled_height); - pre_calc_for_bilinear_interpolate( - height, - width, - pooled_height, - pooled_width, - roi_bin_grid_h, - roi_bin_grid_w, - roi_start_h, - roi_start_w, - bin_size_h, - bin_size_w, - roi_bin_grid_h, - roi_bin_grid_w, - pre_calc); + std::vector> pre_calc(roi_bin_grid_h * roi_bin_grid_w * pooled_width * pooled_height); + pre_calc_for_bilinear_interpolate(height, + width, + pooled_height, + pooled_width, + roi_bin_grid_h, + roi_bin_grid_w, + roi_start_h, + roi_start_w, + bin_size_h, + bin_size_w, + roi_bin_grid_h, + roi_bin_grid_w, + pre_calc); for (int c = 0; c < channels; c++) { int index_n_c = index_n + c * pooled_width * pooled_height; - const T* offset_bottom_data = - bottom_data + (roi_batch_ind * channels + c) * height * width; + const T* offset_bottom_data = bottom_data + (roi_batch_ind * channels + c) * height * width; int pre_calc_index = 0; for (int ph = 0; ph < pooled_height; ph++) { @@ -210,10 +202,8 @@ void ROIAlignForward_cpu_kernel( for (int iy = 0; iy < roi_bin_grid_h; iy++) { for (int ix = 0; ix < roi_bin_grid_w; ix++) { PreCalc pc = pre_calc[pre_calc_index]; - output_val += pc.w1 * offset_bottom_data[pc.pos1] + - pc.w2 * offset_bottom_data[pc.pos2] + - pc.w3 * offset_bottom_data[pc.pos3] + - pc.w4 * offset_bottom_data[pc.pos4]; + output_val += pc.w1 * offset_bottom_data[pc.pos1] + pc.w2 * offset_bottom_data[pc.pos2] + + pc.w3 * offset_bottom_data[pc.pos3] + pc.w4 * offset_bottom_data[pc.pos4]; pre_calc_index += 1; } @@ -222,14 +212,12 @@ void ROIAlignForward_cpu_kernel( top_data[index] = output_val; } // for pw - } // for ph - } // for c + } // for ph + } // for c }); } - -void redistribute_rois(const float* rois, int* level_ids, - const int num_rois, const int levels_num) { +void redistribute_rois(const float* rois, int* level_ids, const int num_rois, const int levels_num) { const float canonical_scale = 224.0f; const int canonical_level = 2; @@ -252,11 +240,11 @@ void redistribute_rois(const float* rois, int* level_ids, } } - -void reord(const float* src_data, const int* ranks, const int n, const int step, float* dst_data, - int* dst_mapping) { +void reord(const float* src_data, const int* ranks, const int n, const int step, float* dst_data, int* dst_mapping) { std::iota(dst_mapping, dst_mapping + n, 0); - std::sort(dst_mapping, dst_mapping + n, [&ranks](size_t i1, size_t i2) {return ranks[i1] < ranks[i2];}); + std::sort(dst_mapping, dst_mapping + n, [&ranks](size_t i1, size_t i2) { + return ranks[i1] < ranks[i2]; + }); for (int i = 0; i < n; ++i) { const int j = dst_mapping[i]; assert(0 <= j && j < n); @@ -277,12 +265,13 @@ void split_points(const std::vector& ids, std::vector& rois_per_level, rois_per_level.insert(rois_per_level.begin(), 0); } -} // namespace +} // namespace bool ExperimentalDetectronROIFeatureExtractor::isSupportedOperation(const std::shared_ptr& op, - std::string& errorMessage) noexcept { + std::string& errorMessage) noexcept { try { - const auto roiFeatureExtractor = std::dynamic_pointer_cast(op); + const auto roiFeatureExtractor = + std::dynamic_pointer_cast(op); if (!roiFeatureExtractor) { errorMessage = "Only opset6 ExperimentalDetectronROIFeatureExtractor operation is supported"; return false; @@ -301,8 +290,9 @@ ExperimentalDetectronROIFeatureExtractor::ExperimentalDetectronROIFeatureExtract OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); } - const auto roiFeatureExtractor = std::dynamic_pointer_cast(op); - const auto &attr = roiFeatureExtractor->get_attrs(); + const auto roiFeatureExtractor = + std::dynamic_pointer_cast(op); + const auto& attr = roiFeatureExtractor->get_attrs(); output_dim_ = attr.output_size; pyramid_scales_ = attr.pyramid_scales; sampling_ratio_ = attr.sampling_ratio; @@ -321,8 +311,7 @@ void ExperimentalDetectronROIFeatureExtractor::initSupportedPrimitiveDescriptors inDataConf.emplace_back(LayoutType::ncsp, ov::element::f32); addSupportedPrimDesc(inDataConf, - {{LayoutType::ncsp, ov::element::f32}, - {LayoutType::ncsp, ov::element::f32}}, + {{LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } @@ -332,15 +321,15 @@ void ExperimentalDetectronROIFeatureExtractor::execute(dnnl::stream strm) { const int channels_num = getParentEdgeAt(INPUT_FEATURES_START)->getMemory().getStaticDims()[1]; const int feaxels_per_roi = pooled_height_ * pooled_width_ * channels_num; - auto *input_rois = getSrcDataAtPortAs(INPUT_ROIS); - auto *output_rois_features = getDstDataAtPortAs(OUTPUT_ROI_FEATURES); - float *output_rois = nullptr; + auto* input_rois = getSrcDataAtPortAs(INPUT_ROIS); + auto* output_rois_features = getDstDataAtPortAs(OUTPUT_ROI_FEATURES); + float* output_rois = nullptr; if (OUTPUT_ROIS < outputShapes.size()) { output_rois = getDstDataAtPortAs(OUTPUT_ROIS); } std::vector level_ids(num_rois, 0); - redistribute_rois(input_rois, reinterpret_cast(&level_ids[0]), num_rois, levels_num); + redistribute_rois(input_rois, reinterpret_cast(&level_ids[0]), num_rois, levels_num); std::vector reordered_rois(4 * num_rois, 0); std::vector original_rois_mapping(num_rois, 0); @@ -354,7 +343,7 @@ void ExperimentalDetectronROIFeatureExtractor::execute(dnnl::stream strm) { const int level_rois_offset = rois_per_level[i]; const int level_rois_num = rois_per_level[i + 1] - level_rois_offset; if (level_rois_num > 0) { - auto *featuremap = getSrcDataAtPortAs(INPUT_FEATURES_START + i); + auto* featuremap = getSrcDataAtPortAs(INPUT_FEATURES_START + i); const int featuremap_height = getParentEdgeAt(INPUT_FEATURES_START + i)->getMemory().getStaticDims()[2]; const int featuremap_width = getParentEdgeAt(INPUT_FEATURES_START + i)->getMemory().getStaticDims()[3]; ROIAlignForward_cpu_kernel(feaxels_per_roi * level_rois_num, @@ -373,8 +362,12 @@ void ExperimentalDetectronROIFeatureExtractor::execute(dnnl::stream strm) { } std::vector dummy_mapping(num_rois, 0); - reord(&output_rois_features_temp[0], &original_rois_mapping[0], num_rois, feaxels_per_roi, - output_rois_features, &dummy_mapping[0]); + reord(&output_rois_features_temp[0], + &original_rois_mapping[0], + num_rois, + feaxels_per_roi, + output_rois_features, + &dummy_mapping[0]); if (output_rois != nullptr) { cpu_memcpy(output_rois, input_rois, 4 * num_rois * sizeof(float)); } @@ -384,6 +377,6 @@ bool ExperimentalDetectronROIFeatureExtractor::created() const { return getType() == Type::ExperimentalDetectronROIFeatureExtractor; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.h b/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.h index 94bfdfd224d0c5..374fd62c61b776 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.h +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_roifeatureextractor.h @@ -14,22 +14,26 @@ class ExperimentalDetectronROIFeatureExtractor : public Node { public: ExperimentalDetectronROIFeatureExtractor(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; - bool needPrepareParams() const override { return false; }; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); }; + bool needPrepareParams() const override { + return false; + }; + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + }; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; private: - const int INPUT_ROIS {0}; - const int INPUT_FEATURES_START {1}; + const int INPUT_ROIS{0}; + const int INPUT_FEATURES_START{1}; - const int OUTPUT_ROI_FEATURES {0}; - const size_t OUTPUT_ROIS {1}; + const int OUTPUT_ROI_FEATURES{0}; + const size_t OUTPUT_ROIS{1}; int output_dim_ = 0; int pooled_height_ = 0; @@ -39,6 +43,6 @@ class ExperimentalDetectronROIFeatureExtractor : public Node { bool aligned_ = false; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.cpp b/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.cpp index 46b60fcdb83efd..f09d96ac7a7f7e 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.cpp +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.cpp @@ -2,20 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "experimental_detectron_topkrois.h" + +#include +#include #include #include -#include -#include -#include "openvino/core/parallel.hpp" #include "common/cpu_memcpy.h" -#include "experimental_detectron_topkrois.h" +#include "openvino/core/parallel.hpp" namespace ov { namespace intel_cpu { namespace node { -bool ExperimentalDetectronTopKROIs::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool ExperimentalDetectronTopKROIs::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { const auto topKROI = std::dynamic_pointer_cast(op); if (!topKROI) { @@ -56,8 +58,7 @@ void ExperimentalDetectronTopKROIs::initSupportedPrimitiveDescriptors() { if (!supportedPrimitiveDescriptors.empty()) return; - addSupportedPrimDesc({{LayoutType::ncsp, ov::element::f32}, - {LayoutType::ncsp, ov::element::f32}}, + addSupportedPrimDesc({{LayoutType::ncsp, ov::element::f32}, {LayoutType::ncsp, ov::element::f32}}, {{LayoutType::ncsp, ov::element::f32}}, impl_desc_type::ref_any); } @@ -66,14 +67,16 @@ void ExperimentalDetectronTopKROIs::execute(dnnl::stream strm) { const int input_rois_num = getParentEdgeAt(INPUT_ROIS)->getMemory().getStaticDims()[0]; const int top_rois_num = (std::min)(max_rois_num_, input_rois_num); - auto *input_rois = getSrcDataAtPortAs(INPUT_ROIS); - auto *input_probs = getSrcDataAtPortAs(INPUT_PROBS); - auto *output_rois = getDstDataAtPortAs(OUTPUT_ROIS); + auto* input_rois = getSrcDataAtPortAs(INPUT_ROIS); + auto* input_probs = getSrcDataAtPortAs(INPUT_PROBS); + auto* output_rois = getDstDataAtPortAs(OUTPUT_ROIS); std::vector idx(input_rois_num); iota(idx.begin(), idx.end(), 0); // FIXME. partial_sort is enough here. - sort(idx.begin(), idx.end(), [&input_probs](size_t i1, size_t i2) {return input_probs[i1] > input_probs[i2];}); + sort(idx.begin(), idx.end(), [&input_probs](size_t i1, size_t i2) { + return input_probs[i1] > input_probs[i2]; + }); for (int i = 0; i < top_rois_num; ++i) { cpu_memcpy(output_rois + 4 * i, input_rois + 4 * idx[i], 4 * sizeof(float)); @@ -84,6 +87,6 @@ bool ExperimentalDetectronTopKROIs::created() const { return getType() == Type::ExperimentalDetectronTopKROIs; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.h b/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.h index 5c2db1fa2303ea..3fe134948d5e45 100644 --- a/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.h +++ b/src/plugins/intel_cpu/src/nodes/experimental_detectron_topkrois.h @@ -14,14 +14,20 @@ class ExperimentalDetectronTopKROIs : public Node { public: ExperimentalDetectronTopKROIs(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; - bool needShapeInfer() const override { return false; }; - bool needPrepareParams() const override { return false; }; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); }; + bool needShapeInfer() const override { + return false; + }; + bool needPrepareParams() const override { + return false; + }; + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + }; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; @@ -32,15 +38,15 @@ class ExperimentalDetectronTopKROIs : public Node { // Outputs: // top_rois, shape [max_rois, 4] - const int INPUT_ROIS {0}; - const int INPUT_PROBS {1}; + const int INPUT_ROIS{0}; + const int INPUT_PROBS{1}; - const int OUTPUT_ROIS {0}; + const int OUTPUT_ROIS{0}; int max_rois_num_; std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/extract_image_patches.cpp b/src/plugins/intel_cpu/src/nodes/extract_image_patches.cpp index 8b5d0b510614e1..51ae2123bbd382 100644 --- a/src/plugins/intel_cpu/src/nodes/extract_image_patches.cpp +++ b/src/plugins/intel_cpu/src/nodes/extract_image_patches.cpp @@ -3,15 +3,16 @@ // #include "extract_image_patches.h" -#include "common/primitive_hashing_utils.hpp" -#include "cpu/x64/jit_generator.hpp" -#include "openvino/core/parallel.hpp" -#include "openvino/opsets/opset3.hpp" #include #include #include +#include "common/primitive_hashing_utils.hpp" +#include "cpu/x64/jit_generator.hpp" +#include "openvino/core/parallel.hpp" +#include "openvino/opsets/opset3.hpp" + using namespace dnnl::impl::cpu; using namespace dnnl::impl::cpu::x64; using namespace dnnl::impl::utils; @@ -21,13 +22,15 @@ namespace ov { namespace intel_cpu { namespace node { #if defined(OPENVINO_ARCH_X86_64) -#define GET_OFF(field) offsetof(jit_extract_image_patches_args, field) +# define GET_OFF(field) offsetof(jit_extract_image_patches_args, field) template struct jit_extract_image_patches_kernel : public jit_uni_extract_image_patches_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_extract_image_patches_kernel) - explicit jit_extract_image_patches_kernel(jit_extract_image_patches_params jpp) : jit_uni_extract_image_patches_kernel(jpp), jit_generator(jit_name()) {} + explicit jit_extract_image_patches_kernel(jit_extract_image_patches_params jpp) + : jit_uni_extract_image_patches_kernel(jpp), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -92,35 +95,47 @@ struct jit_extract_image_patches_kernel : public jit_uni_extract_image_patches_k Vmm vmm = Vmm(0); Xmm xmm = Xmm(0); - Vmm vmm_zero = Vmm(1); // reserved for pad + Vmm vmm_zero = Vmm(1); // reserved for pad Xbyak::Xmm xmm_aux = Xbyak::Xmm(2); Vmm vmm_gather_index = Vmm(3); Vmm vmm_gather_mask = Vmm(4); Opmask k_mask = Xbyak::Opmask(1); Xbyak::Label gather_index_table; - inline void load_scalar(Vmm vmm_arg, const Xbyak::Address &op) { + inline void load_scalar(Vmm vmm_arg, const Xbyak::Address& op) { Xbyak::Xmm xmm_src = Xmm(vmm_arg.getIdx()); switch (jpp.dtype_size) { - case 4: uni_vmovss(vmm_arg, op); break; - case 2: uni_vpinsrw(xmm_src, xmm_src, op, 0x0); break; - case 1: uni_vpinsrb(xmm_src, xmm_src, op, 0x0); break; - default: - OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); + case 4: + uni_vmovss(vmm_arg, op); + break; + case 2: + uni_vpinsrw(xmm_src, xmm_src, op, 0x0); + break; + case 1: + uni_vpinsrb(xmm_src, xmm_src, op, 0x0); + break; + default: + OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); } } - inline void store_scalar(const Xbyak::Address &op, Vmm vmm_arg) { + inline void store_scalar(const Xbyak::Address& op, Vmm vmm_arg) { Xbyak::Xmm xmm_dst = Xmm(vmm_arg.getIdx()); switch (jpp.dtype_size) { - case 4: uni_vmovss(op, vmm_arg); break; - case 2: uni_vpextrw(op, xmm_dst, 0x0); break; - case 1: uni_vpextrb(op, xmm_dst, 0x0); break; - default: - OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); + case 4: + uni_vmovss(op, vmm_arg); + break; + case 2: + uni_vpextrw(op, xmm_dst, 0x0); + break; + case 1: + uni_vpextrb(op, xmm_dst, 0x0); + break; + default: + OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); } } - inline void pad_with_zeros(reg64_t ®_num_pads_arg, reg64_t ®_dst_arg) { + inline void pad_with_zeros(reg64_t& reg_num_pads_arg, reg64_t& reg_dst_arg) { Xbyak::Label main, tail, exit; L(main); { @@ -143,57 +158,67 @@ struct jit_extract_image_patches_kernel : public jit_uni_extract_image_patches_k L(exit); } - inline void custom_uni_vgatherdps(const Vmm &vmm_arg, reg64_t &mem_base, const Vmm &mem_offset, Vmm &vmm_mask) { + inline void custom_uni_vgatherdps(const Vmm& vmm_arg, reg64_t& mem_base, const Vmm& mem_offset, Vmm& vmm_mask) { switch (isa) { - case x64::avx2: - uni_vpcmpeqd(vmm_mask, vmm_mask, vmm_mask); - vgatherdps(vmm_arg, ptr[mem_base + mem_offset], vmm_mask); - break; - case x64::avx512_core: - kxnord(k_mask, k_mask, k_mask); - vgatherdps(vmm_arg | k_mask, ptr[mem_base + mem_offset]); - break; - case x64::sse41: - emulate_gather(vmm_arg, mem_base); - break; - default: - OPENVINO_THROW("Got unsupported instruction set."); + case x64::avx2: + uni_vpcmpeqd(vmm_mask, vmm_mask, vmm_mask); + vgatherdps(vmm_arg, ptr[mem_base + mem_offset], vmm_mask); + break; + case x64::avx512_core: + kxnord(k_mask, k_mask, k_mask); + vgatherdps(vmm_arg | k_mask, ptr[mem_base + mem_offset]); + break; + case x64::sse41: + emulate_gather(vmm_arg, mem_base); + break; + default: + OPENVINO_THROW("Got unsupported instruction set."); } } - inline void gather_src2vmm(const Vmm &vmm_arg, reg64_t &mem_base) { + inline void gather_src2vmm(const Vmm& vmm_arg, reg64_t& mem_base) { switch (jpp.dtype_size) { - case 4: custom_uni_vgatherdps(vmm, mem_base, vmm_gather_index, vmm_gather_mask); break; - case 2: - case 1: emulate_gather(vmm_arg, mem_base); break; - default: - OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); + case 4: + custom_uni_vgatherdps(vmm, mem_base, vmm_gather_index, vmm_gather_mask); + break; + case 2: + case 1: + emulate_gather(vmm_arg, mem_base); + break; + default: + OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); } } - inline void emulate_gather(const Xbyak::Xmm &xmm_arg, reg64_t &mem_base, int xmm_offset = 0) { - const int xmm_size = 16; // bytes + inline void emulate_gather(const Xbyak::Xmm& xmm_arg, reg64_t& mem_base, int xmm_offset = 0) { + const int xmm_size = 16; // bytes const int xmm_block_size = xmm_size / jpp.dtype_size; const int offset = xmm_offset * jpp.SW * jpp.dtype_size * xmm_block_size; for (int i = 0; i < xmm_block_size; i++) { Xbyak::Address addr = ptr[mem_base + i * jpp.SW * jpp.dtype_size + offset]; switch (jpp.dtype_size) { - case 4: uni_vpinsrd(xmm_arg, xmm_arg, addr, i); break; - case 2: uni_vpinsrw(xmm_arg, xmm_arg, addr, i); break; - case 1: uni_vpinsrb(xmm_arg, xmm_arg, addr, i); break; - default: - OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); + case 4: + uni_vpinsrd(xmm_arg, xmm_arg, addr, i); + break; + case 2: + uni_vpinsrw(xmm_arg, xmm_arg, addr, i); + break; + case 1: + uni_vpinsrb(xmm_arg, xmm_arg, addr, i); + break; + default: + OPENVINO_THROW("The data type of size '", jpp.dtype_size, "' is not supported."); } } } - inline void emulate_gather(const Xbyak::Ymm &ymm_arg, reg64_t &mem_base) { + inline void emulate_gather(const Xbyak::Ymm& ymm_arg, reg64_t& mem_base) { Xbyak::Xmm low_xmm = Xbyak::Xmm(ymm_arg.getIdx()); emulate_gather(low_xmm, mem_base, 0); emulate_gather(xmm_aux, mem_base, 1); vinserti128(ymm_arg, ymm_arg, xmm_aux, 1); } - inline void emulate_gather(const Xbyak::Zmm &zmm_arg, reg64_t &mem_base) { + inline void emulate_gather(const Xbyak::Zmm& zmm_arg, reg64_t& mem_base) { Xbyak::Xmm low_xmm = Xbyak::Xmm(zmm_arg.getIdx()); emulate_gather(low_xmm, mem_base, 0); for (int i = 1; i < 4; i++) { @@ -270,9 +295,10 @@ struct jit_extract_image_patches_kernel : public jit_uni_extract_image_patches_k dd(i * jpp.SW * jpp.dtype_size); } }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 -bool ExtractImagePatches::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool ExtractImagePatches::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { auto extImgPatcher = ov::as_type_ptr(op); if (!extImgPatcher) { @@ -284,7 +310,10 @@ bool ExtractImagePatches::isSupportedOperation(const std::shared_ptrget_sizes().size(), extImgPatcher->get_strides().size(), extImgPatcher->get_rates().size())) { + if (!everyone_is(2u, + extImgPatcher->get_sizes().size(), + extImgPatcher->get_strides().size(), + extImgPatcher->get_rates().size())) { errorMessage = "Doesn't support 'sizes', 'strides', 'rates', attributes with rank != 2"; return false; } @@ -323,7 +352,7 @@ size_t ExtractImagePatchesKey::hash() const { bool ExtractImagePatchesKey::operator==(const ExtractImagePatchesKey& rhs) const { bool result = inDims == rhs.inDims && outDims == rhs.outDims && kSizes == rhs.kSizes && strides == rhs.strides && - rates == rhs.rates && padType == rhs.padType && prcSize == rhs.prcSize; + rates == rhs.rates && padType == rhs.padType && prcSize == rhs.prcSize; return result; } } // namespace @@ -362,7 +391,8 @@ ExtractImagePatches::ExtractImagePatches(const std::shared_ptr& op, co OPENVINO_THROW(errorPrefix, "has unsupported pad type: ", extImgPatcher->get_auto_pad()); } - _ksizes = extImgPatcher->get_sizes();; + _ksizes = extImgPatcher->get_sizes(); + ; _strides = extImgPatcher->get_strides(); _rates = extImgPatcher->get_rates(); if (_ksizes.size() != 2 || _strides.size() != 2 || _rates.size() != 2) @@ -416,9 +446,7 @@ void ExtractImagePatches::initSupportedPrimitiveDescriptors() { if (_supported_precisions_sizes.find(precision.size()) == _supported_precisions_sizes.end()) OPENVINO_THROW(errorPrefix, "has unsupported precision: ", precision.get_type_name()); - addSupportedPrimDesc({{LayoutType::ncsp, precision}}, - {{LayoutType::ncsp, precision}}, - impl_desc_type::ref_any); + addSupportedPrimDesc({{LayoutType::ncsp, precision}}, {{LayoutType::ncsp, precision}}, impl_desc_type::ref_any); } void ExtractImagePatches::execute(dnnl::stream strm) { @@ -437,12 +465,17 @@ void ExtractImagePatches::executeDynamicImpl(dnnl::stream strm) { execute(strm); } -void ExtractImagePatches::ExtractImagePatchesRefExecutor::executeReference( - void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) const { +void ExtractImagePatches::ExtractImagePatchesRefExecutor::executeReference(void* src, + void* dst, + const VectorDims& istrides, + const VectorDims& ostrides) const { const char* src_data = reinterpret_cast(src); char* dst_data = reinterpret_cast(dst); - const std::vector ostrides_partial = { ostrides[0], jpp.KW * IC * ostrides[1], IC * ostrides[1], ostrides[1] }; + const std::vector ostrides_partial = {ostrides[0], + jpp.KW * IC * ostrides[1], + IC * ostrides[1], + ostrides[1]}; parallel_for4d(OB, jpp.KH, jpp.KW, IC, [&](const size_t ob, const size_t kh, const size_t kw, const size_t ic) { const int64_t iw_start = static_cast(kw * RW) - PL; @@ -450,12 +483,17 @@ void ExtractImagePatches::ExtractImagePatchesRefExecutor::executeReference( const size_t ih_lpad = ih_start >= 0 ? 0 : std::ceil(-1.f * ih_start / jpp.SH); const size_t iw_lpad = iw_start >= 0 ? 0 : std::ceil(-1.f * iw_start / jpp.SW); - const size_t ih_hpad = std::ceil((IH - 1.f * ih_start) / jpp.SH) > jpp.OH ? jpp.OH : std::ceil((IH + -1.f * ih_start) / jpp.SH); - const size_t iw_hpad = std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW) > jpp.OW ? jpp.OW : std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW); + const size_t ih_hpad = + std::ceil((IH - 1.f * ih_start) / jpp.SH) > jpp.OH ? jpp.OH : std::ceil((IH + -1.f * ih_start) / jpp.SH); + const size_t iw_hpad = std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW) > jpp.OW + ? jpp.OW + : std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW); - char* my_dst_ptr = dst_data + - (ob * ostrides_partial[0] + kh * ostrides_partial[1] + kw * ostrides_partial[2] + ic * ostrides_partial[3]) * jpp.dtype_size; - const char* my_src_ptr = src_data + (ob * istrides[0] + ic * istrides[1] + ih_start * istrides[2] + iw_start) * jpp.dtype_size; + char* my_dst_ptr = dst_data + (ob * ostrides_partial[0] + kh * ostrides_partial[1] + kw * ostrides_partial[2] + + ic * ostrides_partial[3]) * + jpp.dtype_size; + const char* my_src_ptr = + src_data + (ob * istrides[0] + ic * istrides[1] + ih_start * istrides[2] + iw_start) * jpp.dtype_size; size_t num_bytes_to_set = ih_lpad * jpp.OW * jpp.dtype_size; memset(my_dst_ptr, 0, num_bytes_to_set); @@ -463,14 +501,15 @@ void ExtractImagePatches::ExtractImagePatchesRefExecutor::executeReference( const char* src_ptr_h_stop = my_src_ptr + ih_hpad * jpp.SH * jpp.IW * jpp.dtype_size; for (const char* src_h_ptr = my_src_ptr + ih_lpad * jpp.SH * jpp.IW * jpp.dtype_size; - src_h_ptr < src_ptr_h_stop; src_h_ptr += jpp.SH * jpp.IW * jpp.dtype_size) { + src_h_ptr < src_ptr_h_stop; + src_h_ptr += jpp.SH * jpp.IW * jpp.dtype_size) { num_bytes_to_set = iw_lpad * jpp.dtype_size; memset(my_dst_ptr, 0, num_bytes_to_set); my_dst_ptr += num_bytes_to_set; const char* src_ptr_w_stop = src_h_ptr + iw_hpad * jpp.SW * jpp.dtype_size; - for (const char* src_w_ptr = src_h_ptr + iw_lpad * jpp.SW * jpp.dtype_size; - src_w_ptr < src_ptr_w_stop; src_w_ptr += jpp.SW * jpp.dtype_size) { + for (const char* src_w_ptr = src_h_ptr + iw_lpad * jpp.SW * jpp.dtype_size; src_w_ptr < src_ptr_w_stop; + src_w_ptr += jpp.SW * jpp.dtype_size) { num_bytes_to_set = jpp.dtype_size; memcpy(my_dst_ptr, src_w_ptr, num_bytes_to_set); my_dst_ptr += num_bytes_to_set; @@ -484,25 +523,35 @@ void ExtractImagePatches::ExtractImagePatchesRefExecutor::executeReference( }); } -void ExtractImagePatches::ExtractImagePatchesJitExecutor::executeOptimizedGeneric( - void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) const { +void ExtractImagePatches::ExtractImagePatchesJitExecutor::executeOptimizedGeneric(void* src, + void* dst, + const VectorDims& istrides, + const VectorDims& ostrides) const { #if defined(OPENVINO_ARCH_X86_64) const char* src_data = reinterpret_cast(src); char* dst_data = reinterpret_cast(dst); const auto& jpp = pKernel->jpp; - const std::vector ostrides_partial = { ostrides[0], jpp.KW * IC * ostrides[1], IC * ostrides[1], ostrides[1] }; + const std::vector ostrides_partial = {ostrides[0], + jpp.KW * IC * ostrides[1], + IC * ostrides[1], + ostrides[1]}; parallel_for4d(OB, jpp.KH, jpp.KW, IC, [&](const size_t ob, const size_t kh, const size_t kw, const size_t ic) { const int64_t ih_start = kh * RH - PT; const int64_t iw_start = kw * RW - PL; const size_t ih_lpad = ih_start >= 0 ? 0 : std::ceil(-1.f * ih_start / jpp.SH); const size_t iw_lpad = iw_start >= 0 ? 0 : std::ceil(-1.f * iw_start / jpp.SW); - const size_t ih_hpad = std::ceil((IH - 1.f * ih_start) / jpp.SH) > jpp.OH ? jpp.OH : std::ceil((IH - 1.f * ih_start) / jpp.SH); - const size_t iw_hpad = std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW) > jpp.OW ? jpp.OW : std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW); + const size_t ih_hpad = + std::ceil((IH - 1.f * ih_start) / jpp.SH) > jpp.OH ? jpp.OH : std::ceil((IH - 1.f * ih_start) / jpp.SH); + const size_t iw_hpad = std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW) > jpp.OW + ? jpp.OW + : std::ceil((jpp.IW - 1.f * iw_start) / jpp.SW); - size_t dst_offset = ob * ostrides_partial[0] + kh * ostrides_partial[1] + kw * ostrides_partial[2] + ic * ostrides_partial[3]; - size_t src_offset = ob * istrides[0] + ic * istrides[1] + ih_start * istrides[2] + iw_start + ih_lpad * jpp.SH * jpp.IW; + size_t dst_offset = + ob * ostrides_partial[0] + kh * ostrides_partial[1] + kw * ostrides_partial[2] + ic * ostrides_partial[3]; + size_t src_offset = + ob * istrides[0] + ic * istrides[1] + ih_start * istrides[2] + iw_start + ih_lpad * jpp.SH * jpp.IW; auto args = jit_extract_image_patches_args(); args.src = src_data + src_offset * jpp.dtype_size; @@ -513,7 +562,7 @@ void ExtractImagePatches::ExtractImagePatchesJitExecutor::executeOptimizedGeneri args.w_hi_pad = iw_hpad; (*pKernel)(&args); }); -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 } jit_extract_image_patches_params ExtractImagePatches::ExtractImagePatchesExecutor::fillJpp( @@ -584,14 +633,13 @@ jit_extract_image_patches_params ExtractImagePatches::ExtractImagePatchesExecuto return jpp; } -ExtractImagePatches::ExtractImagePatchesJitExecutor::ExtractImagePatchesJitExecutor( - const VectorDims& inDims, - const VectorDims& outDims, - const VectorDims& kSizes, - const VectorDims& strides, - const VectorDims& rates, - const ExtImgPatcherPadType& padType, - const size_t prcSize) { +ExtractImagePatches::ExtractImagePatchesJitExecutor::ExtractImagePatchesJitExecutor(const VectorDims& inDims, + const VectorDims& outDims, + const VectorDims& kSizes, + const VectorDims& strides, + const VectorDims& rates, + const ExtImgPatcherPadType& padType, + const size_t prcSize) { #if defined(OPENVINO_ARCH_X86_64) auto jpp = fillJpp(inDims, outDims, kSizes, strides, rates, padType, prcSize); if (mayiuse(x64::avx512_core)) { @@ -606,27 +654,31 @@ ExtractImagePatches::ExtractImagePatchesJitExecutor::ExtractImagePatchesJitExecu if (pKernel) pKernel->create_ker(); -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 } -void ExtractImagePatches::ExtractImagePatchesJitExecutor::exec( - void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) { +void ExtractImagePatches::ExtractImagePatchesJitExecutor::exec(void* src, + void* dst, + const VectorDims& istrides, + const VectorDims& ostrides) { if (!pKernel) OPENVINO_THROW("Can't execute, kernel for extract image patches node is not compiled"); executeOptimizedGeneric(src, dst, istrides, ostrides); } -ExtractImagePatches::ExtractImagePatchesRefExecutor::ExtractImagePatchesRefExecutor( - const VectorDims& inDims, - const VectorDims& outDims, - const VectorDims& kSizes, - const VectorDims& strides, - const VectorDims& rates, - const ExtImgPatcherPadType& padType, - const size_t prcSize) : jpp(fillJpp(inDims, outDims, kSizes, strides, rates, padType, prcSize)) {} - -void ExtractImagePatches::ExtractImagePatchesRefExecutor::exec( - void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) { +ExtractImagePatches::ExtractImagePatchesRefExecutor::ExtractImagePatchesRefExecutor(const VectorDims& inDims, + const VectorDims& outDims, + const VectorDims& kSizes, + const VectorDims& strides, + const VectorDims& rates, + const ExtImgPatcherPadType& padType, + const size_t prcSize) + : jpp(fillJpp(inDims, outDims, kSizes, strides, rates, padType, prcSize)) {} + +void ExtractImagePatches::ExtractImagePatchesRefExecutor::exec(void* src, + void* dst, + const VectorDims& istrides, + const VectorDims& ostrides) { executeReference(src, dst, istrides, ostrides); } @@ -636,6 +688,6 @@ bool ExtractImagePatches::created() const { return getType() == Type::ExtractImagePatches; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/extract_image_patches.h b/src/plugins/intel_cpu/src/nodes/extract_image_patches.h index 15220fd51a4285..1844b5cafeeb07 100644 --- a/src/plugins/intel_cpu/src/nodes/extract_image_patches.h +++ b/src/plugins/intel_cpu/src/nodes/extract_image_patches.h @@ -30,8 +30,11 @@ struct jit_extract_image_patches_args { }; struct jit_uni_extract_image_patches_kernel { - void (*ker_)(const jit_extract_image_patches_args *); - void operator()(const jit_extract_image_patches_args *args) { assert(ker_); ker_(args); } + void (*ker_)(const jit_extract_image_patches_args*); + void operator()(const jit_extract_image_patches_args* args) { + assert(ker_); + ker_(args); + } jit_extract_image_patches_params jpp; virtual void create_ker() = 0; explicit jit_uni_extract_image_patches_kernel(jit_extract_image_patches_params jpp) : ker_(nullptr), jpp(jpp) {} @@ -42,7 +45,7 @@ class ExtractImagePatches : public Node { public: ExtractImagePatches(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -51,11 +54,7 @@ class ExtractImagePatches : public Node { void prepareParams() override; static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; - enum class ExtImgPatcherPadType { - VALID, - SAME_LOWER, - SAME_UPPER - }; + enum class ExtImgPatcherPadType { VALID, SAME_LOWER, SAME_UPPER }; private: std::vector _ksizes; @@ -69,14 +68,13 @@ class ExtractImagePatches : public Node { struct ExtractImagePatchesExecutor { ExtractImagePatchesExecutor() = default; virtual void exec(void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) = 0; - jit_extract_image_patches_params fillJpp( - const VectorDims& inDims, - const VectorDims& outDims, - const VectorDims& kSizes, - const VectorDims& strides, - const VectorDims& rates, - const ExtImgPatcherPadType& padType, - const size_t prcSize); + jit_extract_image_patches_params fillJpp(const VectorDims& inDims, + const VectorDims& outDims, + const VectorDims& kSizes, + const VectorDims& strides, + const VectorDims& rates, + const ExtImgPatcherPadType& padType, + const size_t prcSize); virtual ~ExtractImagePatchesExecutor() = default; protected: @@ -93,30 +91,31 @@ class ExtractImagePatches : public Node { executorPtr execPtr = nullptr; struct ExtractImagePatchesJitExecutor : public ExtractImagePatchesExecutor { - ExtractImagePatchesJitExecutor( - const VectorDims& inDims, - const VectorDims& outDims, - const VectorDims& kSizes, - const VectorDims& strides, - const VectorDims& rates, - const ExtImgPatcherPadType& padType, - const size_t prcSize); + ExtractImagePatchesJitExecutor(const VectorDims& inDims, + const VectorDims& outDims, + const VectorDims& kSizes, + const VectorDims& strides, + const VectorDims& rates, + const ExtImgPatcherPadType& padType, + const size_t prcSize); void exec(void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) override; - void executeOptimizedGeneric(void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) const; + void executeOptimizedGeneric(void* src, + void* dst, + const VectorDims& istrides, + const VectorDims& ostrides) const; private: std::unique_ptr pKernel; }; struct ExtractImagePatchesRefExecutor : public ExtractImagePatchesExecutor { - ExtractImagePatchesRefExecutor( - const VectorDims& inDims, - const VectorDims& outDims, - const VectorDims& kSizes, - const VectorDims& strides, - const VectorDims& rates, - const ExtImgPatcherPadType& padType, - const size_t prcSize); + ExtractImagePatchesRefExecutor(const VectorDims& inDims, + const VectorDims& outDims, + const VectorDims& kSizes, + const VectorDims& strides, + const VectorDims& rates, + const ExtImgPatcherPadType& padType, + const size_t prcSize); void exec(void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) override; void executeReference(void* src, void* dst, const VectorDims& istrides, const VectorDims& ostrides) const; @@ -125,6 +124,6 @@ class ExtractImagePatches : public Node { }; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/eye.cpp b/src/plugins/intel_cpu/src/nodes/eye.cpp index 19e466ad68751a..deb47abdba2dee 100644 --- a/src/plugins/intel_cpu/src/nodes/eye.cpp +++ b/src/plugins/intel_cpu/src/nodes/eye.cpp @@ -3,9 +3,11 @@ // #include "eye.h" -#include "openvino/op/eye.hpp" + #include + #include "openvino/core/parallel.hpp" +#include "openvino/op/eye.hpp" #include "shape_inference/shape_inference.hpp" #include "utils/bfloat16.hpp" @@ -36,20 +38,21 @@ class EyeShapeInferFactory : public ShapeInferFactory { return (m_op->get_input_size() == 4) ? make_shape_inference(m_op) : make_shape_inference(m_op, PortMask(Eye::ROWS_NUM, Eye::COLS_NUM)); } + private: std::shared_ptr m_op; }; -} // namespace +} // namespace -Eye::Eye(const std::shared_ptr& op, const GraphContext::CPtr context) : Node(op, context, EyeShapeInferFactory(op)) { +Eye::Eye(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, EyeShapeInferFactory(op)) { std::string errorMessage; if (!isSupportedOperation(op, errorMessage)) { - OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); + OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); } outType = op->get_output_element_type(0); withBatchShape = (op->get_input_size() == 4); - if (!one_of(outType, ov::element::f32, ov::element::bf16, - ov::element::i32, ov::element::i8, ov::element::u8)) { + if (!one_of(outType, ov::element::f32, ov::element::bf16, ov::element::i32, ov::element::i8, ov::element::u8)) { THROW_ERROR(errorPrefix, "doesn't support demanded output precision"); } } @@ -61,16 +64,19 @@ void Eye::getSupportedDescriptors() { THROW_ERROR(errorPrefix, "has incorrect number of output edges: ", getChildEdges().size()); } -template +template struct Eye::EyeExecute { - void operator()(Eye *node) { + void operator()(Eye* node) { node->executeSpecified(); } }; void Eye::execute(dnnl::stream strm) { auto outputPrec = getChildEdgeAt(0)->getMemory().getDesc().getPrecision(); - OV_SWITCH(intel_cpu, EyeExecute, this, outputPrec, + OV_SWITCH(intel_cpu, + EyeExecute, + this, + outputPrec, OV_CASE(ov::element::f32, float), OV_CASE(ov::element::bf16, bfloat16_t), OV_CASE(ov::element::i32, int), @@ -99,9 +105,9 @@ void Eye::executeSpecified() { const size_t colNum = getColNum(); const int64_t shift = getDiagIndex(); auto outPtr = getDstMemoryAtPort(0); - if (!outPtr || !outPtr ->isDefined()) + if (!outPtr || !outPtr->isDefined()) THROW_ERROR(errorPrefix, "Destination memory is undefined."); - T *dst = outPtr->getDataAs(); + T* dst = outPtr->getDataAs(); const size_t batchVolume = getBatchVolume(getBatchShape()); const size_t spatialCount = colNum * rowNum; @@ -111,8 +117,8 @@ void Eye::executeSpecified() { const int64_t countByColumns = std::max(int64_t(colNum) - std::abs(shift), int64_t(0)); const int64_t countByRows = std::max(int64_t(rowNum) - std::abs(shift), int64_t(0)); - const size_t onesPerBatchNum = - static_cast(shift > 0 ? std::min(countByColumns, int64_t(rowNum)) : std::min(countByRows, int64_t(colNum))); + const size_t onesPerBatchNum = static_cast(shift > 0 ? std::min(countByColumns, int64_t(rowNum)) + : std::min(countByRows, int64_t(colNum))); const size_t dataShift = static_cast(shift >= 0 ? shift : -shift * colNum); if (spatialSize >= l2CacheSize) { @@ -121,7 +127,8 @@ void Eye::executeSpecified() { splitter(elementsCount, nthr, ithr, start, end); memset(dst + start, 0, (end - start) * sizeof(T)); }); - if (onesPerBatchNum == 0) return; + if (onesPerBatchNum == 0) + return; for (size_t bShift = 0; bShift < batchVolume * spatialCount; bShift += spatialCount) { parallel_nt(0, [&](const size_t ithr, const size_t nthr) { size_t start = 0, end = 0; @@ -136,7 +143,8 @@ void Eye::executeSpecified() { size_t start = 0, end = 0; splitter(batchVolume, nthr, ithr, start, end); memset(dst + start * spatialCount, 0, (end - start) * spatialSize); - if (onesPerBatchNum == 0) return; + if (onesPerBatchNum == 0) + return; for (size_t spShift = start * spatialCount; spShift < end * spatialCount; spShift += spatialCount) { for (size_t j = 0; j < onesPerBatchNum; j++) { dst[dataShift + j * (colNum + 1) + spShift] = static_cast(1); @@ -149,6 +157,6 @@ void Eye::executeSpecified() { bool Eye::created() const { return getType() == Type::Eye; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/eye.h b/src/plugins/intel_cpu/src/nodes/eye.h index 7978c45d8a05d1..fc2b42a18bdbe9 100644 --- a/src/plugins/intel_cpu/src/nodes/eye.h +++ b/src/plugins/intel_cpu/src/nodes/eye.h @@ -5,9 +5,11 @@ #pragma once #include -#include + #include +#include #include + #include "dnnl_extension_utils.h" namespace ov { @@ -28,9 +30,15 @@ class Eye : public Node { void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; - bool needPrepareParams() const override {return false;}; - bool needShapeInfer() const override {return true;}; - void executeDynamicImpl(dnnl::stream strm) override { execute(strm); } + bool needPrepareParams() const override { + return false; + }; + bool needShapeInfer() const override { + return true; + }; + void executeDynamicImpl(dnnl::stream strm) override { + execute(strm); + } static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; @@ -39,13 +47,13 @@ class Eye : public Node { ov::element::Type outType = ov::element::Type_t::undefined; template void executeSpecified(); - template + template struct EyeExecute; inline const size_t getRowNum() const { auto rowMem = getSrcMemoryAtPort(ROWS_NUM); if (rowMem == nullptr) OPENVINO_THROW(errorPrefix, " doesn't contain row_count data"); - const int *rowPtr = rowMem->getDataAs(); + const int* rowPtr = rowMem->getDataAs(); return rowPtr[0]; } @@ -53,7 +61,7 @@ class Eye : public Node { auto colMem = getSrcMemoryAtPort(COLS_NUM); if (colMem == nullptr) OPENVINO_THROW(errorPrefix, " doesn't contain col_count data"); - const int *colPtr = colMem->getDataAs(); + const int* colPtr = colMem->getDataAs(); return colPtr[0]; } @@ -61,28 +69,29 @@ class Eye : public Node { auto diagIndMem = getSrcMemoryAtPort(DIAGONAL_INDEX); if (diagIndMem == nullptr) OPENVINO_THROW(errorPrefix, " doesn't contain diag_index data"); - const int *diagIndexPtr = diagIndMem->getDataAs(); + const int* diagIndexPtr = diagIndMem->getDataAs(); return diagIndexPtr[0]; } inline const std::vector getBatchShape() const { if (withBatchShape) { - const int batchShapeSize = static_cast(getSrcMemoryAtPort(BATCH_SHAPE)->getShape().getElementsCount()); + const int batchShapeSize = + static_cast(getSrcMemoryAtPort(BATCH_SHAPE)->getShape().getElementsCount()); std::vector batchShape(batchShapeSize); - const int *batchShapePtr = getSrcDataAtPortAs(BATCH_SHAPE); + const int* batchShapePtr = getSrcDataAtPortAs(BATCH_SHAPE); batchShape.assign(batchShapePtr, batchShapePtr + batchShapeSize); return batchShape; } else { - return std::vector {}; + return std::vector{}; } } - inline const size_t getBatchVolume(const std::vector &batchShape) { + inline const size_t getBatchVolume(const std::vector& batchShape) { return std::accumulate(begin(batchShape), end(batchShape), 1, std::multiplies()); } bool withBatchShape = false; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/fake_quantize.cpp b/src/plugins/intel_cpu/src/nodes/fake_quantize.cpp index f12ab40cf5643b..9951c5176f0ad1 100644 --- a/src/plugins/intel_cpu/src/nodes/fake_quantize.cpp +++ b/src/plugins/intel_cpu/src/nodes/fake_quantize.cpp @@ -4,28 +4,27 @@ #include "fake_quantize.h" -#include -#include #include +#include + #include -#include #include - -#include "dnnl_types.h" -#include "dnnl_extension_utils.h" -#include "cpu/x64/jit_generator.hpp" #include +#include +#include +#include +#include -#include "openvino/core/parallel.hpp" -#include "utils/general_utils.h" -#include "utils/cpu_utils.hpp" -#include -#include "memory_desc/dnnl_blocked_memory_desc.h" #include "common/cpu_memcpy.h" #include "common/primitive_hashing_utils.hpp" -#include - +#include "cpu/x64/jit_generator.hpp" +#include "dnnl_extension_utils.h" +#include "dnnl_types.h" +#include "memory_desc/dnnl_blocked_memory_desc.h" +#include "openvino/core/parallel.hpp" #include "openvino/opsets/opset1.hpp" +#include "utils/cpu_utils.hpp" +#include "utils/general_utils.h" #include "utils/ngraph_utils.hpp" // Quantization ranges validation is switched off by default in order to avoid regressions on user side @@ -45,13 +44,15 @@ namespace ov { namespace intel_cpu { namespace node { #if defined(OPENVINO_ARCH_X86_64) -#define GET_OFF(field) offsetof(jit_quantize_call_args, field) +# define GET_OFF(field) offsetof(jit_quantize_call_args, field) template struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_binarization_kernel) - explicit jit_uni_binarization_kernel(const jit_quantize_params& jqp) : jit_uni_quantize_kernel(jqp), jit_generator(jit_name()) {} + explicit jit_uni_binarization_kernel(const jit_quantize_params& jqp) + : jit_uni_quantize_kernel(jqp), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -77,7 +78,8 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ Label tail_label; Label exit_label; - L(unrolled_loop_label); { + L(unrolled_loop_label); + { int step = isa == cpu::x64::sse41 ? nbits / 2 : isa == cpu::x64::avx2 ? nbits : 2 * nbits; const int ur_ch = isa == cpu::x64::sse41 ? nbits : isa == cpu::x64::avx2 ? nbits / 2 : nbits / 4; const int unrolled_loop_step = ur_ch * step; @@ -87,9 +89,9 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ xor_(reg_bin_32, reg_bin_32); for (int ch = 0; ch < ur_ch; ch++) { - uni_vmovups(vmm_src(0), ptr[reg_from + ch*step*sizeof(float)]); - uni_vmovups(vmm_wei(0), ptr[reg_thresholds + ch*step*sizeof(float)]); - uni_vmovups(vmm_mask(0), ptr[reg_output_mask + ch*step*sizeof(float)]); + uni_vmovups(vmm_src(0), ptr[reg_from + ch * step * sizeof(float)]); + uni_vmovups(vmm_wei(0), ptr[reg_thresholds + ch * step * sizeof(float)]); + uni_vmovups(vmm_mask(0), ptr[reg_output_mask + ch * step * sizeof(float)]); if (isa == avx512_core) { vcmpps(k_mask0, vmm_src(0), vmm_wei(0), _cmp_gt_os); vptestmd(k_mask1, vmm_mask(0), vmm_mask(0)); @@ -105,16 +107,17 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ } mov(ptr[reg_to], reg_bin_32); - add(reg_from, unrolled_loop_step*sizeof(float)); - add(reg_thresholds, unrolled_loop_step*sizeof(float)); - add(reg_output_mask, unrolled_loop_step*sizeof(float)); + add(reg_from, unrolled_loop_step * sizeof(float)); + add(reg_thresholds, unrolled_loop_step * sizeof(float)); + add(reg_output_mask, unrolled_loop_step * sizeof(float)); add(reg_to, sizeof(uint32_t)); sub(reg_work_amount, unrolled_loop_step); jmp(unrolled_loop_label, T_NEAR); } - L(main_loop_label); { + L(main_loop_label); + { int repeats = isa == cpu::x64::sse41 ? 2 : 1; int step = isa == cpu::x64::sse41 ? nbits / 2 : isa == cpu::x64::avx2 ? nbits : nbits * 2; const int main_loop_step = step * repeats; @@ -124,9 +127,9 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ xor_(reg_bin_32, reg_bin_32); for (int i = 0; i < repeats; i++) { - uni_vmovups(vmm_src(0), ptr[reg_from + i*step*sizeof(float)]); - uni_vmovups(vmm_wei(0), ptr[reg_thresholds + i*step*sizeof(float)]); - uni_vmovups(vmm_mask(0), ptr[reg_output_mask + i*step*sizeof(float)]); + uni_vmovups(vmm_src(0), ptr[reg_from + i * step * sizeof(float)]); + uni_vmovups(vmm_wei(0), ptr[reg_thresholds + i * step * sizeof(float)]); + uni_vmovups(vmm_mask(0), ptr[reg_output_mask + i * step * sizeof(float)]); if (isa == avx512_core) { vcmpps(k_mask0, vmm_src(0), vmm_wei(0), _cmp_gt_os); vptestmd(k_mask1, vmm_mask(0), vmm_mask(0)); @@ -145,16 +148,17 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ else mov(ptr[reg_to], reg_bin_8); - add(reg_from, main_loop_step*sizeof(float)); - add(reg_thresholds, main_loop_step*sizeof(float)); - add(reg_output_mask, main_loop_step*sizeof(float)); + add(reg_from, main_loop_step * sizeof(float)); + add(reg_thresholds, main_loop_step * sizeof(float)); + add(reg_output_mask, main_loop_step * sizeof(float)); add(reg_to, isa == avx512_core ? sizeof(uint16_t) : sizeof(uint8_t)); sub(reg_work_amount, main_loop_step); jmp(main_loop_label, T_NEAR); } - L(tail_label); { + L(tail_label); + { if (tail_size != 0) { xor_(reg_bin_32, reg_bin_32); mov(reg_mask, 1); @@ -188,15 +192,27 @@ struct jit_uni_binarization_kernel : public jit_uni_quantize_kernel, public jit_ } private: - using Vmm = typename conditional3::type; + using Vmm = + typename conditional3::type; - inline Vmm vmm_src(int idx) { return Vmm(idx); } - inline Xmm xmm_src(int idx) { return Xmm(idx); } - inline Vmm vmm_wei(int idx) { return Vmm(idx + 4); } - inline Vmm vmm_mask(int idx) { return Vmm(idx + 5); } - inline Xmm xmm_wei(int idx) { return Xmm(idx + 4); } - inline Xmm xmm_mask(int idx) { return Xmm(idx + 5); } + inline Vmm vmm_src(int idx) { + return Vmm(idx); + } + inline Xmm xmm_src(int idx) { + return Xmm(idx); + } + inline Vmm vmm_wei(int idx) { + return Vmm(idx + 4); + } + inline Vmm vmm_mask(int idx) { + return Vmm(idx + 5); + } + inline Xmm xmm_wei(int idx) { + return Xmm(idx + 4); + } + inline Xmm xmm_mask(int idx) { + return Xmm(idx + 5); + } Reg64 param = abi_param1; Reg64 reg_from = r8; @@ -219,7 +235,9 @@ template struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_quantization_kernel) - explicit jit_uni_quantization_kernel(const jit_quantize_params& jqp) : jit_uni_quantize_kernel(jqp), jit_generator(jit_name()) {} + explicit jit_uni_quantization_kernel(const jit_quantize_params& jqp) + : jit_uni_quantize_kernel(jqp), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -237,37 +255,78 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ else compute_generic(); - this->postamble(); } private: - using Vmm = typename conditional3::type; - - inline Vmm vmm_val(int idx) { return Vmm(idx + 0); } - inline Vmm vmm_crop_low(int idx) { return Vmm(idx + 2); } - inline Vmm vmm_crop_high(int idx) { return Vmm(idx + 4); } - inline Vmm vmm_input_scale(int idx) { return Vmm(idx + 6); } - inline Vmm vmm_input_shift(int idx) { return Vmm(idx + 8); } - inline Vmm vmm_output_scale(int idx) { return Vmm(idx + 10); } - inline Vmm vmm_output_shift(int idx) { return Vmm(idx + 12); } - - inline Ymm ymm_val(int idx) { return Ymm(idx + 0); } - inline Ymm ymm_crop_low(int idx) { return Ymm(idx + 2); } - inline Ymm ymm_crop_high(int idx) { return Ymm(idx + 4); } - inline Ymm ymm_input_scale(int idx) { return Ymm(idx + 6); } - inline Ymm ymm_input_shift(int idx) { return Ymm(idx + 8); } - inline Ymm ymm_output_scale(int idx) { return Ymm(idx + 10); } - inline Ymm ymm_output_shift(int idx) { return Ymm(idx + 12); } - - inline Xmm xmm_val(int idx) { return Xmm(idx + 0); } - inline Xmm xmm_crop_low(int idx) { return Xmm(idx + 2); } - inline Xmm xmm_crop_high(int idx) { return Xmm(idx + 4); } - inline Xmm xmm_input_scale(int idx) { return Xmm(idx + 6); } - inline Xmm xmm_input_shift(int idx) { return Xmm(idx + 8); } - inline Xmm xmm_output_scale(int idx) { return Xmm(idx + 10); } - inline Xmm xmm_output_shift(int idx) { return Xmm(idx + 12); } + using Vmm = + typename conditional3::type; + + inline Vmm vmm_val(int idx) { + return Vmm(idx + 0); + } + inline Vmm vmm_crop_low(int idx) { + return Vmm(idx + 2); + } + inline Vmm vmm_crop_high(int idx) { + return Vmm(idx + 4); + } + inline Vmm vmm_input_scale(int idx) { + return Vmm(idx + 6); + } + inline Vmm vmm_input_shift(int idx) { + return Vmm(idx + 8); + } + inline Vmm vmm_output_scale(int idx) { + return Vmm(idx + 10); + } + inline Vmm vmm_output_shift(int idx) { + return Vmm(idx + 12); + } + + inline Ymm ymm_val(int idx) { + return Ymm(idx + 0); + } + inline Ymm ymm_crop_low(int idx) { + return Ymm(idx + 2); + } + inline Ymm ymm_crop_high(int idx) { + return Ymm(idx + 4); + } + inline Ymm ymm_input_scale(int idx) { + return Ymm(idx + 6); + } + inline Ymm ymm_input_shift(int idx) { + return Ymm(idx + 8); + } + inline Ymm ymm_output_scale(int idx) { + return Ymm(idx + 10); + } + inline Ymm ymm_output_shift(int idx) { + return Ymm(idx + 12); + } + + inline Xmm xmm_val(int idx) { + return Xmm(idx + 0); + } + inline Xmm xmm_crop_low(int idx) { + return Xmm(idx + 2); + } + inline Xmm xmm_crop_high(int idx) { + return Xmm(idx + 4); + } + inline Xmm xmm_input_scale(int idx) { + return Xmm(idx + 6); + } + inline Xmm xmm_input_shift(int idx) { + return Xmm(idx + 8); + } + inline Xmm xmm_output_scale(int idx) { + return Xmm(idx + 10); + } + inline Xmm xmm_output_shift(int idx) { + return Xmm(idx + 12); + } Vmm vmm_zero = Vmm(14); @@ -296,24 +355,34 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ bool do_dequantization = true; inline void load_broadcasted_vectors_only(size_t idx) { - const auto &broadcasted = jqp_.broadcasted; - if (broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) uni_vbroadcastss(vmm_crop_low(idx), ptr[reg_crop_low]); - if (broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) uni_vbroadcastss(vmm_crop_high(idx), ptr[reg_crop_high]); - if (broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) uni_vbroadcastss(vmm_input_scale(idx), ptr[reg_input_scale]); - if (broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) uni_vbroadcastss(vmm_input_shift(idx), ptr[reg_input_shift]); + const auto& broadcasted = jqp_.broadcasted; + if (broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) + uni_vbroadcastss(vmm_crop_low(idx), ptr[reg_crop_low]); + if (broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) + uni_vbroadcastss(vmm_crop_high(idx), ptr[reg_crop_high]); + if (broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) + uni_vbroadcastss(vmm_input_scale(idx), ptr[reg_input_scale]); + if (broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) + uni_vbroadcastss(vmm_input_shift(idx), ptr[reg_input_shift]); if (do_dequantization) { - if (broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) uni_vbroadcastss(vmm_output_scale(idx), ptr[reg_output_scale]); - if (broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) uni_vbroadcastss(vmm_output_shift(idx), ptr[reg_output_shift]); + if (broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) + uni_vbroadcastss(vmm_output_scale(idx), ptr[reg_output_scale]); + if (broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) + uni_vbroadcastss(vmm_output_shift(idx), ptr[reg_output_shift]); } } template inline void load_not_broadcasted_vectors_only(size_t idx, size_t offset) { - const auto &broadcasted = jqp_.broadcasted; - if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) uni_vmovups(T(vmm_crop_low(idx).getIdx()), ptr[reg_crop_low + offset]); - if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) uni_vmovups(T(vmm_crop_high(idx).getIdx()), ptr[reg_crop_high + offset]); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) uni_vmovups(T(vmm_input_scale(idx).getIdx()), ptr[reg_input_scale + offset]); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) uni_vmovups(T(vmm_input_shift(idx).getIdx()), ptr[reg_input_shift + offset]); + const auto& broadcasted = jqp_.broadcasted; + if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) + uni_vmovups(T(vmm_crop_low(idx).getIdx()), ptr[reg_crop_low + offset]); + if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) + uni_vmovups(T(vmm_crop_high(idx).getIdx()), ptr[reg_crop_high + offset]); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) + uni_vmovups(T(vmm_input_scale(idx).getIdx()), ptr[reg_input_scale + offset]); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) + uni_vmovups(T(vmm_input_shift(idx).getIdx()), ptr[reg_input_shift + offset]); if (do_dequantization) { if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) uni_vmovups(T(vmm_output_scale(idx).getIdx()), ptr[reg_output_scale + offset]); @@ -323,14 +392,20 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } inline void increase_ptrs_if_not_broadcasted(size_t offset) { - const auto &broadcasted = jqp_.broadcasted; - if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) add(reg_crop_low, offset); - if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) add(reg_crop_high, offset); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) add(reg_input_scale, offset); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) add(reg_input_shift, offset); + const auto& broadcasted = jqp_.broadcasted; + if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) + add(reg_crop_low, offset); + if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) + add(reg_crop_high, offset); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) + add(reg_input_scale, offset); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) + add(reg_input_shift, offset); if (do_dequantization) { - if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) add(reg_output_scale, offset); - if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) add(reg_output_shift, offset); + if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) + add(reg_output_scale, offset); + if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) + add(reg_output_shift, offset); } } @@ -373,7 +448,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vbroadcastss(vmm_output_shift(0), ptr[reg_output_shift]); } - L(main_loop_label); { + L(main_loop_label); + { cmp(reg_work_amount, simd_w); jl(tail_blk4_label, T_NEAR); @@ -383,8 +459,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(vmm_val(i), vmm_val(i), vmm_crop_high(0)); uni_vmaxps(vmm_val(i), vmm_val(i), vmm_crop_low(0)); uni_vfmadd213ps(vmm_val(i), vmm_input_scale(0), vmm_input_shift(0)); - if (do_rounding) uni_vroundps(vmm_val(i), vmm_val(i), 0); - if (do_dequantization) uni_vfmadd213ps(vmm_val(i), vmm_output_scale(0), vmm_output_shift(0)); + if (do_rounding) + uni_vroundps(vmm_val(i), vmm_val(i), 0); + if (do_dequantization) + uni_vfmadd213ps(vmm_val(i), vmm_output_scale(0), vmm_output_shift(0)); store_vector(ptr[reg_to + i * (simd_w / 2) * dst_type_size], vmm_val(i), jqp_.dst_prc); } @@ -396,7 +474,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ jmp(main_loop_label, T_NEAR); } - L(tail_blk4_label); { + L(tail_blk4_label); + { cmp(reg_work_amount, tail_simd_w); jl(tail_blk4_exit_label, T_NEAR); @@ -405,8 +484,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(xmm_val(0), xmm_val(0), xmm_crop_high(0)); uni_vmaxps(xmm_val(0), xmm_val(0), xmm_crop_low(0)); uni_vfmadd213ps(xmm_val(0), xmm_input_scale(0), xmm_input_shift(0)); - if (do_rounding) uni_vroundps(xmm_val(0), xmm_val(0), 0); - if (do_dequantization) uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); + if (do_rounding) + uni_vroundps(xmm_val(0), xmm_val(0), 0); + if (do_dequantization) + uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); store_vector(ptr[reg_to], xmm_val(0), jqp_.dst_prc); @@ -420,7 +501,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ mov(aux_reg_from, reg_from); mov(aux_reg_to, reg_to); - L(tail_loop_label); { + L(tail_loop_label); + { cmp(reg_work_amount, 0); jle(exit_label, T_NEAR); @@ -429,8 +511,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(xmm_val(0), xmm_val(0), xmm_crop_high(0)); uni_vmaxps(xmm_val(0), xmm_val(0), xmm_crop_low(0)); uni_vfmadd213ps(xmm_val(0), xmm_input_scale(0), xmm_input_shift(0)); - if (do_rounding) uni_vroundps(xmm_val(0), xmm_val(0), 0); - if (do_dequantization) uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); + if (do_rounding) + uni_vroundps(xmm_val(0), xmm_val(0), 0); + if (do_dequantization) + uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); store_scalar(ptr[aux_reg_to], xmm_val(0), jqp_.dst_prc); @@ -496,7 +580,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ load_not_broadcasted_vectors_only(i, i * (simd_w / 2) * sizeof(float)); } - L(main_loop_label); { + L(main_loop_label); + { cmp(reg_work_amount, 0); jle(exit_label, T_NEAR); @@ -506,8 +591,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(vmm_val(i), vmm_val(i), vmm_crop_high(i)); uni_vmaxps(vmm_val(i), vmm_val(i), vmm_crop_low(i)); uni_vfmadd213ps(vmm_val(i), vmm_input_scale(i), vmm_input_shift(i)); - if (do_rounding) uni_vroundps(vmm_val(i), vmm_val(i), 0); - if (do_dequantization) uni_vfmadd213ps(vmm_val(i), vmm_output_scale(i), vmm_output_shift(i)); + if (do_rounding) + uni_vroundps(vmm_val(i), vmm_val(i), 0); + if (do_dequantization) + uni_vfmadd213ps(vmm_val(i), vmm_output_scale(i), vmm_output_shift(i)); store_vector(ptr[reg_to + i * (simd_w / 2) * dst_type_size], vmm_val(i), jqp_.dst_prc); } @@ -531,7 +618,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ load_not_broadcasted_vectors_only(0, 0); - L(tail_blk8_loop_label); { + L(tail_blk8_loop_label); + { cmp(reg_work_amount, 0); jle(tail_blk8_exit_label, T_NEAR); @@ -540,8 +628,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(ymm_val(0), ymm_val(0), ymm_crop_high(0)); uni_vmaxps(ymm_val(0), ymm_val(0), ymm_crop_low(0)); uni_vfmadd213ps(ymm_val(0), ymm_input_scale(0), ymm_input_shift(0)); - if (do_rounding) uni_vroundps(ymm_val(0), ymm_val(0), 0); - if (do_dequantization) uni_vfmadd213ps(ymm_val(0), ymm_output_scale(0), ymm_output_shift(0)); + if (do_rounding) + uni_vroundps(ymm_val(0), ymm_val(0), 0); + if (do_dequantization) + uni_vfmadd213ps(ymm_val(0), ymm_output_scale(0), ymm_output_shift(0)); store_vector(ptr[aux_reg_to], ymm_val(0), jqp_.dst_prc); @@ -571,7 +661,8 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ load_not_broadcasted_vectors_only(0, 0); - L(tail_blk4_loop_label); { + L(tail_blk4_loop_label); + { cmp(reg_work_amount, 0); jle(tail_blk4_exit_label, T_NEAR); @@ -580,8 +671,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(xmm_val(0), xmm_val(0), xmm_crop_high(0)); uni_vmaxps(xmm_val(0), xmm_val(0), xmm_crop_low(0)); uni_vfmadd213ps(xmm_val(0), xmm_input_scale(0), xmm_input_shift(0)); - if (do_rounding) uni_vroundps(xmm_val(0), xmm_val(0), 0); - if (do_dequantization) uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); + if (do_rounding) + uni_vroundps(xmm_val(0), xmm_val(0), 0); + if (do_dequantization) + uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); store_vector(ptr[aux_reg_to], xmm_val(0), jqp_.dst_prc); @@ -608,13 +701,14 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ mov(aux_reg_from, reg_from); mov(reg_work_amount, ptr[param + GET_OFF(work_amount)]); - L(tail_loop_label); { + L(tail_loop_label); + { cmp(reg_work_amount, 0); jle(exit_label, T_NEAR); Label end_unroll; auto tail_unroll = [&](size_t iter) { - const auto &broadcasted = jqp_.broadcasted; + const auto& broadcasted = jqp_.broadcasted; for (size_t i = 0; i < iter; i++) { if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) uni_vmovss(xmm_crop_low(0), ptr[reg_crop_low + i * wei_type_size]); @@ -636,8 +730,10 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ uni_vminps(xmm_val(0), xmm_val(0), xmm_crop_high(0)); uni_vmaxps(xmm_val(0), xmm_val(0), xmm_crop_low(0)); uni_vfmadd213ps(xmm_val(0), xmm_input_scale(0), xmm_input_shift(0)); - if (do_rounding) uni_vroundps(xmm_val(0), xmm_val(0), 0); - if (do_dequantization) uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); + if (do_rounding) + uni_vroundps(xmm_val(0), xmm_val(0), 0); + if (do_dequantization) + uni_vfmadd213ps(xmm_val(0), xmm_output_scale(0), xmm_output_shift(0)); store_scalar(ptr[aux_reg_to + i * dst_type_size], xmm_val(0), jqp_.dst_prc); } @@ -667,20 +763,20 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ L(exit_label); } - inline void load_vector(Zmm zmm_src, const Xbyak::Address &op, ov::element::Type src_prc) { + inline void load_vector(Zmm zmm_src, const Xbyak::Address& op, ov::element::Type src_prc) { switch (src_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(zmm_src, op); - break; - case ov::element::i8: - uni_vpmovsxbd(zmm_src, op); - break; - case ov::element::u8: - uni_vpmovzxbd(zmm_src, op); - break; - default: - assert(!"unknown src_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovups(zmm_src, op); + break; + case ov::element::i8: + uni_vpmovsxbd(zmm_src, op); + break; + case ov::element::u8: + uni_vpmovzxbd(zmm_src, op); + break; + default: + assert(!"unknown src_prc"); } if (src_prc != ov::element::f32) { @@ -688,20 +784,20 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } } - inline void load_vector(Ymm ymm_src, const Xbyak::Address &op, ov::element::Type src_prc) { + inline void load_vector(Ymm ymm_src, const Xbyak::Address& op, ov::element::Type src_prc) { switch (src_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(ymm_src, op); - break; - case ov::element::i8: - uni_vpmovsxbd(ymm_src, op); - break; - case ov::element::u8: - uni_vpmovzxbd(ymm_src, op); - break; - default: - assert(!"unknown src_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovups(ymm_src, op); + break; + case ov::element::i8: + uni_vpmovsxbd(ymm_src, op); + break; + case ov::element::u8: + uni_vpmovzxbd(ymm_src, op); + break; + default: + assert(!"unknown src_prc"); } if (src_prc != ov::element::f32) { @@ -709,20 +805,20 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } } - inline void load_vector(Xmm xmm_src, const Xbyak::Address &op, ov::element::Type src_prc) { + inline void load_vector(Xmm xmm_src, const Xbyak::Address& op, ov::element::Type src_prc) { switch (src_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(xmm_src, op); - break; - case ov::element::i8: - uni_vpmovsxbd(xmm_src, op); - break; - case ov::element::u8: - uni_vpmovzxbd(xmm_src, op); - break; - default: - assert(!"unknown src_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovups(xmm_src, op); + break; + case ov::element::i8: + uni_vpmovsxbd(xmm_src, op); + break; + case ov::element::u8: + uni_vpmovzxbd(xmm_src, op); + break; + default: + assert(!"unknown src_prc"); } if (src_prc != ov::element::f32) { @@ -730,22 +826,22 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } } - inline void load_scalar(Xmm xmm_src, const Xbyak::Address &op, ov::element::Type src_prc) { + inline void load_scalar(Xmm xmm_src, const Xbyak::Address& op, ov::element::Type src_prc) { switch (src_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovss(xmm_src, op); - break; - case ov::element::i8: - movsx(reg_tmp_32, op); - uni_vmovq(xmm_src, reg_tmp_64); - break; - case ov::element::u8: - movzx(reg_tmp_32, op); - uni_vmovq(xmm_src, reg_tmp_64); - break; - default: - assert(!"unknown src_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovss(xmm_src, op); + break; + case ov::element::i8: + movsx(reg_tmp_32, op); + uni_vmovq(xmm_src, reg_tmp_64); + break; + case ov::element::u8: + movzx(reg_tmp_32, op); + uni_vmovq(xmm_src, reg_tmp_64); + break; + default: + assert(!"unknown src_prc"); } if (src_prc != ov::element::f32) { @@ -753,29 +849,29 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } } - inline void store_vector(const Xbyak::Address &op, Zmm zmm_dst, ov::element::Type dst_prc) { + inline void store_vector(const Xbyak::Address& op, Zmm zmm_dst, ov::element::Type dst_prc) { if (dst_prc != ov::element::f32) { uni_vcvtps2dq(zmm_dst, zmm_dst); } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(op, zmm_dst); - break; - case ov::element::i8: - vpmovsdb(op, zmm_dst); - break; - case ov::element::u8: - vpmaxsd(zmm_dst, zmm_dst, vmm_zero); - vpmovusdb(op, zmm_dst); - break; - default: - assert(!"unknown dst_prc"); - } - } - - inline void store_vector(const Xbyak::Address &op, Ymm ymm_dst, ov::element::Type dst_prc) { + case ov::element::f32: + case ov::element::i32: + uni_vmovups(op, zmm_dst); + break; + case ov::element::i8: + vpmovsdb(op, zmm_dst); + break; + case ov::element::u8: + vpmaxsd(zmm_dst, zmm_dst, vmm_zero); + vpmovusdb(op, zmm_dst); + break; + default: + assert(!"unknown dst_prc"); + } + } + + inline void store_vector(const Xbyak::Address& op, Ymm ymm_dst, ov::element::Type dst_prc) { Xmm xmm_dst = Xmm(ymm_dst.getIdx()); if (dst_prc != ov::element::f32) { @@ -783,82 +879,82 @@ struct jit_uni_quantization_kernel : public jit_uni_quantize_kernel, public jit_ } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(op, ymm_dst); - break; - case ov::element::i8: - uni_vpackssdw(ymm_dst, ymm_dst, ymm_dst); + case ov::element::f32: + case ov::element::i32: + uni_vmovups(op, ymm_dst); + break; + case ov::element::i8: + uni_vpackssdw(ymm_dst, ymm_dst, ymm_dst); - vpermq(ymm_dst, ymm_dst, 0x08); + vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpacksswb(ymm_dst, ymm_dst, ymm_dst); + uni_vpacksswb(ymm_dst, ymm_dst, ymm_dst); - vmovq(op, xmm_dst); - break; - case ov::element::u8: - uni_vpackusdw(ymm_dst, ymm_dst, ymm_dst); + vmovq(op, xmm_dst); + break; + case ov::element::u8: + uni_vpackusdw(ymm_dst, ymm_dst, ymm_dst); - vpermq(ymm_dst, ymm_dst, 0x08); + vpermq(ymm_dst, ymm_dst, 0x08); - uni_vpackuswb(ymm_dst, ymm_dst, ymm_dst); + uni_vpackuswb(ymm_dst, ymm_dst, ymm_dst); - vmovq(op, xmm_dst); - break; - default: - assert(!"unknown dst_prc"); + vmovq(op, xmm_dst); + break; + default: + assert(!"unknown dst_prc"); } } - inline void store_vector(const Xbyak::Address &op, Xmm xmm_dst, ov::element::Type dst_prc) { + inline void store_vector(const Xbyak::Address& op, Xmm xmm_dst, ov::element::Type dst_prc) { if (dst_prc != ov::element::f32) { uni_vcvtps2dq(xmm_dst, xmm_dst); } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovups(op, xmm_dst); - break; - case ov::element::i8: - uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); - uni_vmovd(op, xmm_dst); - break; - case ov::element::u8: - uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); - uni_vmovd(op, xmm_dst); - break; - default: - assert(!"unknown dst_prc"); - } - } - - inline void store_scalar(const Xbyak::Address &op, Xmm xmm_dst, ov::element::Type dst_prc) { + case ov::element::f32: + case ov::element::i32: + uni_vmovups(op, xmm_dst); + break; + case ov::element::i8: + uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); + uni_vmovd(op, xmm_dst); + break; + case ov::element::u8: + uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); + uni_vmovd(op, xmm_dst); + break; + default: + assert(!"unknown dst_prc"); + } + } + + inline void store_scalar(const Xbyak::Address& op, Xmm xmm_dst, ov::element::Type dst_prc) { if (dst_prc != ov::element::f32) { uni_vcvtps2dq(xmm_dst, xmm_dst); } switch (dst_prc) { - case ov::element::f32: - case ov::element::i32: - uni_vmovss(op, xmm_dst); - break; - case ov::element::i8: - uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); - uni_vmovq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - break; - case ov::element::u8: - uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); - uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); - uni_vmovq(reg_tmp_64, xmm_dst); - mov(op, reg_tmp_8); - break; - default: - assert(!"unknown dst_prc"); + case ov::element::f32: + case ov::element::i32: + uni_vmovss(op, xmm_dst); + break; + case ov::element::i8: + uni_vpackssdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpacksswb(xmm_dst, xmm_dst, xmm_dst); + uni_vmovq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + break; + case ov::element::u8: + uni_vpackusdw(xmm_dst, xmm_dst, xmm_dst); + uni_vpackuswb(xmm_dst, xmm_dst, xmm_dst); + uni_vmovq(reg_tmp_64, xmm_dst); + mov(op, reg_tmp_8); + break; + default: + assert(!"unknown dst_prc"); } } }; @@ -877,7 +973,8 @@ bool FakeQuantize::isSupportedOperation(const std::shared_ptr& o } for (size_t i = 1; i < fq->get_input_size(); i++) { if (fq->get_input_partial_shape(i).rank().get_length() > 5) { - errorMessage = "Doesn't support 'range' input with rank: " + std::to_string(fq->get_input_partial_shape(i).rank().get_length()); + errorMessage = "Doesn't support 'range' input with rank: " + + std::to_string(fq->get_input_partial_shape(i).rank().get_length()); return false; } } @@ -935,7 +1032,7 @@ struct FakeQuantKey { seed = hash_combine(seed, jqp.wei_prc.hash()); seed = hash_combine(seed, jqp.dst_prc.hash()); seed = hash_combine(seed, jqp.op_type); - if (jqp.op_type == Algorithm::FQBinarization) { + if (jqp.op_type == Algorithm::FQBinarization) { seed = hash_combine(seed, jqp.c); } else { seed = hash_combine(seed, jqp.broadcasted); @@ -959,8 +1056,8 @@ struct FakeQuantKey { }; } // namespace -FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphContext::CPtr context) : - Node(op, context, PassThroughShapeInferFactory()) { +FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, PassThroughShapeInferFactory()) { std::string errorMessage; if (isSupportedOperation(op, errorMessage)) { algorithm = Algorithm::FQCommon; @@ -1032,16 +1129,20 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte OPENVINO_THROW(errorPrefix, "has different quantization axis size on 'data' and 'range' inputs"); } - const auto inputLowNode = std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(1)); + const auto inputLowNode = + std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(1)); auto inputLowData = inputLowNode->cast_vector(); - const auto inputHighNode = std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(2)); + const auto inputHighNode = + std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(2)); auto inputHighData = inputHighNode->cast_vector(); - const auto outputLowNode = std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(3)); + const auto outputLowNode = + std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(3)); auto outputLowData = outputLowNode->cast_vector(); - const auto outputHighNode = std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(4)); + const auto outputHighNode = + std::dynamic_pointer_cast(fq->get_input_node_shared_ptr(4)); auto outputHighData = outputHighNode->cast_vector(); binarization = levels == 2; @@ -1092,7 +1193,7 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte } } } else { - auto allElementsAreEqual = [&](const std::vector &data, size_t size) { + auto allElementsAreEqual = [&](const std::vector& data, size_t size) { if (size == 0) return true; @@ -1146,9 +1247,21 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] = outputScaleSize == 1; broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] = outputShiftSize == 1; - if (everyone_is(1u, cropLowSize, cropHighSize, inputScaleSize, inputShiftSize, outputScaleSize, outputShiftSize)) + if (everyone_is(1u, + cropLowSize, + cropHighSize, + inputScaleSize, + inputShiftSize, + outputScaleSize, + outputShiftSize)) broadcastingPolicy = PerTensor; - else if (one_of(1u, cropLowSize, cropHighSize, inputScaleSize, inputShiftSize, outputScaleSize, outputShiftSize)) + else if (one_of(1u, + cropLowSize, + cropHighSize, + inputScaleSize, + inputShiftSize, + outputScaleSize, + outputShiftSize)) broadcastingPolicy = Mixed; else broadcastingPolicy = PerChannel; @@ -1224,7 +1337,10 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte bool isFakeQuantization = true; bool isFakeQuantizationWithScale = true; - for (size_t i = 0; i < std::max(inputLowAxisSize, std::max(outputLowAxisSize, std::max(inputHighAxisSize, outputHighAxisSize))); i++) { + for (size_t i = 0; + i < std::max(inputLowAxisSize, + std::max(outputLowAxisSize, std::max(inputHighAxisSize, outputHighAxisSize))); + i++) { float il = inputLowData[isInputLowBroadcasted ? 0 : i]; float ol = outputLowData[isOutputLowBroadcasted ? 0 : i]; float ih = inputHighData[isInputHighBroadcasted ? 0 : i]; @@ -1236,7 +1352,10 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte } if (isFakeQuantizationWithScale) { - for (size_t i = 0; i < std::max(inputLowAxisSize, std::max(outputLowAxisSize, std::max(inputHighAxisSize, outputHighAxisSize))); i++) { + for (size_t i = 0; + i < std::max(inputLowAxisSize, + std::max(outputLowAxisSize, std::max(inputHighAxisSize, outputHighAxisSize))); + i++) { float il = inputLowData[isInputLowBroadcasted ? 0 : i]; float ol = outputLowData[isOutputLowBroadcasted ? 0 : i]; float ih = inputHighData[isInputHighBroadcasted ? 0 : i]; @@ -1255,22 +1374,22 @@ FakeQuantize::FakeQuantize(const std::shared_ptr& op, const GraphConte std::vector FakeQuantize::getDataFormats() const { // Special case for first FQ in the network - const auto &dims = getInputShapeAtPort(0).getDims(); + const auto& dims = getInputShapeAtPort(0).getDims(); if (dims[getAxis()] == 3) { - return { LayoutType::ncsp }; + return {LayoutType::ncsp}; } else { if (isBinarization()) { - return { LayoutType::nspc }; + return {LayoutType::nspc}; } else { if (one_of(dims.size(), 4u, 5u)) { if (getAxis() == 1) { auto blkFormat = mayiuse(cpu::x64::avx512_core) ? LayoutType::nCsp16c : LayoutType::nCsp8c; - return { blkFormat, LayoutType::nspc, LayoutType::ncsp }; + return {blkFormat, LayoutType::nspc, LayoutType::ncsp}; } else { - return { LayoutType::ncsp }; + return {LayoutType::ncsp}; } } else { - return { LayoutType::ncsp }; + return {LayoutType::ncsp}; } } } @@ -1284,10 +1403,12 @@ void FakeQuantize::init() { inputPrecision = getOriginalInputPrecisionAtPort(0); outputPrecision = getOriginalOutputPrecisionAtPort(0); - if (inputPrecision != ov::element::f32 && inputPrecision != ov::element::u8 && inputPrecision != ov::element::i8) + if (inputPrecision != ov::element::f32 && inputPrecision != ov::element::u8 && + inputPrecision != ov::element::i8) inputPrecision = ov::element::f32; - if (outputPrecision != ov::element::f32 && outputPrecision != ov::element::u8 && outputPrecision != ov::element::i8) + if (outputPrecision != ov::element::f32 && outputPrecision != ov::element::u8 && + outputPrecision != ov::element::i8) outputPrecision = ov::element::f32; } } @@ -1381,7 +1502,8 @@ bool FakeQuantize::needPrepareParams() const { if (!selectedPrimitiveDescriptor) OPENVINO_THROW("CPU quantize node with name '", getName(), "' doesn't have primitive descriptors."); - if (internalBlobMemory.empty() || (selectedPrimitiveDescriptor->getImplementationType() != impl_desc_type::ref && inputShapesModified())) { + if (internalBlobMemory.empty() || + (selectedPrimitiveDescriptor->getImplementationType() != impl_desc_type::ref && inputShapesModified())) { return true; } @@ -1389,7 +1511,8 @@ bool FakeQuantize::needPrepareParams() const { const auto newPaddedSize = rnd_up(axisSize, 16); const auto currPaddedSize = rnd_up(currentAxisSize, 16); - return newPaddedSize != currPaddedSize || ((isInputLowBroadcasted || isOutputHighBroadcasted) && axisSize != currentAxisSize); + return newPaddedSize != currPaddedSize || + ((isInputLowBroadcasted || isOutputHighBroadcasted) && axisSize != currentAxisSize); } return false; } @@ -1401,26 +1524,33 @@ void FakeQuantize::prepareParams() { OPENVINO_ASSERT(newPaddedSize != 0); if (internalBlobMemory.empty() || newPaddedSize != rnd_up(currentAxisSize, 16) || - ((isInputLowBroadcasted || isOutputHighBroadcasted) && axisSize != currentAxisSize)) { - DnnlBlockedMemoryDesc weightsDataDesc(Shape(VectorDims{newPaddedSize}), memory::data_type::f32, memory::format_tag::x); + ((isInputLowBroadcasted || isOutputHighBroadcasted) && axisSize != currentAxisSize)) { + DnnlBlockedMemoryDesc weightsDataDesc(Shape(VectorDims{newPaddedSize}), + memory::data_type::f32, + memory::format_tag::x); constexpr size_t numBinFqIntBlob = 2; bool needUpdThr = false, needUpdMask = false; if (isInputLowBroadcasted && axisSize != currentAxisSize) { binarizationThresholds.resize(newPaddedSize); - std::fill(binarizationThresholds.begin() + 1, binarizationThresholds.begin() + axisSize, binarizationThresholds[0]); + std::fill(binarizationThresholds.begin() + 1, + binarizationThresholds.begin() + axisSize, + binarizationThresholds[0]); std::fill(binarizationThresholds.begin() + axisSize, binarizationThresholds.end(), 0.f); needUpdThr = true; } if (isOutputHighBroadcasted && axisSize != currentAxisSize) { binarizationOutputMask.resize(newPaddedSize); - std::fill(binarizationOutputMask.begin() + 1, binarizationOutputMask.begin() + axisSize, binarizationOutputMask[0]); + std::fill(binarizationOutputMask.begin() + 1, + binarizationOutputMask.begin() + axisSize, + binarizationOutputMask[0]); std::fill(binarizationOutputMask.begin() + axisSize, binarizationOutputMask.end(), 0); needUpdMask = true; } if (internalBlobMemory.empty() || needUpdThr) { - auto binarizationThresholdsDataMem = std::make_shared(getEngine(), weightsDataDesc, getBinarizationTresholdsPtr()); + auto binarizationThresholdsDataMem = + std::make_shared(getEngine(), weightsDataDesc, getBinarizationTresholdsPtr()); if (internalBlobMemory.empty()) { internalBlobMemory.push_back(binarizationThresholdsDataMem); } else { @@ -1429,7 +1559,8 @@ void FakeQuantize::prepareParams() { } if (internalBlobMemory.size() == (numBinFqIntBlob - 1) || needUpdMask) { - auto binarizationMaskDataMem = std::make_shared(getEngine(), weightsDataDesc, getBinarizationOutputMaskPtr()); + auto binarizationMaskDataMem = + std::make_shared(getEngine(), weightsDataDesc, getBinarizationOutputMaskPtr()); if (internalBlobMemory.size() == (numBinFqIntBlob - 1)) { internalBlobMemory.push_back(binarizationMaskDataMem); } else { @@ -1449,31 +1580,39 @@ void FakeQuantize::createPrimitive() { if (selectedPrimitiveDescriptor->getImplementationType() != impl_desc_type::ref) { const auto& config = getSelectedPrimitiveDescriptor()->getConfig(); - //Form FakeQuanKey + // Form FakeQuanKey FakeQuantKey key = {}; key.jqp.src_prc = config.inConfs[0].getMemDesc()->getPrecision(); key.jqp.wei_prc = ov::element::f32; key.jqp.dst_prc = config.outConfs[0].getMemDesc()->getPrecision(); - const auto &srcMemory = getParentEdgeAt(0)->getMemory(); - const auto &srcDesc = srcMemory.getDesc(); + const auto& srcMemory = getParentEdgeAt(0)->getMemory(); + const auto& srcDesc = srcMemory.getDesc(); key.jqp.is_planar = srcDesc.hasLayoutType(LayoutType::ncsp) && one_of(srcDesc.getShape().getRank(), 3u, 4u, 5u); key.jqp.op_type = getAlgorithm(); if (isBinarization()) { - const auto &inDims = srcMemory.getStaticDims(); + const auto& inDims = srcMemory.getStaticDims(); key.jqp.c = inDims.size() > 1 ? inDims[1] : 1; } else { - // in case of blocked layout we need to extend vectors to prevent read from unallocated memory - size_t paddedSize = srcDesc.hasLayoutType(LayoutType::nCsp16c) ? 16 : srcDesc.hasLayoutType(LayoutType::nCsp8c) ? 8 : 1; + // in case of blocked layout we need to extend vectors to prevent read from unallocated memory + size_t paddedSize = srcDesc.hasLayoutType(LayoutType::nCsp16c) ? 16 + : srcDesc.hasLayoutType(LayoutType::nCsp8c) ? 8 + : 1; if (paddedSize != 1) { - if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) cropLow.resize(rnd_up(cropLow.size(), paddedSize)); - if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) cropHigh.resize(rnd_up(cropHigh.size(), paddedSize)); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) inputScale.resize(rnd_up(inputScale.size(), paddedSize)); - if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) inputShift.resize(rnd_up(inputShift.size(), paddedSize)); - if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) outputScale.resize(rnd_up(outputScale.size(), paddedSize)); - if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) outputShift.resize(rnd_up(outputShift.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::CROP_LOW)]) + cropLow.resize(rnd_up(cropLow.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)]) + cropHigh.resize(rnd_up(cropHigh.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)]) + inputScale.resize(rnd_up(inputScale.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)]) + inputShift.resize(rnd_up(inputShift.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)]) + outputScale.resize(rnd_up(outputScale.size(), paddedSize)); + if (!broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)]) + outputShift.resize(rnd_up(outputShift.size(), paddedSize)); } key.jqp.broadcasted = broadcasted; @@ -1530,11 +1669,10 @@ void FakeQuantize::executeReference() { parallel_nd(N, CB, D, H, W, [&](dim_t n, dim_t cb, dim_t d, dim_t h, dim_t w) { uint8_t bin_val = 0x00; for (int c = cb * nbits, shift = 0; c < std::min(static_cast(C), (cb + 1) * nbits); c++, shift++) { - size_t src_off = srcDims.size() == 4 ? - n * s_str[0] + c * s_str[1] + h * s_str[2] + w * s_str[3] : - srcDims.size() == 5 ? - n * s_str[0] + c * s_str[1] + d * s_str[2] + h * s_str[3] + w * s_str[4] : - n * s_str[0] + c * s_str[1]; + size_t src_off = srcDims.size() == 4 ? n * s_str[0] + c * s_str[1] + h * s_str[2] + w * s_str[3] + : srcDims.size() == 5 + ? n * s_str[0] + c * s_str[1] + d * s_str[2] + h * s_str[3] + w * s_str[4] + : n * s_str[0] + c * s_str[1]; float val = src[src_off]; float thr = thresholds[c]; @@ -1546,11 +1684,10 @@ void FakeQuantize::executeReference() { bin_val |= (bit << shift); } - size_t dst_off = dstDims.size() == 4 ? - n * d_str[0] + (cb * nbits) * d_str[1] + h * d_str[2] + w * d_str[3] : - dstDims.size() == 5 ? - n * d_str[0] + (cb * nbits) * d_str[1] + d * d_str[2] + h * d_str[3] + w * d_str[4] : - n * d_str[0] + (cb * nbits) * d_str[1]; + size_t dst_off = dstDims.size() == 4 ? n * d_str[0] + (cb * nbits) * d_str[1] + h * d_str[2] + w * d_str[3] + : dstDims.size() == 5 + ? n * d_str[0] + (cb * nbits) * d_str[1] + d * d_str[2] + h * d_str[3] + w * d_str[4] + : n * d_str[0] + (cb * nbits) * d_str[1]; dst[dst_off / nbits] = bin_val; }); @@ -1558,46 +1695,44 @@ void FakeQuantize::executeReference() { auto dst = dstMemory->getDataAs(); parallel_nd(N, C, D, H, W, [&](dim_t n, dim_t c, dim_t d, dim_t h, dim_t w) { - size_t src_off = srcDims.size() == 5 ? - n * s_str[0] + c * s_str[1] + d * s_str[2] + h * s_str[3] + w * s_str[4] : - srcDims.size() == 4 ? - n * s_str[0] + c * s_str[1] + h * s_str[2] + w * s_str[3] : - srcDims.size() == 3 ? - n * s_str[0] + c * s_str[1] + h * s_str[2] : - srcDims.size() == 2 ? - n * s_str[0] + c * s_str[1] : - n * s_str[0]; + size_t src_off = srcDims.size() == 5 + ? n * s_str[0] + c * s_str[1] + d * s_str[2] + h * s_str[3] + w * s_str[4] + : srcDims.size() == 4 ? n * s_str[0] + c * s_str[1] + h * s_str[2] + w * s_str[3] + : srcDims.size() == 3 ? n * s_str[0] + c * s_str[1] + h * s_str[2] + : srcDims.size() == 2 ? n * s_str[0] + c * s_str[1] + : n * s_str[0]; float src_val = src[src_off]; int wei_idx = getAxis() == 0 ? n : c; float cl = broadcasted[static_cast(FQ_add_input_type::CROP_LOW)] ? cropLow[0] : cropLow[wei_idx]; float ch = broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? cropHigh[0] : cropHigh[wei_idx]; - float isc = broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? inputScale[0] : inputScale[wei_idx]; - float ish = broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? inputShift[0] : inputShift[wei_idx]; - float osc = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? outputScale[0] : outputScale[wei_idx]; - float osh = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? outputShift[0] : outputShift[wei_idx]; + float isc = + broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? inputScale[0] : inputScale[wei_idx]; + float ish = + broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? inputShift[0] : inputShift[wei_idx]; + float osc = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? outputScale[0] + : outputScale[wei_idx]; + float osh = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? outputShift[0] + : outputShift[wei_idx]; float dst_val = nstl::min(ch, nstl::max(cl, src_val)); dst_val = dst_val * isc + ish; dst_val = roundf(dst_val); dst_val = dst_val * osc + osh; - size_t dst_off = dstDims.size() == 5 ? - n * d_str[0] + c * d_str[1] + d * d_str[2] + h * d_str[3] + w * d_str[4] : - dstDims.size() == 4 ? - n * d_str[0] + c * d_str[1] + h * d_str[2] + w * d_str[3] : - dstDims.size() == 3 ? - n * d_str[0] + c * d_str[1] + h * d_str[2] : - dstDims.size() == 2 ? - n * d_str[0] + c * d_str[1] : - n * d_str[0]; + size_t dst_off = dstDims.size() == 5 + ? n * d_str[0] + c * d_str[1] + d * d_str[2] + h * d_str[3] + w * d_str[4] + : dstDims.size() == 4 ? n * d_str[0] + c * d_str[1] + h * d_str[2] + w * d_str[3] + : dstDims.size() == 3 ? n * d_str[0] + c * d_str[1] + h * d_str[2] + : dstDims.size() == 2 ? n * d_str[0] + c * d_str[1] + : n * d_str[0]; dst[dst_off] = dst_val; }); } } -void FakeQuantize::executeBinarization(const std::unique_ptr &pKernel) const { +void FakeQuantize::executeBinarization(const std::unique_ptr& pKernel) const { #if defined(OPENVINO_ARCH_X86_64) auto srcMemory = getSrcMemoryAtPort(0); auto dstMemory = getDstMemoryAtPort(0); @@ -1628,8 +1763,8 @@ void FakeQuantize::executeBinarization(const std::unique_ptr &pKernel) const { +void FakeQuantize::executeQuantization(const std::unique_ptr& pKernel) const { #if defined(OPENVINO_ARCH_X86_64) auto srcMemory = getSrcMemoryAtPort(0); auto dstMemory = getDstMemoryAtPort(0); @@ -1651,10 +1786,11 @@ void FakeQuantize::executeQuantization(const std::unique_ptrjqp_; + const auto& jqp = pKernel->jqp_; auto src_type_size = jqp.src_prc.size(); auto dst_type_size = jqp.dst_prc.size(); @@ -1691,15 +1827,20 @@ void FakeQuantize::executeQuantization(const std::unique_ptr(FQ_add_input_type::CROP_LOW)] ? &cropLow[0] : &cropLow[c]; - arg.crop_high = broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; - arg.input_scale = broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; - arg.input_shift = broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; - arg.output_scale = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; - arg.output_shift = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; - - arg.src_step = (size_t) blk_size * src_type_size; - arg.dst_step = (size_t) blk_size * dst_type_size; - arg.block_size = (size_t) blk_size; + arg.crop_high = + broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; + arg.input_scale = + broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; + arg.input_shift = + broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; + arg.output_scale = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; + arg.output_shift = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; + + arg.src_step = (size_t)blk_size * src_type_size; + arg.dst_step = (size_t)blk_size * dst_type_size; + arg.block_size = (size_t)blk_size; arg.work_amount = (size_t)H; (*pKernel)(&arg); @@ -1714,22 +1855,27 @@ void FakeQuantize::executeQuantization(const std::unique_ptr(FQ_add_input_type::CROP_LOW)] ? &cropLow[0] : &cropLow[c]; - arg.crop_high = broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; - arg.input_scale = broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; - arg.input_shift = broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; - arg.output_scale = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; - arg.output_shift = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; - - arg.src_step = is_blk_format ? (size_t) blk_size * src_type_size : (size_t) C * src_type_size; - arg.dst_step = is_blk_format ? (size_t) blk_size * dst_type_size : (size_t) C * dst_type_size; - arg.block_size = is_blk_format ? (size_t) blk_size : nstl::min(blk_size, C - c); + arg.crop_high = + broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; + arg.input_scale = + broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; + arg.input_shift = + broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; + arg.output_scale = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; + arg.output_shift = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; + + arg.src_step = is_blk_format ? (size_t)blk_size * src_type_size : (size_t)C * src_type_size; + arg.dst_step = is_blk_format ? (size_t)blk_size * dst_type_size : (size_t)C * dst_type_size; + arg.block_size = is_blk_format ? (size_t)blk_size : nstl::min(blk_size, C - c); arg.work_amount = (size_t)std::min(static_cast(batch_size), H * W - b * batch_size); (*pKernel)(&arg); @@ -1740,25 +1886,29 @@ void FakeQuantize::executeQuantization(const std::unique_ptr(FQ_add_input_type::CROP_LOW)] ? &cropLow[0] : &cropLow[c]; - arg.crop_high = broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; - arg.input_scale = broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; - arg.input_shift = broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; - arg.output_scale = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; - arg.output_shift = broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; - - arg.src_step = is_blk_format ? (size_t) blk_size * src_type_size : (size_t) C * src_type_size; - arg.dst_step = is_blk_format ? (size_t) blk_size * dst_type_size : (size_t) C * dst_type_size; - arg.block_size = (is_blk_format && srcDims.size() != 2) ? (size_t) blk_size : nstl::min(blk_size, C - c); - arg.work_amount = (size_t) W; + arg.crop_high = + broadcasted[static_cast(FQ_add_input_type::CROP_HIGH)] ? &cropHigh[0] : &cropHigh[c]; + arg.input_scale = + broadcasted[static_cast(FQ_add_input_type::INPUT_SCALE)] ? &inputScale[0] : &inputScale[c]; + arg.input_shift = + broadcasted[static_cast(FQ_add_input_type::INPUT_SHIFT)] ? &inputShift[0] : &inputShift[c]; + arg.output_scale = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SCALE)] ? &outputScale[0] : &outputScale[c]; + arg.output_shift = + broadcasted[static_cast(FQ_add_input_type::OUTPUT_SHIFT)] ? &outputShift[0] : &outputShift[c]; + + arg.src_step = is_blk_format ? (size_t)blk_size * src_type_size : (size_t)C * src_type_size; + arg.dst_step = is_blk_format ? (size_t)blk_size * dst_type_size : (size_t)C * dst_type_size; + arg.block_size = (is_blk_format && srcDims.size() != 2) ? (size_t)blk_size : nstl::min(blk_size, C - c); + arg.work_amount = (size_t)W; (*pKernel)(&arg); }); @@ -1778,7 +1928,7 @@ void FakeQuantize::execute(dnnl::stream strm) { } } -void FakeQuantize::initializePostOpData(const VectorDims &dims, const size_t bufferAlignment, bool doRounding) { +void FakeQuantize::initializePostOpData(const VectorDims& dims, const size_t bufferAlignment, bool doRounding) { if (postOpDataVersion == parameterVersion) return; @@ -1789,11 +1939,15 @@ void FakeQuantize::initializePostOpData(const VectorDims &dims, const size_t buf binarizationOutputMask.resize(axisPaddedSize, 0); if (isInputLowBroadcasted) { - std::fill(binarizationThresholds.begin() + 1, binarizationThresholds.begin() + realAxisSize, binarizationThresholds[0]); + std::fill(binarizationThresholds.begin() + 1, + binarizationThresholds.begin() + realAxisSize, + binarizationThresholds[0]); std::fill(binarizationThresholds.begin() + realAxisSize, binarizationThresholds.end(), 0.f); } if (isOutputHighBroadcasted) { - std::fill(binarizationOutputMask.begin() + 1, binarizationOutputMask.begin() + realAxisSize, binarizationOutputMask[0]); + std::fill(binarizationOutputMask.begin() + 1, + binarizationOutputMask.begin() + realAxisSize, + binarizationOutputMask[0]); std::fill(binarizationThresholds.begin() + realAxisSize, binarizationThresholds.end(), 0.f); } } else { @@ -1803,7 +1957,7 @@ void FakeQuantize::initializePostOpData(const VectorDims &dims, const size_t buf postOpDataVersion = parameterVersion; } -void FakeQuantize::initializePostOpDataLegacy(const VectorDims &dims, const size_t bufferAlignment) { +void FakeQuantize::initializePostOpDataLegacy(const VectorDims& dims, const size_t bufferAlignment) { if (legacyPostOpDataVersion == parameterVersion) return; @@ -1815,11 +1969,15 @@ void FakeQuantize::initializePostOpDataLegacy(const VectorDims &dims, const size binarizationOutputMask.resize(axisPaddedSize, 0); if (isInputLowBroadcasted) { - std::fill(binarizationThresholds.begin() + 1, binarizationThresholds.begin() + realAxisSize, binarizationThresholds[0]); + std::fill(binarizationThresholds.begin() + 1, + binarizationThresholds.begin() + realAxisSize, + binarizationThresholds[0]); std::fill(binarizationThresholds.begin() + realAxisSize, binarizationThresholds.end(), 0.f); } if (isOutputHighBroadcasted) { - std::fill(binarizationOutputMask.begin() + 1, binarizationOutputMask.begin() + realAxisSize, binarizationOutputMask[0]); + std::fill(binarizationOutputMask.begin() + 1, + binarizationOutputMask.begin() + realAxisSize, + binarizationOutputMask[0]); std::fill(binarizationThresholds.begin() + realAxisSize, binarizationThresholds.end(), 0.f); } @@ -1839,7 +1997,10 @@ void FakeQuantize::initializePostOpDataLegacy(const VectorDims &dims, const size legacyPostOpDataVersion = parameterVersion; } -void FakeQuantize::appendMemory(const size_t dataSize, const void *data, MemoryPtr &memPtr, std::vector& postOpsMem) { +void FakeQuantize::appendMemory(const size_t dataSize, + const void* data, + MemoryPtr& memPtr, + std::vector& postOpsMem) { if (!memPtr) { DnnlBlockedMemoryDesc memoryDesc(ov::element::f32, {dataSize}); memPtr = std::make_shared(getEngine(), memoryDesc, data); @@ -1848,12 +2009,15 @@ void FakeQuantize::appendMemory(const size_t dataSize, const void *data, MemoryP } } -void FakeQuantize::appendMemory(const size_t dataSize, const void *data, MemoryPtr &memPtr, std::vector& postOpsMem) { +void FakeQuantize::appendMemory(const size_t dataSize, + const void* data, + MemoryPtr& memPtr, + std::vector& postOpsMem) { postOpsMem.push_back(data); } template -void FakeQuantize::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem) { +void FakeQuantize::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims& postOpDims, std::vector& postOpsMem) { // try to map fakeQuantizeNode using output scale & eltwise first // if failed, fallback to append_quantization() @@ -1865,21 +2029,40 @@ void FakeQuantize::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &post initializePostOpDataLegacy(postOpDims, bufferAlignment); if (getAlgorithm() == Algorithm::FQBinarization) { - ops.append_binarization(dnnl::algorithm::binarization_depthwise, (const float*)&binarizationThresholds[0], (const float*)&binarizationOutputMask[0]); + ops.append_binarization(dnnl::algorithm::binarization_depthwise, + (const float*)&binarizationThresholds[0], + (const float*)&binarizationOutputMask[0]); } else { - dnnl::algorithm alg = getAlgorithm() == Algorithm::FQQuantization ? dnnl::algorithm::quantization_quantize : - dnnl::algorithm::quantization_quantize_dequantize; + dnnl::algorithm alg = getAlgorithm() == Algorithm::FQQuantization + ? dnnl::algorithm::quantization_quantize + : dnnl::algorithm::quantization_quantize_dequantize; - std::array per_channel = {cropLowSize > 1, cropHighSize > 1, inputScaleSize > 1, - inputShiftSize > 1, outputScaleSize > 1, outputShiftSize > 1}; + std::array per_channel = {cropLowSize > 1, + cropHighSize > 1, + inputScaleSize > 1, + inputShiftSize > 1, + outputScaleSize > 1, + outputShiftSize > 1}; std::array all_default = {false}; - all_default[0] = std::all_of(cropLow.cbegin(), cropLow.cend(), [](float val){ return val == 0.f; }); - all_default[1] = std::all_of(cropHigh.cbegin(), cropHigh.cend(), [](float val){ return val == 0.f; }); - all_default[2] = std::all_of(inputScale.cbegin(), inputScale.cend(), [](float val){ return val == 1.f; }); - all_default[3] = std::all_of(inputShift.cbegin(), inputShift.cend(), [](float val){ return val == 0.f; }); - all_default[4] = std::all_of(outputScale.cbegin(), outputScale.cend(), [](float val){ return val == 1.f; }); - all_default[5] = std::all_of(outputShift.cbegin(), outputShift.cend(), [](float val){ return val == 0.f; }); + all_default[0] = std::all_of(cropLow.cbegin(), cropLow.cend(), [](float val) { + return val == 0.f; + }); + all_default[1] = std::all_of(cropHigh.cbegin(), cropHigh.cend(), [](float val) { + return val == 0.f; + }); + all_default[2] = std::all_of(inputScale.cbegin(), inputScale.cend(), [](float val) { + return val == 1.f; + }); + all_default[3] = std::all_of(inputShift.cbegin(), inputShift.cend(), [](float val) { + return val == 0.f; + }); + all_default[4] = std::all_of(outputScale.cbegin(), outputScale.cend(), [](float val) { + return val == 1.f; + }); + all_default[5] = std::all_of(outputShift.cbegin(), outputShift.cend(), [](float val) { + return val == 0.f; + }); std::array offsets = {0}; offsets[1] = offsets[0] + cropLowSize; @@ -1894,7 +2077,9 @@ void FakeQuantize::appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &post } } -void FakeQuantize::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::unordered_map& postOpsMem, +void FakeQuantize::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, const int channelAxis) { std::vector postOpsMemPtrs; appendPostOpsImpl(ops, postOpDims, postOpsMemPtrs); @@ -1906,7 +2091,9 @@ void FakeQuantize::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDi } } -void FakeQuantize::appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, +void FakeQuantize::appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, const int channelAxis) { appendPostOpsImpl(ops, postOpDims, postOpsMem); } @@ -1957,7 +2144,7 @@ void FakeQuantize::updateOptimizedFormula(bool do_rounding) { // per-channel FQ. if (isPerTensor(inputShift, inputShift[0], 0.00005f)) { f.ish.resize(OC); - for (auto & v : f.ish) + for (auto& v : f.ish) v = inputShift[0]; } else { f.ish = inputShift; @@ -2115,7 +2302,7 @@ bool FakeQuantize::appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, return true; } -FakeQuantize::FakeQuantizeJitExecutor::FakeQuantizeJitExecutor(const jit_quantize_params &_jqp) { +FakeQuantize::FakeQuantizeJitExecutor::FakeQuantizeJitExecutor(const jit_quantize_params& _jqp) { #if defined(OPENVINO_ARCH_X86_64) bool isBinarization = _jqp.op_type == Algorithm::FQBinarization; if (mayiuse(cpu::x64::avx512_core)) { @@ -2157,6 +2344,6 @@ bool FakeQuantize::created() const { return getType() == Type::FakeQuantize; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/fake_quantize.h b/src/plugins/intel_cpu/src/nodes/fake_quantize.h index 62aea6092451a6..af34c0b91a1a7a 100644 --- a/src/plugins/intel_cpu/src/nodes/fake_quantize.h +++ b/src/plugins/intel_cpu/src/nodes/fake_quantize.h @@ -4,25 +4,17 @@ #pragma once -#include "common/primitive_attr.hpp" -#include "node.h" - #include + +#include "common/primitive_attr.hpp" #include "dnnl_postops_composer_legacy.h" +#include "node.h" namespace ov { namespace intel_cpu { namespace node { -enum class FQ_add_input_type { - CROP_LOW, - CROP_HIGH, - INPUT_SCALE, - INPUT_SHIFT, - OUTPUT_SCALE, - OUTPUT_SHIFT, - INPUTS_SIZE -}; +enum class FQ_add_input_type { CROP_LOW, CROP_HIGH, INPUT_SCALE, INPUT_SHIFT, OUTPUT_SCALE, OUTPUT_SHIFT, INPUTS_SIZE }; struct jit_quantize_params { bool is_planar; @@ -33,8 +25,8 @@ struct jit_quantize_params { Algorithm op_type; - int c; // need only for binarization - std::bitset(FQ_add_input_type::INPUTS_SIZE)> broadcasted; // need only for quantization + int c; // need only for binarization + std::bitset(FQ_add_input_type::INPUTS_SIZE)> broadcasted; // need only for quantization }; struct jit_quantize_call_args { @@ -57,9 +49,9 @@ struct jit_quantize_call_args { }; struct jit_uni_quantize_kernel { - void (*ker_)(const jit_quantize_call_args *); + void (*ker_)(const jit_quantize_call_args*); - void operator()(const jit_quantize_call_args *args) { + void operator()(const jit_quantize_call_args* args) { assert(ker_); ker_(args); } @@ -82,58 +74,116 @@ class FakeQuantize : public Node { void execute(dnnl::stream strm) override; void executeDynamicImpl(dnnl::stream strm) override; - size_t getAxis() const { return axis; } + size_t getAxis() const { + return axis; + } - bool isBinarization() const { return getAlgorithm() == Algorithm::FQBinarization; } + bool isBinarization() const { + return getAlgorithm() == Algorithm::FQBinarization; + } bool needPrepareParams() const override; void prepareParams() override; void createPrimitive() override; - const float* getBinarizationTresholdsPtr() const { return &binarizationThresholds[0]; } - const float* getBinarizationOutputMaskPtr() const { return reinterpret_cast(&binarizationOutputMask[0]); } - size_t getBinarizationTresholdsSize() const { return binarizationThresholds.size(); } - size_t getBinarizationOutputMaskSize() const { return binarizationOutputMask.size(); } + const float* getBinarizationTresholdsPtr() const { + return &binarizationThresholds[0]; + } + const float* getBinarizationOutputMaskPtr() const { + return reinterpret_cast(&binarizationOutputMask[0]); + } + size_t getBinarizationTresholdsSize() const { + return binarizationThresholds.size(); + } + size_t getBinarizationOutputMaskSize() const { + return binarizationOutputMask.size(); + } - const std::vector& getCropLow() const { return cropLow; } - const std::vector& getCropHigh() const { return cropHigh; } - const std::vector& getInputScale() const { return inputScale; } - const std::vector& getInputShift() const { return inputShift; } - const std::vector& getOutputScale() const { return outputScale; } - const std::vector& getOutputShift() const { return outputShift; } - const size_t getLevels() const { return levels; } + const std::vector& getCropLow() const { + return cropLow; + } + const std::vector& getCropHigh() const { + return cropHigh; + } + const std::vector& getInputScale() const { + return inputScale; + } + const std::vector& getInputShift() const { + return inputShift; + } + const std::vector& getOutputScale() const { + return outputScale; + } + const std::vector& getOutputShift() const { + return outputShift; + } + const size_t getLevels() const { + return levels; + } void setCropLow(std::vector newCropLow) { - cropLow = std::move(newCropLow); cropLowSize = cropLow.size(); ++parameterVersion; + cropLow = std::move(newCropLow); + cropLowSize = cropLow.size(); + ++parameterVersion; } void setCropHigh(std::vector newCropHigh) { - cropHigh = std::move(newCropHigh); cropHighSize = cropHigh.size(); ++parameterVersion; + cropHigh = std::move(newCropHigh); + cropHighSize = cropHigh.size(); + ++parameterVersion; } void setInputScale(std::vector newInputScale) { - inputScale = std::move(newInputScale); inputScaleSize = inputScale.size(); ++parameterVersion; + inputScale = std::move(newInputScale); + inputScaleSize = inputScale.size(); + ++parameterVersion; } void setInputShift(std::vector newInputShift) { - inputShift = std::move(newInputShift); inputShiftSize = inputShift.size(); ++parameterVersion; + inputShift = std::move(newInputShift); + inputShiftSize = inputShift.size(); + ++parameterVersion; } void setOutputScale(std::vector newOutputScale) { - outputScale = std::move(newOutputScale); outputScaleSize = outputScale.size(); ++parameterVersion; + outputScale = std::move(newOutputScale); + outputScaleSize = outputScale.size(); + ++parameterVersion; } void setOutputShift(std::vector newOutputShift) { - outputShift = std::move(newOutputShift); outputShiftSize = outputShift.size(); ++parameterVersion; + outputShift = std::move(newOutputShift); + outputShiftSize = outputShift.size(); + ++parameterVersion; } - const std::vector& getFQScales() const { return fqScales; } + const std::vector& getFQScales() const { + return fqScales; + } - bool isInputLowBroadcast() const { return isInputLowBroadcasted; } - bool isInputHighBroadcast() const { return isInputHighBroadcasted; } - bool isOutputLowBroadcast() const { return isOutputLowBroadcasted; } - bool isOutputHighBroadcast() const { return isOutputHighBroadcasted; } + bool isInputLowBroadcast() const { + return isInputLowBroadcasted; + } + bool isInputHighBroadcast() const { + return isInputHighBroadcasted; + } + bool isOutputLowBroadcast() const { + return isOutputLowBroadcasted; + } + bool isOutputHighBroadcast() const { + return isOutputHighBroadcasted; + } - ov::element::Type getInputPrecision() const { return inputPrecision; } - ov::element::Type getOutputPrecision() const { return outputPrecision; } + ov::element::Type getInputPrecision() const { + return inputPrecision; + } + ov::element::Type getOutputPrecision() const { + return outputPrecision; + } - void appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::unordered_map& postOpsMem, const int channelAxis = 1) override; - void appendPostOps(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem, const int channelAxis = 1) override; + void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::unordered_map& postOpsMem, + const int channelAxis = 1) override; + void appendPostOps(dnnl::post_ops& ops, + const VectorDims& postOpDims, + std::vector& postOpsMem, + const int channelAxis = 1) override; bool appendAttrPostOps(DnnlPostOpsComposerLegacy& dnnlpoc, bool isLastPostOp, dnnl::memory::data_type outDataType, @@ -143,12 +193,14 @@ class FakeQuantize : public Node { static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; enum BroadcastingPolicy { - PerChannel, // all FQ operations are per channel - PerTensor, // all FQ operations are per tensor - Mixed, // some per channel, some per tensor + PerChannel, // all FQ operations are per channel + PerTensor, // all FQ operations are per tensor + Mixed, // some per channel, some per tensor }; - BroadcastingPolicy getBroadcastingPolicy() const { return broadcastingPolicy; } + BroadcastingPolicy getBroadcastingPolicy() const { + return broadcastingPolicy; + } MemoryPtr cropLowMemory; MemoryPtr cropHighMemory; @@ -165,22 +217,22 @@ class FakeQuantize : public Node { using executorPtr = std::shared_ptr; executorPtr execPtr = nullptr; struct FakeQuantizeJitExecutor : public FakeQuantizeExecutor { - FakeQuantizeJitExecutor(const jit_quantize_params &_jqp); + FakeQuantizeJitExecutor(const jit_quantize_params& _jqp); void exec(const FakeQuantize& node) override; std::unique_ptr pKernel; }; void init() override; std::vector getDataFormats() const; - void initializePostOpData(const VectorDims &postOpDims, const size_t bufferAlignment, bool doRounding); - void initializePostOpDataLegacy(const VectorDims &dims, const size_t bufferAlignment); + void initializePostOpData(const VectorDims& postOpDims, const size_t bufferAlignment, bool doRounding); + void initializePostOpDataLegacy(const VectorDims& dims, const size_t bufferAlignment); void executeReference(); - void executeBinarization(const std::unique_ptr &pKernel) const; - void executeQuantization(const std::unique_ptr &pKernel) const; + void executeBinarization(const std::unique_ptr& pKernel) const; + void executeQuantization(const std::unique_ptr& pKernel) const; - void appendMemory(const size_t dataSize, const void *data, MemoryPtr &memPtr, std::vector& postOpsMem); - void appendMemory(const size_t dataSize, const void *data, MemoryPtr &memPtr, std::vector& postOpsMem); + void appendMemory(const size_t dataSize, const void* data, MemoryPtr& memPtr, std::vector& postOpsMem); + void appendMemory(const size_t dataSize, const void* data, MemoryPtr& memPtr, std::vector& postOpsMem); template - void appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims &postOpDims, std::vector& postOpsMem); + void appendPostOpsImpl(dnnl::post_ops& ops, const VectorDims& postOpDims, std::vector& postOpsMem); size_t levels = 0; @@ -273,6 +325,6 @@ class FakeQuantize : public Node { BroadcastingPolicy broadcastingPolicy; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/fullyconnected.cpp b/src/plugins/intel_cpu/src/nodes/fullyconnected.cpp index 0f5c46e8bcd7cd..2df6c0ae7522cc 100644 --- a/src/plugins/intel_cpu/src/nodes/fullyconnected.cpp +++ b/src/plugins/intel_cpu/src/nodes/fullyconnected.cpp @@ -13,6 +13,7 @@ #include "cpu_types.h" #include "dnnl_extension_utils.h" #include "executors/memory_arguments.hpp" +#include "fake_quantize.h" #include "graph_context.h" #include "input.h" #include "memory_desc/blocked_memory_desc.h" @@ -24,17 +25,15 @@ #include "openvino/core/type/element_type.hpp" #include "openvino/runtime/threading/cpu_message.hpp" #include "ov_ops/fully_connected.hpp" +#include "ov_ops/fully_connected_compressed.hpp" #include "ov_ops/fully_connected_quantized.hpp" #include "ov_ops/fully_connected_quantized_legacy.hpp" -#include "ov_ops/fully_connected_compressed.hpp" #include "post_ops.hpp" #include "shape_inference/custom/fullyconnected.hpp" #include "transformations/utils/utils.hpp" #include "utils/debug_capabilities.h" #include "utils/general_utils.h" -#include "fake_quantize.h" - using namespace dnnl; using namespace ov::element; @@ -61,7 +60,8 @@ bool FullyConnected::isSupportedOperation(const std::shared_ptr& if (ov::is_type(op)) { if (!ov::op::util::is_on_constant_path(op->input_value(WEIGHT_SCALES)) || !ov::op::util::is_on_constant_path(op->input_value(WEIGHT_ZERO_POINTS))) { - errorMessage = "Only Constant operation on 'weight scales', and 'weight zero points' inputs is supported"; + errorMessage = + "Only Constant operation on 'weight scales', and 'weight zero points' inputs is supported"; return false; } } @@ -137,19 +137,18 @@ FullyConnected::FullyConnected(const std::shared_ptr& op, const GraphC if (!isSupportedOperation(op, errorMessage)) OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); - m_atoi[ARG_SRC] = DATA; - m_atoi[ARG_WEI] = WEIGHTS; + m_atoi[ARG_SRC] = DATA; + m_atoi[ARG_WEI] = WEIGHTS; m_atoi[ARG_BIAS] = BIAS; auto mapArgToInput = [&op](std::unordered_map& argToInput, size_t argId, size_t inputId) { - if (op->get_input_size() > inputId && - op->input(inputId).get_element_type() != ov::element::undefined) { + if (op->get_input_size() > inputId && op->input(inputId).get_element_type() != ov::element::undefined) { argToInput[argId] = inputId; } }; if (ov::is_type(op)) { - mapArgToInput(m_atoi, ARG_WEI | ARG_ATTR_SCALES, WEIGHT_SCALES); + mapArgToInput(m_atoi, ARG_WEI | ARG_ATTR_SCALES, WEIGHT_SCALES); mapArgToInput(m_atoi, ARG_WEI | ARG_ATTR_ZERO_POINTS, WEIGHT_ZERO_POINTS); algorithm = Algorithm::FullyConnectedCompressed; } else if (ov::is_type(op)) { @@ -190,7 +189,8 @@ void FullyConnected::needPrepareParamsForTensorParallel() { dim += dims.size(); } OPENVINO_ASSERT(static_cast(dims[dim]) >= tp_cfg.w_size, - getName() + " dim[" + std::to_string(dim) + "] is " + std::to_string(dims[dim]) + ", which is larger than w_size " + std::to_string(tp_cfg.w_size)); + getName() + " dim[" + std::to_string(dim) + "] is " + std::to_string(dims[dim]) + + ", which is larger than w_size " + std::to_string(tp_cfg.w_size)); auto splited_dim_vec = split_parts(dims[dim], tp_cfg.w_size); VectorDims new_dims = std::move(dims); @@ -269,18 +269,34 @@ void FullyConnected::execTensorParallelSync() { for (int idx = 0; idx < tp_cfg.w_size; idx++) { if (wait_list[idx] > 0 && tp_cfg.sub_memory->_memorys_table[tp_cfg.id][idx].flag) { auto new_ptr = static_cast(tp_cfg.sub_memory->_memorys_table[tp_cfg.id][idx].send_buf); - const auto copySize = splited_dim_vec[idx] * prec.size(); // bytes of half selected dim. + const auto copySize = splited_dim_vec[idx] * prec.size(); // bytes of half selected dim. const size_t unloop = 8; size_t step = count / unloop; - parallel_for(step, [&](size_t i){ - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop) * channel_size, new_ptr + (i * unloop) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 1) * channel_size, new_ptr + (i * unloop + 1) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 2) * channel_size, new_ptr + (i * unloop + 2) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 3) * channel_size, new_ptr + (i * unloop + 3) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 4) * channel_size, new_ptr + (i * unloop + 4) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 5) * channel_size, new_ptr + (i * unloop + 5) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 6) * channel_size, new_ptr + (i * unloop + 6) * copySize, copySize); - cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 7) * channel_size, new_ptr + (i * unloop + 7) * copySize, copySize); + parallel_for(step, [&](size_t i) { + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop) * channel_size, + new_ptr + (i * unloop) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 1) * channel_size, + new_ptr + (i * unloop + 1) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 2) * channel_size, + new_ptr + (i * unloop + 2) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 3) * channel_size, + new_ptr + (i * unloop + 3) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 4) * channel_size, + new_ptr + (i * unloop + 4) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 5) * channel_size, + new_ptr + (i * unloop + 5) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 6) * channel_size, + new_ptr + (i * unloop + 6) * copySize, + copySize); + cpu_memcpy(dst_ptr + idx * strideSize + (i * unloop + 7) * channel_size, + new_ptr + (i * unloop + 7) * copySize, + copySize); }); size_t tail = count & ~(unloop - 1); for (size_t i = tail; i < count; ++i) { @@ -525,8 +541,10 @@ void FullyConnected::needSplitMemoryForTensorParallel() { memory[ARG_SRC] = getSrcMemoryAtPort(DATA); // wgt // split N direction - tp_cfg.cached_splited_weight = attrs.weightsNonTransposed ? split_vertical(context->getEngine(), std::move(wgt), 0, tp_cfg.w_rank, tp_cfg.w_size) - : split_horizontal(context->getEngine(), std::move(wgt), 0, tp_cfg.w_rank, tp_cfg.w_size); + tp_cfg.cached_splited_weight = + attrs.weightsNonTransposed + ? split_vertical(context->getEngine(), std::move(wgt), 0, tp_cfg.w_rank, tp_cfg.w_size) + : split_horizontal(context->getEngine(), std::move(wgt), 0, tp_cfg.w_rank, tp_cfg.w_size); memory[ARG_WEI] = tp_cfg.cached_splited_weight; // bias if (attrs.withBias) { @@ -539,21 +557,27 @@ void FullyConnected::needSplitMemoryForTensorParallel() { memory[ARG_BIAS] = tp_cfg.cached_splited_bias; // dst memory[ARG_DST] = getDstMemoryAtPort(0); - tp_cfg.cached_dst = split_horizontal(context->getEngine(), std::move(dst), -1, tp_cfg.w_rank, tp_cfg.w_size, false); + tp_cfg.cached_dst = + split_horizontal(context->getEngine(), std::move(dst), -1, tp_cfg.w_rank, tp_cfg.w_size, false); - memory[ARG_DST | ARG_ATTR_SCALES] = split_horizontal(context->getEngine(), memory[ARG_DST | ARG_ATTR_SCALES], 0, tp_cfg.w_rank, tp_cfg.w_size); + memory[ARG_DST | ARG_ATTR_SCALES] = + split_horizontal(context->getEngine(), memory[ARG_DST | ARG_ATTR_SCALES], 0, tp_cfg.w_rank, tp_cfg.w_size); auto scale_mem = std::const_pointer_cast(memory[ARG_WEI | ARG_ATTR_SCALES]); - memory[ARG_WEI | ARG_ATTR_SCALES] = attrs.weightsNonTransposed ? split_vertical(context->getEngine(), scale_mem, 0, tp_cfg.w_rank, tp_cfg.w_size) - : split_horizontal(context->getEngine(), scale_mem, 0, tp_cfg.w_rank, tp_cfg.w_size); + memory[ARG_WEI | ARG_ATTR_SCALES] = + attrs.weightsNonTransposed + ? split_vertical(context->getEngine(), scale_mem, 0, tp_cfg.w_rank, tp_cfg.w_size) + : split_horizontal(context->getEngine(), scale_mem, 0, tp_cfg.w_rank, tp_cfg.w_size); auto zeropoint_mem = std::const_pointer_cast(memory[ARG_WEI | ARG_ATTR_ZERO_POINTS]); auto element_num = zeropoint_mem->getSize() / zeropoint_mem->getPrecision().size(); if (element_num == 1) { tp_cfg.cached_zeropoint = zeropoint_mem; } else { - tp_cfg.cached_zeropoint = attrs.weightsNonTransposed ? split_vertical(context->getEngine(), zeropoint_mem, 0, tp_cfg.w_rank, tp_cfg.w_size) - : split_horizontal(context->getEngine(), zeropoint_mem, 0, tp_cfg.w_rank, tp_cfg.w_size); + tp_cfg.cached_zeropoint = + attrs.weightsNonTransposed + ? split_vertical(context->getEngine(), zeropoint_mem, 0, tp_cfg.w_rank, tp_cfg.w_size) + : split_horizontal(context->getEngine(), zeropoint_mem, 0, tp_cfg.w_rank, tp_cfg.w_size); } } } diff --git a/src/plugins/intel_cpu/src/nodes/fullyconnected.h b/src/plugins/intel_cpu/src/nodes/fullyconnected.h index 177edd3d426339..0b50d882c9e554 100644 --- a/src/plugins/intel_cpu/src/nodes/fullyconnected.h +++ b/src/plugins/intel_cpu/src/nodes/fullyconnected.h @@ -15,8 +15,8 @@ #include "cpu_memory.h" #include "nodes/executors/executor_factory.hpp" -#include "nodes/executors/memory_arguments.hpp" #include "nodes/executors/fullyconnected_config.hpp" +#include "nodes/executors/memory_arguments.hpp" #include "post_ops.hpp" namespace ov { @@ -105,7 +105,7 @@ class FullyConnected : public Node { static bool isConstantInput(const std::shared_ptr& op, InputId port); - std::unordered_map m_atoi; // memory argument id to input id + std::unordered_map m_atoi; // memory argument id to input id void fuseDecompressionConstant(const MemoryCPtr& memory, MemoryCPtr& decompressionValuesPtr); diff --git a/src/plugins/intel_cpu/src/nodes/gather.h b/src/plugins/intel_cpu/src/nodes/gather.h index 6ee097e9a1fbab..c20a56807b0165 100644 --- a/src/plugins/intel_cpu/src/nodes/gather.h +++ b/src/plugins/intel_cpu/src/nodes/gather.h @@ -5,12 +5,13 @@ #pragma once #include -#include "kernels/x64/gather_uni_kernel.hpp" #include #include #include +#include "kernels/x64/gather_uni_kernel.hpp" + namespace ov { namespace intel_cpu { namespace node { @@ -19,7 +20,7 @@ class Gather : public Node { public: Gather(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void createPrimitive() override; void execute(dnnl::stream strm) override; @@ -115,6 +116,6 @@ class Gather : public Node { std::shared_ptr jitKernel; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_elements.cpp b/src/plugins/intel_cpu/src/nodes/gather_elements.cpp index 8653bda8c483d3..d8f221dcebf34d 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_elements.cpp +++ b/src/plugins/intel_cpu/src/nodes/gather_elements.cpp @@ -2,23 +2,25 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "gather_elements.h" + #include -#include #include +#include + +#include "common/cpu_memcpy.h" #include "openvino/core/parallel.hpp" -#include "gather_elements.h" #include "openvino/opsets/opset1.hpp" #include "utils/general_utils.h" -#include "common/cpu_memcpy.h" namespace ov { namespace intel_cpu { namespace node { -bool GatherElements::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool GatherElements::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { - if (!one_of(op->get_type_info(), - ov::op::v6::GatherElements::get_type_info_static())) { + if (!one_of(op->get_type_info(), ov::op::v6::GatherElements::get_type_info_static())) { errorMessage = "Node is not an instance of the GatherElements operation from operation set v6."; return false; } @@ -88,8 +90,7 @@ void GatherElements::initSupportedPrimitiveDescriptors() { dataTypeSize_ = inDataPrecision.size(); - addSupportedPrimDesc({{LayoutType::ncsp, inDataPrecision}, - {LayoutType::ncsp, ov::element::i32}}, + addSupportedPrimDesc({{LayoutType::ncsp, inDataPrecision}, {LayoutType::ncsp, ov::element::i32}}, {{LayoutType::ncsp, inDataPrecision}}, impl_desc_type::ref_any); } @@ -100,9 +101,9 @@ void GatherElements::executeDynamicImpl(dnnl::stream strm) { template void GatherElements::directExecution() { - const auto *srcData = getSrcDataAtPortAs(dataIndex_); - const auto *indices = getSrcDataAtPortAs(indicesIndex_); - auto *dstData = getDstDataAtPortAs(0); + const auto* srcData = getSrcDataAtPortAs(dataIndex_); + const auto* indices = getSrcDataAtPortAs(indicesIndex_); + auto* dstData = getDstDataAtPortAs(0); const int outSize = getChildEdgeAt(0)->getMemory().getShape().getElementsCount(); auto threadBody = [&](const int ithr, const int nthr) { @@ -133,14 +134,14 @@ void GatherElements::directExecution() { void GatherElements::execute(dnnl::stream strm) { switch (dataTypeSize_) { - case sizeof(element_type_traits::value_type): - return directExecution::value_type>(); - case sizeof(element_type_traits::value_type): - return directExecution::value_type>(); - case sizeof(element_type_traits::value_type): - return directExecution::value_type>(); - default: - OPENVINO_THROW("Unsupported data type size"); + case sizeof(element_type_traits::value_type): + return directExecution::value_type>(); + case sizeof(element_type_traits::value_type): + return directExecution::value_type>(); + case sizeof(element_type_traits::value_type): + return directExecution::value_type>(); + default: + OPENVINO_THROW("Unsupported data type size"); } } @@ -148,6 +149,6 @@ bool GatherElements::created() const { return getType() == Type::GatherElements; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_elements.h b/src/plugins/intel_cpu/src/nodes/gather_elements.h index 3c2282401f7431..b050cd4e523490 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_elements.h +++ b/src/plugins/intel_cpu/src/nodes/gather_elements.h @@ -14,7 +14,7 @@ class GatherElements : public Node { public: GatherElements(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -40,6 +40,6 @@ class GatherElements : public Node { void directExecution(); }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_nd.cpp b/src/plugins/intel_cpu/src/nodes/gather_nd.cpp index 8c81f9b770a687..e962839e571663 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_nd.cpp +++ b/src/plugins/intel_cpu/src/nodes/gather_nd.cpp @@ -2,15 +2,17 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "gather_nd.h" + #include -#include +#include #include +#include + +#include "common/cpu_memcpy.h" #include "dnnl_types.h" #include "openvino/core/parallel.hpp" -#include "gather_nd.h" -#include #include "utils/general_utils.h" -#include "common/cpu_memcpy.h" #define THROW_ERROR(...) OPENVINO_THROW("GatherND layer with name '", getName(), "' ", __VA_ARGS__) @@ -20,7 +22,9 @@ namespace node { bool GatherND::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { try { - if (!one_of(op->get_type_info(), ov::op::v5::GatherND::get_type_info_static(), ov::op::v8::GatherND::get_type_info_static())) { + if (!one_of(op->get_type_info(), + ov::op::v5::GatherND::get_type_info_static(), + ov::op::v8::GatherND::get_type_info_static())) { errorMessage = "Node is not an instance of the GatherND operation from operation set v5 and v8."; return false; } @@ -70,12 +74,16 @@ void GatherND::initSupportedPrimitiveDescriptors() { ov::element::Type indicesPrecision = getOriginalInputPrecisionAtPort(GATHERND_INDEXES); if (!one_of(indicesPrecision, - ov::element::i32, ov::element::i64, ov::element::i16, ov::element::u16, ov::element::i8, ov::element::u8)) { + ov::element::i32, + ov::element::i64, + ov::element::i16, + ov::element::u16, + ov::element::i8, + ov::element::u8)) { THROW_ERROR("has unsupported 'indices' input precision: ", indicesPrecision); } - addSupportedPrimDesc({{LayoutType::ncsp, inDataPrecision}, - {LayoutType::ncsp, ov::element::i32}}, + addSupportedPrimDesc({{LayoutType::ncsp, inDataPrecision}, {LayoutType::ncsp, ov::element::i32}}, {{LayoutType::ncsp, inDataPrecision}}, impl_desc_type::ref_any); } @@ -96,24 +104,33 @@ void GatherND::prepareParams() { attrs.srcDims = srcMemPtr->getStaticDims(); attrs.srcStrides = srcMemPtr->getDescWithType()->getStrides(); attrs.dstElementCount = dstMemPtr->getShape().getElementsCount(); - attrs.sliceRank = idxMemPtr->getStaticDims().back(); + attrs.sliceRank = idxMemPtr->getStaticDims().back(); execPtr = std::make_shared(attrs); } -GatherND::GatherNDExecutor::GatherNDExecutor(const GatherNDAttributes& attrs) : sliceRank(attrs.sliceRank), dataSize(attrs.dataSize) { - batchSize = std::accumulate(attrs.srcDims.begin(), attrs.srcDims.begin() + attrs.batchDims, size_t(1), std::multiplies()); - dataLength = std::accumulate(attrs.srcDims.begin() + sliceRank + attrs.batchDims, attrs.srcDims.end(), size_t(1), +GatherND::GatherNDExecutor::GatherNDExecutor(const GatherNDAttributes& attrs) + : sliceRank(attrs.sliceRank), + dataSize(attrs.dataSize) { + batchSize = std::accumulate(attrs.srcDims.begin(), + attrs.srcDims.begin() + attrs.batchDims, + size_t(1), + std::multiplies()); + dataLength = std::accumulate(attrs.srcDims.begin() + sliceRank + attrs.batchDims, + attrs.srcDims.end(), + size_t(1), std::multiplies()); cycles = attrs.dstElementCount / (dataLength * batchSize); workAmount = batchSize * cycles; - srcBatchStride = std::accumulate(attrs.srcDims.begin() + attrs.batchDims, attrs.srcDims.end(), size_t(1), + srcBatchStride = std::accumulate(attrs.srcDims.begin() + attrs.batchDims, + attrs.srcDims.end(), + size_t(1), std::multiplies()); idxBatchStride = cycles * sliceRank; dstBatchStride = cycles * dataLength; srcShifts.resize(attrs.sliceRank, 0); - for (size_t i = 0; i < attrs.sliceRank ; i++) + for (size_t i = 0; i < attrs.sliceRank; i++) srcShifts[i] = attrs.srcStrides[i + attrs.batchDims] * (dataLength > 1 ? dataSize : 1); // optimized implementation 'blocks' via memcpy @@ -128,25 +145,33 @@ void GatherND::execute(dnnl::stream strm) { if (!execPtr) THROW_ERROR("has not compiled executor."); - execPtr->exec(getSrcMemoryAtPort(GATHERND_DATA), - getSrcMemoryAtPort(GATHERND_INDEXES), - getDstMemoryAtPort(0)); + execPtr->exec(getSrcMemoryAtPort(GATHERND_DATA), getSrcMemoryAtPort(GATHERND_INDEXES), getDstMemoryAtPort(0)); } -void GatherND::GatherNDExecutor::exec(const MemoryPtr& srcMemPtr, const MemoryPtr& idxMemPtr, const MemoryPtr& dstMemPtr) { +void GatherND::GatherNDExecutor::exec(const MemoryPtr& srcMemPtr, + const MemoryPtr& idxMemPtr, + const MemoryPtr& dstMemPtr) { if (dataLength > 1) { gatherBlocks(srcMemPtr, idxMemPtr, dstMemPtr); return; } - GatherNDContext ctx { this, srcMemPtr, idxMemPtr, dstMemPtr }; - OV_SWITCH(intel_cpu, GatherNDEmitter, ctx, dataSize, - OV_CASE(sizeof(element_type_traits::value_type), element_type_traits::value_type), - OV_CASE(sizeof(element_type_traits::value_type), element_type_traits::value_type), - OV_CASE(sizeof(element_type_traits::value_type), element_type_traits::value_type)); + GatherNDContext ctx{this, srcMemPtr, idxMemPtr, dstMemPtr}; + OV_SWITCH(intel_cpu, + GatherNDEmitter, + ctx, + dataSize, + OV_CASE(sizeof(element_type_traits::value_type), + element_type_traits::value_type), + OV_CASE(sizeof(element_type_traits::value_type), + element_type_traits::value_type), + OV_CASE(sizeof(element_type_traits::value_type), + element_type_traits::value_type)); } -void GatherND::GatherNDExecutor::gatherBlocks(const MemoryPtr& srcMemPtr, const MemoryPtr& idxMemPtr, const MemoryPtr& dstMemPtr) { +void GatherND::GatherNDExecutor::gatherBlocks(const MemoryPtr& srcMemPtr, + const MemoryPtr& idxMemPtr, + const MemoryPtr& dstMemPtr) { const uint8_t* srcData = srcMemPtr->getDataAs(); const int32_t* indices = idxMemPtr->getDataAs(); uint8_t* dstData = dstMemPtr->getDataAs(); @@ -183,7 +208,9 @@ void GatherND::GatherNDExecutor::gatherBlocks(const MemoryPtr& srcMemPtr, const } template -void GatherND::GatherNDExecutor::gatherElementwise(const MemoryPtr& srcMemPtr, const MemoryPtr& idxMemPtr, const MemoryPtr& dstMemPtr) { +void GatherND::GatherNDExecutor::gatherElementwise(const MemoryPtr& srcMemPtr, + const MemoryPtr& idxMemPtr, + const MemoryPtr& dstMemPtr) { const dataType* srcData = srcMemPtr->getDataAs(); const int32_t* indices = idxMemPtr->getDataAs(); dataType* dstData = dstMemPtr->getDataAs(); @@ -227,6 +254,6 @@ bool GatherND::created() const { return getType() == Type::GatherND; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_nd.h b/src/plugins/intel_cpu/src/nodes/gather_nd.h index ed643a2da08899..312cb465bf9e6c 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_nd.h +++ b/src/plugins/intel_cpu/src/nodes/gather_nd.h @@ -14,7 +14,7 @@ class GatherND : public Node { public: GatherND(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -65,7 +65,7 @@ class GatherND : public Node { MemoryPtr dstMemPtr; }; - template + template struct GatherNDEmitter { void operator()(GatherNDContext& ctx) { ctx.executor->gatherElementwise(ctx.srcMemPtr, ctx.idxMemPtr, ctx.dstMemPtr); @@ -80,6 +80,6 @@ class GatherND : public Node { executorPtr execPtr = nullptr; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_tree.cpp b/src/plugins/intel_cpu/src/nodes/gather_tree.cpp index 5834cd1e1048ba..2ff9a1ccdb8f59 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_tree.cpp +++ b/src/plugins/intel_cpu/src/nodes/gather_tree.cpp @@ -2,13 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "openvino/op/gather_tree.hpp" + +#include #include #include -#include -#include "openvino/op/gather_tree.hpp" -#include "openvino/core/parallel.hpp" #include "gather_tree.h" +#include "openvino/core/parallel.hpp" #include "utils/general_utils.h" namespace ov { @@ -59,11 +60,11 @@ void GatherTree::initSupportedPrimitiveDescriptors() { if (!one_of(precision, ov::element::f32, ov::element::i32)) precision = ov::element::f32; - if (getOriginalInputPrecisionAtPort(GATHER_TREE_PARENT_IDX) != precision || + if (getOriginalInputPrecisionAtPort(GATHER_TREE_PARENT_IDX) != precision || getOriginalInputPrecisionAtPort(GATHER_TREE_MAX_SEQ_LEN) != precision || - getOriginalInputPrecisionAtPort(GATHER_TREE_END_TOKEN) != precision || - getOriginalOutputPrecisionAtPort(0) != precision) { - OPENVINO_THROW(errorPrefix, " has incorrect input/output data precision. Must be the same."); + getOriginalInputPrecisionAtPort(GATHER_TREE_END_TOKEN) != precision || + getOriginalOutputPrecisionAtPort(0) != precision) { + OPENVINO_THROW(errorPrefix, " has incorrect input/output data precision. Must be the same."); } addSupportedPrimDesc({{LayoutType::ncsp, precision}, @@ -121,13 +122,15 @@ void GatherTree::executeDynamicImpl(dnnl::stream strm) { execute(strm); } -GatherTree::GatherTreeExecutor::GatherTreeExecutor(const VectorDims& stepIdxDims, const VectorDims& parentIdxDims, - const VectorDims& maxSeqLenDims, const VectorDims& dstDims) - : maxTime{static_cast(stepIdxDims[0])} - , batchSize{stepIdxDims[1]} - , beamWidth{stepIdxDims[2]} - , bbSize{batchSize * beamWidth} - , parentIdxSize{std::accumulate(parentIdxDims.cbegin(), parentIdxDims.cend(), 1lu, std::multiplies())} { +GatherTree::GatherTreeExecutor::GatherTreeExecutor(const VectorDims& stepIdxDims, + const VectorDims& parentIdxDims, + const VectorDims& maxSeqLenDims, + const VectorDims& dstDims) + : maxTime{static_cast(stepIdxDims[0])}, + batchSize{stepIdxDims[1]}, + beamWidth{stepIdxDims[2]}, + bbSize{batchSize * beamWidth}, + parentIdxSize{std::accumulate(parentIdxDims.cbegin(), parentIdxDims.cend(), 1lu, std::multiplies())} { if (maxTime != static_cast(parentIdxDims[0]) || maxTime != static_cast(dstDims[0]) || batchSize != parentIdxDims[1] || batchSize != dstDims[1] || batchSize != maxSeqLenDims[0] || beamWidth != parentIdxDims[2] || beamWidth != dstDims[2]) { @@ -136,14 +139,17 @@ GatherTree::GatherTreeExecutor::GatherTreeExecutor(const VectorDims& stepIdxDims } } -template -void GatherTree::GatherTreeExecutor::exec(const MemoryPtr& stepIdxMemPtr, const MemoryPtr& parentIdxMemPtr, - const MemoryPtr& maxSeqLenMemPtr, const MemoryPtr& endTokenMemPtr, const MemoryPtr& dstMemPtr) { - const auto *stepIdx = stepIdxMemPtr->getDataAs(); - const auto *parentIdx = parentIdxMemPtr->getDataAs(); - const auto *maxSeqLen = maxSeqLenMemPtr->getDataAs(); +template +void GatherTree::GatherTreeExecutor::exec(const MemoryPtr& stepIdxMemPtr, + const MemoryPtr& parentIdxMemPtr, + const MemoryPtr& maxSeqLenMemPtr, + const MemoryPtr& endTokenMemPtr, + const MemoryPtr& dstMemPtr) { + const auto* stepIdx = stepIdxMemPtr->getDataAs(); + const auto* parentIdx = parentIdxMemPtr->getDataAs(); + const auto* maxSeqLen = maxSeqLenMemPtr->getDataAs(); const auto endToken = (endTokenMemPtr->getDataAs())[0]; - auto *finalIdx = dstMemPtr->getDataAs(); + auto* finalIdx = dstMemPtr->getDataAs(); bool incorrectResult = false; parallel_for2d(batchSize, beamWidth, [&](size_t batch, size_t beam) { @@ -164,7 +170,7 @@ void GatherTree::GatherTreeExecutor::exec(const MemoryPtr& stepIdxMemPtr, const } bool finished = false; - auto *final = &finalIdx[batch * beamWidth + beam]; + auto* final = &finalIdx[batch * beamWidth + beam]; for (time = 0; time < maxSequenceInBeam; time++, final += bbSize) { if (finished) (*final) = endToken; @@ -184,6 +190,6 @@ bool GatherTree::created() const { return getType() == Type::GatherTree; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/gather_tree.h b/src/plugins/intel_cpu/src/nodes/gather_tree.h index 69d63f834b555d..9874fceb835ba5 100644 --- a/src/plugins/intel_cpu/src/nodes/gather_tree.h +++ b/src/plugins/intel_cpu/src/nodes/gather_tree.h @@ -14,7 +14,7 @@ class GatherTree : public Node { public: GatherTree(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -32,7 +32,7 @@ class GatherTree : public Node { const VectorDims& dstDims); ~GatherTreeExecutor() = default; - template + template void exec(const MemoryPtr& stepIdxMemPtr, const MemoryPtr& parentIdxMemPtr, const MemoryPtr& maxSeqLenMemPtr, @@ -60,6 +60,6 @@ class GatherTree : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/generate_proposals.cpp b/src/plugins/intel_cpu/src/nodes/generate_proposals.cpp index ae32e1e4729096..0ed50c7b0d73a8 100644 --- a/src/plugins/intel_cpu/src/nodes/generate_proposals.cpp +++ b/src/plugins/intel_cpu/src/nodes/generate_proposals.cpp @@ -2,22 +2,22 @@ // SPDX-License-Identifier: Apache-2.0 // -#include +#include #include #include +#include #include -#include #include -#include +#include #if defined(HAVE_AVX2) -#include +# include #endif -#include "openvino/op/generate_proposals.hpp" -#include "openvino/core/parallel.hpp" #include "common/cpu_memcpy.h" #include "generate_proposals.h" +#include "openvino/core/parallel.hpp" +#include "openvino/op/generate_proposals.hpp" #include "shape_inference/shape_inference_internal_dyn.hpp" namespace ov { @@ -30,21 +30,29 @@ struct Indexer4d { int dim23_; int dim123_; - explicit Indexer4d(int dim0, int dim1, int dim2, int dim3): - dim3_(dim3), dim23_(dim2 * dim3), dim123_(dim1 * dim2 * dim3) { + explicit Indexer4d(int dim0, int dim1, int dim2, int dim3) + : dim3_(dim3), + dim23_(dim2 * dim3), + dim123_(dim1 * dim2 * dim3) { (void)dim0; } int operator()(int i, int j, int k, int n) const { - return i * dim123_ + j * dim23_ + k * dim3_ + n; + return i * dim123_ + j * dim23_ + k * dim3_ + n; } }; - -void refine_anchors(const float* deltas, const float* scores, const float* anchors, - float* proposals, const int anchors_num, const int bottom_H, - const int bottom_W, const float img_H, const float img_W, - const float min_box_H, const float min_box_W, +void refine_anchors(const float* deltas, + const float* scores, + const float* anchors, + float* proposals, + const int anchors_num, + const int bottom_H, + const int bottom_W, + const float img_H, + const float img_W, + const float min_box_H, + const float min_box_W, const float max_delta_log_wh, float coordinates_offset) { Indexer4d delta_idx(anchors_num, 4, bottom_H, bottom_W); @@ -111,18 +119,23 @@ void refine_anchors(const float* deltas, const float* scores, const float* ancho void unpack_boxes(const float* p_proposals, float* unpacked_boxes, int* is_dead, int pre_nms_topn) { parallel_for(pre_nms_topn, [&](size_t i) { - unpacked_boxes[0*pre_nms_topn + i] = p_proposals[6*i + 0]; - unpacked_boxes[1*pre_nms_topn + i] = p_proposals[6*i + 1]; - unpacked_boxes[2*pre_nms_topn + i] = p_proposals[6*i + 2]; - unpacked_boxes[3*pre_nms_topn + i] = p_proposals[6*i + 3]; - unpacked_boxes[4*pre_nms_topn + i] = p_proposals[6*i + 4]; - is_dead[i] = (p_proposals[6*i + 5] == 1.0) ? 0 : 1; + unpacked_boxes[0 * pre_nms_topn + i] = p_proposals[6 * i + 0]; + unpacked_boxes[1 * pre_nms_topn + i] = p_proposals[6 * i + 1]; + unpacked_boxes[2 * pre_nms_topn + i] = p_proposals[6 * i + 2]; + unpacked_boxes[3 * pre_nms_topn + i] = p_proposals[6 * i + 3]; + unpacked_boxes[4 * pre_nms_topn + i] = p_proposals[6 * i + 4]; + is_dead[i] = (p_proposals[6 * i + 5] == 1.0) ? 0 : 1; }); } -void nms_cpu(const int num_boxes, int is_dead[], - const float* boxes, int index_out[], size_t* const num_out, - const int base_index, const float nms_thresh, const int max_num_out, +void nms_cpu(const int num_boxes, + int is_dead[], + const float* boxes, + int index_out[], + size_t* const num_out, + const int base_index, + const float nms_thresh, + const int max_num_out, float coordinates_offset) { const int num_proposals = num_boxes; size_t count = 0; @@ -133,9 +146,9 @@ void nms_cpu(const int num_boxes, int is_dead[], const float* y1 = boxes + 3 * num_proposals; #if defined(HAVE_AVX2) - __m256 vc_fone = _mm256_set1_ps(coordinates_offset); + __m256 vc_fone = _mm256_set1_ps(coordinates_offset); __m256i vc_ione = _mm256_set1_epi32(1); - __m256 vc_zero = _mm256_set1_ps(0.0f); + __m256 vc_zero = _mm256_set1_ps(0.0f); __m256 vc_nms_thresh = _mm256_set1_ps(nms_thresh); #endif @@ -156,13 +169,13 @@ void nms_cpu(const int num_boxes, int is_dead[], __m256 vx1i = _mm256_set1_ps(x1[box]); __m256 vy1i = _mm256_set1_ps(y1[box]); - __m256 vA_width = _mm256_sub_ps(vx1i, vx0i); + __m256 vA_width = _mm256_sub_ps(vx1i, vx0i); __m256 vA_height = _mm256_sub_ps(vy1i, vy0i); - __m256 vA_area = _mm256_mul_ps(_mm256_add_ps(vA_width, vc_fone), _mm256_add_ps(vA_height, vc_fone)); + __m256 vA_area = _mm256_mul_ps(_mm256_add_ps(vA_width, vc_fone), _mm256_add_ps(vA_height, vc_fone)); for (; tail <= num_boxes - 8; tail += 8) { - __m256i *pdst = reinterpret_cast<__m256i*>(is_dead + tail); - __m256i vdst = _mm256_loadu_si256(pdst); + __m256i* pdst = reinterpret_cast<__m256i*>(is_dead + tail); + __m256i vdst = _mm256_loadu_si256(pdst); __m256 vx0j = _mm256_loadu_ps(x0 + tail); __m256 vy0j = _mm256_loadu_ps(y0 + tail); @@ -174,13 +187,13 @@ void nms_cpu(const int num_boxes, int is_dead[], __m256 vx1 = _mm256_min_ps(vx1i, vx1j); __m256 vy1 = _mm256_min_ps(vy1i, vy1j); - __m256 vwidth = _mm256_add_ps(_mm256_sub_ps(vx1, vx0), vc_fone); + __m256 vwidth = _mm256_add_ps(_mm256_sub_ps(vx1, vx0), vc_fone); __m256 vheight = _mm256_add_ps(_mm256_sub_ps(vy1, vy0), vc_fone); __m256 varea = _mm256_mul_ps(_mm256_max_ps(vc_zero, vwidth), _mm256_max_ps(vc_zero, vheight)); - __m256 vB_width = _mm256_sub_ps(vx1j, vx0j); + __m256 vB_width = _mm256_sub_ps(vx1j, vx0j); __m256 vB_height = _mm256_sub_ps(vy1j, vy0j); - __m256 vB_area = _mm256_mul_ps(_mm256_add_ps(vB_width, vc_fone), _mm256_add_ps(vB_height, vc_fone)); + __m256 vB_area = _mm256_mul_ps(_mm256_add_ps(vB_width, vc_fone), _mm256_add_ps(vB_height, vc_fone)); __m256 vdivisor = _mm256_sub_ps(_mm256_add_ps(vA_area, vB_area), varea); __m256 vintersection_area = _mm256_div_ps(varea, vdivisor); @@ -221,9 +234,9 @@ void nms_cpu(const int num_boxes, int is_dead[], const float y1 = std::min(y1i, y1j); // intersection area - const float width = std::max(0.0f, x1 - x0 + coordinates_offset); - const float height = std::max(0.0f, y1 - y0 + coordinates_offset); - const float area = width * height; + const float width = std::max(0.0f, x1 - x0 + coordinates_offset); + const float height = std::max(0.0f, y1 - y0 + coordinates_offset); + const float area = width * height; // area of A, B const float A_area = (x1i - x0i + coordinates_offset) * (y1i - y0i + coordinates_offset); @@ -241,16 +254,20 @@ void nms_cpu(const int num_boxes, int is_dead[], *num_out = count; } - -void fill_output_blobs(const float* proposals, const int* roi_indices, - float* rois, float* scores, uint8_t* roi_num, - const int num_proposals, const size_t num_rois, const int post_nms_topn, +void fill_output_blobs(const float* proposals, + const int* roi_indices, + float* rois, + float* scores, + uint8_t* roi_num, + const int num_proposals, + const size_t num_rois, + const int post_nms_topn, ov::element::Type roi_num_type) { - const float *src_x0 = proposals + 0 * num_proposals; - const float *src_y0 = proposals + 1 * num_proposals; - const float *src_x1 = proposals + 2 * num_proposals; - const float *src_y1 = proposals + 3 * num_proposals; - const float *src_score = proposals + 4 * num_proposals; + const float* src_x0 = proposals + 0 * num_proposals; + const float* src_y0 = proposals + 1 * num_proposals; + const float* src_x1 = proposals + 2 * num_proposals; + const float* src_y1 = proposals + 3 * num_proposals; + const float* src_score = proposals + 4 * num_proposals; parallel_for(num_rois, [&](size_t i) { int index = roi_indices[i]; @@ -274,8 +291,8 @@ void fill_output_blobs(const float* proposals, const int* roi_indices, } // namespace -bool GenerateProposals::isSupportedOperation - (const std::shared_ptr& op, std::string& errorMessage) noexcept { +bool GenerateProposals::isSupportedOperation(const std::shared_ptr& op, + std::string& errorMessage) noexcept { try { if (!ov::as_type_ptr(op)) { errorMessage = "Node is not an instance of the Proposal from the operations set v0."; @@ -332,13 +349,13 @@ void GenerateProposals::execute(dnnl::stream strm) { } size_t anchor_dims_size = 1; - const auto &anchorDims = getParentEdgeAt(INPUT_ANCHORS)->getMemory().getStaticDims(); + const auto& anchorDims = getParentEdgeAt(INPUT_ANCHORS)->getMemory().getStaticDims(); for (size_t i = 0; i < anchorDims.size(); i++) { anchor_dims_size *= anchorDims[i]; } size_t deltas_dims_size = 1; - const auto &deltaDims = getParentEdgeAt(INPUT_DELTAS)->getMemory().getStaticDims(); + const auto& deltaDims = getParentEdgeAt(INPUT_DELTAS)->getMemory().getStaticDims(); for (size_t i = 1; i < deltaDims.size(); i++) { deltas_dims_size *= deltaDims[i]; } @@ -346,7 +363,7 @@ void GenerateProposals::execute(dnnl::stream strm) { OPENVINO_THROW("'Anchors' blob size for GenerateProposals is incompatible with 'deltas' blob size!"); size_t score_dims_size = 1; - const auto &scoreDims = getParentEdgeAt(INPUT_SCORES)->getMemory().getStaticDims(); + const auto& scoreDims = getParentEdgeAt(INPUT_SCORES)->getMemory().getStaticDims(); for (size_t i = 1; i < scoreDims.size(); i++) { score_dims_size *= scoreDims[i]; } @@ -354,16 +371,16 @@ void GenerateProposals::execute(dnnl::stream strm) { OPENVINO_THROW("'Deltas' blob size for GenerateProposals is incompatible with 'scores' blob size!"); size_t im_info_dims_size = 1; - const auto &infoDims = getParentEdgeAt(INPUT_IM_INFO)->getMemory().getStaticDims(); + const auto& infoDims = getParentEdgeAt(INPUT_IM_INFO)->getMemory().getStaticDims(); for (size_t i = 1; i < infoDims.size(); i++) { im_info_dims_size *= infoDims[i]; } // Prepare memory - const float *p_deltas_item = getSrcDataAtPortAs(INPUT_DELTAS); - const float *p_scores_item = getSrcDataAtPortAs(INPUT_SCORES); - const float *p_anchors_item = getSrcDataAtPortAs(INPUT_ANCHORS); - const float *p_img_info_cpu = getSrcDataAtPortAs(INPUT_IM_INFO); + const float* p_deltas_item = getSrcDataAtPortAs(INPUT_DELTAS); + const float* p_scores_item = getSrcDataAtPortAs(INPUT_SCORES); + const float* p_anchors_item = getSrcDataAtPortAs(INPUT_ANCHORS); + const float* p_img_info_cpu = getSrcDataAtPortAs(INPUT_IM_INFO); const int anchors_num = scoreDims[1]; @@ -422,27 +439,50 @@ void GenerateProposals::execute(dnnl::stream strm) { const float min_box_H = min_size_ * scale_h; const float min_box_W = min_size_ * scale_w; - refine_anchors(p_deltas_item, p_scores_item, p_anchors_item, - reinterpret_cast(&proposals_[0]), anchors_num, bottom_H, - bottom_W, img_H, img_W, - min_box_H, min_box_W, + refine_anchors(p_deltas_item, + p_scores_item, + p_anchors_item, + reinterpret_cast(&proposals_[0]), + anchors_num, + bottom_H, + bottom_W, + img_H, + img_W, + min_box_H, + min_box_W, static_cast(std::log(1000. / 16.)), coordinates_offset_); - std::partial_sort(proposals_.begin(), proposals_.begin() + pre_nms_topn, proposals_.end(), - [](const ProposalBox &struct1, const ProposalBox &struct2) { + std::partial_sort(proposals_.begin(), + proposals_.begin() + pre_nms_topn, + proposals_.end(), + [](const ProposalBox& struct1, const ProposalBox& struct2) { return (struct1.score > struct2.score); }); - unpack_boxes(reinterpret_cast(&proposals_[0]), &unpacked_boxes[0], &is_dead[0], pre_nms_topn); - nms_cpu(pre_nms_topn, &is_dead[0], &unpacked_boxes[0], &roi_indices_[0], &num_rois, 0, - nms_thresh_, post_nms_topn_, coordinates_offset_); + unpack_boxes(reinterpret_cast(&proposals_[0]), &unpacked_boxes[0], &is_dead[0], pre_nms_topn); + nms_cpu(pre_nms_topn, + &is_dead[0], + &unpacked_boxes[0], + &roi_indices_[0], + &num_rois, + 0, + nms_thresh_, + post_nms_topn_, + coordinates_offset_); size_t new_num_rois = total_num_rois + num_rois; roi_item.resize(new_num_rois * 4); score_item.resize(new_num_rois); - fill_output_blobs(&unpacked_boxes[0], &roi_indices_[0], &roi_item[total_num_rois * 4], &score_item[total_num_rois], - p_roi_num, pre_nms_topn, num_rois, post_nms_topn_, roi_num_type); + fill_output_blobs(&unpacked_boxes[0], + &roi_indices_[0], + &roi_item[total_num_rois * 4], + &score_item[total_num_rois], + p_roi_num, + pre_nms_topn, + num_rois, + post_nms_topn_, + roi_num_type); p_deltas_item += deltas_dims_size; p_scores_item += score_dims_size; p_img_info_cpu += im_info_dims_size; @@ -451,13 +491,13 @@ void GenerateProposals::execute(dnnl::stream strm) { } // copy to out memory redefineOutputMemory({VectorDims{total_num_rois, 4}, VectorDims{total_num_rois}, VectorDims{batch_size}}); - float *p_roi_item = getDstDataAtPortAs(OUTPUT_ROIS); - float *p_roi_score_item = getDstDataAtPortAs(OUTPUT_SCORES); + float* p_roi_item = getDstDataAtPortAs(OUTPUT_ROIS); + float* p_roi_score_item = getDstDataAtPortAs(OUTPUT_SCORES); uint8_t* p_roi_num_item = getDstDataAtPortAs(OUTPUT_ROI_NUM); memcpy(p_roi_item, &roi_item[0], roi_item.size() * sizeof(float)); memcpy(p_roi_score_item, &score_item[0], score_item.size() * sizeof(float)); memcpy(p_roi_num_item, &roi_num[0], getDstMemoryAtPort(OUTPUT_ROI_NUM)->getSize()); - } catch (const std::exception &e) { + } catch (const std::exception& e) { std::string errorMsg = e.what(); OPENVINO_THROW(errorMsg); } @@ -475,6 +515,6 @@ bool GenerateProposals::needPrepareParams() const { return false; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/generate_proposals.h b/src/plugins/intel_cpu/src/nodes/generate_proposals.h index 5438f30011d986..666338eed3d4aa 100644 --- a/src/plugins/intel_cpu/src/nodes/generate_proposals.h +++ b/src/plugins/intel_cpu/src/nodes/generate_proposals.h @@ -14,7 +14,7 @@ class GenerateProposals : public Node { public: GenerateProposals(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -35,13 +35,13 @@ class GenerateProposals : public Node { // scores, shape [rois_num] // roi_num, shape [N] - const int INPUT_IM_INFO {0}; - const int INPUT_ANCHORS {1}; - const int INPUT_DELTAS {2}; - const int INPUT_SCORES {3}; - const int OUTPUT_ROIS {0}; - const int OUTPUT_SCORES {1}; - const int OUTPUT_ROI_NUM {2}; + const int INPUT_IM_INFO{0}; + const int INPUT_ANCHORS{1}; + const int INPUT_DELTAS{2}; + const int INPUT_SCORES{3}; + const int OUTPUT_ROIS{0}; + const int OUTPUT_SCORES{1}; + const int OUTPUT_ROI_NUM{2}; float min_size_ = 0.f; int pre_nms_topn_ = 0; @@ -52,6 +52,6 @@ class GenerateProposals : public Node { std::vector roi_indices_; }; -} // namespace node +} // namespace node } // namespace intel_cpu } // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/grid_sample.cpp b/src/plugins/intel_cpu/src/nodes/grid_sample.cpp index c8b73360539b68..9f346a2db14dac 100644 --- a/src/plugins/intel_cpu/src/nodes/grid_sample.cpp +++ b/src/plugins/intel_cpu/src/nodes/grid_sample.cpp @@ -3,15 +3,16 @@ // #include "grid_sample.hpp" -#include "openvino/op/grid_sample.hpp" + #include "openvino/core/parallel.hpp" +#include "openvino/op/grid_sample.hpp" using namespace ov::intel_cpu; using namespace ov::intel_cpu::node; #if defined(OPENVINO_ARCH_X86_64) using namespace dnnl::impl::cpu; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 #define THROW_ERROR(...) OPENVINO_THROW(getTypeStr(), " node with name '", getName(), "' ", __VA_ARGS__) @@ -28,7 +29,7 @@ bool GridSample::isSupportedOperation(const std::shared_ptr& op, } #else return false; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 } catch (...) { return false; } @@ -61,30 +62,30 @@ GridSample::GridSample(const std::shared_ptr& op, const GraphContext:: const auto& attributes = ov::as_type_ptr(op)->get_attributes(); alignCorners = attributes.align_corners; switch (attributes.mode) { - case op::v9::GridSample::InterpolationMode::BILINEAR: - interpolationMode = GridSampleInterpolationMode::BILINEAR; - break; - case op::v9::GridSample::InterpolationMode::BICUBIC: - interpolationMode = GridSampleInterpolationMode::BICUBIC; - break; - case op::v9::GridSample::InterpolationMode::NEAREST: - interpolationMode = GridSampleInterpolationMode::NEAREST; - break; - default: - THROW_CPU_NODE_ERR("supports only BILINEAR, BICUBIC, NEAREST interpolation modes."); + case op::v9::GridSample::InterpolationMode::BILINEAR: + interpolationMode = GridSampleInterpolationMode::BILINEAR; + break; + case op::v9::GridSample::InterpolationMode::BICUBIC: + interpolationMode = GridSampleInterpolationMode::BICUBIC; + break; + case op::v9::GridSample::InterpolationMode::NEAREST: + interpolationMode = GridSampleInterpolationMode::NEAREST; + break; + default: + THROW_CPU_NODE_ERR("supports only BILINEAR, BICUBIC, NEAREST interpolation modes."); } switch (attributes.padding_mode) { - case op::v9::GridSample::PaddingMode::ZEROS: - paddingMode = GridSamplePaddingMode::ZEROS; - break; - case op::v9::GridSample::PaddingMode::BORDER: - paddingMode = GridSamplePaddingMode::BORDER; - break; - case op::v9::GridSample::PaddingMode::REFLECTION: - paddingMode = GridSamplePaddingMode::REFLECTION; - break; - default: - THROW_CPU_NODE_ERR("supports only BORDER, REFLECTION, ZEROS paddings modes."); + case op::v9::GridSample::PaddingMode::ZEROS: + paddingMode = GridSamplePaddingMode::ZEROS; + break; + case op::v9::GridSample::PaddingMode::BORDER: + paddingMode = GridSamplePaddingMode::BORDER; + break; + case op::v9::GridSample::PaddingMode::REFLECTION: + paddingMode = GridSamplePaddingMode::REFLECTION; + break; + default: + THROW_CPU_NODE_ERR("supports only BORDER, REFLECTION, ZEROS paddings modes."); } } @@ -107,8 +108,7 @@ void GridSample::initSupportedPrimitiveDescriptors() { } // 95905 - to add nspc layout support. - addSupportedPrimDesc({{LayoutType::ncsp, dataPrecision}, - {LayoutType::ncsp, gridPrecision}}, + addSupportedPrimDesc({{LayoutType::ncsp, dataPrecision}, {LayoutType::ncsp, gridPrecision}}, {{LayoutType::ncsp, dataPrecision}}, implType); } @@ -116,25 +116,26 @@ void GridSample::initSupportedPrimitiveDescriptors() { void GridSample::createPrimitive() { kernel::GridSampleKernelConfParams jcp; - jcp.inDataPrc = dataPrecision; - jcp.gridPrc = gridPrecision; + jcp.inDataPrc = dataPrecision; + jcp.gridPrc = gridPrecision; jcp.dynamicShapes = isDynamicNode(); - jcp.alignCorners = alignCorners; + jcp.alignCorners = alignCorners; jcp.interpolationMode = interpolationMode; - jcp.paddingMode = paddingMode; + jcp.paddingMode = paddingMode; const auto& srcDataDims = getInputShapeAtPort(IN_DATA).getDims(); if (!jcp.dynamicShapes) { - jcp.batchNum = srcDataDims[0]; - jcp.cannelNum = srcDataDims[1]; - jcp.dynamicBatch = false; + jcp.batchNum = srcDataDims[0]; + jcp.cannelNum = srcDataDims[1]; + jcp.dynamicBatch = false; jcp.dynamicChannel = false; - jcp.srcBatchStepB = std::accumulate(srcDataDims.begin() + 1, srcDataDims.end(), dataTypeSize, std::multiplies()); + jcp.srcBatchStepB = + std::accumulate(srcDataDims.begin() + 1, srcDataDims.end(), dataTypeSize, std::multiplies()); } else { - jcp.dynamicBatch = srcDataDims[0] == Shape::UNDEFINED_DIM; - jcp.batchNum = jcp.dynamicBatch ? 1lu : srcDataDims[0]; + jcp.dynamicBatch = srcDataDims[0] == Shape::UNDEFINED_DIM; + jcp.batchNum = jcp.dynamicBatch ? 1lu : srcDataDims[0]; jcp.dynamicChannel = srcDataDims[1] == Shape::UNDEFINED_DIM; - jcp.cannelNum = jcp.dynamicChannel ? 1lu : srcDataDims[1]; + jcp.cannelNum = jcp.dynamicChannel ? 1lu : srcDataDims[1]; } if (x64::mayiuse(x64::avx512_core)) { @@ -195,7 +196,7 @@ void GridSample::prepareParams() { const uint64_t dataElPerVec = jitKernel->getDataElPerVec(); const auto& srcDataShape = dataMemPtr->getStaticDims(); - const auto& dstShape = dstMemPtr->getStaticDims(); + const auto& dstShape = dstMemPtr->getStaticDims(); const uint64_t totalWork = dstShape[2] * dstShape[3]; const uint64_t wpt = ((totalWork / dataElPerVec) / m_threads_num + 1) * dataElPerVec; @@ -210,26 +211,27 @@ void GridSample::prepareParams() { return; } - p.batchNum = srcDataShape[0]; - p.channelsNum = srcDataShape[1]; + p.batchNum = srcDataShape[0]; + p.channelsNum = srcDataShape[1]; p.srcHeightF[0] = srcDataShape[2]; - p.srcWidthF[0] = srcDataShape[3]; + p.srcWidthF[0] = srcDataShape[3]; p.gridStartB = dstStart * 2 * gridTypeSize; - p.dstStartB = dstStart * dataTypeSize; + p.dstStartB = dstStart * dataTypeSize; - p.srcBatchStepB = std::accumulate(srcDataShape.begin() + 1, srcDataShape.end(), dataTypeSize, std::multiplies()); + p.srcBatchStepB = + std::accumulate(srcDataShape.begin() + 1, srcDataShape.end(), dataTypeSize, std::multiplies()); p.gridBatchStepB = (dstShape[2] * dstShape[3] - p.workAmount) * 2 * gridTypeSize; - p.dstBatchStepB = (dstShape[1] * dstShape[2] * dstShape[3] - p.workAmount) * dataTypeSize; + p.dstBatchStepB = (dstShape[1] * dstShape[2] * dstShape[3] - p.workAmount) * dataTypeSize; p.srcChannelStepB = srcDataShape[2] * srcDataShape[3] * dataTypeSize; p.dstChannelStepB = dstShape[2] * dstShape[3] * dataTypeSize; p.dataTypeSize[0] = dataTypeSize; p.srcHeightSub1F[0] = p.srcHeightF[0] - 1.f; - p.srcWidthSub1F[0] = p.srcWidthF[0] - 1.f; + p.srcWidthSub1F[0] = p.srcWidthF[0] - 1.f; p.srcHeightMul2F[0] = p.srcHeightF[0] * 2.f; - p.srcWidthMul2F[0] = p.srcWidthF[0] * 2.f; + p.srcWidthMul2F[0] = p.srcWidthF[0] * 2.f; if (interpolationMode == GridSampleInterpolationMode::BICUBIC && srcDataShape[3] >= 4) { p.srcWidthB[0] = (srcDataShape[3] - 3) * dataTypeSize; } else { @@ -237,24 +239,24 @@ void GridSample::prepareParams() { } if (alignCorners) { p.srcHeightMul2Sub1F[0] = p.srcHeightF[0] == 1.f ? 1.f : p.srcHeightSub1F[0] * 2.f; - p.srcWidthMul2Sub1F[0] = p.srcWidthF[0] == 1.f ? 1.f : p.srcWidthSub1F[0] * 2.f; - p.wDenormCoefF[0] = (p.srcWidthF[0] - 1.f) / 2.f; + p.srcWidthMul2Sub1F[0] = p.srcWidthF[0] == 1.f ? 1.f : p.srcWidthSub1F[0] * 2.f; + p.wDenormCoefF[0] = (p.srcWidthF[0] - 1.f) / 2.f; p.hDenormCoefF[0] = (p.srcHeightF[0] - 1.f) / 2.f; } else { p.srcHeightMul2Sub1F[0] = p.srcHeightMul2F[0] - 1.f; - p.srcWidthMul2Sub1F[0] = p.srcWidthMul2F[0] - 1.f; + p.srcWidthMul2Sub1F[0] = p.srcWidthMul2F[0] - 1.f; } if (!x64::mayiuse(x64::avx512_core)) { - std::fill(p.srcHeightF.begin(), p.srcHeightF.end(), p.srcHeightF[0]); - std::fill(p.srcWidthF.begin(), p.srcWidthF.end(), p.srcWidthF[0]); - std::fill(p.dataTypeSize.begin(), p.dataTypeSize.end(), p.dataTypeSize[0]); - std::fill(p.srcHeightSub1F.begin(), p.srcHeightSub1F.end(), p.srcHeightSub1F[0]); - std::fill(p.srcWidthSub1F.begin(), p.srcWidthSub1F.end(), p.srcWidthSub1F[0]); - std::fill(p.srcHeightMul2F.begin(), p.srcHeightMul2F.end(), p.srcHeightMul2F[0]); - std::fill(p.srcWidthMul2F.begin(), p.srcWidthMul2F.end(), p.srcWidthMul2F[0]); - std::fill(p.srcWidthB.begin(), p.srcWidthB.end(), p.srcWidthB[0]); + std::fill(p.srcHeightF.begin(), p.srcHeightF.end(), p.srcHeightF[0]); + std::fill(p.srcWidthF.begin(), p.srcWidthF.end(), p.srcWidthF[0]); + std::fill(p.dataTypeSize.begin(), p.dataTypeSize.end(), p.dataTypeSize[0]); + std::fill(p.srcHeightSub1F.begin(), p.srcHeightSub1F.end(), p.srcHeightSub1F[0]); + std::fill(p.srcWidthSub1F.begin(), p.srcWidthSub1F.end(), p.srcWidthSub1F[0]); + std::fill(p.srcHeightMul2F.begin(), p.srcHeightMul2F.end(), p.srcHeightMul2F[0]); + std::fill(p.srcWidthMul2F.begin(), p.srcWidthMul2F.end(), p.srcWidthMul2F[0]); + std::fill(p.srcWidthB.begin(), p.srcWidthB.end(), p.srcWidthB[0]); std::fill(p.srcHeightMul2Sub1F.begin(), p.srcHeightMul2Sub1F.end(), p.srcHeightMul2Sub1F[0]); - std::fill(p.srcWidthMul2Sub1F.begin(), p.srcWidthMul2Sub1F.end(), p.srcWidthMul2Sub1F[0]); + std::fill(p.srcWidthMul2Sub1F.begin(), p.srcWidthMul2Sub1F.end(), p.srcWidthMul2Sub1F[0]); if (alignCorners) { std::fill(p.wDenormCoefF.begin(), p.wDenormCoefF.end(), p.wDenormCoefF[0]); std::fill(p.hDenormCoefF.begin(), p.hDenormCoefF.end(), p.hDenormCoefF[0]); @@ -264,9 +266,9 @@ void GridSample::prepareParams() { } void GridSample::execute(dnnl::stream strm) { - const void* srcData = getSrcDataAtPort(IN_DATA); + const void* srcData = getSrcDataAtPort(IN_DATA); const uint8_t* gridData = getSrcDataAtPortAs(IN_GRID); - uint8_t* dstData = getDstDataAtPortAs(0); + uint8_t* dstData = getDstDataAtPortAs(0); auto threadBody = [&](const int ithr, const int nthr) { const auto& p = execParamsPerThread[ithr]; @@ -275,30 +277,30 @@ void GridSample::execute(dnnl::stream strm) { return; } - arg.src = srcData; - arg.grid = gridData + p.gridStartB; - arg.dst = dstData + p.dstStartB; - arg.batchNum = p.batchNum; - arg.channelsNum = p.channelsNum; - arg.srcHeightF = p.srcHeightF.data(); - arg.srcWidthF = p.srcWidthF.data(); - arg.srcWidthB = p.srcWidthB.data(); - arg.srcChannelStepB = p.srcChannelStepB; - arg.dstChannelStepB = p.dstChannelStepB; - arg.srcBatchStepB = p.srcBatchStepB; - arg.gridBatchStepB = p.gridBatchStepB; - arg.dstBatchStepB = p.dstBatchStepB; - arg.srcHeightSub1F = p.srcHeightSub1F.data(); - arg.srcWidthSub1F = p.srcWidthSub1F.data(); - arg.srcWidthMul2F = p.srcWidthMul2F.data(); - arg.srcHeightMul2F = p.srcHeightMul2F.data(); + arg.src = srcData; + arg.grid = gridData + p.gridStartB; + arg.dst = dstData + p.dstStartB; + arg.batchNum = p.batchNum; + arg.channelsNum = p.channelsNum; + arg.srcHeightF = p.srcHeightF.data(); + arg.srcWidthF = p.srcWidthF.data(); + arg.srcWidthB = p.srcWidthB.data(); + arg.srcChannelStepB = p.srcChannelStepB; + arg.dstChannelStepB = p.dstChannelStepB; + arg.srcBatchStepB = p.srcBatchStepB; + arg.gridBatchStepB = p.gridBatchStepB; + arg.dstBatchStepB = p.dstBatchStepB; + arg.srcHeightSub1F = p.srcHeightSub1F.data(); + arg.srcWidthSub1F = p.srcWidthSub1F.data(); + arg.srcWidthMul2F = p.srcWidthMul2F.data(); + arg.srcHeightMul2F = p.srcHeightMul2F.data(); arg.srcHeightMul2Sub1F = p.srcHeightMul2Sub1F.data(); - arg.srcWidthMul2Sub1F = p.srcWidthMul2Sub1F.data(); - arg.wDenormCoefF = p.wDenormCoefF.data(); - arg.hDenormCoefF = p.hDenormCoefF.data(); - arg.dataTypeSize = p.dataTypeSize.data(); - arg.buffer = p.buffer.data(); - arg.workAmount = p.workAmount; + arg.srcWidthMul2Sub1F = p.srcWidthMul2Sub1F.data(); + arg.wDenormCoefF = p.wDenormCoefF.data(); + arg.hDenormCoefF = p.hDenormCoefF.data(); + arg.dataTypeSize = p.dataTypeSize.data(); + arg.buffer = p.buffer.data(); + arg.workAmount = p.workAmount; (*jitKernel)(&arg); }; @@ -314,4 +316,4 @@ bool GridSample::created() const { return getType() == Type::GridSample; } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 diff --git a/src/plugins/intel_cpu/src/nodes/grid_sample.hpp b/src/plugins/intel_cpu/src/nodes/grid_sample.hpp index b4468d58be9b52..eb4fd38b64c878 100644 --- a/src/plugins/intel_cpu/src/nodes/grid_sample.hpp +++ b/src/plugins/intel_cpu/src/nodes/grid_sample.hpp @@ -5,6 +5,7 @@ #pragma once #include + #include "kernels/x64/grid_sample.hpp" namespace ov { @@ -16,35 +17,35 @@ class GridSample : public Node { GridSample(const std::shared_ptr& op, const GraphContext::CPtr context); static bool isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept; - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void createPrimitive() override; void execute(dnnl::stream strm) override; bool created() const override; struct threadExecParams { - uint64_t batchNum = 1lu; + uint64_t batchNum = 1lu; uint64_t channelsNum = 1lu; - std::vector srcHeightF{ 1.f }; - std::vector srcWidthF{ 1.f }; - std::vector srcWidthB{ 1lu }; - std::vector dataTypeSize{ 1lu }; - std::vector srcHeightMul2F{ 1.f }; - std::vector srcWidthMul2F{ 1.f }; - std::vector srcHeightMul2Sub1F{ 1.f }; - std::vector srcWidthMul2Sub1F{ 1.f }; - std::vector srcHeightSub1F{ 1.f }; - std::vector srcWidthSub1F{ 1.f }; - std::vector wDenormCoefF{ 1.f }; - std::vector hDenormCoefF{ 1.f }; - uint64_t gridStartB = 0lu; - uint64_t dstStartB = 0lu; + std::vector srcHeightF{1.f}; + std::vector srcWidthF{1.f}; + std::vector srcWidthB{1lu}; + std::vector dataTypeSize{1lu}; + std::vector srcHeightMul2F{1.f}; + std::vector srcWidthMul2F{1.f}; + std::vector srcHeightMul2Sub1F{1.f}; + std::vector srcWidthMul2Sub1F{1.f}; + std::vector srcHeightSub1F{1.f}; + std::vector srcWidthSub1F{1.f}; + std::vector wDenormCoefF{1.f}; + std::vector hDenormCoefF{1.f}; + uint64_t gridStartB = 0lu; + uint64_t dstStartB = 0lu; uint64_t srcChannelStepB = 0lu; uint64_t dstChannelStepB = 0lu; - uint64_t srcBatchStepB = 0lu; - uint64_t gridBatchStepB = 0lu; - uint64_t dstBatchStepB = 0lu; - uint64_t workAmount = 0lu; + uint64_t srcBatchStepB = 0lu; + uint64_t gridBatchStepB = 0lu; + uint64_t dstBatchStepB = 0lu; + uint64_t workAmount = 0lu; std::vector buffer; }; @@ -71,6 +72,6 @@ class GridSample : public Node { std::shared_ptr jitKernel; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/grn.cpp b/src/plugins/intel_cpu/src/nodes/grn.cpp index 10de2ef2286f0f..374452812eaf3a 100644 --- a/src/plugins/intel_cpu/src/nodes/grn.cpp +++ b/src/plugins/intel_cpu/src/nodes/grn.cpp @@ -2,11 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 // +#include "grn.h" + #include -#include "openvino/opsets/opset1.hpp" #include "openvino/core/parallel.hpp" -#include "grn.h" +#include "openvino/opsets/opset1.hpp" namespace ov { namespace intel_cpu { @@ -97,11 +98,12 @@ void GRN::execute(dnnl::stream strm) { parallel_for3d(N, H, W, [&](int b, int h, int w) { double variance = 0; for (int c = 0; c < C; c++) { - variance += std::pow(src_data[b*C*H*W + c*H*W + h*W + w], 2); + variance += std::pow(src_data[b * C * H * W + c * H * W + h * W + w], 2); } variance = std::pow(variance + bias, 0.5f); for (int c = 0; c < C; c++) { - dst_data[b*C*H*W + c*H*W + h*W + w] = src_data[b*C*H*W + c*H*W + h*W + w] / static_cast(variance); + dst_data[b * C * H * W + c * H * W + h * W + w] = + src_data[b * C * H * W + c * H * W + h * W + w] / static_cast(variance); } }); } @@ -110,6 +112,6 @@ bool GRN::created() const { return getType() == Type::GRN; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/grn.h b/src/plugins/intel_cpu/src/nodes/grn.h index 52e77318e2132f..17eac4e81b9d6c 100644 --- a/src/plugins/intel_cpu/src/nodes/grn.h +++ b/src/plugins/intel_cpu/src/nodes/grn.h @@ -14,7 +14,7 @@ class GRN : public Node { public: GRN(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -34,6 +34,6 @@ class GRN : public Node { std::string errorPrefix; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/if.cpp b/src/plugins/intel_cpu/src/nodes/if.cpp index 1b6102ff954689..8de1cf14920d74 100644 --- a/src/plugins/intel_cpu/src/nodes/if.cpp +++ b/src/plugins/intel_cpu/src/nodes/if.cpp @@ -4,22 +4,22 @@ #include "if.h" -#include "openvino/op/if.hpp" +#include +#include #include "common/cpu_memcpy.h" -#include "shape_inference/shape_inference_internal_dyn.hpp" #include "nodes/common/cpu_convert.h" +#include "openvino/op/if.hpp" +#include "shape_inference/shape_inference_internal_dyn.hpp" #include "transformations/utils/utils.hpp" -#include -#include - namespace ov { namespace intel_cpu { namespace node { -If::PortMapHelper::PortMapHelper(const MemoryPtr &from, const std::deque& to, - const dnnl::engine& eng) : srcMemPtr(from), dstMemPtrs(to) { +If::PortMapHelper::PortMapHelper(const MemoryPtr& from, const std::deque& to, const dnnl::engine& eng) + : srcMemPtr(from), + dstMemPtrs(to) { size = 0; if (srcMemPtr->getDesc().isDefined()) size = srcMemPtr->getShape().getElementsCount(); @@ -43,7 +43,7 @@ void If::PortMapHelper::execute(dnnl::stream& strm) { } void If::PortMapHelper::redefineTo() { - const auto &currDesc = dstMemPtrs.front()->getDesc(); + const auto& currDesc = dstMemPtrs.front()->getDesc(); if (currDesc.getShape().isDynamic() || currDesc.getShape().getStaticDims() != srcMemPtr->getStaticDims()) { // TODO : check the entire dstMemPtrs usage considering the proper memory sharing auto newShape = srcMemPtr->getStaticDims(); @@ -60,7 +60,7 @@ bool If::isSupportedOperation(const std::shared_ptr& op, std::st try { if (!one_of(op->get_type_info(), ov::op::v8::If::get_type_info_static())) { errorMessage = "Not supported If operation version " + std::string(op->get_type_info().version_id) + - " with name '" + op->get_friendly_name() + "'. Node If supports only opset8 version."; + " with name '" + op->get_friendly_name() + "'. Node If supports only opset8 version."; return false; } } catch (...) { @@ -69,8 +69,9 @@ bool If::isSupportedOperation(const std::shared_ptr& op, std::st return true; } -If::If(const std::shared_ptr& op, const GraphContext::CPtr context) : - Node(op, context, InternalDynShapeInferFactory()), ovOp(op) { +If::If(const std::shared_ptr& op, const GraphContext::CPtr context) + : Node(op, context, InternalDynShapeInferFactory()), + ovOp(op) { std::string errorMessage; if (!isSupportedOperation(op, errorMessage)) { OPENVINO_THROW_NOT_IMPLEMENTED(errorMessage); @@ -111,49 +112,55 @@ void If::getSupportedDescriptors() { } } - const auto &outMapThen = subGraphThen.GetOutputNodesMap(); + const auto& outMapThen = subGraphThen.GetOutputNodesMap(); for (const auto& out : ifOp->get_then_body()->get_results()) { auto outNode = outMapThen.find(ifOp->get_then_body()->get_result_index(out)); if (outNode != outMapThen.end()) { auto outMem = outNode->second->getSrcMemoryAtPort(0); outputMemThen.push_back(outMem); } else { - OPENVINO_THROW("Then body of node If with name ", getName(), " does not have output with name: ", out->get_friendly_name()); + OPENVINO_THROW("Then body of node If with name ", + getName(), + " does not have output with name: ", + out->get_friendly_name()); } } - const auto &outMapElse = subGraphElse.GetOutputNodesMap(); + const auto& outMapElse = subGraphElse.GetOutputNodesMap(); for (const auto& out : ifOp->get_else_body()->get_results()) { auto outNode = outMapElse.find(ifOp->get_else_body()->get_result_index(out)); if (outNode != outMapElse.end()) { auto outMem = outNode->second->getSrcMemoryAtPort(0); outputMemElse.push_back(outMem); } else { - OPENVINO_THROW("Else body of node If with name ", getName(), " does not have output with name: ", out->get_friendly_name()); + OPENVINO_THROW("Else body of node If with name ", + getName(), + " does not have output with name: ", + out->get_friendly_name()); } } // Port map: outputs for (const auto& desc : ifOp->get_output_descriptions(0)) { auto body_output_idx = desc->m_body_value_index; - thenOutputPortMap.emplace_back(PortMap { - static_cast(desc->m_output_index), static_cast(body_output_idx)}); + thenOutputPortMap.emplace_back( + PortMap{static_cast(desc->m_output_index), static_cast(body_output_idx)}); } for (const auto& desc : ifOp->get_output_descriptions(1)) { auto body_output_idx = desc->m_body_value_index; - elseOutputPortMap.emplace_back(PortMap { - static_cast(desc->m_output_index), static_cast(body_output_idx)}); + elseOutputPortMap.emplace_back( + PortMap{static_cast(desc->m_output_index), static_cast(body_output_idx)}); } for (const auto& desc : ifOp->get_input_descriptions(0)) { auto body_input_index = desc->m_body_parameter_index; - thenInputPortMap.emplace_back(PortMap { - static_cast(desc->m_input_index), static_cast(body_input_index)}); + thenInputPortMap.emplace_back( + PortMap{static_cast(desc->m_input_index), static_cast(body_input_index)}); } for (const auto& desc : ifOp->get_input_descriptions(1)) { auto body_input_index = desc->m_body_parameter_index; - elseInputPortMap.emplace_back(PortMap { - static_cast(desc->m_input_index), static_cast(body_input_index)}); + elseInputPortMap.emplace_back( + PortMap{static_cast(desc->m_input_index), static_cast(body_input_index)}); } } @@ -166,16 +173,17 @@ void If::initSupportedPrimitiveDescriptors() { config.outConfs.reserve(getChildEdges().size()); for (size_t i = 0; i < inputShapes.size(); i++) { - PortConfig dataConf {}; + PortConfig dataConf{}; auto descCreator = BlockedDescCreator::getCommonCreators().at(LayoutType::ncsp); dataConf.setMemDesc(descCreator->createSharedDesc(getOriginalInputPrecisionAtPort(i), getInputShapeAtPort(i))); config.inConfs.emplace_back(dataConf); } for (size_t i = 0; i < outputShapes.size(); i++) { - PortConfig dataConf {}; + PortConfig dataConf{}; auto descCreator = BlockedDescCreator::getCommonCreators().at(LayoutType::ncsp); - dataConf.setMemDesc(descCreator->createSharedDesc(getOriginalOutputPrecisionAtPort(i), getOutputShapeAtPort(i))); + dataConf.setMemDesc( + descCreator->createSharedDesc(getOriginalOutputPrecisionAtPort(i), getOutputShapeAtPort(i))); config.outConfs.push_back(dataConf); } @@ -195,9 +203,9 @@ void If::createPrimitive() { } void If::prepareBeforeMappers(const bool isThen, const dnnl::engine& eng) { - auto &inputPortMap = isThen ? thenInputPortMap : elseInputPortMap; - auto &inputMems = isThen ? inputMemThen : inputMemElse; - auto &beforeMappers = isThen ? beforeThenMappers : beforeElseMappers; + auto& inputPortMap = isThen ? thenInputPortMap : elseInputPortMap; + auto& inputMems = isThen ? inputMemThen : inputMemElse; + auto& beforeMappers = isThen ? beforeThenMappers : beforeElseMappers; for (auto& map_rule : inputPortMap) { auto fromMem = getSrcMemoryAtPort(map_rule.from); auto& toMems = inputMems[map_rule.to]; @@ -216,12 +224,12 @@ void If::prepareBeforeMappers(const bool isThen, const dnnl::engine& eng) { } void If::prepareAfterMappers(const bool isThen, const dnnl::engine& eng) { - auto &outputPortMap = isThen ? thenOutputPortMap : elseOutputPortMap; - auto &outputMems = isThen ? outputMemThen : outputMemElse; - auto &afterMappers = isThen ? afterThenMappers : afterElseMappers; + auto& outputPortMap = isThen ? thenOutputPortMap : elseOutputPortMap; + auto& outputMems = isThen ? outputMemThen : outputMemElse; + auto& afterMappers = isThen ? afterThenMappers : afterElseMappers; for (auto& map_rule : outputPortMap) { auto toMems = getToMemories(this, map_rule.from); - auto &fromMem = outputMems[map_rule.to]; + auto& fromMem = outputMems[map_rule.to]; // Check precision between If node input/output and it's subgrapsh input/output. for (const auto& toMem : toMems) { if (fromMem->getDesc().getPrecision() != toMem->getDesc().getPrecision()) { @@ -250,11 +258,11 @@ void If::execute(dnnl::stream strm) { auto& afterMappers = condition ? afterThenMappers : afterElseMappers; auto& subGraph = condition ? subGraphThen : subGraphElse; - for (auto &mapper : beforeMappers) + for (auto& mapper : beforeMappers) mapper->execute(strm); subGraph.ResetInferCount(); subGraph.Infer(); - for (auto &mapper : afterMappers) + for (auto& mapper : afterMappers) mapper->execute(strm); } @@ -266,6 +274,6 @@ bool If::created() const { return getType() == Type::If; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/if.h b/src/plugins/intel_cpu/src/nodes/if.h index f858c92b0b2651..a2babb45b6c803 100644 --- a/src/plugins/intel_cpu/src/nodes/if.h +++ b/src/plugins/intel_cpu/src/nodes/if.h @@ -4,8 +4,8 @@ #pragma once -#include #include +#include #include #include @@ -25,12 +25,18 @@ class If : public Node { void createPrimitive() override; bool created() const override; void execute(dnnl::stream strm) override; - bool isExecutable() const override { return true; } + bool isExecutable() const override { + return true; + } protected: void executeDynamicImpl(dnnl::stream strm) override; - bool needPrepareParams() const override { return false; }; - bool needShapeInfer() const override { return false; } + bool needPrepareParams() const override { + return false; + }; + bool needShapeInfer() const override { + return false; + } private: void prepareBeforeMappers(const bool isThen, const dnnl::engine& eng); @@ -64,21 +70,14 @@ class If : public Node { std::vector> inputMemThen, inputMemElse; std::deque outputMemThen, outputMemElse; - std::vector> - beforeThenMappers, - beforeElseMappers, - afterThenMappers, + std::vector> beforeThenMappers, beforeElseMappers, afterThenMappers, afterElseMappers; - std::vector - thenInputPortMap, - thenOutputPortMap, - elseInputPortMap, - elseOutputPortMap; + std::vector thenInputPortMap, thenOutputPortMap, elseInputPortMap, elseOutputPortMap; const std::shared_ptr ovOp; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/input.cpp b/src/plugins/intel_cpu/src/nodes/input.cpp index 4ccdc87ada25f1..4bb2f714b284fd 100644 --- a/src/plugins/intel_cpu/src/nodes/input.cpp +++ b/src/plugins/intel_cpu/src/nodes/input.cpp @@ -5,12 +5,12 @@ #include "input.h" #include "cpu/x64/jit_generator.hpp" +#include "memory_desc/cpu_memory_desc_utils.h" #include "nodes/node_config.h" #include "openvino/core/parallel.hpp" #include "openvino/core/shape.hpp" #include "openvino/core/type/element_type.hpp" #include "shape_inference/shape_inference_pass_through.hpp" -#include "memory_desc/cpu_memory_desc_utils.h" using namespace dnnl; using namespace dnnl::impl::cpu::x64; @@ -38,16 +38,14 @@ struct jit_has_subnormals_base : public jit_generator { } fn_t get() { - return jit_ker() || create_kernel() == dnnl::impl::status::success - ? (fn_t)jit_ker() - : nullptr; + return jit_ker() || create_kernel() == dnnl::impl::status::success ? (fn_t)jit_ker() : nullptr; } protected: - void foreach(const Xbyak::Reg64& idx, - size_t step, - const Xbyak::Reg64& end, - std::function && fn) { + void foreach (const Xbyak::Reg64& idx, + size_t step, + const Xbyak::Reg64& end, + std::function && fn) { Label loop, exit; L(loop); @@ -61,75 +59,76 @@ struct jit_has_subnormals_base : public jit_generator { L(exit); } - void copy_floats(const Xbyak::Reg64& dst, - const Xbyak::Reg64& src, - const Xbyak::Reg64& size) { + void copy_floats(const Xbyak::Reg64& dst, const Xbyak::Reg64& src, const Xbyak::Reg64& size) { push(rsi); push(r15); xor_(rsi, rsi); - foreach(rsi, 1, size, [&, this](const Xbyak::Reg64& idx) { + foreach (rsi, 1, size, [&, this](const Xbyak::Reg64& idx) { mov(r15d, dword[src + idx * sizeof(float)]); mov(dword[dst + idx * sizeof(float)], r15d); - }); + }) + ; pop(r15); pop(rsi); } - void check_subnormals(const Xbyak::Reg64& src, const Xbyak::Ymm &exponent_mask, const Xbyak::Ymm &mantissa_mask, const Xbyak::Ymm &zero) { + void check_subnormals(const Xbyak::Reg64& src, + const Xbyak::Ymm& exponent_mask, + const Xbyak::Ymm& mantissa_mask, + const Xbyak::Ymm& zero) { auto a = ymm1; auto b = ymm2; auto c = ymm3; - vmovdqu(a, yword[src]); // load 8 floats - vpand(b, a, mantissa_mask); // b = a & 00000000011111111111111111111111 - vpcmpeqd(b, b, zero); // if (b == 0) b = 1 else b = 0 - vpand(c, a, exponent_mask); // c = a & 01111111100000000000000000000000 - vpcmpeqd(c, c, zero); // if (c == 0) c = 1 else c = 0 - vptest(b, c); // if ((!b & c) == 0) CF = 1 else CF = 0 + vmovdqu(a, yword[src]); // load 8 floats + vpand(b, a, mantissa_mask); // b = a & 00000000011111111111111111111111 + vpcmpeqd(b, b, zero); // if (b == 0) b = 1 else b = 0 + vpand(c, a, exponent_mask); // c = a & 01111111100000000000000000000000 + vpcmpeqd(c, c, zero); // if (c == 0) c = 1 else c = 0 + vptest(b, c); // if ((!b & c) == 0) CF = 1 else CF = 0 } - void check_subnormals(const Xbyak::Reg64& src, const Xbyak::Xmm &exponent_mask, const Xbyak::Xmm &mantissa_mask, const Xbyak::Xmm &zero) { + void check_subnormals(const Xbyak::Reg64& src, + const Xbyak::Xmm& exponent_mask, + const Xbyak::Xmm& mantissa_mask, + const Xbyak::Xmm& zero) { auto a = xmm1; auto b = xmm2; auto c = xmm3; - uni_vmovdqu(a, xword[src]); // load 4 floats - uni_vmovdqu(b, a); // b = a - uni_vmovdqu(c, a); // c = a - uni_vpand(b, b, mantissa_mask); // b = a & 00000000011111111111111111111111 - uni_vpcmpeqd(b, b, zero); // if (b == 0) b = 1 else b = 0 - uni_vpand(c, c, exponent_mask); // c = a & 01111111100000000000000000000000 - uni_vpcmpeqd(c, c, zero); // if (c == 0) c = 1 else c = 0 - uni_vtestps(b, c); // if ((!b & c) == 0) CF = 1 else CF = 0 + uni_vmovdqu(a, xword[src]); // load 4 floats + uni_vmovdqu(b, a); // b = a + uni_vmovdqu(c, a); // c = a + uni_vpand(b, b, mantissa_mask); // b = a & 00000000011111111111111111111111 + uni_vpcmpeqd(b, b, zero); // if (b == 0) b = 1 else b = 0 + uni_vpand(c, c, exponent_mask); // c = a & 01111111100000000000000000000000 + uni_vpcmpeqd(c, c, zero); // if (c == 0) c = 1 else c = 0 + uni_vtestps(b, c); // if ((!b & c) == 0) CF = 1 else CF = 0 } protected: Label exit, has_subnormals, no_subnormals; - const Reg64 ®_src = rax; - const Reg64 ®_dst = rbx; - const Reg64 ®_sz = rdx; - const Reg64 ®_idx = rsi; - const Reg64 ®_mask_addr = r15; + const Reg64& reg_src = rax; + const Reg64& reg_dst = rbx; + const Reg64& reg_sz = rdx; + const Reg64& reg_idx = rsi; + const Reg64& reg_mask_addr = r15; static const uint32_t exponent_mask_data[8]; static const uint32_t mantissa_mask_data[8]; }; -const uint32_t jit_has_subnormals_base::exponent_mask_data[8] = { - 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, - 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000 -}; +const uint32_t jit_has_subnormals_base::exponent_mask_data[8] = + {0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000, 0x7f800000}; -const uint32_t jit_has_subnormals_base::mantissa_mask_data[8] = { - 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff, - 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff -}; +const uint32_t jit_has_subnormals_base::mantissa_mask_data[8] = + {0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff, 0x007fffff}; -template +template struct jit_has_subnormals : public jit_has_subnormals_base { using Vmm = typename dnnl::impl::utils::conditional::type; @@ -138,7 +137,7 @@ struct jit_has_subnormals : public jit_has_subnormals_base { const Vmm rmm6 = Vmm(6); const int length = isa == sse41 ? 4 : 8; - void generate() override final { // NOLINT + void generate() override final { // NOLINT size_t const vlen = length; const int sh_bits = std::ilogb(vlen); @@ -165,11 +164,12 @@ struct jit_has_subnormals : public jit_has_subnormals_base { mov(r8, reg_sz); shr(r8, sh_bits); - foreach(reg_idx, 1, r8, [&, this](const Xbyak::Reg64& idx) { + foreach (reg_idx, 1, r8, [&, this](const Xbyak::Reg64& idx) { check_subnormals(reg_src, exponent_mask, mantissa_mask, zero); jnc(has_subnormals); add(reg_src, sizeof(float) * vlen); - }); + }) + ; // Tail shl(reg_idx, sh_bits); @@ -216,11 +216,11 @@ jit_has_subnormals_base::fn_t jit_has_subnormals_function() { return nullptr; } -} // namespace +} // namespace #endif Input::Input(const std::shared_ptr& op, const GraphContext::CPtr context) - : Node(op, context, PassThroughShapeInferFactory()) { + : Node(op, context, PassThroughShapeInferFactory()) { if (!one_of(op->get_type_info(), op::v0::Parameter::get_type_info_static(), op::v0::Constant::get_type_info_static(), @@ -260,7 +260,7 @@ void Input::cloneBlobIfRequired() { needFlushDenormalsToZero = false; } - auto cloneBlob = [&, this] () { + auto cloneBlob = [&, this]() { MemoryPtr memory; // CVS-74980 @@ -269,7 +269,8 @@ void Input::cloneBlobIfRequired() { // in that case we make a copy to avoid overflow if (m_constOp->get_byte_size() >= memDesc.getCurrentMemSize()) { if (m_constOp->get_element_type() == element::string) { - memory = std::make_shared(getEngine(), memDesc, m_constOp->get_data_ptr()); + memory = + std::make_shared(getEngine(), memDesc, m_constOp->get_data_ptr()); } else { memory = std::make_shared(getEngine(), memDesc, m_constOp->get_data_ptr()); } @@ -296,12 +297,12 @@ void Input::cloneBlobIfRequired() { return ptr; }; - auto isBlobAligned = [] (const std::shared_ptr& constant) { + auto isBlobAligned = [](const std::shared_ptr& constant) { #if defined(OPENVINO_ARCH_X86) || defined(OPENVINO_ARCH_X86_64) // Majority of arithmetic and data processing instructions in legacy SSE isa requires // the memory address in the operands must be aligned on 16-byte boundary. To ensure // safely reusing ngraph const blob memory, need to check address alignment. - const void *ptr = constant->get_data_ptr(); + const void* ptr = constant->get_data_ptr(); return mayiuse(cpu_isa_t::avx2) || ((reinterpret_cast(ptr) & 15) == 0); #else return true; @@ -309,9 +310,9 @@ void Input::cloneBlobIfRequired() { }; // The presence of subnormals is better to determined at IR read time. - auto hasSubnormals = [&] () { + auto hasSubnormals = [&]() { if (prec == ov::element::f32) { - uint32_t const *u32data = m_constOp->get_data_ptr(); + uint32_t const* u32data = m_constOp->get_data_ptr(); if (!size) return false; @@ -325,11 +326,9 @@ void Input::cloneBlobIfRequired() { parallel_for(iterations_num, [&](int n) { auto ptr = u32data + n * batch_size; - const jit_has_subnormals_base::args_t args = { - reinterpret_cast(ptr), - std::min(batch_size, (size_t)(u32data + size - ptr)), - false - }; + const jit_has_subnormals_base::args_t args = {reinterpret_cast(ptr), + std::min(batch_size, (size_t)(u32data + size - ptr)), + false}; fn(&args); @@ -352,12 +351,10 @@ void Input::cloneBlobIfRequired() { return false; }; - auto blobKey = [&] () { + auto blobKey = [&]() { char ptr[32]; snprintf(ptr, sizeof ptr, "%p", m_constOp->get_data_ptr()); - return getName() - + "_" + std::to_string(size * prec.size()) - + "_" + ptr; + return getName() + "_" + std::to_string(size * prec.size()) + "_" + ptr; }; const auto weightCache = context->getWeightsCache(); @@ -368,7 +365,8 @@ void Input::cloneBlobIfRequired() { isBlobAligned(m_constOp) && (!needFlushDenormalsToZero || !hasSubnormals()) && // Blob should be cloned in cache only if original weights are stored on other numa node. // This is possible only in multistream case on multisocket machine. - // TODO: don't clone blob for multisocket + multistream case if current stream is run on the numa node where original weights are stored. + // TODO: don't clone blob for multisocket + multistream case if current stream is run on the numa node where + // original weights are stored. (!weightCache || context->getNumNumaNodes() == 1 || context->getCPUStreamExecutor()->get_streams_num() == 1); memoryPtr = clone_is_not_needed ? std::make_shared(getEngine(), memDesc, m_constOp->get_data_ptr()) @@ -376,29 +374,25 @@ void Input::cloneBlobIfRequired() { weightCache ? *weightCache->findOrCreate(blobKey(), cloneBlob) : cloneBlob()); } -static std::vector createInputShapes(const Shape& shape, - const Type type) { +static std::vector createInputShapes(const Shape& shape, const Type type) { if (type == Type::Output) return {shape}; return {}; } -static std::vector createOutputShapes(const Shape& shape, - const Type type) { +static std::vector createOutputShapes(const Shape& shape, const Type type) { if (type == Type::Input) return {shape}; return {}; } -static std::vector createInputPrecisions(const ov::element::Type& prc, - const Type type) { +static std::vector createInputPrecisions(const ov::element::Type& prc, const Type type) { if (type == Type::Output) return {prc}; return {}; } -static std::vector createOutputPrecisions(const ov::element::Type& prc, - const Type type) { +static std::vector createOutputPrecisions(const ov::element::Type& prc, const Type type) { if (type == Type::Input) return {prc}; return {}; @@ -428,17 +422,13 @@ Input::Input(MemoryDescPtr memDesc, const std::string& name, const std::string& extMemDesc = memDesc; } -Input::Input(const std::shared_ptr& op, - const GraphContext::CPtr context, - InputConfig config) +Input::Input(const std::shared_ptr& op, const GraphContext::CPtr context, InputConfig config) : Input(op, context) { extMemDesc = config.desc; m_isInPlace = config.inPlace; } -Input::Input(const std::shared_ptr& op, - const GraphContext::CPtr context, - OutputConfig config) +Input::Input(const std::shared_ptr& op, const GraphContext::CPtr context, OutputConfig config) : Input(op, context) { extMemDesc = config.desc; m_useParentMemoryDescForOutput = config.useParentMemoryDescForOutput; @@ -499,17 +489,23 @@ void Input::createPrimitive() { for (size_t i = 0; i < getChildEdges().size(); i++) { auto dstMemPtr = getDstMemoryAtPort(i); if (!dstMemPtr) - THROW_CPU_NODE_ERR("has null memory object at port ", i, - " to node ", getChildEdgeAt(i)->getChild()->getName(), "."); + THROW_CPU_NODE_ERR("has null memory object at port ", + i, + " to node ", + getChildEdgeAt(i)->getChild()->getName(), + "."); } for (size_t i = 0; i < getParentEdges().size(); i++) { auto srcMemPtr = getSrcMemoryAtPort(i); if (!srcMemPtr) - THROW_CPU_NODE_ERR("has null memory object at port ", i, - " from node ", getParentEdgeAt(i)->getParent()->getName(), "."); + THROW_CPU_NODE_ERR("has null memory object at port ", + i, + " from node ", + getParentEdgeAt(i)->getParent()->getName(), + "."); } - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (selected_pd == nullptr) THROW_CPU_NODE_ERR("doesn't have selected primitive descriptor."); } @@ -535,9 +531,7 @@ void Input::initSupportedPdDefault() { inPortConfs.push_back({LayoutType::ncsp, precision}); } - addSupportedPrimDesc(inPortConfs, - outPortConfs, - impl_desc_type::unknown); + addSupportedPrimDesc(inPortConfs, outPortConfs, impl_desc_type::unknown); } void Input::initSupportedPdFromMemDesc() { @@ -553,6 +547,6 @@ void Input::initSupportedPdFromMemDesc() { supportedPrimitiveDescriptors.emplace_back(std::move(config), impl_desc_type::unknown); } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/input.h b/src/plugins/intel_cpu/src/nodes/input.h index e659ea2359aabd..6d1f4c27238540 100644 --- a/src/plugins/intel_cpu/src/nodes/input.h +++ b/src/plugins/intel_cpu/src/nodes/input.h @@ -5,6 +5,7 @@ #pragma once #include + #include namespace ov { @@ -42,13 +43,9 @@ class Input : public Node { Input(MemoryDescPtr memDesc, const std::string& name, const std::string& type, const GraphContext::CPtr context); - Input(const std::shared_ptr& op, - const GraphContext::CPtr context, - InputConfig config); + Input(const std::shared_ptr& op, const GraphContext::CPtr context, InputConfig config); - Input(const std::shared_ptr& op, - const GraphContext::CPtr context, - OutputConfig config); + Input(const std::shared_ptr& op, const GraphContext::CPtr context, OutputConfig config); void getSupportedDescriptors() override; void initSupportedPrimitiveDescriptors() override; @@ -66,8 +63,12 @@ class Input : public Node { return false; } - bool needShapeInfer() const override { return false; } - bool needPrepareParams() const override { return false; } + bool needShapeInfer() const override { + return false; + } + bool needPrepareParams() const override { + return false; + } private: void cloneBlobIfRequired(); @@ -83,6 +84,6 @@ class Input : public Node { bool m_isInPlace = false; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/interaction.cpp b/src/plugins/intel_cpu/src/nodes/interaction.cpp index 5ec48e7a263272..905724c3bc829a 100644 --- a/src/plugins/intel_cpu/src/nodes/interaction.cpp +++ b/src/plugins/intel_cpu/src/nodes/interaction.cpp @@ -4,7 +4,10 @@ #include "interaction.h" -#include "transformations/cpu_opset/x64/op/interaction.hpp" +#include +#include +#include + #include "common/bfloat16.hpp" #include "common/cpu_memcpy.h" #include "cpu/x64/cpu_isa_traits.hpp" @@ -16,10 +19,7 @@ #include "memory_desc/dnnl_blocked_memory_desc.h" #include "nodes/common/cpu_convert.h" #include "onednn/dnnl.h" - -#include -#include -#include +#include "transformations/cpu_opset/x64/op/interaction.hpp" using namespace dnnl::impl::cpu::x64; using namespace Xbyak; @@ -36,7 +36,9 @@ template struct jit_move_scale_kernel : public jit_uni_move_scale_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_move_scale_kernel) - explicit jit_move_scale_kernel(const jit_move_scale_compile_params& jcp) : jit_uni_move_scale_kernel(jcp), jit_generator(jit_name()) { + explicit jit_move_scale_kernel(const jit_move_scale_compile_params& jcp) + : jit_uni_move_scale_kernel(jcp), + jit_generator(jit_name()) { runtime_prc = jcp_.src_prc == ov::element::bf16 ? ov::element::bf16 : ov::element::f32; if (jcp_.dst_prc == ov::element::i8 || jcp_.dst_prc == ov::element::u8) runtime_prc = ov::element::f32; @@ -50,12 +52,13 @@ struct jit_move_scale_kernel : public jit_uni_move_scale_kernel, public jit_gene } private: - using Vmm = typename dnnl::impl::utils::conditional3::type; + using Vmm = + typename dnnl::impl::utils::conditional3::type; void generate() override { this->preamble(); -#define GET_OFF(field) offsetof(jit_move_scale_call_args, field) +# define GET_OFF(field) offsetof(jit_move_scale_call_args, field) mov(reg_in, ptr[reg_params + GET_OFF(p_in)]); mov(reg_out, ptr[reg_params + GET_OFF(p_out)]); mov(reg_work_amount, jcp_.input_size); @@ -107,7 +110,7 @@ struct jit_move_scale_kernel : public jit_uni_move_scale_kernel, public jit_gene if (jcp_.with_scales) { if (!jcp_.broadcast_scales) { load(vmm_scales, reg_scales, ov::element::f32, ov::element::f32, step, false); - add(reg_scales, sizeof(float) * step); + add(reg_scales, sizeof(float) * step); } uni_vmulps(vmm_in, vmm_in, vmm_scales); } @@ -119,25 +122,39 @@ struct jit_move_scale_kernel : public jit_uni_move_scale_kernel, public jit_gene add(reg_out_aux, jcp_.dst_prc.size() * step); } } -#undef GET_OFF - - inline void load(const Vmm& vmm_dst, const Xbyak::Reg64& reg_src, ov::element::Type src_prc, ov::element::Type dst_prc, const int& elt_num, bool fill) { +# undef GET_OFF + + inline void load(const Vmm& vmm_dst, + const Xbyak::Reg64& reg_src, + ov::element::Type src_prc, + ov::element::Type dst_prc, + const int& elt_num, + bool fill) { const auto seed = load_emitter_params(src_prc, dst_prc, elt_num, fill, "float_min").hash(); if (!emitters[seed]) { - emitters[seed].reset(new jit_load_emitter(this, isa, src_prc, dst_prc, elt_num, src_prc, fill, "float_min")); + emitters[seed].reset( + new jit_load_emitter(this, isa, src_prc, dst_prc, elt_num, src_prc, fill, "float_min")); } - emitters[seed]->emit_code({static_cast(reg_src.getIdx()), 0}, {static_cast(vmm_dst.getIdx())}, - pool_aux_vmm_idxs, pool_aux_gpr_idxs); + emitters[seed]->emit_code({static_cast(reg_src.getIdx()), 0}, + {static_cast(vmm_dst.getIdx())}, + pool_aux_vmm_idxs, + pool_aux_gpr_idxs); } - inline void store(const Xbyak::Reg64& reg_dst, const Vmm& vmm_src, ov::element::Type src_prc, ov::element::Type dst_prc, const int& elt_num) { + inline void store(const Xbyak::Reg64& reg_dst, + const Vmm& vmm_src, + ov::element::Type src_prc, + ov::element::Type dst_prc, + const int& elt_num) { const auto seed = store_emitter_params(src_prc, dst_prc, elt_num).hash(); if (!emitters[seed]) { emitters[seed].reset(new jit_store_emitter(this, isa, src_prc, dst_prc, elt_num)); } - emitters[seed]->emit_code({static_cast(vmm_src.getIdx())}, {static_cast(reg_dst.getIdx())}, - pool_aux_vmm_idxs, pool_aux_gpr_idxs); + emitters[seed]->emit_code({static_cast(vmm_src.getIdx())}, + {static_cast(reg_dst.getIdx())}, + pool_aux_vmm_idxs, + pool_aux_gpr_idxs); } size_t vec_size; @@ -155,13 +172,14 @@ struct jit_move_scale_kernel : public jit_uni_move_scale_kernel, public jit_gene Reg64 reg_work_amount = r14; Reg64 reg_params = abi_param1; - const std::vector pool_aux_gpr_idxs = { static_cast(rsi.getIdx()), static_cast(rbp.getIdx()) }; - const std::vector pool_aux_vmm_idxs = { static_cast(xmm_tmp.getIdx()) }; + const std::vector pool_aux_gpr_idxs = {static_cast(rsi.getIdx()), + static_cast(rbp.getIdx())}; + const std::vector pool_aux_vmm_idxs = {static_cast(xmm_tmp.getIdx())}; std::unordered_map> emitters; }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 Interaction::Interaction(const std::shared_ptr& op, const GraphContext::CPtr context) : Node(op, context, NgraphShapeInferFactory(op)) { @@ -174,7 +192,7 @@ Interaction::Interaction(const std::shared_ptr& op, const GraphContext const std::vector& scales = interaction->get_output_scales(); if (!scales.empty()) { fqScales = scales; - outputDataType = interaction->get_output_element_type(0); + outputDataType = interaction->get_output_element_type(0); } } @@ -194,23 +212,12 @@ void Interaction::initSupportedPrimitiveDescriptors() { // initialize input ports std::vector inPortConfigs; for (size_t i = 0; i < getParentEdges().size(); ++i) { - inPortConfigs.emplace_back( - LayoutType::ncsp, - dataPrecision, - getInputShapeAtPort(i), - false, -1); + inPortConfigs.emplace_back(LayoutType::ncsp, dataPrecision, getInputShapeAtPort(i), false, -1); } // initialize output port std::vector outPortConfigs = { - PortConfigurator { - LayoutType::ncsp, - outputDataType, - getOutputShapeAtPort(0), - false, - -1 - } - }; - //add descriptor + PortConfigurator{LayoutType::ncsp, outputDataType, getOutputShapeAtPort(0), false, -1}}; + // add descriptor addSupportedPrimDesc(inPortConfigs, outPortConfigs, impl_desc_type::ref_any); } @@ -221,8 +228,7 @@ static inline void cat(uint8_t* out, size_t elemSize) { size_t offset = 0; for (size_t j = 0; j < feature_sizes.size(); j++) { - cpu_memcpy(out + offset * elemSize, in[j] + bs * feature_sizes[j] * elemSize, - feature_sizes[j] * elemSize); + cpu_memcpy(out + offset * elemSize, in[j] + bs * feature_sizes[j] * elemSize, feature_sizes[j] * elemSize); offset += feature_sizes[j]; } } @@ -303,8 +309,7 @@ void Interaction::prepareParams() { auto matmul_pd = matmul::primitive_desc(getEngine(), src_md, weights_md, dst_md, matmul_attr); prim = matmul(matmul_pd); featureSizes.assign(inputSizes, featureSize); - auto initMemoryPtr = [&](const ov::element::Type& prc, const intel_cpu::Shape& shape, - MemoryPtr& ptr) { + auto initMemoryPtr = [&](const ov::element::Type& prc, const intel_cpu::Shape& shape, MemoryPtr& ptr) { ptr = std::make_shared(getEngine(), intel_cpu::DnnlBlockedMemoryDesc(prc, shape)); }; initMemoryPtr(dataPrecision, intel_cpu::Shape{inputSizes, featureSize}, inputMemPtr); @@ -336,7 +341,7 @@ void Interaction::prepareParams() { moveFeatureKernel.reset(new jit_move_scale_kernel(jcp)); moveInteractKernel.reset(new jit_move_scale_kernel(interJcp)); } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 if (moveFeatureKernel && moveInteractKernel) { moveFeatureKernel->create_ker(); @@ -360,8 +365,7 @@ bool Interaction::isExecutable() const { return true; } -bool Interaction::isSupportedOperation(const std::shared_ptr& op, - std::string& errorMessage) noexcept { +bool Interaction::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { try { const auto interaction = std::dynamic_pointer_cast(op); if (!interaction) { @@ -374,7 +378,6 @@ bool Interaction::isSupportedOperation(const std::shared_ptr& op return true; } - -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/interaction.h b/src/plugins/intel_cpu/src/nodes/interaction.h index 448484a2512dd1..794ea0af24a87c 100644 --- a/src/plugins/intel_cpu/src/nodes/interaction.h +++ b/src/plugins/intel_cpu/src/nodes/interaction.h @@ -19,31 +19,31 @@ struct jit_move_scale_compile_params { }; struct jit_move_scale_call_args { - const void *p_in; - void *p_out; - const void *p_scales; + const void* p_in; + void* p_out; + const void* p_scales; }; struct jit_uni_move_scale_kernel { - void (*ker_)(const jit_move_scale_call_args*); + void (*ker_)(const jit_move_scale_call_args*); - void operator()(const jit_move_scale_call_args* call_args) { - assert(ker_); - ker_(call_args); - } + void operator()(const jit_move_scale_call_args* call_args) { + assert(ker_); + ker_(call_args); + } - explicit jit_uni_move_scale_kernel(const jit_move_scale_compile_params& jcp) : ker_(nullptr), jcp_(jcp) {} - virtual ~jit_uni_move_scale_kernel() {} + explicit jit_uni_move_scale_kernel(const jit_move_scale_compile_params& jcp) : ker_(nullptr), jcp_(jcp) {} + virtual ~jit_uni_move_scale_kernel() {} - virtual void create_ker() = 0; + virtual void create_ker() = 0; - jit_move_scale_compile_params jcp_; + jit_move_scale_compile_params jcp_; }; class Interaction : public Node { public: Interaction(const std::shared_ptr& op, const GraphContext::CPtr context); - void getSupportedDescriptors() override {}; + void getSupportedDescriptors() override{}; void initSupportedPrimitiveDescriptors() override; void execute(dnnl::stream strm) override; bool created() const override; @@ -74,6 +74,6 @@ class Interaction : public Node { std::unique_ptr moveInteractKernel; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/interpolate.cpp b/src/plugins/intel_cpu/src/nodes/interpolate.cpp index 37008ee17a9603..beb53cb89a831e 100644 --- a/src/plugins/intel_cpu/src/nodes/interpolate.cpp +++ b/src/plugins/intel_cpu/src/nodes/interpolate.cpp @@ -4,6 +4,10 @@ #include "interpolate.h" +#include +#include +#include + #include "common/cpu_memcpy.h" #include "cpu/x64/injectors/jit_uni_depthwise_injector.hpp" #include "cpu/x64/injectors/jit_uni_eltwise_injector.hpp" @@ -26,10 +30,6 @@ #include "utils/cpu_utils.hpp" #include "utils/ngraph_utils.hpp" -#include -#include -#include - using namespace dnnl; using namespace dnnl::impl; @@ -38,7 +38,6 @@ using namespace dnnl::impl::cpu::x64; using namespace dnnl::impl::utils; using namespace Xbyak; - #define GET_OFF(field) offsetof(jit_interpolate_call_args, field) namespace ov { @@ -55,8 +54,9 @@ template struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, public jit_generator { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_uni_interpolate_kernel_f32) - explicit jit_uni_interpolate_kernel_f32(jit_interpolate_config_params jcp, const dnnl_primitive_attr &attr) - : jit_uni_interpolate_kernel(jcp, attr), jit_generator(jit_name()) {} + explicit jit_uni_interpolate_kernel_f32(jit_interpolate_config_params jcp, const dnnl_primitive_attr& attr) + : jit_uni_interpolate_kernel(jcp, attr), + jit_generator(jit_name()) {} void create_ker() override { jit_generator::create_kernel(); @@ -69,23 +69,24 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi store_pool_gpr_idxs = {static_cast(reg_tmp_64.getIdx())}; store_pool_vec_idxs = {static_cast(vmm_zero.getIdx())}; - const auto &p = attr_.post_ops_; + const auto& p = attr_.post_ops_; for (int i = 0; i < p.len(); i++) { - auto &post_op = p.entry_[i]; + auto& post_op = p.entry_[i]; if (post_op.is_eltwise()) { - eltwise_injectors.push_back(std::make_shared>( - this, - post_op.eltwise.alg, - post_op.eltwise.alpha, - post_op.eltwise.beta, - 1.f)); + eltwise_injectors.push_back(std::make_shared>(this, + post_op.eltwise.alg, + post_op.eltwise.alpha, + post_op.eltwise.beta, + 1.f)); } else if (post_op.is_depthwise()) { - depthwise_injectors.push_back(std::make_shared>( - this, - post_op)); + depthwise_injectors.push_back(std::make_shared>(this, post_op)); } else if (post_op.is_quantization()) { - quantization_injectors.push_back(std::make_shared>( - this, post_op, vmm_d_weights, vmm_d_bias, reg_d_weights, reg_d_bias)); + quantization_injectors.push_back(std::make_shared>(this, + post_op, + vmm_d_weights, + vmm_d_bias, + reg_d_weights, + reg_d_bias)); } } @@ -98,81 +99,82 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi uni_vpxor(vmm_zero, vmm_zero, vmm_zero); switch (jcp_.mode) { - case InterpolateMode::nearest: { - mov(reg_dst, ptr[reg_params + GET_OFF(dst)]); - mov(reg_src, ptr[reg_params + GET_OFF(src_ptr[0])]); - mov(reg_index, ptr[reg_params + GET_OFF(index)]); - mov(reg_work_amount, ptr[reg_params + GET_OFF(work_amount)]); - - switch (jcp_.layout) { - case InterpolateLayoutType::planar: { - nn_planar(); - break; - } - case InterpolateLayoutType::block: { - nn_blk(); - break; - } - case InterpolateLayoutType::by_channel: { - nn_by_channel(); - break; - } - default: - assert(!"unsupported memory layout for interpolate layer with nearest neighbor mode."); - } + case InterpolateMode::nearest: { + mov(reg_dst, ptr[reg_params + GET_OFF(dst)]); + mov(reg_src, ptr[reg_params + GET_OFF(src_ptr[0])]); + mov(reg_index, ptr[reg_params + GET_OFF(index)]); + mov(reg_work_amount, ptr[reg_params + GET_OFF(work_amount)]); + + switch (jcp_.layout) { + case InterpolateLayoutType::planar: { + nn_planar(); break; } - case InterpolateMode::linear_onnx: { - switch (jcp_.layout) { - case InterpolateLayoutType::planar: { - linear_onnx_planar(); - break; - } - case InterpolateLayoutType::block: - case InterpolateLayoutType::by_channel: { - linear_onnx_c_gathered(); - break; - } - default: - assert(!"unsupported memory layout for interpolate layer with linear_onnx mode."); - } + case InterpolateLayoutType::block: { + nn_blk(); break; } - case InterpolateMode::cubic: { - switch (jcp_.layout) { - case InterpolateLayoutType::planar: { - cubic_planar(); - break; - } - case InterpolateLayoutType::block: - case InterpolateLayoutType::by_channel: { - cubic_c_gathered(); - break; - } - default: - assert(!"unsupported memory layout for interpolate layer with cubic mode."); - } + case InterpolateLayoutType::by_channel: { + nn_by_channel(); break; } - case InterpolateMode::bilinear_pillow: - case InterpolateMode::bicubic_pillow: { - switch (jcp_.layout) { - case InterpolateLayoutType::by_channel: { - pillow_by_channel(); - break; - } - default: - assert(!"unsupported memory layout for interpolate layer with bilinear_pillow and bicubic_pillow modes."); - } + default: + assert(!"unsupported memory layout for interpolate layer with nearest neighbor mode."); + } + break; + } + case InterpolateMode::linear_onnx: { + switch (jcp_.layout) { + case InterpolateLayoutType::planar: { + linear_onnx_planar(); + break; + } + case InterpolateLayoutType::block: + case InterpolateLayoutType::by_channel: { + linear_onnx_c_gathered(); break; } - case InterpolateMode::linear: { - assert(!"unsupported mode for interpolate layer with JITTED implimentation."); + default: + assert(!"unsupported memory layout for interpolate layer with linear_onnx mode."); + } + break; + } + case InterpolateMode::cubic: { + switch (jcp_.layout) { + case InterpolateLayoutType::planar: { + cubic_planar(); + break; + } + case InterpolateLayoutType::block: + case InterpolateLayoutType::by_channel: { + cubic_c_gathered(); + break; + } + default: + assert(!"unsupported memory layout for interpolate layer with cubic mode."); + } + break; + } + case InterpolateMode::bilinear_pillow: + case InterpolateMode::bicubic_pillow: { + switch (jcp_.layout) { + case InterpolateLayoutType::by_channel: { + pillow_by_channel(); break; } - default: { - assert(!"unsupported mode for interpolate layer."); + default: + assert( + !"unsupported memory layout for interpolate layer with bilinear_pillow and bicubic_pillow modes."); } + break; + } + case InterpolateMode::linear: { + assert(!"unsupported mode for interpolate layer with JITTED implimentation."); + break; + } + default: { + assert(!"unsupported mode for interpolate layer."); + } } this->postamble(); @@ -186,8 +188,8 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } private: - using Vmm = typename conditional3::type; + using Vmm = + typename conditional3::type; const int vlen = cpu_isa_traits::vlen; const int vector_step = vlen / sizeof(float); @@ -216,7 +218,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // for cubic planar Xbyak::Reg64 reg_tbl_y = rsi; Xbyak::Reg64 reg_tbl_x = rbp; - Xbyak::Reg64 reg_table = rdx; // do not need reg_index_offset in this mode, so use rdx + Xbyak::Reg64 reg_table = rdx; // do not need reg_index_offset in this mode, so use rdx Vmm vmm_val = Vmm(1); Vmm vmm_index = Vmm(0); @@ -292,14 +294,21 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi emit_load(reg_src, vmm_src, ov::element::f32, ov::element::f32, elt_num, offset); } - inline void emit_load(Xbyak::Reg64 reg_src, Vmm vmm_src, ov::element::Type src_prc, ov::element::Type dst_prc, const int elt_num, const int offset = 0) { + inline void emit_load(Xbyak::Reg64 reg_src, + Vmm vmm_src, + ov::element::Type src_prc, + ov::element::Type dst_prc, + const int elt_num, + const int offset = 0) { const auto seed = load_emitter_params(src_prc, dst_prc, elt_num).hash(); if (!emitters[seed]) { emitters[seed].reset(new jit_load_emitter(this, isa, src_prc, dst_prc, elt_num)); } emitters[seed]->emit_code({static_cast(reg_src.getIdx()), static_cast(offset)}, - {static_cast(vmm_src.getIdx())}, {}, {load_pool_gpr_idxs}); + {static_cast(vmm_src.getIdx())}, + {}, + {load_pool_gpr_idxs}); } inline void store(Vmm vmm_dst, Xbyak::Reg64 reg_dst, const int elt_num, const int offset = 0) { @@ -309,12 +318,15 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } // for cases when Store emitter need 2 aux vmm we can use vmm_dst as second aux vmm - std::vector local_store_pool_vec_idxs = { static_cast(vmm_dst.getIdx()) }; - local_store_pool_vec_idxs.insert(local_store_pool_vec_idxs.begin(), store_pool_vec_idxs.begin(), store_pool_vec_idxs.end()); + std::vector local_store_pool_vec_idxs = {static_cast(vmm_dst.getIdx())}; + local_store_pool_vec_idxs.insert(local_store_pool_vec_idxs.begin(), + store_pool_vec_idxs.begin(), + store_pool_vec_idxs.end()); emitters[seed]->emit_code({static_cast(vmm_dst.getIdx())}, {static_cast(reg_dst.getIdx()), static_cast(offset)}, - {local_store_pool_vec_idxs}, {store_pool_gpr_idxs}); + {local_store_pool_vec_idxs}, + {store_pool_gpr_idxs}); } // kernel for OH * OW * C @@ -397,9 +409,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } // if int, round if (!isFloatCompatible(jcp_.src_prc)) { - uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near + uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near } - // src_prc, dst_prc and buf ov::element::Type is the same, otherwise need another store with buf(src) precision + // src_prc, dst_prc and buf ov::element::Type is the same, otherwise need another store with + // buf(src) precision store(vmm_dst, reg_dst_aux, vector_step); add(reg_dst_aux, vector_step * jcp_.src_data_size); // advance 8/16 faciliate next block @@ -415,7 +428,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi uni_vfmadd231ps(vmm_dst, vmm_val, vmm_weight); } if (!isFloatCompatible(jcp_.src_prc)) { - uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near + uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near } store(vmm_dst, reg_dst_aux, tail_num); add(reg_dst_aux, tail_num * jcp_.src_data_size); @@ -447,7 +460,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi uni_vfmadd231ps(vmm_dst, vmm_val, vmm_weight); } if (!isFloatCompatible(jcp_.src_prc)) { - uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near + uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near } store(vmm_dst, reg_dst, vector_step); add(reg_dst, vector_step * jcp_.dst_data_size); @@ -463,7 +476,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi uni_vfmadd231ps(vmm_dst, vmm_val, vmm_weight); } if (!isFloatCompatible(jcp_.src_prc)) { - uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near + uni_vroundps(vmm_dst, vmm_dst, 0x0); // Round near } store(vmm_dst, reg_dst, tail_num); add(reg_dst, tail_num * jcp_.dst_data_size); @@ -495,7 +508,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi cmp(reg_work_amount_oh, 1); jl(out_loop_end, T_NEAR); - //reset work_amount to OW + // reset work_amount to OW mov(reg_work_amount, jcp_.OW); Xbyak::Reg64 reg_src_h = rsi; @@ -512,7 +525,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi Xbyak::Label nn_tail_loop_label; Xbyak::Label nn_tail_loop_end_label; - L(nn_loop_label); // inner loop + L(nn_loop_label); // inner loop { cmp(reg_work_amount, vector_step); jl(nn_loop_end_label, T_NEAR); @@ -552,9 +565,9 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi jmp(nn_tail_loop_label, T_NEAR); } - L(nn_tail_loop_end_label); // inner loop end + L(nn_tail_loop_end_label); // inner loop end - //increment index_h to next row + // increment index_h to next row add(reg_index_h, jcp_.indices_size); sub(reg_work_amount_oh, 1); @@ -620,7 +633,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi cmp(reg_work_amount_out, 1); jl(out_loop_end, T_NEAR); - //inner loop for C + // inner loop for C Xbyak::Label nn_loop_label; Xbyak::Label nn_loop_end_label; Xbyak::Label nn_tail_loop_label; @@ -716,10 +729,12 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi mov(reg_work_amount, ptr[reg_params + GET_OFF(work_amount)]); int blk = (isa == cpu::x64::sse41) ? (2 * vector_step) : vector_step; - int dst_stride = (jcp_.layout == InterpolateLayoutType::by_channel) ? (vector_step * jcp_.dst_data_size) : - (blk * jcp_.OW * jcp_.OH * jcp_.OD * jcp_.dst_data_size); - int src_stride = (jcp_.layout == InterpolateLayoutType::by_channel) ? (vector_step * jcp_.src_data_size) : - (blk * jcp_.IW * jcp_.IH * jcp_.ID * jcp_.src_data_size); + int dst_stride = (jcp_.layout == InterpolateLayoutType::by_channel) + ? (vector_step * jcp_.dst_data_size) + : (blk * jcp_.OW * jcp_.OH * jcp_.OD * jcp_.dst_data_size); + int src_stride = (jcp_.layout == InterpolateLayoutType::by_channel) + ? (vector_step * jcp_.src_data_size) + : (blk * jcp_.IW * jcp_.IH * jcp_.ID * jcp_.src_data_size); Xbyak::Label main_loop_label; Xbyak::Label main_loop_end_label; @@ -757,8 +772,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // 2d for end depth linear_onnx_worker_2d(); // 3th dimension - uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight - uni_vfmadd231ps(vmm_valTR, vmm_d_bias, vmm_weightF); // start_value * start_weight + end_value * end_weight + uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight + uni_vfmadd231ps(vmm_valTR, + vmm_d_bias, + vmm_weightF); // start_value * start_weight + end_value * end_weight } if (attr_.post_ops_.len() != 0) { @@ -788,8 +805,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // 2d for end depth linear_onnx_worker_2d(); // 3th dimension - uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight - uni_vfmadd231ps(vmm_valTR, vmm_d_bias, vmm_weightF); // start_value * start_weight + end_value * end_weight + uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight + uni_vfmadd231ps(vmm_valTR, + vmm_d_bias, + vmm_weightF); // start_value * start_weight + end_value * end_weight } if (attr_.post_ops_.len() != 0) { @@ -813,9 +832,9 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi add(reg_src_aux7, src_stride); } if (jcp_.layout == InterpolateLayoutType::by_channel) { - sub(reg_work_amount, vector_step); // work_amount is c + sub(reg_work_amount, vector_step); // work_amount is c } else { - sub(reg_work_amount, 1); // work_amount = div_up(c, blk), no tails + sub(reg_work_amount, 1); // work_amount = div_up(c, blk), no tails } jmp(main_loop_label, T_NEAR); @@ -843,8 +862,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // 2d for end depth linear_onnx_worker_2d(); // 3th dimension - uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight - uni_vfmadd231ps(vmm_valTR, vmm_d_bias, vmm_weightF); // start_value * start_weight + end_value * end_weight + uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight + uni_vfmadd231ps(vmm_valTR, + vmm_d_bias, + vmm_weightF); // start_value * start_weight + end_value * end_weight } if (attr_.post_ops_.len() != 0) { @@ -929,8 +950,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi load_weights(reg_src_aux, vmm_weightE, vector_step, 5 * weight_stride); load_weights(reg_src_aux, vmm_weightF, vector_step, 4 * weight_stride); - uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight - uni_vfmadd231ps(vmm_valTR, vmm_d_bias, vmm_weightF); // start_value * start_weight + end_value * end_weight + uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight + uni_vfmadd231ps(vmm_valTR, + vmm_d_bias, + vmm_weightF); // start_value * start_weight + end_value * end_weight } if (attr_.post_ops_.len() != 0) { @@ -1013,8 +1036,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi load_weights(reg_src_aux, vmm_weightE, scalar_step, 5 * weight_stride); load_weights(reg_src_aux, vmm_weightF, scalar_step, 4 * weight_stride); - uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight - uni_vfmadd231ps(vmm_valTR, vmm_d_bias, vmm_weightF); // start_value * start_weight + end_value * end_weight + uni_vmulps(vmm_valTR, vmm_valTR, vmm_weightE); // end_value * end_weight + uni_vfmadd231ps(vmm_valTR, + vmm_d_bias, + vmm_weightF); // start_value * start_weight + end_value * end_weight } if (attr_.post_ops_.len() != 0) { @@ -1089,7 +1114,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi cubic_c_gathered_matrix(false); if (attr_.post_ops_.len() != 0) { - apply_post_ops(jcp_.dst_prc, false); // vmm_val is default dst value to post_ops and store + apply_post_ops(jcp_.dst_prc, false); // vmm_val is default dst value to post_ops and store add(reg_oc_off, vector_step * sizeof(float)); } store(vmm_val, reg_dst, vector_step); @@ -1117,7 +1142,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi int src_stride = vector_step * jcp_.src_data_size; add(reg_dst, dst_stride); add(reg_src, src_stride); - sub(reg_work_amount, vector_step); // work_amount is c + sub(reg_work_amount, vector_step); // work_amount is c } else { int dst_stride = blk * jcp_.OW * jcp_.OH * jcp_.dst_data_size; int src_stride = blk * jcp_.IW * jcp_.IH * jcp_.src_data_size; @@ -1142,7 +1167,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi cubic_c_gathered_matrix(true); if (attr_.post_ops_.len() != 0) { - apply_post_ops(jcp_.dst_prc, false); // vmm_val is default dst value + apply_post_ops(jcp_.dst_prc, false); // vmm_val is default dst value add(reg_oc_off, scalar_step * sizeof(float)); } store(vmm_val, reg_dst, scalar_step); @@ -1151,7 +1176,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi int src_stride = scalar_step * jcp_.src_data_size; add(reg_dst, dst_stride); add(reg_src, src_stride); - sub(reg_work_amount, scalar_step); // work_amount is c + sub(reg_work_amount, scalar_step); // work_amount is c jmp(tail_loop_label, T_NEAR); } @@ -1242,7 +1267,9 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // build weightX used in y0-y3 // weight format: w0_0 w1_0 w2_0 w3_0 w0_1 w1_1 w2_1 w3_1 ... uni_vpcmpeqd(vmm_mask, vmm_mask, vmm_mask); - vgatherdps(vmm_weightX0, ptr[reg_weight_x + vmm_val * grid_len], vmm_mask); // 4 in vmm_val for weight_size, another 4 for grid_len + vgatherdps(vmm_weightX0, + ptr[reg_weight_x + vmm_val * grid_len], + vmm_mask); // 4 in vmm_val for weight_size, another 4 for grid_len uni_vpcmpeqd(vmm_mask, vmm_mask, vmm_mask); // shift weight_size then gather second weight @@ -1326,8 +1353,20 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi // gather weightX by input idx, used in y0-y3 gather_i32_indices(vmm_weightX0, reg_weight_x, 0, vmm_val, grid_len, ov::element::f32, true); gather_i32_indices(vmm_weightX1, reg_weight_x, sizeof(float), vmm_val, grid_len, ov::element::f32, true); - gather_i32_indices(vmm_weightX2, reg_weight_x, 2 * sizeof(float), vmm_val, grid_len, ov::element::f32, true); - gather_i32_indices(vmm_weightX3, reg_weight_x, 3 * sizeof(float), vmm_val, grid_len, ov::element::f32, true); + gather_i32_indices(vmm_weightX2, + reg_weight_x, + 2 * sizeof(float), + vmm_val, + grid_len, + ov::element::f32, + true); + gather_i32_indices(vmm_weightX3, + reg_weight_x, + 3 * sizeof(float), + vmm_val, + grid_len, + ov::element::f32, + true); // vmm_val is now relieved and used for dst_value uni_vpxor(vmm_val, vmm_val, vmm_val); @@ -1354,7 +1393,13 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi vpminsd(vmm_index_y_itr, vmm_index_y_itr, cubic_planar_table_val(1)); vpmaxsd(vmm_index_y_itr, vmm_index_y_itr, vmm_zero); // weight y2 - gather_i32_indices(vmm_weightY, reg_weight_y, 2 * sizeof(float), vmm_tbl_y, grid_len, ov::element::f32, true); + gather_i32_indices(vmm_weightY, + reg_weight_y, + 2 * sizeof(float), + vmm_tbl_y, + grid_len, + ov::element::f32, + true); cubic_planar_line(true); // y3 @@ -1364,7 +1409,13 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi vpminsd(vmm_index_y_itr, vmm_index_y_itr, cubic_planar_table_val(1)); vpmaxsd(vmm_index_y_itr, vmm_index_y_itr, vmm_zero); // weight y3 - gather_i32_indices(vmm_weightY, reg_weight_y, 3 * sizeof(float), vmm_tbl_y, grid_len, ov::element::f32, true); + gather_i32_indices(vmm_weightY, + reg_weight_y, + 3 * sizeof(float), + vmm_tbl_y, + grid_len, + ov::element::f32, + true); cubic_planar_line(true); if (attr_.post_ops_.len() != 0) { @@ -1453,8 +1504,13 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } // always gather to Vmm, compute with Vmm, store with Xmm if scalar_step - inline void gather_i32_indices(Vmm vmm_src, const Xbyak::Reg64 &base, int offset, Vmm vmm_indices, int scale, - ov::element::Type src_prc, bool is_scalar) { + inline void gather_i32_indices(Vmm vmm_src, + const Xbyak::Reg64& base, + int offset, + Vmm vmm_indices, + int scale, + ov::element::Type src_prc, + bool is_scalar) { Xbyak::Address table_idx = ptr[base + offset + vmm_indices * scale]; if ((isa == cpu::x64::avx512_core) && !is_scalar) { // [0-15] bit of int to mask @@ -1483,8 +1539,8 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi int repeats = is_scalar ? 1 : vlen / sizeof(float); for (int i = 0; i < repeats; ++i) { - mov(reg_tmp_64.cvt32(), ptr[rsp + i * sizeof(int)]); // sizeof(int) index_size - table_idx = ptr[base + offset + reg_tmp_64 * scale]; // scale: sizeof(float) value_size + mov(reg_tmp_64.cvt32(), ptr[rsp + i * sizeof(int)]); // sizeof(int) index_size + table_idx = ptr[base + offset + reg_tmp_64 * scale]; // scale: sizeof(float) value_size mov(reg_tmp_64.cvt32(), table_idx); mov(ptr[rsp + i * sizeof(int)], reg_tmp_64.cvt32()); } @@ -1497,9 +1553,10 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } } - // is_broadcast for broadcasting param for depth_wise and quantize(channel-sensitive post-ops), for fusion with plain layout. + // is_broadcast for broadcasting param for depth_wise and quantize(channel-sensitive post-ops), for fusion with + // plain layout. void apply_post_ops(ov::element::Type dst_prc, bool is_broadcast) { - const auto &p = attr_.post_ops_; + const auto& p = attr_.post_ops_; int eltwise_inj_idx = 0; int depthwise_inj_idx = 0; int quantization_inj_idx = 0; @@ -1514,8 +1571,11 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi add(reg_d_weights, reg_oc_off); // weight and bias is padded. scalar as vector. - depthwise_injectors[depthwise_inj_idx]->compute_vector_range( - vmm_val.getIdx(), vmm_val.getIdx() + 1, reg_d_weights, reg_d_weights, is_broadcast); + depthwise_injectors[depthwise_inj_idx]->compute_vector_range(vmm_val.getIdx(), + vmm_val.getIdx() + 1, + reg_d_weights, + reg_d_weights, + is_broadcast); post_ops_data_offset += depthwise_injectors[depthwise_inj_idx]->memoryStep(); depthwise_inj_idx++; @@ -1525,15 +1585,25 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi int s_idx = vmm_val.getIdx(); - quantization_injectors[quantization_inj_idx]->init_crop_ptrs(reg_post_ops_data + post_ops_data_offset, reg_oc_off); + quantization_injectors[quantization_inj_idx]->init_crop_ptrs(reg_post_ops_data + post_ops_data_offset, + reg_oc_off); quantization_injectors[quantization_inj_idx]->compute_crop(s_idx, s_idx + 1, 0, 0, is_broadcast); - quantization_injectors[quantization_inj_idx]->init_input_scale_shift_ptrs(reg_post_ops_data + post_ops_data_offset, reg_oc_off); - quantization_injectors[quantization_inj_idx]->compute_input_scale_shift(s_idx, s_idx + 1, 0, do_rounding, 0, is_broadcast); + quantization_injectors[quantization_inj_idx]->init_input_scale_shift_ptrs( + reg_post_ops_data + post_ops_data_offset, + reg_oc_off); + quantization_injectors[quantization_inj_idx] + ->compute_input_scale_shift(s_idx, s_idx + 1, 0, do_rounding, 0, is_broadcast); if (do_dequantization) { - quantization_injectors[quantization_inj_idx]->init_output_scale_shift_ptrs(reg_post_ops_data + post_ops_data_offset, reg_oc_off); - quantization_injectors[quantization_inj_idx]->compute_output_scale_shift(s_idx, s_idx + 1, 0, 0, is_broadcast); + quantization_injectors[quantization_inj_idx]->init_output_scale_shift_ptrs( + reg_post_ops_data + post_ops_data_offset, + reg_oc_off); + quantization_injectors[quantization_inj_idx]->compute_output_scale_shift(s_idx, + s_idx + 1, + 0, + 0, + is_broadcast); } post_ops_data_offset += quantization_injectors[quantization_inj_idx]->memoryStep(); @@ -1543,7 +1613,7 @@ struct jit_uni_interpolate_kernel_f32 : public jit_uni_interpolate_kernel, publi } }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 namespace { struct InterpolateKey { @@ -1585,7 +1655,7 @@ size_t InterpolateKey::hash() const { return seed; } -bool InterpolateKey::operator==(const InterpolateKey &rhs) const { +bool InterpolateKey::operator==(const InterpolateKey& rhs) const { if (nodeAttrs.mode != rhs.nodeAttrs.mode) return false; if (nodeAttrs.coordTransMode != rhs.nodeAttrs.coordTransMode) @@ -1619,7 +1689,7 @@ bool InterpolateKey::operator==(const InterpolateKey &rhs) const { return true; } -} // namespace +} // namespace // shapeND: n c d h w // blockND: ncdhw cdhw dhw hw w 1 @@ -1628,7 +1698,7 @@ inline VectorDims getBlockND(const VectorDims& shape) { int shapeRank = shape.size(); VectorDims blockND(shapeRank + 1, 1); for (int i = shapeRank - 1; i >= 0; i--) { - blockND[i] = shape[i] * blockND[i+1]; + blockND[i] = shape[i] * blockND[i + 1]; } return blockND; } @@ -1664,32 +1734,47 @@ using ngInterpShapeCalcMode = ov::op::v4::Interpolate::ShapeCalcMode; bool Interpolate::isSupportedOperation(const std::shared_ptr& op, std::string& errorMessage) noexcept { try { if (const auto interp = std::dynamic_pointer_cast(op)) { - const auto &interpAttr = interp->get_attrs(); - const auto &interpMode = interpAttr.mode; - if (!one_of(interpMode, ngInterpMode::NEAREST, ngInterpMode::LINEAR, ngInterpMode::LINEAR_ONNX, ngInterpMode::CUBIC)) { + const auto& interpAttr = interp->get_attrs(); + const auto& interpMode = interpAttr.mode; + if (!one_of(interpMode, + ngInterpMode::NEAREST, + ngInterpMode::LINEAR, + ngInterpMode::LINEAR_ONNX, + ngInterpMode::CUBIC)) { errorMessage = "Interpolate-4 does not support interpolate mode: " + ov::as_string(interpMode); return false; } - const auto &interpCoordTransMode = interpAttr.coordinate_transformation_mode; - if (!one_of(interpCoordTransMode, ngInterpCoordTransf::HALF_PIXEL, ngInterpCoordTransf::PYTORCH_HALF_PIXEL, ngInterpCoordTransf::ASYMMETRIC, - ngInterpCoordTransf::TF_HALF_PIXEL_FOR_NN, ngInterpCoordTransf::ALIGN_CORNERS)) { - errorMessage = "Interpolate-4 does not support coordinate transformation mode: " + ov::as_string(interpCoordTransMode); + const auto& interpCoordTransMode = interpAttr.coordinate_transformation_mode; + if (!one_of(interpCoordTransMode, + ngInterpCoordTransf::HALF_PIXEL, + ngInterpCoordTransf::PYTORCH_HALF_PIXEL, + ngInterpCoordTransf::ASYMMETRIC, + ngInterpCoordTransf::TF_HALF_PIXEL_FOR_NN, + ngInterpCoordTransf::ALIGN_CORNERS)) { + errorMessage = "Interpolate-4 does not support coordinate transformation mode: " + + ov::as_string(interpCoordTransMode); return false; } if (interpMode == ngInterpMode::NEAREST) { - const auto &interpNearestMode = interpAttr.nearest_mode; - if (!one_of(interpNearestMode, ngInterpNearMode::ROUND_PREFER_FLOOR, ngInterpNearMode::ROUND_PREFER_CEIL, ngInterpNearMode::FLOOR, - ngInterpNearMode::CEIL, ngInterpNearMode::SIMPLE)) { - errorMessage = "Interpolate-4 does not support nearest round mode: " + ov::as_string(interpNearestMode); + const auto& interpNearestMode = interpAttr.nearest_mode; + if (!one_of(interpNearestMode, + ngInterpNearMode::ROUND_PREFER_FLOOR, + ngInterpNearMode::ROUND_PREFER_CEIL, + ngInterpNearMode::FLOOR, + ngInterpNearMode::CEIL, + ngInterpNearMode::SIMPLE)) { + errorMessage = + "Interpolate-4 does not support nearest round mode: " + ov::as_string(interpNearestMode); return false; } } - const auto &interpShapeCalcMode = interpAttr.shape_calculation_mode; + const auto& interpShapeCalcMode = interpAttr.shape_calculation_mode; if (!one_of(interpShapeCalcMode, ngInterpShapeCalcMode::SCALES, ngInterpShapeCalcMode::SIZES)) { - errorMessage = "Interpolate-4 does not support shape_calculation_mode: " + ov::as_string(interpShapeCalcMode); + errorMessage = + "Interpolate-4 does not support shape_calculation_mode: " + ov::as_string(interpShapeCalcMode); return false; } @@ -1700,7 +1785,8 @@ bool Interpolate::isSupportedOperation(const std::shared_ptr& op } if (dataRank == 5 && interpMode == ngInterpMode::CUBIC) { - errorMessage = "Interpolate-4 doesn't support input tensor with rank: " + std::to_string(dataRank) + " for 'cubic' mode "; + errorMessage = "Interpolate-4 doesn't support input tensor with rank: " + std::to_string(dataRank) + + " for 'cubic' mode "; return false; } @@ -1710,21 +1796,22 @@ bool Interpolate::isSupportedOperation(const std::shared_ptr& op return false; } - if (interp->get_input_size() > 3 && - std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID)) == nullptr) { + if (interp->get_input_size() > 3 && std::dynamic_pointer_cast( + interp->get_input_node_shared_ptr(AXES_ID)) == nullptr) { errorMessage = "Only const 'axes' input is supported in Interpolate-4"; return false; } } else if (const auto interp = std::dynamic_pointer_cast(op)) { - const auto &interpAttr = interp->get_attrs(); - const auto &interpMode = interpAttr.mode; + const auto& interpAttr = interp->get_attrs(); + const auto& interpMode = interpAttr.mode; if (!one_of(interpMode, ngInterpMode::BILINEAR_PILLOW, ngInterpMode::BICUBIC_PILLOW)) { errorMessage = "Interpolate-11 does not support interpolate mode: " + ov::as_string(interpMode); return false; } - const auto &interpShapeCalcMode = interpAttr.shape_calculation_mode; + const auto& interpShapeCalcMode = interpAttr.shape_calculation_mode; if (!one_of(interpShapeCalcMode, ngInterpShapeCalcMode::SCALES, ngInterpShapeCalcMode::SIZES)) { - errorMessage = "Interpolate-11 does not support shape_calculation_mode: " + ov::as_string(interpShapeCalcMode); + errorMessage = + "Interpolate-11 does not support shape_calculation_mode: " + ov::as_string(interpShapeCalcMode); return false; } const size_t dataRank = interp->get_input_partial_shape(DATA_ID).rank().get_length(); @@ -1734,12 +1821,12 @@ bool Interpolate::isSupportedOperation(const std::shared_ptr& op return false; } if (!isDynamicNgraphNode(op) && - !ov::is_type(op->get_input_node_ptr(SIZE_OR_SCALE_ID_V11))) { + !ov::is_type(op->get_input_node_ptr(SIZE_OR_SCALE_ID_V11))) { errorMessage = "Only const 'scales_or_sizes' input is supported for static shapes in Interpolate-11"; return false; } - if (interp->get_input_size() > 2 && - std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID_V11)) == nullptr) { + if (interp->get_input_size() > 2 && std::dynamic_pointer_cast( + interp->get_input_node_shared_ptr(AXES_ID_V11)) == nullptr) { errorMessage = "Only const 'axes' input is supported in Interpolate-11"; return false; } @@ -1763,7 +1850,7 @@ class InterpolateShapeInferFactory : public ShapeInferFactory { InterpolateShapeInferFactory(std::shared_ptr op) : m_op(op) {} ShapeInferPtr makeShapeInfer() const override { if (auto interp4 = ov::as_type_ptr(m_op)) { - const auto &attr = interp4->get_attrs(); + const auto& attr = interp4->get_attrs(); const auto is_supported_mode = (attr.shape_calculation_mode == ngInterpShapeCalcMode::SCALES) || (attr.shape_calculation_mode == ngInterpShapeCalcMode::SIZES); OPENVINO_ASSERT(is_supported_mode, "Unsupported interpolate shape calculation mode"); @@ -1782,10 +1869,10 @@ class InterpolateShapeInferFactory : public ShapeInferFactory { private: std::shared_ptr m_op; }; -} // namespace +} // namespace Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext::CPtr context) - : Node(op, context, InterpolateShapeInferFactory(op)) { + : Node(op, context, InterpolateShapeInferFactory(op)) { std::string errorMessage; if (isSupportedOperation(op, errorMessage)) { errorPrefix = "Interpolate node with name '" + getName() + "'"; @@ -1799,9 +1886,9 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext OPENVINO_THROW(errorPrefix, " has incorrect number of output edges"); isAxesSpecified = numInputs != 3; - const auto &interpAttr = interp->get_attrs(); + const auto& interpAttr = interp->get_attrs(); - const auto &interpMode = interpAttr.mode; + const auto& interpMode = interpAttr.mode; if (interpMode == ngInterpMode::NEAREST) { interpAttrs.mode = InterpolateMode::nearest; } else if (interpMode == ngInterpMode::LINEAR) { @@ -1818,7 +1905,7 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext OPENVINO_THROW(errorPrefix, " has unsupported interpolate mode"); } - const auto &interpCoordTransMode = interpAttr.coordinate_transformation_mode; + const auto& interpCoordTransMode = interpAttr.coordinate_transformation_mode; if (interpCoordTransMode == ngInterpCoordTransf::HALF_PIXEL) { interpAttrs.coordTransMode = InterpolateCoordTransMode::half_pixel; } else if (interpCoordTransMode == ngInterpCoordTransf::PYTORCH_HALF_PIXEL) { @@ -1834,7 +1921,7 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext } if (interpAttrs.mode == InterpolateMode::nearest) { - const auto &interpNearestMode = interpAttr.nearest_mode; + const auto& interpNearestMode = interpAttr.nearest_mode; if (interpNearestMode == ngInterpNearMode::ROUND_PREFER_FLOOR) { interpAttrs.nearestMode = InterpolateNearestMode::round_prefer_floor; } else if (interpNearestMode == ngInterpNearMode::ROUND_PREFER_CEIL) { @@ -1853,7 +1940,7 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext } interpAttrs.antialias = interpAttr.antialias; - const auto &interpShapeCalcMode = interpAttr.shape_calculation_mode; + const auto& interpShapeCalcMode = interpAttr.shape_calculation_mode; if (interpShapeCalcMode == ngInterpShapeCalcMode::SCALES) { interpAttrs.shapeCalcMode = InterpolateShapeCalcMode::scales; } else if (interpShapeCalcMode == ngInterpShapeCalcMode::SIZES) { @@ -1878,14 +1965,16 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext interpAttrs.padEnd[i] = static_cast(interpAttr.pads_end[i]); } - const auto scalesNode = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(SCALES_ID)); + const auto scalesNode = + std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(SCALES_ID)); if (scalesNode) { scales = scalesNode->cast_vector(); isScaleConstant = true; } if (isAxesSpecified) { - axes = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID))->cast_vector(); + axes = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID)) + ->cast_vector(); } else { axes.resize(dataRank); for (int i = 0; i < static_cast(dataRank); i++) { @@ -1901,13 +1990,13 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext OPENVINO_THROW(errorPrefix, " has incorrect number of output edges"); isAxesSpecified = numInputs != 2; - const auto &interpAttr = interp->get_attrs(); - const auto &interpMode = interpAttr.mode; + const auto& interpAttr = interp->get_attrs(); + const auto& interpMode = interpAttr.mode; if (interpMode == ngInterpMode::BILINEAR_PILLOW) { interpAttrs.mode = InterpolateMode::bilinear_pillow; } else if (interpMode == ngInterpMode::BICUBIC_PILLOW) { interpAttrs.mode = InterpolateMode::bicubic_pillow; - interpAttrs.cubeCoeff = static_cast(interpAttr.cube_coeff); // fixed to be -0.5 + interpAttrs.cubeCoeff = static_cast(interpAttr.cube_coeff); // fixed to be -0.5 } else { OPENVINO_THROW(errorPrefix, " has unsupported interpolate mode"); } @@ -1916,10 +2005,11 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext interpAttrs.coordTransMode = InterpolateCoordTransMode::tf_half_pixel_for_nn; interpAttrs.antialias = interpAttr.antialias; - const auto &interpShapeCalcMode = interpAttr.shape_calculation_mode; + const auto& interpShapeCalcMode = interpAttr.shape_calculation_mode; if (interpShapeCalcMode == ngInterpShapeCalcMode::SCALES) { interpAttrs.shapeCalcMode = InterpolateShapeCalcMode::scales; - const auto scalesNode = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(SIZE_OR_SCALE_ID_V11)); + const auto scalesNode = std::dynamic_pointer_cast( + interp->get_input_node_shared_ptr(SIZE_OR_SCALE_ID_V11)); if (scalesNode) { scales = scalesNode->cast_vector(); isScaleConstant = true; @@ -1947,7 +2037,9 @@ Interpolate::Interpolate(const std::shared_ptr& op, const GraphContext } if (isAxesSpecified) { - axes = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID_V11))->cast_vector(); + axes = std::dynamic_pointer_cast( + interp->get_input_node_shared_ptr(AXES_ID_V11)) + ->cast_vector(); if (dataRank == 4 && axes.size() == 2 && axes[0] == 1 && axes[1] == 2 && mayiuse(cpu::x64::sse41)) { NCHWAsNHWC = true; axes[0] = 2; @@ -1986,7 +2078,7 @@ void Interpolate::getSupportedDescriptors() { break; } } - //correct pad + // correct pad if (hasPad) { NCHWAsNHWC = false; auto correctPad = [&](std::vector pad, int rank) { @@ -2064,15 +2156,21 @@ void Interpolate::initSupportedPrimitiveDescriptors() { } } auto& creatorsMap = BlockedDescCreator::getCommonCreators(); - auto pushDesc = [&](LayoutType dataFormat, impl_desc_type implDetail, bool is_version11, bool useAclExecutor = false) { - config.inConfs[DATA_ID].setMemDesc(creatorsMap.at(dataFormat)->createSharedDesc(inputPrecision, getInputShapeAtPort(DATA_ID))); + auto pushDesc = [&](LayoutType dataFormat, + impl_desc_type implDetail, + bool is_version11, + bool useAclExecutor = false) { + config.inConfs[DATA_ID].setMemDesc( + creatorsMap.at(dataFormat)->createSharedDesc(inputPrecision, getInputShapeAtPort(DATA_ID))); if (is_version11) { if (interpAttrs.shapeCalcMode == InterpolateShapeCalcMode::sizes) { config.inConfs[SIZE_OR_SCALE_ID_V11].setMemDesc( - creatorsMap.at(LayoutType::ncsp)->createSharedDesc(targetShapeType, getInputShapeAtPort(SIZE_OR_SCALE_ID_V11))); + creatorsMap.at(LayoutType::ncsp) + ->createSharedDesc(targetShapeType, getInputShapeAtPort(SIZE_OR_SCALE_ID_V11))); } else { config.inConfs[SIZE_OR_SCALE_ID_V11].setMemDesc( - creatorsMap.at(LayoutType::ncsp)->createSharedDesc(scalesType, getInputShapeAtPort(SIZE_OR_SCALE_ID_V11))); + creatorsMap.at(LayoutType::ncsp) + ->createSharedDesc(scalesType, getInputShapeAtPort(SIZE_OR_SCALE_ID_V11))); } if (isAxesSpecified) @@ -2080,14 +2178,18 @@ void Interpolate::initSupportedPrimitiveDescriptors() { creatorsMap.at(LayoutType::ncsp)->createSharedDesc(axesType, getInputShapeAtPort(AXES_ID_V11))); } else { config.inConfs[TARGET_SHAPE_ID].setMemDesc( - creatorsMap.at(LayoutType::ncsp)->createSharedDesc(targetShapeType, getInputShapeAtPort(TARGET_SHAPE_ID))); - config.inConfs[get_scale_id()].setMemDesc(creatorsMap.at(LayoutType::ncsp)->createSharedDesc(scalesType, getInputShapeAtPort(get_scale_id()))); + creatorsMap.at(LayoutType::ncsp) + ->createSharedDesc(targetShapeType, getInputShapeAtPort(TARGET_SHAPE_ID))); + config.inConfs[get_scale_id()].setMemDesc( + creatorsMap.at(LayoutType::ncsp)->createSharedDesc(scalesType, getInputShapeAtPort(get_scale_id()))); if (isAxesSpecified) - config.inConfs[get_axis_id()].setMemDesc(creatorsMap.at(LayoutType::ncsp)->createSharedDesc(axesType, getInputShapeAtPort(get_axis_id()))); + config.inConfs[get_axis_id()].setMemDesc( + creatorsMap.at(LayoutType::ncsp)->createSharedDesc(axesType, getInputShapeAtPort(get_axis_id()))); } - config.outConfs[0].setMemDesc(creatorsMap.at(dataFormat)->createSharedDesc(outputPrecision, getOutputShapeAtPort(0))); + config.outConfs[0].setMemDesc( + creatorsMap.at(dataFormat)->createSharedDesc(outputPrecision, getOutputShapeAtPort(0))); if (useAclExecutor) { std::vector srcMemoryDescs; @@ -2099,8 +2201,11 @@ void Interpolate::initSupportedPrimitiveDescriptors() { dstMemoryDescs.push_back(config.outConfs[i].getMemDesc()); } - auto factory = std::make_shared(interpAttrs, srcMemoryDescs, dstMemoryDescs, - std::make_shared(context, getImplPriority())); + auto factory = std::make_shared( + interpAttrs, + srcMemoryDescs, + dstMemoryDescs, + std::make_shared(context, getImplPriority())); if (!factory->isEmpty()) { supportedPrimitiveDescriptors.push_back({config, implDetail, factory}); } @@ -2109,14 +2214,14 @@ void Interpolate::initSupportedPrimitiveDescriptors() { } }; if (is_version11) { -#if defined (OV_CPU_WITH_ACL) +#if defined(OV_CPU_WITH_ACL) interpAttrs.hasPad = hasPad; pushDesc(LayoutType::nspc, undef, true, true); pushDesc(LayoutType::ncsp, undef, true, true); canUseAclExecutor = !supportedPrimitiveDescriptors.empty(); if (canUseAclExecutor) return; - //fallback to f32 if ref is used + // fallback to f32 if ref is used inputPrecision = outputPrecision = ov::element::f32; #endif @@ -2140,17 +2245,17 @@ void Interpolate::initSupportedPrimitiveDescriptors() { } pushDesc(LayoutType::ncsp, ref, true); } else { - const auto &dataMinDims = getInputShapeAtPort(DATA_ID).getMinDims(); + const auto& dataMinDims = getInputShapeAtPort(DATA_ID).getMinDims(); bool isBlkApplied = dataRank > 1 && dataMinDims[1] != Shape::UNDEFINED_DIM && dataMinDims[1] > 1; -#if defined (OV_CPU_WITH_ACL) +#if defined(OV_CPU_WITH_ACL) interpAttrs.hasPad = hasPad; pushDesc(LayoutType::nspc, undef, false, true); pushDesc(LayoutType::ncsp, undef, false, true); canUseAclExecutor = !supportedPrimitiveDescriptors.empty(); if (canUseAclExecutor) return; - //fallback to f32 if ref is used + // fallback to f32 if ref is used inputPrecision = outputPrecision = ov::element::f32; #endif @@ -2195,7 +2300,7 @@ bool Interpolate::needShapeInfer() const { if (lastScales.empty()) { return true; } - const float *scales = getSrcDataAtPortAs(get_scale_id()); + const float* scales = getSrcDataAtPortAs(get_scale_id()); for (size_t i = 0; i < lastScales.size(); i++) { if (lastScales[i] != scales[i]) { return true; @@ -2205,7 +2310,7 @@ bool Interpolate::needShapeInfer() const { if (lastSizes.empty()) { return true; } - const int32_t *sizes = getSrcDataAtPortAs(TARGET_SHAPE_ID); + const int32_t* sizes = getSrcDataAtPortAs(TARGET_SHAPE_ID); for (size_t i = 0; i < lastSizes.size(); i++) { if (sizes[i] != lastSizes[i]) { return true; @@ -2219,12 +2324,12 @@ void Interpolate::executeDynamicImpl(dnnl::stream strm) { execute(strm); const size_t port = interpAttrs.shapeCalcMode == InterpolateShapeCalcMode::sizes ? TARGET_SHAPE_ID : get_scale_id(); - const auto &memory = getParentEdgeAt(port)->getMemory(); + const auto& memory = getParentEdgeAt(port)->getMemory(); if (interpAttrs.shapeCalcMode == InterpolateShapeCalcMode::scales) { - const float *scales = memory.getDataAs(); + const float* scales = memory.getDataAs(); lastScales.assign(scales, scales + memory.getDesc().getShape().getElementsCount()); } else { - const int32_t *sizes = memory.getDataAs(); + const int32_t* sizes = memory.getDataAs(); lastSizes.assign(sizes, sizes + memory.getDesc().getShape().getElementsCount()); } } @@ -2277,19 +2382,19 @@ void Interpolate::prepareParams() { OPENVINO_THROW(errorPrefix, " has undefined axes memory"); } - const NodeDesc *selected_pd = getSelectedPrimitiveDescriptor(); + const NodeDesc* selected_pd = getSelectedPrimitiveDescriptor(); if (selected_pd == nullptr) OPENVINO_THROW(errorPrefix, " did not set preferable primitive descriptor"); - const auto &srcDimsOrign = srcMemPtr->getStaticDims(); - const auto &dstDimsOrign = dstMemPtr->getStaticDims(); + const auto& srcDimsOrign = srcMemPtr->getStaticDims(); + const auto& dstDimsOrign = dstMemPtr->getStaticDims(); VectorDims srcDims = srcDimsOrign; VectorDims dstDims = dstDimsOrign; // layoutAlignment if (NCHWAsNHWC && srcMemPtr->getDesc().hasLayoutType(LayoutType::ncsp)) { - auto logicalShapeAlign = [] (VectorDims& Dims) { + auto logicalShapeAlign = [](VectorDims& Dims) { size_t C = Dims[3]; Dims[3] = Dims[2]; Dims[2] = Dims[1]; @@ -2308,7 +2413,8 @@ void Interpolate::prepareParams() { } } - std::vector dataScales = getScales(getPaddedInputShape(srcDims, interpAttrs.padBegin, interpAttrs.padEnd), dstDims); + std::vector dataScales = + getScales(getPaddedInputShape(srcDims, interpAttrs.padBegin, interpAttrs.padEnd), dstDims); if (!NCHWAsNHWC && (getOutputShapeAtPort(0).getRank() > 2 && (dataScales[0] != 1.f || dataScales[1] != 1.f))) { OPENVINO_THROW("Interpolate layer only supports resize on spatial dimensions(depth, height and width)"); } @@ -2324,7 +2430,10 @@ void Interpolate::prepareParams() { dstMemoryDescs.push_back(getDstMemoryAtPort(0)->getDescPtr()); auto selectedPD = getSelectedPrimitiveDescriptor(); - aclExecPtr = selectedPD->getExecutorFactoryAs()->makeExecutor(interpAttrs, srcMemoryDescs, dstMemoryDescs, {}); + aclExecPtr = selectedPD->getExecutorFactoryAs()->makeExecutor(interpAttrs, + srcMemoryDescs, + dstMemoryDescs, + {}); selectedPD->setImplementationType(aclExecPtr->getImplType()); return; @@ -2336,26 +2445,25 @@ void Interpolate::prepareParams() { auto buildExecutor = [&](const InterpolateKey& key) -> std::shared_ptr { std::shared_ptr executor; if ((key.nodeAttrs.mode == InterpolateMode::nearest || key.nodeAttrs.mode == InterpolateMode::linear_onnx || - key.nodeAttrs.mode == InterpolateMode::cubic) && + key.nodeAttrs.mode == InterpolateMode::cubic) && ((key.nodeAttrs.layout != InterpolateLayoutType::planar && mayiuse(cpu::x64::sse41)) || - (mayiuse(cpu::x64::avx2) && key.nodeAttrs.inPrc == ov::element::f32))) { + (mayiuse(cpu::x64::avx2) && key.nodeAttrs.inPrc == ov::element::f32))) { executor = std::make_shared(key.nodeAttrs, - key.srcDims, - key.dstDims, - key.dataScales, - key.attr); - } else if ((key.nodeAttrs.mode == InterpolateMode::bilinear_pillow || key.nodeAttrs.mode == InterpolateMode::bicubic_pillow) && - (key.nodeAttrs.layout == InterpolateLayoutType::by_channel)) { + key.srcDims, + key.dstDims, + key.dataScales, + key.attr); + } else if ((key.nodeAttrs.mode == InterpolateMode::bilinear_pillow || + key.nodeAttrs.mode == InterpolateMode::bicubic_pillow) && + (key.nodeAttrs.layout == InterpolateLayoutType::by_channel)) { executor = std::make_shared(key.nodeAttrs, - key.srcDims, - key.dstDims, - key.dataScales, - key.attr); + key.srcDims, + key.dstDims, + key.dataScales, + key.attr); } else { - executor = std::make_shared(key.nodeAttrs, - key.srcDims, - key.dstDims, - key.dataScales); + executor = + std::make_shared(key.nodeAttrs, key.srcDims, key.dstDims, key.dataScales); } return executor; }; @@ -2402,18 +2510,18 @@ static inline float triangleCoeff(float x) { return (std::max)(0.0f, 1 - std::abs(x)); } -void Interpolate::setPostOps(dnnl::primitive_attr &attr, const VectorDims &dims) { +void Interpolate::setPostOps(dnnl::primitive_attr& attr, const VectorDims& dims) { dnnl::post_ops ops; postOpsDataPtrs.clear(); - for (auto &node : fusedWith) { - auto* fakeQuantizeNode = dynamic_cast(node.get()); + for (auto& node : fusedWith) { + auto* fakeQuantizeNode = dynamic_cast(node.get()); if (fakeQuantizeNode) { fakeQuantizeNode->appendPostOps(ops, {}, postOpsDataPtrs); continue; } - auto* eltwiseNode = dynamic_cast(node.get()); + auto* eltwiseNode = dynamic_cast(node.get()); if (eltwiseNode) { eltwiseNode->appendPostOps(ops, dims, postOpsDataPtrs); continue; @@ -2429,9 +2537,9 @@ void Interpolate::setPostOps(dnnl::primitive_attr &attr, const VectorDims &dims) attr.set_post_ops(ops); } -VectorDims Interpolate::getPaddedInputShape(const VectorDims &srcDims, - const std::vector &padBegin, - const std::vector &padEnd) { +VectorDims Interpolate::getPaddedInputShape(const VectorDims& srcDims, + const std::vector& padBegin, + const std::vector& padEnd) { VectorDims paddedShape; int dataRank = srcDims.size(); for (int i = 0; i < dataRank; i++) { @@ -2443,18 +2551,21 @@ VectorDims Interpolate::getPaddedInputShape(const VectorDims &srcDims, // get scales of data rank size // if "scale" version: set scales with input scales, 1.f for other dims not in axis // if "size" version: scales = shape[target] / shape[input].pad, 1.f for other dims not in axis -// scales is a required input, but should not use input scales when "size" case, which may added eps or is a dummy value, recalculate scales instead. -std::vector Interpolate::getScales(const VectorDims &srcDimPad, const VectorDims &dstDim) { +// scales is a required input, but should not use input scales when "size" case, which may added eps or is a dummy +// value, recalculate scales instead. +std::vector Interpolate::getScales(const VectorDims& srcDimPad, const VectorDims& dstDim) { std::vector fullScales(dataRank, 1.f); const size_t axesRank = axes.size(); for (size_t i = 0; i < axesRank; i++) { int axis = axes[i]; // pillow always re-generate scales with input and output shape - if (interpAttrs.mode == InterpolateMode::bilinear_pillow || interpAttrs.mode == InterpolateMode::bicubic_pillow) { + if (interpAttrs.mode == InterpolateMode::bilinear_pillow || + interpAttrs.mode == InterpolateMode::bicubic_pillow) { fullScales[axis] = static_cast(dstDim[axis]) / static_cast(srcDimPad[axis]); } else { - fullScales[axis] = (interpAttrs.shapeCalcMode == InterpolateShapeCalcMode::scales) ? scales[i] : - static_cast(dstDim[axis]) / static_cast(srcDimPad[axis]); + fullScales[axis] = (interpAttrs.shapeCalcMode == InterpolateShapeCalcMode::scales) + ? scales[i] + : static_cast(dstDim[axis]) / static_cast(srcDimPad[axis]); } } return fullScales; @@ -2465,12 +2576,12 @@ void Interpolate::execute(dnnl::stream strm) { auto srcMemPtr = getSrcMemoryAtPort(DATA_ID); if (execPtr) { - uint8_t *dst_data = dstMemPtr->getDataAs(); - const uint8_t *src_data_origin = srcMemPtr->getDataAs(); - const uint8_t *src_data = nullptr; + uint8_t* dst_data = dstMemPtr->getDataAs(); + const uint8_t* src_data_origin = srcMemPtr->getDataAs(); + const uint8_t* src_data = nullptr; std::vector srcPadded; if (hasPad) { - const auto &srcDim = srcMemPtr->getStaticDims(); + const auto& srcDim = srcMemPtr->getStaticDims(); auto srcDimPad = execPtr->getSrcDimPad5d(); size_t dimSize = srcDim.size(); @@ -2489,23 +2600,34 @@ void Interpolate::execute(dnnl::stream strm) { if (interpAttrs.layout == InterpolateLayoutType::planar) { srcPadded.resize(inShapePadBlock[0] * srcDataSize, 0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); parallel_for4d(srcDim5d[0], srcDim5d[1], srcDim5d[2], srcDim5d[3], [&](int n, int c, int d, int h) { - const uint8_t *src = src_data_origin + - (inShapeBlock[1] * n + inShapeBlock[2] * c + inShapeBlock[3] * d + inShapeBlock[4] * h) * srcDataSize; - uint8_t *srcPad = src_data_pad + (inShapePadBlock[1] * (n + padB0) + inShapePadBlock[2] * (c + padB1) + - inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + padB4) * srcDataSize; + const uint8_t* src = src_data_origin + (inShapeBlock[1] * n + inShapeBlock[2] * c + + inShapeBlock[3] * d + inShapeBlock[4] * h) * + srcDataSize; + uint8_t* srcPad = + src_data_pad + (inShapePadBlock[1] * (n + padB0) + inShapePadBlock[2] * (c + padB1) + + inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + padB4) * + srcDataSize; cpu_memcpy(srcPad, src, srcDim5d[4] * srcDataSize); }); src_data = src_data_pad; } else if (interpAttrs.layout == InterpolateLayoutType::by_channel) { srcPadded.resize(inShapePadBlock[0] * srcDataSize, 0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); parallel_for4d(srcDim5d[0], srcDim5d[2], srcDim5d[3], srcDim5d[4], [&](int n, int d, int h, int w) { - const uint8_t *src = src_data_origin + (inShapeBlock[1] * n + - (inShapeBlock[3] * d + inShapeBlock[4] * h + inShapeBlock[5] * w) * srcDim5d[1]) * srcDataSize; - uint8_t *srcPad = src_data_pad + (inShapePadBlock[1] * (n + padB0) + (inShapePadBlock[3] * (d + padB2) + - inShapePadBlock[4] * (h + padB3) + inShapePadBlock[5] * (w + padB4)) * srcDimPad5d[1] + padB1) * srcDataSize; + const uint8_t* src = + src_data_origin + + (inShapeBlock[1] * n + + (inShapeBlock[3] * d + inShapeBlock[4] * h + inShapeBlock[5] * w) * srcDim5d[1]) * + srcDataSize; + uint8_t* srcPad = + src_data_pad + (inShapePadBlock[1] * (n + padB0) + + (inShapePadBlock[3] * (d + padB2) + inShapePadBlock[4] * (h + padB3) + + inShapePadBlock[5] * (w + padB4)) * + srcDimPad5d[1] + + padB1) * + srcDataSize; cpu_memcpy(srcPad, src, srcDim5d[1] * srcDataSize); }); src_data = src_data_pad; @@ -2514,25 +2636,34 @@ void Interpolate::execute(dnnl::stream strm) { size_t CB = div_up(srcDimPad5d[1], blkSize); size_t eltsTotal = srcDimPad5d[0] * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize; srcPadded.resize(eltsTotal * srcDataSize, 0x0); - uint8_t *src_data_pad = static_cast(&srcPadded[0]); + uint8_t* src_data_pad = static_cast(&srcPadded[0]); if ((srcDim5d[0] != srcDimPad5d[0]) || (srcDim5d[1] != srcDimPad5d[1])) { OPENVINO_THROW("Interpolate layer with name '", getName(), "' does not support padding on batch and channel dimensions"); } - parallel_for5d(srcDim5d[0], CB, srcDim5d[2], srcDim5d[3], srcDim5d[4], [&](int n, int cb, int d, int h, int w) { - const uint8_t *src = src_data_origin + (n * CB * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (cb * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (d * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize - + (h * srcDim5d[4] * blkSize) * srcDataSize - + (w * blkSize) * srcDataSize; - uint8_t *srcPad = src_data_pad + (n * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + (cb * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + ((d + padB2) * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize - + ((h + padB3) * srcDimPad5d[4] * blkSize) * srcDataSize - + ((w + padB4) * blkSize) * srcDataSize; - cpu_memcpy(srcPad, src, blkSize * srcDataSize); - }); + parallel_for5d(srcDim5d[0], + CB, + srcDim5d[2], + srcDim5d[3], + srcDim5d[4], + [&](int n, int cb, int d, int h, int w) { + const uint8_t* src = + src_data_origin + + (n * CB * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (cb * srcDim5d[2] * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (d * srcDim5d[3] * srcDim5d[4] * blkSize) * srcDataSize + + (h * srcDim5d[4] * blkSize) * srcDataSize + (w * blkSize) * srcDataSize; + uint8_t* srcPad = + src_data_pad + + (n * CB * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * + srcDataSize + + (cb * srcDimPad5d[2] * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize + + ((d + padB2) * srcDimPad5d[3] * srcDimPad5d[4] * blkSize) * srcDataSize + + ((h + padB3) * srcDimPad5d[4] * blkSize) * srcDataSize + + ((w + padB4) * blkSize) * srcDataSize; + cpu_memcpy(srcPad, src, blkSize * srcDataSize); + }); src_data = src_data_pad; } } else { @@ -2549,26 +2680,35 @@ void Interpolate::execute(dnnl::stream strm) { // for ndhwc and nCdhw8c[16c] // input may be f32/bf16/int8, fused->output varies -void Interpolate::InterpolateJitExecutor::NNCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW) { - int *index_d = static_cast(&auxTable[0]); - int *index_h = static_cast(&auxTable[OD]); - int *index_w = static_cast(&auxTable[OD + OH]); +void Interpolate::InterpolateJitExecutor::NNCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { + int* index_d = static_cast(&auxTable[0]); + int* index_h = static_cast(&auxTable[OD]); + int* index_w = static_cast(&auxTable[OD + OH]); bool is_nhwc = (configured_for_layout == by_channel); for (int b = 0; b < B; b++) { if (is_nhwc) { - const uint8_t *in_ptr = in_ptr_ + (IW * IH * ID * C * b) * srcDataSize; - uint8_t *out_ptr = out_ptr_ + (OW * OH * OD * C * b) * dstDataSize; + const uint8_t* in_ptr = in_ptr_ + (IW * IH * ID * C * b) * srcDataSize; + uint8_t* out_ptr = out_ptr_ + (OW * OH * OD * C * b) * dstDataSize; std::vector index_w_kernel(OW); for (int ox = 0; ox < OW; ox++) { index_w_kernel[ox] = index_w[ox] * C * srcDataSize; } parallel_for2d(OD, OH, [&](size_t d, size_t h) { // kernel for C * OW - uint8_t *out_ptr_dh = out_ptr + (C * OW * OH * d + C * OW * h) * dstDataSize; - const uint8_t *in_ptr_dh = in_ptr + (C * IW * IH * index_d[d] + C * IW * index_h[h]) * srcDataSize; + uint8_t* out_ptr_dh = out_ptr + (C * OW * OH * d + C * OW * h) * dstDataSize; + const uint8_t* in_ptr_dh = in_ptr + (C * IW * IH * index_d[d] + C * IW * index_h[h]) * srcDataSize; auto arg = jit_interpolate_call_args(); arg.dst = out_ptr_dh; arg.src_ptr[0] = in_ptr_dh; @@ -2581,15 +2721,16 @@ void Interpolate::InterpolateJitExecutor::NNCGathered(const uint8_t *in_ptr_, ui } else { // for blk int blk_size = mayiuse(cpu::x64::avx512_core) ? 16 : 8; int CB = div_up(C, blk_size); - const uint8_t *in_ptr = in_ptr_ + (IW * IH * ID * CB * blk_size * b) * srcDataSize; - uint8_t *out_ptr = out_ptr_ + (OW * OH * OD * CB * blk_size * b) * dstDataSize; + const uint8_t* in_ptr = in_ptr_ + (IW * IH * ID * CB * blk_size * b) * srcDataSize; + uint8_t* out_ptr = out_ptr_ + (OW * OH * OD * CB * blk_size * b) * dstDataSize; std::vector index_w_kernel(OW); for (int ox = 0; ox < OW; ox++) { index_w_kernel[ox] = index_w[ox] * blk_size * srcDataSize; } parallel_for2d(CB, OD, [&](size_t cb, size_t d) { - uint8_t *out_ptr_cbd = out_ptr + (blk_size * OW * OH * OD * cb + blk_size * OW * OH * d) * dstDataSize; - const uint8_t *in_ptr_cbd = in_ptr + (blk_size * IW * IH * ID * cb + blk_size * IW * IH * index_d[d]) * srcDataSize; + uint8_t* out_ptr_cbd = out_ptr + (blk_size * OW * OH * OD * cb + blk_size * OW * OH * d) * dstDataSize; + const uint8_t* in_ptr_cbd = + in_ptr + (blk_size * IW * IH * ID * cb + blk_size * IW * IH * index_d[d]) * srcDataSize; auto arg = jit_interpolate_call_args(); for (int h = 0; h < OH; h++) { // kernel for blk_size * OW arg.dst = out_ptr_cbd + blk_size * OW * h * dstDataSize; @@ -2605,11 +2746,20 @@ void Interpolate::InterpolateJitExecutor::NNCGathered(const uint8_t *in_ptr_, ui } // batch end } -void Interpolate::InterpolateJitExecutor::NNPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW) { - int *index_d = static_cast(&auxTable[0]); - int *index_h = static_cast(&auxTable[OD]); - int *index_w = static_cast(&auxTable[OD + OH]); +void Interpolate::InterpolateJitExecutor::NNPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { + int* index_d = static_cast(&auxTable[0]); + int* index_h = static_cast(&auxTable[OD]); + int* index_w = static_cast(&auxTable[OD + OH]); std::vector index_kernel(OH + OW); // index_h * IW * srcDataSize to reduce and simplify redundant compute @@ -2622,13 +2772,15 @@ void Interpolate::InterpolateJitExecutor::NNPlanar(const uint8_t *in_ptr_, uint8 } parallel_for3d(B, C, OD, [&](size_t b, size_t c, size_t od) { - const uint8_t *in_ptr = in_ptr_ + (IW * IH * ID * C * b + IW * IH * ID * c + IW * IH * index_d[od]) * srcDataSize; - uint8_t *out_ptr = out_ptr_ + (OW * OH * OD * C * b + OW * OH * OD * c + OW * OH * od) * dstDataSize; + const uint8_t* in_ptr = + in_ptr_ + (IW * IH * ID * C * b + IW * IH * ID * c + IW * IH * index_d[od]) * srcDataSize; + uint8_t* out_ptr = out_ptr_ + (OW * OH * OD * C * b + OW * OH * OD * c + OW * OH * od) * dstDataSize; auto arg = jit_interpolate_call_args(); arg.src_ptr[0] = in_ptr; arg.dst = out_ptr; - arg.index = static_cast(&index_kernel[0]); // need index_h and index_w in kernel, it's in continous memory so one param + arg.index = static_cast( + &index_kernel[0]); // need index_h and index_w in kernel, it's in continous memory so one param arg.oc_off = static_cast(c * sizeof(float)); // work_amount is OH(out loop) and OW(inner loop), can get in kernel from jcp. arg.post_op_data = post_ops_data_; @@ -2636,18 +2788,27 @@ void Interpolate::InterpolateJitExecutor::NNPlanar(const uint8_t *in_ptr_, uint8 }); } -void Interpolate::InterpolateJitExecutor::linearOnnxPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, int B, int C, - int ID, int IH, int IW, int OD, int OH, int OW) { - // FrontTopLeft:0, FrontTopRight:1, FrontBottomLeft:2, FrontBottomRight:3, EndTopLeft:4, EndTopRight:5, EndBottomLeft:6, EndBottomRight:7 - // weight: Left:0, ritht:1, top:2, bottom:3, front:4, end:5 - int *index = static_cast(&auxTable[0]); +void Interpolate::InterpolateJitExecutor::linearOnnxPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { + // FrontTopLeft:0, FrontTopRight:1, FrontBottomLeft:2, FrontBottomRight:3, EndTopLeft:4, EndTopRight:5, + // EndBottomLeft:6, EndBottomRight:7 weight: Left:0, ritht:1, top:2, bottom:3, front:4, end:5 + int* index = static_cast(&auxTable[0]); int eltInGrid = (spatialDimSize > 2) ? MAX_INPUT_INTERPOLATE : ((spatialDimSize > 1) ? 4 : 2); int scratchLen = rnd_up(eltInGrid * OW * OH * OD, 16); - float *weight = reinterpret_cast(&auxTable[scratchLen]); + float* weight = reinterpret_cast(&auxTable[scratchLen]); parallel_for2d(B, C, [&](size_t b, size_t c) { - uint8_t *out_ptr_nc = out_ptr_ + (OH * OW * OD * C * b + OH * OW * OD * c) * dstDataSize; - const uint8_t *in_ptr_nc = in_ptr_ + (IH * IW * ID * C * b + IH * IW * ID * c) * srcDataSize; + uint8_t* out_ptr_nc = out_ptr_ + (OH * OW * OD * C * b + OH * OW * OD * c) * dstDataSize; + const uint8_t* in_ptr_nc = in_ptr_ + (IH * IW * ID * C * b + IH * IW * ID * c) * srcDataSize; auto arg = jit_interpolate_call_args(); arg.src_ptr[0] = in_ptr_nc; arg.index = static_cast(&index[0]); @@ -2660,8 +2821,17 @@ void Interpolate::InterpolateJitExecutor::linearOnnxPlanar(const uint8_t *in_ptr }); } -void Interpolate::InterpolateJitExecutor::linearOnnxCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW) { +void Interpolate::InterpolateJitExecutor::linearOnnxCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { // left:OW right:OW Top:OH Bottom:OH Front:OD End:OD std::vector indexPtr(MAX_INPUT_INTERPOLATE, 0); std::vector weightPtr(MAX_INPUT_INTERPOLATE, 0); @@ -2696,18 +2866,18 @@ void Interpolate::InterpolateJitExecutor::linearOnnxCGathered(const uint8_t *in_ int I2 = ID * I1; int I3 = CB * I2; parallel_for3d(B, OD, OH, [&](size_t b, size_t d, size_t h) { - uint8_t *out_ptr_ndh = out_ptr_ + (C3 * b + C1 * d + C0 * h) * dstDataSize; - - const uint8_t *in_ptr_n = in_ptr_ + (I3 * b) * srcDataSize; - const uint8_t *in_ptr_nf = in_ptr_n + (indexPtr[4][d] * I1) * srcDataSize; - const uint8_t *in_ptr_nft = in_ptr_nf + (indexPtr[2][h] * I0) * srcDataSize; - const uint8_t *in_ptr_nfb = in_ptr_nf + (indexPtr[3][h] * I0) * srcDataSize; - const uint8_t *in_ptr_ne = in_ptr_n + (indexPtr[5][d] * I1) * srcDataSize; - const uint8_t *in_ptr_net = in_ptr_ne + (indexPtr[2][h] * I0) * srcDataSize; - const uint8_t *in_ptr_neb = in_ptr_ne + (indexPtr[3][h] * I0) * srcDataSize; + uint8_t* out_ptr_ndh = out_ptr_ + (C3 * b + C1 * d + C0 * h) * dstDataSize; + + const uint8_t* in_ptr_n = in_ptr_ + (I3 * b) * srcDataSize; + const uint8_t* in_ptr_nf = in_ptr_n + (indexPtr[4][d] * I1) * srcDataSize; + const uint8_t* in_ptr_nft = in_ptr_nf + (indexPtr[2][h] * I0) * srcDataSize; + const uint8_t* in_ptr_nfb = in_ptr_nf + (indexPtr[3][h] * I0) * srcDataSize; + const uint8_t* in_ptr_ne = in_ptr_n + (indexPtr[5][d] * I1) * srcDataSize; + const uint8_t* in_ptr_net = in_ptr_ne + (indexPtr[2][h] * I0) * srcDataSize; + const uint8_t* in_ptr_neb = in_ptr_ne + (indexPtr[3][h] * I0) * srcDataSize; auto arg = jit_interpolate_call_args(); for (int w = 0; w < OW; ++w) { - uint8_t *out_ptr_ndhw = out_ptr_ndh + CGatherLen * w * dstDataSize; + uint8_t* out_ptr_ndhw = out_ptr_ndh + CGatherLen * w * dstDataSize; arg.src_ptr[0] = in_ptr_nft + (indexPtr[0][w] * CGatherLen) * srcDataSize; arg.src_ptr[1] = in_ptr_nft + (indexPtr[1][w] * CGatherLen) * srcDataSize; @@ -2732,13 +2902,20 @@ void Interpolate::InterpolateJitExecutor::linearOnnxCGathered(const uint8_t *in_ }); } -void Interpolate::InterpolateJitExecutor::cubicCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW) { +void Interpolate::InterpolateJitExecutor::cubicCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW) { const int idxNum = 1; - int *xOrigin = static_cast(&auxTable[0]); - float *xFactor = reinterpret_cast(&auxTable[OW]); - int *yOrigin = static_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW]); - float *yFactor = reinterpret_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW + OH]); + int* xOrigin = static_cast(&auxTable[0]); + float* xFactor = reinterpret_cast(&auxTable[OW]); + int* yOrigin = static_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW]); + float* yFactor = reinterpret_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW + OH]); int blkSize = mayiuse(cpu::x64::avx512_core) ? 16 : 8; int CB = div_up(C, blkSize); @@ -2747,8 +2924,8 @@ void Interpolate::InterpolateJitExecutor::cubicCGathered(const uint8_t *in_ptr_, int workAmount = configured_for_layout == InterpolateLayoutType::by_channel ? C : CB; parallel_for3d(B, OH, OW, [&](size_t b, size_t h, size_t w) { - uint8_t *out_ptr_nhw = out_ptr_ + (OH * OW * CSize * b + OW * CGatherLen * h + CGatherLen * w) * dstDataSize; - const uint8_t *in_ptr_n = in_ptr_ + (IH * IW * CSize * b) * srcDataSize; + uint8_t* out_ptr_nhw = out_ptr_ + (OH * OW * CSize * b + OW * CGatherLen * h + CGatherLen * w) * dstDataSize; + const uint8_t* in_ptr_n = in_ptr_ + (IH * IW * CSize * b) * srcDataSize; std::vector kernelIndex(CUBIC_GRID_LEN * CUBIC_GRID_LEN); // 16 address offset to src(batch) or src(CB) int iy = yOrigin[h]; @@ -2763,41 +2940,48 @@ void Interpolate::InterpolateJitExecutor::cubicCGathered(const uint8_t *in_ptr_, } } auto arg = jit_interpolate_call_args(); - arg.dst = out_ptr_nhw; - arg.src_ptr[0] = in_ptr_n; - arg.index = static_cast(&kernelIndex[0]); - // 0 for weight_W, 1 for weight_H - arg.weight_ptr[0] = static_cast(&xFactor[w * CUBIC_GRID_LEN]); - arg.weight_ptr[1] = static_cast(&yFactor[h * CUBIC_GRID_LEN]); - - // for by channel, src + step, dst + step, process next step on continuous memory - // for blk, src + IW*IH*blkSize, dst + OW*OH*blkSize, process the blkSize on next CB - arg.work_amount = workAmount; - arg.oc_off = 0; - arg.post_op_data = post_ops_data_; - (*interpolateKernel)(&arg); + arg.dst = out_ptr_nhw; + arg.src_ptr[0] = in_ptr_n; + arg.index = static_cast(&kernelIndex[0]); + // 0 for weight_W, 1 for weight_H + arg.weight_ptr[0] = static_cast(&xFactor[w * CUBIC_GRID_LEN]); + arg.weight_ptr[1] = static_cast(&yFactor[h * CUBIC_GRID_LEN]); + + // for by channel, src + step, dst + step, process next step on continuous memory + // for blk, src + IW*IH*blkSize, dst + OW*OH*blkSize, process the blkSize on next CB + arg.work_amount = workAmount; + arg.oc_off = 0; + arg.post_op_data = post_ops_data_; + (*interpolateKernel)(&arg); }); } -void Interpolate::InterpolateJitExecutor::cubicPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW) { +void Interpolate::InterpolateJitExecutor::cubicPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW) { int tblAdvance = 0; - int *xOrigin = static_cast(&auxTable[tblAdvance]); + int* xOrigin = static_cast(&auxTable[tblAdvance]); tblAdvance += OW; - float *xFactor = reinterpret_cast(&auxTable[tblAdvance]); + float* xFactor = reinterpret_cast(&auxTable[tblAdvance]); tblAdvance += CUBIC_GRID_LEN * OW; - int *yOrigin = static_cast(&auxTable[tblAdvance]); + int* yOrigin = static_cast(&auxTable[tblAdvance]); tblAdvance += OH; - float *yFactor = reinterpret_cast(&auxTable[tblAdvance]); + float* yFactor = reinterpret_cast(&auxTable[tblAdvance]); tblAdvance += CUBIC_GRID_LEN * OH; - int *sequenceOH = static_cast(&auxTable[tblAdvance]); + int* sequenceOH = static_cast(&auxTable[tblAdvance]); tblAdvance += OW * OH; - int *sequenceOW = static_cast(&auxTable[tblAdvance]); + int* sequenceOW = static_cast(&auxTable[tblAdvance]); parallel_for2d(B, C, [&](size_t n, size_t c) { - const uint8_t *in_ptr_nc = in_ptr_ + (IW * IH * C * n + IW * IH * c) * srcDataSize; - uint8_t *out_ptr_nc = out_ptr_ + (OW * OH * C * n + OW * OH * c) * dstDataSize; + const uint8_t* in_ptr_nc = in_ptr_ + (IW * IH * C * n + IW * IH * c) * srcDataSize; + uint8_t* out_ptr_nc = out_ptr_ + (OW * OH * C * n + OW * OH * c) * dstDataSize; auto arg = jit_interpolate_call_args(); arg.dst = out_ptr_nc; @@ -2815,8 +2999,15 @@ void Interpolate::InterpolateJitExecutor::cubicPlanar(const uint8_t *in_ptr_, ui }); } -void Interpolate::InterpolateJitExecutor::pillowCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW) { +void Interpolate::InterpolateJitExecutor::pillowCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW) { // workBuffer needed when both pass are true bool xPass = IW != OW; bool yPass = IH != OH; @@ -2848,8 +3039,11 @@ void Interpolate::InterpolateJitExecutor::pillowCGathered(const uint8_t *in_ptr_ // ===================================================================================================================== // index layout: // d_0............d_OD-1, h_0..............h_OH-1, w_0................w_OW-1 -void Interpolate::InterpolateExecutorBase::buildTblNN(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, InterpolateLayoutType layout, InterpolateNearestMode nearestMode) { +void Interpolate::InterpolateExecutorBase::buildTblNN(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout, + InterpolateNearestMode nearestMode) { const int dimSize = dataRank; float fz = (dimSize == 5) ? dataScales[dimSize - 3] : 1.f; float fy = dataScales[dimSize - 2]; @@ -2881,80 +3075,91 @@ void Interpolate::InterpolateExecutorBase::buildTblNN(const VectorDims& srcDimPa // scale is float(outShape) / float(inShape) // strictly consistent with onnx calc manner(div scale, not multiply inverse), given this is done offline // the slight precison diff can produce obvious wrong value due to "nearest round" behavior for NN mode -float Interpolate::InterpolateExecutorBase::coordTransToInput(int outCoord, float scale, int inShape, int outShape) const { +float Interpolate::InterpolateExecutorBase::coordTransToInput(int outCoord, + float scale, + int inShape, + int outShape) const { if (scale == 1.0f || (inShape == outShape)) { return outCoord; } switch (coordTransMode) { - case InterpolateCoordTransMode::half_pixel: { + case InterpolateCoordTransMode::half_pixel: { + return (outCoord + 0.5f) / scale - 0.5f; + break; + } + case InterpolateCoordTransMode::pytorch_half_pixel: { + if (outShape > 1) return (outCoord + 0.5f) / scale - 0.5f; - break; - } - case InterpolateCoordTransMode::pytorch_half_pixel: { - if (outShape > 1) - return (outCoord + 0.5f) / scale - 0.5f; - else - return 0; - break; - } - case InterpolateCoordTransMode::asymmetric: { - return static_cast(outCoord) / scale; - break; - } - case InterpolateCoordTransMode::tf_half_pixel_for_nn: { - return (outCoord + 0.5f) / scale; - break; - } - case InterpolateCoordTransMode::align_corners: { - if (outShape > 1) - return outCoord * (static_cast(inShape - 1) / static_cast(outShape - 1)); - else - return 0; - break; - } - default: { - OPENVINO_THROW("errorPrefix", " does not support specified coordinate transformation mode"); - break; - } + else + return 0; + break; + } + case InterpolateCoordTransMode::asymmetric: { + return static_cast(outCoord) / scale; + break; + } + case InterpolateCoordTransMode::tf_half_pixel_for_nn: { + return (outCoord + 0.5f) / scale; + break; + } + case InterpolateCoordTransMode::align_corners: { + if (outShape > 1) + return outCoord * (static_cast(inShape - 1) / static_cast(outShape - 1)); + else + return 0; + break; + } + default: { + OPENVINO_THROW("errorPrefix", " does not support specified coordinate transformation mode"); + break; + } } } -int Interpolate::InterpolateExecutorBase::nearestRound(float originCoord, bool isDownsample, InterpolateNearestMode nearestMode) const { +int Interpolate::InterpolateExecutorBase::nearestRound(float originCoord, + bool isDownsample, + InterpolateNearestMode nearestMode) const { switch (nearestMode) { - case InterpolateNearestMode::round_prefer_floor: { - if (originCoord == (static_cast(originCoord) + 0.5f)) - return static_cast(std::floor(originCoord)); - else - return static_cast(std::round(originCoord)); - break; - } - case InterpolateNearestMode::round_prefer_ceil: { - return static_cast(std::round(originCoord)); - break; - } - case InterpolateNearestMode::floor: { + case InterpolateNearestMode::round_prefer_floor: { + if (originCoord == (static_cast(originCoord) + 0.5f)) return static_cast(std::floor(originCoord)); - break; - } - case InterpolateNearestMode::ceil: { + else + return static_cast(std::round(originCoord)); + break; + } + case InterpolateNearestMode::round_prefer_ceil: { + return static_cast(std::round(originCoord)); + break; + } + case InterpolateNearestMode::floor: { + return static_cast(std::floor(originCoord)); + break; + } + case InterpolateNearestMode::ceil: { + return static_cast(std::ceil(originCoord)); + break; + } + case InterpolateNearestMode::simple: { + if (isDownsample) return static_cast(std::ceil(originCoord)); - break; - } - case InterpolateNearestMode::simple: { - if (isDownsample) - return static_cast(std::ceil(originCoord)); - else - return static_cast(originCoord); - } - default: { - OPENVINO_THROW("errorPrefix", " does not support specified nearest round mode"); - break; - } + else + return static_cast(originCoord); + } + default: { + OPENVINO_THROW("errorPrefix", " does not support specified nearest round mode"); + break; + } } } -void Interpolate::InterpolateExecutorBase::linearOnnxCF(int outCoord, float scale, int inShape, int outShape, - int& index0, int& index1, float& weight0, float& weight1) { +void Interpolate::InterpolateExecutorBase::linearOnnxCF(int outCoord, + float scale, + int inShape, + int outShape, + int& index0, + int& index1, + float& weight0, + float& weight1) { float inCoord = coordTransToInput(outCoord, scale, inShape, outShape); inCoord = std::max(0.0f, std::min(inCoord, static_cast(inShape - 1))); index0 = std::min(static_cast(inCoord), inShape - 1); @@ -2968,8 +3173,10 @@ void Interpolate::InterpolateExecutorBase::linearOnnxCF(int outCoord, float scal } } -void Interpolate::InterpolateExecutorBase::buildTblLinearOnnx(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, InterpolateLayoutType layout) { +void Interpolate::InterpolateExecutorBase::buildTblLinearOnnx(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout) { int dimSize = dataRank; float fz = (spatialDimSize > 2) ? dataScales[dimSize - 3] : 1.f; float fy = (spatialDimSize > 1) ? dataScales[dimSize - 2] : 1.f; @@ -3028,7 +3235,7 @@ void Interpolate::InterpolateExecutorBase::buildTblLinearOnnx(const VectorDims& indexPtr[1][idxOzOyOx] = (izF * IH * IW + iyT * IW + ixR) * scale; weightPtr[0][idxOzOyOx] = weightL; weightPtr[1][idxOzOyOx] = weightR; - if (spatialDimSize > 1) { + if (spatialDimSize > 1) { indexPtr[2][idxOzOyOx] = (izF * IH * IW + iyB * IW + ixL) * scale; indexPtr[3][idxOzOyOx] = (izF * IH * IW + iyB * IW + ixR) * scale; weightPtr[2][idxOzOyOx] = weightT; @@ -3081,8 +3288,11 @@ void Interpolate::InterpolateExecutorBase::buildTblLinearOnnx(const VectorDims& // wd .........wd, wh............wh, ww.............ww, id...........id, ih............ih, iw..............iw // | | // wh0.....wh_diameter ih0.....ih_diameter -void Interpolate::InterpolateExecutorBase::buildTblLinear(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, - const std::vector& dataScales, int kernel_width, bool antialias) { +void Interpolate::InterpolateExecutorBase::buildTblLinear(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + int kernel_width, + bool antialias) { int dimSize = dataRank; float fz = (dimSize == 5) ? dataScales[dimSize - 3] : 1.f; float fy = dataScales[dimSize - 2]; @@ -3106,15 +3316,15 @@ void Interpolate::InterpolateExecutorBase::buildTblLinear(const VectorDims& srcD int sizeOH = OH * diaOH; int sizeOW = OW * diaOW; auxTable.resize((sizeOD + sizeOH + sizeOW) * 2); - float *weightTable = reinterpret_cast(&auxTable[0]); - float *weightOD = static_cast(&weightTable[0]); - float *weightOH = static_cast(&weightTable[sizeOD]); - float *weightOW = static_cast(&weightTable[sizeOD + sizeOH]); + float* weightTable = reinterpret_cast(&auxTable[0]); + float* weightOD = static_cast(&weightTable[0]); + float* weightOH = static_cast(&weightTable[sizeOD]); + float* weightOW = static_cast(&weightTable[sizeOD + sizeOH]); - int *idxTable = static_cast(&auxTable[sizeOD + sizeOH + sizeOW]); - int *idxOD = static_cast(&idxTable[0]); - int *idxOH = static_cast(&idxTable[sizeOD]); - int *idxOW = static_cast(&idxTable[sizeOD + sizeOH]); + int* idxTable = static_cast(&auxTable[sizeOD + sizeOH + sizeOW]); + int* idxOD = static_cast(&idxTable[0]); + int* idxOH = static_cast(&idxTable[sizeOD]); + int* idxOW = static_cast(&idxTable[sizeOD + sizeOH]); for (size_t oz = 0; oz < OD; oz++) { float iz = coordTransToInput(oz, fz, ID, OD); @@ -3172,8 +3382,11 @@ std::vector Interpolate::InterpolateExecutorBase::getCubicCoeffs(float ma // table layout: // OW OW OW OW OW OH OH OH OH OH // x_idx x_weight0 x_weight1 x_weight2 x_weight3 y_idx y_weight0 y_weight1 y_weight2 y_weight3 -void Interpolate::InterpolateExecutorBase::buildTblCubic(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - float cubicCoeff, InterpolateLayoutType layout) { +void Interpolate::InterpolateExecutorBase::buildTblCubic(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, + InterpolateLayoutType layout) { int dimSize = dataRank; float fy = dataScales[dimSize - 2]; float fx = dataScales[dimSize - 1]; @@ -3191,9 +3404,9 @@ void Interpolate::InterpolateExecutorBase::buildTblCubic(const VectorDims& srcDi } int tblAdvance = 0; - int *xOrigin = static_cast(&auxTable[tblAdvance]); + int* xOrigin = static_cast(&auxTable[tblAdvance]); tblAdvance += OW; - float *xFactor = reinterpret_cast(&auxTable[tblAdvance]); + float* xFactor = reinterpret_cast(&auxTable[tblAdvance]); for (int ox = 0; ox < OW; ox++) { float ix = coordTransToInput(ox, fx, IW, OW); int ix_r = static_cast(std::floor(ix)); @@ -3207,9 +3420,9 @@ void Interpolate::InterpolateExecutorBase::buildTblCubic(const VectorDims& srcDi } tblAdvance += CUBIC_GRID_LEN * OW; - int *yOrigin = static_cast(&auxTable[tblAdvance]); + int* yOrigin = static_cast(&auxTable[tblAdvance]); tblAdvance += OH; - float *yFactor = reinterpret_cast(&auxTable[tblAdvance]); + float* yFactor = reinterpret_cast(&auxTable[tblAdvance]); for (int oy = 0; oy < OH; oy++) { float iy = coordTransToInput(oy, fy, IH, OH); int iy_r = static_cast(std::floor(iy)); @@ -3224,9 +3437,9 @@ void Interpolate::InterpolateExecutorBase::buildTblCubic(const VectorDims& srcDi if (layout == InterpolateLayoutType::planar) { tblAdvance += CUBIC_GRID_LEN * OH; - int *sequenceOH = static_cast(&auxTable[tblAdvance]); + int* sequenceOH = static_cast(&auxTable[tblAdvance]); tblAdvance += OH * OW; - int *sequenceOW = static_cast(&auxTable[tblAdvance]); + int* sequenceOW = static_cast(&auxTable[tblAdvance]); for (int h = 0; h < OH; ++h) { int offset = h * OW; for (int w = 0; w < OW; ++w) { @@ -3256,8 +3469,11 @@ float Interpolate::InterpolateExecutorBase::getPillowBicubicCoeffs(float m) { return 0.0f; } -void Interpolate::InterpolateExecutorBase::buildTblPillow(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - float cubicCoeff, InterpolateLayoutType layout) { +void Interpolate::InterpolateExecutorBase::buildTblPillow(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, + InterpolateLayoutType layout) { int dimSize = dataRank; float fy = dataScales[dimSize - 2]; float fx = dataScales[dimSize - 1]; @@ -3272,15 +3488,15 @@ void Interpolate::InterpolateExecutorBase::buildTblPillow(const VectorDims& srcD }; // pillowScale: e.g. 2.0 means down sample 2 times - auto generateArgs = [&] (float pillowScale) -> filterArgs { + auto generateArgs = [&](float pillowScale) -> filterArgs { filterArgs args; float scaleClip = pillowScale < 1.0f ? 1.0f : pillowScale; args.ScaleClipReciprocal = 1.0f / scaleClip; - args.filterRadius = (mode == InterpolateMode::bilinear_pillow) ? PILLOW_BILINEAR_WINDOW_SCALE * scaleClip : - PILLOW_BICUBIC_WINDOW_SCALE * scaleClip; + args.filterRadius = (mode == InterpolateMode::bilinear_pillow) ? PILLOW_BILINEAR_WINDOW_SCALE * scaleClip + : PILLOW_BICUBIC_WINDOW_SCALE * scaleClip; args.filterLen = static_cast(std::ceil(args.filterRadius) * 2 + 1); - args.weightGen = (mode == InterpolateMode::bilinear_pillow) ? this->getPillowBilinearCoeffs: - this->getPillowBicubicCoeffs; + args.weightGen = + (mode == InterpolateMode::bilinear_pillow) ? this->getPillowBilinearCoeffs : this->getPillowBicubicCoeffs; return args; }; @@ -3295,15 +3511,15 @@ void Interpolate::InterpolateExecutorBase::buildTblPillow(const VectorDims& srcD auxTable[offset] = filterArgsX.filterLen; auxTable[offset + 1] = filterArgsY.filterLen; offset += 2; - float *weightX = reinterpret_cast(&auxTable[offset]); + float* weightX = reinterpret_cast(&auxTable[offset]); offset += filterArgsX.filterLen * OW; - float *weightY = reinterpret_cast(&auxTable[offset]); + float* weightY = reinterpret_cast(&auxTable[offset]); offset += filterArgsY.filterLen * OH; - int *indexX = static_cast(&auxTable[offset]); + int* indexX = static_cast(&auxTable[offset]); offset += 2 * OW; - int *indexY = static_cast(&auxTable[offset]); + int* indexY = static_cast(&auxTable[offset]); - auto generateTbl = [&] (int inLen, int outLen, float fScale, filterArgs args, float* weightTbl, int* idxTbl) { + auto generateTbl = [&](int inLen, int outLen, float fScale, filterArgs args, float* weightTbl, int* idxTbl) { int min = 0; int max = 0; for (int ox = 0; ox < outLen; ox++) { @@ -3347,21 +3563,29 @@ void Interpolate::InterpolateExecutorBase::buildTblPillow(const VectorDims& srcD generateTbl(IH, OH, fy, filterArgsY, weightY, indexY); } -void Interpolate::InterpolateRefExecutor::NNRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, - int OD, int OH, int OW) { - int *index_d = static_cast(&auxTable[0]); - int *index_h = static_cast(&auxTable[OD]); - int *index_w = static_cast(&auxTable[OD + OH]); - - const float *in_ptr_f32 = reinterpret_cast(in_ptr_); - float *out_ptr_f32 = reinterpret_cast(out_ptr_); +void Interpolate::InterpolateRefExecutor::NNRef(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { + int* index_d = static_cast(&auxTable[0]); + int* index_h = static_cast(&auxTable[OD]); + int* index_w = static_cast(&auxTable[OD + OH]); + + const float* in_ptr_f32 = reinterpret_cast(in_ptr_); + float* out_ptr_f32 = reinterpret_cast(out_ptr_); parallel_for3d(B, C, OD, [&](size_t b, size_t c, size_t od) { - const float *in_ptr = in_ptr_f32 + (IW * IH * ID * C * b + IW * IH * ID * c + IW * IH * index_d[od]); - float *out_ptr = out_ptr_f32 + (OW * OH * OD * C * b + OW * OH * OD * c + OW * OH * od); + const float* in_ptr = in_ptr_f32 + (IW * IH * ID * C * b + IW * IH * ID * c + IW * IH * index_d[od]); + float* out_ptr = out_ptr_f32 + (OW * OH * OD * C * b + OW * OH * OD * c + OW * OH * od); for (int oh = 0; oh < OH; oh++) { - const float *in_ptr_h = in_ptr + (IW * index_h[oh]); - float *out_ptr_h = out_ptr + (OW * oh); + const float* in_ptr_h = in_ptr + (IW * index_h[oh]); + float* out_ptr_h = out_ptr + (OW * oh); for (int ow = 0; ow < OW; ow++) { out_ptr_h[ow] = in_ptr_h[index_w[ow]]; } @@ -3369,8 +3593,16 @@ void Interpolate::InterpolateRefExecutor::NNRef(const uint8_t *in_ptr_, uint8_t }); } -void Interpolate::InterpolateRefExecutor::linearOnnxRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, - int OD, int OH, int OW) { +void Interpolate::InterpolateRefExecutor::linearOnnxRef(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW) { std::vector indexPtr(MAX_INPUT_INTERPOLATE, 0); std::vector weightPtr(MAX_INPUT_INTERPOLATE, 0); // FrontTopLeft:0, FrontTopRight:1, FrontBottomLeft:2, FrontBottomRight:3, @@ -3399,87 +3631,87 @@ void Interpolate::InterpolateRefExecutor::linearOnnxRef(const uint8_t *in_ptr_, weightPtr[5] = reinterpret_cast(&auxTable[scratchLen + 5 * OW * OH * OD]); } - const float *in_ptr_f32 = reinterpret_cast(in_ptr_); - float *out_ptr_f32 = reinterpret_cast(out_ptr_); + const float* in_ptr_f32 = reinterpret_cast(in_ptr_); + float* out_ptr_f32 = reinterpret_cast(out_ptr_); parallel_for2d(B, C, [&](size_t b, size_t c) { - float *out_ptr_nc = out_ptr_f32 + (OD * OH * OW * C * b + OD * OH * OW * c); - const float *in_ptr_nc = in_ptr_f32 + (ID * IH * IW * C * b + ID * IH * IW * c); + float* out_ptr_nc = out_ptr_f32 + (OD * OH * OW * C * b + OD * OH * OW * c); + const float* in_ptr_nc = in_ptr_f32 + (ID * IH * IW * C * b + ID * IH * IW * c); // do not combined 1d/2d to 3d unified process to get rid of invalid computing. switch (spatialDimSize) { - case 1: - for (int i = 0; i < OW; i++) { - float src0 = in_ptr_nc[indexPtr[0][i]]; - float src1 = in_ptr_nc[indexPtr[1][i]]; + case 1: + for (int i = 0; i < OW; i++) { + float src0 = in_ptr_nc[indexPtr[0][i]]; + float src1 = in_ptr_nc[indexPtr[1][i]]; - out_ptr_nc[i] = src0 * weightPtr[0][i] + - src1 * weightPtr[1][i]; - } - break; - case 2: - for (int i = 0; i < OH * OW; i++) { - float src00 = in_ptr_nc[indexPtr[0][i]]; - float src01 = in_ptr_nc[indexPtr[1][i]]; - float src10 = in_ptr_nc[indexPtr[2][i]]; - float src11 = in_ptr_nc[indexPtr[3][i]]; - - out_ptr_nc[i] = src00 * weightPtr[2][i] * weightPtr[0][i] + - src01 * weightPtr[2][i] * weightPtr[1][i] + - src10 * weightPtr[3][i] * weightPtr[0][i] + - src11 * weightPtr[3][i] * weightPtr[1][i]; - } - break; - case 3: - for (int i = 0; i < OD * OH * OW; i++) { - float src000 = in_ptr_nc[indexPtr[0][i]]; - float src001 = in_ptr_nc[indexPtr[1][i]]; - float src010 = in_ptr_nc[indexPtr[2][i]]; - float src011 = in_ptr_nc[indexPtr[3][i]]; - float src100 = in_ptr_nc[indexPtr[4][i]]; - float src101 = in_ptr_nc[indexPtr[5][i]]; - float src110 = in_ptr_nc[indexPtr[6][i]]; - float src111 = in_ptr_nc[indexPtr[7][i]]; - - // float dstValue = - // weightPtr[4][i] * weightPtr[2][i] * weightPtr[0][i] * src000 + - // weightPtr[4][i] * weightPtr[2][i] * weightPtr[1][i] * src001 + - // weightPtr[4][i] * weightPtr[3][i] * weightPtr[0][i] * src010 + - // weightPtr[4][i] * weightPtr[3][i] * weightPtr[1][i] * src011 + - // weightPtr[5][i] * weightPtr[2][i] * weightPtr[0][i] * src100 + - // weightPtr[5][i] * weightPtr[2][i] * weightPtr[1][i] * src101 + - // weightPtr[5][i] * weightPtr[3][i] * weightPtr[0][i] * src110 + - // weightPtr[5][i] * weightPtr[3][i] * weightPtr[1][i] * src111; - - out_ptr_nc[i] = - weightPtr[4][i] * (weightPtr[2][i] * (weightPtr[0][i] * src000 + - weightPtr[1][i] * src001) + - weightPtr[3][i] * (weightPtr[0][i] * src010 + - weightPtr[1][i] * src011)) + - weightPtr[5][i] * (weightPtr[2][i] * (weightPtr[0][i] * src100 + - weightPtr[1][i] * src101) + - weightPtr[3][i] * (weightPtr[0][i] * src110 + - weightPtr[1][i] * src111)); - } - break; - default: - break; + out_ptr_nc[i] = src0 * weightPtr[0][i] + src1 * weightPtr[1][i]; + } + break; + case 2: + for (int i = 0; i < OH * OW; i++) { + float src00 = in_ptr_nc[indexPtr[0][i]]; + float src01 = in_ptr_nc[indexPtr[1][i]]; + float src10 = in_ptr_nc[indexPtr[2][i]]; + float src11 = in_ptr_nc[indexPtr[3][i]]; + + out_ptr_nc[i] = src00 * weightPtr[2][i] * weightPtr[0][i] + src01 * weightPtr[2][i] * weightPtr[1][i] + + src10 * weightPtr[3][i] * weightPtr[0][i] + src11 * weightPtr[3][i] * weightPtr[1][i]; + } + break; + case 3: + for (int i = 0; i < OD * OH * OW; i++) { + float src000 = in_ptr_nc[indexPtr[0][i]]; + float src001 = in_ptr_nc[indexPtr[1][i]]; + float src010 = in_ptr_nc[indexPtr[2][i]]; + float src011 = in_ptr_nc[indexPtr[3][i]]; + float src100 = in_ptr_nc[indexPtr[4][i]]; + float src101 = in_ptr_nc[indexPtr[5][i]]; + float src110 = in_ptr_nc[indexPtr[6][i]]; + float src111 = in_ptr_nc[indexPtr[7][i]]; + + // float dstValue = + // weightPtr[4][i] * weightPtr[2][i] * weightPtr[0][i] * src000 + + // weightPtr[4][i] * weightPtr[2][i] * weightPtr[1][i] * src001 + + // weightPtr[4][i] * weightPtr[3][i] * weightPtr[0][i] * src010 + + // weightPtr[4][i] * weightPtr[3][i] * weightPtr[1][i] * src011 + + // weightPtr[5][i] * weightPtr[2][i] * weightPtr[0][i] * src100 + + // weightPtr[5][i] * weightPtr[2][i] * weightPtr[1][i] * src101 + + // weightPtr[5][i] * weightPtr[3][i] * weightPtr[0][i] * src110 + + // weightPtr[5][i] * weightPtr[3][i] * weightPtr[1][i] * src111; + + out_ptr_nc[i] = + weightPtr[4][i] * (weightPtr[2][i] * (weightPtr[0][i] * src000 + weightPtr[1][i] * src001) + + weightPtr[3][i] * (weightPtr[0][i] * src010 + weightPtr[1][i] * src011)) + + weightPtr[5][i] * (weightPtr[2][i] * (weightPtr[0][i] * src100 + weightPtr[1][i] * src101) + + weightPtr[3][i] * (weightPtr[0][i] * src110 + weightPtr[1][i] * src111)); + } + break; + default: + break; } }); } -void Interpolate::InterpolateRefExecutor::cubicRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int IH, int IW, int OH, int OW) { +void Interpolate::InterpolateRefExecutor::cubicRef(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int IH, + int IW, + int OH, + int OW) { const int idxNum = 1; - int *xOrigin = static_cast(&auxTable[0]); - float *xFactor = reinterpret_cast(&auxTable[OW]); - int *yOrigin = static_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW]); - float *yFactor = reinterpret_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW + OH]); + int* xOrigin = static_cast(&auxTable[0]); + float* xFactor = reinterpret_cast(&auxTable[OW]); + int* yOrigin = static_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW]); + float* yFactor = reinterpret_cast(&auxTable[(CUBIC_GRID_LEN + idxNum) * OW + OH]); - const float *in_ptr_f32 = reinterpret_cast(in_ptr_); - float *out_ptr_f32 = reinterpret_cast(out_ptr_); + const float* in_ptr_f32 = reinterpret_cast(in_ptr_); + float* out_ptr_f32 = reinterpret_cast(out_ptr_); parallel_for4d(B, C, OH, OW, [&](size_t n, size_t c, size_t oy, size_t ox) { - const float *in_ptr_nc = in_ptr_f32 + (IW * IH * C * n + IW * IH * c); - float *out_ptr_nc = out_ptr_f32 + (OW * OH * C * n + OW * OH * c); + const float* in_ptr_nc = in_ptr_f32 + (IW * IH * C * n + IW * IH * c); + float* out_ptr_nc = out_ptr_f32 + (OW * OH * C * n + OW * OH * c); int iy = yOrigin[oy]; int ix = xOrigin[ox]; @@ -3487,7 +3719,7 @@ void Interpolate::InterpolateRefExecutor::cubicRef(const uint8_t *in_ptr_, uint8 float retY = 0.f; for (int y = iy - 1, i = 0; y <= iy + 2; y++, i++) { int yInRange = std::max(0, std::min(y, IH - 1)); - const float *in_ptr_nch = in_ptr_nc + IW * yInRange; + const float* in_ptr_nch = in_ptr_nc + IW * yInRange; float retX = 0.f; for (int x = ix - 1, j = 0; x <= ix + 2; x++, j++) { int xInRange = std::max(0, std::min(x, IW - 1)); @@ -3499,66 +3731,79 @@ void Interpolate::InterpolateRefExecutor::cubicRef(const uint8_t *in_ptr_, uint8 }); } -float Interpolate::InterpolateRefExecutor::getValue(const uint8_t *base, size_t offset, ov::element::Type prec) { - const uint8_t *baseOffset = base + offset; +float Interpolate::InterpolateRefExecutor::getValue(const uint8_t* base, size_t offset, ov::element::Type prec) { + const uint8_t* baseOffset = base + offset; switch (prec) { - case ov::element::u8: { - return static_cast(*baseOffset); - break; - } - case ov::element::i8: { - const int8_t *valuePtr = reinterpret_cast(baseOffset); - return static_cast(*valuePtr); - break; - } - case ov::element::bf16: { - const uint16_t *valuePtr = reinterpret_cast(baseOffset); - return bfloat16_t::from_bits(*valuePtr); - break; - } - case ov::element::f32: { - const float *valuePtr = reinterpret_cast(baseOffset); - return *valuePtr; - break; - } - default: { - OPENVINO_THROW("Interpolate layer does not support precision: ", prec); - break; - } + case ov::element::u8: { + return static_cast(*baseOffset); + break; + } + case ov::element::i8: { + const int8_t* valuePtr = reinterpret_cast(baseOffset); + return static_cast(*valuePtr); + break; + } + case ov::element::bf16: { + const uint16_t* valuePtr = reinterpret_cast(baseOffset); + return bfloat16_t::from_bits(*valuePtr); + break; + } + case ov::element::f32: { + const float* valuePtr = reinterpret_cast(baseOffset); + return *valuePtr; + break; + } + default: { + OPENVINO_THROW("Interpolate layer does not support precision: ", prec); + break; + } } } -void Interpolate::InterpolateRefExecutor::setValue(uint8_t *base, size_t offset, float value, ov::element::Type prec) { - uint8_t *baseOffset = base + offset; +void Interpolate::InterpolateRefExecutor::setValue(uint8_t* base, size_t offset, float value, ov::element::Type prec) { + uint8_t* baseOffset = base + offset; switch (prec) { - case ov::element::u8: { - uint8_t data = static_cast(value < 0 ? 0 : value); - cpu_memcpy(baseOffset, &data, 1); - break; - } - case ov::element::i8: { - int8_t data = static_cast(value); - cpu_memcpy(baseOffset, &data, 1); - break; - } - case ov::element::bf16: { - uint16_t data = bfloat16_t(value).to_bits(); - cpu_memcpy(baseOffset, &data, 2); - break; - } - case ov::element::f32: { - cpu_memcpy(baseOffset, &value, sizeof(float)); - break; - } - default: { - OPENVINO_THROW("Interpolate layer does not support precision: ", prec); - break; - } + case ov::element::u8: { + uint8_t data = static_cast(value < 0 ? 0 : value); + cpu_memcpy(baseOffset, &data, 1); + break; + } + case ov::element::i8: { + int8_t data = static_cast(value); + cpu_memcpy(baseOffset, &data, 1); + break; + } + case ov::element::bf16: { + uint16_t data = bfloat16_t(value).to_bits(); + cpu_memcpy(baseOffset, &data, 2); + break; + } + case ov::element::f32: { + cpu_memcpy(baseOffset, &value, sizeof(float)); + break; + } + default: { + OPENVINO_THROW("Interpolate layer does not support precision: ", prec); + break; + } } } -void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, - float fx, float fy, float fz, int OD, int OH, int OW, int kernel_width, bool antialias) { +void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int ID, + int IH, + int IW, + float fx, + float fy, + float fz, + int OD, + int OH, + int OW, + int kernel_width, + bool antialias) { if (IW == OW && IH == OH && ID == OD) { size_t spatialDimSize = IW * IH * ID; // TODO: enable when fusing into interp with linear mode will support @@ -3567,8 +3812,8 @@ void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t *in_ cpu_memcpy(out_ptr_, in_ptr_, size); } else { parallel_for2d(B, C, [&](size_t b, size_t c) { - const uint8_t *in_ptr_nc = in_ptr_ + (spatialDimSize * C * b + spatialDimSize * c) * srcDataSize; - uint8_t *out_ptr_nc = out_ptr_ + (spatialDimSize * C * b + spatialDimSize * c) * dstDataSize; + const uint8_t* in_ptr_nc = in_ptr_ + (spatialDimSize * C * b + spatialDimSize * c) * srcDataSize; + uint8_t* out_ptr_nc = out_ptr_ + (spatialDimSize * C * b + spatialDimSize * c) * dstDataSize; for (size_t i = 0; i < spatialDimSize; i++) { float dstValue = getValue(in_ptr_nc, i * srcDataSize, inputPrec); setValue(out_ptr_nc, i * dstDataSize, dstValue, outputPrec); @@ -3593,23 +3838,23 @@ void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t *in_ int sizeOH = OH * diaOH; int sizeOW = OW * diaOW; - float *weightTable = reinterpret_cast(&auxTable[0]); - float *weightOD = static_cast(&weightTable[0]); - float *weightOH = static_cast(&weightTable[sizeOD]); - float *weightOW = static_cast(&weightTable[sizeOD + sizeOH]); + float* weightTable = reinterpret_cast(&auxTable[0]); + float* weightOD = static_cast(&weightTable[0]); + float* weightOH = static_cast(&weightTable[sizeOD]); + float* weightOW = static_cast(&weightTable[sizeOD + sizeOH]); - int *idxTable = static_cast(&auxTable[sizeOD + sizeOH + sizeOW]); - int *idxOD = static_cast(&idxTable[0]); - int *idxOH = static_cast(&idxTable[sizeOD]); - int *idxOW = static_cast(&idxTable[sizeOD + sizeOH]); + int* idxTable = static_cast(&auxTable[sizeOD + sizeOH + sizeOW]); + int* idxOD = static_cast(&idxTable[0]); + int* idxOH = static_cast(&idxTable[sizeOD]); + int* idxOW = static_cast(&idxTable[sizeOD + sizeOH]); parallel_for2d(B, C, [&](size_t b, size_t c) { - const uint8_t *in_ptr_nc = in_ptr_ + (IW * IH * ID * C * b + IW * IH * ID * c) * srcDataSize; - uint8_t *out_ptr_nc = out_ptr_ + (OW * OH * OD * C * b + OW * OH * OD * c) * dstDataSize; + const uint8_t* in_ptr_nc = in_ptr_ + (IW * IH * ID * C * b + IW * IH * ID * c) * srcDataSize; + uint8_t* out_ptr_nc = out_ptr_ + (OW * OH * OD * C * b + OW * OH * OD * c) * dstDataSize; for (int oz = 0; oz < OD; oz++) { - uint8_t *out_ptr_ncd = out_ptr_nc + (OW * OH * oz) * dstDataSize; + uint8_t* out_ptr_ncd = out_ptr_nc + (OW * OH * oz) * dstDataSize; for (int oy = 0; oy < OH; oy++) { - uint8_t *out_ptr_ncdh = out_ptr_ncd + (OW * oy) * dstDataSize; + uint8_t* out_ptr_ncdh = out_ptr_ncd + (OW * oy) * dstDataSize; for (int ox = 0; ox < OW; ox++) { float sum = 0.f; float wsum = 0.f; @@ -3652,9 +3897,13 @@ void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t *in_ if (weightOW[ox * diaOW + ix] == 0.f) { continue; } - float w = weightOD[oz * diaOD + iz] * weightOH[oy * diaOH + iy] * weightOW[ox * diaOW + ix]; + float w = + weightOD[oz * diaOD + iz] * weightOH[oy * diaOH + iy] * weightOW[ox * diaOW + ix]; float value = getValue(in_ptr_nc, - (idxOD[oz * diaOD + iz] * IH * IW + idxOH[oy * diaOH + iy] * IW + idxOW[ox * diaOW + ix]) * srcDataSize, inputPrec); + (idxOD[oz * diaOD + iz] * IH * IW + idxOH[oy * diaOH + iy] * IW + + idxOW[ox * diaOW + ix]) * + srcDataSize, + inputPrec); sum += w * value; wsum += w; @@ -3674,18 +3923,25 @@ void Interpolate::InterpolateRefExecutor::linearInterpolation(const uint8_t *in_ }); } -void Interpolate::InterpolateRefExecutor::pillowRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int IH, int IW, int OH, int OW) { +void Interpolate::InterpolateRefExecutor::pillowRef(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int IH, + int IW, + int OH, + int OW) { size_t offset = 0; int filterLenX = auxTable[offset]; int filterLenY = auxTable[offset + 1]; offset += 2; - float *weightX = reinterpret_cast(&auxTable[offset]); + float* weightX = reinterpret_cast(&auxTable[offset]); offset += filterLenX * OW; - float *weightY = reinterpret_cast(&auxTable[offset]); + float* weightY = reinterpret_cast(&auxTable[offset]); offset += filterLenY * OH; - int *indexX = static_cast(&auxTable[offset]); + int* indexX = static_cast(&auxTable[offset]); offset += 2 * OW; - int *indexY = static_cast(&auxTable[offset]); + int* indexY = static_cast(&auxTable[offset]); // workBuffer needed when both pass is true bool xPass = IW != OW; @@ -3703,21 +3959,24 @@ void Interpolate::InterpolateRefExecutor::pillowRef(const uint8_t *in_ptr_, uint // | | // ---- auto bc_loop = [&](size_t b, size_t c) { - const uint8_t *in_ptr_nc = in_ptr_ + (IW * IH * C * b + IW * IH * c) * srcDataSize; - uint8_t *out_ptr_nc = out_ptr_ + (OW * OH * C * b + OW * OH * c) * dstDataSize; - uint8_t *xpass_out_ptr_nc = nullptr; - const uint8_t *ypass_in_ptr_nc = nullptr; + const uint8_t* in_ptr_nc = in_ptr_ + (IW * IH * C * b + IW * IH * c) * srcDataSize; + uint8_t* out_ptr_nc = out_ptr_ + (OW * OH * C * b + OW * OH * c) * dstDataSize; + uint8_t* xpass_out_ptr_nc = nullptr; + const uint8_t* ypass_in_ptr_nc = nullptr; if (xPass && yPass) { size_t parallel_num = B * C; // IH * OW buf needed if (parallel_num < m_threads_num) { - xpass_out_ptr_nc = static_cast(&pillow_working_buf[(OW * IH * C * b + OW * IH * c) * srcDataSize]); - ypass_in_ptr_nc = static_cast(&pillow_working_buf[(OW * IH * C * b + OW * IH * c) * srcDataSize]); + xpass_out_ptr_nc = + static_cast(&pillow_working_buf[(OW * IH * C * b + OW * IH * c) * srcDataSize]); + ypass_in_ptr_nc = + static_cast(&pillow_working_buf[(OW * IH * C * b + OW * IH * c) * srcDataSize]); } else { size_t threadsIdx = parallel_get_thread_num(); size_t buffer_size = static_cast(OW * IH); xpass_out_ptr_nc = static_cast(&pillow_working_buf[threadsIdx * buffer_size * srcDataSize]); - ypass_in_ptr_nc = static_cast(&pillow_working_buf[threadsIdx * buffer_size * srcDataSize]); + ypass_in_ptr_nc = + static_cast(&pillow_working_buf[threadsIdx * buffer_size * srcDataSize]); } } else if (xPass && !yPass) { xpass_out_ptr_nc = out_ptr_nc; @@ -3775,14 +4034,14 @@ void Interpolate::InterpolateRefExecutor::pillowRef(const uint8_t *in_ptr_, uint void Interpolate::InterpolateExecutorBase::create_pillow_working_buf(InterpolateLayoutType layout) { if (srcDimPad5d[3] == dstDim5d[3] || srcDimPad5d[4] == dstDim5d[4]) return; - size_t bufSize = srcDimPad5d[3] * dstDim5d[4] * srcDataSize; // IH * OW + size_t bufSize = srcDimPad5d[3] * dstDim5d[4] * srcDataSize; // IH * OW m_threads_num = parallel_get_max_threads(); if (layout == InterpolateLayoutType::planar) { // B and C execute in parallel, need separate buf size_t parallel_num = srcDimPad5d[0] * srcDimPad5d[1]; bufSize *= std::min(m_threads_num, parallel_num); } else { - bufSize *= srcDimPad5d[1]; // *C + bufSize *= srcDimPad5d[1]; // *C // B execute in parallel, need separate buf size_t parallel_num = srcDimPad5d[0]; bufSize *= std::min(m_threads_num, parallel_num); @@ -3791,11 +4050,14 @@ void Interpolate::InterpolateExecutorBase::create_pillow_working_buf(Interpolate } Interpolate::InterpolateExecutorBase::InterpolateExecutorBase(const InterpolateAttrs& interpAttrs, - const VectorDims &srcDims, - const VectorDims &dstDims, - const std::vector &dataScales) : - mode(interpAttrs.mode), coordTransMode(interpAttrs.coordTransMode), configured_for_layout(interpAttrs.layout), - inputPrec(interpAttrs.inPrc), outputPrec(interpAttrs.outPrc) { + const VectorDims& srcDims, + const VectorDims& dstDims, + const std::vector& dataScales) + : mode(interpAttrs.mode), + coordTransMode(interpAttrs.coordTransMode), + configured_for_layout(interpAttrs.layout), + inputPrec(interpAttrs.inPrc), + outputPrec(interpAttrs.outPrc) { srcDimPad5d = to5Dim(getPaddedInputShape(srcDims, interpAttrs.padBegin, interpAttrs.padEnd)); dstDim5d = to5Dim(dstDims); srcDataSize = interpAttrs.inPrc.size(); @@ -3804,44 +4066,44 @@ Interpolate::InterpolateExecutorBase::InterpolateExecutorBase(const InterpolateA spatialDimSize = getSpatialDimsNum(dataRank); switch (mode) { - case InterpolateMode::nearest: { - buildTblNN(srcDimPad5d, dstDim5d, dataScales, interpAttrs.layout, interpAttrs.nearestMode); - break; - } - case InterpolateMode::linear_onnx: { - buildTblLinearOnnx(srcDimPad5d, dstDim5d, dataScales, interpAttrs.layout); - break; - } - case InterpolateMode::linear: { - static constexpr int LINEAR_KERNEL = 2; - buildTblLinear(srcDimPad5d, dstDim5d, dataScales, LINEAR_KERNEL, interpAttrs.antialias); - break; - } - case InterpolateMode::cubic: { - buildTblCubic(srcDimPad5d, dstDim5d, dataScales, interpAttrs.cubeCoeff, interpAttrs.layout); - break; - } - case InterpolateMode::bilinear_pillow: - case InterpolateMode::bicubic_pillow: { - buildTblPillow(srcDimPad5d, dstDim5d, dataScales, interpAttrs.cubeCoeff, interpAttrs.layout); - if ((srcDimPad5d[4] != dstDim5d[4]) && (srcDimPad5d[3] != dstDim5d[3])) { - create_pillow_working_buf(interpAttrs.layout); - } - break; - } - default: { - OPENVINO_THROW("Interpolate executor does not support interpolate mode: ", mode); - break; + case InterpolateMode::nearest: { + buildTblNN(srcDimPad5d, dstDim5d, dataScales, interpAttrs.layout, interpAttrs.nearestMode); + break; + } + case InterpolateMode::linear_onnx: { + buildTblLinearOnnx(srcDimPad5d, dstDim5d, dataScales, interpAttrs.layout); + break; + } + case InterpolateMode::linear: { + static constexpr int LINEAR_KERNEL = 2; + buildTblLinear(srcDimPad5d, dstDim5d, dataScales, LINEAR_KERNEL, interpAttrs.antialias); + break; + } + case InterpolateMode::cubic: { + buildTblCubic(srcDimPad5d, dstDim5d, dataScales, interpAttrs.cubeCoeff, interpAttrs.layout); + break; + } + case InterpolateMode::bilinear_pillow: + case InterpolateMode::bicubic_pillow: { + buildTblPillow(srcDimPad5d, dstDim5d, dataScales, interpAttrs.cubeCoeff, interpAttrs.layout); + if ((srcDimPad5d[4] != dstDim5d[4]) && (srcDimPad5d[3] != dstDim5d[3])) { + create_pillow_working_buf(interpAttrs.layout); } + break; + } + default: { + OPENVINO_THROW("Interpolate executor does not support interpolate mode: ", mode); + break; + } } } Interpolate::InterpolateJitExecutor::InterpolateJitExecutor(const InterpolateAttrs& interpAttrs, - const VectorDims &srcDims, - const VectorDims &dstDims, - const std::vector &dataScales, - const dnnl::primitive_attr &attr) : - InterpolateExecutorBase(interpAttrs, srcDims, dstDims, dataScales) { + const VectorDims& srcDims, + const VectorDims& dstDims, + const std::vector& dataScales, + const dnnl::primitive_attr& attr) + : InterpolateExecutorBase(interpAttrs, srcDims, dstDims, dataScales) { auto jcp = jit_interpolate_config_params(); jcp.mode = mode; jcp.src_prc = interpAttrs.inPrc; @@ -3878,7 +4140,7 @@ Interpolate::InterpolateJitExecutor::InterpolateJitExecutor(const InterpolateAtt } else { OPENVINO_THROW("Can't create InterpolateJitExecutor"); } -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 if (interpolateKernel) { interpolateKernel->create_ker(); } else { @@ -3886,7 +4148,7 @@ Interpolate::InterpolateJitExecutor::InterpolateJitExecutor(const InterpolateAtt } } -void Interpolate::InterpolateJitExecutor::exec(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_) { +void Interpolate::InterpolateJitExecutor::exec(const uint8_t* in_ptr_, uint8_t* out_ptr_, const void* post_ops_data_) { size_t N = srcDimPad5d[0], C = srcDimPad5d[1], ID = srcDimPad5d[2], IH = srcDimPad5d[3], IW = srcDimPad5d[4]; size_t OD = dstDim5d[2], OH = dstDim5d[3], OW = dstDim5d[4]; @@ -3894,103 +4156,115 @@ void Interpolate::InterpolateJitExecutor::exec(const uint8_t *in_ptr_, uint8_t * OPENVINO_THROW("Can't execute, kernel for Interpolate node is not compiled"); } switch (mode) { - case InterpolateMode::nearest: { - if (configured_for_layout == InterpolateLayoutType::planar) { - NNPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); - } else { - NNCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); - } - break; - } - case InterpolateMode::linear_onnx: { - if (configured_for_layout == InterpolateLayoutType::planar) { - linearOnnxPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); - } else { - linearOnnxCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); - } - break; + case InterpolateMode::nearest: { + if (configured_for_layout == InterpolateLayoutType::planar) { + NNPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); + } else { + NNCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); } - case InterpolateMode::cubic: { - if (configured_for_layout == InterpolateLayoutType::planar) { - cubicPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); - } else { - cubicCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); - } - break; + break; + } + case InterpolateMode::linear_onnx: { + if (configured_for_layout == InterpolateLayoutType::planar) { + linearOnnxPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); + } else { + linearOnnxCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, ID, IH, IW, OD, OH, OW); } - case InterpolateMode::bilinear_pillow: - case InterpolateMode::bicubic_pillow: { - if (configured_for_layout == InterpolateLayoutType::by_channel) { - pillowCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); - } else { - OPENVINO_THROW("Only channel_first jit kernel is supported for pillow mode", mode); - } - break; + break; + } + case InterpolateMode::cubic: { + if (configured_for_layout == InterpolateLayoutType::planar) { + cubicPlanar(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); + } else { + cubicCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); } - default: { - OPENVINO_THROW("InterpolateJitExecutor has unsupported interpolate mode: ", mode); + break; + } + case InterpolateMode::bilinear_pillow: + case InterpolateMode::bicubic_pillow: { + if (configured_for_layout == InterpolateLayoutType::by_channel) { + pillowCGathered(in_ptr_, out_ptr_, post_ops_data_, N, C, IH, IW, OH, OW); + } else { + OPENVINO_THROW("Only channel_first jit kernel is supported for pillow mode", mode); } + break; + } + default: { + OPENVINO_THROW("InterpolateJitExecutor has unsupported interpolate mode: ", mode); + } } } -void Interpolate::InterpolateRefExecutor::exec(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_) { +void Interpolate::InterpolateRefExecutor::exec(const uint8_t* in_ptr_, uint8_t* out_ptr_, const void* post_ops_data_) { size_t N = srcDimPad5d[0], C = srcDimPad5d[1], ID = srcDimPad5d[2], IH = srcDimPad5d[3], IW = srcDimPad5d[4]; size_t OD = dstDim5d[2], OH = dstDim5d[3], OW = dstDim5d[4]; switch (mode) { - case InterpolateMode::nearest: { - NNRef(in_ptr_, out_ptr_, N, C, ID, IH, IW, OD, OH, OW); - break; - } - case InterpolateMode::linear_onnx: { - linearOnnxRef(in_ptr_, out_ptr_, N, C, ID, IH, IW, OD, OH, OW); - break; - } - case InterpolateMode::cubic: { - cubicRef(in_ptr_, out_ptr_, N, C, IH, IW, OH, OW); - break; - } - case InterpolateMode::linear: { - float fz = (dataRank == 5) ? dataScales[dataRank - 3] : 1.f; - float fy = dataScales[dataRank - 2]; - float fx = dataScales[dataRank - 1]; - - bool isDownsample = (fx < 1.f) || (fy < 1.f) || (fz < 1.f); - int kernel_width = 2; - linearInterpolation(in_ptr_, out_ptr_, N, C, ID, IH, IW, fx, fy, fz, OD, OH, OW, kernel_width, isDownsample && antialias); - break; - } - case InterpolateMode::bilinear_pillow: - case InterpolateMode::bicubic_pillow: { - pillowRef(in_ptr_, out_ptr_, N, C, IH, IW, OH, OW); - break; - } - default: { - OPENVINO_THROW("Interpolate layer has unsupported interpolate mode: ", mode); - } + case InterpolateMode::nearest: { + NNRef(in_ptr_, out_ptr_, N, C, ID, IH, IW, OD, OH, OW); + break; + } + case InterpolateMode::linear_onnx: { + linearOnnxRef(in_ptr_, out_ptr_, N, C, ID, IH, IW, OD, OH, OW); + break; + } + case InterpolateMode::cubic: { + cubicRef(in_ptr_, out_ptr_, N, C, IH, IW, OH, OW); + break; + } + case InterpolateMode::linear: { + float fz = (dataRank == 5) ? dataScales[dataRank - 3] : 1.f; + float fy = dataScales[dataRank - 2]; + float fx = dataScales[dataRank - 1]; + + bool isDownsample = (fx < 1.f) || (fy < 1.f) || (fz < 1.f); + int kernel_width = 2; + linearInterpolation(in_ptr_, + out_ptr_, + N, + C, + ID, + IH, + IW, + fx, + fy, + fz, + OD, + OH, + OW, + kernel_width, + isDownsample && antialias); + break; + } + case InterpolateMode::bilinear_pillow: + case InterpolateMode::bicubic_pillow: { + pillowRef(in_ptr_, out_ptr_, N, C, IH, IW, OH, OW); + break; + } + default: { + OPENVINO_THROW("Interpolate layer has unsupported interpolate mode: ", mode); + } } } size_t Interpolate::getSpatialDimsNum(const Dim rank) { switch (rank) { - case 1: - case 3: - return 1; - case 2: - case 4: - return 2; - case 5: - return 3; - default: - OPENVINO_THROW("Can't define number spatial"); + case 1: + case 3: + return 1; + case 2: + case 4: + return 2; + case 5: + return 3; + default: + OPENVINO_THROW("Can't define number spatial"); } } bool Interpolate::canFuse(const NodePtr& node) const { - if (!mayiuse(cpu::x64::sse41) || - interpAttrs.mode == InterpolateMode::linear || - interpAttrs.mode == InterpolateMode::bilinear_pillow || - interpAttrs.mode == InterpolateMode::bicubic_pillow || + if (!mayiuse(cpu::x64::sse41) || interpAttrs.mode == InterpolateMode::linear || + interpAttrs.mode == InterpolateMode::bilinear_pillow || interpAttrs.mode == InterpolateMode::bicubic_pillow || (!one_of(dataRank, 4u, 5u) && !mayiuse(cpu::x64::avx2))) { return false; } @@ -4002,6 +4276,6 @@ bool Interpolate::created() const { return getType() == Type::Interpolate; } -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/interpolate.h b/src/plugins/intel_cpu/src/nodes/interpolate.h index a43b354aa0306a..c6fedf384f449d 100644 --- a/src/plugins/intel_cpu/src/nodes/interpolate.h +++ b/src/plugins/intel_cpu/src/nodes/interpolate.h @@ -31,34 +31,36 @@ struct jit_interpolate_config_params { }; struct jit_interpolate_call_args { - const void *src_ptr[MAX_INPUT_INTERPOLATE]; - const void *weight_ptr[MAX_INPUT_INTERPOLATE]; - const int *index; - void *dst; + const void* src_ptr[MAX_INPUT_INTERPOLATE]; + const void* weight_ptr[MAX_INPUT_INTERPOLATE]; + const int* index; + void* dst; size_t work_amount; size_t oc_off; - //ptr to array of post op inputs pointers (flat list) + // ptr to array of post op inputs pointers (flat list) const void* post_op_data; }; struct jit_uni_interpolate_kernel { - void (*ker_)(const jit_interpolate_call_args *); + void (*ker_)(const jit_interpolate_call_args*); - void operator()(const jit_interpolate_call_args *args) { + void operator()(const jit_interpolate_call_args* args) { assert(ker_); ker_(args); } - explicit jit_uni_interpolate_kernel(jit_interpolate_config_params jcp, const dnnl_primitive_attr &attr) : ker_(nullptr), jcp_(jcp), attr_(attr) {} + explicit jit_uni_interpolate_kernel(jit_interpolate_config_params jcp, const dnnl_primitive_attr& attr) + : ker_(nullptr), + jcp_(jcp), + attr_(attr) {} virtual ~jit_uni_interpolate_kernel() {} virtual void create_ker() = 0; jit_interpolate_config_params jcp_; - const dnnl_primitive_attr &attr_; + const dnnl_primitive_attr& attr_; }; - class Interpolate : public Node { public: static constexpr size_t DATA_ID = 0; @@ -98,8 +100,9 @@ class Interpolate : public Node { bool is_version11 = true; InterpolateAttrs interpAttrs; // Some FEs or preprocessing step resize spatial dimension for tensor with NHWC layout memory, - // but imported as planar layout[abcd] with axis[1,2] for convenience. In this case, for pillow modes without pad for now, - // nhwc layout path and the kernel(nhwc layout executor) can be used for this planar layout and axis settings(NCHWAsNHWC is true) to get higher perf with + // but imported as planar layout[abcd] with axis[1,2] for convenience. In this case, for pillow modes without pad + // for now, nhwc layout path and the kernel(nhwc layout executor) can be used for this planar layout and axis + // settings(NCHWAsNHWC is true) to get higher perf with // 1. logical shape alignment [abcd-nhwc] to [adbc-nchw]. // 2. axis alignment [1,2] to [2,3]. // 3. config planar layout support and treated it as channel_first layout. @@ -107,120 +110,226 @@ class Interpolate : public Node { size_t dataRank = 0; class InterpolateExecutorBase { - public: - InterpolateExecutorBase(const InterpolateAttrs& interpAttrs, - const VectorDims &srcDims, - const VectorDims &dstDims, - const std::vector &dataScales); - - virtual void exec(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_) = 0; - virtual ~InterpolateExecutorBase() = default; - VectorDims getSrcDimPad5d() const { return srcDimPad5d; } - - private: - void buildTblNN(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - InterpolateLayoutType layout, InterpolateNearestMode nearestMode); - void buildTblLinearOnnx(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - InterpolateLayoutType layout); - void buildTblLinear(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, int kernel_width, - bool antialias); - void buildTblCubic(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, float cubicCoeff, - InterpolateLayoutType layout); - void buildTblPillow(const VectorDims& srcDimPad5d, const VectorDims& dstDim5d, const std::vector& dataScales, - float cubicCoeff, InterpolateLayoutType layout); - - float coordTransToInput(int outCoord, float scale, int inShape, int outShape) const; - int nearestRound(float origin, bool isDownsample, InterpolateNearestMode nearestMode) const; - void linearOnnxCF(int outCoord, float scale, int inShape, int outShape, int& index0, int& index1, float& weight0, float& weight1); - std::vector getCubicCoeffs(float mantissa, float a); - static float getPillowBilinearCoeffs(float m); - static float getPillowBicubicCoeffs(float m); - inline void create_pillow_working_buf(InterpolateLayoutType layout); - - protected: - InterpolateMode mode; - InterpolateCoordTransMode coordTransMode; - InterpolateLayoutType configured_for_layout; - VectorDims srcDimPad5d, dstDim5d; - ov::element::Type inputPrec, outputPrec; - size_t srcDataSize, dstDataSize; - int spatialDimSize; - size_t dataRank; - std::vector auxTable; - std::vector pillow_working_buf; - size_t m_threads_num = 0lu; + public: + InterpolateExecutorBase(const InterpolateAttrs& interpAttrs, + const VectorDims& srcDims, + const VectorDims& dstDims, + const std::vector& dataScales); + + virtual void exec(const uint8_t* in_ptr_, uint8_t* out_ptr_, const void* post_ops_data_) = 0; + virtual ~InterpolateExecutorBase() = default; + VectorDims getSrcDimPad5d() const { + return srcDimPad5d; + } + + private: + void buildTblNN(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout, + InterpolateNearestMode nearestMode); + void buildTblLinearOnnx(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + InterpolateLayoutType layout); + void buildTblLinear(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + int kernel_width, + bool antialias); + void buildTblCubic(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, + InterpolateLayoutType layout); + void buildTblPillow(const VectorDims& srcDimPad5d, + const VectorDims& dstDim5d, + const std::vector& dataScales, + float cubicCoeff, + InterpolateLayoutType layout); + + float coordTransToInput(int outCoord, float scale, int inShape, int outShape) const; + int nearestRound(float origin, bool isDownsample, InterpolateNearestMode nearestMode) const; + void linearOnnxCF(int outCoord, + float scale, + int inShape, + int outShape, + int& index0, + int& index1, + float& weight0, + float& weight1); + std::vector getCubicCoeffs(float mantissa, float a); + static float getPillowBilinearCoeffs(float m); + static float getPillowBicubicCoeffs(float m); + inline void create_pillow_working_buf(InterpolateLayoutType layout); + + protected: + InterpolateMode mode; + InterpolateCoordTransMode coordTransMode; + InterpolateLayoutType configured_for_layout; + VectorDims srcDimPad5d, dstDim5d; + ov::element::Type inputPrec, outputPrec; + size_t srcDataSize, dstDataSize; + int spatialDimSize; + size_t dataRank; + std::vector auxTable; + std::vector pillow_working_buf; + size_t m_threads_num = 0lu; }; std::shared_ptr execPtr = nullptr; class InterpolateJitExecutor : public InterpolateExecutorBase { - public: - InterpolateJitExecutor(const InterpolateAttrs& interpAttrs, - const VectorDims &srcDims, - const VectorDims &dstDims, - const std::vector &dataScales, - const dnnl::primitive_attr &attr); - - void exec(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_) override; - - private: - // nearest neighbor - void NNPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - void NNCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - - // onnx linear - void linearOnnxPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - void linearOnnxCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - - // cubic - void cubicPlanar(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW); - void cubicCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW); - - // pillow bilinear and pillow bicubic - void pillowCGathered(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_, - int B, int C, int IH, int IW, int OH, int OW); - - private: - std::shared_ptr interpolateKernel = nullptr; + public: + InterpolateJitExecutor(const InterpolateAttrs& interpAttrs, + const VectorDims& srcDims, + const VectorDims& dstDims, + const std::vector& dataScales, + const dnnl::primitive_attr& attr); + + void exec(const uint8_t* in_ptr_, uint8_t* out_ptr_, const void* post_ops_data_) override; + + private: + // nearest neighbor + void NNPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW); + void NNCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW); + + // onnx linear + void linearOnnxPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW); + void linearOnnxCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW); + + // cubic + void cubicPlanar(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW); + void cubicCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW); + + // pillow bilinear and pillow bicubic + void pillowCGathered(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + const void* post_ops_data_, + int B, + int C, + int IH, + int IW, + int OH, + int OW); + + private: + std::shared_ptr interpolateKernel = nullptr; }; class InterpolateRefExecutor : public InterpolateExecutorBase { - public: - InterpolateRefExecutor(const InterpolateAttrs& interpAttrs, - const VectorDims &srcDims, - const VectorDims &dstDims, - const std::vector &_dataScales) : - InterpolateExecutorBase(interpAttrs, srcDims, dstDims, _dataScales), - antialias(interpAttrs.antialias), dataScales(_dataScales) {} - - void exec(const uint8_t *in_ptr_, uint8_t *out_ptr_, const void *post_ops_data_) override; - - private: - void NNRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - void linearOnnxRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); - - void cubicRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int IH, int IW, int OH, int OW); - void linearInterpolation(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int ID, int IH, int IW, - float fx, float fy, float fz, int OD, int OH, int OW, int kernel_width, bool antialias); - void pillowRef(const uint8_t *in_ptr_, uint8_t *out_ptr_, int B, int C, int IH, int IW, int OH, int OW); - - static float getValue(const uint8_t *base, size_t offset, ov::element::Type prec); - static void setValue(uint8_t *base, size_t offset, float value, ov::element::Type prec); - - private: - bool antialias; - std::vector dataScales; + public: + InterpolateRefExecutor(const InterpolateAttrs& interpAttrs, + const VectorDims& srcDims, + const VectorDims& dstDims, + const std::vector& _dataScales) + : InterpolateExecutorBase(interpAttrs, srcDims, dstDims, _dataScales), + antialias(interpAttrs.antialias), + dataScales(_dataScales) {} + + void exec(const uint8_t* in_ptr_, uint8_t* out_ptr_, const void* post_ops_data_) override; + + private: + void + NNRef(const uint8_t* in_ptr_, uint8_t* out_ptr_, int B, int C, int ID, int IH, int IW, int OD, int OH, int OW); + void linearOnnxRef(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int ID, + int IH, + int IW, + int OD, + int OH, + int OW); + + void cubicRef(const uint8_t* in_ptr_, uint8_t* out_ptr_, int B, int C, int IH, int IW, int OH, int OW); + void linearInterpolation(const uint8_t* in_ptr_, + uint8_t* out_ptr_, + int B, + int C, + int ID, + int IH, + int IW, + float fx, + float fy, + float fz, + int OD, + int OH, + int OW, + int kernel_width, + bool antialias); + void pillowRef(const uint8_t* in_ptr_, uint8_t* out_ptr_, int B, int C, int IH, int IW, int OH, int OW); + + static float getValue(const uint8_t* base, size_t offset, ov::element::Type prec); + static void setValue(uint8_t* base, size_t offset, float value, ov::element::Type prec); + + private: + bool antialias; + std::vector dataScales; }; - void setPostOps(dnnl::primitive_attr &attr, const VectorDims &dims); + void setPostOps(dnnl::primitive_attr& attr, const VectorDims& dims); - static VectorDims getPaddedInputShape(const VectorDims &srcDims, const std::vector &padBegin, const std::vector &padEnd); - std::vector getScales(const VectorDims &srcDimPad, const VectorDims &dstDim); + static VectorDims getPaddedInputShape(const VectorDims& srcDims, + const std::vector& padBegin, + const std::vector& padEnd); + std::vector getScales(const VectorDims& srcDimPad, const VectorDims& dstDim); static size_t getSpatialDimsNum(const Dim rank); bool hasPad = false; @@ -244,6 +353,6 @@ class Interpolate : public Node { std::shared_ptr aclExecPtr = nullptr; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov +} // namespace node +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/jit_eltwise_call_args_ptrs.hpp b/src/plugins/intel_cpu/src/nodes/kernels/jit_eltwise_call_args_ptrs.hpp index 7370bb824d8c62..66f119ee839b14 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/jit_eltwise_call_args_ptrs.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/jit_eltwise_call_args_ptrs.hpp @@ -9,21 +9,21 @@ namespace ov { namespace intel_cpu { namespace node { -#define MAX_ELTWISE_INPUTS 7 +#define MAX_ELTWISE_INPUTS 7 #define MAX_ELTWISE_DIM_RANK 12 struct jit_eltwise_call_args_ptrs { - const void *src_ptr[MAX_ELTWISE_INPUTS]; - void *dst_ptr; - //ptr to array of post op inputs pointers (flat list) + const void* src_ptr[MAX_ELTWISE_INPUTS]; + void* dst_ptr; + // ptr to array of post op inputs pointers (flat list) const void** post_op_data; // shape agnostic kernel size_t work_amount; - const void *src_offsets[MAX_ELTWISE_INPUTS]; - const void *dst_offsets; + const void* src_offsets[MAX_ELTWISE_INPUTS]; + const void* dst_offsets; }; -} // namespace node -} // namespace intel_cpu -} // namespace ov \ No newline at end of file +} // namespace node +} // namespace intel_cpu +} // namespace ov \ No newline at end of file diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.cpp index 755330bd850c4d..b4d38086cefe8a 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.cpp @@ -13,10 +13,10 @@ # include #endif -#include "openvino/core/type/bfloat16.hpp" -#include "openvino/core/parallel.hpp" -#include "common.hpp" #include "attn_memcpy.hpp" +#include "common.hpp" +#include "openvino/core/parallel.hpp" +#include "openvino/core/type/bfloat16.hpp" namespace ov { namespace Extensions { @@ -26,7 +26,7 @@ namespace XARCH { using namespace ov; // float16 <- float -template +template void attn_copy(TA* a, TB* b, size_t n) { size_t i = 0; #if defined(HAVE_AVX512F) @@ -51,14 +51,11 @@ void attn_memcpy_kernel(const ov::intel_cpu::PlainTensor& k_input, const ov::intel_cpu::PlainTensor& past_k_output, const ov::intel_cpu::PlainTensor& past_v_output) { // For compatibility, all input_kvs are permuted to BHLS - size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], SV = v_input.m_dims[3]; + size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], + SV = v_input.m_dims[3]; parallel_for3d(L1, B, H, [&](size_t m, size_t b, size_t h) { - attn_copy(past_k_output.ptr(b, h, m, 0), - k_input.ptr(b, h, m, 0), - S); - attn_copy(past_v_output.ptr(b, h, m, 0), - v_input.ptr(b, h, m, 0), - SV); + attn_copy(past_k_output.ptr(b, h, m, 0), k_input.ptr(b, h, m, 0), S); + attn_copy(past_v_output.ptr(b, h, m, 0), v_input.ptr(b, h, m, 0), SV); }); } @@ -67,14 +64,11 @@ static void attn_memcpy_kernel(const ov::intel_cpu::PlainTensor& k_input, const ov::intel_cpu::PlainTensor& past_k_output, const ov::intel_cpu::PlainTensor& past_v_output) { // For compatibility, all input_kvs are permuted to BHLS - size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], SV = v_input.m_dims[3]; + size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], + SV = v_input.m_dims[3]; parallel_for3d(L1, B, H, [&](size_t m, size_t b, size_t h) { - std::memcpy(past_k_output.ptr_v(b, h, m, 0), - k_input.ptr_v(b, h, m, 0), - S * k_input.m_element_size); - std::memcpy(past_v_output.ptr_v(b, h, m, 0), - v_input.ptr_v(b, h, m, 0), - SV * v_input.m_element_size); + std::memcpy(past_k_output.ptr_v(b, h, m, 0), k_input.ptr_v(b, h, m, 0), S * k_input.m_element_size); + std::memcpy(past_v_output.ptr_v(b, h, m, 0), v_input.ptr_v(b, h, m, 0), SV * v_input.m_element_size); }); } @@ -84,19 +78,17 @@ static void paged_attn_memcpy_kernel(const ov::intel_cpu::PlainTensor& k_input, const ov::intel_cpu::PlainTensor& past_k_output, const ov::intel_cpu::PlainTensor& past_v_output, const ov::intel_cpu::PlainTensor& slot_mapping) { - size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], SV = v_input.m_dims[3]; + size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], + SV = v_input.m_dims[3]; size_t block_size = past_k_output.m_dims[2]; parallel_for3d(B, L1, H, [&](size_t b, size_t m, size_t h) { auto slot = slot_mapping.ptr(b)[m]; - if (slot < 0) return; + if (slot < 0) + return; auto block_number = slot / block_size; auto block_offset = slot % block_size; - attn_copy(past_k_output.ptr(block_number, h, block_offset, 0), - k_input.ptr(b, h, m, 0), - S); - attn_copy(past_v_output.ptr(block_number, h, block_offset, 0), - v_input.ptr(b, h, m, 0), - SV); + attn_copy(past_k_output.ptr(block_number, h, block_offset, 0), k_input.ptr(b, h, m, 0), S); + attn_copy(past_v_output.ptr(block_number, h, block_offset, 0), v_input.ptr(b, h, m, 0), SV); }); } @@ -105,11 +97,13 @@ static void paged_attn_memcpy_kernel(const ov::intel_cpu::PlainTensor& k_input, const ov::intel_cpu::PlainTensor& past_k_output, const ov::intel_cpu::PlainTensor& past_v_output, const ov::intel_cpu::PlainTensor& slot_mapping) { - size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], SV = v_input.m_dims[3]; + size_t B = k_input.m_dims[0], H = k_input.m_dims[1], L1 = k_input.m_dims[2], S = k_input.m_dims[3], + SV = v_input.m_dims[3]; size_t block_size = past_k_output.m_dims[2]; parallel_for3d(B, L1, H, [&](size_t b, size_t m, size_t h) { auto slot = slot_mapping.ptr(b)[m]; - if (slot < 0) return; + if (slot < 0) + return; auto block_number = slot / block_size; auto block_offset = slot % block_size; std::memcpy(past_k_output.ptr_v(block_number, h, block_offset, 0), @@ -132,7 +126,11 @@ void attn_memcpy(const ov::intel_cpu::PlainTensor& k_input, } else if (k_input.get_precision() == ov::element::f32 && past_k_output.get_precision() == ov::element::bf16) { attn_memcpy_kernel(k_input, v_input, past_k_output, past_v_output); } else { - OPENVINO_THROW("unsupport src type: ", k_input.get_precision(), ", dst type: ", past_k_output.get_precision(), " in attn_memcpy"); + OPENVINO_THROW("unsupport src type: ", + k_input.get_precision(), + ", dst type: ", + past_k_output.get_precision(), + " in attn_memcpy"); } } @@ -148,7 +146,11 @@ void paged_attn_memcpy(const ov::intel_cpu::PlainTensor& k_input, } else if (k_input.get_precision() == ov::element::f32 && past_k_output.get_precision() == ov::element::bf16) { paged_attn_memcpy_kernel(k_input, v_input, past_k_output, past_v_output, slot_mapping); } else { - OPENVINO_THROW("unsupport src type: ", k_input.get_precision(), ", dst type: ", past_k_output.get_precision(), " in paged_attn_memcpy"); + OPENVINO_THROW("unsupport src type: ", + k_input.get_precision(), + ", dst type: ", + past_k_output.get_precision(), + " in paged_attn_memcpy"); } } diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.hpp index c0e5892db9926b..ea704232e333bd 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_memcpy.hpp @@ -7,6 +7,7 @@ #include #include #include + #include "openvino/core/type/element_type.hpp" #include "utils/plain_tensor.hpp" diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.cpp index 66772bda03db51..095180d659142e 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.cpp @@ -13,11 +13,11 @@ # include #endif -#include "openvino/core/type/bfloat16.hpp" -#include "openvino/core/parallel.hpp" -#include "common.hpp" #include "attn_quant.hpp" #include "attn_quant_kernel.hpp" +#include "common.hpp" +#include "openvino/core/parallel.hpp" +#include "openvino/core/type/bfloat16.hpp" namespace ov { namespace Extensions { @@ -26,7 +26,7 @@ namespace XARCH { using namespace ov; -template +template static void quant_u8(const T* src, uint8_t* dst, size_t n, float& scale, float& zp) { size_t i = 0; float max = -FLT_MAX; @@ -182,16 +182,8 @@ static void attn_quant_mt(const ov::intel_cpu::PlainTensor& k_src, parallel_for3d(L1, B, H, [&](size_t m, size_t b, size_t h) { auto p_k = k_scale_zp.ptr(m, b, h); auto p_v = v_scale_zp.ptr(m, b, h); - quant_u8(k_src.ptr(b, h, m), - k_dst.ptr(b, h, m), - S, - p_k[0], - p_k[1]); - quant_u8(v_src.ptr(b, h, m), - v_dst.ptr(b, h, m), - SV, - p_v[0], - p_v[1]); + quant_u8(k_src.ptr(b, h, m), k_dst.ptr(b, h, m), S, p_k[0], p_k[1]); + quant_u8(v_src.ptr(b, h, m), v_dst.ptr(b, h, m), SV, p_v[0], p_v[1]); }); } @@ -205,14 +197,16 @@ static void paged_attn_quant_mt(const ov::intel_cpu::PlainTensor& k_src, size_t block_size = k_dst.m_dims[2]; parallel_for3d(B, L1, H, [&](size_t b, size_t m, size_t h) { auto slot = slot_mapping.ptr(b)[m]; - if (slot < 0) return; + if (slot < 0) + return; auto block_number = slot / block_size; auto block_offset = slot % block_size; auto p_k = reinterpret_cast(k_dst.ptr(block_number, h, block_offset)); auto p_v = reinterpret_cast(v_dst.ptr(block_number, h, block_offset)); // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| quant_u8(k_src.ptr(b, h, m), k_dst.ptr(block_number, h, block_offset) + sizeof(float) + sizeof(float), S, @@ -239,7 +233,11 @@ void attn_quantkv(const ov::intel_cpu::PlainTensor& k_src, } else if (k_src.get_precision() == ov::element::f16 && k_dst.get_precision() == ov::element::u8) { attn_quant_mt(k_src, v_src, k_dst, v_dst, k_scale_zp, v_scale_zp); } else { - OPENVINO_THROW("unsupport src type: ", k_src.get_precision(), ", dst type: ", k_dst.get_precision(), " in attn_quantkv"); + OPENVINO_THROW("unsupport src type: ", + k_src.get_precision(), + ", dst type: ", + k_dst.get_precision(), + " in attn_quantkv"); } } @@ -255,7 +253,11 @@ void paged_attn_quantkv(const ov::intel_cpu::PlainTensor& k_src, } else if (k_src.get_precision() == ov::element::f16 && k_dst.get_precision() == ov::element::u8) { paged_attn_quant_mt(k_src, v_src, k_dst, v_dst, slot_mapping); } else { - OPENVINO_THROW("unsupport src type: ", k_src.get_precision(), ", dst type: ", k_dst.get_precision(), " in paged_attn_quantkv"); + OPENVINO_THROW("unsupport src type: ", + k_src.get_precision(), + ", dst type: ", + k_dst.get_precision(), + " in paged_attn_quantkv"); } } diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.hpp index ca930a1055db2b..2f39f74f5b3460 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant.hpp @@ -7,6 +7,7 @@ #include #include #include + #include "openvino/core/type/element_type.hpp" #include "utils/plain_tensor.hpp" diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant_kernel.hpp index 4e013a004d29f9..759d0005103871 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/attn_quant_kernel.hpp @@ -3,19 +3,21 @@ // #pragma once -#include +#include "nodes/kernels/scaled_attn/common.hpp" + +#if defined(HAVE_SSE) || defined(HAVE_AVX2) || defined(HAVE_AVX512F) +# include +#endif + #include #include -#include -#include "openvino/core/type/element_type.hpp" -#include "utils/plain_tensor.hpp" namespace ov { namespace Extensions { namespace Cpu { namespace XARCH { -template +template void attn_dequant_u8_kernel(const uint8_t* src, TDST* dst, size_t n, float scale, float zp) { size_t i = 0; // loadu_si128/epi64 does not support const qualifier @@ -53,4 +55,4 @@ void attn_dequant_u8_kernel(const uint8_t* src, TDST* dst, size_t n, float scale } // namespace XARCH } // namespace Cpu } // namespace Extensions -} // namespace ov \ No newline at end of file +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/common.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/common.hpp index 2956c8a6a6b5b8..4e14cf5894b04d 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/common.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/common.hpp @@ -4,16 +4,20 @@ #pragma once #include +#include #include #include #include -#include #include "openvino/core/type/bfloat16.hpp" #include "openvino/core/type/float16.hpp" +#if defined(HAVE_SSE) || defined(HAVE_AVX2) || defined(HAVE_AVX512F) +# include +#endif + #if defined(OPENVINO_ARCH_ARM64) -#include "arm_neon.h" +# include "arm_neon.h" #endif namespace ov { @@ -32,307 +36,307 @@ static constexpr size_t vec_len_f32_neon = vec_len_neon / sizeof(float); static constexpr size_t vec_len_f16_neon = vec_len_neon / sizeof(ov::float16); #ifdef HAVE_AVX512F - inline __m512 cvt_bf16_to_fp32(const __m256i src) { - __m512i y = _mm512_cvtepu16_epi32(src); - return _mm512_castsi512_ps(_mm512_slli_epi32(y, 16)); - } - - // load addr to __m512 reg - inline __m512 mm512_uni_loadu_ps(const float* a) { - return _mm512_loadu_ps(a); - } - - inline __m512 mm512_uni_loadu_ps(const ov::bfloat16* a) { - auto vec_bf16 = _mm256_loadu_si256(reinterpret_cast(a)); - return cvt_bf16_to_fp32(vec_bf16); - } - - inline __m512 mm512_uni_loadu_ps(const ov::float16* a) { - auto vec_f16 = _mm256_loadu_si256(reinterpret_cast(a)); - return _mm512_cvtph_ps(vec_f16); - } - - // load addr to __m512 reg - inline __m512 mm512_uni_loadu_tail_ps(const float* a, size_t count) { - __mmask16 mask = (1 << count) - 1; - return _mm512_maskz_loadu_ps(mask, a); - } - - inline __m512 mm512_uni_loadu_tail_ps(const ov::bfloat16* a, size_t count) { - auto mask = (1 << count) - 1; - auto bf16_vec = _mm256_maskz_loadu_epi16(mask, a); - return cvt_bf16_to_fp32(bf16_vec); - } - - inline __m512 mm512_uni_loadu_tail_ps(const ov::float16* a, size_t count) { - auto mask = (1 << count) - 1; - auto f16_vec = _mm256_maskz_loadu_epi16(mask, a); - return _mm512_cvtph_ps(f16_vec); - } - - // store __m512 reg to addr - inline void mm512_uni_storeu_ps(float* a, __m512 v) { - _mm512_storeu_ps(a, v); - } - inline void mm512_uni_storeu_ps(ov::bfloat16 *addr, __m512 xps) { - __m512i xpi32 = _mm512_castps_si512(xps); - __m512i nan = _mm512_set1_epi32(0xffff); - auto mask = _mm512_cmp_ps_mask(xps, xps, _CMP_ORD_Q); - __m512i ones = _mm512_set1_epi32(0x1); - __m512i vec_bias = _mm512_set1_epi32(0x7fff); - auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] - x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB - x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; - x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 - _mm256_storeu_si256(reinterpret_cast<__m256i *>(addr), _mm512_cvtepi32_epi16(x)); - } - - inline void mm512_uni_storeu_ps(ov::float16* addr, __m512 v) { - __m256i vec_f16 = _mm512_cvtps_ph(v, 0); - _mm256_storeu_si256(reinterpret_cast<__m256i *>(addr), vec_f16); - } - - // store __m512 reg to addr - inline void mm512_uni_mask_storeu_ps(ov::bfloat16 *addr, __mmask16 mask_addr, __m512 xps) { - __m512i xpi32 = _mm512_castps_si512(xps); - __m512i nan = _mm512_set1_epi32(0xffff); - auto mask = _mm512_cmp_ps_mask(xps, xps, _CMP_ORD_Q); - __m512i ones = _mm512_set1_epi32(0x1); - __m512i vec_bias = _mm512_set1_epi32(0x7fff); - auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] - x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB - x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; - x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 - _mm512_mask_cvtepi32_storeu_epi16(addr, mask_addr, x); - } - - inline void mm512_uni_storeu_tail_ps(float *addr, __m512 v, size_t count) { - __mmask16 mask_addr = (1 << count) - 1; - _mm512_mask_storeu_ps(addr, mask_addr, v); - } - - inline void mm512_uni_storeu_tail_ps(ov::bfloat16 *addr, __m512 v, size_t count) { - __mmask16 mask_addr = (1 << count) - 1; - __m512i xpi32 = _mm512_castps_si512(v); - __m512i nan = _mm512_set1_epi32(0xffff); - auto mask = _mm512_cmp_ps_mask(v, v, _CMP_ORD_Q); - __m512i ones = _mm512_set1_epi32(0x1); - __m512i vec_bias = _mm512_set1_epi32(0x7fff); - auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] - x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB - x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; - x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 - _mm512_mask_cvtepi32_storeu_epi16(addr, mask_addr, x); - } - - inline void mm512_uni_storeu_tail_ps(ov::float16 *addr, __m512 v, size_t count) { - __mmask16 mask_addr = (1 << count) - 1; - __m256i vec_f16 = _mm512_cvtps_ph(v, 0); - _mm256_mask_storeu_epi16(reinterpret_cast<__m256i *>(addr), mask_addr, vec_f16); - } +inline __m512 cvt_bf16_to_fp32(const __m256i src) { + __m512i y = _mm512_cvtepu16_epi32(src); + return _mm512_castsi512_ps(_mm512_slli_epi32(y, 16)); +} + +// load addr to __m512 reg +inline __m512 mm512_uni_loadu_ps(const float* a) { + return _mm512_loadu_ps(a); +} + +inline __m512 mm512_uni_loadu_ps(const ov::bfloat16* a) { + auto vec_bf16 = _mm256_loadu_si256(reinterpret_cast(a)); + return cvt_bf16_to_fp32(vec_bf16); +} + +inline __m512 mm512_uni_loadu_ps(const ov::float16* a) { + auto vec_f16 = _mm256_loadu_si256(reinterpret_cast(a)); + return _mm512_cvtph_ps(vec_f16); +} + +// load addr to __m512 reg +inline __m512 mm512_uni_loadu_tail_ps(const float* a, size_t count) { + __mmask16 mask = (1 << count) - 1; + return _mm512_maskz_loadu_ps(mask, a); +} + +inline __m512 mm512_uni_loadu_tail_ps(const ov::bfloat16* a, size_t count) { + auto mask = (1 << count) - 1; + auto bf16_vec = _mm256_maskz_loadu_epi16(mask, a); + return cvt_bf16_to_fp32(bf16_vec); +} + +inline __m512 mm512_uni_loadu_tail_ps(const ov::float16* a, size_t count) { + auto mask = (1 << count) - 1; + auto f16_vec = _mm256_maskz_loadu_epi16(mask, a); + return _mm512_cvtph_ps(f16_vec); +} + +// store __m512 reg to addr +inline void mm512_uni_storeu_ps(float* a, __m512 v) { + _mm512_storeu_ps(a, v); +} +inline void mm512_uni_storeu_ps(ov::bfloat16* addr, __m512 xps) { + __m512i xpi32 = _mm512_castps_si512(xps); + __m512i nan = _mm512_set1_epi32(0xffff); + auto mask = _mm512_cmp_ps_mask(xps, xps, _CMP_ORD_Q); + __m512i ones = _mm512_set1_epi32(0x1); + __m512i vec_bias = _mm512_set1_epi32(0x7fff); + auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] + x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB + x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; + x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 + _mm256_storeu_si256(reinterpret_cast<__m256i*>(addr), _mm512_cvtepi32_epi16(x)); +} + +inline void mm512_uni_storeu_ps(ov::float16* addr, __m512 v) { + __m256i vec_f16 = _mm512_cvtps_ph(v, 0); + _mm256_storeu_si256(reinterpret_cast<__m256i*>(addr), vec_f16); +} + +// store __m512 reg to addr +inline void mm512_uni_mask_storeu_ps(ov::bfloat16* addr, __mmask16 mask_addr, __m512 xps) { + __m512i xpi32 = _mm512_castps_si512(xps); + __m512i nan = _mm512_set1_epi32(0xffff); + auto mask = _mm512_cmp_ps_mask(xps, xps, _CMP_ORD_Q); + __m512i ones = _mm512_set1_epi32(0x1); + __m512i vec_bias = _mm512_set1_epi32(0x7fff); + auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] + x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB + x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; + x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 + _mm512_mask_cvtepi32_storeu_epi16(addr, mask_addr, x); +} + +inline void mm512_uni_storeu_tail_ps(float* addr, __m512 v, size_t count) { + __mmask16 mask_addr = (1 << count) - 1; + _mm512_mask_storeu_ps(addr, mask_addr, v); +} + +inline void mm512_uni_storeu_tail_ps(ov::bfloat16* addr, __m512 v, size_t count) { + __mmask16 mask_addr = (1 << count) - 1; + __m512i xpi32 = _mm512_castps_si512(v); + __m512i nan = _mm512_set1_epi32(0xffff); + auto mask = _mm512_cmp_ps_mask(v, v, _CMP_ORD_Q); + __m512i ones = _mm512_set1_epi32(0x1); + __m512i vec_bias = _mm512_set1_epi32(0x7fff); + auto x = _mm512_and_si512(_mm512_srli_epi32(xpi32, 16), ones); // LSB = x[16] + x = _mm512_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB + x = _mm512_srli_epi32(_mm512_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; + x = _mm512_mask_blend_epi32(mask, nan, x); // Check NaN before converting back to bf16 + _mm512_mask_cvtepi32_storeu_epi16(addr, mask_addr, x); +} + +inline void mm512_uni_storeu_tail_ps(ov::float16* addr, __m512 v, size_t count) { + __mmask16 mask_addr = (1 << count) - 1; + __m256i vec_f16 = _mm512_cvtps_ph(v, 0); + _mm256_mask_storeu_epi16(reinterpret_cast<__m256i*>(addr), mask_addr, vec_f16); +} #endif #ifdef HAVE_AVX2 - inline __m256i get_mask(int N7) { - static __m256i mask[] = { - _mm256_set_epi32(0, 0, 0, 0, 0, 0, 0, 0), - _mm256_set_epi32(0, 0, 0, 0, 0, 0, 0, -1), - _mm256_set_epi32(0, 0, 0, 0, 0, 0, -1, -1), - _mm256_set_epi32(0, 0, 0, 0, 0, -1, -1, -1), - _mm256_set_epi32(0, 0, 0, 0, -1, -1, -1, -1), - _mm256_set_epi32(0, 0, 0, -1, -1, -1, -1, -1), - _mm256_set_epi32(0, 0, -1, -1, -1, -1, -1, -1), - _mm256_set_epi32(0, -1, -1, -1, -1, -1, -1, -1), - _mm256_set_epi32(-1, -1, -1, -1, -1, -1, -1, -1), - }; - return _mm256_loadu_si256(&mask[N7]); - } - - // load addr to __m256 reg - inline __m256 mm256_uni_loadu_ps(const float* a) { - return _mm256_loadu_ps(a); - } - - inline __m256 mm256_uni_loadu_ps(const ov::bfloat16* a) { - auto vec_bf16 = _mm_loadu_si128(reinterpret_cast(a)); - auto o = _mm256_castsi256_ps(_mm256_slli_epi32(_mm256_cvtepu16_epi32(vec_bf16), 16)); - return o; - } - - inline __m256 mm256_uni_loadu_ps(const ov::float16* a) { - auto vec_f16 = _mm_loadu_si128(reinterpret_cast(a)); - auto o = _mm256_cvtph_ps(vec_f16); - return o; - } - - // load addr tail to __m256 reg - inline __m256 mm256_uni_loadu_tail_ps(const float* a, const size_t count) { - auto mask = get_mask(count); - return _mm256_maskload_ps(a, mask); - } - - inline __m256 mm256_uni_loadu_tail_ps(const ov::bfloat16* a, const size_t count) { - assert("AVX2 version of bfloat16 tail load is just for compilation pass"); - ov::bfloat16 tmp_values[8] = {0}; - std::memcpy(tmp_values, a, count * sizeof(ov::bfloat16)); - return mm256_uni_loadu_ps(tmp_values); - } - - inline __m256 mm256_uni_loadu_tail_ps(const ov::float16* a, const size_t count) { - ov::float16 tmp_values[8] = {0}; - std::memcpy(tmp_values, a, count * sizeof(ov::float16)); - return mm256_uni_loadu_ps(tmp_values); - } - - // store __m256 reg to addr - inline void mm256_uni_storeu_ps(float* a, __m256 v) { - _mm256_storeu_ps(a, v); - } - - inline void mm256_uni_storeu_ps(ov::bfloat16 *addr, __m256 xps) { - __m256i xpi32 = _mm256_castps_si256(xps); - __m256i nan = _mm256_set1_epi32(0xffff); - __m256i mask = _mm256_castps_si256(_mm256_cmp_ps(xps, xps, _CMP_ORD_Q)); - __m256i ones = _mm256_set1_epi32(0x1); - __m256i vec_bias = _mm256_set1_epi32(0x7fff); - auto x = _mm256_and_si256(_mm256_srli_epi32(xpi32, 16), ones); // LSB = x[16] - x = _mm256_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB - x = _mm256_srli_epi32(_mm256_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; - x = _mm256_blendv_epi8(nan, x, mask); // Check NaN before converting back to bf16 - x = _mm256_packus_epi32(x, x); - x = _mm256_permute4x64_epi64(x, 0xd8); - __m128i bf16_o = _mm256_extractf128_si256(x, 0); - _mm_storeu_si128(reinterpret_cast<__m128i *>(addr), bf16_o); - } - - inline void mm256_uni_storeu_ps(ov::float16* a, __m256 v) { - __m128i vec_f16 = _mm256_cvtps_ph(v, 0); - _mm_storeu_si128(reinterpret_cast<__m128i *>(a), vec_f16); - } - - // store __m256 to addr - inline void mm256_uni_storeu_tail_ps(float *addr, __m256 v, size_t count) { - const auto mask = get_mask(count); - return _mm256_maskstore_ps(addr, mask, v); - } - - inline void hsum(__m256& x) { - __m256 y; // x: 0 1 2 3 4 5 6 7 - y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 - x = _mm256_add_ps(x, y); // X: 01 12 23 30 45 56 67 74 - y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 - x = _mm256_add_ps(x, y); // x: 0123 x x x 4567 x x x - y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x - x = _mm256_add_ps(x, y); // x: 01234567 x x x x x x x - } - inline void hmax(__m256& x) { - __m256 y; // x: 0 1 2 3 4 5 6 7 - y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 - x = _mm256_max_ps(x, y); // X: 01 12 23 30 45 56 67 74 - y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 - x = _mm256_max_ps(x, y); // x: 0123 x x x 4567 x x x - y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x - x = _mm256_max_ps(x, y); // x: 01234567 x x x x x x x - } - inline void hmin(__m256& x) { - __m256 y; // x: 0 1 2 3 4 5 6 7 - y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 - x = _mm256_min_ps(x, y); // X: 01 12 23 30 45 56 67 74 - y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 - x = _mm256_min_ps(x, y); // x: 0123 x x x 4567 x x x - y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x - x = _mm256_min_ps(x, y); // x: 01234567 x x x x x x x - } +inline __m256i get_mask(int N7) { + static __m256i mask[] = { + _mm256_set_epi32(0, 0, 0, 0, 0, 0, 0, 0), + _mm256_set_epi32(0, 0, 0, 0, 0, 0, 0, -1), + _mm256_set_epi32(0, 0, 0, 0, 0, 0, -1, -1), + _mm256_set_epi32(0, 0, 0, 0, 0, -1, -1, -1), + _mm256_set_epi32(0, 0, 0, 0, -1, -1, -1, -1), + _mm256_set_epi32(0, 0, 0, -1, -1, -1, -1, -1), + _mm256_set_epi32(0, 0, -1, -1, -1, -1, -1, -1), + _mm256_set_epi32(0, -1, -1, -1, -1, -1, -1, -1), + _mm256_set_epi32(-1, -1, -1, -1, -1, -1, -1, -1), + }; + return _mm256_loadu_si256(&mask[N7]); +} + +// load addr to __m256 reg +inline __m256 mm256_uni_loadu_ps(const float* a) { + return _mm256_loadu_ps(a); +} + +inline __m256 mm256_uni_loadu_ps(const ov::bfloat16* a) { + auto vec_bf16 = _mm_loadu_si128(reinterpret_cast(a)); + auto o = _mm256_castsi256_ps(_mm256_slli_epi32(_mm256_cvtepu16_epi32(vec_bf16), 16)); + return o; +} + +inline __m256 mm256_uni_loadu_ps(const ov::float16* a) { + auto vec_f16 = _mm_loadu_si128(reinterpret_cast(a)); + auto o = _mm256_cvtph_ps(vec_f16); + return o; +} + +// load addr tail to __m256 reg +inline __m256 mm256_uni_loadu_tail_ps(const float* a, const size_t count) { + auto mask = get_mask(count); + return _mm256_maskload_ps(a, mask); +} + +inline __m256 mm256_uni_loadu_tail_ps(const ov::bfloat16* a, const size_t count) { + assert("AVX2 version of bfloat16 tail load is just for compilation pass"); + ov::bfloat16 tmp_values[8] = {0}; + std::memcpy(tmp_values, a, count * sizeof(ov::bfloat16)); + return mm256_uni_loadu_ps(tmp_values); +} + +inline __m256 mm256_uni_loadu_tail_ps(const ov::float16* a, const size_t count) { + ov::float16 tmp_values[8] = {0}; + std::memcpy(tmp_values, a, count * sizeof(ov::float16)); + return mm256_uni_loadu_ps(tmp_values); +} + +// store __m256 reg to addr +inline void mm256_uni_storeu_ps(float* a, __m256 v) { + _mm256_storeu_ps(a, v); +} + +inline void mm256_uni_storeu_ps(ov::bfloat16* addr, __m256 xps) { + __m256i xpi32 = _mm256_castps_si256(xps); + __m256i nan = _mm256_set1_epi32(0xffff); + __m256i mask = _mm256_castps_si256(_mm256_cmp_ps(xps, xps, _CMP_ORD_Q)); + __m256i ones = _mm256_set1_epi32(0x1); + __m256i vec_bias = _mm256_set1_epi32(0x7fff); + auto x = _mm256_and_si256(_mm256_srli_epi32(xpi32, 16), ones); // LSB = x[16] + x = _mm256_add_epi32(x, vec_bias); // rounding_bias = 0x7fff + LSB + x = _mm256_srli_epi32(_mm256_add_epi32(x, xpi32), 16); // x = (x + rounding_bias) >> 16; + x = _mm256_blendv_epi8(nan, x, mask); // Check NaN before converting back to bf16 + x = _mm256_packus_epi32(x, x); + x = _mm256_permute4x64_epi64(x, 0xd8); + __m128i bf16_o = _mm256_extractf128_si256(x, 0); + _mm_storeu_si128(reinterpret_cast<__m128i*>(addr), bf16_o); +} + +inline void mm256_uni_storeu_ps(ov::float16* a, __m256 v) { + __m128i vec_f16 = _mm256_cvtps_ph(v, 0); + _mm_storeu_si128(reinterpret_cast<__m128i*>(a), vec_f16); +} + +// store __m256 to addr +inline void mm256_uni_storeu_tail_ps(float* addr, __m256 v, size_t count) { + const auto mask = get_mask(count); + return _mm256_maskstore_ps(addr, mask, v); +} + +inline void hsum(__m256& x) { + __m256 y; // x: 0 1 2 3 4 5 6 7 + y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 + x = _mm256_add_ps(x, y); // X: 01 12 23 30 45 56 67 74 + y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 + x = _mm256_add_ps(x, y); // x: 0123 x x x 4567 x x x + y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x + x = _mm256_add_ps(x, y); // x: 01234567 x x x x x x x +} +inline void hmax(__m256& x) { + __m256 y; // x: 0 1 2 3 4 5 6 7 + y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 + x = _mm256_max_ps(x, y); // X: 01 12 23 30 45 56 67 74 + y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 + x = _mm256_max_ps(x, y); // x: 0123 x x x 4567 x x x + y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x + x = _mm256_max_ps(x, y); // x: 01234567 x x x x x x x +} +inline void hmin(__m256& x) { + __m256 y; // x: 0 1 2 3 4 5 6 7 + y = _mm256_permute_ps(x, 0x39); // y: 1 2 3 0 5 6 7 4 + x = _mm256_min_ps(x, y); // X: 01 12 23 30 45 56 67 74 + y = _mm256_permute_ps(x, 0x4e); // y: 23 30 01 12 67 74 45 56 + x = _mm256_min_ps(x, y); // x: 0123 x x x 4567 x x x + y = _mm256_permute2f128_ps(x, x, 1); // y: 4567 x x x 0123 x x x + x = _mm256_min_ps(x, y); // x: 01234567 x x x x x x x +} #endif #ifdef OPENVINO_ARCH_ARM64 - inline float32x4_t exp_ps_neon_f32(const float32x4_t& src) { - const auto c1 = vreinterpretq_f32_u32(vdupq_n_u32(0x3f7ffff6)); - const auto c2 = vreinterpretq_f32_u32(vdupq_n_u32(0x3efffedb)); - const auto c3 = vreinterpretq_f32_u32(vdupq_n_u32(0x3e2aaf33)); - const auto c4 = vreinterpretq_f32_u32(vdupq_n_u32(0x3d2b9f17)); - const auto c5 = vreinterpretq_f32_u32(vdupq_n_u32(0x3c072010)); - - const auto shift = vreinterpretq_f32_u32(vdupq_n_u32(0x4b00007f)); // 2^23 + 127 = 0x1.0000fep23f - const auto one = vdupq_n_f32(1.0f); // 1 - const auto two = vdupq_n_f32(2.0f); // 2 - const auto inv_ln2 = vreinterpretq_f32_u32(vdupq_n_u32(0x3fb8aa3b)); - const auto neg_ln2_hi = vreinterpretq_f32_u32(vdupq_n_u32(0xbf317200)); - const auto neg_ln2_lo = vreinterpretq_f32_u32(vdupq_n_u32(0xb5bfbe8e)); - - const auto inf = vdupq_n_f32(std::numeric_limits::infinity()); - const auto max_input = vdupq_n_f32(88.37f); // Approximately ln(2^127.5) - const auto zero = vdupq_n_f32(0.f); - const auto min_input = vdupq_n_f32(-86.64f); // Approximately ln(2^-125) - - const auto z = vmlaq_f32(shift, src, inv_ln2); - auto n = z - shift; - n = vsubq_f32(n, one); - const auto scale = vreinterpretq_f32_u32(vreinterpretq_u32_f32(z) << 23); // 2^n - - const auto r_hi = vfmaq_f32(src, n, neg_ln2_hi); - const auto r = vfmaq_f32(r_hi, n, neg_ln2_lo); - - const auto r2 = r * r; - - const auto p1 = c1 * r; - const auto p23 = vfmaq_f32(c2, c3, r); - const auto p45 = vfmaq_f32(c4, c5, r); - const auto p2345 = vfmaq_f32(p23, p45, r2); - const auto p12345 = vfmaq_f32(p1, p2345, r2); - - auto poly = vfmaq_f32(scale, p12345, scale); - poly = vmulq_f32(poly, two); - - poly = vbslq_f32(vcltq_f32(src, min_input), zero, poly); - poly = vbslq_f32(vcgtq_f32(src, max_input), inf, poly); - - return poly; - } - inline float32x4_t __vld1q_f32(const ov::bfloat16* a) { - uint16x4_t vec_bf16 = vld1_u16(reinterpret_cast(a)); - - float32x4_t vec_f32 = vcvtq_f32_u32(vmovl_u16(vec_bf16)); - return vec_f32; - } - inline float32x4_t __vld1q_f32(const float* a) { - return vld1q_f32(a); - } - inline float32x4_t __vld1q_f32(const ov::float16* a) { - auto _a = reinterpret_cast(a); - return vcvt_f32_f16(vld1_f16(_a)); - } - inline void __vst1q_f32(float* a, float32x4_t b) { - vst1q_f32(a, b); - } - inline void __vst1q_f32(ov::float16* a, float32x4_t b) { - float16x4_t v_f16 = vcvt_f16_f32(b); - vst1_f16(reinterpret_cast(a), v_f16); - } - inline void __vst1q_f32(ov::bfloat16* a, float32x4_t b) { - uint32x4_t v_int32 = vreinterpretq_u32_f32(b); - uint16x4_t v_bf16 = vshrn_n_u32(v_int32, 16); - - vst1_u16(reinterpret_cast(a), v_bf16); - } +inline float32x4_t exp_ps_neon_f32(const float32x4_t& src) { + const auto c1 = vreinterpretq_f32_u32(vdupq_n_u32(0x3f7ffff6)); + const auto c2 = vreinterpretq_f32_u32(vdupq_n_u32(0x3efffedb)); + const auto c3 = vreinterpretq_f32_u32(vdupq_n_u32(0x3e2aaf33)); + const auto c4 = vreinterpretq_f32_u32(vdupq_n_u32(0x3d2b9f17)); + const auto c5 = vreinterpretq_f32_u32(vdupq_n_u32(0x3c072010)); + + const auto shift = vreinterpretq_f32_u32(vdupq_n_u32(0x4b00007f)); // 2^23 + 127 = 0x1.0000fep23f + const auto one = vdupq_n_f32(1.0f); // 1 + const auto two = vdupq_n_f32(2.0f); // 2 + const auto inv_ln2 = vreinterpretq_f32_u32(vdupq_n_u32(0x3fb8aa3b)); + const auto neg_ln2_hi = vreinterpretq_f32_u32(vdupq_n_u32(0xbf317200)); + const auto neg_ln2_lo = vreinterpretq_f32_u32(vdupq_n_u32(0xb5bfbe8e)); + + const auto inf = vdupq_n_f32(std::numeric_limits::infinity()); + const auto max_input = vdupq_n_f32(88.37f); // Approximately ln(2^127.5) + const auto zero = vdupq_n_f32(0.f); + const auto min_input = vdupq_n_f32(-86.64f); // Approximately ln(2^-125) + + const auto z = vmlaq_f32(shift, src, inv_ln2); + auto n = z - shift; + n = vsubq_f32(n, one); + const auto scale = vreinterpretq_f32_u32(vreinterpretq_u32_f32(z) << 23); // 2^n + + const auto r_hi = vfmaq_f32(src, n, neg_ln2_hi); + const auto r = vfmaq_f32(r_hi, n, neg_ln2_lo); + + const auto r2 = r * r; + + const auto p1 = c1 * r; + const auto p23 = vfmaq_f32(c2, c3, r); + const auto p45 = vfmaq_f32(c4, c5, r); + const auto p2345 = vfmaq_f32(p23, p45, r2); + const auto p12345 = vfmaq_f32(p1, p2345, r2); + + auto poly = vfmaq_f32(scale, p12345, scale); + poly = vmulq_f32(poly, two); + + poly = vbslq_f32(vcltq_f32(src, min_input), zero, poly); + poly = vbslq_f32(vcgtq_f32(src, max_input), inf, poly); + + return poly; +} +inline float32x4_t __vld1q_f32(const ov::bfloat16* a) { + uint16x4_t vec_bf16 = vld1_u16(reinterpret_cast(a)); + + float32x4_t vec_f32 = vcvtq_f32_u32(vmovl_u16(vec_bf16)); + return vec_f32; +} +inline float32x4_t __vld1q_f32(const float* a) { + return vld1q_f32(a); +} +inline float32x4_t __vld1q_f32(const ov::float16* a) { + auto _a = reinterpret_cast(a); + return vcvt_f32_f16(vld1_f16(_a)); +} +inline void __vst1q_f32(float* a, float32x4_t b) { + vst1q_f32(a, b); +} +inline void __vst1q_f32(ov::float16* a, float32x4_t b) { + float16x4_t v_f16 = vcvt_f16_f32(b); + vst1_f16(reinterpret_cast(a), v_f16); +} +inline void __vst1q_f32(ov::bfloat16* a, float32x4_t b) { + uint32x4_t v_int32 = vreinterpretq_u32_f32(b); + uint16x4_t v_bf16 = vshrn_n_u32(v_int32, 16); + + vst1_u16(reinterpret_cast(a), v_bf16); +} #endif #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) - inline float16x8_t exp_ps_neon_f16(float16x8_t x) { - const float32x4_t x_high = vcvt_f32_f16(vget_high_f16(x)); - const float32x4_t x_low = vcvt_f32_f16(vget_low_f16(x)); - - // We use f32 to maintain accuracy - const float16x8_t res = vcombine_f16(vcvt_f16_f32(exp_ps_neon_f32(x_low)), vcvt_f16_f32(exp_ps_neon_f32(x_high))); - return res; - } - inline float16_t hsum(float16x8_t vec) { - float16x4_t sum1 = vpadd_f16(vget_low_f16(vec), vget_high_f16(vec)); - float16x4_t sum2 = vpadd_f16(sum1, sum1); - float16x4_t sum3 = vpadd_f16(sum2, sum2); - return vget_lane_f16(sum3, 0); - } +inline float16x8_t exp_ps_neon_f16(float16x8_t x) { + const float32x4_t x_high = vcvt_f32_f16(vget_high_f16(x)); + const float32x4_t x_low = vcvt_f32_f16(vget_low_f16(x)); + + // We use f32 to maintain accuracy + const float16x8_t res = vcombine_f16(vcvt_f16_f32(exp_ps_neon_f32(x_low)), vcvt_f16_f32(exp_ps_neon_f32(x_high))); + return res; +} +inline float16_t hsum(float16x8_t vec) { + float16x4_t sum1 = vpadd_f16(vget_low_f16(vec), vget_high_f16(vec)); + float16x4_t sum2 = vpadd_f16(sum1, sum1); + float16x4_t sum3 = vpadd_f16(sum2, sum2); + return vget_lane_f16(sum3, 0); +} #endif } // namespace XARCH } // namespace Cpu diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.cpp index 90167ac86a8e1a..a74021d8ac0d05 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.cpp @@ -13,19 +13,19 @@ # include #endif -#include "openvino/core/type/bfloat16.hpp" -#include "openvino/core/type/float16.hpp" -#include "openvino/core/parallel.hpp" +#include "attn_memcpy.hpp" +#include "attn_quant.hpp" +#include "attn_quant_kernel.hpp" +#include "common.hpp" #include "executor_pa.hpp" #include "executor_pa_common.hpp" -#include "common.hpp" -#include "attn_quant_kernel.hpp" +#include "nodes/kernels/x64/brgemm_kernel.hpp" +#include "openvino/core/parallel.hpp" +#include "openvino/core/type/bfloat16.hpp" +#include "openvino/core/type/float16.hpp" #include "softmax_kernel.hpp" #include "transpose_kernel.hpp" #include "utils/plain_tensor.hpp" -#include "attn_memcpy.hpp" -#include "attn_quant.hpp" -#include "nodes/kernels/x64/brgemm_kernel.hpp" namespace ov { namespace Extensions { @@ -38,42 +38,43 @@ using namespace ov::intel_cpu; // currently depends on brgemm which only support x64 #ifdef OPENVINO_ARCH_X86_64 -#if defined(HAVE_AVX2) || defined(HAVE_AVX512F) +# if defined(HAVE_AVX2) || defined(HAVE_AVX512F) -#define prefetch_bytes(bytes, sel, advance, src) { \ - auto *p = reinterpret_cast(src); \ - for (size_t i = 0; i < bytes; i += 64) \ - _mm_prefetch(p + i + advance, sel); \ -} +# define prefetch_bytes(bytes, sel, advance, src) \ + { \ + auto* p = reinterpret_cast(src); \ + for (size_t i = 0; i < bytes; i += 64) \ + _mm_prefetch(p + i + advance, sel); \ + } -#else +# else -#define prefetch_bytes(bytes, sel, advance, src) +# define prefetch_bytes(bytes, sel, advance, src) -#endif +# endif -template +template void cvt_copy(TA* dst, TB* src, size_t n) { size_t i = 0; -#if defined(HAVE_AVX512F) +# if defined(HAVE_AVX512F) for (; i + vec_len_f32_avx512 <= n; i += vec_len_f32_avx512) { auto vb = mm512_uni_loadu_ps(src + i); mm512_uni_storeu_ps(dst + i, vb); } -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) for (; i + vec_len_f32_avx2 <= n; i += vec_len_f32_avx2) { auto vb = mm256_uni_loadu_ps(src + i); mm256_uni_storeu_ps(dst + i, vb); } -#endif +# endif for (; i < n; i++) { dst[i] = src[i]; } } -template +template static void attn_acc_value_block(float* out, float* weight, T* v, size_t S, size_t block_size) { -#if defined(HAVE_AVX512F) +# if defined(HAVE_AVX512F) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto attn_w_vec0 = _mm512_set1_ps(weight[0]); @@ -132,7 +133,7 @@ static void attn_acc_value_block(float* out, float* weight, T* v, size_t S, size } } return; -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto attn_w_vec0 = _mm256_set1_ps(weight[0]); @@ -191,7 +192,7 @@ static void attn_acc_value_block(float* out, float* weight, T* v, size_t S, size } } return; -#endif +# endif for (size_t j = 0; j < block_size; j++) { for (size_t i = 0; i < S; i++) { out[i] += weight[j] * v[i]; @@ -202,9 +203,9 @@ static void attn_acc_value_block(float* out, float* weight, T* v, size_t S, size static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S, size_t block_size) { // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) -#if defined(HAVE_AVX512F) + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) +# if defined(HAVE_AVX512F) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto v_f0 = reinterpret_cast(v); @@ -223,10 +224,18 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S v += 8; for (; i + vec_len_f32_avx512 <= S; i += vec_len_f32_avx512) { auto v_out = mm512_uni_loadu_ps(out + i); - auto v0 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i)))), zp0); - auto v1 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + S + 8)))), zp1); - auto v2 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + 2 * (S + 8))))), zp2); - auto v3 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + 3 * (S + 8))))), zp3); + auto v0 = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i)))), + zp0); + auto v1 = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + S + 8)))), + zp1); + auto v2 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32( + _mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + 2 * (S + 8))))), + zp2); + auto v3 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32( + _mm_loadu_si128(reinterpret_cast<__m128i*>(v + i + 3 * (S + 8))))), + zp3); v_out = _mm512_fmadd_ps(attn_w_vec0, v0, v_out); v_out = _mm512_fmadd_ps(attn_w_vec1, v1, v_out); v_out = _mm512_fmadd_ps(attn_w_vec2, v2, v_out); @@ -251,7 +260,9 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S v += 8; for (; i + vec_len_f32_avx512 <= S; i += vec_len_f32_avx512) { auto v_out = mm512_uni_loadu_ps(out + i); - auto v0 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i)))), zp0); + auto v0 = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(v + i)))), + zp0); v_out = _mm512_fmadd_ps(attn_w_vec0, v0, v_out); _mm512_storeu_ps(out + i, v_out); @@ -263,7 +274,7 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S weight++; } return; -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) size_t j = 0; for (; j < block_size; j++) { auto v_f0 = reinterpret_cast(v); @@ -273,7 +284,9 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S v += 8; for (; i + vec_len_f32_avx2 <= S; i += vec_len_f32_avx2) { auto v_out = mm256_uni_loadu_ps(out + i); - auto v0 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(v + i)))), zp0); + auto v0 = _mm256_sub_ps( + _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(v + i)))), + zp0); v_out = _mm256_fmadd_ps(attn_w_vec0, v0, v_out); mm256_uni_storeu_ps(out + i, v_out); @@ -285,7 +298,7 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S weight++; } return; -#endif +# endif for (size_t j = 0; j < block_size; j++) { auto v0 = reinterpret_cast(v); v += 8; @@ -296,9 +309,9 @@ static void attn_acc_value_block(float* out, float* weight, uint8_t* v, size_t S } } -template +template static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_size) { -#if defined(HAVE_AVX512F) +# if defined(HAVE_AVX512F) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto vsum0 = _mm512_setzero_ps(); @@ -328,7 +341,7 @@ static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_siz c[2] = sum2; c[3] = sum3; c += 4; - b += 4 * n; + b += 4 * n; } for (; j < block_size; j++) { auto vsum = _mm512_setzero_ps(); @@ -345,7 +358,7 @@ static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_siz *c++ = sum; } return; -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto vsum0 = _mm256_set1_ps(0.0f); @@ -379,7 +392,7 @@ static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_siz c[2] = sum2; c[3] = sum3; c += 4; - b += 4 * n; + b += 4 * n; } for (; j < block_size; j++) { auto vsum = _mm256_set1_ps(0.0f); @@ -397,7 +410,7 @@ static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_siz *c++ = sum; } return; -#endif +# endif for (size_t j = 0; j < block_size; j++) { float sum = 0; for (size_t i = 0; i < n; i++) { @@ -408,12 +421,12 @@ static void dot_product_block(TA* a, TB* b, float* c, size_t n, size_t block_siz } } -template +template static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t block_size) { // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) -#if defined(HAVE_AVX512F) + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) +# if defined(HAVE_AVX512F) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto vsum0 = _mm512_setzero_ps(); @@ -432,10 +445,18 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc b += 8; for (; i + vec_len_f32_avx512 <= n; i += vec_len_f32_avx512) { auto va = mm512_uni_loadu_ps(a + i); - auto vb0 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i)))), v_zp0); - auto vb1 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + n + 8)))), v_zp1); - auto vb2 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + 2 * (n + 8))))), v_zp2); - auto vb3 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + 3 * (n + 8))))), v_zp3); + auto vb0 = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i)))), + v_zp0); + auto vb1 = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + n + 8)))), + v_zp1); + auto vb2 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32( + _mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + 2 * (n + 8))))), + v_zp2); + auto vb3 = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32( + _mm_loadu_si128(reinterpret_cast<__m128i*>(b + i + 3 * (n + 8))))), + v_zp3); vsum0 = _mm512_fmadd_ps(va, vb0, vsum0); vsum1 = _mm512_fmadd_ps(va, vb1, vsum1); @@ -457,7 +478,7 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc c[2] = sum2 * b2[0]; c[3] = sum3 * b3[0]; c += 4; - b += 4 * (n + 8) - 8; + b += 4 * (n + 8) - 8; } for (; j < block_size; j++) { auto vsum = _mm512_setzero_ps(); @@ -467,7 +488,9 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc b += 8; for (; i + vec_len_f32_avx512 <= n; i += vec_len_f32_avx512) { auto va = mm512_uni_loadu_ps(a + i); - auto vb = _mm512_sub_ps(_mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i)))), v_zp); + auto vb = _mm512_sub_ps( + _mm512_cvtepi32_ps(_mm512_cvtepu8_epi32(_mm_loadu_si128(reinterpret_cast<__m128i*>(b + i)))), + v_zp); vsum = _mm512_fmadd_ps(va, vb, vsum); } float sum = _mm512_reduce_add_ps(vsum); @@ -478,7 +501,7 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc *c++ = sum * b0[0]; } return; -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) size_t j = 0; for (; j + 4 <= block_size; j += 4) { auto vsum0 = _mm256_setzero_ps(); @@ -497,10 +520,18 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc b += 8; for (; i + vec_len_f32_avx2 <= n; i += vec_len_f32_avx2) { auto va = mm256_uni_loadu_ps(a + i); - auto vb0 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i)))), v_zp0); - auto vb1 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + n + 8)))), v_zp1); - auto vb2 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + 2 * (n + 8))))), v_zp2); - auto vb3 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + 3 * (n + 8))))), v_zp3); + auto vb0 = _mm256_sub_ps( + _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i)))), + v_zp0); + auto vb1 = _mm256_sub_ps( + _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + n + 8)))), + v_zp1); + auto vb2 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32( + _mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + 2 * (n + 8))))), + v_zp2); + auto vb3 = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32( + _mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i + 3 * (n + 8))))), + v_zp3); vsum0 = _mm256_fmadd_ps(va, vb0, vsum0); vsum1 = _mm256_fmadd_ps(va, vb1, vsum1); @@ -526,7 +557,7 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc c[2] = sum2 * b2[0]; c[3] = sum3 * b3[0]; c += 4; - b += 4 * (n + 8) - 8; + b += 4 * (n + 8) - 8; } for (; j < block_size; j++) { auto vsum = _mm256_setzero_ps(); @@ -536,7 +567,9 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc b += 8; for (; i + vec_len_f32_avx2 <= n; i += vec_len_f32_avx2) { auto va = mm256_uni_loadu_ps(a + i); - auto vb = _mm256_sub_ps(_mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i)))), v_zp); + auto vb = _mm256_sub_ps( + _mm256_cvtepi32_ps(_mm256_cvtepu8_epi32(_mm_loadl_epi64(reinterpret_cast<__m128i*>(b + i)))), + v_zp); vsum = _mm256_fmadd_ps(va, vb, vsum); } hsum(vsum); @@ -548,7 +581,7 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc *c++ = sum * b0[0]; } return; -#endif +# endif for (size_t j = 0; j < block_size; j++) { float sum = 0; auto b0 = reinterpret_cast(b); @@ -561,11 +594,11 @@ static void dot_product_block(TA* a, uint8_t* b, float* c, size_t n, size_t bloc } } -template +template static void attn_reduce(T* dst, float* temp, size_t M, size_t S, size_t temp_stride) { size_t i = 0; -#if defined(HAVE_AVX512F) - for (; i + vec_len_f32_avx512 <= S; i+= vec_len_f32_avx512) { +# if defined(HAVE_AVX512F) + for (; i + vec_len_f32_avx512 <= S; i += vec_len_f32_avx512) { auto* src = temp + i; auto result_vec_fp32 = _mm512_setzero_ps(); for (size_t m = 0; m < M; m++) { @@ -576,7 +609,7 @@ static void attn_reduce(T* dst, float* temp, size_t M, size_t S, size_t temp_str // save to bf16 mm512_uni_storeu_ps(dst + i, result_vec_fp32); } -#elif defined(HAVE_AVX2) +# elif defined(HAVE_AVX2) for (; i + vec_len_f32_avx2 <= S; i += vec_len_f32_avx2) { auto* src = temp + i; auto result_vec_fp32 = _mm256_set1_ps(0.0f); @@ -587,7 +620,7 @@ static void attn_reduce(T* dst, float* temp, size_t M, size_t S, size_t temp_str } mm256_uni_storeu_ps(dst + i, result_vec_fp32); } -#endif +# endif for (; i < S; i++) { auto* src = temp + i; float sum = 0.0f; @@ -601,7 +634,7 @@ static void attn_reduce(T* dst, float* temp, size_t M, size_t S, size_t temp_str } // N must be multiple of 16 -template +template void transpose_16NxK(TDST* dst, TSRC* src, TDST* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { size_t k = 0; for (; k + 16 <= K; k += 16) { @@ -619,24 +652,26 @@ void transpose_16NxK(TDST* dst, TSRC* src, TDST* tmp, size_t N, size_t K, size_t } } -#if defined(HAVE_AVX512F) -template::value || std::is_same::value), bool>::type> +# if defined(HAVE_AVX512F) +template ::value || std::is_same::value), bool>::type> static void transpose_16NxK(T* dst, T* src, T* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { // will treat as uint32_t transpose auto s = reinterpret_cast(src); auto d = reinterpret_cast(dst); transpose_16NxK(d, s, reinterpret_cast(0), N, K >> 1, dst_stride, src_stride >> 1); } -#endif +# endif -template +template void transpose_16NxK(TDST* dst, uint8_t* src, TDST* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) auto s = src; auto t = tmp; - for (size_t n = 0; n < N; n ++) { + for (size_t n = 0; n < N; n++) { auto f = reinterpret_cast(s); attn_dequant_u8_kernel(s + 2 * sizeof(float), t, K, f[0], f[1]); s += src_stride + 2 * sizeof(float); @@ -646,7 +681,7 @@ void transpose_16NxK(TDST* dst, uint8_t* src, TDST* tmp, size_t N, size_t K, siz } // dequant f16/u8 to float -template +template static inline void dequant(T* dst, T* src, size_t N, size_t K) { // never called OPENVINO_THROW("dequant: should not be called."); @@ -656,13 +691,13 @@ static inline void dequant(float* dst, ov::float16* src, size_t N, size_t K) { cvt_copy(dst, src, K * N); } -template +template void dequant(TDST* dst, uint8_t* src, size_t N, size_t K) { // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) auto s = src; - for (size_t n = 0; n < N; n ++) { + for (size_t n = 0; n < N; n++) { auto f = reinterpret_cast(s); attn_dequant_u8_kernel(s + 2 * sizeof(float), dst, K, f[0], f[1]); s += K + 2 * sizeof(float); @@ -670,18 +705,24 @@ void dequant(TDST* dst, uint8_t* src, size_t N, size_t K) { } } -#if defined(HAVE_AVX512F) -template::value || std::is_same::value), bool>::type> +# if defined(HAVE_AVX512F) +template ::value || std::is_same::value), bool>::type> static void pack_32x32_kernel(T* dst, T* src, size_t dst_stride, size_t src_stride) { static const uint64_t idx[8] = {0, 4, 1, 5, 2, 6, 3, 7}; auto midx = _mm512_loadu_si512(idx); for (size_t i = 0; i < 16; i++) { - auto a = _mm512_loadu_si512(src); // [a1 a2 a3 a4 | a5 a6 a7 a8] total 512-bits in 8 64bits unit + auto a = _mm512_loadu_si512(src); // [a1 a2 a3 a4 | a5 a6 a7 a8] total 512-bits in 8 64bits unit auto b = _mm512_loadu_si512(src + src_stride); // [b1 b2 b3 b4 | b5 b6 b7 b8] total 512-bits a = _mm512_permutexvar_epi64(midx, a); // [a1 a5 | a2 a6 | a3 a7 | a4 a8] b = _mm512_permutexvar_epi64(midx, b); // [b1 b5 | b2 b6 | b3 b7 | b4 b8] - auto B0 = _mm512_unpacklo_epi16(a, b); // [ a1&b1 a2&b2 a3&b3 a4&b4] for each 128-bits lane, interleave word in low 64 bits - auto B1 = _mm512_unpackhi_epi16(a, b); // [ a5&b5 a6&b6 a7&b7 a8&b8] for each 128-bits lane, interleave word in high 64 bits + auto B0 = _mm512_unpacklo_epi16( + a, + b); // [ a1&b1 a2&b2 a3&b3 a4&b4] for each 128-bits lane, interleave word in low 64 bits + auto B1 = _mm512_unpackhi_epi16( + a, + b); // [ a5&b5 a6&b6 a7&b7 a8&b8] for each 128-bits lane, interleave word in high 64 bits _mm512_storeu_si512(dst, B0); _mm512_storeu_si512(dst + 32, B1); src += 2 * src_stride; @@ -689,17 +730,20 @@ static void pack_32x32_kernel(T* dst, T* src, size_t dst_stride, size_t src_stri } } -template::value || std::is_same::value), bool>::type> +template ::value || std::is_same::value), bool>::type> static void pack_32x16_kernel(T* dst, T* src, size_t dst_stride, size_t src_stride) { static const uint64_t idx[8] = {0, 4, 1, 5, 2, 6, 3, 7}; auto midx = _mm512_loadu_si512(idx); for (size_t i = 0; i < 16; i++) { - auto x = _mm256_loadu_si256(reinterpret_cast<__m256i*>(src)); // [a1 a2 a3 a4] total 256-bits in 4 64bits unit + auto x = + _mm256_loadu_si256(reinterpret_cast<__m256i*>(src)); // [a1 a2 a3 a4] total 256-bits in 4 64bits unit auto y = _mm256_loadu_si256(reinterpret_cast<__m256i*>(src + src_stride)); // [b1 b2 b3 b4] total 256-bits auto a = _mm512_castsi256_si512(x); auto b = _mm512_castsi256_si512(y); - a = _mm512_permutexvar_epi64(midx, a); // [a1 x | a2 x | a3 x | a4 x] - b = _mm512_permutexvar_epi64(midx, b); // [b1 x | b2 x | b3 x | b4 x] + a = _mm512_permutexvar_epi64(midx, a); // [a1 x | a2 x | a3 x | a4 x] + b = _mm512_permutexvar_epi64(midx, b); // [b1 x | b2 x | b3 x | b4 x] auto B0 = _mm512_unpacklo_epi16(a, b); _mm512_storeu_si512(dst, B0); src += 2 * src_stride; @@ -707,18 +751,20 @@ static void pack_32x16_kernel(T* dst, T* src, size_t dst_stride, size_t src_stri } } -template::value || std::is_same::value), bool>::type> +template ::value || std::is_same::value), bool>::type> static void pack_32xK_kernel(T* dst, T* src, size_t dst_stride, size_t src_stride, size_t K) { static const uint64_t idx[8] = {0, 4, 1, 5, 2, 6, 3, 7}; auto midx = _mm512_loadu_si512(idx); __mmask16 mask = (1 << K) - 1; for (size_t i = 0; i < K; i++) { - auto x = _mm256_maskz_loadu_epi16(mask, src); // [a1 a2 a3 a4] total 256-bits in 4 64bits unit - auto y = _mm256_maskz_loadu_epi16(mask, src + src_stride); // [b1 b2 b3 b4] total 256-bits + auto x = _mm256_maskz_loadu_epi16(mask, src); // [a1 a2 a3 a4] total 256-bits in 4 64bits unit + auto y = _mm256_maskz_loadu_epi16(mask, src + src_stride); // [b1 b2 b3 b4] total 256-bits auto a = _mm512_castsi256_si512(x); auto b = _mm512_castsi256_si512(y); - a = _mm512_permutexvar_epi64(midx, a); // [a1 x | a2 x | a3 x | a4 x] - b = _mm512_permutexvar_epi64(midx, b); // [b1 x | b2 x | b3 x | b4 x] + a = _mm512_permutexvar_epi64(midx, a); // [a1 x | a2 x | a3 x | a4 x] + b = _mm512_permutexvar_epi64(midx, b); // [b1 x | b2 x | b3 x | b4 x] auto B0 = _mm512_unpacklo_epi16(a, b); _mm512_mask_storeu_epi32(dst, mask, B0); src += 2 * src_stride; @@ -726,7 +772,9 @@ static void pack_32xK_kernel(T* dst, T* src, size_t dst_stride, size_t src_strid } } -template::value || std::is_same::value), bool>::type> +template ::value || std::is_same::value), bool>::type> static void pack_32NxK(T* dst, T* src, T* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { for (size_t n = 0; n < N; n += 32) { size_t k = 0; @@ -746,14 +794,16 @@ static void pack_32NxK(T* dst, T* src, T* tmp, size_t N, size_t K, size_t dst_st } } -template::value || std::is_same::value), bool>::type> +template ::value || std::is_same::value), bool>::type> static void pack_32NxK(T* dst, uint8_t* src, T* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { // The layout for per token per head: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The quantized feature will start from 8bytes=sizeof(float)+sizeof(float) auto s = src; auto t = tmp; - for (size_t n = 0; n < N; n ++) { + for (size_t n = 0; n < N; n++) { auto f = reinterpret_cast(s); attn_dequant_u8_kernel(s + 2 * sizeof(float), t, K, f[0], f[1]); s += src_stride + 2 * sizeof(float); @@ -761,9 +811,9 @@ static void pack_32NxK(T* dst, uint8_t* src, T* tmp, size_t N, size_t K, size_t } pack_32NxK(dst, tmp, reinterpret_cast(0), N, K, dst_stride, src_stride); } -#endif +# endif -template +template static void pack_32NxK(float* dst, T* src, float* tmp, size_t N, size_t K, size_t dst_stride, size_t src_stride) { // never called OPENVINO_THROW("pack_32NxK: should not be called."); @@ -782,10 +832,10 @@ struct MHAHelper { size_t _sliding_window; float _d_scale; - PlainTensor _weight; // [nthr, H, 32, rnd_up(kv_len, block_size)], shared by first and second loop along bh - PlainTensor _output; // [nthr, 32, H, S], shared by first and second loop along bh - PlainTensor _qk_scratch_a; // [nthr, scratch_a_size] - PlainTensor _qk_scratch_b; // [B, rnd_up(kv_len, block_size), Hk, scratch_b_size] + PlainTensor _weight; // [nthr, H, 32, rnd_up(kv_len, block_size)], shared by first and second loop along bh + PlainTensor _output; // [nthr, 32, H, S], shared by first and second loop along bh + PlainTensor _qk_scratch_a; // [nthr, scratch_a_size] + PlainTensor _qk_scratch_b; // [B, rnd_up(kv_len, block_size), Hk, scratch_b_size] PlainTensor _wv_scratch_a; PlainTensor _wv_scratch_b; PlainTensor _alibi_lookup; @@ -810,8 +860,16 @@ struct MHAHelper { _weight.resize({size_t{1}, size_t{1}, size_t{1}, size_t{1}}); } - void init(size_t H, size_t S, size_t SV, size_t Hk, size_t h_each_group_len, size_t block_size, size_t sliding_window, - float d_scale, size_t kv_len, bool init_alibi_lookup) { + void init(size_t H, + size_t S, + size_t SV, + size_t Hk, + size_t h_each_group_len, + size_t block_size, + size_t sliding_window, + float d_scale, + size_t kv_len, + bool init_alibi_lookup) { // query shape: [B, H, L, S] // present_key shape: [block, H, 32, S] // Q*K': [M1, S] * [M2, S]' @@ -853,25 +911,27 @@ struct MHAHelper { _weight.stride(2), false, in_type); - _wv_gemm[i] = std::make_shared(i + 1, - _SV, - _block_size, - // if it's bf16, the stride needs double due to reuse float buffer - (in_type == ov::element::Type_t::f32 ? 1 : 2) * _weight.stride(2), - _SV, - _output.stride(1), - false, - in_type); - _wv_gemm_acc[i] = std::make_shared(i + 1, - _SV, - _block_size, - // if it's bf16, the stride needs double due to reuse float buffer - (in_type == ov::element::Type_t::f32 ? 1 : 2) * _weight.stride(2), - _SV, - _output.stride(1), - false, - in_type, - true); + _wv_gemm[i] = + std::make_shared(i + 1, + _SV, + _block_size, + // if it's bf16, the stride needs double due to reuse float buffer + (in_type == ov::element::Type_t::f32 ? 1 : 2) * _weight.stride(2), + _SV, + _output.stride(1), + false, + in_type); + _wv_gemm_acc[i] = + std::make_shared(i + 1, + _SV, + _block_size, + // if it's bf16, the stride needs double due to reuse float buffer + (in_type == ov::element::Type_t::f32 ? 1 : 2) * _weight.stride(2), + _SV, + _output.stride(1), + false, + in_type, + true); } // wsp is used to compute beta when K is blocked @@ -879,8 +939,10 @@ struct MHAHelper { _wsp.resize(_nthr * _wsp_size_per_thread); // allocate scratch a/b, notice get_scratch_a_size/get_scratch_b_size returns in bytes - _qk_scratch_a.resize({_nthr, _qk_gemm[_block_size - 1]->get_scratch_a_size() / sizeof(DATA_TYPE)}); - _wv_scratch_a.resize({_nthr, _wv_gemm[_block_size - 1]->get_scratch_a_size() / sizeof(DATA_TYPE)}); + _qk_scratch_a.resize( + {_nthr, _qk_gemm[_block_size - 1]->get_scratch_a_size() / sizeof(DATA_TYPE)}); + _wv_scratch_a.resize( + {_nthr, _wv_gemm[_block_size - 1]->get_scratch_a_size() / sizeof(DATA_TYPE)}); if ((S % 32 == 0) && (block_size % 16 == 0) && (S <= 32 * 6)) { if (dnnl::impl::cpu::x64::mayiuse(dnnl::impl::cpu::x64::amx_bf16) && @@ -894,14 +956,16 @@ struct MHAHelper { } } if (one_of(_fastpath_valid_prec, ov::element::bf16, ov::element::f16) && !_gemv) { - _gemv = std::make_shared(static_cast(S), static_cast(block_size), _fastpath_valid_prec); + _gemv = std::make_shared(static_cast(S), + static_cast(block_size), + _fastpath_valid_prec); } } if (init_alibi_lookup && (!_alibi_lookup || _alibi_lookup.m_dims[0] < kv_len)) { _alibi_lookup.resize({kv_len * 2}); for (size_t i = 0; i < _alibi_lookup.m_dims[0]; i++) - _alibi_lookup.ptr()[i] = - static_cast((_alibi_lookup.m_dims[0] - 1 - i)); + _alibi_lookup.ptr()[i] = -static_cast((_alibi_lookup.m_dims[0] - 1 - i)); } } @@ -937,9 +1001,21 @@ struct MHAHelper { // output_emb: [L, H * S] // qk_scratch_b: [rnd_up(kv_len, block_size), Hk, scratch_b_size] // wv_scratch_b: [rnd_up(kv_len, block_size), Hk, scratch_b_size] - void exec_kernel_multiple(const PlainTensor& query, const PlainTensor& present_value, const PlainTensor& output_emb, - const PlainTensor& qk_scratch_b, const PlainTensor& wv_scratch_b, const int32_t* block_table, size_t ithr, size_t q_blk, - size_t hq_beg, size_t hq_end, size_t hk, size_t q_len, size_t cur_kv_len, const PlainTensor& alibi_slopes, float* score_output) { + void exec_kernel_multiple(const PlainTensor& query, + const PlainTensor& present_value, + const PlainTensor& output_emb, + const PlainTensor& qk_scratch_b, + const PlainTensor& wv_scratch_b, + const int32_t* block_table, + size_t ithr, + size_t q_blk, + size_t hq_beg, + size_t hq_end, + size_t hk, + size_t q_len, + size_t cur_kv_len, + const PlainTensor& alibi_slopes, + float* score_output) { auto q_start = q_blk * _block_size; auto q_end = std::min(q_start + _block_size, q_len); auto q_cnt = q_end - q_start; @@ -1012,13 +1088,16 @@ struct MHAHelper { alibi_slope); } if (score_output) { - cvt_copy(score_output + h * rnd_up(cur_kv_len, 16), reinterpret_cast(score), cur_kv_len); + cvt_copy(score_output + h * rnd_up(cur_kv_len, 16), + reinterpret_cast(score), + cur_kv_len); } } // reuse float buffer, need to use float to compute offset auto* w_ptr = reinterpret_cast(_weight.ptr(ithr, h, 0, 0)); - float* fp32_out_ptr = q_is_xf16 ? _output.ptr(ithr, 0, h, 0) : output_emb.ptr(q_start, h * _SV); + float* fp32_out_ptr = + q_is_xf16 ? _output.ptr(ithr, 0, h, 0) : output_emb.ptr(q_start, h * _SV); // for each weight block, loop through all value block for (size_t v_blk = 0; v_blk < cur_kv_len_blocks; v_blk++) { @@ -1036,12 +1115,13 @@ struct MHAHelper { _wsp.data() + ithr * _wsp_size_per_thread, _wv_scratch_a ? _wv_scratch_a.ptr(ithr, 0) : nullptr); } else { - _wv_gemm_acc[q_cnt - 1]->executeGemm(q_cnt < _block_size, - w_ptr + v_blk * _block_size, - v_ptr, - fp32_out_ptr, - _wsp.data() + ithr * _wsp_size_per_thread, - _wv_scratch_a ? _wv_scratch_a.ptr(ithr, 0) : nullptr); + _wv_gemm_acc[q_cnt - 1]->executeGemm( + q_cnt < _block_size, + w_ptr + v_blk * _block_size, + v_ptr, + fp32_out_ptr, + _wsp.data() + ithr * _wsp_size_per_thread, + _wv_scratch_a ? _wv_scratch_a.ptr(ithr, 0) : nullptr); } } if (q_is_xf16) { @@ -1064,17 +1144,28 @@ struct MHAHelper { // output_emb: [L, H * S] // weight: [nthr, H, 32, rnd_up(kv_len, block_size)] // output: [nthr, 32, H, S] - void exec_kernel_one_bh(const PlainTensor& query, const PlainTensor& present_key, const PlainTensor& present_value, const PlainTensor& output_emb, - const int32_t* block_table, size_t ithr, size_t hq_beg, size_t hq_end, size_t hk, - size_t q_len, size_t cur_kv_len, const PlainTensor& alibi_slopes, float* score_output) { + void exec_kernel_one_bh(const PlainTensor& query, + const PlainTensor& present_key, + const PlainTensor& present_value, + const PlainTensor& output_emb, + const int32_t* block_table, + size_t ithr, + size_t hq_beg, + size_t hq_end, + size_t hk, + size_t q_len, + size_t cur_kv_len, + const PlainTensor& alibi_slopes, + float* score_output) { if (one_of(_fastpath_valid_prec, ov::element::bf16, ov::element::f16)) { _gemv->tile_config(); for (size_t pk = 0, i = 0; pk < cur_kv_len; pk += _block_size, i++) { auto block_number = block_table[i]; for (size_t pq = 0; pq < q_len; pq++) { for (size_t h = hq_beg; h < hq_end; h++) { - (*_gemv)(query.ptr(h, pq), present_key.ptr(block_number, hk), - _weight.ptr(ithr, h, pq) + pk); + (*_gemv)(query.ptr(h, pq), + present_key.ptr(block_number, hk), + _weight.ptr(ithr, h, pq) + pk); } } } @@ -1084,8 +1175,11 @@ struct MHAHelper { auto block_number = block_table[i]; for (size_t pq = 0; pq < q_len; pq++) { for (size_t h = hq_beg; h < hq_end; h++) { - dot_product_block(query.ptr(h, pq), present_key.ptr(block_number, hk), - _weight.ptr(ithr, h, pq) + pk, _S, std::min(_block_size, cur_kv_len - pk)); + dot_product_block(query.ptr(h, pq), + present_key.ptr(block_number, hk), + _weight.ptr(ithr, h, pq) + pk, + _S, + std::min(_block_size, cur_kv_len - pk)); } } } @@ -1113,7 +1207,9 @@ struct MHAHelper { ov::element::f32, alibi_slope); if (score_output) { - memcpy(score_output + h * rnd_up(cur_kv_len, 16), _weight.ptr(ithr, h, pq), cur_kv_len * sizeof(float)); + memcpy(score_output + h * rnd_up(cur_kv_len, 16), + _weight.ptr(ithr, h, pq), + cur_kv_len * sizeof(float)); } } } @@ -1138,9 +1234,9 @@ struct MHAHelper { cvt_copy(output_emb.ptr(pq, h * _SV), _output.ptr(ithr, pq, h), _SV); } - // compute one token, loop along batch, head dimensions and kv_len, it's special for very long kv_len with small batch tokens. - // It will assume NO mixture execution of first and second token. - // all tensors such as query... have batch dimension which is DIFFERENT from above + // compute one token, loop along batch, head dimensions and kv_len, it's special for very long kv_len with small + // batch tokens. It will assume NO mixture execution of first and second token. all tensors such as query... have + // batch dimension which is DIFFERENT from above // query: [B, H, L, S] // present_*: [block_number, H, 32, S] // output_emb: [B, L, H * S] @@ -1179,17 +1275,18 @@ struct MHAHelper { // for bigger batch skip the test to save the cost prefer_static_loop = false; } - auto get_h_params = [] (bool loop_hk, size_t hx, size_t h_each_group_len, size_t& hq_beg, size_t& hq_end, size_t& hk) { - if (loop_hk) { - hk = hx; - hq_beg = hk * h_each_group_len; - hq_end = (hk + 1) * h_each_group_len; - } else { - hq_beg = hx; - hq_end = hx + 1; - hk = hx / h_each_group_len; - } - }; + auto get_h_params = + [](bool loop_hk, size_t hx, size_t h_each_group_len, size_t& hq_beg, size_t& hq_end, size_t& hk) { + if (loop_hk) { + hk = hx; + hq_beg = hk * h_each_group_len; + hq_end = (hk + 1) * h_each_group_len; + } else { + hq_beg = hx; + hq_end = hx + 1; + hk = hx / h_each_group_len; + } + }; auto loop_qk = [&](size_t b, size_t pk_in_blocks, size_t hx) { auto context_len = static_cast(past_lens.ptr()[b]) + 1; size_t hk, hq_beg, hq_end; @@ -1203,16 +1300,20 @@ struct MHAHelper { _gemv->tile_config(); for (size_t pq = 0; pq < q_len; pq++) { for (size_t h = hq_beg; h < hq_end; h++) { - (*_gemv)(query.ptr(b, h, pq), present_key.ptr(block_number, hk), - _weight_bhl.ptr(b, h, pq) + pk); + (*_gemv)(query.ptr(b, h, pq), + present_key.ptr(block_number, hk), + _weight_bhl.ptr(b, h, pq) + pk); } } _gemv->tile_release(); } else { for (size_t pq = 0; pq < q_len; pq++) { for (size_t h = hq_beg; h < hq_end; h++) { - dot_product_block(query.ptr(b, h, pq), present_key.ptr(block_number, hk), - _weight_bhl.ptr(b, h, pq) + pk, _S, std::min(_block_size, context_len - pk)); + dot_product_block(query.ptr(b, h, pq), + present_key.ptr(block_number, hk), + _weight_bhl.ptr(b, h, pq) + pk, + _S, + std::min(_block_size, context_len - pk)); } } } @@ -1311,26 +1412,29 @@ template struct MHA { MHAHelper& _helper; struct AttnWorkItem { - int32_t batch_in_reorder; // which batch in reorder buffer will be used - int32_t batch_in_seq; // batch idx in sequence - int32_t q_len; // current sequence length, 1 for second token, 2+ for first token - int32_t q_block_id; // block id in this seq, valid at first token + int32_t batch_in_reorder; // which batch in reorder buffer will be used + int32_t batch_in_seq; // batch idx in sequence + int32_t q_len; // current sequence length, 1 for second token, 2+ for first token + int32_t q_block_id; // block id in this seq, valid at first token }; struct ReorderWorkItem { - int32_t batch_in_seq; // batch idx in sequence - int32_t batch_in_reorder; // which batch in reorder buffer will be used - int32_t kv_block_id; // block id in this kv cache seq + int32_t batch_in_seq; // batch idx in sequence + int32_t batch_in_reorder; // which batch in reorder buffer will be used + int32_t kv_block_id; // block id in this kv cache seq }; struct WorkItems { private: std::vector attn_items; std::vector reorder_items; - int32_t max_kv_len_in_reorder; // max kv len between first tokens + int32_t max_kv_len_in_reorder; // max kv len between first tokens int32_t max_batch_in_reorder; int32_t total_kv_len; public: - void reset(const PlainTensor& query, const PlainTensor& past_lens, const PlainTensor& subsequence_begins, size_t block_size) { + void reset(const PlainTensor& query, + const PlainTensor& past_lens, + const PlainTensor& subsequence_begins, + size_t block_size) { attn_items.clear(); reorder_items.clear(); max_kv_len_in_reorder = 0; @@ -1343,21 +1447,19 @@ struct MHA { auto kv_len = past_lens.ptr()[i] + q_len; auto kv_len_in_block = static_cast(div_up(kv_len, block_size)); if (q_len == 1) { - attn_items.emplace_back(AttnWorkItem{ - 0, // batch_in_reorder - i, // batch_in_seq - 1ull, // q_len - // kv_len in blocks, used in the sort function - kv_len_in_block - 1 - }); + attn_items.emplace_back(AttnWorkItem{0, // batch_in_reorder + i, // batch_in_seq + 1ull, // q_len + // kv_len in blocks, used in the sort function + kv_len_in_block - 1}); } else { auto reorder_sub_work_count = kv_len_in_block; max_kv_len_in_reorder = std::max(max_kv_len_in_reorder, kv_len); for (int32_t block_id = 0; block_id < reorder_sub_work_count; block_id++) { reorder_items.emplace_back(ReorderWorkItem{ - i, // batch_in_seq - max_batch_in_reorder, // batch_in_reorder - block_id // kv_block_id + i, // batch_in_seq + max_batch_in_reorder, // batch_in_reorder + block_id // kv_block_id }); } @@ -1365,17 +1467,18 @@ struct MHA { auto attn_sub_work_count = static_cast(div_up(q_len, block_size)); for (int32_t block_id = 0; block_id < attn_sub_work_count; block_id++) { attn_items.emplace_back(AttnWorkItem{ - max_batch_in_reorder, // batch_in_reorder - i, // batch_in_seq - q_len, // q_len - block_id // q_block_id + max_batch_in_reorder, // batch_in_reorder + i, // batch_in_seq + q_len, // q_len + block_id // q_block_id }); } max_batch_in_reorder++; } total_kv_len += kv_len; } - // std::sort(attn_items.begin(), attn_items.end(), [] (const AttnWorkItem& left, const AttnWorkItem& right) { + // std::sort(attn_items.begin(), attn_items.end(), [] (const AttnWorkItem& left, const AttnWorkItem& right) + // { // // kv block number which will be acessed later // auto left_kv_blocks = left.q_block_id; // auto right_kv_blocks = right.q_block_id; @@ -1429,7 +1532,8 @@ struct MHA { auto reorder_work_count = _workitems.reorder_work_size(); // buffer for transpose and repack - _helper.init_reorder_buffers(_workitems.get_reorder_max_batch_size(), div_up(_workitems.get_reorder_max_kv_len(), _helper._block_size)); + _helper.init_reorder_buffers(_workitems.get_reorder_max_batch_size(), + div_up(_workitems.get_reorder_max_kv_len(), _helper._block_size)); // packed k, v parallel_for2d_dynamic(reorder_work_count, Hk, [&](size_t w, size_t hk) { @@ -1437,7 +1541,8 @@ struct MHA { const auto batch_in_seq = item.batch_in_seq; const auto batch_in_reorder = item.batch_in_reorder; const auto kv_block = item.kv_block_id; - auto block_number = block_indices.ptr()[block_indices_begins.ptr()[batch_in_seq] + kv_block]; + auto block_number = + block_indices.ptr()[block_indices_begins.ptr()[batch_in_seq] + kv_block]; if (block_number < 0) return; @@ -1445,10 +1550,12 @@ struct MHA { auto* k_ptr = k_cache.ptr(block_number, hk); auto* v_ptr = v_cache.ptr(block_number, hk); transpose_16NxK(_helper._qk_scratch_b.template ptr(batch_in_reorder, kv_block, hk), - k_ptr, - _helper._output.template ptr(ithr), - _helper._block_size, - _helper._S, _helper._block_size, _helper._S); + k_ptr, + _helper._output.template ptr(ithr), + _helper._block_size, + _helper._S, + _helper._block_size, + _helper._S); if (q_is_xf16) { pack_32NxK(_helper._wv_scratch_b.template ptr(batch_in_reorder, kv_block, hk), v_ptr, @@ -1460,15 +1567,21 @@ struct MHA { } else { // need to decompress if (!q_cache_is_same) { - dequant(_helper._wv_scratch_b.template ptr(batch_in_reorder, kv_block, hk), v_ptr, _helper._block_size, _helper._SV); + dequant(_helper._wv_scratch_b.template ptr(batch_in_reorder, kv_block, hk), + v_ptr, + _helper._block_size, + _helper._SV); } } }); - // loop along HK dimension: if mixed first/second token and elements count is enough, loop HK to reuse KV in the CPU cache + // loop along HK dimension: if mixed first/second token and elements count is enough, loop HK to reuse KV in the + // CPU cache // else if elements count is small, prefer to loop H to get more work to avoid thread imbalance - bool loop_hk = _workitems.get_reorder_max_batch_size() == past_lens.m_dims[0] || // if only first token, loop H - attn_work_count * Hk <= 2 * _helper._nthr ? false : true; // or less than 2 work items per thread, loop H + bool loop_hk = _workitems.get_reorder_max_batch_size() == past_lens.m_dims[0] || // if only first token, loop H + attn_work_count * Hk <= 2 * _helper._nthr + ? false + : true; // or less than 2 work items per thread, loop H parallel_for2d_dynamic(attn_work_count, loop_hk ? Hk : _helper._H, [&](size_t w, size_t hx) { size_t hk, hq_beg, hq_end; @@ -1496,16 +1609,26 @@ struct MHA { score_output = _helper._score_output.template ptr() + score_offset * _helper._H; } - _helper.exec_kernel_one_bh(q.slice(0, batch_in_token, batch_in_token), k_cache, v_cache, + _helper.exec_kernel_one_bh( + q.slice(0, batch_in_token, batch_in_token), + k_cache, + v_cache, output_emb.slice(0, batch_in_token, batch_in_token), block_indices.ptr() + block_indices_begins.ptr()[batch_in_seq], - ithr, hq_beg, hq_end, hk, 1ul, cur_kv_len, alibi_slopes, + ithr, + hq_beg, + hq_end, + hk, + 1ul, + cur_kv_len, + alibi_slopes, score_output); } else { const auto batch_in_reorder = item.batch_in_reorder; const auto q_blk = item.q_block_id; const auto q_cnt = std::min(_helper._block_size, q_len - q_blk * _helper._block_size); - const auto cur_kv_len = static_cast(past_lens.ptr()[batch_in_seq]) + q_blk * _helper._block_size + q_cnt; + const auto cur_kv_len = + static_cast(past_lens.ptr()[batch_in_seq]) + q_blk * _helper._block_size + q_cnt; float* score_output = nullptr; if (output_score) { // last block @@ -1518,9 +1641,11 @@ struct MHA { PlainTensor sub_query; sub_query.resize({q_len, _helper._H, _helper._S}, q.ptr(batch_in_token)); sub_query = sub_query.permute({1, 0, 2}); - _helper.exec_kernel_multiple(sub_query, + _helper.exec_kernel_multiple( + sub_query, v_cache, - output_emb.slice(0, batch_in_token, batch_in_token + q_len).reshape({q_len, _helper._H * _helper._SV}), + output_emb.slice(0, batch_in_token, batch_in_token + q_len) + .reshape({q_len, _helper._H * _helper._SV}), _helper._qk_scratch_b.slice(0, batch_in_reorder, batch_in_reorder), _helper._wv_scratch_b.slice(0, batch_in_reorder, batch_in_reorder), block_indices.ptr() + block_indices_begins.ptr()[batch_in_seq], @@ -1537,7 +1662,8 @@ struct MHA { }); if (output_score) { parallel_for2d_dynamic(past_lens.m_dims[0], 1, [&](size_t b, size_t pq) { - auto seq_len = static_cast(subsequence_begins.ptr()[b + 1] - subsequence_begins.ptr()[b]); + auto seq_len = static_cast(subsequence_begins.ptr()[b + 1] - + subsequence_begins.ptr()[b]); auto cur_kv_len = static_cast(past_lens.ptr()[b]) + seq_len; auto src_offset = _helper._score_offsets_aligned.template ptr()[b]; auto* src = _helper._score_output.template ptr() + src_offset * _helper._H; @@ -1568,11 +1694,29 @@ struct MHA { auto nthr = static_cast(parallel_get_max_threads()); if (past_lens.m_dims[0] >= nthr || _workitems.get_reorder_max_batch_size() > 0) { - exec_loop_mixed(query, present_key, present_value, output_emb, output_score, max_context_len, past_lens, subsequence_begins, - block_indices, block_indices_begins, alibi_slopes); + exec_loop_mixed(query, + present_key, + present_value, + output_emb, + output_score, + max_context_len, + past_lens, + subsequence_begins, + block_indices, + block_indices_begins, + alibi_slopes); } else { - _helper.exec_loop_bhl(query, present_key, present_value, output_emb, output_score, max_context_len, past_lens, subsequence_begins, - block_indices, block_indices_begins, alibi_slopes); + _helper.exec_loop_bhl(query, + present_key, + present_value, + output_emb, + output_score, + max_context_len, + past_lens, + subsequence_begins, + block_indices, + block_indices_begins, + alibi_slopes); } } }; @@ -1585,18 +1729,32 @@ struct AttentionExecutor : public PagedAttentionExecutor { AttentionExecutor() : _kernel(_helper) {} - void init(const std::vector& inputs, const std::vector& outputs, PlainTensor& q, PlainTensor& k, PlainTensor& v, PlainTensor& k_cache, - PlainTensor& v_cache, PlainTensor& past_lens, PlainTensor& subsequence_begins, PlainTensor& block_indices, PlainTensor& block_indices_begins, - float& scale, size_t& sliding_window, PlainTensor& alibi_slopes, size_t& max_context_len, PlainTensor& output_emb, PlainTensor& output_score) { - q.reset(inputs[ID_Q]); // [B_token, H * S] + void init(const std::vector& inputs, + const std::vector& outputs, + PlainTensor& q, + PlainTensor& k, + PlainTensor& v, + PlainTensor& k_cache, + PlainTensor& v_cache, + PlainTensor& past_lens, + PlainTensor& subsequence_begins, + PlainTensor& block_indices, + PlainTensor& block_indices_begins, + float& scale, + size_t& sliding_window, + PlainTensor& alibi_slopes, + size_t& max_context_len, + PlainTensor& output_emb, + PlainTensor& output_score) { + q.reset(inputs[ID_Q]); // [B_token, H * S] k.reset(inputs[ID_K]); v.reset(inputs[ID_V]); - k_cache.reset(inputs[ID_KCACHE]); // [NUM_BLOCKS, H, 32, S] - v_cache.reset(inputs[ID_VCACHE]); // [NUM_BLOCKS, H, 32, S] - past_lens.reset(inputs[ID_PAST_LENS]); // [B_seq] - subsequence_begins.reset(inputs[ID_SUBSEQUENCE_BEGINS]); // [B_seq+1] - block_indices.reset(inputs[ID_BLOCK_INDICES]); // [num_blocks] - block_indices_begins.reset(inputs[ID_BLOCK_INDICES_BEGINS]);// [B_seq+1] + k_cache.reset(inputs[ID_KCACHE]); // [NUM_BLOCKS, H, 32, S] + v_cache.reset(inputs[ID_VCACHE]); // [NUM_BLOCKS, H, 32, S] + past_lens.reset(inputs[ID_PAST_LENS]); // [B_seq] + subsequence_begins.reset(inputs[ID_SUBSEQUENCE_BEGINS]); // [B_seq+1] + block_indices.reset(inputs[ID_BLOCK_INDICES]); // [num_blocks] + block_indices_begins.reset(inputs[ID_BLOCK_INDICES_BEGINS]); // [B_seq+1] scale = *inputs[ID_SCALE]->getDataAs(); sliding_window = static_cast(*inputs[ID_SLIDING_WINDOW]->getDataAs()); if (!inputs[ID_ALIBI_SLOPES]->getShape().hasZeroDims()) @@ -1609,8 +1767,8 @@ struct AttentionExecutor : public PagedAttentionExecutor { auto B_token = q.size(0); auto Hk = k_cache.size(1); // The layout for per token per head for u8 kv cache: - // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized feature(u8,idx_S)| - // The actual size needs to deduct scale and zeropoint. + // |scale(f32)|zeropoint(f32)|quantized feature(u8,idx_1)|quantized feature(u8,idx_2)|...|quantized + // feature(u8,idx_S)| The actual size needs to deduct scale and zeropoint. auto S = k_cache.size(3) - (k_cache.m_dt == ov::element::Type_t::u8 ? sizeof(float) * 2 : 0); auto SV = v_cache.size(3) - (k_cache.m_dt == ov::element::Type_t::u8 ? sizeof(float) * 2 : 0); auto block_size = k_cache.size(2); @@ -1652,8 +1810,14 @@ struct AttentionExecutor : public PagedAttentionExecutor { _helper.init(H, S, SV, Hk, h_each_group_len, block_size, sliding_window, scale, max_context_len, alibi_slopes); } - void concat_pastkv(const PlainTensor& k, const PlainTensor& v, const PlainTensor& k_cache, const PlainTensor& v_cache, - const PlainTensor& past_lens, const PlainTensor& subsequence_begins, const PlainTensor& block_indices, const PlainTensor& block_indices_begins) { + void concat_pastkv(const PlainTensor& k, + const PlainTensor& v, + const PlainTensor& k_cache, + const PlainTensor& v_cache, + const PlainTensor& past_lens, + const PlainTensor& subsequence_begins, + const PlainTensor& block_indices, + const PlainTensor& block_indices_begins) { auto B_token = k.size(0); _slot_mapping.resize({B_token}); @@ -1665,8 +1829,10 @@ struct AttentionExecutor : public PagedAttentionExecutor { auto block_offset_start = kv_len - q_len; for (int32_t j = 0; j < q_len; j++) { auto block_offset = block_offset_start + j; - auto block_number = block_indices.ptr()[block_number_start + block_offset / _helper._block_size]; - _slot_mapping.ptr()[idx++] = block_number * _helper._block_size + block_offset % _helper._block_size; + auto block_number = + block_indices.ptr()[block_number_start + block_offset / _helper._block_size]; + _slot_mapping.ptr()[idx++] = + block_number * _helper._block_size + block_offset % _helper._block_size; } } @@ -1687,12 +1853,36 @@ struct AttentionExecutor : public PagedAttentionExecutor { PlainTensor output_emb; PlainTensor output_score; - init(inputs, outputs, q, k, v, k_cache, v_cache, past_lens, subsequence_begins, block_indices, block_indices_begins, - scale, sliding_window, alibi_slopes, max_context_len, output_emb, output_score); + init(inputs, + outputs, + q, + k, + v, + k_cache, + v_cache, + past_lens, + subsequence_begins, + block_indices, + block_indices_begins, + scale, + sliding_window, + alibi_slopes, + max_context_len, + output_emb, + output_score); concat_pastkv(k, v, k_cache, v_cache, past_lens, subsequence_begins, block_indices, block_indices_begins); - _kernel(q, k_cache, v_cache, output_emb, output_score, max_context_len, past_lens, subsequence_begins, block_indices, - block_indices_begins, alibi_slopes); + _kernel(q, + k_cache, + v_cache, + output_emb, + output_score, + max_context_len, + past_lens, + subsequence_begins, + block_indices, + block_indices_begins, + alibi_slopes); } }; #endif @@ -1702,27 +1892,27 @@ std::shared_ptr make_pa_executor(ov::element::Type data_ #ifdef OPENVINO_ARCH_X86_64 if (data_type == ov::element::bf16) { -#if defined(HAVE_AVX512F) +# if defined(HAVE_AVX512F) if (kvcache_type == ov::element::u8) { executor = std::make_shared>(); } else { OPENVINO_ASSERT(kvcache_type == ov::element::bf16, "expect kvcache type bf16, current: ", kvcache_type); executor = std::make_shared>(); } -#else +# else OPENVINO_THROW("make_pa_executor: bf16 needs avx512+ hardware."); -#endif +# endif } else if (data_type == ov::element::f16) { -#if defined(HAVE_AVX512F) +# if defined(HAVE_AVX512F) if (kvcache_type == ov::element::u8) { executor = std::make_shared>(); } else { OPENVINO_ASSERT(kvcache_type == ov::element::f16, "expect kvcache type f16, current: ", kvcache_type); executor = std::make_shared>(); } -#else - OPENVINO_THROW("make_pa_executor: f16 needs avx512+ hardware."); -#endif +# else + OPENVINO_THROW("make_pa_executor: f16 needs avx512+ hardware."); +# endif } else if (data_type == ov::element::f32) { if (kvcache_type == ov::element::u8) { executor = std::make_shared>(); diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.hpp index ed779dee13c96d..d28125b3898460 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa.hpp @@ -6,8 +6,9 @@ #include #include #include -#include #include +#include + #include "cpu_memory.h" #include "executor_pa_common.hpp" diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.cpp index 70723a577b0c2b..8a7fa211f8f4ce 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.cpp @@ -1,6 +1,8 @@ // Copyright (C) 2018-2024 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // +#include "executor_pa_common.hpp" + #include #include @@ -9,10 +11,9 @@ #include #include +#include "openvino/core/parallel.hpp" #include "openvino/core/type/bfloat16.hpp" #include "openvino/core/type/float16.hpp" -#include "openvino/core/parallel.hpp" -#include "executor_pa_common.hpp" #include "utils/plain_tensor.hpp" namespace ov { @@ -58,20 +59,23 @@ void TileConfiger::generate() { ret(); } -JitMatMulVecAMX::JitMatMulVecAMX(int head_size, int block_size, ov::element::Type amx_prec) : - jit_generator(jit_name()), m_head_size(head_size), m_block_size(block_size), m_amx_prec(amx_prec) { +JitMatMulVecAMX::JitMatMulVecAMX(int head_size, int block_size, ov::element::Type amx_prec) + : jit_generator(jit_name()), + m_head_size(head_size), + m_block_size(block_size), + m_amx_prec(amx_prec) { create_kernel(); m_tile_cfg.reset(1, 0, { - {16, 4}, // C:0 M x 1 (4b) - {16, 64}, // A:1 M x 32/64 (64b) - {16, 4}, // B:2 32/64 x 1 (4b) - {16, 4}, // B:3 - {16, 4}, // B:4 - {16, 4}, // B:5 - {16, 4}, // B:6 - {16, 4}, // B:7 + {16, 4}, // C:0 M x 1 (4b) + {16, 64}, // A:1 M x 32/64 (64b) + {16, 4}, // B:2 32/64 x 1 (4b) + {16, 4}, // B:3 + {16, 4}, // B:4 + {16, 4}, // B:5 + {16, 4}, // B:6 + {16, 4}, // B:7 }); } diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.hpp index bc21457a3285b4..81c54c84d9453a 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/executor_pa_common.hpp @@ -6,11 +6,12 @@ #include #include #include -#include #include -#include "cpu_memory.h" +#include + #include "cpu/x64/cpu_isa_traits.hpp" #include "cpu/x64/jit_generator.hpp" +#include "cpu_memory.h" namespace ov { namespace Extensions { @@ -20,20 +21,21 @@ namespace Cpu { struct PagedAttentionExecutor { // PagedAttention input index - static const size_t ID_Q = 0; // [B_token, H * S], float - static const size_t ID_K = 1; // [B_token, Hk * S], float - static const size_t ID_V = 2; // [B_token, Hk * S], float - static const size_t ID_KCACHE = 3; // [block_number, H, block_size, S], float - static const size_t ID_VCACHE = 4; // [block_number, H, block_size, S], float - static const size_t ID_PAST_LENS = 5; // [B_seq] - static const size_t ID_SUBSEQUENCE_BEGINS = 6; // [B_seq+1] - static const size_t ID_BLOCK_INDICES = 7; // [num_blocks] - static const size_t ID_BLOCK_INDICES_BEGINS = 8; // [B_seq+1] - static const size_t ID_SCALE = 9; // [], float - static const size_t ID_SLIDING_WINDOW = 10; // [] - static const size_t ID_ALIBI_SLOPES = 11; // [H|0], float - static const size_t ID_MAX_CONTEXT_LEN = 12; // [] - virtual void execute(const std::vector& inputs, const std::vector outputs) = 0; + static const size_t ID_Q = 0; // [B_token, H * S], float + static const size_t ID_K = 1; // [B_token, Hk * S], float + static const size_t ID_V = 2; // [B_token, Hk * S], float + static const size_t ID_KCACHE = 3; // [block_number, H, block_size, S], float + static const size_t ID_VCACHE = 4; // [block_number, H, block_size, S], float + static const size_t ID_PAST_LENS = 5; // [B_seq] + static const size_t ID_SUBSEQUENCE_BEGINS = 6; // [B_seq+1] + static const size_t ID_BLOCK_INDICES = 7; // [num_blocks] + static const size_t ID_BLOCK_INDICES_BEGINS = 8; // [B_seq+1] + static const size_t ID_SCALE = 9; // [], float + static const size_t ID_SLIDING_WINDOW = 10; // [] + static const size_t ID_ALIBI_SLOPES = 11; // [H|0], float + static const size_t ID_MAX_CONTEXT_LEN = 12; // [] + virtual void execute(const std::vector& inputs, + const std::vector outputs) = 0; virtual ~PagedAttentionExecutor() = default; }; diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.cpp index 25ddbb1b4246b1..f2180b5314cc07 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.cpp @@ -13,11 +13,10 @@ # include #endif - -#include "openvino/core/type/bfloat16.hpp" -#include "openvino/core/parallel.hpp" -#include "mha_single_token.hpp" #include "common.hpp" +#include "mha_single_token.hpp" +#include "openvino/core/parallel.hpp" +#include "openvino/core/type/bfloat16.hpp" #include "softmax_kernel.hpp" #if defined(OPENVINO_ARCH_ARM64) @@ -33,19 +32,20 @@ using namespace ov; #if defined(HAVE_AVX2) -#define prefetch_bytes(bytes, sel, advance, src) { \ - auto *p = reinterpret_cast(src); \ - for (size_t i = 0; i < bytes; i += 64) \ - _mm_prefetch(p + i + advance, sel); \ -} +# define prefetch_bytes(bytes, sel, advance, src) \ + { \ + auto* p = reinterpret_cast(src); \ + for (size_t i = 0; i < bytes; i += 64) \ + _mm_prefetch(p + i + advance, sel); \ + } #else -#define prefetch_bytes(bytes, sel, advance, src) +# define prefetch_bytes(bytes, sel, advance, src) #endif -template +template void cvt_copy(TA* dst, TB* src, size_t n) { size_t i = 0; #if defined(HAVE_AVX512F) @@ -65,21 +65,21 @@ void cvt_copy(TA* dst, TB* src, size_t n) { __vst1q_f32(dst + i, vb1); } } -#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) +# if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) if (std::is_same::value && std::is_same::value) { for (; i + vec_len_f16_neon <= n; i += vec_len_f16_neon) { auto vb1 = vld1q_f16(reinterpret_cast(src + i)); vst1q_f16(reinterpret_cast(dst + i), vb1); } } -#endif +# endif #endif for (; i < n; i++) { dst[i] = src[i]; } } -template +template static void attn_acc_value(float* out, float weight, T* v, size_t S, float* scale, float* zp) { size_t i = 0; #if defined(HAVE_AVX512F) @@ -113,12 +113,12 @@ static void attn_acc_value(float* out, float weight, T* v, size_t S, float* scal } #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) -template +template static void attn_acc_value(ov::float16* out, ov::float16 weight, T* v, size_t S, float* scale, float* zp) { size_t i = 0; auto attn_w_vec_fp16 = vdupq_n_f16(weight); - auto _v = reinterpret_cast(v); - auto _out = reinterpret_cast(out); + auto _v = reinterpret_cast(v); + auto _out = reinterpret_cast(out); for (; i + vec_len_f16_neon <= S; i += vec_len_f16_neon) { auto v_value = vld1q_f16(_v + i); auto v_out = vld1q_f16(_out + i); @@ -131,7 +131,6 @@ static void attn_acc_value(ov::float16* out, ov::float16 weight, T* v, size_t S, } #endif - static void attn_acc_value(float* out, float weight, uint8_t* v, size_t S, float* scale, float* zp) { size_t i = 0; weight *= *scale; @@ -285,7 +284,7 @@ static void attn_acc_value(float* out, float weight, uint8_t* v, size_t S, float } } -template +template static float sum_q_head(T* a, size_t n) { float sum = 0.0f; size_t i = 0; @@ -406,7 +405,7 @@ static float sum_q_head(T* a, size_t n) { return sum; } -template +template static float dot_product(TA* a, TB* b, size_t n, float* scale, float* zp, float* head_sum) { size_t i = 0; float sum = 0.0f; @@ -552,7 +551,12 @@ static float dot_product(TA* a, TB* b, size_t n, float* scale, float* zp, float* } #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) -static ov::float16 dot_product_fp16(ov::float16* a, ov::float16* b, size_t n, float* scale, float* zp, float* head_sum) { +static ov::float16 dot_product_fp16(ov::float16* a, + ov::float16* b, + size_t n, + float* scale, + float* zp, + float* head_sum) { size_t i = 0; ov::float16 sum = 0.0f; auto vsum0 = vdupq_n_f16(0.0f); @@ -609,7 +613,7 @@ static ov::float16 dot_product_fp16(ov::float16* a, ov::float16* b, size_t n, fl } #endif -template +template static float dot_product(TA* a, uint8_t* b, size_t n, float* scale, float* zp, float* head_sum) { size_t i = 0; float sum = 0.0f; @@ -763,11 +767,11 @@ static float dot_product(TA* a, uint8_t* b, size_t n, float* scale, float* zp, f #endif } -template +template static void attn_reduce(T* dst, float* temp, size_t M, size_t S, size_t temp_stride) { size_t i = 0; #if defined(HAVE_AVX512F) - for (; i + vec_len_f32_avx512 <= S; i+= vec_len_f32_avx512) { + for (; i + vec_len_f32_avx512 <= S; i += vec_len_f32_avx512) { auto* src = temp + i; auto result_vec_fp32 = _mm512_setzero_ps(); for (size_t m = 0; m < M; m++) { @@ -903,11 +907,16 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, for (size_t iwork = start; iwork < end; ++iwork) { auto p = past_k_scale_zp.ptr(pk, 0, h_group); #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) - if (std::is_same::value && std::is_same::value && std::is_same::value) { + if (std::is_same::value && std::is_same::value && + std::is_same::value) { auto p_k = present_key.ptr(0, h_group, pk); prefetch_bytes(S, _MM_HINT_T0, 4096, p_k); - auto _qk = dot_product_fp16(query.ptr(0, h_group), p_k, - S, p, p + 1, head_sum.ptr(0, h_group)); + auto _qk = dot_product_fp16(query.ptr(0, h_group), + p_k, + S, + p, + p + 1, + head_sum.ptr(0, h_group)); buf_attn_w.ptr(0, h_group, 0)[pk] = _qk; parallel_it_step(pk, kv_len, b, B, h_group, h_group_num); continue; @@ -915,8 +924,9 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, #endif auto p_k = present_key.ptr(0, h_group, pk); prefetch_bytes(S, _MM_HINT_T0, 4096, p_k); - buf_attn_w.ptr(0, h_group, 0)[pk] = dot_product(query.ptr(0, h_group), p_k, - S, p, p + 1, head_sum.ptr(0, h_group));; + buf_attn_w.ptr(0, h_group, 0)[pk] = + dot_product(query.ptr(0, h_group), p_k, S, p, p + 1, head_sum.ptr(0, h_group)); + ; parallel_it_step(pk, kv_len, b, B, h_group, h_group_num); } } else { @@ -924,10 +934,15 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, auto b_kv = beams ? beams.ptr(b)[pk] : b; auto p = past_k_scale_zp.ptr(pk, b_kv, h_group); #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) - if (std::is_same::value && std::is_same::value && std::is_same::value) { + if (std::is_same::value && std::is_same::value && + std::is_same::value) { auto p_k = present_key.ptr(b_kv, h_group, pk); - auto _qk = dot_product_fp16(query.ptr(b, h_group), p_k, - S, p, p + 1, head_sum.ptr(b, h_group)); + auto _qk = dot_product_fp16(query.ptr(b, h_group), + p_k, + S, + p, + p + 1, + head_sum.ptr(b, h_group)); buf_attn_w.ptr(b, h_group, 0)[pk] = _qk; parallel_it_step(pk, kv_len, b, B, h_group, h_group_num); continue; @@ -935,8 +950,7 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, #endif auto p_k = present_key.ptr(b_kv, h_group, pk); buf_attn_w.ptr(b, h_group, 0)[pk] = - dot_product(query.ptr(b, h_group), p_k, - S, p, p + 1, head_sum.ptr(b, h_group)); + dot_product(query.ptr(b, h_group), p_k, S, p, p + 1, head_sum.ptr(b, h_group)); parallel_it_step(pk, kv_len, b, B, h_group, h_group_num); } } @@ -947,17 +961,25 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, auto p = past_k_scale_zp.ptr(pk, b_kv, h_group); for (size_t h = h_group * h_each_group_len; h < (h_group + 1) * h_each_group_len; h++) { #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) - if (std::is_same::value && std::is_same::value && std::is_same::value) { + if (std::is_same::value && std::is_same::value && + std::is_same::value) { auto p_k = present_key.ptr(b_kv, h_group, pk); - auto _qk = dot_product_fp16(query.ptr(b, h, pq), p_k, - S, p, p + 1, head_sum.ptr(b, h, pq)); + auto _qk = dot_product_fp16(query.ptr(b, h, pq), + p_k, + S, + p, + p + 1, + head_sum.ptr(b, h, pq)); buf_attn_w.ptr(b, h, pq)[pk] = _qk; continue; } #endif - buf_attn_w.ptr(b, h, pq)[pk] = - dot_product(query.ptr(b, h, pq), present_key.ptr(b_kv, h_group, pk), - S, p, p + 1, head_sum.ptr(b, h, pq)); + buf_attn_w.ptr(b, h, pq)[pk] = dot_product(query.ptr(b, h, pq), + present_key.ptr(b_kv, h_group, pk), + S, + p, + p + 1, + head_sum.ptr(b, h, pq)); } } parallel_it_step(pk, kv_len, b, B, h_group, h_group_num); @@ -1001,7 +1023,8 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, auto* v = present_value.ptr(b_kv, h_group, pv); auto p = past_v_scale_zp.ptr(pv, b_kv, h_group); for (size_t pq = 0; pq < q_len; pq++) { - for (size_t h = h_group * h_each_group_len, group_idx = 0; h < (h_group + 1) * h_each_group_len; h++, group_idx++) { + for (size_t h = h_group * h_each_group_len, group_idx = 0; h < (h_group + 1) * h_each_group_len; + h++, group_idx++) { attn_acc_value(buf_attn_score.ptr(ithr, pq, group_idx), buf_attn_w.ptr(b, h, pq)[pv], v, @@ -1014,7 +1037,7 @@ static void mha_single_token_kernel(const ov::intel_cpu::PlainTensor& query, // convert to dst for (size_t pq = 0; pq < q_len; pq++) { for (size_t h = h_group * h_each_group_len, group_idx = 0; h < (h_group + 1) * h_each_group_len; - h++, group_idx++) { + h++, group_idx++) { auto* dst = has_out_transpose ? output_emb.ptr(b, pq, h * SV) : output_emb.ptr(b, h, pq); cvt_copy(dst, buf_attn_score.ptr(ithr, pq, group_idx), SV); } diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.hpp index e29e2bae0aa07a..2ef0f62d7e0df0 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/mha_single_token.hpp @@ -6,8 +6,9 @@ #include #include #include -#include #include +#include + #include "utils/plain_tensor.hpp" namespace ov { diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.cpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.cpp index 28755e69eaf589..c02f9770a37be9 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.cpp @@ -13,10 +13,10 @@ # include #endif +#include "common.hpp" #include "openvino/core/type/bfloat16.hpp" #include "softmax.hpp" #include "softmax_kernel.hpp" -#include "common.hpp" namespace ov { namespace Extensions { @@ -39,13 +39,33 @@ void attn_softmax(void* a, if (precision == ov::element::f16) { auto _a = reinterpret_cast(a); auto _alibi = reinterpret_cast(alibi); - attn_softmax_kernel(_a, a_dst, scale, _alibi, attn_mask, causal_mask, select_nfltmax_at_0, len, total_size, attn_mask_prec, dst_precision); + attn_softmax_kernel(_a, + a_dst, + scale, + _alibi, + attn_mask, + causal_mask, + select_nfltmax_at_0, + len, + total_size, + attn_mask_prec, + dst_precision); return; } #endif auto _a = reinterpret_cast(a); auto _alibi = reinterpret_cast(alibi); - attn_softmax_kernel(_a, a_dst, scale, _alibi, attn_mask, causal_mask, select_nfltmax_at_0, len, total_size, attn_mask_prec, dst_precision); + attn_softmax_kernel(_a, + a_dst, + scale, + _alibi, + attn_mask, + causal_mask, + select_nfltmax_at_0, + len, + total_size, + attn_mask_prec, + dst_precision); } } // namespace XARCH diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.hpp index ee264924e8f256..d620a01e221788 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax.hpp @@ -6,8 +6,8 @@ #include #include #include -#include #include +#include namespace ov { namespace Extensions { diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax_kernel.hpp index 60c6a24ec5f2fa..48b92b53fa2727 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/softmax_kernel.hpp @@ -3,16 +3,16 @@ // #pragma once -#include "common.hpp" -#include "openvino/core/type/element_type.hpp" - #include #include #include #include +#include "common.hpp" +#include "openvino/core/type/element_type.hpp" + #if defined(OPENVINO_ARCH_ARM64) -#include "arm_neon.h" +# include "arm_neon.h" #endif namespace ov { @@ -22,7 +22,7 @@ namespace XARCH { #if defined(HAVE_AVX2) inline void exp_ps_avx2(__m256& src) { -#define REPEAT8(x) x, x, x, x, x, x, x, x +# define REPEAT8(x) x, x, x, x, x, x, x, x static const uint32_t c_min[] = {REPEAT8(0xc2aeac50)}; static const uint32_t c_max[] = {REPEAT8(0x42b17218)}; static const uint32_t c_e[] = {REPEAT8(0x3fb8aa3b)}; @@ -36,21 +36,21 @@ inline void exp_ps_avx2(__m256& src) { static const uint32_t c_p4[] = {REPEAT8(0x3d2b9d0d)}; static const uint32_t c_p5[] = {REPEAT8(0x3c07cfce)}; static const uint32_t c_2[] = {REPEAT8(0x40000000)}; -#undef REPEAT8 +# undef REPEAT8 static constexpr int n_mantissa_bits = 23; - __m256 exp_ln_flt_min_f = _mm256_loadu_ps(reinterpret_cast(c_min)); // log(FLT_MIN) - __m256 exp_ln_flt_max_f = _mm256_loadu_ps(reinterpret_cast(c_max)); // log(FLT_MAX) - __m256 exp_log2ef = _mm256_loadu_ps(reinterpret_cast(c_e)); // log2(e) - __m256 half = _mm256_loadu_ps(reinterpret_cast(c_half)); // 0.5f - __m256 ln2f = _mm256_loadu_ps(reinterpret_cast(c_ln2)); // ln(2) - __m256 one = _mm256_loadu_ps(reinterpret_cast(c_1)); // 1.0f - __m256i exponent_bias = _mm256_loadu_si256(reinterpret_cast(c_bias));// 127 - __m256 exp_pol1 = _mm256_loadu_ps(reinterpret_cast(c_p1)); // p1 = 0.999999701f - __m256 exp_pol2 = _mm256_loadu_ps(reinterpret_cast(c_p2)); // p2 = 0.499991506f - __m256 exp_pol3 = _mm256_loadu_ps(reinterpret_cast(c_p3)); // p3 = 0.166676521f - __m256 exp_pol4 = _mm256_loadu_ps(reinterpret_cast(c_p4)); // p4 = 0.0418978221f - __m256 exp_pol5 = _mm256_loadu_ps(reinterpret_cast(c_p5)); // p5 = 0.00828929059f - __m256 two = _mm256_loadu_ps(reinterpret_cast(c_2)); // 2 + __m256 exp_ln_flt_min_f = _mm256_loadu_ps(reinterpret_cast(c_min)); // log(FLT_MIN) + __m256 exp_ln_flt_max_f = _mm256_loadu_ps(reinterpret_cast(c_max)); // log(FLT_MAX) + __m256 exp_log2ef = _mm256_loadu_ps(reinterpret_cast(c_e)); // log2(e) + __m256 half = _mm256_loadu_ps(reinterpret_cast(c_half)); // 0.5f + __m256 ln2f = _mm256_loadu_ps(reinterpret_cast(c_ln2)); // ln(2) + __m256 one = _mm256_loadu_ps(reinterpret_cast(c_1)); // 1.0f + __m256i exponent_bias = _mm256_loadu_si256(reinterpret_cast(c_bias)); // 127 + __m256 exp_pol1 = _mm256_loadu_ps(reinterpret_cast(c_p1)); // p1 = 0.999999701f + __m256 exp_pol2 = _mm256_loadu_ps(reinterpret_cast(c_p2)); // p2 = 0.499991506f + __m256 exp_pol3 = _mm256_loadu_ps(reinterpret_cast(c_p3)); // p3 = 0.166676521f + __m256 exp_pol4 = _mm256_loadu_ps(reinterpret_cast(c_p4)); // p4 = 0.0418978221f + __m256 exp_pol5 = _mm256_loadu_ps(reinterpret_cast(c_p5)); // p5 = 0.00828929059f + __m256 two = _mm256_loadu_ps(reinterpret_cast(c_2)); // 2 // exp(x) = // = exp(n * ln(2) + r) // divide x by ln(2) and get quot and rem // = 2^n * exp(r) // simplify the exp(n*ln(2)) expression @@ -195,32 +195,33 @@ inline void scale_add2_reduce_max(float* a, // process vector body // unroll to avoid dependency caused by _mm256_max_ps for (; i + 4 * vec_len_f32_avx512 <= size; i += 4 * vec_len_f32_avx512) { - #define ITEM(n) \ - v_a = _mm512_loadu_ps(a + i + n * vec_len_f32_avx512); \ - v_a = _mm512_mul_ps(v_a, v_scale); \ - if (has_alibi) { \ - auto v_lookup = _mm512_loadu_ps(alibi_lookup + i + n * vec_len_f32_avx512); \ - v_a = _mm512_fmadd_ps(v_lookup, v_alibi_slope, v_a); \ - } \ - if (has_attn_mask) { \ - auto v_mask = mm512_uni_loadu_ps(attn_mask + i + n * vec_len_f32_avx512); \ - v_a = _mm512_add_ps(v_a, v_mask); \ - } \ - if (has_causal_mask) { \ - auto v_maski8 = _mm_loadu_si128(reinterpret_cast<__m128i const*>(causal_mask + i + n * vec_len_f32_avx512)); \ - auto v_maski32 = _mm512_cvtepi8_epi32(v_maski8); \ - auto kmask = _mm512_cmp_epi32_mask(v_maski32, v_zeroi32, _MM_CMPINT_NE); \ - kmask = _kxor_mask16(kmask, kmask_xor); \ - v_a = _mm512_mask_blend_ps(kmask, v_a, v_nfltmax); \ - } \ - v_max##n = _mm512_max_ps(v_max##n, v_a); \ +# define ITEM(n) \ + v_a = _mm512_loadu_ps(a + i + n * vec_len_f32_avx512); \ + v_a = _mm512_mul_ps(v_a, v_scale); \ + if (has_alibi) { \ + auto v_lookup = _mm512_loadu_ps(alibi_lookup + i + n * vec_len_f32_avx512); \ + v_a = _mm512_fmadd_ps(v_lookup, v_alibi_slope, v_a); \ + } \ + if (has_attn_mask) { \ + auto v_mask = mm512_uni_loadu_ps(attn_mask + i + n * vec_len_f32_avx512); \ + v_a = _mm512_add_ps(v_a, v_mask); \ + } \ + if (has_causal_mask) { \ + auto v_maski8 = \ + _mm_loadu_si128(reinterpret_cast<__m128i const*>(causal_mask + i + n * vec_len_f32_avx512)); \ + auto v_maski32 = _mm512_cvtepi8_epi32(v_maski8); \ + auto kmask = _mm512_cmp_epi32_mask(v_maski32, v_zeroi32, _MM_CMPINT_NE); \ + kmask = _kxor_mask16(kmask, kmask_xor); \ + v_a = _mm512_mask_blend_ps(kmask, v_a, v_nfltmax); \ + } \ + v_max##n = _mm512_max_ps(v_max##n, v_a); \ _mm512_storeu_ps(a + i + n * vec_len_f32_avx512, v_a); ITEM(0); ITEM(1); ITEM(2); ITEM(3); - #undef ITEM +# undef ITEM } while (i + vec_len_f32_avx512 <= size) { v_a = _mm512_loadu_ps(a + i); @@ -295,32 +296,32 @@ inline void scale_add2_reduce_max(float* a, // process vector body // unroll to avoid dependency caused by _mm512_max_ps for (; i + 4 * vec_len_f32_avx2 <= size; i += 4 * vec_len_f32_avx2) { - #define ITEM(n) \ - v_a = _mm256_loadu_ps(a + i + n * vec_len_f32_avx2); \ - v_a = _mm256_mul_ps(v_a, v_scale); \ - if (has_alibi) { \ - auto v_lookup = _mm256_loadu_ps(alibi_lookup + i + n * vec_len_f32_avx2); \ - v_a = _mm256_fmadd_ps(v_lookup, v_alibi_slope, v_a); \ - } \ - if (has_attn_mask) { \ - auto v_mask = mm256_uni_loadu_ps(attn_mask + i + n * vec_len_f32_avx2); \ - v_a = _mm256_add_ps(v_a, v_mask); \ - } \ - if (has_causal_mask) { \ - auto v_maski8 = _mm_loadu_si128(reinterpret_cast<__m128i const*>(causal_mask + i + n * vec_len_f32_avx2)); \ - auto v_maski32 = _mm256_cvtepi8_epi32(v_maski8); \ - v_maski32 = _mm256_cmpeq_epi32(v_maski32, v_zeroi32);\ - v_maski32 = _mm256_xor_si256(v_maski32, v_mask_xor);\ - v_a = _mm256_blendv_ps(v_nfltmax, v_a, _mm256_castsi256_ps(v_maski32)); \ - } \ - v_max##n = _mm256_max_ps(v_max##n, v_a); \ +# define ITEM(n) \ + v_a = _mm256_loadu_ps(a + i + n * vec_len_f32_avx2); \ + v_a = _mm256_mul_ps(v_a, v_scale); \ + if (has_alibi) { \ + auto v_lookup = _mm256_loadu_ps(alibi_lookup + i + n * vec_len_f32_avx2); \ + v_a = _mm256_fmadd_ps(v_lookup, v_alibi_slope, v_a); \ + } \ + if (has_attn_mask) { \ + auto v_mask = mm256_uni_loadu_ps(attn_mask + i + n * vec_len_f32_avx2); \ + v_a = _mm256_add_ps(v_a, v_mask); \ + } \ + if (has_causal_mask) { \ + auto v_maski8 = _mm_loadu_si128(reinterpret_cast<__m128i const*>(causal_mask + i + n * vec_len_f32_avx2)); \ + auto v_maski32 = _mm256_cvtepi8_epi32(v_maski8); \ + v_maski32 = _mm256_cmpeq_epi32(v_maski32, v_zeroi32); \ + v_maski32 = _mm256_xor_si256(v_maski32, v_mask_xor); \ + v_a = _mm256_blendv_ps(v_nfltmax, v_a, _mm256_castsi256_ps(v_maski32)); \ + } \ + v_max##n = _mm256_max_ps(v_max##n, v_a); \ _mm256_storeu_ps(a + i + n * vec_len_f32_avx2, v_a); ITEM(0); ITEM(1); ITEM(2); ITEM(3); - #undef ITEM +# undef ITEM } while (i + vec_len_f32_avx2 <= size) { @@ -415,7 +416,7 @@ inline void scale_add2_reduce_max(float* a, uint32x4_t v_maski32[2] = {v_maski32_low, v_maski32_high}; for (int j = 0; j < 2; ++j) { uint32x4_t kmask = vceqq_u32(v_maski32[j], v_zeroi32); // ==0 - v_a = vbslq_f32(kmask, v_nfltmax, v_a); // mask => -FLT_MAX + v_a = vbslq_f32(kmask, v_nfltmax, v_a); // mask => -FLT_MAX } } @@ -521,7 +522,7 @@ inline void scale_add2_reduce_max(ov::float16* a, #if defined(HAVE_AVX512F) static inline void exp_ps_avx512(__m512& src) { -#define REPEAT16(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x +# define REPEAT16(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x static const uint32_t c_min[] = {REPEAT16(0xc2aeac50)}; static const uint32_t c_max[] = {REPEAT16(0x42b17218)}; static const uint32_t c_e[] = {REPEAT16(0x3fb8aa3b)}; @@ -535,21 +536,21 @@ static inline void exp_ps_avx512(__m512& src) { static const uint32_t c_p4[] = {REPEAT16(0x3d2b9d0d)}; static const uint32_t c_p5[] = {REPEAT16(0x3c07cfce)}; static const uint32_t c_2[] = {REPEAT16(0x40000000)}; -#undef REPEAT16 +# undef REPEAT16 static constexpr int n_mantissa_bits = 23; - __m512 exp_ln_flt_min_f = _mm512_loadu_ps(reinterpret_cast(c_min)); // log(FLT_MIN) - __m512 exp_ln_flt_max_f = _mm512_loadu_ps(reinterpret_cast(c_max)); // log(FLT_MAX) - __m512 exp_log2ef = _mm512_loadu_ps(reinterpret_cast(c_e)); // log2(e) - __m512 half = _mm512_loadu_ps(reinterpret_cast(c_half)); // 0.5f - __m512 ln2f = _mm512_loadu_ps(reinterpret_cast(c_ln2)); // ln(2) - __m512 one = _mm512_loadu_ps(reinterpret_cast(c_1)); // 1.0f - __m512i exponent_bias = _mm512_loadu_si512(c_bias); // 127 - __m512 exp_pol1 = _mm512_loadu_ps(reinterpret_cast(c_p1)); // p1 = 0.999999701f - __m512 exp_pol2 = _mm512_loadu_ps(reinterpret_cast(c_p2)); // p2 = 0.499991506f - __m512 exp_pol3 = _mm512_loadu_ps(reinterpret_cast(c_p3)); // p3 = 0.166676521f - __m512 exp_pol4 = _mm512_loadu_ps(reinterpret_cast(c_p4)); // p4 = 0.0418978221f - __m512 exp_pol5 = _mm512_loadu_ps(reinterpret_cast(c_p5)); // p5 = 0.00828929059f - __m512 two = _mm512_loadu_ps(reinterpret_cast(c_2)); // 2 + __m512 exp_ln_flt_min_f = _mm512_loadu_ps(reinterpret_cast(c_min)); // log(FLT_MIN) + __m512 exp_ln_flt_max_f = _mm512_loadu_ps(reinterpret_cast(c_max)); // log(FLT_MAX) + __m512 exp_log2ef = _mm512_loadu_ps(reinterpret_cast(c_e)); // log2(e) + __m512 half = _mm512_loadu_ps(reinterpret_cast(c_half)); // 0.5f + __m512 ln2f = _mm512_loadu_ps(reinterpret_cast(c_ln2)); // ln(2) + __m512 one = _mm512_loadu_ps(reinterpret_cast(c_1)); // 1.0f + __m512i exponent_bias = _mm512_loadu_si512(c_bias); // 127 + __m512 exp_pol1 = _mm512_loadu_ps(reinterpret_cast(c_p1)); // p1 = 0.999999701f + __m512 exp_pol2 = _mm512_loadu_ps(reinterpret_cast(c_p2)); // p2 = 0.499991506f + __m512 exp_pol3 = _mm512_loadu_ps(reinterpret_cast(c_p3)); // p3 = 0.166676521f + __m512 exp_pol4 = _mm512_loadu_ps(reinterpret_cast(c_p4)); // p4 = 0.0418978221f + __m512 exp_pol5 = _mm512_loadu_ps(reinterpret_cast(c_p5)); // p5 = 0.00828929059f + __m512 two = _mm512_loadu_ps(reinterpret_cast(c_2)); // 2 // exp(x) = // = exp(n * ln(2) + r) // divide x by ln(2) and get quot and rem // = 2^n * exp(r) // simplify the exp(n*ln(2)) expression @@ -793,7 +794,9 @@ inline void multiply_scalar(float* a, float* a_dst, const float val, const size_ } } -template::value || std::is_same::value), bool>::type> +template ::value || std::is_same::value), bool>::type> inline void multiply_scalar(float* a, T* a_dst, const float val, const size_t size) { size_t i = 0; #if defined(HAVE_AVX512F) @@ -899,47 +902,68 @@ inline void attn_softmax_kernel(float* a, ov::element::Type attn_mask_prec, ov::element::Type dst_precision, float alibi_slope) { - using func_fp32_type = void (*)(float*, float, const float*, const float*, const uint8_t*, bool, size_t, float, float&); - using func_bf16_type = void (*)(float*, float, const float*, const ov::bfloat16*, const uint8_t*, bool, size_t, float, float&); - using func_f16_type = void (*)(float*, float, const float*, const ov::float16*, const uint8_t*, bool, size_t, float, float&); - static constexpr func_fp32_type funcs_fp32[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; - static constexpr func_bf16_type funcs_bf16[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; - static constexpr func_f16_type funcs_f16[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; + using func_fp32_type = + void (*)(float*, float, const float*, const float*, const uint8_t*, bool, size_t, float, float&); + using func_bf16_type = + void (*)(float*, float, const float*, const ov::bfloat16*, const uint8_t*, bool, size_t, float, float&); + using func_f16_type = + void (*)(float*, float, const float*, const ov::float16*, const uint8_t*, bool, size_t, float, float&); + static constexpr func_fp32_type funcs_fp32[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; + static constexpr func_bf16_type funcs_bf16[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; + static constexpr func_f16_type funcs_f16[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; int dispatch = (alibi ? 0b100 : 0) | (attn_mask ? 0b010 : 0) | (causal_mask ? 0b001 : 0); float max = std::numeric_limits::lowest(); if (attn_mask_prec == ov::element::f32) { - funcs_fp32[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_fp32[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } else if (attn_mask_prec == ov::element::bf16) { - funcs_bf16[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_bf16[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } else { - funcs_f16[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_f16[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } float sum = 0.0f; @@ -978,47 +1002,89 @@ inline void attn_softmax_kernel(ov::float16* a, ov::element::Type attn_mask_prec, ov::element::Type dst_precision, float alibi_slope) { - using func_fp32_type = void (*)(ov::float16*, float, const ov::float16*, const float*, const uint8_t*, bool, size_t, float, ov::float16&); - using func_bf16_type = void (*)(ov::float16*, float, const ov::float16*, const ov::bfloat16*, const uint8_t*, bool, size_t, float, ov::float16&); - using func_fp16_type = void (*)(ov::float16*, float, const ov::float16*, const ov::float16*, const uint8_t*, bool, size_t, float, ov::float16&); - static constexpr func_fp32_type funcs_fp32[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; - static constexpr func_bf16_type funcs_bf16[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; - static constexpr func_fp16_type funcs_fp16[] = { - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max, - scale_add2_reduce_max - }; + using func_fp32_type = void (*)(ov::float16*, + float, + const ov::float16*, + const float*, + const uint8_t*, + bool, + size_t, + float, + ov::float16&); + using func_bf16_type = void (*)(ov::float16*, + float, + const ov::float16*, + const ov::bfloat16*, + const uint8_t*, + bool, + size_t, + float, + ov::float16&); + using func_fp16_type = void (*)(ov::float16*, + float, + const ov::float16*, + const ov::float16*, + const uint8_t*, + bool, + size_t, + float, + ov::float16&); + static constexpr func_fp32_type funcs_fp32[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; + static constexpr func_bf16_type funcs_bf16[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; + static constexpr func_fp16_type funcs_fp16[] = {scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max, + scale_add2_reduce_max}; int dispatch = (alibi ? 0b100 : 0) | (attn_mask ? 0b010 : 0) | (causal_mask ? 0b001 : 0); ov::float16 max = std::numeric_limits::lowest(); if (attn_mask_prec == ov::element::f32) { - funcs_fp32[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_fp32[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } else if (attn_mask_prec == ov::element::f16) { - funcs_fp16[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_fp16[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } else { - funcs_bf16[dispatch](a, scale, alibi, static_cast(attn_mask), causal_mask, select_nfltmax_at_0, len, alibi_slope, max); + funcs_bf16[dispatch](a, + scale, + alibi, + static_cast(attn_mask), + causal_mask, + select_nfltmax_at_0, + len, + alibi_slope, + max); } ov::float16 sum = 0.0f; diff --git a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/transpose_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/transpose_kernel.hpp index b719246e4976a1..93d7db55107951 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/transpose_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/scaled_attn/transpose_kernel.hpp @@ -3,96 +3,108 @@ // #pragma once -#include "common.hpp" -#include "openvino/core/type/element_type.hpp" - #include #include #include #include +#include "common.hpp" +#include "openvino/core/type/element_type.hpp" + namespace ov { namespace Extensions { namespace Cpu { namespace XARCH { #if defined(HAVE_AVX512F) -inline void transpose_m512i_16x16(__m512i& r0, __m512i& r1, __m512i& r2, __m512i& r3, - __m512i& r4, __m512i& r5, __m512i& r6, __m512i& r7, - __m512i& r8, __m512i& r9, __m512i& ra, __m512i& rb, - __m512i& rc, __m512i& rd, __m512i& re, __m512i& rf) { +inline void transpose_m512i_16x16(__m512i& r0, + __m512i& r1, + __m512i& r2, + __m512i& r3, + __m512i& r4, + __m512i& r5, + __m512i& r6, + __m512i& r7, + __m512i& r8, + __m512i& r9, + __m512i& ra, + __m512i& rb, + __m512i& rc, + __m512i& rd, + __m512i& re, + __m512i& rf) { __m512i t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, ta, tb, tc, td, te, tf; - t0 = _mm512_unpacklo_epi32(r0, r1); // 0 16 1 17 4 20 5 21 8 24 9 25 12 28 13 29 - t1 = _mm512_unpackhi_epi32(r0, r1); // 2 18 3 19 6 22 7 23 10 26 11 27 14 30 15 31 - t2 = _mm512_unpacklo_epi32(r2, r3); // 32 48 33 49 ... - t3 = _mm512_unpackhi_epi32(r2, r3); // 34 50 35 51 ... - t4 = _mm512_unpacklo_epi32(r4, r5); // 64 80 65 81 ... - t5 = _mm512_unpackhi_epi32(r4, r5); // 66 82 67 83 ... - t6 = _mm512_unpacklo_epi32(r6, r7); // 96 112 97 113 ... - t7 = _mm512_unpackhi_epi32(r6, r7); // 98 114 99 115 ... - t8 = _mm512_unpacklo_epi32(r8, r9); // 128 ... - t9 = _mm512_unpackhi_epi32(r8, r9); // 130 ... - ta = _mm512_unpacklo_epi32(ra, rb); // 160 ... - tb = _mm512_unpackhi_epi32(ra, rb); // 162 ... - tc = _mm512_unpacklo_epi32(rc, rd); // 196 ... - td = _mm512_unpackhi_epi32(rc, rd); // 198 ... - te = _mm512_unpacklo_epi32(re, rf); // 228 ... - tf = _mm512_unpackhi_epi32(re, rf); // 230 ... - - r0 = _mm512_unpacklo_epi64(t0, t2); // 0 16 32 48 ... - r1 = _mm512_unpackhi_epi64(t0, t2); // 1 17 33 49 ... - r2 = _mm512_unpacklo_epi64(t1, t3); // 2 18 34 49 ... - r3 = _mm512_unpackhi_epi64(t1, t3); // 3 19 35 51 ... - r4 = _mm512_unpacklo_epi64(t4, t6); // 64 80 96 112 ... - r5 = _mm512_unpackhi_epi64(t4, t6); // 65 81 97 114 ... - r6 = _mm512_unpacklo_epi64(t5, t7); // 66 82 98 113 ... - r7 = _mm512_unpackhi_epi64(t5, t7); // 67 83 99 115 ... - r8 = _mm512_unpacklo_epi64(t8, ta); // 128 144 160 176 ... - r9 = _mm512_unpackhi_epi64(t8, ta); // 129 145 161 178 ... - ra = _mm512_unpacklo_epi64(t9, tb); // 130 146 162 177 ... - rb = _mm512_unpackhi_epi64(t9, tb); // 131 147 163 179 ... - rc = _mm512_unpacklo_epi64(tc, te); // 192 208 228 240 ... - rd = _mm512_unpackhi_epi64(tc, te); // 193 209 229 241 ... - re = _mm512_unpacklo_epi64(td, tf); // 194 210 230 242 ... - rf = _mm512_unpackhi_epi64(td, tf); // 195 211 231 243 ... - - t0 = _mm512_shuffle_i32x4(r0, r4, 0x88); // 0 16 32 48 8 24 40 56 64 80 96 112 ... - t1 = _mm512_shuffle_i32x4(r1, r5, 0x88); // 1 17 33 49 ... - t2 = _mm512_shuffle_i32x4(r2, r6, 0x88); // 2 18 34 50 ... - t3 = _mm512_shuffle_i32x4(r3, r7, 0x88); // 3 19 35 51 ... - t4 = _mm512_shuffle_i32x4(r0, r4, 0xdd); // 4 20 36 52 ... - t5 = _mm512_shuffle_i32x4(r1, r5, 0xdd); // 5 21 37 53 ... - t6 = _mm512_shuffle_i32x4(r2, r6, 0xdd); // 6 22 38 54 ... - t7 = _mm512_shuffle_i32x4(r3, r7, 0xdd); // 7 23 39 55 ... - t8 = _mm512_shuffle_i32x4(r8, rc, 0x88); // 128 144 160 176 ... - t9 = _mm512_shuffle_i32x4(r9, rd, 0x88); // 129 145 161 177 ... - ta = _mm512_shuffle_i32x4(ra, re, 0x88); // 130 146 162 178 ... - tb = _mm512_shuffle_i32x4(rb, rf, 0x88); // 131 147 163 179 ... - tc = _mm512_shuffle_i32x4(r8, rc, 0xdd); // 132 148 164 180 ... - td = _mm512_shuffle_i32x4(r9, rd, 0xdd); // 133 149 165 181 ... - te = _mm512_shuffle_i32x4(ra, re, 0xdd); // 134 150 166 182 ... - tf = _mm512_shuffle_i32x4(rb, rf, 0xdd); // 135 151 167 183 ... - - r0 = _mm512_shuffle_i32x4(t0, t8, 0x88); // 0 16 32 48 64 80 96 112 ... 240 - r1 = _mm512_shuffle_i32x4(t1, t9, 0x88); // 1 17 33 49 66 81 97 113 ... 241 - r2 = _mm512_shuffle_i32x4(t2, ta, 0x88); // 2 18 34 50 67 82 98 114 ... 242 - r3 = _mm512_shuffle_i32x4(t3, tb, 0x88); // 3 19 35 51 68 83 99 115 ... 243 - r4 = _mm512_shuffle_i32x4(t4, tc, 0x88); // 4 ... - r5 = _mm512_shuffle_i32x4(t5, td, 0x88); // 5 ... - r6 = _mm512_shuffle_i32x4(t6, te, 0x88); // 6 ... - r7 = _mm512_shuffle_i32x4(t7, tf, 0x88); // 7 ... - r8 = _mm512_shuffle_i32x4(t0, t8, 0xdd); // 8 ... - r9 = _mm512_shuffle_i32x4(t1, t9, 0xdd); // 9 ... - ra = _mm512_shuffle_i32x4(t2, ta, 0xdd); // 10 ... - rb = _mm512_shuffle_i32x4(t3, tb, 0xdd); // 11 ... - rc = _mm512_shuffle_i32x4(t4, tc, 0xdd); // 12 ... - rd = _mm512_shuffle_i32x4(t5, td, 0xdd); // 13 ... - re = _mm512_shuffle_i32x4(t6, te, 0xdd); // 14 ... - rf = _mm512_shuffle_i32x4(t7, tf, 0xdd); // 15 31 47 63 79 96 111 127 ... 255 + t0 = _mm512_unpacklo_epi32(r0, r1); // 0 16 1 17 4 20 5 21 8 24 9 25 12 28 13 29 + t1 = _mm512_unpackhi_epi32(r0, r1); // 2 18 3 19 6 22 7 23 10 26 11 27 14 30 15 31 + t2 = _mm512_unpacklo_epi32(r2, r3); // 32 48 33 49 ... + t3 = _mm512_unpackhi_epi32(r2, r3); // 34 50 35 51 ... + t4 = _mm512_unpacklo_epi32(r4, r5); // 64 80 65 81 ... + t5 = _mm512_unpackhi_epi32(r4, r5); // 66 82 67 83 ... + t6 = _mm512_unpacklo_epi32(r6, r7); // 96 112 97 113 ... + t7 = _mm512_unpackhi_epi32(r6, r7); // 98 114 99 115 ... + t8 = _mm512_unpacklo_epi32(r8, r9); // 128 ... + t9 = _mm512_unpackhi_epi32(r8, r9); // 130 ... + ta = _mm512_unpacklo_epi32(ra, rb); // 160 ... + tb = _mm512_unpackhi_epi32(ra, rb); // 162 ... + tc = _mm512_unpacklo_epi32(rc, rd); // 196 ... + td = _mm512_unpackhi_epi32(rc, rd); // 198 ... + te = _mm512_unpacklo_epi32(re, rf); // 228 ... + tf = _mm512_unpackhi_epi32(re, rf); // 230 ... + + r0 = _mm512_unpacklo_epi64(t0, t2); // 0 16 32 48 ... + r1 = _mm512_unpackhi_epi64(t0, t2); // 1 17 33 49 ... + r2 = _mm512_unpacklo_epi64(t1, t3); // 2 18 34 49 ... + r3 = _mm512_unpackhi_epi64(t1, t3); // 3 19 35 51 ... + r4 = _mm512_unpacklo_epi64(t4, t6); // 64 80 96 112 ... + r5 = _mm512_unpackhi_epi64(t4, t6); // 65 81 97 114 ... + r6 = _mm512_unpacklo_epi64(t5, t7); // 66 82 98 113 ... + r7 = _mm512_unpackhi_epi64(t5, t7); // 67 83 99 115 ... + r8 = _mm512_unpacklo_epi64(t8, ta); // 128 144 160 176 ... + r9 = _mm512_unpackhi_epi64(t8, ta); // 129 145 161 178 ... + ra = _mm512_unpacklo_epi64(t9, tb); // 130 146 162 177 ... + rb = _mm512_unpackhi_epi64(t9, tb); // 131 147 163 179 ... + rc = _mm512_unpacklo_epi64(tc, te); // 192 208 228 240 ... + rd = _mm512_unpackhi_epi64(tc, te); // 193 209 229 241 ... + re = _mm512_unpacklo_epi64(td, tf); // 194 210 230 242 ... + rf = _mm512_unpackhi_epi64(td, tf); // 195 211 231 243 ... + + t0 = _mm512_shuffle_i32x4(r0, r4, 0x88); // 0 16 32 48 8 24 40 56 64 80 96 112 ... + t1 = _mm512_shuffle_i32x4(r1, r5, 0x88); // 1 17 33 49 ... + t2 = _mm512_shuffle_i32x4(r2, r6, 0x88); // 2 18 34 50 ... + t3 = _mm512_shuffle_i32x4(r3, r7, 0x88); // 3 19 35 51 ... + t4 = _mm512_shuffle_i32x4(r0, r4, 0xdd); // 4 20 36 52 ... + t5 = _mm512_shuffle_i32x4(r1, r5, 0xdd); // 5 21 37 53 ... + t6 = _mm512_shuffle_i32x4(r2, r6, 0xdd); // 6 22 38 54 ... + t7 = _mm512_shuffle_i32x4(r3, r7, 0xdd); // 7 23 39 55 ... + t8 = _mm512_shuffle_i32x4(r8, rc, 0x88); // 128 144 160 176 ... + t9 = _mm512_shuffle_i32x4(r9, rd, 0x88); // 129 145 161 177 ... + ta = _mm512_shuffle_i32x4(ra, re, 0x88); // 130 146 162 178 ... + tb = _mm512_shuffle_i32x4(rb, rf, 0x88); // 131 147 163 179 ... + tc = _mm512_shuffle_i32x4(r8, rc, 0xdd); // 132 148 164 180 ... + td = _mm512_shuffle_i32x4(r9, rd, 0xdd); // 133 149 165 181 ... + te = _mm512_shuffle_i32x4(ra, re, 0xdd); // 134 150 166 182 ... + tf = _mm512_shuffle_i32x4(rb, rf, 0xdd); // 135 151 167 183 ... + + r0 = _mm512_shuffle_i32x4(t0, t8, 0x88); // 0 16 32 48 64 80 96 112 ... 240 + r1 = _mm512_shuffle_i32x4(t1, t9, 0x88); // 1 17 33 49 66 81 97 113 ... 241 + r2 = _mm512_shuffle_i32x4(t2, ta, 0x88); // 2 18 34 50 67 82 98 114 ... 242 + r3 = _mm512_shuffle_i32x4(t3, tb, 0x88); // 3 19 35 51 68 83 99 115 ... 243 + r4 = _mm512_shuffle_i32x4(t4, tc, 0x88); // 4 ... + r5 = _mm512_shuffle_i32x4(t5, td, 0x88); // 5 ... + r6 = _mm512_shuffle_i32x4(t6, te, 0x88); // 6 ... + r7 = _mm512_shuffle_i32x4(t7, tf, 0x88); // 7 ... + r8 = _mm512_shuffle_i32x4(t0, t8, 0xdd); // 8 ... + r9 = _mm512_shuffle_i32x4(t1, t9, 0xdd); // 9 ... + ra = _mm512_shuffle_i32x4(t2, ta, 0xdd); // 10 ... + rb = _mm512_shuffle_i32x4(t3, tb, 0xdd); // 11 ... + rc = _mm512_shuffle_i32x4(t4, tc, 0xdd); // 12 ... + rd = _mm512_shuffle_i32x4(t5, td, 0xdd); // 13 ... + re = _mm512_shuffle_i32x4(t6, te, 0xdd); // 14 ... + rf = _mm512_shuffle_i32x4(t7, tf, 0xdd); // 15 31 47 63 79 96 111 127 ... 255 } -template +template inline void transpose_16x16_kernel(float* _dst, T* src, size_t dst_stride, size_t src_stride) { auto* dst = reinterpret_cast(_dst); __m512i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf; @@ -133,7 +145,7 @@ inline void transpose_16x16_kernel(float* _dst, T* src, size_t dst_stride, size_ _mm512_storeu_si512(dst + 15 * dst_stride, rf); } -template +template inline void transpose_16xK_kernel(float* _dst, T* src, size_t K, size_t dst_stride, size_t src_stride) { auto* dst = reinterpret_cast(_dst); __m512i r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf; @@ -156,24 +168,110 @@ inline void transpose_16xK_kernel(float* _dst, T* src, size_t K, size_t dst_stri transpose_m512i_16x16(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf); -#define S(m) _mm512_storeu_si512(dst + 0x##m * dst_stride, r##m) -#define S8() S(0); S(1); S(2); S(3); S(4); S(5); S(6); S(7); +# define S(m) _mm512_storeu_si512(dst + 0x##m * dst_stride, r##m) +# define S8() \ + S(0); \ + S(1); \ + S(2); \ + S(3); \ + S(4); \ + S(5); \ + S(6); \ + S(7); switch (K) { - case 8: S8(); break; - case 9: S8() S(8); break; - case 10: S8(); S(8); S(9); break; - case 11: S8(); S(8); S(9); S(a); break; - case 12: S8(); S(8); S(9); S(a); S(b); break; - case 13: S8(); S(8); S(9); S(a); S(b); S(c); break; - case 14: S8(); S(8); S(9); S(a); S(b); S(c); S(d); break; - case 15: S8(); S(8); S(9); S(a); S(b); S(c); S(d); S(e); break; - case 1: S(0); break; - case 2: S(0); S(1); break; - case 3: S(0); S(1); S(2); break; - case 4: S(0); S(1); S(2); S(3); break; - case 5: S(0); S(1); S(2); S(3); S(4); break; - case 6: S(0); S(1); S(2); S(3); S(4); S(5); break; - case 7: S(0); S(1); S(2); S(3); S(4); S(5); S(6); break; + case 8: + S8(); + break; + case 9: + S8() S(8); + break; + case 10: + S8(); + S(8); + S(9); + break; + case 11: + S8(); + S(8); + S(9); + S(a); + break; + case 12: + S8(); + S(8); + S(9); + S(a); + S(b); + break; + case 13: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + break; + case 14: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + S(d); + break; + case 15: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + S(d); + S(e); + break; + case 1: + S(0); + break; + case 2: + S(0); + S(1); + break; + case 3: + S(0); + S(1); + S(2); + break; + case 4: + S(0); + S(1); + S(2); + S(3); + break; + case 5: + S(0); + S(1); + S(2); + S(3); + S(4); + break; + case 6: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + break; + case 7: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + S(6); + break; } } @@ -240,30 +338,109 @@ inline void transpose_16xK_kernel(uint32_t* dst, uint32_t* src, size_t K, size_t transpose_m512i_16x16(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, ra, rb, rc, rd, re, rf); switch (K) { - case 8: S8(); break; - case 9: S8() S(8); break; - case 10: S8(); S(8); S(9); break; - case 11: S8(); S(8); S(9); S(a); break; - case 12: S8(); S(8); S(9); S(a); S(b); break; - case 13: S8(); S(8); S(9); S(a); S(b); S(c); break; - case 14: S8(); S(8); S(9); S(a); S(b); S(c); S(d); break; - case 15: S8(); S(8); S(9); S(a); S(b); S(c); S(d); S(e); break; - case 1: S(0); break; - case 2: S(0); S(1); break; - case 3: S(0); S(1); S(2); break; - case 4: S(0); S(1); S(2); S(3); break; - case 5: S(0); S(1); S(2); S(3); S(4); break; - case 6: S(0); S(1); S(2); S(3); S(4); S(5); break; - case 7: S(0); S(1); S(2); S(3); S(4); S(5); S(6); break; + case 8: + S8(); + break; + case 9: + S8() S(8); + break; + case 10: + S8(); + S(8); + S(9); + break; + case 11: + S8(); + S(8); + S(9); + S(a); + break; + case 12: + S8(); + S(8); + S(9); + S(a); + S(b); + break; + case 13: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + break; + case 14: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + S(d); + break; + case 15: + S8(); + S(8); + S(9); + S(a); + S(b); + S(c); + S(d); + S(e); + break; + case 1: + S(0); + break; + case 2: + S(0); + S(1); + break; + case 3: + S(0); + S(1); + S(2); + break; + case 4: + S(0); + S(1); + S(2); + S(3); + break; + case 5: + S(0); + S(1); + S(2); + S(3); + S(4); + break; + case 6: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + break; + case 7: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + S(6); + break; } -#undef S -#undef S8 +# undef S +# undef S8 } #elif defined(HAVE_AVX2) // https://stackoverflow.com/questions/25622745/transpose-an-8x8-float-using-avx-avx2 -inline void transpose_8x8(__m256& r0, __m256& r1, __m256& r2, __m256& r3, __m256& r4, __m256& r5, __m256& r6, __m256& r7) { +inline void +transpose_8x8(__m256& r0, __m256& r1, __m256& r2, __m256& r3, __m256& r4, __m256& r5, __m256& r6, __m256& r7) { __m256 t0, t1, t2, t3, t4, t5, t6, t7; __m256 tt0, tt1, tt2, tt3, tt4, tt5, tt6, tt7; t0 = _mm256_unpacklo_ps(r0, r1); @@ -292,7 +469,7 @@ inline void transpose_8x8(__m256& r0, __m256& r1, __m256& r2, __m256& r3, __m256 r7 = _mm256_permute2f128_ps(tt3, tt7, 0x31); } -template +template inline void transpose_16x16_kernel(float* dst, T* src, size_t dst_stride, size_t src_stride) { __m256 r0, r1, r2, r3, r4, r5, r6, r7; @@ -323,7 +500,7 @@ inline void transpose_16x16_kernel(float* dst, T* src, size_t dst_stride, size_t } } -template +template inline void transpose_16xK_kernel(float* dst, T* src, size_t K, size_t dst_stride, size_t src_stride) { __m256 r0, r1, r2, r3, r4, r5, r6, r7; @@ -366,24 +543,59 @@ inline void transpose_16xK_kernel(float* dst, T* src, size_t K, size_t dst_strid transpose_8x8(r0, r1, r2, r3, r4, r5, r6, r7); -#define S(m) _mm256_storeu_ps(dst + j + m * dst_stride, r##m) +# define S(m) _mm256_storeu_ps(dst + j + m * dst_stride, r##m) switch (K) { - case 1: S(0); break; - case 2: S(0); S(1); break; - case 3: S(0); S(1); S(2); break; - case 4: S(0); S(1); S(2); S(3); break; - case 5: S(0); S(1); S(2); S(3); S(4); break; - case 6: S(0); S(1); S(2); S(3); S(4); S(5); break; - case 7: S(0); S(1); S(2); S(3); S(4); S(5); S(6); break; + case 1: + S(0); + break; + case 2: + S(0); + S(1); + break; + case 3: + S(0); + S(1); + S(2); + break; + case 4: + S(0); + S(1); + S(2); + S(3); + break; + case 5: + S(0); + S(1); + S(2); + S(3); + S(4); + break; + case 6: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + break; + case 7: + S(0); + S(1); + S(2); + S(3); + S(4); + S(5); + S(6); + break; } -#undef S +# undef S } } } #else -template +template inline void transpose_16x16_kernel(TDST* dst, TSRC* src, size_t dst_stride, size_t src_stride) { for (size_t i = 0; i < 16; i++) { for (size_t j = 0; j < 16; j++) { @@ -392,7 +604,7 @@ inline void transpose_16x16_kernel(TDST* dst, TSRC* src, size_t dst_stride, size } } -template +template inline void transpose_16xK_kernel(TDST* dst, TSRC* src, size_t K, size_t dst_stride, size_t src_stride) { for (size_t i = 0; i < K; i++) { for (size_t j = 0; j < 16; j++) { diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/brgemm_kernel.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/brgemm_kernel.cpp index 2895a272b982b5..7df2e2371a843a 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/brgemm_kernel.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/brgemm_kernel.cpp @@ -4,11 +4,12 @@ #include "brgemm_kernel.hpp" -#include "dnnl_extension_utils.h" -#include "utils/cpu_utils.hpp" #include #include +#include "dnnl_extension_utils.h" +#include "utils/cpu_utils.hpp" + using namespace dnnl::impl::cpu::x64; using namespace dnnl::impl; using namespace dnnl::impl::cpu::x64::matmul; @@ -100,8 +101,9 @@ BrgemmKernel::BrgemmKernel(size_t M, brgemmCtx.M = M_; brgemmCtx.N = N_; brgemmCtx.K = K_; - brgemmCtx.LDA = k ? K_blk : (is_avx_f16_only ? K : lda); // f16 use f32 internally - brgemmCtx.LDB = (!is_f32 || b_transposed) ? rnd_up(N, N_blk) : ldb; // bf16/fp16/b_transposed needs copy + brgemmCtx.LDA = k ? K_blk : (is_avx_f16_only ? K : lda); // f16 use f32 internally + brgemmCtx.LDB = + (!is_f32 || b_transposed) ? rnd_up(N, N_blk) : ldb; // bf16/fp16/b_transposed needs copy brgemmCtx.LDC = ldc; brgemmCtx.dt_in0 = static_cast(DnnlExtensionUtils::ElementTypeToDataType(srcType)); brgemmCtx.dt_in1 = static_cast(DnnlExtensionUtils::ElementTypeToDataType(weiType)); @@ -158,8 +160,8 @@ const size_t BrgemmKernel::get_scratch_b_size() const { } void BrgemmKernel::init_brgemm(brgemmCtx& ctx, - std::unique_ptr& brgKernel, - bool use_amx) { + std::unique_ptr& brgKernel, + bool use_amx) { brgemm_desc_t brgDesc; const bool is_int8 = @@ -208,7 +210,8 @@ void BrgemmKernel::init_brgemm(brgemmCtx& ctx, brgattr.max_bs = 1; brgattr.wary_tail_read = false; brgattr.hint_innermost_loop = brgemm_innermost_undef; - // if b_accumulate is true, it means we want c+=a*b. jit_brgemm_amx_uker_base_t::load_accumulators can support this using tileload(c) without postops + // if b_accumulate is true, it means we want c+=a*b. jit_brgemm_amx_uker_base_t::load_accumulators can support + // this using tileload(c) without postops brgattr.use_uker = true; brgattr.use_interleave_stores = true; brgattr.hint_prefetching = brgemm_kernel_prefetching_t::brgemm_prf1; @@ -248,7 +251,7 @@ void BrgemmKernel::init_brgemm_copy_a( brgCopyKernelConf.K_tail = K_tail; brgCopyKernelConf.K_blk = K_blk; brgCopyKernelConf.use_buffer_a_tail_only = false; - //padding K tail to K_blk, LDA is the stride for target tensor + // padding K tail to K_blk, LDA is the stride for target tensor brgCopyKernelConf.LDA = LDA; brgCopyKernelConf.has_zero_point_b = false; brgCopyKernelConf.s8s8_compensation_required = false; @@ -258,9 +261,13 @@ void BrgemmKernel::init_brgemm_copy_a( brgCopyKernelConf.copy_A_src_stride = copy_A_src_stride; // copy_a_kernel assumes that in/out tensor has same data type except f16 // copy_a_kernel has special path for f16: assuming input(f16) -> output(f32) - brgCopyKernelConf.a_dt_sz = is_avx_f16_only ? sizeof(ov::float16) : DnnlExtensionUtils::sizeOfDataType(static_cast(dt_in0)); + brgCopyKernelConf.a_dt_sz = is_avx_f16_only + ? sizeof(ov::float16) + : DnnlExtensionUtils::sizeOfDataType(static_cast(dt_in0)); // copied A has the same precision of original - brgCopyKernelConf.tr_a_dt_sz = is_avx_f16_only ? sizeof(float) : DnnlExtensionUtils::sizeOfDataType(static_cast(dt_in0)); + brgCopyKernelConf.tr_a_dt_sz = + is_avx_f16_only ? sizeof(float) + : DnnlExtensionUtils::sizeOfDataType(static_cast(dt_in0)); brgCopyKernelConf.transposed_A = transpose; brgCopyKernelConf.isa = is_avx_f16_only ? avx512_core_fp16 : avx512_core_amx; @@ -284,7 +291,7 @@ void BrgemmKernel::init_brgemm_copy_b( brgCopyKernelConf.wei_dt = is_avx_f16_only ? dnnl_data_type_t::dnnl_f32 : dt_in1; brgCopyKernelConf.orig_wei_dt = dt_in1; brgCopyKernelConf.wei_n_blk = N_blk; - brgCopyKernelConf.wei_tag = transpose ? dnnl_ba : dnnl_ab; + brgCopyKernelConf.wei_tag = transpose ? dnnl_ba : dnnl_ab; brgCopyKernelConf.copy_B_wei_stride = copy_B_wei_stride; brgCopyKernelConf.transposed_B = transpose; @@ -298,10 +305,14 @@ void BrgemmKernel::init_brgemm_copy_b( brgCopyKernelConf.K_tail = 0; brgCopyKernelConf.N_chunk_elems = brgCopyKernelConf.N_blk; // f16 is computed by upconverting. in(f16) -> out(f32) - brgCopyKernelConf.b_dt_sz = is_avx_f16_only ? sizeof(ov::float16) : - DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.src_dt)); - brgCopyKernelConf.tr_b_dt_sz = is_avx_f16_only ? sizeof(float) : - DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.src_dt)); + brgCopyKernelConf.b_dt_sz = + is_avx_f16_only + ? sizeof(ov::float16) + : DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.src_dt)); + brgCopyKernelConf.tr_b_dt_sz = + is_avx_f16_only + ? sizeof(float) + : DnnlExtensionUtils::sizeOfDataType(static_cast(brgCopyKernelConf.src_dt)); brgCopyKernelConf.req_wei_vnni_downconvert = false; if (is_with_amx) { @@ -390,12 +401,7 @@ void BrgemmKernel::executeGemm(bool is_M_tail, void* a, void* b, void* c, void* auto weight_ptr = ptr_scartch_b + B_stride; auto C_stride = n * count_N * ov::element::f32.size(); auto out_ptr = ptr_C + C_stride; - callBrgemm(brgemmCtx, - brgKernels[getBrgIdx(mIdx, k, n)], - local_a_ptr, - weight_ptr, - out_ptr, - wsp); + callBrgemm(brgemmCtx, brgKernels[getBrgIdx(mIdx, k, n)], local_a_ptr, weight_ptr, out_ptr, wsp); // stride K, N if body kernel is executed. if (k == 0) { count_K = brgemmCtx.K * brgemmCtx.LDB; diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.cpp index f8b0df611258a7..1d5e81410a0bf3 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.cpp @@ -4,7 +4,6 @@ #include "dft_uni_kernel.hpp" - using namespace dnnl::impl; using namespace dnnl::impl::utils; using namespace dnnl::impl::cpu::x64; @@ -16,7 +15,8 @@ namespace ov { namespace intel_cpu { template -jit_uni_dft_kernel_f32::jit_uni_dft_kernel_f32() : jit_uni_dft_kernel(), jit_generator(jit_name()) {} +jit_uni_dft_kernel_f32::jit_uni_dft_kernel_f32() : jit_uni_dft_kernel(), + jit_generator(jit_name()) {} template void jit_uni_dft_kernel_f32::create_ker() { @@ -115,11 +115,9 @@ template struct jit_uni_dft_kernel_f32; template struct jit_uni_dft_kernel_f32; template struct jit_uni_dft_kernel_f32; - template -jit_uni_fft_kernel_f32::jit_uni_fft_kernel_f32() - : jit_uni_fft_kernel(), - jit_generator(jit_name()) {} +jit_uni_fft_kernel_f32::jit_uni_fft_kernel_f32() : jit_uni_fft_kernel(), + jit_generator(jit_name()) {} template void jit_uni_fft_kernel_f32::create_ker() { diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.hpp index b70c99e5f8a527..095a3db97d2a64 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/dft_uni_kernel.hpp @@ -130,7 +130,6 @@ struct jit_uni_fft_kernel_f32 : public jit_uni_fft_kernel, public dnnl::impl::cp Vmm vmm_data_result = vmm_data_odd_2; - template void loop_process(int step); @@ -138,5 +137,5 @@ struct jit_uni_fft_kernel_f32 : public jit_uni_fft_kernel, public dnnl::impl::cp void move_data(const Xbyak::Xmm& x, const Xbyak::Address& addr, int count); }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.cpp index 5aaefb086f119c..c0de6520b7099c 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.cpp @@ -3,6 +3,7 @@ // #include "gather_uni_kernel.hpp" + #include "openvino/core/except.hpp" using namespace dnnl::impl::cpu; @@ -10,23 +11,52 @@ using namespace dnnl::impl::cpu; namespace ov { namespace intel_cpu { -const unsigned jitGatherKernelBase::shufMask8bitUni[16] = {0x0C080400, 0x80808080, 0x80808080, 0x80808080, 0x0C080400, 0x80808080, 0x80808080, 0x80808080, - 0x0C080400, 0x80808080, 0x80808080, 0x80808080, 0x0C080400, 0x80808080, 0x80808080, 0x80808080}; -const unsigned jitGatherKernelBase::permMask8bitA2[8] = {0, 4, 1, 5, 2, 6, 3, 7}; -const unsigned jitGatherKernelBase::permMask8bitA5[16] = {0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}; - -const unsigned jitGatherKernelBase::shufMask16bitUni[16] = {0x05040100, 0x0D0C0908, 0x80808080, 0x80808080, 0x05040100, 0x0D0C0908, 0x80808080, 0x80808080, - 0x05040100, 0x0D0C0908, 0x80808080, 0x80808080, 0x05040100, 0x0D0C0908, 0x80808080, 0x80808080}; -const unsigned jitGatherKernelBase::permMask16bitA2[8] = {0, 1, 4, 5, 2, 3, 6, 7}; -const unsigned jitGatherKernelBase::permMask16bitA5[16] = {0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15}; +const unsigned jitGatherKernelBase::shufMask8bitUni[16] = {0x0C080400, + 0x80808080, + 0x80808080, + 0x80808080, + 0x0C080400, + 0x80808080, + 0x80808080, + 0x80808080, + 0x0C080400, + 0x80808080, + 0x80808080, + 0x80808080, + 0x0C080400, + 0x80808080, + 0x80808080, + 0x80808080}; +const unsigned jitGatherKernelBase::permMask8bitA2[8] = {0, 4, 1, 5, 2, 6, 3, 7}; +const unsigned jitGatherKernelBase::permMask8bitA5[16] = {0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15}; + +const unsigned jitGatherKernelBase::shufMask16bitUni[16] = {0x05040100, + 0x0D0C0908, + 0x80808080, + 0x80808080, + 0x05040100, + 0x0D0C0908, + 0x80808080, + 0x80808080, + 0x05040100, + 0x0D0C0908, + 0x80808080, + 0x80808080, + 0x05040100, + 0x0D0C0908, + 0x80808080, + 0x80808080}; +const unsigned jitGatherKernelBase::permMask16bitA2[8] = {0, 1, 4, 5, 2, 3, 6, 7}; +const unsigned jitGatherKernelBase::permMask16bitA5[16] = {0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15}; const unsigned jitGatherKernelBase::incVec[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; #define GET_OFF(field) offsetof(gatherJitExecArgs, field) template -jitUniGatherKernel::jitUniGatherKernel(const jGatherConfParams& jcp) : - jitGatherKernelBase(jcp), x64::jit_generator(jit_name()) { +jitUniGatherKernel::jitUniGatherKernel(const jGatherConfParams& jcp) + : jitGatherKernelBase(jcp), + x64::jit_generator(jit_name()) { vlen = x64::cpu_isa_traits::vlen; dataElPerVec = vlen / jcp.dataTypeSize; idxElPerVec = vlen / indicesTypeSize; @@ -74,7 +104,7 @@ void jitUniGatherKernel::generate() { if (!jcp.dynamicShapes) { mov(regAux1, ptr[regParams + GET_OFF(specIndicesSize)]); uni_vpbroadcastd(vmmSpecIdxSizeB, ptr[regAux1]); - uni_vpslld(vmmSpecIdxSizeB, vmmSpecIdxSizeB, idxTypeShift); // multiply by indices type size. + uni_vpslld(vmmSpecIdxSizeB, vmmSpecIdxSizeB, idxTypeShift); // multiply by indices type size. mov(regAux1, ptr[regParams + GET_OFF(specIdxB)]); uni_vmovups(vmmSpecIdxB, ptr[regAux1]); @@ -84,7 +114,7 @@ void jitUniGatherKernel::generate() { uni_vmovups(vmmSrcBeforeAxisSumB, ptr[regAux1]); } - if (jcp.afterAxisSize == 1lu) { // Elementwise case. + if (jcp.afterAxisSize == 1lu) { // Elementwise case. uni_vmovd(reg32SpecIdxSizeB, xmmSpecIdxSizeB); if (jcp.beforeAxisSize != 1lu) { mov(regAux1, ptr[regParams + GET_OFF(axisAndAfterAxisSizeB)]); @@ -98,8 +128,9 @@ void jitUniGatherKernel::generate() { mov(regBetweenBatchAndAxisSize, ptr[regAux1]); mov(regBetweenBatchAndAxisIter, ptr[regParams + GET_OFF(betweenBatchAndAxisIter)]); - if (jcp.specIdxSize < idxElPerVec) { // Short case. - if (jcp.specIdxSize != 1 && jcp.specIdxSize != 2 && jcp.specIdxSize != 4 && jcp.specIdxSize != 8 && jcp.specIdxSize != 16) { + if (jcp.specIdxSize < idxElPerVec) { // Short case. + if (jcp.specIdxSize != 1 && jcp.specIdxSize != 2 && jcp.specIdxSize != 4 && jcp.specIdxSize != 8 && + jcp.specIdxSize != 16) { mov(regAux1, ptr[regParams + GET_OFF(permIdxMask)]); uni_vmovups(vmmPermIdxMask, ptr[regAux1]); } @@ -107,7 +138,7 @@ void jitUniGatherKernel::generate() { mov(regAux1, ptr[regParams + GET_OFF(beforeAxisDiff)]); uni_vmovups(vmmBeforeAxDiffB, ptr[regAux1]); if (jcp.dataTypeSize != 1) - uni_vpslld(vmmBeforeAxDiffB, vmmBeforeAxDiffB, dataTypeShift); // multiply by data type size + uni_vpslld(vmmBeforeAxDiffB, vmmBeforeAxDiffB, dataTypeShift); // multiply by data type size } if (jcp.batchDims > 0lu) { mov(regAux1, ptr[regParams + GET_OFF(srcAfterBatchSizeB)]); @@ -115,14 +146,14 @@ void jitUniGatherKernel::generate() { } process(true, false); - } else { // Long case. + } else { // Long case. uni_vmovd(reg32IdxIter, xmmSpecIdxB); fillVlenVector(); process(false, false); } - } else { // Blocked case. - if (jcp.afterAxisSize <= idxElPerVec) { // Short case. + } else { // Blocked case. + if (jcp.afterAxisSize <= idxElPerVec) { // Short case. mov(regAux1, ptr[regParams + GET_OFF(afterAxIdxB)]); uni_vmovups(vmmAfterAxisIdxB, ptr[regAux1]); mov(regAux1, ptr[regParams + GET_OFF(afterAxisPermMask)]); @@ -146,18 +177,19 @@ void jitUniGatherKernel::generate() { } const uint64_t specIdxAndAfterAxisSize = jcp.specIdxSize * jcp.afterAxisSize; if (specIdxAndAfterAxisSize != 1 && specIdxAndAfterAxisSize != 2 && specIdxAndAfterAxisSize != 4 && - specIdxAndAfterAxisSize != 8 && specIdxAndAfterAxisSize != 16) { + specIdxAndAfterAxisSize != 8 && specIdxAndAfterAxisSize != 16) { mov(regAux1, ptr[regParams + GET_OFF(beforeAxisPermMask)]); uni_vmovups(vmmBeforeAxPermMask, ptr[regAux1]); } } process(true, true); - } else { // Long case. - OPENVINO_THROW("Gather kernel does not support static shape with after axis size greater than elements in vector."); + } else { // Long case. + OPENVINO_THROW("Gather kernel does not support static shape with after axis size greater than elements " + "in vector."); } } - } else { // Dynamic shapes. + } else { // Dynamic shapes. mov(regAux1, ptr[regParams + GET_OFF(start)]); uni_vpbroadcastd(vmmSpecIdxB, ptr[regAux1]); mov(regAux1, reinterpret_cast(incVec)); @@ -172,8 +204,8 @@ void jitUniGatherKernel::generate() { uni_vroundps(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, 0x1); uni_vfnmadd231ps(vmmSpecIdxB, vmmSrcBeforeAxisSumB, vAux1); uni_vcvtps2dq(vmmSpecIdxB, vmmSpecIdxB); - uni_vpslld(vmmSpecIdxB, vmmSpecIdxB, idxTypeShift); // multiply by indices type size. - uni_vpslld(vmmSpecIdxSizeB, vmmSpecIdxSizeB, idxTypeShift); // multiply by indices type size. + uni_vpslld(vmmSpecIdxB, vmmSpecIdxB, idxTypeShift); // multiply by indices type size. + uni_vpslld(vmmSpecIdxSizeB, vmmSpecIdxSizeB, idxTypeShift); // multiply by indices type size. uni_vmovd(reg32SpecIdxSizeB, xmmSpecIdxSizeB); mov(regAux1, ptr[regParams + GET_OFF(betweenBatchAndAxisSize)]); @@ -189,7 +221,8 @@ void jitUniGatherKernel::generate() { mov(regAux1, ptr[regParams + GET_OFF(axisAndAfterAxisSizeB)]); uni_vpbroadcastd(vmmAxisAndAfterAxisSizeB, ptr[regAux1]); - // Formula: srcBeforeAxisSum = ((start / specIndicesSize) % betweenBatchAndAxis) * axisAndAfterAxisSize + srcAfterBatchSize * idxBatchSum + // Formula: srcBeforeAxisSum = ((start / specIndicesSize) % betweenBatchAndAxis) * axisAndAfterAxisSize + + // srcAfterBatchSize * idxBatchSum if (jcp.beforeAxisSize != 1lu) { uni_vpmulld(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); mov(regAux1, ptr[regParams + GET_OFF(srcAfterBatchSizeB)]); @@ -210,28 +243,29 @@ void jitUniGatherKernel::generate() { cmp(regSpecIdxSizeB, vlen); jl(lLessThanVector1, T_NEAR); - uni_vmovd(reg32IdxIter, xmmSpecIdxB); - fillVlenVector(); + uni_vmovd(reg32IdxIter, xmmSpecIdxB); + fillVlenVector(); - process(false, false); - jmp(lE1, T_NEAR); + process(false, false); + jmp(lE1, T_NEAR); L(lLessThanVector1); - mov(regAux1, ptr[regParams + GET_OFF(permIdxMask)]); - uni_vmovups(vmmPermIdxMask, ptr[regAux1]); - if (jcp.beforeAxisSize != 1lu) { - mov(regAux1, ptr[regParams + GET_OFF(beforeAxisDiff)]); - uni_vmovups(vmmBeforeAxDiffB, ptr[regAux1]); - if (jcp.dataTypeSize != 1) - uni_vpslld(vmmBeforeAxDiffB, vmmBeforeAxDiffB, dataTypeShift); // multiply by data type size - } - mov(regAux1, ptr[regParams + GET_OFF(srcAfterBatchSizeB)]); - uni_vpbroadcastd(vmmSrcAfterBatchSizeB, ptr[regAux1]); + mov(regAux1, ptr[regParams + GET_OFF(permIdxMask)]); + uni_vmovups(vmmPermIdxMask, ptr[regAux1]); + if (jcp.beforeAxisSize != 1lu) { + mov(regAux1, ptr[regParams + GET_OFF(beforeAxisDiff)]); + uni_vmovups(vmmBeforeAxDiffB, ptr[regAux1]); + if (jcp.dataTypeSize != 1) + uni_vpslld(vmmBeforeAxDiffB, vmmBeforeAxDiffB, dataTypeShift); // multiply by data type size + } + mov(regAux1, ptr[regParams + GET_OFF(srcAfterBatchSizeB)]); + uni_vpbroadcastd(vmmSrcAfterBatchSizeB, ptr[regAux1]); - process(true, false); + process(true, false); L(lE1); jmp(lEnd, T_NEAR); } - L(lBlock); { + L(lBlock); + { mov(regAux1, ptr[regParams + GET_OFF(start)]); uni_vpbroadcastd(vmmAfterAxisIdxB, ptr[regAux1]); mov(regAux1, reinterpret_cast(incVec)); @@ -246,40 +280,40 @@ void jitUniGatherKernel::generate() { uni_vroundps(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, 0x1); uni_vfnmadd231ps(vmmAfterAxisIdxB, vmmSrcBeforeAxisSumB, vAux1); uni_vcvtps2dq(vmmAfterAxisIdxB, vmmAfterAxisIdxB); - uni_vpslld(vmmAfterAxisIdxB, vmmAfterAxisIdxB, idxTypeShift); // multiply by indices type size. + uni_vpslld(vmmAfterAxisIdxB, vmmAfterAxisIdxB, idxTypeShift); // multiply by indices type size. Xbyak::Label lLessThanVector2, lTail3, lTail4, lE2; cmp(regAux2, dataElPerVec); jl(lLessThanVector2, T_NEAR); - uni_vmovd(reg32IdxIter, xmmSpecIdxB); - fillVlenVector(); + uni_vmovd(reg32IdxIter, xmmSpecIdxB); + fillVlenVector(); -// process(false, true); - jmp(lE2, T_NEAR); + // process(false, true); + jmp(lE2, T_NEAR); L(lLessThanVector2); - auto& vAux2 = vmmAuxContainer[2]; - // Calculate permute mask - uni_vmovd(xAux0, reg32Aux2); - uni_vpbroadcastd(vAux1, xAux0); - mov(regAux1, reinterpret_cast(&idxElPerVec)); - uni_vpbroadcastd(vAux0, ptr[regAux1]); - uni_vpsubd(vmmAfterAxisPermMask, vAux0, vAux1); - mov(regAux1, reinterpret_cast(incVec)); - uni_vpaddd(vmmAfterAxisPermMask, vmmAfterAxisPermMask, ptr[regAux1]); - for (int i = 0; i < 6; i++) { - if (isa == x64::avx512_core) { - Xbyak::Opmask kMask2 = Xbyak::Opmask(vAux2.getIdx()); - vpcmpgtd(kMask2, vAux0, vmmAfterAxisPermMask); - uni_vpsubd(vmmAfterAxisPermMask | kMask2, vmmAfterAxisPermMask, vAux1); - } else { - vpcmpgtd(vAux2, vAux0, vmmAfterAxisPermMask); - vpandn(vAux2, vAux2, vAux1); - uni_vpsubd(vmmAfterAxisPermMask, vmmAfterAxisPermMask, vAux2); - } + auto& vAux2 = vmmAuxContainer[2]; + // Calculate permute mask + uni_vmovd(xAux0, reg32Aux2); + uni_vpbroadcastd(vAux1, xAux0); + mov(regAux1, reinterpret_cast(&idxElPerVec)); + uni_vpbroadcastd(vAux0, ptr[regAux1]); + uni_vpsubd(vmmAfterAxisPermMask, vAux0, vAux1); + mov(regAux1, reinterpret_cast(incVec)); + uni_vpaddd(vmmAfterAxisPermMask, vmmAfterAxisPermMask, ptr[regAux1]); + for (int i = 0; i < 6; i++) { + if (isa == x64::avx512_core) { + Xbyak::Opmask kMask2 = Xbyak::Opmask(vAux2.getIdx()); + vpcmpgtd(kMask2, vAux0, vmmAfterAxisPermMask); + uni_vpsubd(vmmAfterAxisPermMask | kMask2, vmmAfterAxisPermMask, vAux1); + } else { + vpcmpgtd(vAux2, vAux0, vmmAfterAxisPermMask); + vpandn(vAux2, vAux2, vAux1); + uni_vpsubd(vmmAfterAxisPermMask, vmmAfterAxisPermMask, vAux2); } + } - process(true, true); + process(true, true); L(lE2); } L(lEnd); @@ -323,7 +357,7 @@ void jitUniGatherKernel::normalizeRawIndices(Vmm& vRawIndices, } // Check boundaries. vpcmpgtd(kAuxMask, vmmAxisDim, vRawIndices); - vpcmpd(kDstMask | kAuxMask, vmmZeros, vRawIndices, 2); // 2 - LE + vpcmpd(kDstMask | kAuxMask, vmmZeros, vRawIndices, 2); // 2 - LE // Multiply by type size. if (jcp.dataTypeSize > 1) uni_vpslld(vRawIndices, vRawIndices, dataTypeShift); @@ -338,7 +372,7 @@ void jitUniGatherKernel::normWithUpperBound(Vmm& vTarget, Vmm& vMax, template <> void jitUniGatherKernel::normWithUpperBound(Vmm& vTarget, Vmm& vMax, Vmask& kAuxMask) { - vpcmpd(kAuxMask, vMax, vTarget, 2); // 2 -> LE + vpcmpd(kAuxMask, vMax, vTarget, 2); // 2 -> LE uni_vpsubd(vTarget | kAuxMask, vTarget, vMax); } @@ -359,77 +393,77 @@ void jitUniGatherKernel::calcSrcShiftLong(Vmm* vAuxPool, bool shiftFi add(regIdxIter, vlen); cmp(regIdxIter, regSpecIdxSizeB); jge(lIdxStride, T_NEAR); + if (jcp.batchDims > 0lu) { + uni_vpaddd(vDstShifts, vmmIdxBatchSumB, vmmSpecIdxB); + uni_vmovd(reg32Aux1, xmmAuxContainer[vDstShifts.getIdx()]); + } else { + uni_vmovd(reg32Aux1, xmmSpecIdxB); + } + vmovdqu(vDstShifts, ptr[regIndices + regAux1]); + normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); + if (jcp.beforeAxisSize != 1lu) + uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); + jmp(lExit, T_NEAR); + L(lIdxStride); + sub(regIdxIter, regSpecIdxSizeB); + vpcmpeqd(kDstMask, vAux0, vAux0); + if (shiftFirst) { + vpcmpgtd(vAux0, vmmSpecIdxSizeB, vmmSpecIdxB); + vpandn(vAux1, vAux0, vmmSpecIdxSizeB); + uni_vpsubd(vAux1, vmmSpecIdxB, vAux1); + if (jcp.batchDims > 0lu) + uni_vpaddd(vAux1, vmmIdxBatchSumB, vAux1); + uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vmmSpecIdxSizeB); + } else { if (jcp.batchDims > 0lu) { - uni_vpaddd(vDstShifts, vmmIdxBatchSumB, vmmSpecIdxB); - uni_vmovd(reg32Aux1, xmmAuxContainer[vDstShifts.getIdx()]); + uni_vpaddd(vAux0, vmmIdxBatchSumB, vmmSpecIdxB); + uniVpGatherDd(vDstShifts, ptr[regIndices + vAux0], kDstMask); } else { - uni_vmovd(reg32Aux1, xmmSpecIdxB); + uniVpGatherDd(vDstShifts, ptr[regIndices + vmmSpecIdxB], kDstMask); } - vmovdqu(vDstShifts, ptr[regIndices + regAux1]); normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - if (jcp.beforeAxisSize != 1lu) - uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); - jmp(lExit, T_NEAR); - L(lIdxStride); - sub(regIdxIter, regSpecIdxSizeB); - vpcmpeqd(kDstMask, vAux0, vAux0); - if (shiftFirst) { - vpcmpgtd(vAux0, vmmSpecIdxSizeB, vmmSpecIdxB); - vpandn(vAux1, vAux0, vmmSpecIdxSizeB); - uni_vpsubd(vAux1, vmmSpecIdxB, vAux1); - if (jcp.batchDims > 0lu) - uni_vpaddd(vAux1, vmmIdxBatchSumB, vAux1); - uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vmmSpecIdxSizeB); - } else { - if (jcp.batchDims > 0lu) { - uni_vpaddd(vAux0, vmmIdxBatchSumB, vmmSpecIdxB); - uniVpGatherDd(vDstShifts, ptr[regIndices + vAux0], kDstMask); - } else { - uniVpGatherDd(vDstShifts, ptr[regIndices + vmmSpecIdxB], kDstMask); - } - normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - uni_vpbroadcastd(vAux0, xmmSpecIdxB); - vpcmpgtd(vAux1, vAux0, vmmSpecIdxB); - vpandn(vAux0, vAux1, vmmSpecIdxSizeB); - uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vAux0); + uni_vpbroadcastd(vAux0, xmmSpecIdxB); + vpcmpgtd(vAux1, vAux0, vmmSpecIdxB); + vpandn(vAux0, vAux1, vmmSpecIdxSizeB); + uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vAux0); - if (jcp.beforeAxisSize != 1lu) { - uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); - vpandn(vAux0, vAux1, vmmAxisAndAfterAxisSizeB); - uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vAux0); - } + if (jcp.beforeAxisSize != 1lu) { + uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); + vpandn(vAux0, vAux1, vmmAxisAndAfterAxisSizeB); + uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vAux0); } + } - if (jcp.batchDims > 0lu) { - Xbyak::Label l1; - inc(regBetweenBatchAndAxisIter); - cmp(regBetweenBatchAndAxisIter, regBetweenBatchAndAxisSize); - jl(l1, T_NEAR); - mov(regBetweenBatchAndAxisIter, 0); - if (shiftFirst) { - uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vmmSpecIdxSizeB); - vpandn(vDstShifts, vAux0, vmmSpecIdxSizeB); - uni_vpaddd(vAux1, vAux1, vDstShifts); - } else { - vpandn(vAux0, vAux1, vmmSpecIdxSizeB); - uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vAux0); - } - L(l1); + if (jcp.batchDims > 0lu) { + Xbyak::Label l1; + inc(regBetweenBatchAndAxisIter); + cmp(regBetweenBatchAndAxisIter, regBetweenBatchAndAxisSize); + jl(l1, T_NEAR); + mov(regBetweenBatchAndAxisIter, 0); + if (shiftFirst) { + uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vmmSpecIdxSizeB); + vpandn(vDstShifts, vAux0, vmmSpecIdxSizeB); + uni_vpaddd(vAux1, vAux1, vDstShifts); + } else { + vpandn(vAux0, vAux1, vmmSpecIdxSizeB); + uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vAux0); } + L(l1); + } - if (shiftFirst) { - uniVpGatherDd(vDstShifts, ptr[regIndices + vAux1], kDstMask); - normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); + if (shiftFirst) { + uniVpGatherDd(vDstShifts, ptr[regIndices + vAux1], kDstMask); + normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - if (jcp.beforeAxisSize != 1lu) { - vpandn(vAux0, vAux0, vmmAxisAndAfterAxisSizeB); - uni_vpaddd(vAux0, vAux0, vmmSrcBeforeAxisSumB); - uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); + if (jcp.beforeAxisSize != 1lu) { + vpandn(vAux0, vAux0, vmmAxisAndAfterAxisSizeB); + uni_vpaddd(vAux0, vAux0, vmmSrcBeforeAxisSumB); + uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); - uni_vpaddd(vDstShifts, vDstShifts, vAux0); - } + uni_vpaddd(vDstShifts, vDstShifts, vAux0); } + } L(lExit); } @@ -451,81 +485,81 @@ void jitUniGatherKernel::calcSrcShiftLong(Vmm* vAuxPool, bool add(regIdxIter, vlen); cmp(regIdxIter, regSpecIdxSizeB); jge(lIdxStride, T_NEAR); + if (jcp.batchDims > 0lu) { + uni_vpaddd(vDstShifts, vmmIdxBatchSumB, vmmSpecIdxB); + uni_vmovd(reg32Aux1, xmmAuxContainer[vDstShifts.getIdx()]); + } else { + uni_vmovd(reg32Aux1, xmmSpecIdxB); + } + vmovdqu64(vDstShifts, ptr[regIndices + regAux1]); + normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); + if (jcp.beforeAxisSize != 1lu) + uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); + jmp(lExit, T_NEAR); + L(lIdxStride); + sub(regIdxIter, regSpecIdxSizeB); + vpcmpeqd(kDstMask, vDstShifts, vDstShifts); + if (shiftFirst) { + vpcmpd(kAuxMask1, vmmSpecIdxSizeB, vmmSpecIdxB, 2); // 2 -> LE if (jcp.batchDims > 0lu) { - uni_vpaddd(vDstShifts, vmmIdxBatchSumB, vmmSpecIdxB); - uni_vmovd(reg32Aux1, xmmAuxContainer[vDstShifts.getIdx()]); + uni_vpaddd(vAux1, vmmIdxBatchSumB, vmmSpecIdxB); + uni_vpsubd(vAux1 | kAuxMask1, vAux1, vmmSpecIdxSizeB); } else { - uni_vmovd(reg32Aux1, xmmSpecIdxB); + uni_vmovups(vAux1, vmmSpecIdxB); + uni_vpsubd(vAux1 | kAuxMask1, vmmSpecIdxB, vmmSpecIdxSizeB); } - vmovdqu64(vDstShifts, ptr[regIndices + regAux1]); - normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - if (jcp.beforeAxisSize != 1lu) - uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); - jmp(lExit, T_NEAR); - L(lIdxStride); - sub(regIdxIter, regSpecIdxSizeB); - vpcmpeqd(kDstMask, vDstShifts, vDstShifts); - if (shiftFirst) { - vpcmpd(kAuxMask1, vmmSpecIdxSizeB, vmmSpecIdxB, 2); // 2 -> LE - if (jcp.batchDims > 0lu) { - uni_vpaddd(vAux1, vmmIdxBatchSumB, vmmSpecIdxB); - uni_vpsubd(vAux1 | kAuxMask1, vAux1, vmmSpecIdxSizeB); - } else { - uni_vmovups(vAux1, vmmSpecIdxB); - uni_vpsubd(vAux1 | kAuxMask1, vmmSpecIdxB, vmmSpecIdxSizeB); - } - uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vmmSpecIdxSizeB); + uni_vpsubd(vmmSpecIdxB, vmmSpecIdxB, vmmSpecIdxSizeB); + } else { + if (jcp.batchDims > 0lu) { + uni_vpaddd(vAux0, vmmIdxBatchSumB, vmmSpecIdxB); + uniVpGatherDd(vDstShifts, ptr[regIndices + vAux0], kDstMask); } else { - if (jcp.batchDims > 0lu) { - uni_vpaddd(vAux0, vmmIdxBatchSumB, vmmSpecIdxB); - uniVpGatherDd(vDstShifts, ptr[regIndices + vAux0], kDstMask); - } else { - uniVpGatherDd(vDstShifts, ptr[regIndices + vmmSpecIdxB], kDstMask); - } - normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); + uniVpGatherDd(vDstShifts, ptr[regIndices + vmmSpecIdxB], kDstMask); + } + normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - uni_vpbroadcastd(vAux0, xmmSpecIdxB); - vpcmpd(kAuxMask1, vAux0, vmmSpecIdxB, 2); // 2 -> LE - uni_vpsubd(vmmSpecIdxB | kAuxMask1, vmmSpecIdxB, vmmSpecIdxSizeB); + uni_vpbroadcastd(vAux0, xmmSpecIdxB); + vpcmpd(kAuxMask1, vAux0, vmmSpecIdxB, 2); // 2 -> LE + uni_vpsubd(vmmSpecIdxB | kAuxMask1, vmmSpecIdxB, vmmSpecIdxSizeB); - if (jcp.beforeAxisSize != 1lu) { - uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); - uni_vpaddd(vmmSrcBeforeAxisSumB | kAuxMask1, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); - } + if (jcp.beforeAxisSize != 1lu) { + uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); + uni_vpaddd(vmmSrcBeforeAxisSumB | kAuxMask1, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); } + } - if (jcp.batchDims > 0lu) { - Xbyak::Label l1; - inc(regBetweenBatchAndAxisIter); - cmp(regBetweenBatchAndAxisIter, regBetweenBatchAndAxisSize); - jl(l1, T_NEAR); - mov(regBetweenBatchAndAxisIter, 0); - if (shiftFirst) { - uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vmmSpecIdxSizeB); - uni_vpaddd(vAux1 | kAuxMask1, vAux1, vmmSpecIdxSizeB); - } else { - uni_vpaddd(vmmIdxBatchSumB | kAuxMask1, vmmIdxBatchSumB, vmmSpecIdxSizeB); - } - L(l1); + if (jcp.batchDims > 0lu) { + Xbyak::Label l1; + inc(regBetweenBatchAndAxisIter); + cmp(regBetweenBatchAndAxisIter, regBetweenBatchAndAxisSize); + jl(l1, T_NEAR); + mov(regBetweenBatchAndAxisIter, 0); + if (shiftFirst) { + uni_vpaddd(vmmIdxBatchSumB, vmmIdxBatchSumB, vmmSpecIdxSizeB); + uni_vpaddd(vAux1 | kAuxMask1, vAux1, vmmSpecIdxSizeB); + } else { + uni_vpaddd(vmmIdxBatchSumB | kAuxMask1, vmmIdxBatchSumB, vmmSpecIdxSizeB); } + L(l1); + } - if (shiftFirst) { - uniVpGatherDd(vDstShifts, ptr[regIndices + vAux1], kDstMask); - normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); + if (shiftFirst) { + uniVpGatherDd(vDstShifts, ptr[regIndices + vAux1], kDstMask); + normalizeRawIndices(vDstShifts, kDstMask, kAuxMask0); - if (jcp.beforeAxisSize != 1lu) { - uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); - uni_vpaddd(vDstShifts | kAuxMask1, vDstShifts, vmmAxisAndAfterAxisSizeB); - uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); - } + if (jcp.beforeAxisSize != 1lu) { + uni_vpaddd(vDstShifts, vDstShifts, vmmSrcBeforeAxisSumB); + uni_vpaddd(vDstShifts | kAuxMask1, vDstShifts, vmmAxisAndAfterAxisSizeB); + uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); } + } L(lExit); } template void jitUniGatherKernel::calcSrcShiftLongBlock(Vmm* vAuxPool, bool shiftFirst) { - // Most likely there will no significant performance gain vs memcpy in reference implementation on big blocks after axis, - // therefore no time was invested to this case yet. + // Most likely there will no significant performance gain vs memcpy in reference implementation on big blocks after + // axis, therefore no time was invested to this case yet. OPENVINO_THROW("Unsupported case."); } @@ -541,7 +575,8 @@ void jitUniGatherKernel::calcSrcShiftShort(Vmm* vAuxPool, bool shiftFirst) if (jcp.beforeAxisSize != 1lu) uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmBeforeAxDiffB); // No sense to permute if specIdxSize is one of {1, 2, 4, 8, 16}. 0 is reserved for dynamic case. - if (jcp.specIdxSize != 1 && jcp.specIdxSize != 2 && jcp.specIdxSize != 4 && jcp.specIdxSize != 8 && jcp.specIdxSize != 16) { + if (jcp.specIdxSize != 1 && jcp.specIdxSize != 2 && jcp.specIdxSize != 4 && jcp.specIdxSize != 8 && + jcp.specIdxSize != 16) { vpermd(vmmSpecIdxB, vmmPermIdxMask, vmmSpecIdxB); if (jcp.beforeAxisSize != 1lu) vpermd(vmmBeforeAxDiffB, vmmPermIdxMask, vmmBeforeAxDiffB); @@ -588,7 +623,8 @@ void jitUniGatherKernel::calcSrcShiftShortBlock(Vmm* vAuxPool, bool shiftFi normWithUpperBound(vmmSpecIdxB, vmmSpecIdxSizeB, kAuxMask0); } // No sense to permute if afterAxisSize is one of {1, 2, 4, 8, 16}. 0 is reserved for dynamic case. - if (jcp.afterAxisSize != 1 && jcp.afterAxisSize != 2 && jcp.afterAxisSize != 4 && jcp.afterAxisSize != 8 && jcp.afterAxisSize != 16) { + if (jcp.afterAxisSize != 1 && jcp.afterAxisSize != 2 && jcp.afterAxisSize != 4 && jcp.afterAxisSize != 8 && + jcp.afterAxisSize != 16) { vpermd(vmmAfterAxisIdxB, vmmAfterAxisPermMask, vmmAfterAxisIdxB); if (jcp.specIdxSize != 1) vpermd(vmmSpecIdxDiff, vmmAfterAxisPermMask, vmmSpecIdxDiff); @@ -600,33 +636,33 @@ void jitUniGatherKernel::calcSrcShiftShortBlock(Vmm* vAuxPool, bool shiftFi uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmBeforeAxDiffB); uni_vmovups(vAux1, vmmSrcBeforeAxisSumB); if (specIdxAndAfterAxisSize != 1 && specIdxAndAfterAxisSize != 2 && specIdxAndAfterAxisSize != 4 && - specIdxAndAfterAxisSize != 8 && specIdxAndAfterAxisSize != 16) + specIdxAndAfterAxisSize != 8 && specIdxAndAfterAxisSize != 16) vpermd(vmmBeforeAxDiffB, vmmBeforeAxPermMask, vmmBeforeAxDiffB); } else { Xbyak::Label lBeforeAxStep, lBeforeAxStepEnd; add(rSpecIdxAndAfterAxIterB, idxElPerVec * jcp.dataTypeSize); cmp(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); jl(lBeforeAxStep, T_NEAR); - sub(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); - - vpmulld(vAux0, vmmSpecIdxB, vmmAfterAxisSize); - uni_vpaddd(vAux0, vAux0, vmmAfterAxisIdxB); - Xbyak::Xmm& xAux0 = xmmAuxContainer[vAux0.getIdx()]; - uni_vpbroadcastd(vAux1, xAux0); - if (isa == x64::avx512_core) { - Xbyak::Opmask kMask0 = Xbyak::Opmask(kAuxMask0.getIdx()); - vpcmpgtd(kMask0, vAux1, vAux0); - uni_vmovups(vAux1, vmmSrcBeforeAxisSumB); - uni_vpaddd(vAux1 | kMask0, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); - } else { - vpcmpgtd(vAux1, vAux1, vAux0); - vpand(vAux1, vAux1, vmmAxisAndAfterAxisSizeB); - uni_vpaddd(vAux1, vmmSrcBeforeAxisSumB, vAux1); - } - uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); - jmp(lBeforeAxStepEnd); - L(lBeforeAxStep); + sub(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); + + vpmulld(vAux0, vmmSpecIdxB, vmmAfterAxisSize); + uni_vpaddd(vAux0, vAux0, vmmAfterAxisIdxB); + Xbyak::Xmm& xAux0 = xmmAuxContainer[vAux0.getIdx()]; + uni_vpbroadcastd(vAux1, xAux0); + if (isa == x64::avx512_core) { + Xbyak::Opmask kMask0 = Xbyak::Opmask(kAuxMask0.getIdx()); + vpcmpgtd(kMask0, vAux1, vAux0); uni_vmovups(vAux1, vmmSrcBeforeAxisSumB); + uni_vpaddd(vAux1 | kMask0, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); + } else { + vpcmpgtd(vAux1, vAux1, vAux0); + vpand(vAux1, vAux1, vmmAxisAndAfterAxisSizeB); + uni_vpaddd(vAux1, vmmSrcBeforeAxisSumB, vAux1); + } + uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); + jmp(lBeforeAxStepEnd); + L(lBeforeAxStep); + uni_vmovups(vAux1, vmmSrcBeforeAxisSumB); L(lBeforeAxStepEnd); } } else { @@ -648,10 +684,10 @@ void jitUniGatherKernel::calcSrcShiftShortBlock(Vmm* vAuxPool, bool shiftFi add(rSpecIdxAndAfterAxIterB, idxElPerVec * jcp.dataTypeSize); cmp(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); jl(lBeforeAxStepEnd1, T_NEAR); - sub(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); + sub(rSpecIdxAndAfterAxIterB, rSpecIdxAndAfterAxSizeB); cmp(rSpecIdxAndAfterAxIterB, 0); jne(lBeforeAxStepEnd1, T_NEAR); - uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); + uni_vpaddd(vmmSrcBeforeAxisSumB, vmmSrcBeforeAxisSumB, vmmAxisAndAfterAxisSizeB); L(lBeforeAxStepEnd1); } } @@ -689,15 +725,15 @@ void jitUniGatherKernel::process(bool isShortIdx, bool blocked) { Xbyak::Label lTailProc, lEndProc; cmp(regWorkAmount, dataElPerVec); jl(lTailProc, T_NEAR); - if (jcp.dataTypeSize == 4) - process32b(isShortIdx, blocked); - else if (jcp.dataTypeSize == 2) - process16b(isShortIdx, blocked); - else if (jcp.dataTypeSize == 1) - process8b(isShortIdx, blocked); + if (jcp.dataTypeSize == 4) + process32b(isShortIdx, blocked); + else if (jcp.dataTypeSize == 2) + process16b(isShortIdx, blocked); + else if (jcp.dataTypeSize == 1) + process8b(isShortIdx, blocked); jmp(lEndProc, T_NEAR); L(lTailProc); - tail(isShortIdx, false, blocked); + tail(isShortIdx, false, blocked); L(lEndProc); } @@ -735,11 +771,11 @@ void jitUniGatherKernel::process16b(bool isShortIdx, bool blocked) { if (isa == x64::avx512_core) { vPermMask = vmmAuxContainer[7]; vShufMask = vmmAuxContainer[8]; - vBuff0 = vmmAuxContainer[9]; + vBuff0 = vmmAuxContainer[9]; } else { vPermMask = vmmAuxContainer[1]; vShufMask = vmmAuxContainer[4]; - vBuff0 = vmmAuxContainer[5]; + vBuff0 = vmmAuxContainer[5]; } mov(regAux1, reinterpret_cast(shufMask16bitUni)); @@ -799,13 +835,13 @@ void jitUniGatherKernel::process8b(bool isShortIdx, bool blocked) { if (isa == x64::avx512_core) { vPermMask = vmmAuxContainer[7]; vShufMask = vmmAuxContainer[8]; - vBuff0 = vmmAuxContainer[9]; - vBuff1 = vmmAuxContainer[10]; + vBuff0 = vmmAuxContainer[9]; + vBuff1 = vmmAuxContainer[10]; } else { vPermMask = vmmAuxContainer[1]; vShufMask = vmmAuxContainer[4]; - vBuff0 = vmmAuxContainer[5]; - vBuff1 = vmmAuxContainer[6]; + vBuff0 = vmmAuxContainer[5]; + vBuff1 = vmmAuxContainer[6]; } mov(regAux1, reinterpret_cast(shufMask8bitUni)); uni_vmovups(vShufMask, ptr[regAux1]); @@ -951,24 +987,30 @@ void jitUniGatherKernel::tail(bool isShortIdx, bool shiftFirst, bool blocke } template <> -void jitUniGatherKernel::fillRestWorkMask(Vmask& kDstMask, Vmm& vmmAux, const Xbyak::Reg64& rWorkRest, - const Xbyak::Reg64& rAux0, const Xbyak::Reg64& rAux1) { +void jitUniGatherKernel::fillRestWorkMask(Vmask& kDstMask, + Vmm& vmmAux, + const Xbyak::Reg64& rWorkRest, + const Xbyak::Reg64& rAux0, + const Xbyak::Reg64& rAux1) { Xbyak::Label lKmov; Xbyak::Reg32 rOnes(rAux1.getIdx()); mov(rOnes, 0x0000FFFF); cmp(rWorkRest, idxElPerVec); jge(lKmov); - Xbyak::Reg8 rShift(Xbyak::Operand::CL); - mov(rShift, idxElPerVec); - sub(rShift, rWorkRest); - shr(rOnes, rShift); + Xbyak::Reg8 rShift(Xbyak::Operand::CL); + mov(rShift, idxElPerVec); + sub(rShift, rWorkRest); + shr(rOnes, rShift); L(lKmov); kmovw(kDstMask, rOnes); } template <> -void jitUniGatherKernel::fillRestWorkMask(Vmask& kDstMask, Vmm& vAux, const Xbyak::Reg64& rWorkRest, - const Xbyak::Reg64& rAux0, const Xbyak::Reg64& rAux1) { +void jitUniGatherKernel::fillRestWorkMask(Vmask& kDstMask, + Vmm& vAux, + const Xbyak::Reg64& rWorkRest, + const Xbyak::Reg64& rAux0, + const Xbyak::Reg64& rAux1) { Xbyak::Label lEnd; mov(rAux0, rWorkRest); Xbyak::Reg32 rOnes(rAux1.getIdx()); @@ -990,7 +1032,10 @@ void jitUniGatherKernel::fillRestWorkMask(Vmask& kDstMask, Vmm& vAux, } template -void jitUniGatherKernel::storeVectorPart(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rToStoreCounter, Vmm& vmmSrc, Vmm& vAux) { +void jitUniGatherKernel::storeVectorPart(const Xbyak::Reg64& rDst, + const Xbyak::Reg64& rToStoreCounter, + Vmm& vmmSrc, + Vmm& vAux) { Xbyak::Label lEnd; Xbyak::Xmm xAux(vAux.getIdx()); for (size_t j = 0; j < vlen / vlenXmm; j++) { @@ -1025,7 +1070,7 @@ void jitUniGatherKernel::fillVlenVector() { template <> void jitUniGatherKernel::fillVlenVector() { vpcmpeqd(vmmVecLenB, vmmVecLenB, vmmVecLenB); - vpsrld(vmmVecLenB, vmmVecLenB, 31); // Right shift to 1. + vpsrld(vmmVecLenB, vmmVecLenB, 31); // Right shift to 1. uni_vpslld(vmmVecLenB, vmmVecLenB, 5); // Left shift to 32. } @@ -1047,5 +1092,5 @@ bool jitUniGatherKernel::isSupportedConfiguration(uint64_t afterAxisSize) { template struct jitUniGatherKernel; template struct jitUniGatherKernel; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.hpp index 765efb17d091e2..de8cda30d06499 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/gather_uni_kernel.hpp @@ -19,12 +19,11 @@ // 1 | X | X | X | X | X | X | //-------------------------------------------------------------- - #pragma once -#include "jit_kernel_base.hpp" #include "cpu/x64/jit_generator.hpp" #include "dnnl_types.h" +#include "jit_kernel_base.hpp" namespace ov { namespace intel_cpu { @@ -71,8 +70,8 @@ struct gatherJitExecArgs { }; struct jitGatherKernelBase { - void (*ker_)(const gatherJitExecArgs *); - void operator()(const gatherJitExecArgs *args) { + void (*ker_)(const gatherJitExecArgs*); + void operator()(const gatherJitExecArgs* args) { assert(ker_); ker_(args); } @@ -120,8 +119,10 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: bool isSupportedConfiguration(uint64_t afterAxisSize) override; protected: - using Vmm = typename dnnl::impl::utils::conditional::type; - using Vmask = typename dnnl::impl::utils::conditional::type; + using Vmm = + typename dnnl::impl::utils::conditional::type; + using Vmask = + typename dnnl::impl::utils::conditional::type; static const uint32_t vlenXmm = dnnl::impl::cpu::x64::cpu_isa_traits::vlen; static const uint32_t indicesTypeSize = sizeof(uint32_t); static const uint8_t idxTypeShift = 2; @@ -155,7 +156,8 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: // Masks pool. Do not use k0 with gather instruction! Vmask masksContainer[8] = {Vmask(0), Vmask(1), Vmask(2), Vmask(3), Vmask(4), Vmask(5), Vmask(6), Vmask(7)}; // Auxiliary pool. - Vmm vmmAuxContainer[12] = {Vmm(0), Vmm(1), Vmm(2), Vmm(3), Vmm(4), Vmm(5), Vmm(6), /*AVX5*/ Vmm(16), Vmm(17), Vmm(18), Vmm(19), Vmm(20)}; + Vmm vmmAuxContainer[12] = + {Vmm(0), Vmm(1), Vmm(2), Vmm(3), Vmm(4), Vmm(5), Vmm(6), /*AVX5*/ Vmm(16), Vmm(17), Vmm(18), Vmm(19), Vmm(20)}; // Common. Vmm vmmZeros = Vmm(7); Vmm vmmSrcBeforeAxisSumB = Vmm(8); @@ -165,13 +167,13 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: Vmm vmmAxisAndAfterAxisSizeB = Vmm(12); // Only short. - Vmm vmmSrcAfterBatchSizeB = Vmm(13); - Vmm vmmPermIdxMask = Vmm(14); + Vmm vmmSrcAfterBatchSizeB = Vmm(13); + Vmm vmmPermIdxMask = Vmm(14); Vmm& vmmBeforeAxDiffB = vmmAxisAndAfterAxisSizeB; // Blocked short. Vmm& vmmSpecIdxDiff = vmmAuxContainer[4]; Vmm& vmmAfterAxisSize = vmmAuxContainer[5]; - Vmm vmmAfterAxisIdxB = Vmm(15); + Vmm vmmAfterAxisIdxB = Vmm(15); Vmm& vmmAfterAxisPermMask = vmmPermIdxMask; Vmm& vmmBeforeAxPermMask = vmmAuxContainer[6]; // Only long. @@ -179,13 +181,13 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: Vmm vmmIdxBatchSumB = Vmm(14); // XMM - Xbyak::Xmm xmmAuxContainer[6] = {Xbyak::Xmm(0), Xbyak::Xmm(1), Xbyak::Xmm(2), Xbyak::Xmm(3), Xbyak::Xmm(4), Xbyak::Xmm(16)}; + Xbyak::Xmm xmmAuxContainer[6] = + {Xbyak::Xmm(0), Xbyak::Xmm(1), Xbyak::Xmm(2), Xbyak::Xmm(3), Xbyak::Xmm(4), Xbyak::Xmm(16)}; Xbyak::Xmm xmmZeros = Xbyak::Xmm(vmmZeros.getIdx()); Xbyak::Xmm xmmSrcBeforeAxisSum = Xbyak::Xmm(vmmSrcBeforeAxisSumB.getIdx()); Xbyak::Xmm xmmSpecIdxSizeB = Xbyak::Xmm(vmmSpecIdxSizeB.getIdx()); Xbyak::Xmm xmmSpecIdxB = Xbyak::Xmm(vmmSpecIdxB.getIdx()); - void calcSrcShiftLong(Vmm* vAuxPool, bool shiftFirst = true); void calcSrcShiftLongBlock(Vmm* vAuxPool, bool shiftFirst = true); void calcSrcShiftShort(Vmm* vAuxPool, bool shiftFirst = true); @@ -199,7 +201,11 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: // Aux functions. void normalizeRawIndices(Vmm& rawIndices, Vmask& dstMask, Vmask& aux); void normWithUpperBound(Vmm& vTarget, Vmm& vMax, Vmask& kAuxMask); - void fillRestWorkMask(Vmask& kMask, Vmm& vAux, const Xbyak::Reg64& rWorkRest, const Xbyak::Reg64& rAux0, const Xbyak::Reg64& rAux1); + void fillRestWorkMask(Vmask& kMask, + Vmm& vAux, + const Xbyak::Reg64& rWorkRest, + const Xbyak::Reg64& rAux0, + const Xbyak::Reg64& rAux1); void storeVectorPart(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rToStoreCounter, Vmm& vmmSrc, Vmm& vAux); void uniVpGatherDd(Vmm& vDst, const Xbyak::Address& srcAddr, Vmask& vMask); void fillVlenVector(); @@ -208,5 +214,5 @@ struct jitUniGatherKernel : public jitGatherKernelBase, public dnnl::impl::cpu:: const unsigned* permMask16bitUni; }; -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.cpp index d91688689b86c0..908de00cbb0534 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.cpp @@ -13,8 +13,8 @@ namespace kernel { #define GET_OFF(field) offsetof(GridSamplesKernelExecArgs, field) template -GridSampleKernel::GridSampleKernel(const GridSampleKernelConfParams& jcp) : - GridSampleKernelBase(jit_name(), jcp, isa) { +GridSampleKernel::GridSampleKernel(const GridSampleKernelConfParams& jcp) + : GridSampleKernelBase(jit_name(), jcp, isa) { vlen = x64::cpu_isa_traits::vlen; dataTypeSize = jcp.inDataPrc.size(); gridTypeSize = jcp.gridPrc.size(); @@ -39,15 +39,15 @@ void GridSampleKernel::generate() { this->preamble(); registersPool = RegistersPool::create(isa, {rax, rcx, rsp, rdi, k0}); - regSrc = getReg64(); + regSrc = getReg64(); regGrid = getReg64(); - regDst = getReg64(); + regDst = getReg64(); regSrcChannelStepB = getReg64(); regDstChannelStepB = getReg64(); - mov(regSrc, ptr[regParams + GET_OFF(src)]); + mov(regSrc, ptr[regParams + GET_OFF(src)]); mov(regGrid, ptr[regParams + GET_OFF(grid)]); - mov(regDst, ptr[regParams + GET_OFF(dst)]); + mov(regDst, ptr[regParams + GET_OFF(dst)]); mov(regSrcChannelStepB, ptr[regParams + GET_OFF(srcChannelStepB)]); mov(regDstChannelStepB, ptr[regParams + GET_OFF(dstChannelStepB)]); @@ -82,7 +82,7 @@ void GridSampleKernel::initVectors() { if (one_of(jcp.interpolationMode, GridSampleInterpolationMode::BICUBIC, GridSampleInterpolationMode::BILINEAR)) { vOnesF = getVmm(); - mov(r32Aux, 0x3f800000); // 1.f + mov(r32Aux, 0x3f800000); // 1.f vpbroadcastd(vOnesF, r32Aux); } @@ -96,11 +96,11 @@ void GridSampleKernel::initVectors() { uni_vpbroadcastd(vHDenormCoefF, ptr[rAux]); } else { vHalfF = getVmm(); - mov(r32Aux, 0x3f000000); // 0.5f + mov(r32Aux, 0x3f000000); // 0.5f vpbroadcastd(vHalfF, r32Aux); } - static const unsigned gridPermMask[16] = { 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15 }; + static const unsigned gridPermMask[16] = {0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15}; mov(rAux, reinterpret_cast(gridPermMask)); vGridPermMask = getVmm(); uni_vmovups(vGridPermMask, ptr[rAux]); @@ -141,24 +141,24 @@ void GridSampleKernel::initVectors() { if (jcp.interpolationMode == GridSampleInterpolationMode::BICUBIC) { vConst_0_75 = getVmm(); - mov(r32Aux, 0xbf400000); // -0.75f + mov(r32Aux, 0xbf400000); // -0.75f vpbroadcastd(vConst_0_75, r32Aux); vConst_1_25 = getVmm(); - mov(r32Aux, 0x3fa00000); // 1.25f + mov(r32Aux, 0x3fa00000); // 1.25f vpbroadcastd(vConst_1_25, r32Aux); vConst_1_50 = getVmm(); - mov(r32Aux, 0x3fc00000); // 1.5f + mov(r32Aux, 0x3fc00000); // 1.5f vpbroadcastd(vConst_1_50, r32Aux); vConst_2_00 = getVmm(); - mov(r32Aux, 0x40000000); // 2.0f + mov(r32Aux, 0x40000000); // 2.0f vpbroadcastd(vConst_2_00, r32Aux); vConst_2_25 = getVmm(); - mov(r32Aux, 0x40100000); // 2.25f + mov(r32Aux, 0x40100000); // 2.25f vpbroadcastd(vConst_2_25, r32Aux); } } -template // Works for AVX2, AVX, SSE41 +template // Works for AVX2, AVX, SSE41 void GridSampleKernel::initVectors() { auto rAux = getReg64(); @@ -167,9 +167,10 @@ void GridSampleKernel::initVectors() { uni_vmovups(vSrcWidthF, ptr[rAux]); if (one_of(jcp.interpolationMode, GridSampleInterpolationMode::BILINEAR, GridSampleInterpolationMode::NEAREST) || - (jcp.interpolationMode == GridSampleInterpolationMode::BICUBIC && (jcp.paddingMode == GridSamplePaddingMode::REFLECTION || - (jcp.paddingMode == GridSamplePaddingMode::BORDER && !jcp.alignCorners) || - jcp.paddingMode == GridSamplePaddingMode::ZEROS)) ) { + (jcp.interpolationMode == GridSampleInterpolationMode::BICUBIC && + (jcp.paddingMode == GridSamplePaddingMode::REFLECTION || + (jcp.paddingMode == GridSamplePaddingMode::BORDER && !jcp.alignCorners) || + jcp.paddingMode == GridSamplePaddingMode::ZEROS))) { vSrcHeightF = getVmm(); mov(rAux, ptr[regParams + GET_OFF(srcHeightF)]); uni_vmovups(vSrcHeightF, ptr[rAux]); @@ -184,7 +185,8 @@ void GridSampleKernel::initVectors() { if (jcp.interpolationMode != GridSampleInterpolationMode::BICUBIC) { if (one_of(jcp.paddingMode, GridSamplePaddingMode::BORDER, GridSamplePaddingMode::ZEROS) && - ((isa == x64::avx2 && jcp.interpolationMode == GridSampleInterpolationMode::NEAREST) || one_of(isa, x64::avx, x64::sse41))) { + ((isa == x64::avx2 && jcp.interpolationMode == GridSampleInterpolationMode::NEAREST) || + one_of(isa, x64::avx, x64::sse41))) { vZeros = getVmm(); uni_vpxor(vZeros, vZeros, vZeros); } @@ -193,20 +195,21 @@ void GridSampleKernel::initVectors() { mov(rAux, ptr[regParams + GET_OFF(wDenormCoefF)]); vWDenormCoefF = getVmm(); uni_vmovups(vWDenormCoefF, ptr[rAux]); - if (!(jcp.interpolationMode == GridSampleInterpolationMode::BILINEAR && jcp.paddingMode == GridSamplePaddingMode::ZEROS)) { + if (!(jcp.interpolationMode == GridSampleInterpolationMode::BILINEAR && + jcp.paddingMode == GridSamplePaddingMode::ZEROS)) { mov(rAux, ptr[regParams + GET_OFF(hDenormCoefF)]); vHDenormCoefF = getVmm(); uni_vmovups(vHDenormCoefF, ptr[rAux]); } } else { - static const float halfArr[8] = { 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; + static const float halfArr[8] = {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; mov(rAux, reinterpret_cast(halfArr)); vHalfF = getVmm(); uni_vmovups(vHalfF, ptr[rAux]); } if (isa == x64::avx2 && jcp.interpolationMode == GridSampleInterpolationMode::NEAREST) { - static const unsigned gridPermMask[8] = { 0, 2, 4, 6, 1, 3, 5, 7 }; + static const unsigned gridPermMask[8] = {0, 2, 4, 6, 1, 3, 5, 7}; mov(rAux, reinterpret_cast(gridPermMask)); vGridPermMask = getVmm(); uni_vmovups(vGridPermMask, ptr[rAux]); @@ -214,15 +217,16 @@ void GridSampleKernel::initVectors() { } if (jcp.interpolationMode == GridSampleInterpolationMode::BICUBIC || - (jcp.interpolationMode == GridSampleInterpolationMode::BILINEAR && jcp.paddingMode != GridSamplePaddingMode::ZEROS)) { - static const float onesArr[8] = { 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f }; + (jcp.interpolationMode == GridSampleInterpolationMode::BILINEAR && + jcp.paddingMode != GridSamplePaddingMode::ZEROS)) { + static const float onesArr[8] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; mov(rAux, reinterpret_cast(onesArr)); vOnesF = getVmm(); uni_vmovups(vOnesF, ptr[rAux]); } } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::process() { regWorkAmount = getReg64(); @@ -244,12 +248,12 @@ void GridSampleKernel::process() { spatialLoop(); if (jcp.dynamicShapes) { - add(regSrc, ptr[regParams + GET_OFF(srcBatchStepB)]); + add(regSrc, ptr[regParams + GET_OFF(srcBatchStepB)]); } else { add(regSrc, jcp.srcBatchStepB); } add(regGrid, ptr[regParams + GET_OFF(gridBatchStepB)]); - add(regDst, ptr[regParams + GET_OFF(dstBatchStepB)]); + add(regDst, ptr[regParams + GET_OFF(dstBatchStepB)]); if (jcp.dynamicBatch) { dec(regBatch); @@ -259,7 +263,7 @@ void GridSampleKernel::process() { } } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::spatialLoop() { auto vHCoord = getVmm(); auto vWCoord = getVmm(); @@ -286,7 +290,7 @@ void GridSampleKernel::spatialLoop() { tail(); } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::interpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { if (jcp.interpolationMode == GridSampleInterpolationMode::BILINEAR) { bilinearInterpolation(vWCoord, vHCoord, tail); @@ -297,7 +301,7 @@ void GridSampleKernel::interpolation(const Vmm& vWCoord, const Vmm& vHCoord } } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::tail() { Xbyak::Label lEnd; cmp(regWorkAmount, 0); @@ -311,7 +315,7 @@ void GridSampleKernel::tail() { interpolation(vWCoord, vHCoord, true); if (dataTypeSize > 1) - sal(regWorkAmount, dataTypeShift); // Multiply by source data type size. + sal(regWorkAmount, dataTypeShift); // Multiply by source data type size. add(regDst, regWorkAmount); L(lEnd); @@ -319,15 +323,15 @@ void GridSampleKernel::tail() { template <> void GridSampleKernel::getCoordinates(const Vmm& vHCoord, const Vmm& vWCoord) { - vpermd(vWCoord, vGridPermMask, ptr[regGrid]); // Permute to XXXX.XXXX.YYYY.YYYY - vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component + vpermd(vWCoord, vGridPermMask, ptr[regGrid]); // Permute to XXXX.XXXX.YYYY.YYYY + vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component add(regGrid, vlen); auto vAux = getVmm(); - vpermd(vAux, vGridPermMask, ptr[regGrid]); // Permute to XXXX.XXXX.YYYY.YYYY - vshuff64x2(vWCoord, vWCoord, vAux, 0B01000100); // Extract X component - vshuff64x2(vHCoord, vHCoord, vAux, 0B11100100); // Extract Y component + vpermd(vAux, vGridPermMask, ptr[regGrid]); // Permute to XXXX.XXXX.YYYY.YYYY + vshuff64x2(vWCoord, vWCoord, vAux, 0B01000100); // Extract X component + vshuff64x2(vHCoord, vHCoord, vAux, 0B11100100); // Extract Y component add(regGrid, vlen); } @@ -349,19 +353,19 @@ void GridSampleKernel::getCoordinates(const Vmm& vHCoord, const Vmm& uni_vmovups(vPermMask, ptr[rAux]); } - vpermd(vWCoord, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY - vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component + vpermd(vWCoord, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY + vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component add(regGrid, vlen); - vpermd(vAux, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY - vperm2f128(vWCoord, vWCoord, vAux, 0B00100000); // Extract X component - vperm2f128(vHCoord, vHCoord, vAux, 0B00110000); // Extract Y component + vpermd(vAux, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY + vperm2f128(vWCoord, vWCoord, vAux, 0B00100000); // Extract X component + vperm2f128(vHCoord, vHCoord, vAux, 0B00110000); // Extract Y component add(regGrid, vlen); } -template // Works for AVX, SSE41 +template // Works for AVX, SSE41 void GridSampleKernel::getCoordinates(const Vmm& vHCoord, const Vmm& vWCoord) { auto vAux = getVmm(); Xbyak::Xmm xmmWCoord(vWCoord.getIdx()); @@ -417,12 +421,12 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, auto rAux = getReg64(); mov(rAux, regWorkAmount); - sal(rAux, 0x1); // Multiply by gridShape[3]. + sal(rAux, 0x1); // Multiply by gridShape[3]. cmp(regWorkAmount, dataElPerVec / 2); jl(lRest, T_NEAR); { vpermd(vWCoord, vGridPermMask, ptr[regGrid]); - vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component + vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component add(regGrid, vlen); sub(rAux, dataElPerVec); @@ -433,8 +437,8 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, uni_vmovups((Vmm)vAux | kTailMask, ptr[regGrid]); vpermd(vAux, vGridPermMask, vAux); Xbyak::Ymm ymmAux(vAux.getIdx()); - vshuff64x2(vWCoord, vWCoord, vAux, 0B01000100); // Extract X component - vshuff64x2(vHCoord, vHCoord, vAux, 0B11100100); // Extract Y component + vshuff64x2(vWCoord, vWCoord, vAux, 0B01000100); // Extract X component + vshuff64x2(vHCoord, vHCoord, vAux, 0B11100100); // Extract Y component jmp(lGridShift, T_NEAR); } @@ -443,12 +447,12 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, fillRestWorkMask(kTailMask, rAux); uni_vmovups(vWCoord | kTailMask, ptr[regGrid]); vpermd(vWCoord, vGridPermMask, vWCoord); - vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component + vshuff64x2(vHCoord, vWCoord, vHCoord, 0B11101110); // Extract Y component } L(lGridShift); if (dataTypeSize > 1) - sal(rAux, dataTypeShift); // Multiply by source data type size. + sal(rAux, dataTypeShift); // Multiply by source data type size. add(regGrid, rAux); L(lEnd); @@ -475,36 +479,36 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, const V } mov(rAux, regWorkAmount); - sal(rAux, 0x1); // multiply by gridShape[3] == 2 + sal(rAux, 0x1); // multiply by gridShape[3] == 2 cmp(regWorkAmount, dataElPerVec / 2); jl(lRest, T_NEAR); { - vpermd(vWCoord, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY - vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component + vpermd(vWCoord, vPermMask, ptr[regGrid]); // Permute to XXXX.YYYY + vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component add(regGrid, vlen); sub(rAux, dataElPerVec); cmp(rAux, 0); jle(lEnd, T_NEAR); - auto vAux = getVmm(); + auto vAux = getVmm(); load(vAux, ptr[regGrid], rAux, dataTypeSize); vpermd(vAux, vPermMask, vAux); - vperm2f128(vWCoord, vWCoord, vAux, 0B00100000); // Extract X component - vperm2f128(vHCoord, vHCoord, vAux, 0B00110000); // Extract Y component + vperm2f128(vWCoord, vWCoord, vAux, 0B00100000); // Extract X component + vperm2f128(vHCoord, vHCoord, vAux, 0B00110000); // Extract Y component jmp(lGridShift, T_NEAR); } L(lRest); { load(vWCoord, ptr[regGrid], rAux, dataTypeSize); - vpermd(vWCoord, vPermMask, vWCoord); // Permute to XXXX.YYYY - vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component + vpermd(vWCoord, vPermMask, vWCoord); // Permute to XXXX.YYYY + vperm2f128(vHCoord, vHCoord, vWCoord, 0B00000011); // Extract Y component } L(lGridShift); if (dataTypeSize > 1) - sal(rAux, dataTypeShift); // Multiply by source data type size. + sal(rAux, dataTypeShift); // Multiply by source data type size. add(regGrid, rAux); L(lEnd); @@ -519,7 +523,7 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, const Vm auto rGridRest = getReg64(); mov(rGridRest, regWorkAmount); - sal(rGridRest, 0x1); // multiply by gridShape[3] == 2 + sal(rGridRest, 0x1); // multiply by gridShape[3] == 2 for (size_t i = 0; i < dataElPerVec; i++) { cmp(rGridRest, 0); @@ -566,7 +570,7 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, const auto rAux = getReg64(); mov(rAux, regWorkAmount); - sal(rAux, 0x1); // Multiply by gridShape[3] == 2 + sal(rAux, 0x1); // Multiply by gridShape[3] == 2 cmp(regWorkAmount, dataElPerVec / 2); jl(lRest, T_NEAR); { @@ -584,31 +588,31 @@ void GridSampleKernel::getTailCoordinates(const Vmm& vHCoord, const auto vAux = getVmm(); load(vAux, ptr[regGrid], rAux, dataTypeSize); pshufd(vAux, vAux, 0B11011000); - shufpd(vWCoord, vAux, 0x0); // Extract X component - shufpd(vHCoord, vAux, 0B00000011); // Extract Y component + shufpd(vWCoord, vAux, 0x0); // Extract X component + shufpd(vHCoord, vAux, 0B00000011); // Extract Y component jmp(lGridShift, T_NEAR); L(lHShuf); - shufpd(vHCoord, vHCoord, 0B00000001); // Extract Y component + shufpd(vHCoord, vHCoord, 0B00000001); // Extract Y component jmp(lEnd, T_NEAR); } L(lRest); { load(vWCoord, ptr[regGrid], rAux, dataTypeSize); - pshufd(vWCoord, vWCoord, 0B11011000); // Extract X component - shufpd(vHCoord, vWCoord, 0B00000010); // Extract Y component + pshufd(vWCoord, vWCoord, 0B11011000); // Extract X component + shufpd(vHCoord, vWCoord, 0B00000010); // Extract Y component shufpd(vHCoord, vHCoord, 0B00000001); } L(lGridShift); if (dataTypeSize > 1) - sal(rAux, dataTypeShift); // Multiply by source data type size. + sal(rAux, dataTypeShift); // Multiply by source data type size. add(regGrid, rAux); L(lEnd); } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::denormalizeRawCoordinates(const Vmm& vWCoord, const Vmm& vHCoord) { if (jcp.alignCorners) { if (vWDenormCoefF.isInitialized()) { @@ -640,7 +644,7 @@ void GridSampleKernel::denormalizeRawCoordinates(const Vmm& vWCoord, const halfHolder = getVmm(); vHalfTmp = halfHolder; static const float halfValues[x64::cpu_isa_traits::vlen / sizeof(float)] = - { 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; + {0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f}; mov(rAux, reinterpret_cast(halfValues)); uni_vmovups(vHalfTmp, ptr[rAux]); } @@ -671,14 +675,14 @@ void GridSampleKernel::denormalizeRawCoordinates(const Vmm& vWCoord, const template <> void GridSampleKernel::zerosPaddingW(const Vmask& kDst, const Vmm& vCoord) { - vcmpps(kDst, vCoord, vSrcWidthF, CMP_LT_PS); // vCoord < vUpperBound - vcmpps(kDst | kDst, vZeros, vCoord, CMP_LE_PS); // vCoord >= vZeros + vcmpps(kDst, vCoord, vSrcWidthF, CMP_LT_PS); // vCoord < vUpperBound + vcmpps(kDst | kDst, vZeros, vCoord, CMP_LE_PS); // vCoord >= vZeros } template <> void GridSampleKernel::zerosPaddingH(const Vmask& kDst, const Vmm& vCoord, const Vmask& kMaskW) { - vcmpps(kDst | kMaskW, vCoord, vSrcHeightF, CMP_LT_PS); // vCoord < vUpperBound - vcmpps(kDst | kDst, vZeros, vCoord, CMP_LE_PS); // vCoord >= vZeros + vcmpps(kDst | kMaskW, vCoord, vSrcHeightF, CMP_LT_PS); // vCoord < vUpperBound + vcmpps(kDst | kDst, vZeros, vCoord, CMP_LE_PS); // vCoord >= vZeros } template <> @@ -692,7 +696,7 @@ void GridSampleKernel::zerosPaddingW(const Vmask& kDst, const Vmm& v auto vAux = getVmm(); if (vSrcWidthF.isInitialized()) { - uni_vcmpps(vAux, vWCoord, vSrcWidthF, CMP_LT_PS); // vWCoord < vSrcWidthF + uni_vcmpps(vAux, vWCoord, vSrcWidthF, CMP_LT_PS); // vWCoord < vSrcWidthF } else { auto rAux = getReg64(); mov(rAux, ptr[regParams + GET_OFF(srcWidthF)]); @@ -700,8 +704,8 @@ void GridSampleKernel::zerosPaddingW(const Vmask& kDst, const Vmm& v } uni_vpxor(kDst, kDst, kDst); - uni_vcmpps(kDst, kDst, vWCoord, CMP_LE_PS); // vWCoord >= vZeros - uni_vpand(kDst, kDst, vAux); // vZeros <= vWCoord < vSrcWidthF + uni_vcmpps(kDst, kDst, vWCoord, CMP_LE_PS); // vWCoord >= vZeros + uni_vpand(kDst, kDst, vAux); // vZeros <= vWCoord < vSrcWidthF } template <> @@ -709,18 +713,18 @@ void GridSampleKernel::zerosPaddingH(const Vmask& kDst, const Vmm& v auto vAux = getVmm(); if (vSrcHeightF.isInitialized()) { - uni_vcmpps(vAux, vHCoord, vSrcHeightF, CMP_LT_PS); // vHCoord < vSrcHeightF + uni_vcmpps(vAux, vHCoord, vSrcHeightF, CMP_LT_PS); // vHCoord < vSrcHeightF } else { auto rAux = getReg64(); mov(rAux, ptr[regParams + GET_OFF(srcHeightF)]); - uni_vcmpps(vAux, vHCoord, ptr[rAux], CMP_LT_PS); // vHCoord < vSrcHeightF + uni_vcmpps(vAux, vHCoord, ptr[rAux], CMP_LT_PS); // vHCoord < vSrcHeightF } uni_vmovups(kDst, kMaskW); - uni_vpand(kDst, kDst, vAux); // vHCoord < vSrcHeightF && vZeros <= vWCoord < vSrcWidthF + uni_vpand(kDst, kDst, vAux); // vHCoord < vSrcHeightF && vZeros <= vWCoord < vSrcWidthF uni_vpxor(vAux, vAux, vAux); - uni_vcmpps(vAux, vAux, vHCoord, CMP_LE_PS); // vHCoord >= vZeros - uni_vpand(kDst, kDst, vAux); // vZeros <= vHCoord < vSrcHeightF && vZeros <= vWCoord < vSrcWidthF + uni_vcmpps(vAux, vAux, vHCoord, CMP_LE_PS); // vHCoord >= vZeros + uni_vpand(kDst, kDst, vAux); // vZeros <= vHCoord < vSrcHeightF && vZeros <= vWCoord < vSrcWidthF } template <> @@ -729,7 +733,7 @@ void GridSampleKernel::zerosPadding(const Vmask& kDst, const Vmm& vH zerosPaddingH(kDst, vHCoord, kDst); } -template // Works for AVX2, AVX +template // Works for AVX2, AVX void GridSampleKernel::zerosPaddingW(const Vmask& kDst, const Vmm& vCoord) { auto vAux = getVmm(); Vmm vZerosTmp; @@ -743,18 +747,18 @@ void GridSampleKernel::zerosPaddingW(const Vmask& kDst, const Vmm& vCoord) } if (vSrcWidthF.isInitialized()) { - uni_vcmpps(vAux, vCoord, vSrcWidthF, CMP_LT_PS); // vWCoord < vSrcWidthF + uni_vcmpps(vAux, vCoord, vSrcWidthF, CMP_LT_PS); // vWCoord < vSrcWidthF } else { auto rAux = getReg64(); mov(rAux, ptr[regParams + GET_OFF(srcWidthF)]); uni_vcmpps(vAux, vCoord, ptr[rAux], CMP_LT_PS); // vWCoord < vSrcWidthF } - uni_vcmpps(kDst, vZerosTmp, vCoord, CMP_LE_PS); // vWCoord >= vZeros - uni_vandps(kDst, kDst, vAux); // vZeros <= vWCoord < vSrcWidthF + uni_vcmpps(kDst, vZerosTmp, vCoord, CMP_LE_PS); // vWCoord >= vZeros + uni_vandps(kDst, kDst, vAux); // vZeros <= vWCoord < vSrcWidthF } -template // Works for AVX2, AVX +template // Works for AVX2, AVX void GridSampleKernel::zerosPaddingH(const Vmask& kDst, const Vmm& vCoord, const Vmask& kMaskW) { auto vAux = getVmm(); Vmm vZerosTmp; @@ -768,19 +772,19 @@ void GridSampleKernel::zerosPaddingH(const Vmask& kDst, const Vmm& vCoord, } if (vSrcHeightF.isInitialized()) { - uni_vcmpps(vAux, vCoord, vSrcHeightF, CMP_LT_PS); // vHCoord < vSrcHeightF + uni_vcmpps(vAux, vCoord, vSrcHeightF, CMP_LT_PS); // vHCoord < vSrcHeightF } else { auto rAux = getReg64(); mov(rAux, ptr[regParams + GET_OFF(srcHeightF)]); - uni_vcmpps(vAux, vCoord, ptr[rAux], CMP_LT_PS); // vHCoord < vSrcHeightF + uni_vcmpps(vAux, vCoord, ptr[rAux], CMP_LT_PS); // vHCoord < vSrcHeightF } uni_vandps(kDst, kMaskW, vAux); - uni_vcmpps(vAux, vZerosTmp, vCoord, CMP_LE_PS); // vHCoord >= vZeros + uni_vcmpps(vAux, vZerosTmp, vCoord, CMP_LE_PS); // vHCoord >= vZeros uni_vandps(kDst, kDst, vAux); } -template // Works for AVX2, AVX +template // Works for AVX2, AVX void GridSampleKernel::zerosPadding(const Vmask& kDst, const Vmm& vHCoord, const Vmm& vWCoord) { bool releaseZeroVec = false; if (!vZeros.isInitialized()) { @@ -799,11 +803,14 @@ void GridSampleKernel::zerosPadding(const Vmask& kDst, const Vmm& vHCoord, template <> void GridSampleKernel::borderPadding(const Vmm& vCoordDst, const Vmm& vCoordOrigin, const coord dim) { - vrangeps(vCoordDst, vCoordOrigin, dim == coord::w ? vSrcWidthSub1F : vSrcHeightSub1F, 0x0); // vWCoord >= vSrcWidthF - vrangeps(vCoordDst, vCoordDst, vZeros, 0x1); // vWCoord < vZeros + vrangeps(vCoordDst, + vCoordOrigin, + dim == coord::w ? vSrcWidthSub1F : vSrcHeightSub1F, + 0x0); // vWCoord >= vSrcWidthF + vrangeps(vCoordDst, vCoordDst, vZeros, 0x1); // vWCoord < vZeros } -template // Works for AVX2, AVX, SSE41 +template // Works for AVX2, AVX, SSE41 void GridSampleKernel::borderPadding(const Vmm& vCoordDst, const Vmm& vCoordOrigin, const coord dim) { auto rAux = getReg64(); auto vAux = getVmm(); @@ -836,7 +843,7 @@ void GridSampleKernel::borderPadding(const Vmm& vCoordDst, const Vmm& vCoor uni_vaddps(vCoordDst, vCoordDst, vAux); if (vZeros.isInitialized()) { - uni_vcmpps(vAux, vCoordDst, vZeros, 0x6); // vCoord >= vZeros + uni_vcmpps(vAux, vCoordDst, vZeros, 0x6); // vCoord >= vZeros } else { if (isa == x64::sse41) { if (!vAux1.isInitialized()) { @@ -844,27 +851,29 @@ void GridSampleKernel::borderPadding(const Vmm& vCoordDst, const Vmm& vCoor vSub1F = vAux1; } uni_vpxor(vSub1F, vSub1F, vSub1F); - uni_vcmpps(vAux, vCoordDst, vSub1F, 0x6); // vCoord >= vZeros + uni_vcmpps(vAux, vCoordDst, vSub1F, 0x6); // vCoord >= vZeros } else { uni_vpxor(vAux, vAux, vAux); - uni_vcmpps(vAux, vCoordDst, vAux, 0x6); // vCoord >= vZeros + uni_vcmpps(vAux, vCoordDst, vAux, 0x6); // vCoord >= vZeros } } uni_vandps(vCoordDst, vCoordDst, vAux); } template <> -void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& vCoordOrigin, const coord dim) { +void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, + const Vmm& vCoordOrigin, + const coord dim) { auto vAux = getVmm(); auto kAux = getMask(); const auto& vSrcDimMul2Sub1F = dim == coord::w ? vSrcWidthMul2Sub1F : vSrcHeightMul2Sub1F; if (jcp.alignCorners) { // abs(x) % D21 - uni_vandps(vCoordDst, vCoordOrigin, vAbsMask); // abs(x) + uni_vandps(vCoordDst, vCoordOrigin, vAbsMask); // abs(x) uni_vdivps(vAux, vCoordDst, vSrcDimMul2Sub1F); - uni_vroundps(vAux, vAux, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2Sub1F); // abs(x) % D21 + uni_vroundps(vAux, vAux, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2Sub1F); // abs(x) % D21 // Check that the result does not exceed the divisor. vcmpps(kAux, vSrcDimMul2Sub1F, vCoordDst, CMP_LE_PS); @@ -876,12 +885,12 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, if (vCoordDst.getIdx() != vCoordOrigin.getIdx()) uni_vmovups(vCoordDst, vCoordOrigin); uni_vdivps(vAux, vCoordDst, vSrcDimMul2F); - uni_vroundps(vAux, vAux, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2F); // x % D2 - uni_vaddps(vCoordDst, vCoordDst, vSrcDimMul2F); // x % D2 + D2 + uni_vroundps(vAux, vAux, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2F); // x % D2 + uni_vaddps(vCoordDst, vCoordDst, vSrcDimMul2F); // x % D2 + D2 uni_vdivps(vAux, vCoordDst, vSrcDimMul2F); - uni_vroundps(vAux, vAux, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2F); // (x % D2 + D2) % D2 + uni_vroundps(vAux, vAux, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux, vSrcDimMul2F); // (x % D2 + D2) % D2 // Check that the result does not exceed the divisor. vcmpps(kAux, vSrcDimMul2F, vCoordDst, CMP_LE_PS); @@ -890,13 +899,13 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, } uni_vsubps(vAux, vSrcDimMul2Sub1F, vCoordDst); - vcmpps(kAux, dim == coord::w ? vSrcWidthF : vSrcHeightF, vCoordDst, CMP_LE_PS); // vCoordDst >= vSrcDimF + vcmpps(kAux, dim == coord::w ? vSrcWidthF : vSrcHeightF, vCoordDst, CMP_LE_PS); // vCoordDst >= vSrcDimF uni_vmovups(vCoordDst | kAux, vAux); } -template // Works for AVX2, AVX, SSE41 +template // Works for AVX2, AVX, SSE41 void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& vCoordOrigin, const coord dim) { - auto rAux = getReg64(); + auto rAux = getReg64(); auto vAux0 = getVmm(); auto vAux1 = getVmm(); @@ -904,14 +913,15 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& v // D21 = (Dim - 1) * 2 if (jcp.alignCorners) { // x' = abs(x) % D21 - D21 - static const unsigned absMask[8] = { 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff }; - if (isa ==x64::sse41) { - static const unsigned *absPtr = absMask + (reinterpret_cast(absMask) % 16) / sizeof(unsigned); + static const unsigned absMask[8] = + {0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff}; + if (isa == x64::sse41) { + static const unsigned* absPtr = absMask + (reinterpret_cast(absMask) % 16) / sizeof(unsigned); mov(rAux, reinterpret_cast(absPtr)); } else { mov(rAux, reinterpret_cast(absMask)); } - uni_vandps(vCoordDst, vCoordOrigin, ptr[rAux]); // abs(x) + uni_vandps(vCoordDst, vCoordOrigin, ptr[rAux]); // abs(x) Vmm vMul2Sub1; if (dim == coord::w) { @@ -932,8 +942,8 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& v } } uni_vdivps(vAux0, vCoordDst, vMul2Sub1); - uni_vroundps(vAux0, vAux0, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux0, vMul2Sub1); // abs(x) % D21 + uni_vroundps(vAux0, vAux0, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux0, vMul2Sub1); // abs(x) % D21 // Check that the result does not exceed the divisor. uni_vcmpps(vAux0, vCoordDst, vMul2Sub1, CMP_LT_PS); @@ -942,7 +952,7 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& v uni_vcmpps(vAux0, vAux0, vCoordDst, CMP_LE_PS); uni_vandps(vCoordDst, vCoordDst, vAux0); - uni_vsubps(vAux0, vCoordDst, vMul2Sub1); // abs(x) % D21 - D21 + uni_vsubps(vAux0, vCoordDst, vMul2Sub1); // abs(x) % D21 - D21 } else { // x' = (x % D2 + D2) % D2 - D21 if (vCoordDst.getIdx() != vCoordOrigin.getIdx()) @@ -966,12 +976,12 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& v } } uni_vdivps(vAux0, vCoordOrigin, vMul2); - uni_vroundps(vAux0, vAux0, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux0, vMul2); // x % D2 - uni_vaddps(vCoordDst, vCoordDst, vMul2); // x % D2 + D2 + uni_vroundps(vAux0, vAux0, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux0, vMul2); // x % D2 + uni_vaddps(vCoordDst, vCoordDst, vMul2); // x % D2 + D2 uni_vdivps(vAux0, vCoordDst, vMul2); - uni_vroundps(vAux0, vAux0, 0x3); // Truncation - uni_vfnmadd231ps(vCoordDst, vAux0, vMul2); // (x % D2 + D2) % D2 + uni_vroundps(vAux0, vAux0, 0x3); // Truncation + uni_vfnmadd231ps(vCoordDst, vAux0, vMul2); // (x % D2 + D2) % D2 // Check that the result does not exceed the divisor. uni_vcmpps(vAux0, vCoordDst, vMul2, CMP_LT_PS); @@ -1002,20 +1012,20 @@ void GridSampleKernel::reflectionPadding(const Vmm& vCoordDst, const Vmm& v uni_vcmpps(vAux1, vCoordDst, vSrcWidthF, CMP_LT_PS); // vCoordDst < vUpperBound } else { mov(rAux, ptr[regParams + GET_OFF(srcWidthF)]); - uni_vcmpps(vAux1, vCoordDst, ptr[rAux], CMP_LT_PS); // vCoordDst < vUpperBound + uni_vcmpps(vAux1, vCoordDst, ptr[rAux], CMP_LT_PS); // vCoordDst < vUpperBound } } else { if (vSrcHeightF.isInitialized()) { - uni_vcmpps(vAux1, vCoordDst, vSrcHeightF, CMP_LT_PS); // vCoordDst < vUpperBound + uni_vcmpps(vAux1, vCoordDst, vSrcHeightF, CMP_LT_PS); // vCoordDst < vUpperBound } else { mov(rAux, ptr[regParams + GET_OFF(srcHeightF)]); - uni_vcmpps(vAux1, vCoordDst, ptr[rAux], CMP_LT_PS); // vCoordDst < vUpperBound + uni_vcmpps(vAux1, vCoordDst, ptr[rAux], CMP_LT_PS); // vCoordDst < vUpperBound } } uni_vandps(vCoordDst, vCoordDst, vAux1); uni_vandnps(vAux1, vAux1, vAux0); - uni_vsubps(vCoordDst, vCoordDst, vAux1); // set -x' for vCoordDst >= Dim + uni_vsubps(vCoordDst, vCoordDst, vAux1); // set -x' for vCoordDst >= Dim } template <> @@ -1045,12 +1055,13 @@ void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, c template <> void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, const Vmm& vDDim, const uint8_t idx) { - static const size_t elPerVec = x64::cpu_isa_traits::vlen / sizeof(float);; - static const float const_0_75[elPerVec] = { -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f }; - static const float const_1_25[elPerVec] = { 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f }; - static const float const_1_50[elPerVec] = { 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f }; - static const float const_2_00[elPerVec] = { 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f }; - static const float const_2_25[elPerVec] = { 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f }; + static const size_t elPerVec = x64::cpu_isa_traits::vlen / sizeof(float); + ; + static const float const_0_75[elPerVec] = {-0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f}; + static const float const_1_25[elPerVec] = {1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f}; + static const float const_1_50[elPerVec] = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f}; + static const float const_2_00[elPerVec] = {2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f}; + static const float const_2_25[elPerVec] = {2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f}; auto rAux = getReg64(); @@ -1088,11 +1099,11 @@ void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, const Vm template <> void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, const Vmm& vDDim, const uint8_t idx) { static const size_t elPerVec = x64::cpu_isa_traits::vlen / sizeof(float); - static const float const_0_75[elPerVec] = { -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f }; - static const float const_1_25[elPerVec] = { 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f }; - static const float const_1_50[elPerVec] = { 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f }; - static const float const_2_00[elPerVec] = { 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f }; - static const float const_2_25[elPerVec] = { 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f }; + static const float const_0_75[elPerVec] = {-0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f}; + static const float const_1_25[elPerVec] = {1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f}; + static const float const_1_50[elPerVec] = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f}; + static const float const_2_00[elPerVec] = {2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f}; + static const float const_2_25[elPerVec] = {2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f}; auto rAux = getReg64(); auto vAux = getVmm(); @@ -1136,11 +1147,11 @@ template <> void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, const Vmm& vDDim, const uint8_t idx) { static const size_t elToAllocate = 2 * x64::cpu_isa_traits::vlen / sizeof(float); // Allocation with a margin for address alignment. - static const float c_0_75[elToAllocate] = { -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f }; - static const float c_1_25[elToAllocate] = { 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f }; - static const float c_1_50[elToAllocate] = { 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f }; - static const float c_2_00[elToAllocate] = { 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f }; - static const float c_2_25[elToAllocate] = { 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f }; + static const float c_0_75[elToAllocate] = {-0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f, -0.75f}; + static const float c_1_25[elToAllocate] = {1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f, 1.25f}; + static const float c_1_50[elToAllocate] = {1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f}; + static const float c_2_00[elToAllocate] = {2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f, 2.f}; + static const float c_2_25[elToAllocate] = {2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f, 2.25f}; // Address alignment for XMM. static const float* const_0_75 = c_0_75 + (reinterpret_cast(c_0_75) % 16) / sizeof(float); static const float* const_1_25 = c_1_25 + (reinterpret_cast(c_1_25) % 16) / sizeof(float); @@ -1193,15 +1204,15 @@ void GridSampleKernel::bicubicCoefficients(const Vmm& vCoef, const V } } -template // Works for AVX512, AVX2, AVX, SSE41 +template // Works for AVX512, AVX2, AVX, SSE41 void GridSampleKernel::nearestInterpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { const auto& vSrcShift = vWCoord; - const auto& vAux = vHCoord; - auto kGatherMask = getMask(); - auto kAuxMask = getMask(); + const auto& vAux = vHCoord; + auto kGatherMask = getMask(); + auto kAuxMask = getMask(); - uni_vroundps(vWCoord, vWCoord, 0x0); // Round near - uni_vroundps(vHCoord, vHCoord, 0x0); // Round near + uni_vroundps(vWCoord, vWCoord, 0x0); // Round near + uni_vroundps(vHCoord, vHCoord, 0x0); // Round near bool useMask = false, zeroFill = false; if (jcp.paddingMode == GridSamplePaddingMode::ZEROS) { @@ -1272,15 +1283,15 @@ template <> void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { const auto& vDX = vWCoord; const auto& vDY = vHCoord; - auto shift00 = getVmm(); - auto shift01 = getVmm(); - auto shift10 = getVmm(); - auto shift11 = getVmm(); - auto vAux = getVmm(); + auto shift00 = getVmm(); + auto shift01 = getVmm(); + auto shift10 = getVmm(); + auto shift11 = getVmm(); + auto vAux = getVmm(); RegistersPool::Reg kMask00, kMask01, kMask10, kMask11; - uni_vroundps(shift00, vWCoord, 0x1); // Round floor - uni_vroundps(shift01, vHCoord, 0x1); // Round floor + uni_vroundps(shift00, vWCoord, 0x1); // Round floor + uni_vroundps(shift01, vHCoord, 0x1); // Round floor uni_vsubps(vDX, vWCoord, shift00); uni_vsubps(vDY, vHCoord, shift01); uni_vaddps(shift10, shift00, vOnesF); @@ -1294,10 +1305,10 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor kMask10 = getMask(); kMask11 = getMask(); - zerosPadding(kMask00, shift01, shift00); // (y; x) - zerosPadding(kMask01, shift01, shift10); // (y; x + 1) - zerosPadding(kMask11, shift11, shift10); // (y + 1; x + 1) - zerosPadding(kMask10, shift11, shift00); // (y + 1; x) + zerosPadding(kMask00, shift01, shift00); // (y; x) + zerosPadding(kMask01, shift01, shift10); // (y; x + 1) + zerosPadding(kMask11, shift11, shift10); // (y + 1; x + 1) + zerosPadding(kMask10, shift11, shift00); // (y + 1; x) hwShiftPs2dq(shift00, shift01, shift00, vSrcWidthF); uni_vpaddd(shift01, shift00, vDataTypeSizeB); @@ -1330,8 +1341,8 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor // PER CHANNEL LOOP Xbyak::Label lChannelLoopBegin, lChannelLoopEnd; RegistersPool::Reg rChannel; - auto rSrcTmp = getReg64(); - auto rDstTmp = getReg64(); + auto rSrcTmp = getReg64(); + auto rDstTmp = getReg64(); mov(rSrcTmp, regSrc); mov(rDstTmp, regDst); @@ -1349,11 +1360,11 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor if (jcp.paddingMode == GridSamplePaddingMode::ZEROS) { kmovw(kAuxMask, kMask00); } - gatherdd(vQ0, rSrcTmp, shift00, kAuxMask, useMask, zeroFill); // v00 -> vQ0 + gatherdd(vQ0, rSrcTmp, shift00, kAuxMask, useMask, zeroFill); // v00 -> vQ0 if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vQ0, vQ0); } - uni_vfmsub213ps(vQ0, vDX, vQ0); // q0 = -(v00 - dx * v00) + uni_vfmsub213ps(vQ0, vDX, vQ0); // q0 = -(v00 - dx * v00) // (y; x + 1) if (jcp.paddingMode == GridSamplePaddingMode::ZEROS) { @@ -1363,7 +1374,7 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vAux, vAux); } - uni_vfmsub231ps(vQ0, vAux, vDX); // q0 = -q0 + dx * v01 + uni_vfmsub231ps(vQ0, vAux, vDX); // q0 = -q0 + dx * v01 // (y + 1; x + 1) if (jcp.paddingMode == GridSamplePaddingMode::ZEROS) { @@ -1383,14 +1394,14 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor uni_vcvtdq2ps(vQ1, vQ1); } - uni_vfmsub213ps(vQ1, vDX, vQ1); // q1 = -(v10 - dx * v10) - uni_vfmsub231ps(vQ1, vAux, vDX); // q1 = -q1 + dx * v11 + uni_vfmsub213ps(vQ1, vDX, vQ1); // q1 = -(v10 - dx * v10) + uni_vfmsub231ps(vQ1, vAux, vDX); // q1 = -q1 + dx * v11 // Res = q0 + dy * (q1 - q0) uni_vsubps(vQ1, vQ1, vQ0); uni_vfmadd132ps(vQ1, vQ0, vDY); if (jcp.inDataPrc == ov::element::i32) { - uni_vroundps(vQ1, vQ1, 0x3); // Truncation + uni_vroundps(vQ1, vQ1, 0x3); // Truncation uni_vcvtps2dq(vQ1, vQ1); } @@ -1410,20 +1421,20 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoor } } -template // Works for AVX2, AVX, SSE41 +template // Works for AVX2, AVX, SSE41 void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { auto vWRound = getVmm(); auto vHRound = getVmm(); - auto& vDX = vWCoord; - auto& vDY = vHCoord; - auto vAux = getVmm(); + auto& vDX = vWCoord; + auto& vDY = vHCoord; + auto vAux = getVmm(); Vmm shift00, shift01, shift10, shift11; RegistersPool::Reg shift10Holder, shift11Holder; // For ZEROS padding only. RegistersPool::Reg vMask00, vMask01, vMask10, vMask11; - uni_vroundps(vWRound, vWCoord, 0x1); // Round floor - uni_vroundps(vHRound, vHCoord, 0x1); // Round floor + uni_vroundps(vWRound, vWCoord, 0x1); // Round floor + uni_vroundps(vHRound, vHCoord, 0x1); // Round floor uni_vsubps(vDX, vDX, vWRound); uni_vsubps(vDY, vDY, vHRound); @@ -1444,9 +1455,9 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& useMask = zeroFill = true; { auto rAux = getReg64(); - static const float onesArr[8] = { 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f }; - if (isa ==x64::sse41) { - static const float *onesPtr = onesArr + (reinterpret_cast(onesArr) % 16) / sizeof(float); + static const float onesArr[8] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; + if (isa == x64::sse41) { + static const float* onesPtr = onesArr + (reinterpret_cast(onesArr) % 16) / sizeof(float); mov(rAux, reinterpret_cast(onesPtr)); } else { mov(rAux, reinterpret_cast(onesArr)); @@ -1463,10 +1474,10 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& uni_vaddps(vMask00, vWRound, vAux); uni_vaddps(vAux, vAux, vHRound); - zerosPadding(vMask01, vHRound, vMask00); // (y; x + 1) - zerosPadding(vMask10, vAux, vWRound); // (y + 1; x) - zerosPadding(vMask11, vAux, vMask00); // (y + 1; x + 1) - zerosPadding(vMask00, vHRound, vWRound); // (y; x) + zerosPadding(vMask01, vHRound, vMask00); // (y; x + 1) + zerosPadding(vMask10, vAux, vWRound); // (y + 1; x) + zerosPadding(vMask11, vAux, vMask00); // (y + 1; x + 1) + zerosPadding(vMask00, vHRound, vWRound); // (y; x) hwShiftPs2dq(shift00, vHRound, vWRound, vSrcWidthF); } else if (jcp.paddingMode == GridSamplePaddingMode::BORDER) { @@ -1490,17 +1501,17 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& } auto vGatherMask = getVmm(); - auto vQ0 = getVmm(); - auto vQ1 = getVmm(); + auto vQ0 = getVmm(); + auto vQ1 = getVmm(); // PER CHANNEL LOOP Xbyak::Label lChannelLoopBegin, lChannelLoopEnd; RegistersPool::Reg rChannel; - auto rSrcTmp = getReg64(); - auto rDstTmp = getReg64(); + auto rSrcTmp = getReg64(); + auto rDstTmp = getReg64(); auto rTypeSize = getReg64(); - mov(rSrcTmp, regSrc); - mov(rDstTmp, regDst); + mov(rSrcTmp, regSrc); + mov(rDstTmp, regDst); mov(rTypeSize, ptr[regParams + GET_OFF(dataTypeSize)]); for (uint64_t ch = 0; ch < jcp.cannelNum; ch++) { @@ -1517,12 +1528,17 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& if (jcp.paddingMode == GridSamplePaddingMode::ZEROS && isa == x64::avx2) { uni_vmovups(vGatherMask, vMask00); } - gatherdd(vQ0, rSrcTmp, shift00, (isa == x64::avx2 || !vMask00.isInitialized()) ? vGatherMask : vMask00, useMask, zeroFill); // v00 -> vQ0 + gatherdd(vQ0, + rSrcTmp, + shift00, + (isa == x64::avx2 || !vMask00.isInitialized()) ? vGatherMask : vMask00, + useMask, + zeroFill); // v00 -> vQ0 if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vQ0, vQ0); } if (isa == x64::avx2) { - uni_vfmsub213ps(vQ0, vDX, vQ0); // q0 = -(v00 - dx * v00) + uni_vfmsub213ps(vQ0, vDX, vQ0); // q0 = -(v00 - dx * v00) } else { uni_vmulps(vGatherMask, vQ0, vDX); uni_vsubps(vQ0, vQ0, vGatherMask); @@ -1534,13 +1550,17 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& if (isa == x64::avx2) uni_vmovups(vGatherMask, vMask01); } - gatherdd(vAux, rSrcTmp, jcp.paddingMode != GridSamplePaddingMode::ZEROS ? shift01 : shift10, - (isa == x64::avx2 || !vMask01.isInitialized()) ? vGatherMask : vMask01, useMask, zeroFill); + gatherdd(vAux, + rSrcTmp, + jcp.paddingMode != GridSamplePaddingMode::ZEROS ? shift01 : shift10, + (isa == x64::avx2 || !vMask01.isInitialized()) ? vGatherMask : vMask01, + useMask, + zeroFill); if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vAux, vAux); } if (isa == x64::avx2) { - uni_vfmsub231ps(vQ0, vAux, vDX); // q0 = -q0 + dx * v01 + uni_vfmsub231ps(vQ0, vAux, vDX); // q0 = -q0 + dx * v01 } else { uni_vmulps(vAux, vAux, vDX); uni_vaddps(vQ0, vQ0, vAux); @@ -1556,8 +1576,12 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& if (isa == x64::avx2) uni_vmovups(vGatherMask, vMask11); } - gatherdd(vAux, rSrcTmp, jcp.paddingMode != GridSamplePaddingMode::ZEROS ? shift11 : shift10, - (isa == x64::avx2 || !vMask11.isInitialized()) ? vGatherMask : vMask11, useMask, zeroFill); + gatherdd(vAux, + rSrcTmp, + jcp.paddingMode != GridSamplePaddingMode::ZEROS ? shift11 : shift10, + (isa == x64::avx2 || !vMask11.isInitialized()) ? vGatherMask : vMask11, + useMask, + zeroFill); if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vAux, vAux); } @@ -1568,7 +1592,12 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& if (isa == x64::avx2) uni_vmovups(vGatherMask, vMask10); } - gatherdd(vQ1, rSrcTmp, shift10, (isa == x64::avx2 || !vMask10.isInitialized()) ? vGatherMask : vMask10, useMask, zeroFill); + gatherdd(vQ1, + rSrcTmp, + shift10, + (isa == x64::avx2 || !vMask10.isInitialized()) ? vGatherMask : vMask10, + useMask, + zeroFill); if (jcp.inDataPrc == ov::element::i32) { uni_vcvtdq2ps(vQ1, vQ1); } @@ -1585,13 +1614,13 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& uni_vmovups(vQ1, vGatherMask); } } - uni_vfmsub231ps(vQ1, vAux, vDX); // q1 = -q1 + dx * v11 + uni_vfmsub231ps(vQ1, vAux, vDX); // q1 = -q1 + dx * v11 // Res = q0 + dy * (q1 - q0) uni_vsubps(vQ1, vQ1, vQ0); uni_vfmadd132ps(vQ1, vQ0, vDY); if (jcp.inDataPrc == ov::element::i32) { - uni_vroundps(vQ1, vQ1, 0x3); // Truncation + uni_vroundps(vQ1, vQ1, 0x3); // Truncation uni_vcvtps2dq(vQ1, vQ1); } @@ -1614,27 +1643,27 @@ void GridSampleKernel::bilinearInterpolation(const Vmm& vWCoord, const Vmm& template <> void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { - auto vHTop = getVmm(); - auto vWLeft = getVmm(); - auto vDX = getVmm(); - auto vDY = getVmm(); - auto vXDotProd = getVmm(); + auto vHTop = getVmm(); + auto vWLeft = getVmm(); + auto vDX = getVmm(); + auto vDY = getVmm(); + auto vXDotProd = getVmm(); auto& vYDotProd = vDX; auto vSrcShift0 = getVmm(); - auto vSrcShift = getVmm(); - auto vAux = getVmm(); - auto kAuxMask = getMask(); + auto vSrcShift = getVmm(); + auto vAux = getVmm(); + auto kAuxMask = getMask(); RegistersPool::Reg kMaskH; std::vector> wMasks; - uni_vroundps(vHTop, vHCoord, 0x1); // Round floor - uni_vroundps(vWLeft, vWCoord, 0x1); // Round floor + uni_vroundps(vHTop, vHCoord, 0x1); // Round floor + uni_vroundps(vWLeft, vWCoord, 0x1); // Round floor uni_vsubps(vDY, vHCoord, vHTop); uni_vsubps(vDX, vWCoord, vWLeft); uni_vsubps(vHTop, vHTop, vOnesF); uni_vsubps(vWLeft, vWLeft, vOnesF); - RegistersPool::Reg vCX[4] = {getVmm(), getVmm(), getVmm(), getVmm() }; + RegistersPool::Reg vCX[4] = {getVmm(), getVmm(), getVmm(), getVmm()}; for (int i = 0; i < 4; i++) { bicubicCoefficients(vCX[i], vDX, i); } @@ -1659,8 +1688,8 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord // PER CHANNEL LOOP Xbyak::Label lChannelLoopBegin, lChannelLoopEnd; RegistersPool::Reg rChannel; - auto rSrcTmp = getReg64(); - auto rDstTmp = getReg64(); + auto rSrcTmp = getReg64(); + auto rDstTmp = getReg64(); mov(rSrcTmp, regSrc); mov(rDstTmp, regDst); @@ -1742,7 +1771,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord } if (jcp.inDataPrc == ov::element::i32) { - uni_vroundps(vYDotProd, vYDotProd, 0x3); // Truncation + uni_vroundps(vYDotProd, vYDotProd, 0x3); // Truncation uni_vcvtps2dq(vYDotProd, vYDotProd); } @@ -1762,15 +1791,15 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord } } -template // Works for AVX2, AVX, SSE41 +template // Works for AVX2, AVX, SSE41 void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& vHCoord, bool tail) { - auto vHTop = getVmm(); + auto vHTop = getVmm(); auto vWLeft = getVmm(); - auto vDX = getVmm(); - auto vDY = getVmm(); + auto vDX = getVmm(); + auto vDY = getVmm(); - uni_vroundps(vHTop, vHCoord, 0x1); // Round floor - uni_vroundps(vWLeft, vWCoord, 0x1); // Round floor + uni_vroundps(vHTop, vHCoord, 0x1); // Round floor + uni_vroundps(vWLeft, vWCoord, 0x1); // Round floor uni_vsubps(vDY, vHCoord, vHTop); uni_vsubps(vDX, vWCoord, vWLeft); uni_vsubps(vHTop, vHTop, vOnesF); @@ -1791,7 +1820,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& } auto vW0 = getVmm(), vW1 = getVmm(); - Vmm vW[4] = { vW0, vW1, vHCoord, vWCoord }; + Vmm vW[4] = {vW0, vW1, vHCoord, vWCoord}; for (int w = 0; w < 4; w++) { borderPadding(vW[w], vWLeft, coord::w); if (w < 3) { @@ -1806,7 +1835,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& mov(rAux, ptr[regParams + GET_OFF(srcHeightSub1F)]); uni_vmovups(vSrcHeightSub1F, ptr[rAux]); } - auto vH = getVmm(); + auto vH = getVmm(); size_t bufShift = 0lu; for (int h = 0; h < 4; h++) { @@ -1839,7 +1868,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& } auto vW0 = getVmm(), vW1 = getVmm(); - Vmm vW[4] = { vW0, vW1, vHCoord, vWCoord }; + Vmm vW[4] = {vW0, vW1, vHCoord, vWCoord}; for (int w = 0; w < 4; w++) { reflectionPadding(vW[w], vWLeft, coord::w); if (w < 3) { @@ -1860,7 +1889,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& mov(rAux, ptr[regParams + GET_OFF(srcHeightMul2Sub1F)]); uni_vmovups(vSrcHeightMul2Sub1F, ptr[rAux]); } - auto vH = getVmm(); + auto vH = getVmm(); size_t bufShift = 0lu; for (int h = 0; h < 4; h++) { @@ -1883,7 +1912,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& } else if (jcp.paddingMode == GridSamplePaddingMode::ZEROS) { useMask = zeroFill = true; - RegistersPool::Reg vWMask[4] = { getVmm(), getVmm(), getVmm(), getVmm() }; + RegistersPool::Reg vWMask[4] = {getVmm(), getVmm(), getVmm(), getVmm()}; for (int w = 0; w < 4; w++) { if (w == 0) { zerosPaddingW(vWMask[w], vWLeft); @@ -1933,21 +1962,21 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& vDataTypeSizeB.release(); } - RegistersPool::Reg vCX[4] = { getVmm(), getVmm(), getVmm(), getVmm() }; + RegistersPool::Reg vCX[4] = {getVmm(), getVmm(), getVmm(), getVmm()}; for (int w = 0; w < 4; w++) { bicubicCoefficients(vCX[w], vDX, w); } auto vCY0 = getVmm(), vCY1 = getVmm(); - Vmm vCY[4] = { vCY0, vCY1, vHCoord, vWCoord }; + Vmm vCY[4] = {vCY0, vCY1, vHCoord, vWCoord}; for (int h = 0; h < 4; h++) { bicubicCoefficients(vCY[h], vDY, h); } const auto& vXDotProd = vDX; const auto& vYDotProd = vDY; - auto vSrcShift = getVmm(); + auto vSrcShift = getVmm(); auto kGatherMask = getVmm(); - auto vAux = getVmm(); + auto vAux = getVmm(); // PER CHANNEL LOOP Xbyak::Label lChannelLoopBegin, lChannelLoopEnd; @@ -2003,7 +2032,7 @@ void GridSampleKernel::bicubicInterpolation(const Vmm& vWCoord, const Vmm& } if (jcp.inDataPrc == ov::element::i32) { - uni_vroundps(vYDotProd, vYDotProd, 0x3); // Truncation + uni_vroundps(vYDotProd, vYDotProd, 0x3); // Truncation uni_vcvtps2dq(vYDotProd, vYDotProd); } @@ -2028,7 +2057,7 @@ void GridSampleKernel::dataTypeShiftPs2Dq(const Vmm& vDst, const Vmm& vSrc) if (dataTypeSize == 1) return; - if (isa == x64::avx) { // vpslld works just with XMM for AVX, so use vmulps for YMM + if (isa == x64::avx) { // vpslld works just with XMM for AVX, so use vmulps for YMM auto rAux = getReg64(); static const float val = dataTypeSize; static const float dataTypeSizeArr[8] = {val, val, val, val, val, val, val, val}; @@ -2038,7 +2067,7 @@ void GridSampleKernel::dataTypeShiftPs2Dq(const Vmm& vDst, const Vmm& vSrc) } else { uni_vcvtps2dq(vDst, vSrc); if (dataTypeSize > 1) - uni_vpslld(vDst, vDst, dataTypeShift); // multiply by source data type size. + uni_vpslld(vDst, vDst, dataTypeShift); // multiply by source data type size. } } @@ -2066,7 +2095,7 @@ void GridSampleKernel::hwShiftPs2dq(const Vmm& vDst, const Vmm& vHCoord, co } } - if (isa == x64::avx) { // vpslld works just with XMM for AVX, so use vmulps for YMM + if (isa == x64::avx) { // vpslld works just with XMM for AVX, so use vmulps for YMM if (dataTypeSize > 1) { auto rAux = getReg64(); const float val = dataTypeSize; @@ -2078,7 +2107,7 @@ void GridSampleKernel::hwShiftPs2dq(const Vmm& vDst, const Vmm& vHCoord, co } else { uni_vcvtps2dq(vDst, vDst); if (dataTypeSize > 1) - uni_vpslld(vDst, vDst, dataTypeShift); // multiply by source data type size. + uni_vpslld(vDst, vDst, dataTypeShift); // multiply by source data type size. } } @@ -2086,6 +2115,6 @@ template class GridSampleKernel; template class GridSampleKernel; template class GridSampleKernel; -} // namespace kernel -} // namespace intel_cpu -} // namespace ov +} // namespace kernel +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.hpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.hpp index cb13d62c3509d1..f276580a837bd2 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/grid_sample.hpp @@ -4,9 +4,10 @@ #pragma once -#include "jit_kernel_base.hpp" #include +#include "jit_kernel_base.hpp" + namespace ov { namespace intel_cpu { @@ -20,16 +21,16 @@ class GridSampleKernelBase; #if defined(OPENVINO_ARCH_X86_64) struct GridSampleKernelConfParams { - bool dynamicShapes = false; - bool dynamicBatch = false; + bool dynamicShapes = false; + bool dynamicBatch = false; bool dynamicChannel = false; - bool alignCorners = false; + bool alignCorners = false; GridSampleInterpolationMode interpolationMode = GridSampleInterpolationMode::BILINEAR; GridSamplePaddingMode paddingMode = GridSamplePaddingMode::ZEROS; ov::element::Type inDataPrc; ov::element::Type gridPrc; - uint64_t batchNum = 1lu; - uint64_t cannelNum = 1lu; + uint64_t batchNum = 1lu; + uint64_t cannelNum = 1lu; uint64_t srcBatchStepB = 0lu; }; @@ -37,13 +38,13 @@ struct GridSamplesKernelExecArgs { const void* src; const void* grid; void* dst; - uint64_t batchNum = 1lu; + uint64_t batchNum = 1lu; uint64_t channelsNum = 1lu; const float* srcWidthF; const float* srcHeightF; - uint64_t srcBatchStepB = 0lu; - uint64_t gridBatchStepB = 0lu; - uint64_t dstBatchStepB = 0lu; + uint64_t srcBatchStepB = 0lu; + uint64_t gridBatchStepB = 0lu; + uint64_t dstBatchStepB = 0lu; uint64_t srcChannelStepB = 0lu; uint64_t dstChannelStepB = 0lu; const void* wDenormCoefF; @@ -60,19 +61,21 @@ struct GridSamplesKernelExecArgs { uint64_t workAmount = 0lu; }; -enum coord { - w, h -}; +enum coord { w, h }; -class GridSampleKernelBase: public JitKernelBase { +class GridSampleKernelBase : public JitKernelBase { public: - void (*ker_)(const GridSamplesKernelExecArgs *); - void operator()(const GridSamplesKernelExecArgs *args) { + void (*ker_)(const GridSamplesKernelExecArgs*); + void operator()(const GridSamplesKernelExecArgs* args) { assert(ker_); ker_(args); } - explicit GridSampleKernelBase(const char* name, const GridSampleKernelConfParams& jcp, dnnl::impl::cpu::x64::cpu_isa_t isa) - : JitKernelBase(name, isa), ker_(nullptr), jcp(jcp) {} + explicit GridSampleKernelBase(const char* name, + const GridSampleKernelConfParams& jcp, + dnnl::impl::cpu::x64::cpu_isa_t isa) + : JitKernelBase(name, isa), + ker_(nullptr), + jcp(jcp) {} virtual void create_ker() = 0; uint64_t getVecLen() { @@ -87,7 +90,7 @@ class GridSampleKernelBase: public JitKernelBase { protected: GridSampleKernelConfParams jcp; - uint64_t vlen = 16lu; + uint64_t vlen = 16lu; uint64_t dataTypeSize = 1lu; uint64_t gridTypeSize = 1lu; uint64_t dataElPerVec = 1lu; @@ -104,12 +107,16 @@ class GridSampleKernel : public GridSampleKernelBase { void create_ker() override; void generate() override; - using Vmm = typename dnnl::impl::utils::conditional3::type; - using Vmask = typename dnnl::impl::utils::conditional3::type; + using Vmm = typename dnnl::impl::utils::conditional3::type; + using Vmask = typename dnnl::impl::utils::conditional3::type; private: uint8_t dataTypeShift = 0; @@ -138,23 +145,23 @@ class GridSampleKernel : public GridSampleKernelBase { RegistersPool::Reg vWDenormCoefF; RegistersPool::Reg vHDenormCoefF; RegistersPool::Reg vGridPermMask; - RegistersPool::Reg vDataTypeSizeB; // for ZEROS padding - RegistersPool::Reg vSrcWidthB; // for ZEROS padding + RegistersPool::Reg vDataTypeSizeB; // for ZEROS padding + RegistersPool::Reg vSrcWidthB; // for ZEROS padding - RegistersPool::Reg vSrcHeightSub1F; // for BORDER padding - RegistersPool::Reg vSrcWidthSub1F; // for BORDER padding + RegistersPool::Reg vSrcHeightSub1F; // for BORDER padding + RegistersPool::Reg vSrcWidthSub1F; // for BORDER padding - RegistersPool::Reg vSrcHeightMul2F; // for REFLECTION padding - RegistersPool::Reg vSrcWidthMul2F; // for REFLECTION padding - RegistersPool::Reg vSrcHeightMul2Sub1F; // for REFLECTION padding - RegistersPool::Reg vSrcWidthMul2Sub1F; // for REFLECTION padding - RegistersPool::Reg vAbsMask; // for REFLECTION padding + RegistersPool::Reg vSrcHeightMul2F; // for REFLECTION padding + RegistersPool::Reg vSrcWidthMul2F; // for REFLECTION padding + RegistersPool::Reg vSrcHeightMul2Sub1F; // for REFLECTION padding + RegistersPool::Reg vSrcWidthMul2Sub1F; // for REFLECTION padding + RegistersPool::Reg vAbsMask; // for REFLECTION padding - RegistersPool::Reg vConst_0_75; // for BICUBIC interpolation - RegistersPool::Reg vConst_1_25; // for BICUBIC interpolation - RegistersPool::Reg vConst_1_50; // for BICUBIC interpolation - RegistersPool::Reg vConst_2_00; // for BICUBIC interpolation - RegistersPool::Reg vConst_2_25; // for BICUBIC interpolation + RegistersPool::Reg vConst_0_75; // for BICUBIC interpolation + RegistersPool::Reg vConst_1_25; // for BICUBIC interpolation + RegistersPool::Reg vConst_1_50; // for BICUBIC interpolation + RegistersPool::Reg vConst_2_00; // for BICUBIC interpolation + RegistersPool::Reg vConst_2_25; // for BICUBIC interpolation void initVectors(); void process(); @@ -179,8 +186,8 @@ class GridSampleKernel : public GridSampleKernelBase { void hwShiftPs2dq(const Vmm& vDst, const Vmm& vHCoord, const Vmm& vWCoord, const Vmm& vWidth); }; -#endif // OPENVINO_ARCH_X86_64 +#endif // OPENVINO_ARCH_X86_64 -} // namespace kernel -} // namespace intel_cpu -} // namespace ov +} // namespace kernel +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.cpp index cd8b32d9ad2a38..2eb981007f2217 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.cpp @@ -3,9 +3,10 @@ // #include "jit_kernel.hpp" -#include -#include + #include +#include +#include #include using namespace dnnl::impl; @@ -17,16 +18,16 @@ namespace intel_cpu { namespace { -template +template using registers = std::array, 16>; bool isRegAllocable(int id) { - return id != abi_param1.getIdx() // function argument - && id != Operand::Code::RSP; // stack pointer + return id != abi_param1.getIdx() // function argument + && id != Operand::Code::RSP; // stack pointer } -template -const RegType & reserveReg(jit_kernel::reg_indices & freeRegs, const registers & regs) { +template +const RegType& reserveReg(jit_kernel::reg_indices& freeRegs, const registers& regs) { if (freeRegs.empty()) throw std::runtime_error("No free registers"); const auto idx = freeRegs.back(); @@ -34,8 +35,8 @@ const RegType & reserveReg(jit_kernel::reg_indices & freeRegs, const registers -void freeReg(jit_kernel::reg_indices & freeRegs, const registers & regs, const RegType & reg) { +template +void freeReg(jit_kernel::reg_indices& freeRegs, const registers& regs, const RegType& reg) { const auto idx = reg.getIdx(); // Debug: // auto it = std::find(freeRegs.begin(), freeRegs.end(), idx); @@ -46,105 +47,189 @@ void freeReg(jit_kernel::reg_indices & freeRegs, const registers & regs OPENVINO_THROW("Some register was freed twice"); } -const registers & x64regs() { +const registers& x64regs() { using namespace Xbyak::util; - static const registers _x64regs {{ - rax, rcx, rdx, rbx, - rsp, rbp, rsi, rdi, - r8, r9, r10, r11, - r12, r13, r14, r15, + static const registers _x64regs{{ + rax, + rcx, + rdx, + rbx, + rsp, + rbp, + rsi, + rdi, + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15, }}; return _x64regs; } -const registers & x32regs() { +const registers& x32regs() { using namespace Xbyak::util; - static const registers _x32regs {{ - eax, ecx, edx, ebx, - esp, ebp, esi, edi, - r8d, r9d, r10d, r11d, - r12d, r13d, r14d, r15d, + static const registers _x32regs{{ + eax, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + r8d, + r9d, + r10d, + r11d, + r12d, + r13d, + r14d, + r15d, }}; return _x32regs; } -const registers & x16regs() { +const registers& x16regs() { using namespace Xbyak::util; - static const registers _x16regs {{ - ax, cx, dx, bx, - sp, bp, si, di, - r8w, r9w, r10w, r11w, - r12w, r13w, r14w, r15w, + static const registers _x16regs{{ + ax, + cx, + dx, + bx, + sp, + bp, + si, + di, + r8w, + r9w, + r10w, + r11w, + r12w, + r13w, + r14w, + r15w, }}; return _x16regs; } -const registers & x8regs() { +const registers& x8regs() { using namespace Xbyak::util; - static const registers _x8regs {{ - al, cl, dl, bl, - spl, bpl, sil, dil, - r8b, r9b, r10b, r11b, - r12b, r13b, r14b, r15b, + static const registers _x8regs{{ + al, + cl, + dl, + bl, + spl, + bpl, + sil, + dil, + r8b, + r9b, + r10b, + r11b, + r12b, + r13b, + r14b, + r15b, }}; return _x8regs; } -const registers & xmmregs() { - static const registers _xmmregs {{ - Xbyak::util::xmm0, Xbyak::util::xmm1, Xbyak::util::xmm2, Xbyak::util::xmm3, - Xbyak::util::xmm4, Xbyak::util::xmm5, Xbyak::util::xmm6, Xbyak::util::xmm7, - Xbyak::util::xmm8, Xbyak::util::xmm9, Xbyak::util::xmm10, Xbyak::util::xmm11, - Xbyak::util::xmm12, Xbyak::util::xmm13, Xbyak::util::xmm14, Xbyak::util::xmm15, +const registers& xmmregs() { + static const registers _xmmregs{{ + Xbyak::util::xmm0, + Xbyak::util::xmm1, + Xbyak::util::xmm2, + Xbyak::util::xmm3, + Xbyak::util::xmm4, + Xbyak::util::xmm5, + Xbyak::util::xmm6, + Xbyak::util::xmm7, + Xbyak::util::xmm8, + Xbyak::util::xmm9, + Xbyak::util::xmm10, + Xbyak::util::xmm11, + Xbyak::util::xmm12, + Xbyak::util::xmm13, + Xbyak::util::xmm14, + Xbyak::util::xmm15, }}; return _xmmregs; } -const registers & ymmregs() { - static const registers _ymmregs {{ - Xbyak::util::ymm0, Xbyak::util::ymm1, Xbyak::util::ymm2, Xbyak::util::ymm3, - Xbyak::util::ymm4, Xbyak::util::ymm5, Xbyak::util::ymm6, Xbyak::util::ymm7, - Xbyak::util::ymm8, Xbyak::util::ymm9, Xbyak::util::ymm10, Xbyak::util::ymm11, - Xbyak::util::ymm12, Xbyak::util::ymm13, Xbyak::util::ymm14, Xbyak::util::ymm15, +const registers& ymmregs() { + static const registers _ymmregs{{ + Xbyak::util::ymm0, + Xbyak::util::ymm1, + Xbyak::util::ymm2, + Xbyak::util::ymm3, + Xbyak::util::ymm4, + Xbyak::util::ymm5, + Xbyak::util::ymm6, + Xbyak::util::ymm7, + Xbyak::util::ymm8, + Xbyak::util::ymm9, + Xbyak::util::ymm10, + Xbyak::util::ymm11, + Xbyak::util::ymm12, + Xbyak::util::ymm13, + Xbyak::util::ymm14, + Xbyak::util::ymm15, }}; return _ymmregs; } -const registers & zmmregs() { - static const registers _zmmregs {{ - Xbyak::util::zmm0, Xbyak::util::zmm1, Xbyak::util::zmm2, Xbyak::util::zmm3, - Xbyak::util::zmm4, Xbyak::util::zmm5, Xbyak::util::zmm6, Xbyak::util::zmm7, - Xbyak::util::zmm8, Xbyak::util::zmm9, Xbyak::util::zmm10, Xbyak::util::zmm11, - Xbyak::util::zmm12, Xbyak::util::zmm13, Xbyak::util::zmm14, Xbyak::util::zmm15, +const registers& zmmregs() { + static const registers _zmmregs{{ + Xbyak::util::zmm0, + Xbyak::util::zmm1, + Xbyak::util::zmm2, + Xbyak::util::zmm3, + Xbyak::util::zmm4, + Xbyak::util::zmm5, + Xbyak::util::zmm6, + Xbyak::util::zmm7, + Xbyak::util::zmm8, + Xbyak::util::zmm9, + Xbyak::util::zmm10, + Xbyak::util::zmm11, + Xbyak::util::zmm12, + Xbyak::util::zmm13, + Xbyak::util::zmm14, + Xbyak::util::zmm15, }}; return _zmmregs; } -} // namespace +} // namespace namespace internal { -template<> +template <> ov::element::Type type2precision() { return ov::element::f32; } -template<> +template <> ov::element::Type type2precision() { return ov::element::i32; } -template<> +template <> ov::element::Type type2precision() { return ov::element::bf16; } -template<> +template <> ov::element::Type type2precision() { return ov::element::u8; } -template<> +template <> ov::element::Type type2precision() { return ov::element::i8; } @@ -157,27 +242,24 @@ cpu_isa_t get_current_isa() { return cpu_isa_t::sse41; } -stack_frame::stack_frame(ov::intel_cpu::jit_kernel & kernel, size_t size, uint32_t alignment) - : _kernel(kernel) - , _size(size) - , _alignment(alignment) { +stack_frame::stack_frame(ov::intel_cpu::jit_kernel& kernel, size_t size, uint32_t alignment) + : _kernel(kernel), + _size(size), + _alignment(alignment) { if (_size || _alignment) { if (_size && _alignment == 1) { _kernel.sub(_kernel.rsp, _size); } else { auto tmp = _kernel.var(); tmp = _kernel.rsp; - _kernel.sub(_kernel.rsp, sizeof(size_t) + size); // allocate - _kernel.and_(_kernel.rsp, ~(alignment - 1)); // align - _kernel.mov(_kernel.ptr[_kernel.rsp + size], tmp); // remember previous rsp + _kernel.sub(_kernel.rsp, sizeof(size_t) + size); // allocate + _kernel.and_(_kernel.rsp, ~(alignment - 1)); // align + _kernel.mov(_kernel.ptr[_kernel.rsp + size], tmp); // remember previous rsp } } } -stack_frame::stack_frame(stack_frame && rhs) - : _kernel(rhs._kernel) - , _size(rhs._size) - , _alignment(rhs._alignment) { +stack_frame::stack_frame(stack_frame&& rhs) : _kernel(rhs._kernel), _size(rhs._size), _alignment(rhs._alignment) { rhs._size = 0; rhs._alignment = 0; } @@ -192,25 +274,29 @@ stack_frame::~stack_frame() { } } -const Xbyak::Reg64 & stack_frame::pointer() const { +const Xbyak::Reg64& stack_frame::pointer() const { return _kernel.rsp; } void stack_frame::clear() const { const size_t end = _size & ~(size_t)7u; - _kernel.foreach(0, end, [&](const Reg64 & idx) { - _kernel.mov(_kernel.qword[pointer() + idx], 0); - }, sizeof(size_t)); + _kernel.foreach ( + 0, + end, + [&](const Reg64& idx) { + _kernel.mov(_kernel.qword[pointer() + idx], 0); + }, + sizeof(size_t)); if (end < _size) { - _kernel.foreach(end, _size, [&](const Reg64 & idx) { + _kernel.foreach (end, _size, [&](const Reg64& idx) { _kernel.mov(_kernel.byte[pointer() + idx], 0); }); } } -const void * consts_table::store(const void *data, size_t size) { +const void* consts_table::store(const void* data, size_t size) { if (size > chunk_size) throw std::runtime_error("Data size is too large"); const size_t capacity = _chunks.size() * chunk_size; @@ -218,17 +304,16 @@ const void * consts_table::store(const void *data, size_t size) { _size = _chunks.size() * chunk_size; _chunks.emplace_back(); } - auto & dst = _chunks.back(); + auto& dst = _chunks.back(); const size_t offset = _size % chunk_size; memcpy(&dst[offset], data, size); _size += size; return &dst[offset]; } -} // namespace internal +} // namespace internal -jit_kernel::jit_kernel(const char* name) - : jit_generator(name) { +jit_kernel::jit_kernel(const char* name) : jit_generator(name) { _free_rmmregs.reserve(16); _free_rmmregs.reserve(16); @@ -239,73 +324,73 @@ jit_kernel::jit_kernel(const char* name) } } -template<> -const Reg64 & jit_kernel::reserve() { +template <> +const Reg64& jit_kernel::reserve() { return reserveReg(_free_x64regs, x64regs()); } -template<> -const Reg32 & jit_kernel::reserve() { +template <> +const Reg32& jit_kernel::reserve() { return reserveReg(_free_x64regs, x32regs()); } -template<> -const Reg16 & jit_kernel::reserve() { +template <> +const Reg16& jit_kernel::reserve() { return reserveReg(_free_x64regs, x16regs()); } -template<> -const Reg8 & jit_kernel::reserve() { +template <> +const Reg8& jit_kernel::reserve() { return reserveReg(_free_x64regs, x8regs()); } -template<> -void jit_kernel::free(const Reg64 & reg) { +template <> +void jit_kernel::free(const Reg64& reg) { freeReg(_free_x64regs, x64regs(), reg); } -template<> -void jit_kernel::free(const Reg32 & reg) { +template <> +void jit_kernel::free(const Reg32& reg) { freeReg(_free_x64regs, x32regs(), reg); } -template<> -void jit_kernel::free(const Reg16 & reg) { +template <> +void jit_kernel::free(const Reg16& reg) { freeReg(_free_x64regs, x16regs(), reg); } -template<> -void jit_kernel::free(const Reg8 & reg) { +template <> +void jit_kernel::free(const Reg8& reg) { freeReg(_free_x64regs, x8regs(), reg); } -template<> -const Xmm & jit_kernel::reserve() { +template <> +const Xmm& jit_kernel::reserve() { return reserveReg(_free_rmmregs, xmmregs()); } -template<> -void jit_kernel::free(const Xmm & reg) { +template <> +void jit_kernel::free(const Xmm& reg) { freeReg(_free_rmmregs, xmmregs(), reg); } -template<> -const Ymm & jit_kernel::reserve() { +template <> +const Ymm& jit_kernel::reserve() { return reserveReg(_free_rmmregs, ymmregs()); } -template<> -void jit_kernel::free(const Ymm & reg) { +template <> +void jit_kernel::free(const Ymm& reg) { freeReg(_free_rmmregs, ymmregs(), reg); } -template<> -const Zmm & jit_kernel::reserve() { +template <> +const Zmm& jit_kernel::reserve() { return reserveReg(_free_rmmregs, zmmregs()); } -template<> -void jit_kernel::free(const Zmm & reg) { +template <> +void jit_kernel::free(const Zmm& reg) { freeReg(_free_rmmregs, zmmregs(), reg); } @@ -317,26 +402,33 @@ void jit_kernel::postamble() { } } -const AddressFrame & jit_kernel::address_frame(size_t size) const { - switch (size) { - case 1: return byte; - case 2: return word; - case 4: return dword; - case 8: return qword; - case 16: return xword; - case 32: return yword; - case 64: return zword; - default: - break; - } - return ptr; +const AddressFrame& jit_kernel::address_frame(size_t size) const { + switch (size) { + case 1: + return byte; + case 2: + return word; + case 4: + return dword; + case 8: + return qword; + case 16: + return xword; + case 32: + return yword; + case 64: + return zword; + default: + break; + } + return ptr; } -const jit_kernel::reg_indices & jit_kernel::free_x64regs() const { +const jit_kernel::reg_indices& jit_kernel::free_x64regs() const { return _free_x64regs; } -const jit_kernel::reg_indices & jit_kernel::free_rmmregs() const { +const jit_kernel::reg_indices& jit_kernel::free_rmmregs() const { return _free_rmmregs; } @@ -386,5 +478,5 @@ void jit_kernel::uni_vblendps(const Xbyak::Zmm& z1, const Xbyak::Zmm& z2, uint16 vblendmps(z1 | k1, z1, z2); } -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.hpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.hpp index 8934bf5dff052b..0073ca91d0b76f 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel.hpp @@ -3,14 +3,15 @@ // #pragma once -#include "cpu/x64/jit_generator.hpp" -#include "emitters/plugin/x64/jit_load_store_emitters.hpp" +#include #include -#include #include -#include -#include #include +#include +#include + +#include "cpu/x64/jit_generator.hpp" +#include "emitters/plugin/x64/jit_load_store_emitters.hpp" namespace ov { namespace intel_cpu { @@ -19,113 +20,103 @@ struct jit_kernel; namespace internal { -template +template struct reg_traits_by_size; -template +template struct reg_traits; -template +template struct reg_traits; -template +template struct isa_traits; -template<> +template <> struct reg_traits_by_size<1> { using type = Xbyak::Reg8; - constexpr static size_t size = 1; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; + constexpr static size_t size = 1; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; }; -template<> +template <> struct reg_traits_by_size<2> { using type = Xbyak::Reg16; - constexpr static size_t size = 2; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; + constexpr static size_t size = 2; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; }; -template<> +template <> struct reg_traits_by_size<4> { using type = Xbyak::Reg32; - constexpr static size_t size = 4; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; + constexpr static size_t size = 4; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; }; -template<> +template <> struct reg_traits_by_size<8> { using type = Xbyak::Reg64; - constexpr static size_t size = 8; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; + constexpr static size_t size = 8; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; }; -template<> +template <> struct reg_traits_by_size<16> { using type = Xbyak::Xmm; - constexpr static size_t size = 16; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::sse41; + constexpr static size_t size = 16; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::sse41; }; -template<> +template <> struct reg_traits_by_size<32> { using type = Xbyak::Ymm; - constexpr static size_t size = 32; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::avx2; + constexpr static size_t size = 32; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::avx2; }; -template<> +template <> struct reg_traits_by_size<64> { using type = Xbyak::Zmm; - constexpr static size_t size = 64; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::avx512_core; + constexpr static size_t size = 64; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::avx512_core; }; -template +template struct reg_traits : public reg_traits_by_size {}; -template +template struct vec_min_size { - constexpr static size_t size = N <= 16 ? 16 : - N <= 32 ? 32 : - 64; + constexpr static size_t size = N <= 16 ? 16 : N <= 32 ? 32 : 64; }; -template +template struct reg_traits : public reg_traits_by_size::size> {}; -template<> +template <> struct reg_traits { using type = Xbyak::Fpu; - constexpr static size_t size = 10; // in bytes - constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa - = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; + constexpr static size_t size = 10; // in bytes + constexpr static dnnl::impl::cpu::x64::cpu_isa_t isa = dnnl::impl::cpu::x64::cpu_isa_t::isa_undef; }; -template<> +template <> struct reg_traits : public reg_traits {}; -template<> +template <> struct isa_traits { struct reg { using type = Xbyak::Xmm; - constexpr static size_t size = 4 * 4; // in bytes - constexpr static size_t length = 4; // in dwords + constexpr static size_t size = 4 * 4; // in bytes + constexpr static size_t length = 4; // in dwords }; }; -template<> +template <> struct isa_traits { struct reg { using type = Xbyak::Ymm; - constexpr static size_t size = 8 * 4; // in bytes - constexpr static size_t length = 8; // in dwords + constexpr static size_t size = 8 * 4; // in bytes + constexpr static size_t length = 8; // in dwords }; }; -template<> +template <> struct isa_traits { struct reg { using type = Xbyak::Zmm; @@ -134,39 +125,39 @@ struct isa_traits { }; }; -template +template class variable; -template +template class if_expression; -template +template class then_expression; -template +template using shared_reg = std::shared_ptr; -template -shared_reg make_shared(Reg & reg, jit_kernel & kernel); +template +shared_reg make_shared(Reg& reg, jit_kernel& kernel); -template +template class boolean_expression { public: using reg_type = const typename reg_traits::type; enum class type { - eq, // == - neq, // != - ls, // < - gt, // > - le, // <= - ge // >= + eq, // == + neq, // != + ls, // < + gt, // > + le, // <= + ge // >= }; - boolean_expression(jit_kernel & kernel, type t, const shared_reg & lhs, const shared_reg & rhs); - boolean_expression(jit_kernel & kernel, type t, const shared_reg & lhs, T rhs); + boolean_expression(jit_kernel& kernel, type t, const shared_reg& lhs, const shared_reg& rhs); + boolean_expression(jit_kernel& kernel, type t, const shared_reg& lhs, T rhs); private: - void cmp(const Xbyak::Label & exit) const; + void cmp(const Xbyak::Label& exit) const; - jit_kernel & _kernel; + jit_kernel& _kernel; type _type; shared_reg _lhs; shared_reg _rhs; @@ -176,33 +167,33 @@ class boolean_expression { friend class then_expression; }; -template +template class then_expression { public: - then_expression(if_expression & expr); + then_expression(if_expression& expr); - template - void _else(F && fn); + template + void _else(F&& fn); private: - if_expression & _if_expr; + if_expression& _if_expr; }; -template +template class if_expression { public: - if_expression(const boolean_expression & expr) - : _expr(expr) {} + if_expression(const boolean_expression& expr) : _expr(expr) {} ~if_expression() { try { if (!_is_exit_valid) _expr._kernel.assignL(_exit, _else); - } catch(...) {} + } catch (...) { + } } - template - then_expression _then(F && fn) { + template + then_expression _then(F&& fn) { using namespace Xbyak; _expr.cmp(_else); @@ -214,7 +205,7 @@ class if_expression { } private: - const boolean_expression & _expr; + const boolean_expression& _expr; Xbyak::Label _exit; Xbyak::Label _else; bool _is_exit_valid = false; @@ -222,287 +213,291 @@ class if_expression { friend class then_expression; }; -typedef struct register_tag {} register_tag; -typedef struct memory_tag {} memory_tag; +typedef struct register_tag { +} register_tag; +typedef struct memory_tag { +} memory_tag; -template +template class variable_base; -template +template class variable_base { public: using reg_type = const typename reg_traits::type; - variable_base & operator = (const variable_base &) = delete; + variable_base& operator=(const variable_base&) = delete; - variable_base(const variable_base &); - variable_base(variable_base &&); + variable_base(const variable_base&); + variable_base(variable_base&&); - reg_type & reg() const { - return *_reg; + reg_type& reg() const { + return *_reg; } - const shared_reg & shreg() const { + const shared_reg& shreg() const { return _reg; } - operator reg_type &() const { + operator reg_type&() const { return reg(); } - operator Xbyak::RegExp () const { + operator Xbyak::RegExp() const { return reg(); } protected: - variable_base(jit_kernel & krnl, const shared_reg & reg); + variable_base(jit_kernel& krnl, const shared_reg& reg); ~variable_base() = default; - jit_kernel & _kernel; + jit_kernel& _kernel; shared_reg _reg; }; -template +template class variable_base { public: using reg_type = const typename reg_traits::type; - variable_base & operator = (const variable_base &) = delete; + variable_base& operator=(const variable_base&) = delete; - variable_base(const variable_base &); - variable_base(variable_base &&); + variable_base(const variable_base&); + variable_base(variable_base&&); - reg_type & reg() const { - return *_addr; + reg_type& reg() const { + return *_addr; } protected: - variable_base(jit_kernel & krnl, const shared_reg & addr); + variable_base(jit_kernel& krnl, const shared_reg& addr); ~variable_base() = default; - jit_kernel & _kernel; + jit_kernel& _kernel; shared_reg _addr; }; -template -class variable : public variable_base::value, T>::type, register_tag> { +template +class variable + : public variable_base::value, T>::type, register_tag> { public: using type = T; using base = variable_base; using reg_type = const typename base::reg_type; using arithmetic_type = typename std::conditional::value, size_t, T>::type; - variable(variable &&) = default; - variable(jit_kernel & krnl); - variable(jit_kernel & krnl, const shared_reg & reg); + variable(variable&&) = default; + variable(jit_kernel& krnl); + variable(jit_kernel& krnl, const shared_reg& reg); - typename std::conditional::value - && !std::is_pointer::type>::value, - variable::type, memory_tag>, void>::type - operator *() const { + typename std::conditional::value && + !std::is_pointer::type>::value, + variable::type, memory_tag>, + void>::type + operator*() const { return variable::type, memory_tag>(base::_kernel, base::shreg()); } - const variable & operator = (reg_type & rhs) const { + const variable& operator=(reg_type& rhs) const { base::_kernel.mov(base::reg(), rhs); return *this; } - template - const variable & operator = (U *rhs) const { + template + const variable& operator=(U* rhs) const { // interpret pointers as size_t base::_kernel.mov(base::reg(), reinterpret_cast(rhs)); return *this; } - const variable & operator = (arithmetic_type rhs) const { + const variable& operator=(arithmetic_type rhs) const { base::_kernel.mov(base::reg(), static_cast(rhs)); return *this; } - const variable & operator += (reg_type & rhs) const { + const variable& operator+=(reg_type& rhs) const { base::_kernel.add(base::reg(), rhs); return *this; } - variable operator + (reg_type & rhs) const { + variable operator+(reg_type& rhs) const { variable res(base::_kernel); res = base::reg(); res += rhs; return res; } - const variable & operator += (arithmetic_type rhs) const { + const variable& operator+=(arithmetic_type rhs) const { base::_kernel.add(base::reg(), rhs); return *this; } - variable operator + (arithmetic_type rhs) const { + variable operator+(arithmetic_type rhs) const { variable res(base::_kernel); res = base::reg(); res += rhs; return res; } - const variable & operator -= (reg_type & rhs) const { + const variable& operator-=(reg_type& rhs) const { base::_kernel.sub(base::reg(), rhs); return *this; } - variable operator - (reg_type & rhs) const { + variable operator-(reg_type& rhs) const { variable res(base::_kernel); res = base::reg(); res -= rhs; return res; } - const variable & operator -= (arithmetic_type rhs) const { + const variable& operator-=(arithmetic_type rhs) const { base::_kernel.sub(base::reg(), rhs); return *this; } - variable operator - (arithmetic_type rhs) const { + variable operator-(arithmetic_type rhs) const { variable res(base::_kernel); res = base::reg(); res -= rhs; return res; } - const variable & operator *= (reg_type & rhs) const { + const variable& operator*=(reg_type& rhs) const { base::_kernel.imul(base::reg(), rhs); return *this; } - variable operator * (reg_type & rhs) const { + variable operator*(reg_type& rhs) const { variable res(base::_kernel); res = base::reg(); res *= rhs; return res; } - const variable & operator *= (arithmetic_type rhs) const { + const variable& operator*=(arithmetic_type rhs) const { base::_kernel.imul(base::reg(), base::reg(), static_cast(rhs)); return *this; } - variable operator * (arithmetic_type rhs) const { + variable operator*(arithmetic_type rhs) const { variable res(base::_kernel); res = base::reg(); res *= rhs; return res; } - const variable & operator &= (reg_type & rhs) const { + const variable& operator&=(reg_type& rhs) const { base::_kernel.and_(base::reg(), rhs); return *this; } - variable operator & (reg_type & rhs) const { + variable operator&(reg_type& rhs) const { variable res(base::_kernel); res = base::reg(); res &= rhs; return res; } - const variable & operator &= (T rhs) const { + const variable& operator&=(T rhs) const { base::_kernel.and_(base::reg(), rhs); return *this; } - variable operator & (T rhs) const { + variable operator&(T rhs) const { variable res(base::_kernel); res = base::reg(); res &= rhs; return res; } - const variable & operator |= (reg_type & rhs) const { + const variable& operator|=(reg_type& rhs) const { base::_kernel.or_(base::reg(), rhs); return *this; } - variable operator | (reg_type & rhs) const { + variable operator|(reg_type& rhs) const { variable res(base::_kernel); res = base::reg(); res |= rhs; return res; } - const variable & operator |= (T rhs) const { + const variable& operator|=(T rhs) const { base::_kernel.or_(base::reg(), rhs); return *this; } - variable operator | (T rhs) const { + variable operator|(T rhs) const { variable res(base::_kernel); res = base::reg(); res |= rhs; return res; } - const variable & operator >>= (size_t rhs) const { + const variable& operator>>=(size_t rhs) const { base::_kernel.shr(base::reg(), rhs); return *this; } - variable operator >> (size_t rhs) const { + variable operator>>(size_t rhs) const { variable res(base::_kernel); res = base::reg(); res >>= rhs; return res; } - const variable & operator <<= (size_t rhs) const { + const variable& operator<<=(size_t rhs) const { base::_kernel.shl(base::reg(), rhs); return *this; } - variable operator << (size_t rhs) const { + variable operator<<(size_t rhs) const { variable res(base::_kernel); res = base::reg(); res <<= rhs; return res; } - boolean_expression operator == (const variable & rhs) const { + boolean_expression operator==(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::eq, base::shreg(), rhs.shreg()); } - boolean_expression operator == (T rhs) const { + boolean_expression operator==(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::eq, base::shreg(), rhs); } - boolean_expression operator != (const variable & rhs) const { + boolean_expression operator!=(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::neq, base::shreg(), rhs.shreg()); } - boolean_expression operator != (T rhs) const { + boolean_expression operator!=(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::neq, base::shreg(), rhs); } - boolean_expression operator < (const variable & rhs) const { + boolean_expression operator<(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::ls, base::shreg(), rhs.shreg()); } - boolean_expression operator < (T rhs) const { + boolean_expression operator<(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::ls, base::shreg(), rhs); } - boolean_expression operator > (const variable & rhs) const { + boolean_expression operator>(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::gt, base::shreg(), rhs.shreg()); } - boolean_expression operator > (T rhs) const { + boolean_expression operator>(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::gt, base::shreg(), rhs); } - boolean_expression operator <= (const variable & rhs) const { + boolean_expression operator<=(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::le, base::shreg(), rhs.shreg()); } - boolean_expression operator <= (T rhs) const { + boolean_expression operator<=(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::le, base::shreg(), rhs); } - boolean_expression operator >= (const variable & rhs) const { + boolean_expression operator>=(const variable& rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::ge, base::shreg(), rhs.shreg()); } - boolean_expression operator >= (T rhs) const { + boolean_expression operator>=(T rhs) const { return boolean_expression(base::_kernel, boolean_expression::type::ge, base::shreg(), rhs); } // TODO: add necessary operations }; -template +template class variable : public variable_base { public: using type = T; using base = variable_base; using reg_type = const typename base::reg_type; - variable(variable &&) = default; - variable(jit_kernel & krnl, const shared_reg & reg); + variable(variable&&) = default; + variable(jit_kernel& krnl, const shared_reg& reg); - const variable & operator = (const variable & rhs) const; + const variable& operator=(const variable& rhs) const; }; -template +template class variable : public variable_base { public: using type = T[N]; @@ -510,34 +505,34 @@ class variable : public variable_base { using reg_type = const typename base::reg_type; constexpr static size_t length = N; - variable(variable &&) = default; - variable(jit_kernel & krnl); - variable(jit_kernel & krnl, const shared_reg & reg); + variable(variable&&) = default; + variable(jit_kernel& krnl); + variable(jit_kernel& krnl, const shared_reg& reg); - const variable & operator = (reg_type & rhs) const { + const variable& operator=(reg_type& rhs) const { base::_kernel.uni_vmovups(base::reg(), rhs); return *this; } - const variable & operator = (const type & rhs) const { - const type & cref = base::_kernel.constant(rhs); + const variable& operator=(const type& rhs) const { + const type& cref = base::_kernel.constant(rhs); variable creg(base::_kernel); creg = &cref; base::_kernel.uni_vmovdqu(base::reg(), base::_kernel.ptr[creg]); return *this; } - const variable & blend(reg_type & rhs, uint16_t mask) const { + const variable& blend(reg_type& rhs, uint16_t mask) const { base::_kernel.uni_vblendps(base::reg(), rhs, mask); return *this; } - const variable & permute(const std::array & order) const { + const variable& permute(const std::array& order) const { base::_kernel.uni_vpermps(base::reg(), order.data(), base::reg()); return *this; } - const variable & permute(const uint8_t * order) const { + const variable& permute(const uint8_t* order) const { base::_kernel.uni_vpermps(base::reg(), order, base::reg()); return *this; } @@ -546,139 +541,132 @@ class variable : public variable_base { }; class stack_frame { - stack_frame(const stack_frame &) = delete; - stack_frame & operator = (const stack_frame &) = delete; + stack_frame(const stack_frame&) = delete; + stack_frame& operator=(const stack_frame&) = delete; public: - stack_frame(jit_kernel & kernel, size_t size, uint32_t alignment = 1); - stack_frame(stack_frame && rhs); + stack_frame(jit_kernel& kernel, size_t size, uint32_t alignment = 1); + stack_frame(stack_frame&& rhs); ~stack_frame(); - const Xbyak::Reg64 & pointer() const; + const Xbyak::Reg64& pointer() const; void clear() const; private: - jit_kernel & _kernel; + jit_kernel& _kernel; size_t _size; uint32_t _alignment; }; -template +template ov::element::Type type2precision(); dnnl::impl::cpu::x64::cpu_isa_t get_current_isa(); class consts_table { - consts_table(const consts_table &) = delete; - consts_table & operator = (const consts_table &) = delete; + consts_table(const consts_table&) = delete; + consts_table& operator=(const consts_table&) = delete; public: consts_table() = default; - const void * store(const void *data, size_t size); + const void* store(const void* data, size_t size); private: static constexpr const size_t chunk_size = 512; using chunk = std::array; std::list _chunks; - size_t _size {}; + size_t _size{}; }; -} // namespace internal +} // namespace internal struct jit_kernel : public dnnl::impl::cpu::x64::jit_generator { using reg_indices = std::vector; - template + template using reg_traits = internal::reg_traits; - template + template using reg_traits_by_size = internal::reg_traits_by_size; - template + template using isa_traits = internal::isa_traits; using stack_frame = internal::stack_frame; using register_tag = internal::register_tag; using memory_tag = internal::memory_tag; - template + template using variable = internal::variable; - template + template using if_expression = internal::if_expression; - template + template using boolean_expression = internal::boolean_expression; - template + template Xbyak::Address argPtr(U T::*member) const { auto memPtr = &(reinterpret_cast(0)->*member); - const size_t offs = reinterpret_cast(memPtr) - reinterpret_cast(0); + const size_t offs = reinterpret_cast(memPtr) - reinterpret_cast(0); return address_frame(sizeof(U))[param1 + offs]; } - template + template variable arg(U T::*member) { using traits = internal::reg_traits; using reg_type = typename traits::type; - const auto & res = reserve(); + const auto& res = reserve(); if (sizeof(T) < traits::size) movzx(res, argPtr(member)); else mov(res, argPtr(member)); - return { *this, internal::make_shared(res, *this) }; + return {*this, internal::make_shared(res, *this)}; } - template + template variable arg(U T::*member) { using traits = internal::reg_traits; using reg_type = typename traits::type; - const auto & res = reserve(); + const auto& res = reserve(); if (sizeof(T) < traits::size) movzx(res, argPtr(member)); else mov(res, argPtr(member)); - return { *this, internal::make_shared(res, *this) }; - } - - jit_kernel(const char *name); - - template - const RegType & reserve(); - - template - void free(const RegType & reg); - - template - void copy(const Xbyak::Reg64& dst, - const Xbyak::Reg64& src, - const Xbyak::Reg64& size); - template - void copy(const Xbyak::Address& dst, - const Xbyak::Reg64& src, - const Xbyak::Reg64& size); - - template - void load(const variable & dst, const variable & src, size_t length = N); - template - void load(const variable & dst, const variable & src, const variable & length); - template - void store(const variable & dst, const variable & src, size_t length = N); - template - void store(const variable & dst, const variable & src, const variable & length); - - template - void foreach(const B & begin, - const E & end, - std::function&)> && fn, - const S & step = 1); - - template + return {*this, internal::make_shared(res, *this)}; + } + + jit_kernel(const char* name); + + template + const RegType& reserve(); + + template + void free(const RegType& reg); + + template + void copy(const Xbyak::Reg64& dst, const Xbyak::Reg64& src, const Xbyak::Reg64& size); + template + void copy(const Xbyak::Address& dst, const Xbyak::Reg64& src, const Xbyak::Reg64& size); + + template + void load(const variable& dst, const variable& src, size_t length = N); + template + void load(const variable& dst, const variable& src, const variable& length); + template + void store(const variable& dst, const variable& src, size_t length = N); + template + void store(const variable& dst, const variable& src, const variable& length); + + template + void foreach (const B& begin, const E& end, std::function&)> && fn, const S& step = 1); + + template variable var(); - template - variable var(const T & val); + template + variable var(const T& val); - template - const T & constant(const T & c); - template - const T * constant(const T * c, size_t size); + template + const T& constant(const T& c); + template + const T* constant(const T* c, size_t size); stack_frame stack(size_t size, uint32_t alignment = 1); - template - if_expression _if(const boolean_expression & expr) const; + template + if_expression _if(const boolean_expression& expr) const; void uni_vpermps(const Xbyak::Xmm& x1, const uint8_t mask[4], const Xbyak::Operand& op); void uni_vpermps(const Xbyak::Ymm& y1, const uint8_t mask[8], const Xbyak::Operand& op); @@ -689,9 +677,9 @@ struct jit_kernel : public dnnl::impl::cpu::x64::jit_generator { void postamble(); - const Xbyak::AddressFrame & address_frame(size_t size) const; - const reg_indices & free_x64regs() const; - const reg_indices & free_rmmregs() const; + const Xbyak::AddressFrame& address_frame(size_t size) const; + const reg_indices& free_x64regs() const; + const reg_indices& free_rmmregs() const; private: reg_indices _free_x64regs; @@ -703,44 +691,40 @@ struct jit_kernel : public dnnl::impl::cpu::x64::jit_generator { template <> const Xbyak::Reg64& jit_kernel::reserve(); -template -void jit_kernel::copy(const Xbyak::Reg64& dst, - const Xbyak::Reg64& src, - const Xbyak::Reg64& size) { - const auto & addr_frame = address_frame(sizeof(T)); +template +void jit_kernel::copy(const Xbyak::Reg64& dst, const Xbyak::Reg64& src, const Xbyak::Reg64& size) { + const auto& addr_frame = address_frame(sizeof(T)); auto p = reserve::type>(); - foreach(0, size, [&](const Xbyak::Reg64& idx) { + foreach (0, size, [&](const Xbyak::Reg64& idx) { mov(p, addr_frame[src + idx * sizeof(T)]); mov(addr_frame[dst + idx * sizeof(T)], p); - }); + }) + ; free(p); } -template -void jit_kernel::copy(const Xbyak::Address& dst, - const Xbyak::Reg64& src, - const Xbyak::Reg64& size) { - const auto & addr_frame = address_frame(sizeof(T)); +template +void jit_kernel::copy(const Xbyak::Address& dst, const Xbyak::Reg64& src, const Xbyak::Reg64& size) { + const auto& addr_frame = address_frame(sizeof(T)); auto p = reserve::type>(); auto d = reserve(); lea(d, dst); - foreach(0, size, [&](const Xbyak::Reg64& idx) { + foreach (0, size, [&](const Xbyak::Reg64& idx) { mov(p, addr_frame[src + idx * sizeof(T)]); mov(addr_frame[d + idx * sizeof(T)], p); - }); + }) + ; free(d); free(p); } -template -void jit_kernel::load(const variable & dst, const variable & src, size_t length) { +template +void jit_kernel::load(const variable& dst, const variable& src, size_t length) { static_assert(std::is_same::reg_type, const Xbyak::Reg64>::value, - "Source register must be Reg64"); + "Source register must be Reg64"); - using src_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; - using dst_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; + using src_type = typename std::remove_cv::type>::type; + using dst_type = typename std::remove_cv::type>::type; const std::vector pool_vec_idxs(_free_rmmregs.begin(), _free_rmmregs.end()); const std::vector pool_gpr_idxs(_free_x64regs.begin(), _free_x64regs.end()); @@ -752,17 +736,15 @@ void jit_kernel::load(const variable & dst, const variable & src, if (!_emitters[key]) { _emitters[key].reset(new jit_load_emitter(this, internal::get_current_isa(), src_prc, dst_prc, length)); } - _emitters[key]->emit_code( - { static_cast(static_cast(src).getIdx()) }, - { static_cast(static_cast(dst).getIdx()) }, - pool_vec_idxs, - pool_gpr_idxs); + _emitters[key]->emit_code({static_cast(static_cast(src).getIdx())}, + {static_cast(static_cast(dst).getIdx())}, + pool_vec_idxs, + pool_gpr_idxs); } -template -void jit_kernel::load(const variable & dst, const variable & src, const variable & length) { - using src_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; +template +void jit_kernel::load(const variable& dst, const variable& src, const variable& length) { + using src_type = typename std::remove_cv::type>::type; auto s = stack(N * sizeof(src_type)); s.clear(); @@ -775,15 +757,13 @@ void jit_kernel::load(const variable & dst, const variable & src, load(dst, tmp); } -template -void jit_kernel::store(const variable & dst, const variable & src, size_t length) { +template +void jit_kernel::store(const variable& dst, const variable& src, size_t length) { static_assert(std::is_same::reg_type, const Xbyak::Reg64>::value, - "Destination register must be Reg64"); + "Destination register must be Reg64"); - using src_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; - using dst_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; + using src_type = typename std::remove_cv::type>::type; + using dst_type = typename std::remove_cv::type>::type; const std::vector pool_vec_idxs(_free_rmmregs.begin(), _free_rmmregs.end()); const std::vector pool_gpr_idxs(_free_x64regs.begin(), _free_x64regs.end()); @@ -795,17 +775,15 @@ void jit_kernel::store(const variable & dst, const variable & src if (!_emitters[key]) { _emitters[key].reset(new jit_store_emitter(this, internal::get_current_isa(), src_prc, dst_prc, length)); } - _emitters[key]->emit_code( - { static_cast(static_cast(src).getIdx()) }, - { static_cast(static_cast(dst).getIdx()) }, - pool_vec_idxs, - pool_gpr_idxs); + _emitters[key]->emit_code({static_cast(static_cast(src).getIdx())}, + {static_cast(static_cast(dst).getIdx())}, + pool_vec_idxs, + pool_gpr_idxs); } -template -void jit_kernel::store(const variable & dst, const variable & src, const variable & length) { - using dst_type = typename std::remove_cv< - typename std::remove_pointer::type>::type; +template +void jit_kernel::store(const variable& dst, const variable& src, const variable& length) { + using dst_type = typename std::remove_cv::type>::type; auto s = stack(N * sizeof(dst_type)); @@ -817,11 +795,11 @@ void jit_kernel::store(const variable & dst, const variable & src copy(dst, tmp, length); } -template -void jit_kernel::foreach(const B & begin, - const E & end, - std::function&)> && fn, - const S & step) { +template +void jit_kernel::foreach (const B& begin, + const E& end, + std::function&)> && fn, + const S& step) { using namespace Xbyak; Label loop, exit; @@ -841,36 +819,36 @@ void jit_kernel::foreach(const B & begin, L(exit); } -template +template jit_kernel::variable jit_kernel::var() { using reg_type = typename reg_traits::type; - const auto & reg = reserve(); + const auto& reg = reserve(); return variable(*this, internal::make_shared(reg, *this)); } -template -jit_kernel::variable jit_kernel::var(const T & val) { +template +jit_kernel::variable jit_kernel::var(const T& val) { using reg_type = typename reg_traits::type; - const auto & reg = reserve(); + const auto& reg = reserve(); variable res(*this, internal::make_shared(reg, *this)); res = val; return res; } -template -const T & jit_kernel::constant(const T & c) { +template +const T& jit_kernel::constant(const T& c) { auto res = _consts.store(&c, sizeof c); return *reinterpret_cast(res); } -template -const T * jit_kernel::constant(const T * c, size_t size) { +template +const T* jit_kernel::constant(const T* c, size_t size) { auto res = _consts.store(c, size * sizeof(T)); return reinterpret_cast(res); } -template -jit_kernel::if_expression jit_kernel::_if(const boolean_expression & expr) const { +template +jit_kernel::if_expression jit_kernel::_if(const boolean_expression& expr) const { return if_expression(expr); } @@ -879,12 +857,13 @@ namespace internal { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // shared_reg -template -shared_reg make_shared(Reg & reg, jit_kernel & kernel) { - std::shared_ptr ptr(®, [&kernel](Reg *preg) { +template +shared_reg make_shared(Reg& reg, jit_kernel& kernel) { + std::shared_ptr ptr(®, [&kernel](Reg* preg) { try { kernel.free(*preg); - } catch(...) {} + } catch (...) { + } }); return ptr; } @@ -892,68 +871,68 @@ shared_reg make_shared(Reg & reg, jit_kernel & kernel) { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // boolean_expression -template -boolean_expression::boolean_expression(jit_kernel & kernel, type t, const shared_reg & lhs, const shared_reg & rhs) - : _kernel(kernel) - , _type(t) - , _lhs(lhs) - , _rhs(rhs) - , _rvalue {} { -} - -template -boolean_expression::boolean_expression(jit_kernel & kernel, type t, const shared_reg & lhs, T rhs) - : _kernel(kernel) - , _type(t) - , _lhs(lhs) - , _rvalue(rhs) { -} - -template -void boolean_expression::cmp(const Xbyak::Label & exit) const { +template +boolean_expression::boolean_expression(jit_kernel& kernel, + type t, + const shared_reg& lhs, + const shared_reg& rhs) + : _kernel(kernel), + _type(t), + _lhs(lhs), + _rhs(rhs), + _rvalue{} {} + +template +boolean_expression::boolean_expression(jit_kernel& kernel, type t, const shared_reg& lhs, T rhs) + : _kernel(kernel), + _type(t), + _lhs(lhs), + _rvalue(rhs) {} + +template +void boolean_expression::cmp(const Xbyak::Label& exit) const { if (_rhs) _kernel.cmp(*_lhs, *_rhs); else _kernel.cmp(*_lhs, _rvalue); switch (_type) { - case type::eq: { - _kernel.jne(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } - case type::neq: { - _kernel.je(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } - case type::ls: { - _kernel.jge(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } - case type::gt: { - _kernel.jle(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } - case type::le: { - _kernel.jg(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } - case type::ge: { - _kernel.jl(exit, Xbyak::CodeGenerator::T_NEAR); - break; - } + case type::eq: { + _kernel.jne(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } + case type::neq: { + _kernel.je(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } + case type::ls: { + _kernel.jge(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } + case type::gt: { + _kernel.jle(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } + case type::le: { + _kernel.jg(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } + case type::ge: { + _kernel.jl(exit, Xbyak::CodeGenerator::T_NEAR); + break; + } } } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // then_expression -template -then_expression::then_expression(if_expression & expr) - : _if_expr(expr) {} +template +then_expression::then_expression(if_expression& expr) : _if_expr(expr) {} -template -template -void then_expression::_else(F && fn) { +template +template +void then_expression::_else(F&& fn) { fn(); _if_expr._expr._kernel.L(_if_expr._exit); _if_expr._is_exit_valid = true; @@ -962,75 +941,57 @@ void then_expression::_else(F && fn) { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // variable -template -variable_base::variable_base(jit_kernel & krnl, const shared_reg & reg) - : _kernel(krnl) - , _reg(reg) { -} +template +variable_base::variable_base(jit_kernel& krnl, const shared_reg& reg) + : _kernel(krnl), + _reg(reg) {} -template -variable_base::variable_base(const variable_base & rhs) - : _kernel(rhs._kernel) - , _reg(rhs._reg) { -} +template +variable_base::variable_base(const variable_base& rhs) : _kernel(rhs._kernel), + _reg(rhs._reg) {} -template -variable_base::variable_base(variable_base && rhs) - : _kernel(rhs._kernel) - , _reg(std::move(rhs._reg)) { -} +template +variable_base::variable_base(variable_base&& rhs) : _kernel(rhs._kernel), + _reg(std::move(rhs._reg)) {} -template -variable_base::variable_base(jit_kernel & krnl, const shared_reg & addr) - : _kernel(krnl) - , _addr(addr) { -} +template +variable_base::variable_base(jit_kernel& krnl, const shared_reg& addr) + : _kernel(krnl), + _addr(addr) {} -template -variable_base::variable_base(const variable_base & rhs) - : _kernel(rhs._kernel) - , _addr(rhs._addr) { -} +template +variable_base::variable_base(const variable_base& rhs) : _kernel(rhs._kernel), + _addr(rhs._addr) {} -template -variable_base::variable_base(variable_base && rhs) - : _kernel(rhs._kernel) - , _addr(std::move(rhs._addr)) { -} +template +variable_base::variable_base(variable_base&& rhs) : _kernel(rhs._kernel), + _addr(std::move(rhs._addr)) {} -template -variable::variable(jit_kernel & krnl) - : base(krnl, make_shared(krnl.reserve::type>(), krnl)) { -} +template +variable::variable(jit_kernel& krnl) + : base(krnl, make_shared(krnl.reserve::type>(), krnl)) {} -template -variable::variable(jit_kernel & krnl, const shared_reg & reg) - : base(krnl, reg) { -} +template +variable::variable(jit_kernel& krnl, const shared_reg& reg) : base(krnl, reg) {} -template -variable::variable(jit_kernel & krnl, const shared_reg & reg) - : base(krnl, reg) { -} +template +variable::variable(jit_kernel& krnl, const shared_reg& reg) : base(krnl, reg) {} -template -const variable & variable::operator = (const variable & rhs) const { - const auto & addr_frame = base::_kernel.address_frame(sizeof(T)); +template +const variable& variable::operator=(const variable& rhs) const { + const auto& addr_frame = base::_kernel.address_frame(sizeof(T)); base::_kernel.mov(addr_frame[base::reg()], rhs); return *this; } -template -variable::variable(jit_kernel & krnl) - : base(krnl, make_shared(krnl.reserve::type>(), krnl)) { -} +template +variable::variable(jit_kernel& krnl) + : base(krnl, make_shared(krnl.reserve::type>(), krnl)) {} -template -variable::variable(jit_kernel & krnl, const shared_reg & reg) - : base(krnl, reg) { -} +template +variable::variable(jit_kernel& krnl, const shared_reg& reg) : base(krnl, reg) {} -} // namespace internal +} // namespace internal -} // namespace intel_cpu -} // namespace ov +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.cpp index 8fd3a966e13887..ffc0286431b279 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.cpp @@ -10,14 +10,11 @@ namespace ov { namespace intel_cpu { namespace kernel { -JitKernelBase::JitKernelBase(const char* name, x64::cpu_isa_t isa) - : x64::jit_generator(name, isa), m_isa(isa) { +JitKernelBase::JitKernelBase(const char* name, x64::cpu_isa_t isa) : x64::jit_generator(name, isa), m_isa(isa) { vlen = x64::isa_max_vlen(isa); } -void JitKernelBase::uni_vfmsub132ps(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vfmsub132ps(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vfmsub132ps(v_dst, v_src, op); } else if (isValidIsa(x64::avx)) { @@ -31,9 +28,7 @@ void JitKernelBase::uni_vfmsub132ps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vfnmadd132ps(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vfnmadd132ps(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vfnmadd132ps(v_dst, v_src, op); } else if (isValidIsa(x64::avx)) { @@ -48,9 +43,7 @@ void JitKernelBase::uni_vfnmadd132ps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vfmsub231ps(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vfmsub231ps(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vfmsub231ps(v_dst, v_src, op); } else if (isValidIsa(x64::avx)) { @@ -65,9 +58,7 @@ void JitKernelBase::uni_vfmsub231ps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vpaddd(const Xbyak::Ymm& v_dst, - const Xbyak::Ymm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vpaddd(const Xbyak::Ymm& v_dst, const Xbyak::Ymm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpaddd(v_dst, v_src, op); } else if (isValidIsa(x64::avx)) { @@ -99,9 +90,7 @@ void JitKernelBase::uni_vpaddd(const Xbyak::Ymm& v_dst, } } -void JitKernelBase::uni_vpaddq(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vpaddq(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpaddq(v_dst, v_src, op); } else { @@ -112,9 +101,7 @@ void JitKernelBase::uni_vpaddq(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vpsubd(const Xbyak::Ymm& v_dst, - const Xbyak::Ymm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vpsubd(const Xbyak::Ymm& v_dst, const Xbyak::Ymm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpsubd(v_dst, v_src, op); } else if (isValidIsa(x64::avx)) { @@ -146,9 +133,7 @@ void JitKernelBase::uni_vpsubd(const Xbyak::Ymm& v_dst, } } -void JitKernelBase::uni_vsubpd(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vsubpd(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vsubpd(v_dst, v_src, op); } else { @@ -159,9 +144,7 @@ void JitKernelBase::uni_vsubpd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vmulpd(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vmulpd(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vmulpd(v_dst, v_src, op); } else { @@ -172,9 +155,7 @@ void JitKernelBase::uni_vmulpd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vpmuludq(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vpmuludq(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpmuludq(v_dst, v_src, op); } else { @@ -185,9 +166,7 @@ void JitKernelBase::uni_vpmuludq(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vdivps(const Xbyak::Xmm& v_dst, - const Xbyak::Operand& op1, - const Xbyak::Operand& op2) { +void JitKernelBase::uni_vdivps(const Xbyak::Xmm& v_dst, const Xbyak::Operand& op1, const Xbyak::Operand& op2) { if (isValidIsa(x64::avx)) { vdivps(v_dst, op1, op2); } else { @@ -198,9 +177,7 @@ void JitKernelBase::uni_vdivps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vdivpd(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& v_src, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vdivpd(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vdivpd(v_dst, v_src, op); } else { @@ -211,9 +188,7 @@ void JitKernelBase::uni_vdivpd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vandps(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& vSrs, - const Xbyak::Operand &op) { +void JitKernelBase::uni_vandps(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& vSrs, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vandps(v_dst, vSrs, op); } else { @@ -224,9 +199,7 @@ void JitKernelBase::uni_vandps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vandnps(const Xbyak::Xmm& v_dst, - const Xbyak::Xmm& vSrs, - const Xbyak::Operand &op) { +void JitKernelBase::uni_vandnps(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& vSrs, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vandnps(v_dst, vSrs, op); } else { @@ -237,9 +210,9 @@ void JitKernelBase::uni_vandnps(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, - const Xbyak::Reg64& rSrcPtr, - const Xbyak::Xmm& vSrcShift, +void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, + const Xbyak::Reg64& rSrcPtr, + const Xbyak::Xmm& vSrcShift, const Xbyak::Opmask& kReadMask, const bool useMask, const bool zeroFill) { @@ -254,17 +227,18 @@ void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, vpgatherdd(v_dst | kReadMask, ptr[rSrcPtr + vSrcShift]); } -void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, +void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, const Xbyak::Reg64& rSrcPtr, - const Xbyak::Xmm& vSrcShift, - const Xbyak::Xmm& vReadMask, + const Xbyak::Xmm& vSrcShift, + const Xbyak::Xmm& vReadMask, const bool useMask, const bool zeroFill) { - if (v_dst.getIdx() == vSrcShift.getIdx() || v_dst.getIdx() == vReadMask.getIdx() || vSrcShift.getIdx() == vReadMask.getIdx()) { + if (v_dst.getIdx() == vSrcShift.getIdx() || v_dst.getIdx() == vReadMask.getIdx() || + vSrcShift.getIdx() == vReadMask.getIdx()) { OPENVINO_THROW("Any pair of the index, mask, or destination registers cannot be the same."); } if (zeroFill) - pxor(v_dst, v_dst); // Don't use vpxor. It zeros the rest of the YMM register. + pxor(v_dst, v_dst); // Don't use vpxor. It zeros the rest of the YMM register. if (isValidIsa(x64::avx2)) { if (!useMask) @@ -280,7 +254,7 @@ void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, Xbyak::Label lLoopNext; if (useMask) { uni_vpextrd(r32Aux, vReadMask, i); - cmp(r32Aux, 0); // TODO: check significant bit + cmp(r32Aux, 0); // TODO: check significant bit je(lLoopNext, T_NEAR); } uni_vpextrd(r32Aux, vSrcShift, i); @@ -292,13 +266,14 @@ void JitKernelBase::gatherdd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::gatherdd(const Xbyak::Ymm& v_dst, +void JitKernelBase::gatherdd(const Xbyak::Ymm& v_dst, const Xbyak::Reg64& rSrcPtr, - const Xbyak::Ymm& vSrcShift, - const Xbyak::Ymm& vReadMask, + const Xbyak::Ymm& vSrcShift, + const Xbyak::Ymm& vReadMask, const bool useMask, const bool zeroFill) { - if (v_dst.getIdx() == vSrcShift.getIdx() || v_dst.getIdx() == vReadMask.getIdx() || vSrcShift.getIdx() == vReadMask.getIdx()) { + if (v_dst.getIdx() == vSrcShift.getIdx() || v_dst.getIdx() == vReadMask.getIdx() || + vSrcShift.getIdx() == vReadMask.getIdx()) { OPENVINO_THROW("Any pair of the index, mask, or destination registers cannot be the same."); } if (isValidIsa(x64::avx2)) { @@ -309,8 +284,7 @@ void JitKernelBase::gatherdd(const Xbyak::Ymm& v_dst, vpgatherdd(v_dst, ptr[rSrcPtr + vSrcShift], vReadMask); } else { - Xbyak::Xmm xmmDst = Xbyak::Xmm(v_dst.getIdx()), - xmmSrcShft = Xbyak::Xmm(vSrcShift.getIdx()), + Xbyak::Xmm xmmDst = Xbyak::Xmm(v_dst.getIdx()), xmmSrcShft = Xbyak::Xmm(vSrcShift.getIdx()), xmmReadMask = Xbyak::Xmm(vReadMask.getIdx()); for (uint8_t i = 0; i < 2; i++) { gatherdd(xmmDst, rSrcPtr, xmmSrcShft, xmmReadMask, useMask, zeroFill); @@ -323,7 +297,7 @@ void JitKernelBase::gatherdd(const Xbyak::Ymm& v_dst, } } -void JitKernelBase::uni_vpbroadcastq(const Xbyak::Xmm &x, const Xbyak::Operand &op) { +void JitKernelBase::uni_vpbroadcastq(const Xbyak::Xmm& x, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpbroadcastq(x, op); } else { @@ -332,7 +306,7 @@ void JitKernelBase::uni_vpbroadcastq(const Xbyak::Xmm &x, const Xbyak::Operand & } } -void JitKernelBase::uni_vpbroadcastd(const Xbyak::Xmm &x, const Xbyak::Operand &op) { +void JitKernelBase::uni_vpbroadcastd(const Xbyak::Xmm& x, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpbroadcastd(x, op); } else if (isValidIsa(x64::avx)) { @@ -348,7 +322,7 @@ void JitKernelBase::uni_vpbroadcastd(const Xbyak::Xmm &x, const Xbyak::Operand & } } -void JitKernelBase::uni_vpbroadcastd(const Xbyak::Ymm &x, const Xbyak::Operand &op) { +void JitKernelBase::uni_vpbroadcastd(const Xbyak::Ymm& x, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpbroadcastd(x, op); } else { @@ -375,8 +349,7 @@ void JitKernelBase::uni_vroundpd(const Xbyak::Xmm& v_dst, const Xbyak::Operand& } } -void JitKernelBase::uni_vcvtdq2pd(const Xbyak::Xmm& v_dst, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vcvtdq2pd(const Xbyak::Xmm& v_dst, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vcvtdq2pd(v_dst, op); } else { @@ -384,8 +357,7 @@ void JitKernelBase::uni_vcvtdq2pd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vcvtpd2dq(const Xbyak::Xmm& v_dst, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vcvtpd2dq(const Xbyak::Xmm& v_dst, const Xbyak::Operand& op) { if (isValidIsa(x64::avx)) { vcvtpd2dq(v_dst, op); } else { @@ -393,8 +365,7 @@ void JitKernelBase::uni_vcvtpd2dq(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::uni_vpmovzxdq(const Xbyak::Xmm& v_dst, - const Xbyak::Operand& op) { +void JitKernelBase::uni_vpmovzxdq(const Xbyak::Xmm& v_dst, const Xbyak::Operand& op) { if (isValidIsa(x64::avx2)) { vpmovzxdq(v_dst, op); } else { @@ -416,8 +387,7 @@ void JitKernelBase::uni_vshufpd(const Xbyak::Xmm& v_dst, } } -void JitKernelBase::fillRestWorkMask(const Xbyak::Opmask& dstMask, - const Xbyak::Reg64& rWorkRest) { +void JitKernelBase::fillRestWorkMask(const Xbyak::Opmask& dstMask, const Xbyak::Reg64& rWorkRest) { auto rOnes = getReg64(); mov(rOnes, 0xFFFFFFFFFFFFFFFF); @@ -493,11 +463,11 @@ void JitKernelBase::fillRestWorkMask(const Xbyak::Ymm& ymmDstMask, L(lEnd); } -void JitKernelBase::load(const Xbyak::Xmm& v_dst, +void JitKernelBase::load(const Xbyak::Xmm& v_dst, const Xbyak::Address& srcAddr, - const Xbyak::Reg64& rLoadNum, - const size_t typeSize, - const bool zeroFilling) { + const Xbyak::Reg64& rLoadNum, + const size_t typeSize, + const bool zeroFilling) { if (!one_of(typeSize, 1u, 2u, 4u, 8u)) { OPENVINO_THROW("Could not load data with type size ", typeSize); } @@ -523,11 +493,11 @@ void JitKernelBase::load(const Xbyak::Xmm& v_dst, L(lEnd); } -void JitKernelBase::load(const Xbyak::Ymm& v_dst, +void JitKernelBase::load(const Xbyak::Ymm& v_dst, const Xbyak::Address& srcAddr, - const Xbyak::Reg64& rLoadNum, - const size_t typeSize, - const bool zeroFilling) { + const Xbyak::Reg64& rLoadNum, + const size_t typeSize, + const bool zeroFilling) { if (!one_of(typeSize, 1u, 2u, 4u, 8u)) { OPENVINO_THROW("Could not load data with type size ", typeSize); } @@ -564,9 +534,9 @@ void JitKernelBase::load(const Xbyak::Ymm& v_dst, } void JitKernelBase::store(const Xbyak::Address& dstAddr, - const Xbyak::Xmm& v_src, - const Xbyak::Reg64& rToStoreNum, - const size_t typeSize) { + const Xbyak::Xmm& v_src, + const Xbyak::Reg64& rToStoreNum, + const size_t typeSize) { if (!one_of(typeSize, 1u, 2u, 4u, 8u)) { OPENVINO_THROW("Could not store data with type size ", typeSize); } @@ -592,9 +562,9 @@ void JitKernelBase::store(const Xbyak::Address& dstAddr, } void JitKernelBase::store(const Xbyak::Address& dstAddr, - const Xbyak::Ymm& v_src, - const Xbyak::Reg64& rToStoreNum, - const size_t typeSize) { + const Xbyak::Ymm& v_src, + const Xbyak::Reg64& rToStoreNum, + const size_t typeSize) { if (!one_of(typeSize, 1u, 2u, 4u, 8u)) { OPENVINO_THROW("Could not store data with type size ", typeSize); } @@ -631,11 +601,11 @@ void JitKernelBase::store(const Xbyak::Address& dstAddr, void JitKernelBase::memMovDD(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rSrc, - const Xbyak::Xmm& vReadMask, - const Xbyak::Xmm& vSrcShift, + const Xbyak::Xmm& vReadMask, + const Xbyak::Xmm& vSrcShift, const Xbyak::Reg64& rToStoreNum, - const bool useMask, - const bool zeroFill) { + const bool useMask, + const bool zeroFill) { Xbyak::Label lEnd; auto rAux = getReg64(); Xbyak::Reg32 r32Aux = Xbyak::Reg32(rAux.getIdx()); @@ -671,11 +641,11 @@ void JitKernelBase::memMovDD(const Xbyak::Reg64& rDst, void JitKernelBase::memMovDD(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rSrc, - const Xbyak::Ymm& vReadMask, - const Xbyak::Ymm& vSrcShift, + const Xbyak::Ymm& vReadMask, + const Xbyak::Ymm& vSrcShift, const Xbyak::Reg64& rToStoreNum, - const bool useMask, - const bool zeroFill) { + const bool useMask, + const bool zeroFill) { Xbyak::Label lEnd; if (isValidIsa(x64::avx2)) { auto vAux = RegistersPool::Reg(registersPool); @@ -684,8 +654,7 @@ void JitKernelBase::memMovDD(const Xbyak::Reg64& rDst, } else if (isValidIsa(x64::avx)) { const uint8_t typeSize = sizeof(int); const uint8_t elPerXmm = x64::cpu_isa_traits::vlen / typeSize; - Xbyak::Xmm xmmReadMask = Xbyak::Xmm(vReadMask.getIdx()), - xmmSrcShft = Xbyak::Xmm(vSrcShift.getIdx()); + Xbyak::Xmm xmmReadMask = Xbyak::Xmm(vReadMask.getIdx()), xmmSrcShft = Xbyak::Xmm(vSrcShift.getIdx()); for (uint8_t i = 0; i < 2; i++) { memMovDD(rDst, rSrc, xmmReadMask, xmmSrcShft, rToStoreNum, useMask, zeroFill); @@ -707,6 +676,6 @@ void JitKernelBase::memMovDD(const Xbyak::Reg64& rDst, L(lEnd); } -} // namespace kernel -} // namespace intel_cpu -} // namespace ov +} // namespace kernel +} // namespace intel_cpu +} // namespace ov diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.hpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.hpp index 260d7196331a7f..eee4ff4d8c0708 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.hpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_kernel_base.hpp @@ -7,9 +7,9 @@ #include "openvino/core/visibility.hpp" #if defined(OPENVINO_ARCH_X86_64) -#include "cpu/x64/jit_generator.hpp" -#include "registers_pool.hpp" -#endif // OPENVINO_ARCH_X86_64 +# include "cpu/x64/jit_generator.hpp" +# include "registers_pool.hpp" +#endif // OPENVINO_ARCH_X86_64 namespace ov { namespace intel_cpu { @@ -19,18 +19,22 @@ class JitKernelBase; #if defined(OPENVINO_ARCH_X86_64) -#define getReg64() RegistersPool::Reg(registersPool) -#define getReg32() RegistersPool::Reg(registersPool) -#define getVmm() RegistersPool::Reg(registersPool) -#define getMask() RegistersPool::Reg(registersPool) +# define getReg64() RegistersPool::Reg(registersPool) +# define getReg32() RegistersPool::Reg(registersPool) +# define getVmm() RegistersPool::Reg(registersPool) +# define getMask() RegistersPool::Reg(registersPool) -class JitKernelBase: public dnnl::impl::cpu::x64::jit_generator { +class JitKernelBase : public dnnl::impl::cpu::x64::jit_generator { public: JitKernelBase(const char* name, dnnl::impl::cpu::x64::cpu_isa_t max_cpu_isa); - dnnl::impl::cpu::x64::cpu_isa_t getIsa() { return m_isa; } + dnnl::impl::cpu::x64::cpu_isa_t getIsa() { + return m_isa; + } - size_t getVectorLen() { return vlen; } + size_t getVectorLen() { + return vlen; + } void uni_vfmsub132ps(const Xbyak::Xmm& vDst, const Xbyak::Xmm& vSrc, const Xbyak::Operand& op); @@ -62,9 +66,9 @@ class JitKernelBase: public dnnl::impl::cpu::x64::jit_generator { void uni_vdivpd(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_src, const Xbyak::Operand& op2); - void uni_vandps(const Xbyak::Xmm& vDst, const Xbyak::Xmm& vSrs, const Xbyak::Operand &op); + void uni_vandps(const Xbyak::Xmm& vDst, const Xbyak::Xmm& vSrs, const Xbyak::Operand& op); - void uni_vandnps(const Xbyak::Xmm& vDst, const Xbyak::Xmm& vSrs, const Xbyak::Operand &op); + void uni_vandnps(const Xbyak::Xmm& vDst, const Xbyak::Xmm& vSrs, const Xbyak::Operand& op); void uni_kmovd(const Xbyak::Opmask& kDst, const Xbyak::Opmask& kSrc) { kmovd(kDst, kSrc); @@ -82,11 +86,11 @@ class JitKernelBase: public dnnl::impl::cpu::x64::jit_generator { uni_vandps(kDst, kSrc1, kSrc2); } - void uni_vpbroadcastd(const Xbyak::Xmm &x, const Xbyak::Operand &op); + void uni_vpbroadcastd(const Xbyak::Xmm& x, const Xbyak::Operand& op); - void uni_vpbroadcastd(const Xbyak::Ymm &x, const Xbyak::Operand &op); + void uni_vpbroadcastd(const Xbyak::Ymm& x, const Xbyak::Operand& op); - void uni_vpbroadcastq(const Xbyak::Xmm &x, const Xbyak::Operand &op); + void uni_vpbroadcastq(const Xbyak::Xmm& x, const Xbyak::Operand& op); void uni_vroundpd(const Xbyak::Xmm& v_dst, const Xbyak::Operand& op, const uint8_t imm); @@ -98,76 +102,71 @@ class JitKernelBase: public dnnl::impl::cpu::x64::jit_generator { void uni_vshufpd(const Xbyak::Xmm& v_dst, const Xbyak::Xmm& v_srs, const Xbyak::Operand& op, uint8_t imm); - void gatherdd(const Xbyak::Xmm& vDst, - const Xbyak::Reg64& rSrcPtr, - const Xbyak::Xmm& vSrcShift, + void gatherdd(const Xbyak::Xmm& vDst, + const Xbyak::Reg64& rSrcPtr, + const Xbyak::Xmm& vSrcShift, const Xbyak::Opmask& kReadMask, - const bool useMask = true, - const bool zeroFill = false); + const bool useMask = true, + const bool zeroFill = false); - void gatherdd(const Xbyak::Xmm& vDst, + void gatherdd(const Xbyak::Xmm& vDst, const Xbyak::Reg64& rSrcPtr, - const Xbyak::Xmm& vSrcShift, - const Xbyak::Xmm& vReadMask, - const bool useMask = true, + const Xbyak::Xmm& vSrcShift, + const Xbyak::Xmm& vReadMask, + const bool useMask = true, const bool zeroFill = false); - void gatherdd(const Xbyak::Ymm& vDst, + void gatherdd(const Xbyak::Ymm& vDst, const Xbyak::Reg64& rSrcPtr, - const Xbyak::Ymm& vSrcShift, - const Xbyak::Ymm& vReadMask, - const bool useMask = true, + const Xbyak::Ymm& vSrcShift, + const Xbyak::Ymm& vReadMask, + const bool useMask = true, const bool zeroFill = false); - void fillRestWorkMask(const Xbyak::Opmask& kDstMask, - const Xbyak::Reg64& rWorkRest); + void fillRestWorkMask(const Xbyak::Opmask& kDstMask, const Xbyak::Reg64& rWorkRest); - void fillRestWorkMask(const Xbyak::Xmm& ymmDstMask, - const Xbyak::Reg64& rWorkRest, - const uint64_t typeSize = 4); + void fillRestWorkMask(const Xbyak::Xmm& ymmDstMask, const Xbyak::Reg64& rWorkRest, const uint64_t typeSize = 4); - void fillRestWorkMask(const Xbyak::Ymm& ymmDstMask, - const Xbyak::Reg64& rWorkRest, - const uint64_t typeSize = 4); + void fillRestWorkMask(const Xbyak::Ymm& ymmDstMask, const Xbyak::Reg64& rWorkRest, const uint64_t typeSize = 4); - void load(const Xbyak::Xmm& vDst, + void load(const Xbyak::Xmm& vDst, const Xbyak::Address& srcAddr, - const Xbyak::Reg64& rLoadNum, - const size_t typeSize, + const Xbyak::Reg64& rLoadNum, + const size_t typeSize, const bool zeroFill = false); - void load(const Xbyak::Ymm& vDst, + void load(const Xbyak::Ymm& vDst, const Xbyak::Address& srcAddr, - const Xbyak::Reg64& rLoadNum, - const size_t typeSize, + const Xbyak::Reg64& rLoadNum, + const size_t typeSize, const bool zeroFill = false); void store(const Xbyak::Address& dstAddr, - const Xbyak::Xmm& vSrc, - const Xbyak::Reg64& rToStoreNum, - const size_t typeSize); + const Xbyak::Xmm& vSrc, + const Xbyak::Reg64& rToStoreNum, + const size_t typeSize); void store(const Xbyak::Address& dstAddr, - const Xbyak::Ymm& vSrc, - const Xbyak::Reg64& rToStoreNum, - const size_t typeSize); + const Xbyak::Ymm& vSrc, + const Xbyak::Reg64& rToStoreNum, + const size_t typeSize); // Makes gather from memory under the vReadMask and writes to the memory m128. void memMovDD(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rSrc, - const Xbyak::Xmm& vReadMask, - const Xbyak::Xmm& vSrcShift, + const Xbyak::Xmm& vReadMask, + const Xbyak::Xmm& vSrcShift, const Xbyak::Reg64& rToStoreCounter, - const bool useMask = true, + const bool useMask = true, const bool zeroFill = false); // Makes gather from the memory under the vReadMask and writes to the memory m256. void memMovDD(const Xbyak::Reg64& rDst, const Xbyak::Reg64& rSrc, - const Xbyak::Ymm& vReadMask, - const Xbyak::Ymm& vSrcShift, + const Xbyak::Ymm& vReadMask, + const Xbyak::Ymm& vSrcShift, const Xbyak::Reg64& rToStoreCounter, - const bool useMask = true, + const bool useMask = true, const bool zeroFill = false); protected: @@ -181,32 +180,37 @@ class JitKernelBase: public dnnl::impl::cpu::x64::jit_generator { enum { // Comparison predicate operand (immediate byte) for single-precision floating-point values. - CMP_EQ_PS = 0, // Equal (ordered, non-signaling) - CMP_LT_PS, // Less-than (ordered, signaling) - CMP_LE_PS, // Less-than-or-equal (ordered, signaling) - CMP_UNORD_PS, // Unordered (non-signaling) - CMP_NEQ_PS, // Not-equal (unordered, non-signaling) - CMP_NLT_PS, // Not-less-than (unordered, signaling) - CMP_NLE_PS, // Not-less-than-or-equal (unordered, signaling) - CMP_ORD_PS // Ordered (non-signaling) + CMP_EQ_PS = 0, // Equal (ordered, non-signaling) + CMP_LT_PS, // Less-than (ordered, signaling) + CMP_LE_PS, // Less-than-or-equal (ordered, signaling) + CMP_UNORD_PS, // Unordered (non-signaling) + CMP_NEQ_PS, // Not-equal (unordered, non-signaling) + CMP_NLT_PS, // Not-less-than (unordered, signaling) + CMP_NLE_PS, // Not-less-than-or-equal (unordered, signaling) + CMP_ORD_PS // Ordered (non-signaling) }; }; -template +template class JitKernel : public JitKernelBase { public: - using KernelFunc = void (*)(const CallArgs *); + using KernelFunc = void (*)(const CallArgs*); explicit JitKernel(const char* name, const CompileParams& jcp, dnnl::impl::cpu::x64::cpu_isa_t max_cpu_isa) - : JitKernelBase{name, max_cpu_isa}, m_jcp{jcp}, m_func{nullptr} {} + : JitKernelBase{name, max_cpu_isa}, + m_jcp{jcp}, + m_func{nullptr} {} ~JitKernel() override = default; dnnl::impl::status_t create_kernel() override { const dnnl::impl::status_t code = jit_generator::create_kernel(); if (code != dnnl::impl::status::success) { - OPENVINO_THROW("Could not create kernel. Error code: ", std::to_string(code), ". ", - "Xbyak error code: ", Xbyak::ConvertErrorToString(Xbyak::GetError())); + OPENVINO_THROW("Could not create kernel. Error code: ", + std::to_string(code), + ". ", + "Xbyak error code: ", + Xbyak::ConvertErrorToString(Xbyak::GetError())); } m_func = (decltype(m_func))jit_ker(); return code; @@ -221,21 +225,21 @@ class JitKernel : public JitKernelBase { this->operator()(&args); } - template class KernelT> + template

    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

    Jn$Z!RCD+xO|Hr7_gw* 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�`#vx{vV?h_hbR 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%0AI6)1E2!4CltA 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

}p1PdN&z2OK_#x%3@ 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%0D)LP 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.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