Skip to content

Commit 024532e

Browse files
Add SVE2 optimizations for SynetConvolution32fNhwcGroupedBlock1x2 (#809)
Port the NhwcGroupedBlock1x2 algorithm to SVE2, wire Sve2 dispatch, extend AutoTest coverage for grouped convolution shapes, and document the change in release 7.2.165. Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent 74cf727 commit 024532e

7 files changed

Lines changed: 362 additions & 2 deletions

docs/2026.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ <h5>New features</h5>
4545
<li>SVE2 optimizations of class SynetConvolution32fGemmNT.</li>
4646
<li>SVE2 optimizations of class SynetConvolution32fWinograd.</li>
4747
<li>NEON optimizations of class SynetConvolution32fNhwcGroupedBlock1x2.</li>
48+
<li>SVE2 optimizations of class SynetConvolution32fNhwcGroupedBlock1x2.</li>
4849
</ul>
4950

5051
<a href="#HOME">Home</a>

prj/vs2022/Sve2.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution8i.cpp" />
108108
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32f.cpp" />
109109
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fGemm.cpp" />
110+
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fNhwcGrouped.cpp" />
110111
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConversion.cpp" />
111112
<ClCompile Include="..\..\src\Simd\SimdSve2SynetDeconvolution32f.cpp" />
112113
<ClCompile Include="..\..\src\Simd\SimdSve2SynetMergedConvolution32f.cpp" />

prj/vs2022/Sve2.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,9 @@
560560
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fGemm.cpp">
561561
<Filter>Sve2\Synet\Convolution</Filter>
562562
</ClCompile>
563+
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fNhwcGrouped.cpp">
564+
<Filter>Sve2\Synet\Convolution</Filter>
565+
</ClCompile>
563566
<ClCompile Include="..\..\src\Simd\SimdSve2SynetScale.cpp">
564567
<Filter>Sve2\Synet\Other</Filter>
565568
</ClCompile>

src/Simd/SimdSve2SynetConvolution32f.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ namespace Simd
4848
return new Neon::SynetConvolution32fNhwcDirect(param);
4949
else if (Neon::SynetConvolution32fNhwcDepthwise::Preferable(param))
5050
return new Neon::SynetConvolution32fNhwcDepthwise(param);
51-
else if (Base::SynetConvolution32fNhwcGroupedBlock1x2::Preferable(param))
52-
return new Base::SynetConvolution32fNhwcGroupedBlock1x2(param);
51+
else if (SynetConvolution32fNhwcGroupedBlock1x2::Preferable(param))
52+
return new SynetConvolution32fNhwcGroupedBlock1x2(param);
5353
else
5454
return new SynetConvolution32fGemmNN(param);
5555
}

src/Simd/SimdSve2SynetConvolution32fNhwcGrouped.cpp

Lines changed: 345 additions & 0 deletions
Large diffs are not rendered by default.

src/Simd/SimdSynetConvolution32f.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,13 @@ namespace Simd
753753
static bool Preferable(const ConvParam & p);
754754
};
755755

756+
class SynetConvolution32fNhwcGroupedBlock1x2 : public Base::SynetConvolution32fNhwcGroupedBlock1x2
757+
{
758+
public:
759+
SynetConvolution32fNhwcGroupedBlock1x2(const ConvParam& p);
760+
virtual String Ext() const { return "Sve2"; }
761+
};
762+
756763
void * SynetConvolution32fInit(size_t batch, const SimdConvolutionParameters * conv);
757764
}
758765
#endif//SIMD_SVE2_ENABLE

src/Test/TestSynetConvolution32f.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ namespace Test
278278
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 32, 4, 16, 32, Size(1, 5), _1, _1, Size(0, 2), Size(0, 2), 1, aId, tT), f1, f2);
279279
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 1280, 32, 32, 256, _1, _1, _1, _0, _0, 1, aRe, t), f1, f2);
280280
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 384, 7, 7, 768, _3, _1, _1, _1, _1, 384, a, t), f1, f2);
281+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 192, 14, 14, 384, _7, _1, _2, _3, _3, 192, a, t), f1, f2);
282+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 96, 14, 14, 192, _3, _1, _1, _1, _1, 96, a, t), f1, f2);
281283
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 152, 32, 32, 152, _7, _1, _1, _3, _3, 152, aRe, t), f1, f2);
282284
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 49, 29, 29, 98, _7, _1, _2, _3, _3, 49, a, t), f1, f2);
283285
#endif
@@ -294,6 +296,7 @@ namespace Test
294296
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 48, 4, 16, 48, Size(1, 3), _1, _1, Size(0, 1), Size(0, 1), 1, aId, tT), f1, f2);
295297
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 16, 9, 9, 16, _3, Size(2, 2), _1, _2, _2, 1, aRe, t), f1, f2);
296298
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 16, 9, 9, 16, _3, Size(2, 2), _2, _2, _2, 1, aRe, tF), f1, f2);
299+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 96, 14, 14, 192, _3, _1, _1, _1, _1, 96, a, t), f1, f2);
297300
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 49, 29, 29, 98, _7, _1, _2, _3, _3, 49, a, t), f1, f2);
298301
#endif
299302
return result;

0 commit comments

Comments
 (0)