Skip to content

Commit 1e75d70

Browse files
Add SVE2 optimizations for SynetConvolution32fDirectNchw (#810)
* Add SVE2 optimizations for SynetConvolution32fDirectNchw Port DirectNchw convolution kernels to SVE2 with predicated loads/stores and gather-based strided access, wire Sve2 dispatch, extend AutoTest coverage for NCHW DirectNchw shapes, and document the change in release 7.2.165. Co-authored-by: Ihar Yermalayeu <ermig1979@gmail.com> * Fix SVE2 DirectNchw for sizeless vector types Avoid arrays and pointer arithmetic on svfloat32_t; broadcast kernel weights from scalar float pointers and pass activation params by value. Co-authored-by: Ihar Yermalayeu <ermig1979@gmail.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent 024532e commit 1e75d70

7 files changed

Lines changed: 432 additions & 2 deletions

docs/2026.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ <h5>New features</h5>
4646
<li>SVE2 optimizations of class SynetConvolution32fWinograd.</li>
4747
<li>NEON optimizations of class SynetConvolution32fNhwcGroupedBlock1x2.</li>
4848
<li>SVE2 optimizations of class SynetConvolution32fNhwcGroupedBlock1x2.</li>
49+
<li>SVE2 optimizations of class SynetConvolution32fDirectNchw.</li>
4950
</ul>
5051

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

prj/vs2022/Sve2.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
<ClCompile Include="..\..\src\Simd\SimdSve2SynetActivation.cpp" />
107107
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution8i.cpp" />
108108
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32f.cpp" />
109+
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fDirectNchw.cpp" />
109110
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fGemm.cpp" />
110111
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fNhwcGrouped.cpp" />
111112
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConversion.cpp" />

prj/vs2022/Sve2.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,9 @@
557557
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32f.cpp">
558558
<Filter>Sve2\Synet\Convolution</Filter>
559559
</ClCompile>
560+
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fDirectNchw.cpp">
561+
<Filter>Sve2\Synet\Convolution</Filter>
562+
</ClCompile>
560563
<ClCompile Include="..\..\src\Simd\SimdSve2SynetConvolution32fGemm.cpp">
561564
<Filter>Sve2\Synet\Convolution</Filter>
562565
</ClCompile>

src/Simd/SimdSve2SynetConvolution32f.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ namespace Simd
4040
return new Neon::SynetConvolution32fDepthwiseDotProduct(param);
4141
else if (SynetConvolution32fWinograd::Preferable(param))
4242
return new SynetConvolution32fWinograd(param);
43-
else if (Neon::SynetConvolution32fDirectNchw::Preferable(param))
44-
return new Neon::SynetConvolution32fDirectNchw(param);
43+
else if (SynetConvolution32fDirectNchw::Preferable(param))
44+
return new SynetConvolution32fDirectNchw(param);
4545
else if (SynetConvolution32fGemmNT::Preferable(param))
4646
return new SynetConvolution32fGemmNT(param);
4747
else if (Neon::SynetConvolution32fNhwcDirect::Preferable(param))

src/Simd/SimdSve2SynetConvolution32fDirectNchw.cpp

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

src/Simd/SimdSynetConvolution32f.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,18 @@ namespace Simd
760760
virtual String Ext() const { return "Sve2"; }
761761
};
762762

763+
class SynetConvolution32fDirectNchw : public Neon::SynetConvolution32fDirectNchw
764+
{
765+
public:
766+
SynetConvolution32fDirectNchw(const ConvParam & p);
767+
virtual String Ext() const { return "Sve2"; }
768+
769+
static bool Preferable(const ConvParam & p);
770+
771+
protected:
772+
virtual ConvolutionBiasActivationPtr SetConvolutionBiasActivation();
773+
};
774+
763775
void * SynetConvolution32fInit(size_t batch, const SimdConvolutionParameters * conv);
764776
}
765777
#endif//SIMD_SVE2_ENABLE

src/Test/TestSynetConvolution32f.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ namespace Test
267267
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 128, 16, 16, 1, _1, _1, _1, _0, _0, 1, a, tT), f1, f2);
268268
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 3, 64, 64, 16, _3, _1, _1, _1, _1, 1, aPr, tF), f1, f2);
269269
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 3, 64, 64, 16, _3, _1, _1, _1, _1, 1, aPr, t), f1, f2);
270+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 1, 48, 48, 8, _3, _1, _1, _1, _1, 1, aRe, tF), f1, f2);
271+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 3, 40, 40, 16, _2, _1, _1, _0, _0, 1, aId, tF), f1, f2);
272+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 1, 33, 33, 4, _3, _1, _2, _1, _1, 1, aRe, tF), f1, f2);
273+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 1, 64, 64, 8, _1, _1, _1, _0, _0, 1, aRe, tF), f1, f2);
270274
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 64, 128, 128, 256, _3, _1, _1, _1, _1, 1, a, t), f1, f2);
271275
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 32, 16, 16, 32, _3, _1, _1, _1, _1, 1, aId, tT), f1, f2);
272276
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 32, 6, 15, 32, _3, _1, _1, _1, _1, 1, aId, tT), f1, f2);
@@ -296,6 +300,8 @@ namespace Test
296300
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);
297301
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 16, 9, 9, 16, _3, Size(2, 2), _1, _2, _2, 1, aRe, t), f1, f2);
298302
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 16, 9, 9, 16, _3, Size(2, 2), _2, _2, _2, 1, aRe, tF), f1, f2);
303+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 1, 48, 48, 8, _3, _1, _1, _1, _1, 1, aRe, tF), f1, f2);
304+
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 3, 40, 40, 16, _2, _1, _1, _0, _0, 1, aId, tF), f1, f2);
299305
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 96, 14, 14, 192, _3, _1, _1, _1, _1, 96, a, t), f1, f2);
300306
result = result && SynetConvolution32fForwardAutoTest(eps, Param(1, 49, 29, 29, 98, _7, _1, _2, _3, _3, 49, a, t), f1, f2);
301307
#endif

0 commit comments

Comments
 (0)