diff --git a/docs/2026.html b/docs/2026.html
index b4e3c4cc2d..f1948cffd5 100644
--- a/docs/2026.html
+++ b/docs/2026.html
@@ -49,6 +49,7 @@
New features
SVE2 optimizations of class SynetConvolution32fNhwcDepthwise.
SVE2 optimizations of class SynetConvolution32fDepthwiseDotProduct.
SVE2 optimizations of class SynetConvolution32fNhwcDirect.
+ SVE2 optimizations of class SynetInnerProduct32fGemm.
Renaming
diff --git a/prj/vs2022/Sve2.vcxproj b/prj/vs2022/Sve2.vcxproj
index f1cbc63565..07680b795c 100644
--- a/prj/vs2022/Sve2.vcxproj
+++ b/prj/vs2022/Sve2.vcxproj
@@ -128,6 +128,7 @@
+
diff --git a/prj/vs2022/Sve2.vcxproj.filters b/prj/vs2022/Sve2.vcxproj.filters
index 7946ade9ca..cb208ec8d2 100644
--- a/prj/vs2022/Sve2.vcxproj.filters
+++ b/prj/vs2022/Sve2.vcxproj.filters
@@ -545,6 +545,9 @@
Sve2\Synet\MergedConvolution
+
+ Sve2\Synet\InnerProduct
+
Sve2\Synet\InnerProduct
diff --git a/src/Simd/SimdLib.cpp b/src/Simd/SimdLib.cpp
index 38a59821b6..9c1fee0617 100644
--- a/src/Simd/SimdLib.cpp
+++ b/src/Simd/SimdLib.cpp
@@ -6702,7 +6702,7 @@ SIMD_API void* SimdSynetInnerProduct32fInit(size_t M, size_t N, size_t K, SimdBo
SIMD_EMPTY();
#if defined(SIMD_SYNET_ENABLE)
typedef void* (*SimdSynetInnerProduct32fInitPtr) (size_t M, size_t N, size_t K, SimdBool transB, SimdBool constB, SimdBool bias, SimdConvolutionActivationType activation);
- const static SimdSynetInnerProduct32fInitPtr simdSynetInnerProduct32fInit = SIMD_FUNC4(SynetInnerProduct32fInit, SIMD_AVX512BW_FUNC, SIMD_AVX2_FUNC, SIMD_SSE41_FUNC, SIMD_NEON_FUNC);
+ const static SimdSynetInnerProduct32fInitPtr simdSynetInnerProduct32fInit = SIMD_FUNC5(SynetInnerProduct32fInit, SIMD_AVX512BW_FUNC, SIMD_AVX2_FUNC, SIMD_SSE41_FUNC, SIMD_SVE2_FUNC, SIMD_NEON_FUNC);
return simdSynetInnerProduct32fInit(M, N, K, transB, constB, bias, activation);
#else
diff --git a/src/Simd/SimdSve2SynetInnerProduct32f.cpp b/src/Simd/SimdSve2SynetInnerProduct32f.cpp
new file mode 100644
index 0000000000..d0cf36216b
--- /dev/null
+++ b/src/Simd/SimdSve2SynetInnerProduct32f.cpp
@@ -0,0 +1,73 @@
+/*
+* Simd Library (http://ermig1979.github.io/Simd).
+*
+* Copyright (c) 2011-2026 Yermalayeu Ihar.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+* SOFTWARE.
+*/
+#include "Simd/SimdMemory.h"
+#include "Simd/SimdStore.h"
+#include "Simd/SimdSynetInnerProduct32f.h"
+#include "Simd/SimdSynetConvolution32f.h"
+#include "Simd/SimdSynet.h"
+#include "Simd/SimdBase.h"
+#include "Simd/SimdSve2.h"
+#include "Simd/SimdNeon.h"
+
+namespace Simd
+{
+#if defined(SIMD_SVE2_ENABLE) && defined(SIMD_SYNET_ENABLE)
+ namespace Sve2
+ {
+ SynetInnerProduct32fGemm::SynetInnerProduct32fGemm(const InnerProductParam32f& p)
+ : Base::SynetInnerProduct32fGemm(p)
+ {
+ _biasAndActivation = Neon::ConvolutionBiasAndActivation;
+ if (_param.transB)
+ {
+ _gemm = Sve2::Gemm32fNT;
+ if (_M == 1 && _param.activation == SimdConvolutionActivationIdentity && _param.constB)
+ _prod = Sve2::SynetInnerProductLayerForward;
+ else
+ _prod = NULL;
+ }
+ else
+ {
+ _gemm = Sve2::Gemm32fNN;
+ }
+ if (_param.N > Neon::F && _prod == NULL && _param.constB)
+ {
+ _cbRun = Neon::Gemm32fNNcbRun;
+ _cbPack = Neon::Gemm32fNNcbReorderB;
+ _cbWeight.Resize(Neon::Gemm32fNNcbBufferSize(_M, _N, _K, GemmKernelAny, NHWC_GEMM_COMPATIBLE));
+ }
+ }
+
+ //-----------------------------------------------------------------------------------------
+
+ void* SynetInnerProduct32fInit(size_t M, size_t N, size_t K, SimdBool transB, SimdBool constB, SimdBool bias, SimdConvolutionActivationType activation)
+ {
+ InnerProductParam32f param(M, N, K, transB, constB, bias, activation);
+ if (!param.Valid())
+ return NULL;
+ return new SynetInnerProduct32fGemm(param);
+ }
+ }
+#endif
+}
diff --git a/src/Simd/SimdSynetInnerProduct32f.h b/src/Simd/SimdSynetInnerProduct32f.h
index 12a07c21a3..af84535162 100644
--- a/src/Simd/SimdSynetInnerProduct32f.h
+++ b/src/Simd/SimdSynetInnerProduct32f.h
@@ -266,6 +266,21 @@ namespace Simd
void* SynetInnerProduct32fInit(size_t M, size_t N, size_t K, SimdBool transB, SimdBool constB, SimdBool bias, SimdConvolutionActivationType activation);
}
#endif
+
+#ifdef SIMD_SVE2_ENABLE
+ namespace Sve2
+ {
+ class SynetInnerProduct32fGemm : public Base::SynetInnerProduct32fGemm
+ {
+ public:
+ SynetInnerProduct32fGemm(const InnerProductParam32f& p);
+
+ virtual String Ext() const { return "Sve2"; }
+ };
+
+ void* SynetInnerProduct32fInit(size_t M, size_t N, size_t K, SimdBool transB, SimdBool constB, SimdBool bias, SimdConvolutionActivationType activation);
+ }
+#endif
}
#endif
diff --git a/src/Test/TestSynetInnerProduct.cpp b/src/Test/TestSynetInnerProduct.cpp
index 07423dffa8..0e571da0d9 100644
--- a/src/Test/TestSynetInnerProduct.cpp
+++ b/src/Test/TestSynetInnerProduct.cpp
@@ -176,6 +176,11 @@ namespace Test
result = result && SynetInnerProduct32fForwardAutoTest(EPS, FUNC_IP32F(Simd::Neon::SynetInnerProduct32fInit), FUNC_IP32F(SimdSynetInnerProduct32fInit));
#endif
+#ifdef SIMD_SVE2_ENABLE
+ if (Simd::Sve2::Enable && TestSve2(options))
+ result = result && SynetInnerProduct32fForwardAutoTest(EPS, FUNC_IP32F(Simd::Sve2::SynetInnerProduct32fInit), FUNC_IP32F(SimdSynetInnerProduct32fInit));
+#endif
+
return result;
}