From 7ee1f1724b48d36c680aac03135502fed543285f Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Tue, 2 Jan 2024 20:45:10 +0530 Subject: [PATCH 1/6] Update cpu_convert.cpp --- .../src/nodes/common/cpu_convert.cpp | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) 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 e5805256c37..074bba9c9e0 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -55,6 +55,31 @@ void convert_vec(jit_generator & gen, gen.movdqu(gen.xword[dst], f16vec); } +// AVX512 instructions for ov::float16 to float conversion +template <> +void convert_vec(jit_generator & gen, + const RegExp & src, + const RegExp & dst) { + auto const & f16vec = gen.zmm3; + auto const & f32vec = gen.zmm4; + + gen.vmovdqu16(f16vec, gen.zword[src]); + gen.vcvtph2ps(f32vec, f16vec); + gen.vmovups(gen.zword[dst], f32vec); +} + +template <> +void convert_vec(jit_generator & gen, + const RegExp & src, + const RegExp & dst) { + auto const & f16vec = gen.zmm3; + auto const & f32vec = gen.zmm4; + + gen.vmovups(f32vec, gen.zword[src]); + gen.vcvtps2ph(f16vec, f32vec, 0); + gen.vmovdqu16(gen.zword[dst], f16vec); +} + class jit_convert_array : public jit_kernel { DECLARE_CPU_JIT_AUX_FUNCTIONS(jit_convert_array) @@ -125,8 +150,15 @@ public: 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::avx512_core)) { + static jit_convert_array converter(convert_vec, sizeof(src_t), sizeof(dst_t)); + auto & generator = static_cast(converter); + generator.create_kernel(); + return (fn_t)generator.jit_ker(); + } + // fallback to AVX2 if AVX512 is not available + else 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); generator.create_kernel(); From 7bfdde39560fe7a5c2740c481b1a35888d47cdf7 Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Thu, 11 Jan 2024 00:22:06 +0530 Subject: [PATCH 2/6] Update cpu_convert.cpp style --- src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) 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 074bba9c9e0..6e43b05d904 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -150,17 +150,15 @@ public: template static fn_t get() { + // fallback to AVX2 if AVX512 is not available if (mayiuse(cpu_isa_t::avx512_core)) { 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(); - } - // fallback to AVX2 if AVX512 is not available - else if (mayiuse(cpu_isa_t::avx2) - && dnnl::impl::cpu::x64::cpu().has(Xbyak::util::Cpu::tF16C)) { + } else 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(); } From ad524bef5f59871031f1eb6b9d574fdaa4dde5e9 Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Fri, 19 Jan 2024 20:57:24 +0530 Subject: [PATCH 3/6] Update cpu_convert.cpp --- .../src/nodes/common/cpu_convert.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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 6e43b05d904..93549ddd206 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -27,12 +27,17 @@ using namespace dnnl::impl::cpu::x64; using namespace Xbyak; template -void convert_vec(jit_generator & gen, +void convert_vec_avx2(jit_generator & gen, + const RegExp & src, + const RegExp & dst); + +template +void convert_vec_avx512(jit_generator & gen, const RegExp & src, const RegExp & dst); template <> -void convert_vec(jit_generator & gen, +void convert_vec_avx2(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.xmm3; @@ -44,7 +49,7 @@ void convert_vec(jit_generator & gen, } template <> -void convert_vec(jit_generator & gen, +void convert_vec_avx2(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.xmm3; @@ -57,7 +62,7 @@ void convert_vec(jit_generator & gen, // AVX512 instructions for ov::float16 to float conversion template <> -void convert_vec(jit_generator & gen, +void convert_vec_avx512(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.zmm3; @@ -69,7 +74,7 @@ void convert_vec(jit_generator & gen, } template <> -void convert_vec(jit_generator & gen, +void convert_vec_avx512(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.zmm3; @@ -152,12 +157,12 @@ public: static fn_t get() { // fallback to AVX2 if AVX512 is not available if (mayiuse(cpu_isa_t::avx512_core)) { - static jit_convert_array converter(convert_vec, sizeof(src_t), sizeof(dst_t)); + static jit_convert_array converter(convert_vec_avx512, sizeof(src_t), sizeof(dst_t)); auto& generator = static_cast(converter); generator.create_kernel(); return (fn_t)generator.jit_ker(); } else 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)); + static jit_convert_array converter(convert_vec_avx2, sizeof(src_t), sizeof(dst_t)); auto& generator = static_cast(converter); generator.create_kernel(); return (fn_t)generator.jit_ker(); From 9544b30ce03a52c8e225b4c1f736d23145415931 Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Fri, 26 Jan 2024 18:14:07 +0530 Subject: [PATCH 4/6] Update cpu_convert.cpp --- .../src/nodes/common/cpu_convert.cpp | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) 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 93549ddd206..7aa7692cff2 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -26,18 +26,13 @@ using namespace dnnl::impl::utils; using namespace dnnl::impl::cpu::x64; using namespace Xbyak; -template -void convert_vec_avx2(jit_generator & gen, - const RegExp & src, - const RegExp & dst); - -template -void convert_vec_avx512(jit_generator & gen, +template +void convert_vec(jit_generator & gen, const RegExp & src, const RegExp & dst); template <> -void convert_vec_avx2(jit_generator & gen, +void convert_vec(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.xmm3; @@ -49,7 +44,7 @@ void convert_vec_avx2(jit_generator & gen, } template <> -void convert_vec_avx2(jit_generator & gen, +void convert_vec(jit_generator & gen, const RegExp & src, const RegExp & dst) { auto const & f16vec = gen.xmm3; @@ -62,27 +57,27 @@ void convert_vec_avx2(jit_generator & gen, // AVX512 instructions for ov::float16 to float conversion template <> -void convert_vec_avx512(jit_generator & gen, - const RegExp & src, - const RegExp & dst) { - auto const & f16vec = gen.zmm3; +void convert_vec(jit_generator & gen, + const RegExp & src, + const RegExp & dst) { + auto const & f16vec = gen.ymm3; auto const & f32vec = gen.zmm4; - gen.vmovdqu16(f16vec, gen.zword[src]); + gen.movdqu(f16vec, gen.yword[src]); gen.vcvtph2ps(f32vec, f16vec); gen.vmovups(gen.zword[dst], f32vec); } template <> -void convert_vec_avx512(jit_generator & gen, - const RegExp & src, - const RegExp & dst) { - auto const & f16vec = gen.zmm3; +void convert_vec(jit_generator & gen, + const RegExp & src, + const RegExp & dst) { + auto const & f16vec = gen.ymm3; auto const & f32vec = gen.zmm4; gen.vmovups(f32vec, gen.zword[src]); gen.vcvtps2ph(f16vec, f32vec, 0); - gen.vmovdqu16(gen.zword[dst], f16vec); + gen.movdqu(gen.yword[dst], f16vec); } class jit_convert_array : public jit_kernel { @@ -157,12 +152,12 @@ public: static fn_t get() { // fallback to AVX2 if AVX512 is not available if (mayiuse(cpu_isa_t::avx512_core)) { - static jit_convert_array converter(convert_vec_avx512, sizeof(src_t), sizeof(dst_t)); + static jit_convert_array converter(convert_vec, sizeof(src_t), sizeof(dst_t)); auto& generator = static_cast(converter); generator.create_kernel(); return (fn_t)generator.jit_ker(); } else if (mayiuse(cpu_isa_t::avx2) && dnnl::impl::cpu::x64::cpu().has(Xbyak::util::Cpu::tF16C)) { - static jit_convert_array converter(convert_vec_avx2, sizeof(src_t), sizeof(dst_t)); + static jit_convert_array converter(convert_vec, sizeof(src_t), sizeof(dst_t)); auto& generator = static_cast(converter); generator.create_kernel(); return (fn_t)generator.jit_ker(); From 7b759ce04e059bcc44a4311021d15f60f01e9428 Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Fri, 26 Jan 2024 18:14:32 +0530 Subject: [PATCH 5/6] Update year --- src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7aa7692cff2..697fd87a450 100644 --- a/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp +++ b/src/plugins/intel_cpu/src/nodes/common/cpu_convert.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2018-2023 Intel Corporation +// Copyright (C) 2018-2024 Intel Corporation // SPDX-License-Identifier: Apache-2.0 // From 61023ee0492f4b62f20f034a669e5faf3343d4fc Mon Sep 17 00:00:00 2001 From: siddhant-0707 Date: Sat, 27 Jan 2024 14:24:18 +0530 Subject: [PATCH 6/6] create unit test --- .../intel_cpu/tests/unit/CMakeLists.txt | 3 ++- .../tests/unit/nodes/avx_512_test.cpp | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/plugins/intel_cpu/tests/unit/nodes/avx_512_test.cpp diff --git a/src/plugins/intel_cpu/tests/unit/CMakeLists.txt b/src/plugins/intel_cpu/tests/unit/CMakeLists.txt index 6bb37da1320..cc1516030a0 100644 --- a/src/plugins/intel_cpu/tests/unit/CMakeLists.txt +++ b/src/plugins/intel_cpu/tests/unit/CMakeLists.txt @@ -23,7 +23,8 @@ if(NOT X86_64) ${CMAKE_CURRENT_SOURCE_DIR}/registers_pool.cpp ${CMAKE_CURRENT_SOURCE_DIR}/transformations/x64 ${CMAKE_CURRENT_SOURCE_DIR}/snippets_transformations - ${CMAKE_CURRENT_SOURCE_DIR}/nodes/eltwise_node_test.cpp) + ${CMAKE_CURRENT_SOURCE_DIR}/nodes/eltwise_node_test.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/nodes/avx_512_test.cpp) endif() if (NOT ENABLE_MLAS_FOR_CPU) diff --git a/src/plugins/intel_cpu/tests/unit/nodes/avx_512_test.cpp b/src/plugins/intel_cpu/tests/unit/nodes/avx_512_test.cpp new file mode 100644 index 00000000000..b8541013ad9 --- /dev/null +++ b/src/plugins/intel_cpu/tests/unit/nodes/avx_512_test.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2018-2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include +#include +#include + +#include "nodes/common/cpu_convert.h" +#include "gtest/gtest.h" + +using namespace std::chrono; +using namespace ov::intel_cpu; + +TEST(cpu_convert, AVX512_fp16_load_store) { + std::vector sizes = {1000, 10000, 100000, 1000000}; + for (size_t size : sizes) { + std::vector input_data(size, 1.23f); + std::vector output_data(size); + + auto start = high_resolution_clock::now(); + cpu_convert(input_data.data(), output_data.data(), ov::element::f32, ov::element::f16, size); + auto stop = high_resolution_clock::now(); + auto duration = duration_cast(stop - start); + std::cout << "size " << size << ": " << duration.count() << " microseconds\n"; + } +}