From 4617c83979f058f9568270ea4c5ee71ab603cdf0 Mon Sep 17 00:00:00 2001 From: ccsuzzh <1719571694@qq.com> Date: Fri, 7 Nov 2025 16:02:54 +0800 Subject: [PATCH] add some operators --- master/doctrees/environment.pickle | Bin 121442 -> 2081329 bytes .../functionlib/dsplib/activation.doctree | Bin 0 -> 376734 bytes .../dsplib/adamweightdecay.doctree | Bin 0 -> 43369 bytes .../doctrees/functionlib/dsplib/adder.doctree | Bin 0 -> 49151 bytes .../functionlib/dsplib/applymomentum.doctree | Bin 0 -> 36103 bytes .../functionlib/dsplib/assert.doctree | Bin 0 -> 9054 bytes .../functionlib/dsplib/attention.doctree | Bin 0 -> 25669 bytes .../functionlib/dsplib/avgpoolinggrad.doctree | Bin 0 -> 50220 bytes .../functionlib/dsplib/batchtospace.doctree | Bin 0 -> 98709 bytes .../functionlib/dsplib/batchtospacend.doctree | Bin 0 -> 98848 bytes .../functionlib/dsplib/broadcastto.doctree | Bin 0 -> 100415 bytes .../functionlib/dsplib/conv2d.doctree | Bin 0 -> 57725 bytes .../dsplib/conv2d_transpose.doctree | Bin 0 -> 51637 bytes .../dsplib/conv2dbackpropfilterfusion.doctree | Bin 0 -> 44137 bytes .../dsplib/conv2dbackpropinputfusion.doctree | Bin 0 -> 44227 bytes .../doctrees/functionlib/dsplib/crop.doctree | Bin 0 -> 16200 bytes .../dsplib/crop_and_resize.doctree | Bin 0 -> 31778 bytes .../functionlib/dsplib/depthtospace.doctree | Bin 0 -> 79721 bytes .../functionlib/dsplib/dsplib_index.doctree | Bin 2901 -> 4595 bytes .../functionlib/dsplib/eltwise.doctree | Bin 0 -> 75267 bytes .../dsplib/embeddinglookup.doctree | Bin 0 -> 31482 bytes .../doctrees/functionlib/dsplib/equal.doctree | Bin 65466 -> 65466 bytes .../functionlib/dsplib/expand_dims.doctree | Bin 0 -> 11776 bytes .../functionlib/dsplib/expfusion.doctree | Bin 0 -> 80179 bytes .../functionlib/dsplib/fillv2.doctree | Bin 0 -> 17000 bytes .../doctrees/functionlib/dsplib/floor.doctree | Bin 0 -> 27228 bytes .../functionlib/dsplib/floordiv.doctree | Bin 0 -> 31728 bytes .../functionlib/dsplib/fusedbatchnorm.doctree | Bin 0 -> 44499 bytes .../dsplib/groupnormfusion.doctree | Bin 0 -> 47983 bytes .../doctrees/functionlib/dsplib/gru.doctree | Bin 0 -> 74736 bytes .../functionlib/dsplib/leaky_relu.doctree | Bin 0 -> 32779 bytes .../functionlib/dsplib/linspace.doctree | Bin 0 -> 16206 bytes .../doctrees/functionlib/dsplib/lstm.doctree | Bin 0 -> 46755 bytes .../functionlib/dsplib/matmulfusion.doctree | Bin 0 -> 80658 bytes .../functionlib/dsplib/raggedrange.doctree | Bin 0 -> 62298 bytes .../doctrees/functionlib/dsplib/range.doctree | Bin 0 -> 44141 bytes .../functionlib/dsplib/reduce.doctree | Bin 0 -> 68815 bytes .../functionlib/dsplib/resize.doctree | Bin 0 -> 24233 bytes .../dsplib/reverse_sequence.doctree | Bin 0 -> 19117 bytes .../functionlib/dsplib/reversev2.doctree | Bin 0 -> 17209 bytes .../functionlib/dsplib/scalefusion.doctree | Bin 0 -> 60543 bytes .../dsplib/scatter_elements.doctree | Bin 0 -> 95145 bytes .../doctrees/functionlib/dsplib/sgd.doctree | Bin 0 -> 40512 bytes .../functionlib/dsplib/spacetobatch.doctree | Bin 0 -> 97668 bytes .../functionlib/dsplib/spacetobatchnd.doctree | Bin 0 -> 97822 bytes .../functionlib/dsplib/spacetodepth.doctree | Bin 0 -> 79010 bytes .../functionlib/dsplib/squeeze.doctree | Bin 0 -> 11734 bytes .../functionlib/dsplib/unsqueeze.doctree | Bin 0 -> 11752 bytes .../functionlib/dsplib/activation.rst.txt | 314 +++++++ .../dsplib/adamweightdecay.rst.txt | 108 +++ .../_sources/functionlib/dsplib/adder.rst.txt | 170 ++++ .../functionlib/dsplib/applymomentum.rst.txt | 101 ++ .../functionlib/dsplib/assert.rst.txt | 45 + .../functionlib/dsplib/attention.rst.txt | 79 ++ .../functionlib/dsplib/avgpoolinggrad.rst.txt | 120 +++ .../functionlib/dsplib/batchtospace.rst.txt | 96 ++ .../functionlib/dsplib/batchtospacend.rst.txt | 91 ++ .../functionlib/dsplib/broadcastto.rst.txt | 84 ++ .../functionlib/dsplib/conv2d.rst.txt | 192 ++++ .../dsplib/conv2d_transpose.rst.txt | 179 ++++ .../dsplib/conv2dbackpropfilterfusion.rst.txt | 139 +++ .../dsplib/conv2dbackpropinputfusion.rst.txt | 137 +++ .../_sources/functionlib/dsplib/crop.rst.txt | 64 ++ .../dsplib/crop_and_resize.rst.txt | 94 ++ .../functionlib/dsplib/depthtospace.rst.txt | 84 ++ .../functionlib/dsplib/dsplib_index.rst.txt | 49 +- .../functionlib/dsplib/eltwise.rst.txt | 99 ++ .../dsplib/embeddinglookup.rst.txt | 101 ++ .../_sources/functionlib/dsplib/equal.rst.txt | 10 +- .../functionlib/dsplib/expand_dims.rst.txt | 42 + .../functionlib/dsplib/expfusion.rst.txt | 101 ++ .../functionlib/dsplib/fillv2.rst.txt | 71 ++ .../_sources/functionlib/dsplib/floor.rst.txt | 78 ++ .../functionlib/dsplib/floordiv.rst.txt | 81 ++ .../functionlib/dsplib/fusedbatchnorm.rst.txt | 91 ++ .../dsplib/groupnormfusion.rst.txt | 100 ++ .../_sources/functionlib/dsplib/gru.rst.txt | 201 ++++ .../functionlib/dsplib/leaky_relu.rst.txt | 75 ++ .../functionlib/dsplib/linspace.rst.txt | 68 ++ .../_sources/functionlib/dsplib/lstm.rst.txt | 181 ++++ .../functionlib/dsplib/matmulfusion.rst.txt | 93 ++ .../functionlib/dsplib/raggedrange.rst.txt | 88 ++ .../_sources/functionlib/dsplib/range.rst.txt | 78 ++ .../functionlib/dsplib/reduce.rst.txt | 211 +++++ .../functionlib/dsplib/resize.rst.txt | 96 ++ .../dsplib/reverse_sequence.rst.txt | 105 +++ .../functionlib/dsplib/reversev2.rst.txt | 109 +++ .../functionlib/dsplib/scalefusion.rst.txt | 89 ++ .../dsplib/scatter_elements.rst.txt | 178 ++++ .../_sources/functionlib/dsplib/sgd.rst.txt | 109 +++ .../functionlib/dsplib/spacetobatch.rst.txt | 86 ++ .../functionlib/dsplib/spacetobatchnd.rst.txt | 87 ++ .../functionlib/dsplib/spacetodepth.rst.txt | 91 ++ .../functionlib/dsplib/squeeze.rst.txt | 42 + .../functionlib/dsplib/unsqueeze.rst.txt | 42 + .../html/functionlib/dsplib/activation.html | 887 ++++++++++++++++++ .../functionlib/dsplib/adamweightdecay.html | 281 ++++++ master/html/functionlib/dsplib/adder.html | 352 +++++++ .../functionlib/dsplib/applymomentum.html | 275 ++++++ master/html/functionlib/dsplib/assert.html | 213 +++++ master/html/functionlib/dsplib/attention.html | 246 +++++ .../functionlib/dsplib/avgpoolinggrad.html | 293 ++++++ .../html/functionlib/dsplib/batchtospace.html | 318 +++++++ .../functionlib/dsplib/batchtospacend.html | 314 +++++++ .../html/functionlib/dsplib/broadcastto.html | 309 ++++++ master/html/functionlib/dsplib/conv2d.html | 372 ++++++++ .../functionlib/dsplib/conv2d_transpose.html | 364 +++++++ .../dsplib/conv2dbackpropfilterfusion.html | 314 +++++++ .../dsplib/conv2dbackpropinputfusion.html | 314 +++++++ master/html/functionlib/dsplib/crop.html | 233 +++++ .../functionlib/dsplib/crop_and_resize.html | 270 ++++++ .../html/functionlib/dsplib/depthtospace.html | 307 ++++++ .../html/functionlib/dsplib/dsplib_index.html | 90 ++ master/html/functionlib/dsplib/eltwise.html | 321 +++++++ .../functionlib/dsplib/embeddinglookup.html | 273 ++++++ master/html/functionlib/dsplib/equal.html | 67 +- .../html/functionlib/dsplib/expand_dims.html | 211 +++++ master/html/functionlib/dsplib/expfusion.html | 320 +++++++ master/html/functionlib/dsplib/fillv2.html | 238 +++++ master/html/functionlib/dsplib/floor.html | 257 +++++ master/html/functionlib/dsplib/floordiv.html | 260 +++++ .../functionlib/dsplib/fusedbatchnorm.html | 267 ++++++ .../functionlib/dsplib/groupnormfusion.html | 275 ++++++ master/html/functionlib/dsplib/gru.html | 372 ++++++++ .../html/functionlib/dsplib/leaky_relu.html | 256 +++++ master/html/functionlib/dsplib/linspace.html | 235 +++++ master/html/functionlib/dsplib/lstm.html | 353 +++++++ .../html/functionlib/dsplib/matmulfusion.html | 300 ++++++ .../html/functionlib/dsplib/raggedrange.html | 287 ++++++ master/html/functionlib/dsplib/range.html | 277 ++++++ master/html/functionlib/dsplib/reduce.html | 418 +++++++++ master/html/functionlib/dsplib/resize.html | 272 ++++++ .../functionlib/dsplib/reverse_sequence.html | 273 ++++++ master/html/functionlib/dsplib/reversev2.html | 277 ++++++ .../html/functionlib/dsplib/scalefusion.html | 293 ++++++ .../functionlib/dsplib/scatter_elements.html | 400 ++++++++ master/html/functionlib/dsplib/sgd.html | 283 ++++++ .../html/functionlib/dsplib/spacetobatch.html | 310 ++++++ .../functionlib/dsplib/spacetobatchnd.html | 310 ++++++ .../html/functionlib/dsplib/spacetodepth.html | 312 ++++++ master/html/functionlib/dsplib/squeeze.html | 211 +++++ master/html/functionlib/dsplib/unsqueeze.html | 211 +++++ master/html/functionlib/index.html | 45 + master/html/genindex.html | 853 ++++++++++++++++- master/html/objects.inv | Bin 1575 -> 17369 bytes master/html/searchindex.js | 2 +- 146 files changed, 19716 insertions(+), 24 deletions(-) create mode 100644 master/doctrees/functionlib/dsplib/activation.doctree create mode 100644 master/doctrees/functionlib/dsplib/adamweightdecay.doctree create mode 100644 master/doctrees/functionlib/dsplib/adder.doctree create mode 100644 master/doctrees/functionlib/dsplib/applymomentum.doctree create mode 100644 master/doctrees/functionlib/dsplib/assert.doctree create mode 100644 master/doctrees/functionlib/dsplib/attention.doctree create mode 100644 master/doctrees/functionlib/dsplib/avgpoolinggrad.doctree create mode 100644 master/doctrees/functionlib/dsplib/batchtospace.doctree create mode 100644 master/doctrees/functionlib/dsplib/batchtospacend.doctree create mode 100644 master/doctrees/functionlib/dsplib/broadcastto.doctree create mode 100644 master/doctrees/functionlib/dsplib/conv2d.doctree create mode 100644 master/doctrees/functionlib/dsplib/conv2d_transpose.doctree create mode 100644 master/doctrees/functionlib/dsplib/conv2dbackpropfilterfusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/conv2dbackpropinputfusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/crop.doctree create mode 100644 master/doctrees/functionlib/dsplib/crop_and_resize.doctree create mode 100644 master/doctrees/functionlib/dsplib/depthtospace.doctree create mode 100644 master/doctrees/functionlib/dsplib/eltwise.doctree create mode 100644 master/doctrees/functionlib/dsplib/embeddinglookup.doctree create mode 100644 master/doctrees/functionlib/dsplib/expand_dims.doctree create mode 100644 master/doctrees/functionlib/dsplib/expfusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/fillv2.doctree create mode 100644 master/doctrees/functionlib/dsplib/floor.doctree create mode 100644 master/doctrees/functionlib/dsplib/floordiv.doctree create mode 100644 master/doctrees/functionlib/dsplib/fusedbatchnorm.doctree create mode 100644 master/doctrees/functionlib/dsplib/groupnormfusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/gru.doctree create mode 100644 master/doctrees/functionlib/dsplib/leaky_relu.doctree create mode 100644 master/doctrees/functionlib/dsplib/linspace.doctree create mode 100644 master/doctrees/functionlib/dsplib/lstm.doctree create mode 100644 master/doctrees/functionlib/dsplib/matmulfusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/raggedrange.doctree create mode 100644 master/doctrees/functionlib/dsplib/range.doctree create mode 100644 master/doctrees/functionlib/dsplib/reduce.doctree create mode 100644 master/doctrees/functionlib/dsplib/resize.doctree create mode 100644 master/doctrees/functionlib/dsplib/reverse_sequence.doctree create mode 100644 master/doctrees/functionlib/dsplib/reversev2.doctree create mode 100644 master/doctrees/functionlib/dsplib/scalefusion.doctree create mode 100644 master/doctrees/functionlib/dsplib/scatter_elements.doctree create mode 100644 master/doctrees/functionlib/dsplib/sgd.doctree create mode 100644 master/doctrees/functionlib/dsplib/spacetobatch.doctree create mode 100644 master/doctrees/functionlib/dsplib/spacetobatchnd.doctree create mode 100644 master/doctrees/functionlib/dsplib/spacetodepth.doctree create mode 100644 master/doctrees/functionlib/dsplib/squeeze.doctree create mode 100644 master/doctrees/functionlib/dsplib/unsqueeze.doctree create mode 100644 master/html/_sources/functionlib/dsplib/activation.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/adamweightdecay.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/adder.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/applymomentum.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/assert.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/attention.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/avgpoolinggrad.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/batchtospace.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/batchtospacend.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/broadcastto.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/conv2d.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/conv2d_transpose.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/conv2dbackpropfilterfusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/conv2dbackpropinputfusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/crop.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/crop_and_resize.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/depthtospace.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/eltwise.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/embeddinglookup.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/expand_dims.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/expfusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/fillv2.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/floor.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/floordiv.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/fusedbatchnorm.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/groupnormfusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/gru.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/leaky_relu.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/linspace.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/lstm.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/matmulfusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/raggedrange.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/range.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/reduce.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/resize.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/reverse_sequence.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/reversev2.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/scalefusion.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/scatter_elements.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/sgd.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/spacetobatch.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/spacetobatchnd.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/spacetodepth.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/squeeze.rst.txt create mode 100644 master/html/_sources/functionlib/dsplib/unsqueeze.rst.txt create mode 100644 master/html/functionlib/dsplib/activation.html create mode 100644 master/html/functionlib/dsplib/adamweightdecay.html create mode 100644 master/html/functionlib/dsplib/adder.html create mode 100644 master/html/functionlib/dsplib/applymomentum.html create mode 100644 master/html/functionlib/dsplib/assert.html create mode 100644 master/html/functionlib/dsplib/attention.html create mode 100644 master/html/functionlib/dsplib/avgpoolinggrad.html create mode 100644 master/html/functionlib/dsplib/batchtospace.html create mode 100644 master/html/functionlib/dsplib/batchtospacend.html create mode 100644 master/html/functionlib/dsplib/broadcastto.html create mode 100644 master/html/functionlib/dsplib/conv2d.html create mode 100644 master/html/functionlib/dsplib/conv2d_transpose.html create mode 100644 master/html/functionlib/dsplib/conv2dbackpropfilterfusion.html create mode 100644 master/html/functionlib/dsplib/conv2dbackpropinputfusion.html create mode 100644 master/html/functionlib/dsplib/crop.html create mode 100644 master/html/functionlib/dsplib/crop_and_resize.html create mode 100644 master/html/functionlib/dsplib/depthtospace.html create mode 100644 master/html/functionlib/dsplib/eltwise.html create mode 100644 master/html/functionlib/dsplib/embeddinglookup.html create mode 100644 master/html/functionlib/dsplib/expand_dims.html create mode 100644 master/html/functionlib/dsplib/expfusion.html create mode 100644 master/html/functionlib/dsplib/fillv2.html create mode 100644 master/html/functionlib/dsplib/floor.html create mode 100644 master/html/functionlib/dsplib/floordiv.html create mode 100644 master/html/functionlib/dsplib/fusedbatchnorm.html create mode 100644 master/html/functionlib/dsplib/groupnormfusion.html create mode 100644 master/html/functionlib/dsplib/gru.html create mode 100644 master/html/functionlib/dsplib/leaky_relu.html create mode 100644 master/html/functionlib/dsplib/linspace.html create mode 100644 master/html/functionlib/dsplib/lstm.html create mode 100644 master/html/functionlib/dsplib/matmulfusion.html create mode 100644 master/html/functionlib/dsplib/raggedrange.html create mode 100644 master/html/functionlib/dsplib/range.html create mode 100644 master/html/functionlib/dsplib/reduce.html create mode 100644 master/html/functionlib/dsplib/resize.html create mode 100644 master/html/functionlib/dsplib/reverse_sequence.html create mode 100644 master/html/functionlib/dsplib/reversev2.html create mode 100644 master/html/functionlib/dsplib/scalefusion.html create mode 100644 master/html/functionlib/dsplib/scatter_elements.html create mode 100644 master/html/functionlib/dsplib/sgd.html create mode 100644 master/html/functionlib/dsplib/spacetobatch.html create mode 100644 master/html/functionlib/dsplib/spacetobatchnd.html create mode 100644 master/html/functionlib/dsplib/spacetodepth.html create mode 100644 master/html/functionlib/dsplib/squeeze.html create mode 100644 master/html/functionlib/dsplib/unsqueeze.html diff --git a/master/doctrees/environment.pickle b/master/doctrees/environment.pickle index 13b2fb1c8dab4065f9792bae859104d7eaa7f2d9..ed85ef82c0918c676f4542c4cbb8c720cfeafba1 100644 GIT binary patch literal 2081329 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

@^{5VO_+QS8RF3c5sunTnIw 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

*;`J|w2RBA^_jrDWwsp7Jd* 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

ibrF+T%|$xbNS5e!NvOJ+#A+^5!9`4% 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%0DSMz)UL)qa-lF4l(Gs+V~&WKpv-nD(+IbT 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 diff --git a/master/doctrees/functionlib/dsplib/activation.doctree b/master/doctrees/functionlib/dsplib/activation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..80c1aff8c548b4c5311580234ceda587ba3d85de GIT binary patch literal 376734 zcmeEv37izw@jpb)6+z<_yfT_-mJO#Dh+?96gZB{+a2a+7W{17pomD(gP!P~jJk}$M z;w_$di-2N&(Ih4+o=G$@#)RF4Tqe<<(L|Gfy{r4Z?&|8-JRYTU*5|ZCrHX^#?6b3c1Um~(>T^-g)^^6B$~g8tNKrTbr9&a@DPM zAfTQN8wLMbM~NY$X0$bOH0tZ7kAgGV|7E=k9@)}bY%lexuWQV;Px?yRbh!3`aDCaC zE!pP04pK|Uif1-FcWuXlySr|h-+A35U90D>U-?kyiY4n;&RxIq{*DEgbUkrf=i+-e z++ONjJGb+R)g23;h0``Xe0$f!H+;Cp_^@Niij8v@!-pLUo?id#werk+=dE9T_xhEW zZ&>j}=Z#nXe(uHX+!@=IdP24EH8^4vI61!)cs9QaL`DYw?FRq83IFy0ujMQABl1=G zZ|8?k>chO2AC}*YgSh$hw)*;9vAVtv@KsT)hv7hWq`Iz{YtRmtj-58`gj{{wv}u_U zna8q9HC8#M4>PXagX)+#s3rqMM*uwAmA1pL z&zE&X>-3xz?EOIIArkWXrkYvRXSFpIjp_aE0AjIt!5pYy5LZuU0(As-B*rRG$a6fb z8Y!$w{bBy{Tu|DXoV}2Y8rvGC=UUp2DfO+-PS4fDi++tw=fLc3UtAhEyPm6Vxz=3E**PAx^)hG&0DAehm42lIUOc?;dhY;p?!IPcPw2V zjB&^<9m`gA-3}?`vJGo*hGfEW&capjcH{T2g8y|addg}Z)HPNHC&Tc4k@;|#8-wJ$ zIoi9>fu39y7k$}e+1HQo8>k3iiG|IUYx!)M0J9}MSiZ_@Z70^#rJnCdZeSYYU2%0WX^!~zWVHJ{cu1G43s^&h9OdXf?5!W7?@*ppv*K+&D@L+e zVGon9<89k%@Ktcr>&7%V#%3BMgjt&*2ck2?TAsqRTru9f`d`W$spr);0PEju=M_5{ zd|)@Pn8QNz>eOZ+8q=mt_6n%+D?Acw`ByrmtVxb>%`B0`>34d22fsTp^Z4 zuwe4Z8K|=1oZrn|+WFAx^{a00y8G6y)l0z6-_5;c;|&jQyyM3B^-vayQ>N!;)-|4A zlLcBbM}FqT)*h;8%uJb?%Z$!UnW9Ez>zni0%#@nirlLA$c*Z~dfXrxhX0EYTNtYAf zFFb$qf7=70LeZd|mvlUQE9{AM z-gsNbBlG=|ZanAn(-?6dGi(}LI=IsHtFBzXs?@RQ(ym8Wi%bt@2s+g9=*4i_hTE5S z-L~?b6gN>MujUPfb%}0$t_m(|F9n21g!pb+-hMZzI#)$~N%&uz1q9Ee4wr zrY^Ieh&W%uS@Bm{Xo7QKvUwMJgsXV<%@7wtPh_?0wj0=TvH;y*2lk0v2V$dMOWeEr ziJKUvz_dKuOPyE5V4XU3eiIN`%n`9mo$P#pAdR@%*a5`Dsk8Lvv}q@08}ov@E-7{1 z{1_C)9g7y~d%=(=k2tqE*D}4SzOE(%r_Y3KbeSg?JS8&QhSDV+H$MS2bw@a11*C_@2d7Ft!P^GF6? zB&poALQIqGN=LFf(ut3JBbe~k=>3L=9d-`yj@LsS{cicG zd-eJ?YdW62qhrkyR>bieWL*!>h24kW&z;wK-6B@a-TcJH2P}xa+{mkeEwnjP>T@%S zl_KNGbO(jqUUSahch2w(D=nwA)XmHnhq3L#js;J_wgTA4MpkCU@nMj>MM(+uDjdtg zd$HpVTN!fqQO@Wyn7paeG98yLV3SbXTJ^d9#XS$4w8`I)AEeu)=EVTzUq6rZ|B4+e z-we*{Q)#e*&SC9@(YUbFK5g4?To>MBrj)Xb*pJ0Z)h03sOLpos` ze<@My->xurQTc{>BKuT~l`F8r1{zfYF;#rhZmwlIUrfl7zB~&m?Y*=9soA6&w+iJ_UzpHq7Eg+^ z$yBRs=qKL$V_V}5QKgf2_5D@i_F_v|U^ln-_QHieU+vAX@DjOzK3}cJkUNm|xWL!r z6VIt@6(nQB!uvPgu)Ooidx2G)n5&;L;_z%SR|{*exiXi!+8@mv-qbX+K9}iSauwW4 zhBX)VNII@sw0;#^<@^PH{mLuF-cHxzXW*Uy*$$gOut;xse~~mAqA;Ux?Q(0v}4e z*xlo&ABAnBu4k|ATD=q&|BZ8Rf^8C zDJr$K6E@xD6|4Eum%sO?%d+_C!fw15ZdRFsktH|R>l?v@r&#kJO=|mC2#_=}9ki65 zw`$Gb2VlEFz~-~6SEJYb@@IxzO1ghu_(j4bjk}e5K`LgQ%JfqFD>2cNx_lT5et${$ z-7g6&wFs`O$R7! zpgQQfcXh{Q%ex*}(YgHgj$1Ehx3uoLICFH<^t$@oF}dO?dx3bU8aCYVK*uv{J0HJ! zE(>1=G9tlWRw}z!Aqhiv#Nj&fXRQ5fYGmj9FdA}Mu&b0E02Rk+nJaJp}QWHG-ktzbyLKXP>pG-`i@sUr4ALY74D zkKCD5Beg#w^qS?H?f%G<@rJ0v&Aa;W{)n)^E(;v&g$sSYDj8UKiL61NuSy2UGDyjA zyC@mpK7_bgD3UmJn~&YHVCU+EgB}}B>}q)J?LSzQ4x&q$Z@Q`-6X<%bYn1 z?6vCV^6bn3p1^4tXweimq1k6_47(2fmJEV`!I$yeRevFQ6!hNKs>;nbxM zZdmmIyI{G1`&ncKEa3l5E(=v4?6!(`0V=@{P#^ir=m+uBkkgmFu@zMTEz%~7R^XVK8eRmzu3 z+ovsJntlGKzMP{|*teT*AHFd93NS+lDj=sR>w3@jM^vXUsls1?eL+ICT`oP+n`iX- zs-R=@QsiFxd{xjvu0{&F$&kILO*>qD8yNaQIm1NP{m|6thiegh@I^# z*f(Atd#>yDheaPt$CArHwx|@vCu~1SG`jG<7x*%G=i}G0n{ri0K+}B7xizy|;mah4 z*EKZf>NAyljvlk`uqy3NUHfwApYFVQ?fTVs3O%B6Mip=>sZW?a<+yxZCA%jEb(qk+ zaqcpxNTHRcW9ye8+>vAd zna%v-v(Y2>nKInF4{&hZ%=$AjtiO5+YwMb_>lF4$r5w*?w4T*cJYO{J>^bNBDb00r z=1du`s$Cd3dgSQ6_Z~aOmwM)2!<2py)-o)^WVTFY-^iI!pPdO!kHwa@9DJj1${G7M z7pKZ|J(GrWoa9?22^uAfsvCUIIkUOQ`ZF{$`6aNf;+BT(vz#&g{|WY`PB4l3(Oy$1)ZqehmEQZXw|-*2JU+v7qOcIo<7;#a zFx_rWj=r_biXhD(Z(ZDy^zu&s@-lGfG6t3g*de^EW>ZaX9C&y@|i^t1;IX^(_}g zK-8+zUw+`H_s?Rm(0WLiB3|8$^n3iQid+wPVXEC)GS$P9K3@@BhP_yO=<^l9g|#Y7 za7+J!X1%5v#pe39R{pgy)%1}8f-0D5@Q%YJ&qAld#+#pl&dZLw=8NYoz_Y|UR;+=3 z%_ugfWk*3TIPXFpg}^?SQ$T;d!IYWB%(!tQwI?EQ0ricQEK6zMAA`rJ>>LWi)ckfH@S9-f-a2}7*&7cDJ zhwsXVYx{R`-8^HH>KmUvLV{+}@vCaBGa=r07FX-lTBW6dLJNsAb2Vl$!2Yw0u_;L- zOkd=Ld%d!ubV0znuw@ojC9+7fM#Wms8sTNe6Jz2n^^!CV!sJ*UCU##`W9N&oqQg+7 zQ3%6u8aIinfoX>9~4PXK5jOR^#oDbSz}wNrRl)wdUFl z_ueUEmYt;f8OPp&^God!|y$vXE=W@JuU5!+tyV{F#bCCBPr#!5ii`Jhh-> z$;EKFaG|0JzGKPtYClmvc4IOnh1t%8;;%K`rTtd;QwCe2bbe#*9+8F=e!gJg9IB z65=hQN;IH(~r06|Mum6sLz9 zw1&eM%HYd+@VHiZ_MQ0hxJT={mR}Bc;^4aFV&>1p%i!sdn}|=OZ9aVh8Y65|)1eQ0 z>raC}$4>)(<6@(lq=y6aE&|Utfr&QmMzG?51*I~1GkE8p{-2~4@0}*NeSN|_dfKXK z-U`#aLm=fZ>>K=rolTO!6bVm|m?gE0$)PQ=715<;xf8?ZZ?m;)HLsJp#&nb4xHc6z zJ!gPdMC{m)-j_&SM6^MyZ4bg>>GV_436VuXxn9Kzgc1DO(iI5%#NeV82uuwx5GJq! zA^nATJ`r}?P3a3fnCbJ?E+cb`NCEWuYNdyifvofue5Gd%sVC-J>KbS9^&Y-X)!F`3 z*P8pxFN-f?r)9)>*_k=9wu`l_Yx&%+>scqW=!|IZau<(szDD3u4`j z%$&>xatdFNIWRM&KHD(87M`{$pS}vuS;6-djY%2^RUw0u-HkUc>X^F*zUU2nm)R^= zH9yQ@arhFjk!t+KbFisKWt9qFx4%qe0xQ<_P^u&t59zY*@Pxcna$tyzDk{Hww-9kkz%>#j`w?`BmzNOeKBdCw9IF$a#n? z0p3vPA{73O7$`;t5s-M_#gVQ_`~?< z<}1fq7210-3YIW(e05BWLAR2ua&ITKwbC|7g9g%bP0h{4FgI5VT>NG1C4CtShk9@^ z@hY6;VXopod5}kkcqqWN-PpUeS!-T~vLw+=RfCe5kDIQUt)l(E#9D71{##6Nr(TCI zhba9sk5apJn4K@8nw|w}#erE6UU5o46Uh*s-PCw&bCEL$cw`cg0oc-l^wIU;JsnG) z7LCU6-~>3OuA%Nc_}vJWqu3yClQ7VR-*M&Tz(LeNcvKbJHS>Pb#CuFQJcEiohmrsO zOZ*}vA9^bzQas+E;3i!M1++kBK|~KI^%KAT*Iw#9g8$sw1no!B{ND&1Qk$Dm2frx;zf>9hJAvB- zP73{G;Ai4~|A%XCsu+=}sydSW^xx>JDpuL>MgaDM16MrUvGkFSTjsLt!A`2rHO?&N z`AKjXe#&v$Z82Lv=|V3m#p+>Vb}jZtS>t zxw@yq<;h$D54?w;Dl~pZaiE8Zic#$oF9>JE1R*0swQ!Df-c1lH(|BmH9|-i_qP5D4 zUm49GsJ`u>es$FU0leMfJtR!_Xk+0*W`g|j(tfSQmZrv;n#xjzFHv1=KM@3ea#>(; zrI#=@I~L}OE8MR1wWtX4#ja-UXW1gP6t4VEF4Ybxc76z{ zQ>&`JoLL-1`KMqhf--n2TED{mYf-28z^&uJkw7RCvmC-5^nU-&t?S}1%E1Qt$ZQsKuZRjI)8-`Vk+3Pm_aE>LWU zSfHYnu{G^Xe+XOC&fr=K)$o5_k{l&&bEu+1RD`0a5YMaUzcS<(6*3xfx(vSLvghsI zq@1sP;w{3%2E?aYZ4tf=4Bj1vv`sIxY0B`0H}9_;->9mxy9jNH`QSuw_^$Pecn_tZQ5ZcjU9K)q0^?p%cD;kJ9_lq z@DhvSA%UUFrJ>Kgh(4D)fdo}AEAIrm+c-K{M0;gmXg~zP z_pf4ub`?=WysP*_f~&X>tm;f~73_R*717awCq{PtKZ(~=_z}BQ5m)zWaphrA8d_C_ zvE-Yos<`isDy^{jK+pZ#qNDt2y9JzT$%6*Msd2yQtK#GV?IL=W`qnkp=4NY@Rxai{ z&1tX9?*d_(fq%Qfzi-07J*Kvo`a=U|OI@zDeQJAUsb6bdBRt%{y)?9LTy+a{wHkzL-lN@ew|+_~p8wbWJ@;rH6~ ztL(#+3JbR@i8tOHI|K=q(pP2y*1Go??gw++3kS0Q8Coj57BfPL=LoYP9MlZolY}{4J-a10LmMEnLSYtMkw;Vd2^lIZ)LRekb~rhhzY6ET zhoO*^cwY_2f_Uq=mIi`RwM`A#x<=UCt$|zw@A)JtRn*n8#&Gz-@RoLdS`l_Pa>e$- z^&qp1MXPv_0E8olV*$a5Ah{mve*)C&B-DZontz^KeQC{AuuE2z)s+ zg=h!?*z*=?wz`>R@wO~WOTg%xmi;W7BbFTe04 zyqelxSj9el4*moK^JDl7@UjTZ?JJOLrUFxnUI!YKD++JG8wsi&gS%t0e+B1;f?fup zlx+r~=3a>L(C)#Wm=elqLW!dwtnh0Wk+cgFHDF4c!C{q<`D-uMCShhDi(w-Rgu`Kg zol8%{L{l!6qD|Q4Z2&b_f_DXGVoE63g%U@wZ^2;q%EV;I&&4dKkiWnh`71He6!KEE zf&4)8x*+DYPrUe9im9UT7phX@A3czz>eA4Lw)$cnugj~w3P;??UCb8DOIU{35vg)x z9pj^tixzf;57mkj1C_yw3nO4)Y3Ph* ziV=H9V;FH^&yW?Bg|XUarNcNC_2gB~sBg+@)K|W>W4?t6y5z$#$%-<-wir`nPjStK zisG`pH%CeYDq()XqST*x58EwULohW|@h%YFGVhAzJ59TiBL-KaHD$OLWYZ0;#Zm>(U+g0su%gr zLuLYo3>6gnab#>t(n*+TDiEaTbsAbxCFyCHY^o%cvh@|Z@Bt`Nby2XpWCo^yiWs55 z%-{ygj^af72tZMKYHE_P7Bic2=V};Wm#tsHL{sjRq7BIFG{}Pl<5!ph3UZ;q5#;3% zjE^wODbzo-M!okSWGSXlm!b{SZ}m~fn8grG2L-&)ksA2ufoy>k6#fn? z{0#nv>i>s9(Ql$Dt;wERm0{r(-nW=H=vSN`-S(}tAoJ7 zh2MIwK7dz?3%}!kf6xD}=YKo+-%kFwi~aqwD)T&9nR`deuFMbN^|L3hGM}xV;op-I z@6y!ehaz(QDvingGOF@3v1v+WnbTo_7VRtS@_ap}hRQgI8nY_*9Dr5j=0R4K`=5BV z=Y^O}RE9ba2BfUYk;^fv^07ROQoGxz-Uf+SF-r27{p?a7Hbxcc;*E#XElF{@3Bk#z zMYTIVvHRJ}Kv>kRo{0VIXS@o&um)Zh=7NaAv+zpZiSc70xZ!<0x7>zZJPT)rHuhx$#HdUQU*~X$xQKQo_1=Iu(3ZmD|$Y!){1)v5sa^H;B zmh^gBxLN+L0wMAM^pLPesVVGD1;K_~R+5uisu zmzq-3BPGBEJvs~=Ea(w`)#LO?_U1&C=awpmrl2OY+Jb;%@0 z;%ia9t>rfK7_G(>HLAg;E0t}kVSq-B9<|H&XJKlne2=IxsgaKrMvVeT88y;A@~F`z zm|0Y^x(EgYi+#%`F64>~YP4xJaV^7;q2l6Zj*Lwy_YfwUiUlcpop%c;-#4m>Yc(dD zD&?eXV}+x*#7{51`|!8E=3!t#}w#iVLB+_g^tv~M-M~`^zbqn zBOtm!KLgT+S*mCS`YCYGNrC<-6zHc)O{oiXCBQ|2ekV9s6zKd_j~D2&H6yA(_Yap{ zpd0O0tUwo?TdF=6@6z;fiEnQBmX_DqV=UNIasE6uRjEv~1_o#m|Cn8_e-%?hWgSF~ zS)BVwVa0jiC@apjkG$gix0qQ}qWU!qNLidCS7a3DJ>1Jh^ve7vDN3IsD5bt%;h>Z2 zcVLfxzd{Rz;CAt++;kg`vCCFSK}UtO6m3(D4##9u)u@zhEYcLm*bh@c1-?)ay-r4Q zjE@DN2FH-Ch6cq*-^z7T(rY;$1_UQ@cZTNbr>M|cOaTSC zP~Zsia;VTRFv}^_-?T=(0~1Z5E=3!t$55e@{(;Y$B9b zy;eeA!ago|AX}!PuCe;;Y`yngm|=0GizH&GL(a?rsrV3i=DT!k=IOuH%N;1mNG{%usr#0#J&! z3BX=kBeJOgl(LNgq-fU`m;x#Qg#t$bn3{I&j+sp@sk_1eyJd7QOf=xkiq?Y!zKJS| zUG4)YpuG29`E)6!h6)v-#&xKO8r(ss+>!KpmT`}4f}wIVH_Rqfp2M!03Kc0j5GtAv zc&NztUZ}i`si8tesBsi3tN=>OZbCduVn>l-dgT;Mq{;J0} zbD*J+*v#>cmc5x%%QsX!dG=kW;yG^KPL6zQy^)i{^!ocaLLB-(s zO@;y5Y(SW1F`6jouE!FF8x=B(IBqsY#Z8!KDomv4br!v>%Q4v$=ajOI zMU&d}coI`U#gkAFy>3NrddwGqqFy!jJQ8^I70i0dt1k&7EP7dgg^8xTDn;9Pbt5L5 z@~V_=c$L~o_ykixc~vNILfO>p3>>@V9a_7`2($yKMoU3AumN6$S(r&Aon@L%=}DD0|mX%;23(16efcH zY|MHJ`W9>G=VPKN=%r`_`d4-6gG~1tOaleI(BKOCGM@8)KV~@v`#sjMuf#-CuuIVf z>@iIDN0<%@c%dUT@X-TNrW-CDV+2Gq-6LQvGi!H^=}v@$PMGc!z;q9lno=`eCBOyK z{S+K5m@a?S<4hM?G6|;Z9W9&bPUDQzlV{t$&7Y0v(OmJ)n&oB@oj%Fs!cdNzP-$RU zpxP9+-7aAzv=t1{X33LwRna#vHB_cT)R+v{a~#HS&4Y~L`k#0VcOT3qDzlA&0Vx?S zaybUWJ<+7cvFJ2NdfZLQ=m&e=m-Jfh z;U@Wuepzh^DWbCp^cT*8Kf&O;gBxZOd@sV8iP{pRXq(`B6O&B^pOkF`AGMkATTB5J zd_sYv;7h%k@F`|CRp5UN1MHT~e%mK>rxa~KPHiS^gDIdO7YZCfE>f4 zhQom1dfuI@QRIBDP z1XqLxZkSDkT!mdT6(K_Ob-jA^?#2Ey8h{Jr9?h+oDk@ZjDo3HRMHzcEPhpl*Df}^O z{9nLCQ}|2K#te|;sxqy|2EAi75rCO!sDfJ$W65wKwrq9>Z9u0rh(|a`RDZ%wEx%xKjyCvc&pz?6pyELcp9TQ()l5dxY zTfy1-=6sfawS@jE$@g$g{`L&@U6MFe33g<51z(3scq$j|3*>zdM3lk+CUrM56DG#D{>vbyZ7l zmC{b^Yt$iy{-j9&b0sOd~-?d>S|1rvAAILxqZSDcXh+UxCS{ z7_pRXtnJix%uSdAYBmT3(aUS(cFf5FP&`BvZOBj|`ef4Ud5oLoukmGV$)pI;^Fe=M z4*UrQ;KST7n*e+r&J5*qDgdQun*e+tlT8Jnlx+kcwI%Z>OaT>uLV=?IOuZ%3XDEU> zwTAYB0e0)=S259)JEdp?a%xK^gDIdO7YZCfzPYxH$=?42ZBpYf+bP`lw#NN1Of-eN z6s_Z4>dT8keqB(2$ah}taT2D2LSCqFgnT*twE?r7!oAKK_wzB)6z)>Aj(c1;{bEc9 z1-#Ia8u;jeD1Qyti7^7A`Rh=~r)I70uWf~G;Gh%!`V{cj?WCsE{8b5X!CzN{gGG-4 zf7Rps75bei{^}nto4=mKS*0&9X+ym&dp#M|PwT@Op# zG9MjjmFCajl-nV{%?=5Rvn^qOU102niKYTWie6`N?|n2To2s>?Y-1s$$le4@0Tn(% zLG)S_N%jT_Kn=2|ylQa01f}1}nDx}uKVBGN(IH=hiKe_NMca7wEKD}#RVmx>D#f5K z#1v3o6$%`AH8q2}9y6PA=QS|EZj#=GiKg5sMH`S)4C*mV0R_2G;0W^a7}QTO+bP_C zWR3eTG0_z6QnZ2lDQv-p-Ccw}bz<@<*oAyYu$M!h{*75qf&Ncx&J-zK z9jzq+ajL_nFqMIFFhH9LEA5uvb1*ejHbT^x#L0IJMw|ji8FA7+@`%%7%q%K_Er0>~ z+-J81EN}WDS7Z>UiOD*#DeoKgwcF0?_xiN32;OSB zottiRtL4WSDpYt&(d#Ve-`kjMiYQ3g#zIcfzu#dBs7W9cM6ach^zRk{C>EXu`-{67 z9o>5UMbc~eCpXDo%*(pZmm)lW2>J^z!k=L9eZmd13BI8_C9L$MXq({s7ABhtJ}KJ> zK8mI8jVYjlPbhE{e5qOLWXx=8**pRU*e#W(W1^{CB1IdJQ!F))DWD)13S2?Xs~Wy~ z$=iJCXZs~duVgOw!X`M|FW`pR%=Ts2HB;dsMH}Hkkm-jo`BZcW`HrHa95VePW;rz{ ze_##zo0w<{bSc^ZJ%&twfa#!s7dlb{A3YEy)8XKCuDjh zkm)m}rqpCw32;HCx87NiY5uCG$@EUpHrZM?v!SW37VD-RTr*NXp=?5Z6z96S$WTWu zzaNPZGrDz)>vlNp}5g94lSivb4eIKTPngK#V^dcI` zqH6`9Mv#_!6ZHp}^;8afRv2M%6LlRXn)0d?ZR6GVFxiw>rEJ5i6g~X|rhxLQP~ga` zsp;ugc1gG-{oC4|TVkRqcS_L)7alYI#L54JrE@z;blKYKr{iVglIPlFpYqG0}eVNAkP2+*MbrA!OKa3AO`tbwII4X5L3j;1ltR7h0B2nEqgPGq_M zwgA*=xxNc#J>}IMV1V5`AC8HpyedW8cy&A`oARoZZFrR`*AK@OP+k=Z9CNPAS@eoGRDP#}rVI3k8lKFQ;6;7PFi}eTg;dw_~Cy)TL+x^_X&f z1*U@nUg$^-eDpxHTn{gkF#@8?_3uLlH47H4TyKYiPRjLFP_ADuHKi`sl>isz`Ul`( zQLgh>JzlOurwm=L>nD_5t{<*?<2;?VEqF*#Wftp4;G+FnJ-YD@k)7a9!N0L7OJ$sY z!T>GuSKHyhV@!d-PibMlb|#5$wy2x8WR9FkGn6mZEK{ z(*h=&s!pYBW6`EK$2ph+D)fbd=yfxabL=Sq#RAk(qun)0uVo20$zQm;yV34c&|f$m z{se>Xa&DMS@I4G?hHmsy!6!xA1m7A=HWhqQwh??3HF^nCKn0&r;3)V~Q=<WCD1+FW)}2~rdk?Q^1}Jv7EQxTzn4n2SwTD%V^9 z12j^!#xCz%iK(IT4x+{&MFTyokee5QgFuJ0PdqMk8)g%grDn&HL zV+ts*3I&e5nwn^wfSFA#L&v}XJ9kdQL{sjRq7BF?qS1&cpdc3t96??V(YO?|oI?F# zYt-8@(G==Zw1IjI(YOQCK>;sxqy|2EAWAgCYkrJ?XreJ2GN@T}X+)zH4mu$kYk+99 zNlmGVh7#a{XuJgu7DR);>T#k0?Joq;@Q#*EG!9eEQbL=BQRvBpcuxHv8l}W$3#}JcFv8-?3>RRcDX&V=HeS69lTCS5$~L@8RpvKf3Mj7%1&+L$x-wsZ znN7L#0T^JHt)In2Q|^?a4alj={AZW~3UZ;q5#;4m=D)`*r%-?28uhir&`Iv92 z%ACLI@yZ+;9Ei%?J6d*Seu!#bl9f5@RjSH}-*OqA5%0u3{^6`?r9Rg$Cv^t?uCNr^)ZrLTr2=JxP@%fbJPX(yQJ6h zJ~zoqH0d`B{cQDbEJEdp?a*6^SjVYiY7YZCfUJeDyVU|;-+0nrrbFi1&eQRrvb!a;D*2?cr%D9}Wy zDK!OB0$fm_$HBqk<^+G$(-dfDXo$&s-`4nW&7z5!8EuU<#k!`(57#ViFAd>Ol=9Cg zn+kakeez|x?1-Ao8If^OWj|TS`gX-@*yN>h&&x1Cn*(d@vj1-|HB=r#)ELBQ3j;6Y zmIZPG5TwAT9!dHuW*?Qq{saS3k|gBP43f0TcSsG{1F4=Uum-_^AXurnl7kMZzk~BU zt`tfa!IE_Vx89~?9f<)$MY$AhQ?ed_$)-wHDce}dDZX?hrhxLQP!PSCM)IXT0#Ji5 zmD?qi#jL0D*i>PJ#l4s&Of=PISEX#js}vEr3{yaPRVZ-e)zn1f4$N%I zowvdOyQSz6Of=3P z;jem}h(HgFPYF;WVw_Pn5%He>Q(1q19*KL`^|p)N%msK-?8$6`7t;DwIV zz()^6tM>3R86zONYTpl{-K<%(s(o)b=%i|Y9;)_zrKZ$XyAt4{YM%!V7Pk-hs~)e~ zp)1NgRFx`a8;du^J+{XbP_Zu*M6aKb z+~W-asKGtlc3AD1^jb#2fZ#mt&ItXKMdUx>PcZnt%?+~&zGJX!rh-q3wh6u|m~1Ne zq--PjD2h~vDWHN+C~y>fsVUMt%xr4eoC5>wmdYiVXv&>Zv;jFqk#4~hP>>4+jvz0G zB0Y&&PNDv&HR?aaL{q3s(FW=<6zO$L2L-&)ksA2ufha`^*CjCmqAAk#kkHH`QKLv# z!$Bt$=?6fOu9ccnQzRw81x4DdN>L>Ks;4Q^4$xfFdQM#{`k<*n;s^W0VMpZ1*XOda zN|2+FZ2#LPU)r;#GT_fdw=;Hv0b1Puk6p$eiK(G-52D5(M-@I;2r~*E1zMzkHruJtfegPVjx#!aH37VnW{P|SW^(NQWu^MnyC&3dpv4nCWl~YdMY>FrZl|} zLxqZLDcYtqEn%{$(p1VeR&0tFeIHXm#lKJxy=X@AqLT!mmksRIYuLQ@IqjACzHo1` zzA0PGR2g4AF}8L3@-z4Zhbb)Id9(LX%zCO;dPo>yaZhF~CYti96m8?xS1{R>SEX#j zs}$jQ7gIoaRVZ-e)zpOJ@0i(?JO2U$?3SNi-$qtB%AHcQ0XaoD24e~+$b|w&ke5R^ z_P{KsP~Qy(*rC2RCYnNBiZ)P>Ash!|Iw;_Uj?}Zp36$rJR&) ztZ-C;{t2dliWs3FdXb4N&|egQIxWx#4@b%_%BvMHz;1@`go&oSDn;9PwF;9>c~#0b zyh;`5V=)DkSA_ycUQJz~AB&kyxpNW>uyf~BOf=cRzmW2+&_R3jPFx z?|g2UP4L|cXNGR!Qo$!h+XUZ(m~1Neq--PjC@S;}rhp1Qp}1gzM|mwwN~6pEDDic2?Q**Bu~W_1q@{9BJq*xD(TjHZ=R!;k zm46U51}WNHLknR=p~FCnjL$q?bQNY9m9du&K%Bxbg;Z=%wRACAzuL=c@yqcPL z9E_PwEk_5!0J|mVI7~Fz%U5YkP zk0Bn{U^*z^g^tv~M-N1aM|jnb5fDv0@{qjD;!7hQHE_@g@puu4M^0)=O+1tU7sTTQ zaIhdA{8f(=4`_Z-G$8!7b*L(|<7MB4@p_q*Mu&Y;g4Af%c3Y#=2iTOQGR}K2K#Tkz z+2#BXF*Q{7LDZPELjwz=9l^tlcIcmZw4?WEq;8>d))#OoDQO3CQ3mbUw0fm>#*m>x zV<-%;3x{uGqN#9@qSsmUO6`ZqrYbrq+gRwRI{h$A0TnSqLG)S^S*LF+0CifYpNUyd zdG&N*ghicRkBO$dDn;9P^*l^A*)a_7x3z;2R0 zgo&oyDMcHQQ+4`kOaTSCP~Zsia_aOqG0Q2`*IA?f0VbM4U5YkPkEzo?#B@-=3mvI} zj~EUHEMnH6({!XY`(dzWK;GmN_{YOxz|6FQHU8gGnF6#7M$EZ4;zv}Ti9hx6h z)r{8Z+VQgMbg!vNX>|5zDe*-K&DL(}mpTx<8M^UKWt;IZK&#PzY?tpRV``|(gQziU zbPX!3Mh_llHM;(pSEHYaSw`in(_ui$8XdVPqekC!Tc+kDMd>^QrPTKX9JEYL1AFv) z0(vY2?+KjEZMV56uoQ!Z3Tr9arYgN3lTB5nQns;JQ(WU|OaT@7LP7L;8Ob$T1fT}j zaN9HWM$&6p$4&AV?C$QFx)JmjZh}9-;QJXj%qIB$0%wL&Hx+zRv`z4Rj>)EiPs%oe zkD^2a_e6}Rf=?)L6nv>E(XN=;)N;8q46s`wM`5BVcS_L)Qc0UdJH8x3)4XXFLa~^K6)TZiNaM$jDToLv@fI$vpDoKY+(!> zbV7-K43uausVOxjQUY91qC3IC;?@O!)zg%S|72gbr8er9%jIuyd1sVOi|W1K)bnJ9 zI;Y@g%g0q0t1|enn8Tq=LtSI_+1YyjtLFTDcDDCEQ`6Lvt8U1)&Kf4F{R!G`ZK)wr zzyI_pp^CaFrIr`F`xH*#%=+VXaW|3)}sK0RLOt|4EAG=Lnjq37LZ?t>1w?9w7^5 zq+nJ2DYxFHD&A!;q_Cu>ffQ|16%WT`Q&q8)ZFrTUWcy(Xs5v4OM6cJ8lxC?2K8 z!>r1Q(vy;2&+#xIIOn@FN_PPLg`MC}FaVF{hS>yQGn|=-mPyez0eB%Mn+iZF+Xz64 zmR*i1paM`Ra1?;4Y1y5a+0+ud3o7^y)IsXZE%~X&`(MFIg+S*(0`zv>N)l;9nk*q>R ziO}FWN<>NSAWFWT^m=xJ0h{E?@HK9jO_c19T{9IWQnV2zuj)}E-Qh*ak(dT5N`wYS zQBuwpPZqPB%HUJ2VQ<1jQ?N_X2JA6gJaaG|6!1bvYT%;>qFX#+J`^J$dW&Zz6pki2 z^)q+jaX9E?i{~e>#q*@plzNLt32?E+vjQ9}ws`of9^c|&{e~Vl58w9&LS>v$_7+c` zZ?PCM?R!+kGjhHC9r@OJd#5f+x4*k%JcZZX+)1oF!Pd^p*tDmz)=yx7HhW&Ot3ltz z)KD1=QDbiH7>>lYcETsHtsV1IZ`t`1W*?RPHo$=3Vs7~ea^%vCt)1^BXm3st8U|rj z-)k~KjId~j{T?Qoa<3F^ z*K$f~$h2(*XAju)dmY3(YbuQj)jY)(P zDh{mBRENXW*mS3|)fF&6qrpG5%UsJaHB{z8)R;8ba3Ds5!zVBrY<}t`?ME^DsI2!8 z3`j|XkxMgZ@QK#nA4nV)21k-@yaoe~yJO7Sxn*BNAEw>!YIrRvg0CP5>glgEuq8L6 zwy7ao*VtaT5BO)PKYUO;w>j5dc!0fS$BWsPnYm(n!9kn(<6w{8)nGHtBy+DJ{d|8Q>9s89 ze(*^^ups}kSER`Keit{)X1@OzyJjjtq-Y~R$UTv_F%49N2n}u{#Mlx^A0dBDdM$tE zj@SevWFt4sCPD^{LsoPuLZoOTLddO~9WV`4ga{3eBBY#7hCMOMsmwhR2H0ip?_#1U z*rjL#_L!}kV=x^Q@Ipsw;G+kkTQ_0e6C)sc>t-<&MJ5UL=VW0%9CWgE^HbP)xm0RO zy>+7mxY)Xx3l0`rH~dvkZ`}-qXS~kL)wfl*hPxOx=a2UlN6X%_IhAjnc-lf=P~kU& zqrRV#$u>8)G|jGS$QE;ASB3mS%4w)Bf0Kr2S74jQamo^G&D?@bXDSbd)m6;GV#@5V0&r!&>OyD4F$!MQ=+cD2#Hc^@E85j_xYL;CI$mJN@F_S`HI4L^> z43ewbc&id^#86)_`E^qC-a*hyO>|SV@jl~ibrjaX%fec)$J>fAGD(mLzs)VTseAr~ zfkK736m7$V2kwW|R1_1IvW>-^+J@NxrCsOpt5_F;^>Ve~!V zk(l*VBCCP{cFF4iOf=Dt?_mlkuL=c@yqbD{qX{#ca_1}< zVCT*`m}ttKQnUd%wZCyWrhtN6C~yS%kU)iy?8fq)nC%qq%dByK6cbJ1E=B9Omp0dG zA9ZWo_{>}0*JA1@F9>yxyig89{3T{N<%74Zeb9-CrhFhp>pm#NFvO2B9Tf0FM{3}s z2ciryT#CgAh-Qe_!8&Hv!Wu)o3JyA9h(7~{c#YJQnjtCyE*Rn-;}t{XuX>yzLf0|D z5WS;iGsN$4*5=8x?{5!eWD9~Q$Y?-SPw>Nu;Oo%0RjFL`9T=d^iI?rxKYHCW=d;f%~ z{0nP$4#7lI?v$bp$SF#-Gp2xoTqtk^d3ls-AIx@Y8jXPgcFX2OOf-eN6m8)C1E|+! zyA{r)j>oi6;0rB|z%PeM)nS%X(C4h7KL-;{K`%uc(8n;T1(*&Bc%dUT@X-TNCKWDP zVgy7psr@0P_uBZY9%oX}jz};m?`YXf z>SWcXEVS9SM%z@j1>?zYryz=a8Wr6OZKEl{UADKdiA?38*Ih(U z#$-{N%Y%;}D-ARcG8W~3;<2cYF`K9y_E#8?l0_kxW3Z?rtec+g{BKm-ZabZ~J^(4! zDA=}y0YTVO-(GXj>HG<}QNO+Bheq)B+8}PZ4Hw)K1BHrjDcXiLd>4~Vu?8vISkEag zcr>Pf@~BV{y`)BR!2tqLEIJJ;n7*eipY&RC+$4WZ@9wV0k)XdY8vX=>FUt+H3BLJo zW@smj3O*^?Cit$wWK+Q>WgEdqQPyRc0xI}~0!P7@nzBBPnN6*mkHY}Fwem$wH04ey z+JKy*tZ!lpD9D8ZN066CS^tRHPT}5Vjr(VqXbN{J+Q2=Qvi6^VOjZhfp~VsS>=T{pGFj zV>sx9vc3Y8^(Cn(HDy%-Tu{~qaIm1P{8dj=R`x9O)}|T7=K8i)tVL8jIoLm=Z0b5m zwQl+{6Sj(youQK>#rw21rZq4iKLJg>44b@E?zt2OXmj9IyF7FwriRKxh#G^YvPX*h z?m%w%At$i!>6*hl%6dO$AC<%IfdN78W!V^tT$({y$0uzJ4SC<70q*-iUrGwrj}Wj@ z6IBO&pbvsQ9#IXYiy&Y4A8x%3U)X>FLq)k1z0TssCz2WgA|lSl}U;0xGcy z1&+L$ngve5%%LqK`Z^cAY zs7uiX>M=y*K}-h)ywH&v_~?Ns5ecvRF#@8A$iOX$~^yo0on{$XP5g2eg~;>s4Rr2F=>ba7e+(EComdfe(KSX9Wnc;47NQCNJ&GG zOEYN5ehK>z1F_|}-Eb_13>6@Iab#?&_CqnzR8UCK>ny7F6EWFTeJ5ob%N|v=Ps0>Y z5hD~tuRM`e`zQgZ)2e+oWXv&>Zv;jF)wZDxipdc3t96?@A)&6J9atig0)~Npr z6HTEmMH{HcRP6)5i>%2M@Ipsw;G+kkReN}uj1drBwSN?QeISB@675i&;d4C3`hRQ&Q8na>#I5*Ve#vbMAdrE!bH1MfcvCqcr zqq0{K2BfUmkxMfw_OXe2-9oN6Dm%BWZ8s!EsU1Nn^&JBTt!?LlJ^CF3Ge&}U46fqV z+i;JkFkqRFx`a8;du^JzmEYP_Zu*M6aKb+@mA_#Uj*Ed)uFqUdu*q zlD~j=cYE7opug}0{0RnM2RFUZSEMb@A!-b|G(d#{a&N;t2Ddf*4?KSK zPs|`Hb$tQ@Qt~6@S`2=4c#_7dc;6eQweOQFv8+i&AFIp%BxbejaL_9vMH}h*@jms9@35}pu8#+IPz+09`Yb&Hs#Lc zFu-mNT7`+G+$lvHkW)P5Czt{Xa-qNx^ zXao0ChCXa~jj#*E6^;2Pl1!1Z<1gU2zuS(H2Ui}&-oARoZZFrR;OuJ(WD6a|yj=Y+hFipVB zrrfz746w`FlQ7YgJEdp?a*8mWhAE&R7YZCfULIjO3$vZVy}=syi!jj??ozaYJ3*MP zz~ob~3;B*btan1!N7m|EbV6THkl$tOp0WJvBN8n&VnE0z6Crr=|6it}a!LkX{v8vfm z+%IFDeN`Fp{N~{q@lJHZ3}??WtIsvgEat_5jP1R$%Wu8GWK$`(?+AX=eU}~r=gs3s8lJDhEN8teD7^6zw2Od=#jTuCxtl=;qB~?PM z#h^+Pt@{XL{ccp$ZhH!kO^VoL1hLfj#~kz&?g{qj_s6`T2;Lt%f*Wo__Zl%wsIZoz z*ICfL3ozLfF_5y2g`1*#i!lY%6c7rc*Um_~cZdKK3rFCo|Y#?+XUaMm~1Neq--PjC|3F_OaT>qLV=^;OU+6@!px?Y z%MW3I-4faRu!QcEq7BF?RyqVzKtV1PxPshYyX0NG^v}kuN_r*Vf&szByE~Vn$l3l4 zZkWw%KMcEOYN?T;jqo7I^GTR|DmsLGN6}FZd9KGSr{-kd8uarp(G=)Xv;leyd0vF+ zpnw-TQUf175GBvy;x$GG?khE=CeKQM3-Y`Q94yE) zf7R3Enf=;xO$2)uztJj=mQA0%K2Ra=OY1ikPrCQ6%5Br3@e559k^TiXjj1g3CJfMK z!&`P$LI%sXh)(JAfXv&>Zv;jHAR$s&vP>>4+jvz1Z z9_o9T?G*0sSmXXjOf-eN6m8&6(7?|y`4sFzz9ZPnp@CZ+fvlwz=v%-5yI}u1CYl0W ziZ(!xp@AbX9Tf0FM{3}s2ck4ETzAC?h^B$-pk^=&UyTO-6b?F}fo}l~d|7HrO#_tx z7c{UM94u%cf7RnO5ZVU`8t5G@n+AFfp^^sjWqZz5 zq%xKy5V;(K1a88;rzb96{%Bxbg;Z=$^?S?6! zyebqp@@i_{G#)dXa_7DYBlI!kIw&6|_}7rg1O;9$X<_^Tf0P0%(* z@FwqQ*}TbX4VAo!^-uV;NxVZ?liy}x@nyZ^Rr{%?qkH>Lw>SzZZ>a1u5C&+o;OBPB z?v9umDia}UOva=+I(*yAJjfW6|B1(#MqoBknQIsfNXeLx%P|q9i(8y~YTLCeeK%!hin9sJArs~~=dsiCqJqQ)TF zLjn#%Zcw790O<~W?oscLF)OKj_g5GYT)ZuBRw5T@Q12r{4a;SQgh6rKKPPqT$q7ri zEnz?qyVQk`gPzq-z?U8gNAgUN4GrS<+tf#UV$e{*FGbt1q3>d{DK;c!8)X1R#gE1m zP;){kh+c^!srUc^C?2PY$T*7zxoy!;%o>01BA@hna@;Jx94L#9r-;*$puaF0{saRs z%MG&$!1-`yB04Tb+XUb>m~1KlrEDVrDLTFkQ$PivP~a#4Q`7OMF|(G+rx0t?& ziKg<26m39G(eXDi1r+2$fg{KV>Gh2zA*W{iUy@$UAGs$s!5QDh4YQf?6-OtW@lv!N zBBj2(q~#ufvPr)4ilwh%DySe4DjWq#IjnpPW;r!AN5BBPsremDG&MD)XdU-L3@bkx z(?J0*bfgA8dLYWm!-Z{(fM{0!GL&Q{*YGE0;m2^$2`m2vu=1Crrqrxl32?#6F9HV( zR?c7bI4g&?PMvXwf2$Fy<-j>*v+~n8OAbg)`fyrXN`88@GM|x)zGIY-i$l@c67cb* z*yN^i(~U4dnv`fCVzS~fn#<{j+5ZxQiHe!GI7~KmL?g6QQclDfVo07boOFxLcL9g0~`d39SDU^n}}g^8xTDn;9P zbstPN9z|Ng{Of=n3Mj~h z0!NU`=3$?V1eQ}eIbMm`PT_u;HSS9>(G>1dw1N8$kUG>aeTYl+mcRQk`4sFzz9ZPn zVOalzSx$leoHgjLVWKI}rDy~67>4y5Oa}$L(2*MW=z%E13YRJ|0-_mKJBz+y`OWfG z`ETckPlD=EV^~Yzpc97mOJG=6OHHX6mJ;BCVQqP=Vp#lDk25T2_={y&fpf}cSf_B( z6OhUuIcnQZ99`g=-@*J|q$ZzT@fIAET=65(ssf7v^(>wd;PucpIF*%#!2oS`ykoZ< z?~kdWG8Cf5PEVcZHkg>kFk=icISG-f50hC%@i@Z5cC%o!=GUA zt>T8+1mAmbW+<&w!6!xA1m7Pq*;MdJ*+%eDZ1z)30Tp~gfurC{&1Sbe4#AvSN(aFJ zyXA8iOf=@fEPMa10OvQ zCEei~Hby`+>E0c3zDX{@>PYyjN1}MkCmzrs64@ zIG^!|Zeb0)ENln%=u|uyJwY}!oZD|xADw_fLj}JSZNrA9VX`SUBxM_A07bTOMhl`S4&jN0iUk;Q-$5X`VF`&P29Q+9e;5=@aO#t2n zXC|WKQnXC~K8DGr0#M2}0+6EPYcT~>015?;0x&fl{{?0?wXnVk1MC*l4oozaPo!uA za*B?BgejmP7YZCf?z-7{@CiutQ&+P&3<$33-MKPF&iMY^Fq;`)goFY^@Ipsw;G+kklssJ3#t4X} zA+woh(Il8tdnjP077Z zV_oW(-f0|G=F{=+=`>!AO>QbTJq-giGX5*O`r#!^4V9-5H6|Gk1PMmQu~THHu@1aX z#(#xbNoBfUz<}VgZFx5wxj=)AZwj5p*Y)nzyBGUUwWjfy^zr%!h8Gn)A91{Fs)@cQ zA{7)BFjDk7k77qZxN2)mHpL&LY-7=+2y6yZK*feI;4n-yE zGRsJfYCQ}Golvb`0o8g$YD!JDlmHi0Yt%`KYVlV+PPL%avmmI zj*ZW~mg9QNN-D?YVL(cfg_-jxSG&*dhe6)Vs+k+Bt*wIUB(q{XS9xGaP4XB0vhH!Fh|zmMe_=WN2?pOg+%TKq`y9>;rFAO!q-dMqt2h~vO$DEnZ3G|1 zX1B)_P{Ah@I10YhY<3i8Hno&~8wS`dpA#_Alslzp19FPZPQnyWkP8K_Aa~euJR|9q z)Nn6sg0sDv8)h@xFUGE!3J)pT2oHjEUxmr1qC?1c6dmP|?&X-})SSG_8uX_y(G=)X zv;ley>3#vzK>;sxqy|2EAWFK!HEfK4XwrQMELbM3@MmPHam4?t`SJ)TCPp za6!610SAlwoBUNzlkSXa^Q)WL*wkFa9&r3s{(xi7pVUcZ)9z#V_iux`LtV%G7Eja@ zjx#k)ExGE3Z0oFH;)dGKH*sSVT9AV(5`43F>r;@LiONGmV1PCs-m|L{ zcE!|CISEl?(CjUPPC;&F;^zR-4j=HC_FkBwRAL(i15z?= z(|B4^+;^y`Ce0I)f^{qcR%()+qDeDIviAXdJd%wikRZ{S#4o_6^f?Q|hKhJ8+J@*{ zgvq9ej+AYz@D$4~VG5{OAQVI|vXLzNZ~>?hsO8>_y$iFR%4xR=BTmv2bMK7WmV;Mb zdUy;IO?g#{w(;uom~6_cQnuk$ioU*rDWJS66gcu~YWmuNnN7L#0~lbpEPaHDrraq- z8<111OKDb%HC1N9h!vJa+%0$%7y4Se)K zl%Rx{{ulw#1Z8uGVY4992ueRV=!BrW2Lxq+)RdZ_C;=`A%1m&uASnD*j}sKtIH$Nr z__iR_7r~RtCMZX9`VbUr--C&e2lEL;f&t+Qx`Cd|$EGorh33KlZ8rSIE+buosi86w zqQ;~rLBue6f}X?ZN$7xAf82!`N~N{iU_eTGf?T6PPxcdGmOcv5qR${F2|Dne$B>~S zWerEhrj&mb6HP^j6unNXC!>B4^w*eds_2uljkS;}01&$yur<6Y%vz$V`#Txbbm}m-hDcV3irj)-1 z(?J0*bfgA8dLUZLhnLA10nw%W1(3YV;zcXv&w+zZO8MVFDSxiil)98x0$h~xFMxwZ zDbHW^cqy-1ZOBqScv9J={3P|PPvaJbZI54UAwM}99G7M4tQmJ@6(X7hDvE)z?G#eTa*c$bI zrzf05QnZ1340YND(?J0*bfgA8dLT-j!lg-!fN1LUPN-n?Gi>24IOv2ry${ss=TcK@ z>ZAm?piYN@g9UZsuga!Q`H{oswa;m<%=ayAQ&lx_!y}h;wJ-0wYt{PaF8^@NO;uH5 z8+(5LUcJz`D|<5 zdASkn^Vad1F{3N^kx`=#J8A5=V-6LU&OiD_U1LpsTWv0LKx?tKu4!ccz`)1ZnquAA z*N@iRJ>E1 zy?p4W@}X5#UH8uGT)Md9p&L6cUf#8MQRmVJqw@KDrX6-UUlLRx~2xyKL> z7O496VHO?!&t83E$1tA9)KClqQDbb(4fGs~+*l7Bgh19l@n-cKm`zk|{3;9x)+Lq? zEhz8Gv9YJ&zPI;pN#Xem0*^602e#y9)HbnlNT$R7@Imq1X2^~Yu*u4f z7a=d^itPmly}fUNJ>KS8KHwfe_=5E2?pSIxM4N{I33PR zwDTrK+XP@UCYuUCDccA@YUgbZrhp1Sp}-5cI)Dum}qKUl%fsD zshzh+F$EOlLP2WCqX(iJK;d;UMnLoi(EX5e%)&(50J<9vI@tjF1nTj7rKZ#yKuUm% z4WQqHgT)3Ae^vGdP`L#+&{m@0_KucaaF69RvM0~B;}t8n$6=!UYTKar!!wMri+z*C z#dfbLNb;r<$>-o)EvElrmsAF0YN(`ws4!VileFO)c)O`Pdn(u$5rqnf`65yid z8#GnbeEe09*L={{MAUrV(Xwm4eR!ef$+K&X#45gh5kY>z7u5urxZWEEehQIwDv9h4 z1GIYYQ@eyR7E?nd6hw_#?|Beo^`3c<)qDOYUcGlDW)qcz4ut_J>pkRhjC!xqvcXaL z*Qg8Jb~NUb!jeN^Nxfy|prdgT*rRW%`mPV|X=Sp ze}cjH6gSK!_}+mtLphoXJ}KHJ__{FJRPagJM(|O^^~ab3D)@u~N5Pl6xE^#Sf;qJ= z4uAo6YvB%Zv;jF)TvuWWD9D9^)R0FHM2qY2S{NfBy13pIg3ByM{E1%J2@X0b zu0Mt1dKalFb#bi(xG1hq2M3D{RsO1{i|ZZajqZK17KTAy3j-W3ySz5q4nSaeO$__< z8r!!%#T{;A`-S>-|K`QOwQ7ExQr6nY6&bbmCfLaER8n{zN8m|ab315c_&(U<)!gQk57s>^xal@^&)XO( zR4hx;Hg(VMG1*kzBV`+lFjaK_6;nV(yigFm6h;=^4+ubwqTB1WNmO=IoeY~-BLxw4 zJp*7sa0Yj0h`tW66yAhC!2s;T4YLWrZ(-L=1)vmd6M*|*vZ(-+vW)cg&c^5mX@b(XvU3eP}2(0kt zEeBN@N%EKFo`iPTEJm2l8W>Gw}4{Z>g$sY^d4z(wiz zIyhLAe*9IBmwxiDW>o3tA1=G}GddAi>BpK6{K`+f6DfRnurJYkP^)N&^-W87)7w}X zsJ+&|V3UzbB!7SbT1@}TE~$KusiBezqQ)%yd}y$;FL0EVecDG}**7?g)H+lus(=A0 z%Rc0ajIwVN>T4L06qYIkmedHWpo~dYy?Wpdwu;h+g_4tJmEGphorT_J8Dg|xUXQ0jK{`AOlMjlh?>ns?AKaVFT~Rr5wN3D#3ZZn;f8brS{(73Wg4 zO+B?7lTFoAQns*1;!Q-3kV-;=HYE~TN(h=LCF*K=?3}ZceRj^v z-uvW%Xg#Xv*3urTin?yg)z?jx7F9ldXx-B4RduT`ic8(=QhljQ`HlHlkGb}Djy>1h zGdcO=m(Rzv&suAK$5>;GIp=rGHTK$W>*ibp&AC%U8z$!n{URiQGr1BF$mG$gq`8ya za+_6dWy~+ndq3}&zSs)K{7F(VmoZ;K_sj)}hBkua(jAG{sTaD9iQExWrH>#9T$CsY zp`%1G>HtylxxDvtt#rm#7$rkeF_$R$7P@CHN;I?)B|l9^iFQXEB@ZA8T$CsY-ce%j z2sZ~BId~HQ`{uxWS_#c0C<%@7fpjv+=D-`YIdHI+SbR$fK#42gFJ)JtM|?HdEjk)UK>!1|II7fCrb1$OEJJd7hW z+f#?sc=(4KxtW2)a5EARV{Qt>E&>nl#0zIqI|gD?AUP7xVe^qr+#Gfgb@1F20Jmdo z3M_Fh%X9O;k#0qmKgNE5@qCxB{COWT6c;1!m4QzX4&Z}1_B^+K*^LYf#c~wKZc=f9YoAav1 zHoVGZruQHLoL7~AKwkCEOdmyRbME{pb#R-!pF+@_J2kXnaxOD{2?^j#t^@=!xt<=Q zOh{x#nFW-e9!D2*E}`2{2RF;_grGUgYiPsrY`QlCN#IPcBm_3Sk?rM}!xkd#xu8G9 z+4M^gG-rAZZJ3_Tp_U^FoavPWZ`0d5!W^oRvNQp(=TH-9e4Csxl|zl8lR$g&Km;7(rRe(Ejv8|z9GKDD!o68h5wy}b9`QKhh05=Gf0Q)j(&HtWI21U_n zq<_sGr-&%fJO7zqtvoF6y&OUvvIBZcM(0~18b^{6+2DJ-RLmv#PDA(11)qj?3BFE* z%>|#vHiC~!QwNX$F8GvyK*8sore2EF=GM%Mse{`(c@2W*+^L}rlXGe67mxtXBHh=waiS2j?GRMfxa zMqNIR#BlQt5M!kH;=OROUmJ?1vuDMZ8&e(PEdK_i7B^XamO5mY0LOP)fIBj>{KImU zO#`1B$x~E~Hph4-+HA4pYNYSYYpc6~t-KQ`j|$Z6Hy%Gv`o!tIIWuHatUIOZPLvB- zg$ryA?UG`>fUvm~OJf_0HJ9K24GG}FUkR|UnAZIM>&l=wL~~{MT!>C7k9QwONvfCpaP%gG&zW7}dz;C7aEskCT-P6kPf z-lDXqq9u8!MG-)VwCHJauu6;Mr(sWvs2-3@i;~kVr$vip?veoJEh)7oMaM$mBqvgH z3492enr5OOIWguL?y2WnXsB|t%M!HS)6T1Oh;ieoU$4rV6Cx8c^;;nw^ zlu0B-sY7v6G#%;1O;uB=LzYE3CPnC$jI8L;+;yX=aGF&%2xqHhqKlAWxWG768pegi z9gm>7SkTaqw2c@s`+}j3L$gYw%8$|?`r+5eImyyP2yoW?emHZG0mLISveQ3C8M zj5UpT2T7vA1-)uy5yoKWtJ}^)+H+oAuar2oEirw4WV;-2G^FTLJd!R)(41E_w2N1- zMcABIHMZeZj+=iG3E;e{1O)P`H#h$dQk!$<-PFNt!hQ%rbMDm8hRHc@{sa=hnOq47 zWb)Ry`720w&hG!~Z1=YiG-r1WZP=aR<`c_cA?D1k@V(7$?+Cd$SR{W<=%zH2YD^*I?=q+89^i7gqzKfb{@Vy`va|yl)YXH6Cf=@%c1m7MAn+raT zZ3G{e1?`6faKWbp1PVUyEa=@xZEmStL>=6+prr_!bEk$jOwMINXCeWd$(4XmCYRJj zE?4>ih5u+@oA*wt(hFPRXz!Pbxs3Ktp?l`SLqi+k!6a)pA$%@66ux(K*gL{x4e+KW z2=-*{RGMNl^fd{M@=0_yNU}CkBx@&YS>DN71P~%wdz5^vk~R5hxRbR#sdT8?y}Gx* zy9>R$bCUc`()faw6SnwwL}SQ?LNobz!}0f#4wso)`W6}rjjRt+az8tH8I4YE-T5Et zkc#nb98 z1_2IVNj5L9dG-h9@y^i#RFX|0ec~J~JN&amc|WPV%hI_N*@X*g4edgd&qUZ9QP$YT zvdm>^B_x20c_qNUI9ju`eUw3sAdMdF8EIOMhd>`e+H>>Pc}fX~hd`e|(41E_w2N1- zN7$TKHMZeZF8#R;3E;e{1O)P`clz^Pq&DZy?@$M~^yd)-&AC%U8z$${pWh+@oXM2{ zZH`Ry^Qy)+yvotRN09)|t4cs1uX@wL|3+$a z?tG3qxY5DCBWTW@8rm>9M+ZmufhC7Cxf0-Qa(hQe2f_T@1i?-R_a$3q7RwYJoK9zh z(7|m59o$>X@}`3kKnOaxfPAd>JLRWgr-Ss&Ii_Zi4yG??nGUKSgHJ=cm8c*xsD2E- z0jqgoN^UB68XA|}oN_XCNJaN{j#RJ{$>Am#B*&zJY4ac|*l=D@LE~Ud1qYFK-0XBV zb?~Hu=*A2xxE1|8=ulp}Tm|gny~X+Y2_r_-$Mp7h^%Z)HL(A%IojrwWRsB)^w>Fw= zZl^}pjhFAFPb-GX*)o)Mq)&Q_({O)wi}MPpybGuO2C@qm%^KQ;{d^Z;bL>ZB8%r_A zX@80YaKWww*w;fVr@c%W)ZnyXe<1XQy!Y~)R4G}Hw{#)Ozmfd%*Qv<{-_uetm*5-K z52zFud>Yy%_;y6tT<~dZBltM#-Hrrs!KVZS3O;Y@y#T4rEtB)9gB$fe7D03F)X;{> zIqH2X62O^U3Gg<#y(6UFU_EStV5ib;$y-X~~T-qbq+2tmCs zAs;L1Ek6x6^%lPoS}XLGP@RGLSwD3)5b2JkwNzoCNOu-1;oRZM3;qR-NNzUyJatIL z^(aTu{dFXVn_7?@gLI1@?TlR4@Vc7JNut}SBQe+hK2nOCj_#)po?IKfq+iix4#DP7Q6CoMW_CApxApl>l#( z+dD!=3s#*b2zEyMIU32Cl|RL3uc5O+80{#*Xs^|>ycul-5Q5QupM0zst^73XjFz4u zGmJJq+cKj)G^#34(po7gP&?AGYMZZ~;3+g7xw+&w)FBnsqaFF|OGpkku^>4npN*{p zc96x7(WS_);Iqk*n9q(l8*meDGJ1pV!jsRU`!V?JFqaYRiEP0I!fw>TZBdznpgG@b zXcvyK0AX_+L1P;W7RUS+BLQ5DC;|3W!^-@2QU(pm{8k|CIj^3flyE2`Sc9NBuWD!) zuWmrtoL4or;Z=_LU4jH~UR44DdDWZw-H6oY+<6^!a2upwLC~B#HMC)Jj``h#1aKx- z0=!Lb?+BS6n4g;<*qPri8`sDb^ZPlS4Z{3J3+DF=Ez6tvMF1g~-;3m9#r))_VP}5y z%#dMz@!6J{-#epsQE28TzQH-CUA_2N{U(y*SEUXCK*=_y?VT36O9$F2fcS9p$SCTN zVtr#AS>LWm4mYVFIVS5%IjwOQ(>y6yUvea7eY25L+(a~!I(V`^bUy~`+lnd%mgKd| zVqh2V?aKfa1N)Oc>FvwJ_u1{sqon38+n1}6QMd@!&@L=z5MgsHM`IgHF2`LjL;|=- zR|4$oo|U^Ep$uwp*RbURH{`vS>!eD_y1S*z1v*K7xkybm_^y$Pxdh+cbY(-aKNox& z+9mjYgs{2b)7VDvaTNP8B!CM(B_L4nc~k5ck=oqS_y_9XMzQ}7L38fZ(1yu5iaoXp z;)OH065wredq+sI!D841!A`M9k}WfYBpK@EH;9J@q1a;t#eS2}ge-509RY-(*bB+W ziek%8!%eZL(NpCTQ>r^zzM3GpqGhTbzf2&(Y^ikM2+6pOyU71_b>n-!+?$m8NB3rs@U5?u z;F`SV`7|((Hy003O0a?SiMe>gB#@;k*zpE*AM zGbDfudL_WVNLu;$$CW`1KHh2-!5@(J+}!o7Qo>;``ELlC^Qwk+@#=OpK#Dl8YHY)+ z9MPSE1aMwe0s?u}o9NC)YIE+KNgdpX?x6^pbEk$jOwJMA#Yg~WawWjqw43bmgaEC%W|fIH8=4-$|o2 z&bXpwq8qPi}6xk~*ZKyv>p3-i+jM6AhAM(p;w%~%|VQC8&R`@#v&BcL+cHs{%B5aO7 zXl!FK<5=NqNB|cjN`QSuv9iJkl|h5D!YPA*UU6QXNFCg0#B>DBc~wKZcy%tq=De!0 z4X<*na3K=Fc~uDrYyt@4{`Tt_1{(i)an)!h&WaY>owKY-360xa}cG02l2_fPG!Ga@$vwK@DyjwgTbg zy!Wzg{U_MX>23-I0}9#62JwY z5)df(yeariNNsMZyq-F^QSh%JXl^di(1yu53VtsVz?obL@HV-(i9P~^J-EUESl_tJv#>%c6|%_w82Ln^k%JCg6+ksNM%L2?Z8Jua~iVBXoY zM7z_6V$Quk(uIYRpy62O^U3Gg<#y(1*FV6|z2U?;TO(ye9|{S={nlUQF6LOWg%+7Vio zH=&IHLJ->h*GGg_ej0W{OV5%yLYtg!nb5|s8PM`tDKJnw(}{AMuex9f`Kw`5f}2l{ zp$@6Yp5RDlmm@jcp~uY-8Qx2;f(d04_$90Q=%$C4lECg9asl4Rc`_~dPB|$dmHNDMgVt0 z(40Fpv|)0N0M0-HIFl;@-X^zqgai=G&rJ~Q1n@|TuFNu-B7lqNY!CuCK@h+rv@CA| z7y*PJfTxm=)sCk8H0%VB9vyN7Fge{a0gT@_5D`G{Hy5avUnQz-u0n#d(Rk#RhF{Pp(22qBTq^Ncmoee^@Ckm>)O3U)5+7Unqs(my0SW#{H zX}GEORC>N#vU2T-`sD?I$_L^n{*lC%>Ic;K!&3Th#@80yk47dpt9+X}q~d#$BkBGL zlEY0gNRC0e$EOSgSa-u|qTR-^n0G&kRO2S6UsH$d0`6EtfbPoR-CJJ`!JB!_^Exn( zH@^u`L-2djC#K(-fuE&7uS(rr`1iDP0qx@gT0^@~p#2dxM}ai9u^w~$djS%_g}f4A zUlgtU`_Iat2LEogh~Rxldv4BpFLiKZLLWlVoL4opi&uLPHs@81ZFrRf}I zk;GQ&2oy_BskiwG3En{ClABZhP90LwJ=u}gjyo?W3qW#ATAQ*DqP5x6g4U*w#k6)$ zq#8Fh?M59uX)U@dgVqjnEx`h03oabyOIx_`z+(|Kx5Q{@7shZZ!sZx*#x|BOjt3Ty z04_$90Q(wZ<$(t&g9hb+8<6&#R|l064jY^wL(rU8HMEOYuSVFMS2ecbRgMSVj0A9A zRRRKe)td+2gVg5S`AzEJ#seQj(40Fpv|)0N2R@Dja3)s*yiIQJ2zelwpPL}qdEj3f zSIQI*e3{M$;enF{4}3+-^5%gNKnNZlif%F(LVr7sArp~v_1LGQiNTUC% z2~=fjO1aHdPcW1Gm8+O^Z|acZfZIEAz;_@y+~k7fm>e)=9mD~%rv(R0AB#EQVx$^3 zEgeN2JUJk`D}w`WMI{AYdF@gFcJbcR3{X;V9O;wZ(@c9myQjHA>h8j2FG6PFB3VPb zu%4?BHphB2wy^|rT=qsJfQxk{z`hPzx$GIrpaz!>TT^g%-h26`R4G}9xAadUe3;~y zFQ6tHe78%*T!QZxbY;VI%>|!^b_u>`5H=Tl8rujyj&lDI3E+ZH2?!K?-jsXn`M~BJ z<=&1uxKZw15H#mb4Q-g5qul!<0i4N|0B@7qJ3`70mcu3pcFH}CqANp8lA&JSjm`$4 z+}jJvy@!_NO}Qh05R`j4`B-he%1^^hx#dqH6e?Y|UmnwMLyxa$nRc&;f5ITfY^W^g z?yD{6sDWQ0JD^>iYVYmt>sVXpN&YUZ7k{faeU*=B8!=+`1w$K$W|cg4ylnc#gW2afaGwK6_R66c=_uH zvC{yF2Nw{H&m4`3{HKwE++_Dj>flM_(Y+Z&{=E(LD6NNtL8c}}c=+38*yb(Dj<%M8AmICq1b-6=e6Iz0sDCq{s2V`SCc+5;cu8{vaIXNQhOKH^&iME zT;ywL7uNM8!sb|)#x^JbNBLhw0=QA31lZSME9Jjc85BpUng|0#>6i}#I>z14cGMv| z%C}^c{)Eg@euSEA0FID~xdh-o=$^R%)X**gcre1|0#IWc0m#w*cOe0s!<2wP0q9Np zmm{^gW%U&5;70qq5H#mb4Q-g5qx}^mfHS!g5Xj`w%A_e(fH8kX-ut;+`Xb@~Ev5P% zE0cB1Um_KA8S}THd**^fLmNSI>5lPoKPGZVyxxBcN#LSHNeCS!if9Ljl1KC2&m+wtFkqQZFpK>umqKKLh_uw?hZ`tCy)X*sqIP9(oKY$tOZ=Q!$+8X-G4 zZXKL~##Gsh^}tMTp9I)N8?Fu4N{Ps$jrP-U104{=*0Q*{HO|w6&3<|w!WZ5~q`XJJt^XdR@G6(PzJdgBUR44DdDT02ZMz`nygrILxaF?9B52N?8rm>9m%GkH z0yvW^0f9`er^hH)5?iI2^^~6;k3iaU1L-hl%b$p#Im>Hk!}4rGcm|TdnO;c9Pz1P~(2x}SWk9@NTD!=7b{dZ?HS!z|0VqU9{>G@1Aqm~Iu4 z2ega#G9`~_)nE1uYq>>Gl3+;$_;9wFq|9o-{o4I+(3s{Xq+e2p)X3P;F}wP2B!`=w zkQ_6+GMt36tHuk&gIV)voHM+E6yzqizf%X#>?M5B4HuHYW6`=a^P4Z#-VXPS&*=J!pN$p*-#D&N( zT(oOwmwaLg!shY`jcu&+T$Xqm62N&?39zrV)+}**Wl$8MMv~|sp#ypErB|wyto1ED zl<|nrLr8vk0X5m+>z0bS1Ye!5Y}hd4f=@%c1mATCn+raTZ3G{e%-)IwaKWbp1PVUy zWcGffHn)s^n>x59vp+%5oI5qNVR9~+{WTK6nOq47WOB74nYpb0c>i18d-=2U!&W%n zUzUowjQ1Tb$~oROv=Ja|&fShAa1o*;gpCj*<@S$|MS1UK0d*Ko&SG5==1av~BII;* z&)gKEp^XS(w+4zx0v91lf_H@2JHo92K)9PA*tZ5ABhHvffRgE>{0N;5vNf=y*c$i` zEz5grAOZ-nHSihovDzAtpN4yDV0U_L*y>`>V8=k?w!nD#RycLG5ZWu_iWYpC0n zkD_d4+wFycflB}S?%qPJi0ZUYfZ)j{0P~cUN@E+*bEN)vpfSsFmQBw!7mZ^YXp)vHUpc6Q}yd{E*GGUX+@UA$UA*qm22w&7JSf9^v9IIk)JfxPOSKVO2>=G=K9b#Qa%5Q661si6&% zbNTblNC0PYB_NQ=CueAYToE%YU|YH-s+EzS<7Mz3q&sK#Z#vukK?Kd&T|*mo|L$S& z-t+hrlS;OrA4gI+<0~oN#v8zk}ANhBV(X<6Qh zM+6We@fiEjDDjY=hCT71vOXs9h|jj1cr1~*L5$~K?U|VpP~M@Enhf?9NjqkeHygI6 zxhZFF>X3^2ogLGTcOW_3{Db6}X-8}>ly;aWMcR=ZiRatJNGWc*I*K}YrXA>hjI?7> zjv7uFQkjQ~5vMbfjvSn>fQ-XM#tLa17pC5ipt)es(2vAfL}^s{(d2unBj+Sb&_;yK zaXO7{EOZ=GzZ?nRf<_6jFEm!Beugq=P^Nw}(w_6`jYOsg68b5p$)q?W$N!hQaIx)Dc;7ncZ5tGtd>m>>`Z+c#aV{2q?r0{ zbT$Z6-&rvAJ+v%urXB%=VCqHkv3f)xKMgxmr+OZSsmEtqX6naA#e7PdYsDZWRpxtK zjswUEO}Cc_Lg>u409O}yAsVgRG=DyINX7gvjx7C3B!`=OkQ|exr`(!-wMf0qJSkXu zawKNyHzTFEsp>}R;K|a_{TM9$Fy~r8i_Z-<7q$TKyLkhC?v%7{i?A|mbx)Vv^jIX448{gg$rbK|6G(oVZMCZ_~mZ68KlxUF7 z21$u_5h>9+Ez3J4iU2~SM9-6tRZ1j34R=Z;-h5f@UsW6E8LXnpDfLFW183mXl4chKfKq0s(W(0Le#rdv|Y0wTx4maN*IYt^JUO<_c z96Yc97l^M%ncd=)XkVltH&wM$hb)(Jtd~OfW~4-0-*0Oko!2}^0`quN%>d<5ZzFx; zM5tjB$nw#{rS>j-bR{wj7uXuwg^vy(Y>tm=Y-5q;lA(=A02lO1fPIm)CPNF9L5*Z6 zdYootLpdI&U5&Ko=B}%h5)Kbu{slpEUe(YpUi~`4=De!04X<)p#(hWt=T#*jkXOC4 zjK`7MoI4+-4sKb-vk01Vr-n96&Se>YLIOCGD*@gnw|9g@7c4kU5bQ+v4dQzl0+1rQ zuhQ8dM0Zy~bYIi5yoqiE5Q6CLds#$u<)>jMx>S9U@Sn!72&nh7C0Ddebk&c&8&X{> zb`Z~1ycxi44w`!u`7T#Y&Jolh73I4*(%h4f9B!gPa!i_QSP0SF#tQ_^HIK$Lw}2Gn zCaM+G!IS2qdoyV6F#p!(Mq~?a!Py{f;lc_(j-a_X(9kaY;j;*v;}06!Sj;$9cncE1 z#fTDMUs0^Aa8MaEC@Z`VY0r7}9;Ji>D|{G1b6(ZZE?)f=!sfiHu???stnhgxfb*&n z5Xh_Etne+QHs{XQse>CUoOn4{6gYQkXv5?jE1Zf1a3)s*yiIQJ2w5SRpPL}qS>a)1 z^~`#iVukbRY!Ftsn_z{9Xj$H@Faij{3YU_P)%K_SH0-R99`Gid53)kzik4ZS`rUN{ z)2%uLaYFUG>y2OuCA1ZU^uN@N%ReH%VPW9XuH!x;KLnZbiSmd0Sq)+yd<4z2h06^rKGtq<1_`|7UkRZ&$=NitOYqG?*j(^wY$NzM3jR(cfD1k)AW-mm zQ}CroZEmSNo;tWu@G}uKHWmWlTfp)0(ajkAdqJKTwWv@?1ybhglHp&{@@igN{RP;{ zo0A8qLiiQw6La$PY>;I{f0T;5Frr=RIT?|Lc40*OB5aNkX>4P8=IHprNB|f7N`QTh zw9@exl|cU|F%JJL^62N&?2?*p> zZ=QQOQk!$auFYhlZ)e# zM%?_gm^yeS7wBe;i)&uSU>UcicZh{@XY- ztF+gOA+gX&Z|m5Ag_8e^XHM;oI9VP4sOi+ zuLzoRr-n96&N1_CKLHjW&g4o!Ad|Po%%>vVIlJ#l9o+0b8$ok+*U*OD8D@Sc!spDc z@V(7$?+BSWSS*_$*qQm>6v7#{l49n2(%B%)e5zpPdudtT%sc`J!OXkK$7=R3cAMMgm? zfHIr?Vc)y*KwcYt57@|iqd!3L&A*a9>5cw446+;j_esTF@``7XO}I$b&@RODPY9bM zo*LU&jk$Epdz3+qbRuls%^si3$>?^a4%q>`C4=)RGD-PqYO=w% zqg2c#_zpq$%mtr@b_u>?5H=Tl8rujyF6%iN3E+ZH2?!K?-dRsKQkz>Mi`2o5eXm2% zoI5qNVRA0(`6v>=nOq47W%6XP(vKtjU$S&l-aENLdLd!pTe`~5I@&)g6>}Nw_o92| z!b3wF;lU(lKSuambSQl9=&*N$$r)fxO%UwK+4(f>W@u{?8s!aiHb`=|r%2Au)v~;k zvj`wWa`p!KSS4rj({Lwe;@7k~E!mm+wH$S}<@7ABpHg_?3bWKZIOE%Bu~Nr)&jOdI z?S3U-JKQR?Gj&Ks{4~czZ9gQ3n{$vHBT*ASixoMw@kN>DNlMjHm&du zL%VqOhX|YVs>U|F%4I`8M*=vnDglAK>YWY!4^o?R=kwITEgO0bL38fZ(1yvmY-r3? zU=8I=t^@=!d27#rrX$@syHBMKZg!uGpgFs1Xv6MInz0Dsb7oig-e$LVglPs?@S7mm z(~Kz;!Wq()N;4+V*&u1gG?8XZ(z3kMj0hk^n$b%>R%wR(H0)^x)!;B`MtrvAG$Ssg z(rJb)n3>bA>S1&l7W~cLhRPcANsvlkVm(_c*>O%XE=MDkn`ADb4ykzG%Q4Bg7Rlje z93;m~GGbGK$3fy3vQim{NHUTmagy;Rq!c$z-9jBalMHk}Mv}2L6>0qt8HS6B?@7bB z@bbqHG#3aO`jNH~BW7PPB&x2gznAqi!sZy9#x|BUj+eiT1aJYP1lSiBD=)uK88j#_ zAM+_dhB&WoOC8(@#m)$t^Qwk+@#;PZoAav1HoVI5@`I27&Z|m5Ag_A!@+C-Z&Yj0l z2RC;vN6?%*HMC)Jj+b{K0i4N|fIud1jhCN?bm#28-r4S#BWTX<8rrZs!^^Kl_?+1l zzPH)!9U(6VYh)7yJ1@VGCeRE|N%8WHbT$Yt-%IfF4{KT8ygUL3!OMS4K32S3ej0XO zP6ZeYFOSc*%**3SD$UEqlgNaYtG`rL^8w=LjCzWFt81mkN-C3-zb7isN`Y?X`mE>C z80DsyXQ)Fe(x*Ez^1mWE++2g?n2bE-%*Jhh^Q2(p$&r|mkNGs9DBJ|KEp_l@gF`lPq}lQ_t3_fMCayQCG1kx{s4*3d2l^!*5%BcK}F zSe3c7;w&V9i+Ux%zBXFZimA$=Mp_ZJM(fP*2p0c`P`knDZQ{2j`sg^4v%T*p1JVQ&_;MLN!tDh zpR=jL_l^#GN0_7m+SCNWo}@k5NL`cADF2Gi21(MUizMwgT9$W`76F7v(pHdoCpbx2KaTDyiic&2vf4vo}qVM7sL-Y_sIbodu;-JRE3-vrk3PVxfO zbX`yS#7Q2QJ+f^3cB#J$+x{go4Hxek+J$XDhp;)et+9=@olEupj0A9_Knbv~u+~)X zYs#QFPK~ekH!IN>(V$<$Gg=LkOW+&5+zAG|IhnHb~0XE>gaJ zEz3LQivU8Te19Y#tCUZE8upZr>Y>uf*;Q3VO$0!9h2FGJS6=qP1S=v5;vGHPh~7pY#3wCB8fiBiJh8!y)) zXwIt|+QqB4AZ*U78r$$Hmu!3k3E;e{1O)P`ce3#iQk!${F4U==p z#`8!3XL2PVkjZsrouap5&mgme^26vYq&sK#*PZP?@iSn3=IpMa4ZAZ8ek#J}%&zdg z&2H}q89Z1cn;_U3{3tSdhPk8|{0KT5gu(AE82mO`mN$cs075YMrQ~D9;N_=bXYf=v z)0Dwyu4$RUA166>1~u2K&{EvWthHNWg-+PJd~^-TyF8P^&P+Vq7wyYv>~ho2D(a9L z0W%!A`+6jYn}d)Xle=defw()mL~!@)@tC_`j@0C)vP-CgCwE78XmIzOHF!n<7!)t; zYtnAZYol9$jl8$L1JvNvNuTuNnQSyoGa?rB!zM1!4UY9B*Yk5l>wH`70 z1Cn33N=bbGrMQU@) z=ke6REn7MhL34A7hBi#jWlP;i0B3R~Ae6}y(&G4F#y;9F&U+^pNH1)KqkW@P%w@FS zgzlLO4-IXE2b0u&4dHXqq42$kfd&gNa{MY zEbpW)0tk`RJw-lNNuB&O>`5J!UWuQPZ&rzyzNY1*F0RB&qi&W;JRl%R?(&vk85^`* zg7*(Jj=2@;HR_NW4f{AIc;i2tlYJmLW`dUq2bAEUOLQe(+S~~-oQBlornTLvgJ*(= z?$Ai^w)#rE!}D6}Fkmh3RL`T{;qLfN3FUj~V|hC1lTP)r@sefR@09wxtiNX>({Ssr zhIV1w-3Xgw+Zx+g+qqP4EfT=yTu(<%#*hTE44#02hEtK%fBh zPWPTdYIBR}Z>WP?y7v--=H?R(ZJ3-(_ufDPIFl;@flMB{5^vY*K=gBWvlDg5uH##B zWwMU=?WJNaBmN!ep1Baw&_;+bDc?~DpR=jL_l^*IN0{;fI@JWhp7Q;*k>njYtkR6CpWfvX==2lk?d_vm3R*$!*Fr(pfrrjBK0c-&4q@BcA=$zK-e5D)!4=Y$mKfpvsry^+1s~XzHtFsX{=T(hu zc$G^w4nYDquPOn7yy~57EJJE@?mU4yxViI#2%2-JhBi#jB^zZVfHS!g5Xj`MRpMQU zbm#1TzO&u0M9`ewHMC)OhQZ&6@Hw+9d~dVcJ3`B*V{`Dxf0JXO!6*%xH+nQK~R@Np$xT5{k@yawomy>FIE zy#GaGmz#E8pbn`KFw>E{zmDW^a}bhaa`y)JHoO5(RNSQvD(Sth#50b^m3R}c2V{nu z%G#)dCwE78XmIzfv=Z-tyf&H*Y~;NO=27L8eLORn^hrOS$wo5t)XI zat-Z5SkFM%9AVYi#wyOGA*+x8F7}lG`&w#EL-tk%HPVo<@5H+x@4cKaRZ7oAEpj&+0yS2G&h%MXv5@Ow)7$rz?obL2xansm3U)r0Flq#$#&EsyJ~OA70Ei< zM@Yq7M*BYKp1JVQ&_;MLN!`H+pR=jL_l^#GN0`(B^3(*up49zUBc)9ig7Q;zHb_!8 zQzUgyYgyh&T?7y!sp}*ktE5hT8t$a7J*t!GUftI}P(v@p+d;k*PjdI@qL$OTcgt@< zWo0)M(F`BA(h6x%`uJp1d_weI!KO@ z#%-T9Ja`6!uc1V)@kE@--Gnsd=CA9iLv~GYd@fNT###M7b5*4!sdvy z#x|C1E{l5&3E<*h39v7o)-3K0Wl$qfTYZ=`X3@~{T%76L33W!&@NtGj<7keYHY)+998T@0ywWK0fD^gO%=~YYIE*fM;+YUc^QJ{ z+^L}rlXFz@Ge`huawWjq_}r9OEt%NJCFb_;FSRTdTHgndnkjVAT=m&vt4}q3uw;CdoSyx zO38Y?rHfpSB>Cm{P?HV5s#MG+_^zQVa}~L0XqVvo0>b8kPh%Uw$5HdIBLQ6SDFK0k z&zqY6J5rllHXoo4Zq)og5i~cKXlTRa95w$hB!Dxy65wredq+sk!J60v!A{M8*GN{9 zpnA)SDGXYmS&YN zB3Lr;RJt_Fvoe>K=9cD^_AecG(qsx!Ih=ekxn0|jT|vz-n{nC{;uNOl|B8P zYZfkS?;O`o{}%Ri_Z9p4s|(d%#omEZq1t^;ajrOCUD$ruIC>2DTwjW-tb#?d8E4?doxX@YaUR$Vj_xFi&@+7@vsJ*w)-6x)bw-+j_I}d2@ zq_^nK5uewdxng$vx$-ihn0_kW-8V2;JE;AL_GsU5_Cf0pK1lsrM3)_SpuFP0uK(9# zjydJ|+wOVcGk0Vm)DqhWF`rNt#TN^W)X&n>l|n*tindm3g}ze90I4msIiOuZ9-uqS zPA;t!YlD@(cHMcS3XfI)l!V6zb|hD1tO+cc9LiYH(Sj{n&nQXYEN8Krqs04*hS%(1~q@ zs+eSo^p~DI4iMA%+Z|?`RjCfqY?G{2^>Ine4#{;!%vPDB`>q%&y=}!1X;2zRQ`WXg zYJK81++RSJF89y!Hy3{?78SBllDn62xhYW=lB&(Mh@>f@qo zie2>QppZARKB;rCQYrS;=o=vtYgv6lbVN*hL(A%8tHoNayKi-Ms6M5uzjLtG-BX>n zs?y(AEB18_)kiNc^b8iOL!TZ}Q*2pKy=A4z%j#{bi+#mPq1Im^l(w!ytyrxUdI#u_ z@s<95DrBn^S9Px+s*gNys6Jka?;x3L=z?+j&%sI${WY=H-`TOU(78sOB{fEozLgC_ z^&M6bOkaPkm^yiBePXrPS?e3@?O4C6ztTH&X?;?)R_Pw-=f>nhCH`|%eM)hCH(9V&s0~)5 zi$>K)brn|*t|q)m>k5@VvLIbiDHeL^NE^ALvnXy!=qIPrj$$9JNp#gvy=}0zYVLx$ z)o%K{r+KoYSgG_^=ymITT|LDLSzoBySsSWPR`YNQWt2o2s!z+D$v~7hQk2&xDcnSd zsP~@ciA?AE_TnBW?&vjv#ep8Wr=j}9o9(7KsiFj(vFNDkGv>85C#*frQo-(HF$l58sv z(A-p7#lf!rj`h7FrnWDxALy?ZJJLO6pmf$c)^=CBRn$)I z=<2Q(R`!T{(OQm)MhcC(33M}68XI!h5$HsHS;wmG9=bUi>AQ$eB&1rbh}ECmBhb3Y z>*Fhhb@87kj;v1+!;OMROnNj7db?{wOSj*zK53vh&_M&GNQ1Of8f=0%va&$Bi_uZv ztyHTGR2Lq2ARVsG8`w}Q5y|MUtfoP=v$#?!Kv#Cuh|tgkK^_@P$LG#GXg=9QWE=MLjkU7}X<%2$P&>-M)t?9trIjM_lofC=`X19xSgDpC}et97Q1K=Zy*gy#bS+Q?A%FLt?4Kdlk4dybajboS86>) zAPbLIi#@Btoe~LL-%&J}T_!x0eeJ-C&qrALKESU8+ak#c&Kz5cV zE~}RIqP0SvFHI;PC|1Y?qWKHW<>l8zb27c&yS!X9k4>cJ3DGQ{OwF01`NsCt+$EZK z?m*2#(Hy-KHA_S@b{A?Uie{(XsM%dK5A9CP&qVXVsniriv(GeYW{GBKFKRw3npdV% z^Ec5{_oimOXr7%x%?qMAYF}!O70vf&QuCl_=I=+%VWPQe7B$z1X2&_y>?WFv_owDE z(fs}ZYMv8K=R9gkqIv8_|($6`TheXqU5;ZeL^Zfg$c~LZ9JB6BWi00j= zQge)GMlYvkylB>)PR)6udF%t!JRzDd5(_GSNi=^xlbXMaX3rJW>@Aw|hp6cn&0QVT zd`C3DKZ}~@M04OuYUYb(Ocym1M00JCnj1tju$r1d(fp}I&8wn0sZ7nOqIr4^HP4G? zdM`Emie^b4HA_WvO+PiC6V1;DsQIO6-Z-0@krirAs8Vy1Xg*e>rY@RIgVfw9nm5-{ zv+X)+7Okh|NYQj{pr%_ix1U4Jw?y;uxzzkcG`nr2W}0YLolngg(Y)&;)Eq6EM=qe| zG11(55j9^C&2As1W}0XQFQMif(Y*RGYTgjd{L830Of)Mlr)H&SzWi}&Hi>4>E2!C9 zG#fra&H194a3wWUM6>ZKYAzJbuRcZ1lcEtnPgxefU|AMFb5j<-gd^XLTo$iSmaohz zi??c(#aHjk;@kQ1`x<5Om5#C~Tq}#(wz7CGSr(5jSlRr-j!j%G2Mg3ax?zg$k{wG@Vvy;uivE zmD-3mZm80t86A!pZfR6$wA|H5Hbg4R`r9l0J;ip(OxtO7X`j(ssFh~4clWjT_IC}^ zsTnbOmeMNKd6jByUPP9v^N1#O_RW|#?zAeA!1l#`t9!burS?^Yo*u!mB&HOhfal44 znjT{fhv+y1d*+{;Zr#v+%+&HzbRC<@jMCJ4WPLlaG7%X#e%Y}n2~HrAkP~O5avhPW z{f_Vm_Oy|5NA*eiE85>_aLsw-8nwQ5uQmK55{JP4N#x9s=&_TASBcnNZ;_#z?6gUD zy+POIa##5^>Jd5XR_H919II^k#9Ief7VA6296cIha;T4w4@-J9Uhl0D9a}A!(YP*= MMrg*ZcK7D}KUzG_;{X5v literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/adamweightdecay.doctree b/master/doctrees/functionlib/dsplib/adamweightdecay.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0ecedd41b16b5f0f15856f4daabdb81d95b1899c GIT binary patch literal 43369 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 y#o$v9XnUaEfsrtQerFT8Jv<01 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 K(X9GDpZqW3@T?dB literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/attention.doctree b/master/doctrees/functionlib/dsplib/attention.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5b878b828c0b761d72a880adbb5ecbf13e89b5c4 GIT binary patch literal 25669 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 OwY31NGQeMAR{k$q-yF#R literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/avgpoolinggrad.doctree b/master/doctrees/functionlib/dsplib/avgpoolinggrad.doctree new file mode 100644 index 0000000000000000000000000000000000000000..232a32abf5d55460991f08808429739532a557d8 GIT binary patch literal 50220 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/batchtospace.doctree b/master/doctrees/functionlib/dsplib/batchtospace.doctree new file mode 100644 index 0000000000000000000000000000000000000000..abe73409abc22a3cfba800542eaf180322fda81e GIT binary patch literal 98709 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 TKCcnf>P(4oSPxlh6W9BnDpQcF literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/broadcastto.doctree b/master/doctrees/functionlib/dsplib/broadcastto.doctree new file mode 100644 index 0000000000000000000000000000000000000000..006b6a23325b7852290c2f32cd2bb61ea624657f GIT binary patch literal 100415 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
Cy$Ul!rKmI$X^KXn$!^2O zL9u)@bl???doXB2i`20fk9K@SI}Dc>u9nu%mx*HX`{*T*X~YevSC4h z1yfs-eI_K__%zuOcry}B_DIlV_bE%jdsvh0PWSa(QQ1)GPPf{#dV9}^J+*7ozRJ#h zJN7*J@U<^IbW3lq{FrRfZDpEVZJ9lzTBT~x4W_#%P1zY@&0T+xw>*=#r5*S?~ZF}S-3EE_5~*{ zTX|M&WXCOgw?8Nc)p1lNm&}$^M(pI0mCEG%(r@qR$mFcpP$HA-7Ecnz!6bYMYdTSk z^}_SD7p>}vUEUFcfBvs_jGYp5Z(;3OwEnb3^503K85n-*;TuOb-!-yrXY9-~-xnL% zwrk|Jjj?JoKbrg~s}6U%4^E+7y(fg`wsO#f=gvo-U|h6x6+m9Tcz*2oMe}3u zXYq!Uymr#0-Vj=emPw?f&PA9KG&!RN^Q*i!enH0T^C zWiB)F12TX;;u~*^MtmqyTHPb@i-uJ$=3e!$@ru{#R{{1lO6^Z^jMWR}e?TOh; z&dB9Ul`VGbK)#qXD#P}qY$7*UP7E3qbH;f1X|5^h%wReT|E)O8+Y*#Ddr~?Z7d=ar zRh1PTi4v3@^Ab@)WJQ^$Rg~H#U36R33f-#ZG>RRnjo^vgp>m!zy+h?I<_Guo?)&@| zd$$db+;{WHl{@zhZ`r%;-sRzP{&5iuQ0hU0KM?6qE$Cb7aOD>CtDqgXpf5|$PIt;` zZf-fCrNu4Z={Cou!^L@N4)_*>|3||Aqv8L&RTX=pk+X^!htzJf0v+vGM&DX1puc1p zY}E9|+UJ~&wIHlGi!6&<-gnHnFWu^x%;!p?Si3FUx)>?=ran$%^;E|K-Hicn=>Id4t;Zzq@X!MS`5RcgfxY%UAPiEehV;sYHmsV+G~qCJAO~esOmd@ZnDbq?^KO$ zvzcr?x6x6Z1s#GFw;AQ8yLmR9=3R>fVw=+2vGewah zO+`vZL_3qmVndNoxviyX z{hi6xm>DWXrI|=mG>Vq)22HW7pfx6#JCnC#wkSHJtw`x;W@qwi znEw zYFi(1M!?awHe$h{CX|BaTo7D`VN(|b3R_$M5DM$97(O+@B!2BxM;(RrgEFd`!aCK< z*M=lkGGTW&I<7A}j#U>wp?%Osb_7O|u>T9}oBsq4!92X*ag39Pk3q}O`Gd+s1+BzGdff7x|K?mNcdj5La#OjjlW>Y$#N@xPeW`9T+r4h=OL8i(MEzl}dciAI6{=o^#5@4>4@2 zTqw7-G_9|({t7cgrKmI$X^KXnvA&3ngJStP=)fx&uVc^@%L-a!f~m1~9gdupDLSOB zNa<)sV?74*pQ2$dbl}l&90pC%prADx>S(N|VK%7nOB+pwzjk**V+|_+ESTCF>tV38 z)n%IMWrjHm-i$D13YPY2}f)Vwu(w@4dMzx365!Et9(7S#Mb@5 z?*_!yPhtg$s;4$|@Xg|rdA0Skm>H_JB4z?&Ymf)zKGx|Ow2>pWhTieS)?JvdRE@qD zIy5D=B7+T!t>Exjnj47N>hq8(wyvF|iLC;lDz^TlQ67GX@Zc}Vb|c!AaIHzP^#Sll z6I(+$7Zkbvw=)8c$n`uH9BM)-XwH?vUomXz%0OXj3n4;mZ9k&HHK@eb&%GM4ZMnQL zR7h90RM#_N$Mhw+Tl|QOYDjFA`Pz`!N+#^ljgD(BbO;s>ZCr0~!af6mF`tEpU>+Xf zIL67tQ?W5qd8nW{dAJh8rt(l>Yk5eCtruYis7fylM4E`vh^-}TB$RrRhYq|`_eKnw zVpu^l)syQmcxnN{_k0@$&G4L)oA+SYRBkG_wcM;Lwtfw>LM5oQ5@~`)Ah!Ml8wSPk zqtJnuoxjDPDUKDi#sg1m{WE5YB14*rl#GbP*70+YGcZ*yUS|_B4TGi#QP9kCF$aUE zQi<>Rd<>f5Ij3AK$FQk#q1@Kew7%GS4rYc*QE4X96pcb`jbr1WSiT54@CwEd22HW7 zpfx6#V(aCYEs73lD^fa|5nFG>{HJKRo=wB&FldSf1+CFgM{K5nE3Nv30Yu1k-PHVyg=f#SN{01j?nx>O6b1 zHP%?VP)}l=k?adLYFc5v&AFX52-}@bWCy%22#_zvh_t#NINX4y`ZuiZP-XKq=-`{I zr|`~Xoo_)Faa0LK%xIeGv|z>{k}BRtd^JF*vnQy|!5pRP@L|v)sEago_bM_{O;Fu3 zrshIGN}cSRr%WC7(8->TIzjZVim0bF8vEr)>_@Fh3BQ^YQDfkbC!%7-GN@gh;0%DH zU40ab4K;xjG-ttYV%XGzUtw$O8$v@}hv8FmO5)dERn)m*b%~6srlEHF&mm1`>ZckV z(e;i?)n!dnx2ldJQ!fPj=11Tmn1Rgo3} z15^r11Cgd+H0tRev5`=6$Zw$o?{QSi4?Oks!*I+}T%Eb_ykblCUDMA!9vs~C1Je5j(&u_t?8J=^>#ZC;HDi_LaElumIr(ea) zP$??SM4F;esHZ=|#zC?Cedxd|7{A7#DV7zq#spJ6eHybx(IIU`N=Gy5>A1Pb36!GY zzt}WP#h@t~6tqS|9rg4G%mx*HX`{*T*X~ZJr{T+e7EEpR^glv^O!YFud=cJ^L_IwP z)YF%hC76DrQ%_xhDAdz;1LaaZb)LQH>S^FBpOJ3^06`$wsA=`|c1Jx8!n$9)t-f_y zeJ%GG(NFgamm5$}vsmq+N@p56_!QK)^Uh|MVP>c@ikQ(A)L_92*A3@s-elmz@<1n&MbNYdrAOygM*c6dBS~q+~>-=Iz0TLY0f%Y(l<= zK~sb%XlA+i1qM&065sPbVbBcEIpyL-44Wz!%55!8>#KQx!^}`AD$PWiqEV=M2OWi+ z`6-rXKnGsII2wbdSXR&)6HGO431*9;L)wazj%L)n^D+M^8qQ|Za3Kaw(V(C;8tSNd z1DFje{L)5~;ji7DQ1il1tkzb1!7DQPXOk{NUUvQ# zgQhrE&>9asW$(|JDT)kfDpE2cQuf9lgPb?1a`8HwkZBk+MTmlCmWw$UJe5j(&*x*% z49_{`VmXFQl?&yzmZtTUy>l=#REkP7k)~)A%3d5B2gUM5(1BMlhA?P~Wd*GRQY@jI`}5-sk}2<=R9OFN0m~< zjHc{O59JLa?bT=m+8*+br!&pLe5FeAVbGx|aSs`+Chq-x->$bDi#L^mCphuu=z8a3 z&{WzfXwGu^gBUioTvpiH>VVMok{CXfh7!N_Ik}Fmw?sx&)AgFYUGH*i3>3BNq!WzW z^@cHMidqHDq4p*Wo1#`>Yt&Mr-VV$F#jP|DDYwyxdJkbEp{~*&gbuuO#`iI3ieUxK zyh{If44%qOzULztG{bXFZoZ6RQ@N?!)^fA1sMm5Va=xY#R9cBNK_d|L4#9>&aXb?` z@Un9r22F9Spfw(NqTW)>6h($K6)71JiF)tEhC-E#bJ>J^7=xw=QP9kCF^Iuasl@lZ zj6pLz=ah?07&cWdl-pXG)))0YiJ75NRGNu2MWYb)c4Fh8Sl$60cm-oO22HW7pfx6# zqTVBzEs73lD^fa|5%qq9`A^aC1e=CuFldSf1+CFgN7Q>2vq6Pl+GsNTwYw9dUii|J z1yftp`;U-5;1l&;gf}A*^-dKZzEzfB`i)N1a{;0d^?JKqQO|kyW{Y}9CKoSRR!`NN z394SGS<|xKol@2d0gt&Glyqfpzj3<(aqk>R%Fq{7QDyWD=-?CgPUD@~K7g5_N-APT z6Zd9dX&L%4?pm!t-oxJV^u0mMU8*`Kp+i&p9x`4{-}?u+d2bUIbSf1;<^-K1^4)+z zQ|YImIm_qUF>Gr2tgyA!0wMCSXB3}eI?>&MIgJSnzq#q2O z?=cLTVplWo>MXxjvDZSC?e62mmsf4<49|s+Hr;iyJG{vxj zW?s0*FnB6A`JVS-&*__$$`l>aR-|+^qw^hu`A^X>7dr50I1YoRXi(4^4Rv(B(=Z!U_@#{|!(Y2Qq4R|= zL0K@hb-s7N(pHxWd^+E9cry~6?=;Z)PF9wH_pr{_o$l+oqOzgVoo=;f_4b|-durFF zeU+X2cI#9ct4=GCv>&mr9Uzeyi{p)$P&yfdL) zP#g%hTafNezcoF7#Tn3kP?+yYkB8AD4sL02-Ma8!$F;O9To^n1f)kgmJS#TxiLHCL zKPX4haa1Ok%$8F|?BtS_%H;dfZ|~@UZ=s0|B{DhjyUVdeaWFYQmP{v#v0iw-_M%li zvCBJR@X!B6TCr1N?!9$Ai`Fk*B>$ZRt-!7_IJ{-=wtFFLPd$9&$mYBDRvsSNwlnt5 zC9#ohyGCx?7^`;kqstF{h2WP60|1YsU%dxMcX~PKVr0&T1>>c3qF`LKbQPGmeDVC) z@r&li;LqX>Cwc9p3wlFnC0Z^KtyRCf7&)odjQunxobqa&agL#9fV{hLfrF}$KqE%4Rd0?g?x<{Ee$HjD5me?h(k z&o)%dGW=OpS<#*-iQl)q1YW7aaF$jWYFB2_ZB;9Dt5(G*HZN|0@yR=qoo7vNUQ`EQ zPwp?~6RBjPWLf!&b4n1!F?jfBD97_wRYXngNY74>_nlY{po**AR?3%)Nu!c}t3A^y zCUT{0!ph`x@j@{_STsr{ab~bvt-O`UR#vpw9c~*V1ux6O-Z*AC*(uzG}0AO-?%kaIq#qKH@Nh?<#imxBY7l$fa>?tLym?^}Q z`Jo}`SOUP=@`#Z&oFnmd87m!6W)r0n3qCDFe?B*WZjA#bUk~PbYGztWkvM3s;j?#h$880#%e&2c=>k5qKv6Vg3a2 z-<~3I!@UpJ-w1TJr-?B@-j&i2qAZN5Vs~W|xxsQ`(13`i;C1U|>G&BdEB1j!BbhIz z;whs5i3650PO#gO`P=}E6oQgTxjB(;v!^7=Rz6-mWFL@$Z0kyuhYE2oBO$iV0XSP4 z#atpQ*qiDcadKTGK=n|eWRz3+`1&D{Q`3y~g?!0~`+GWxlC zmn+8E)5Uay_gI)RVXcA zxDXDP`U;m?>3ps)UmS!A^ZYBC*BBiW!WyK`>2uRDJxHmt&0mMrMktDT&^0fV7{qG8V*NR)S&3o_sQs8-N^8rD2As6{T{2pjl=}q;D2#w=*9n zI8_N!W~kpt!6d#EJV+ac1vX|Sq1EcR0jtq$JdsL?vg>#~T_B5MTr#o)vaAi;VnOrIZbHj>TuzWS3KtbM22d5yjEU31CkunBEF}G)EM{|iGFa?JJ zZNPicCaP-6IX+Pwl+VpO#aV8gmFo2DN5-hiRy6;T)oqo~x zHZziTK1;wzGjKtQ)ff=Mi*}KPZN1n4mPSHkoqQYbCjRpD15E5}GCea&Hmmp}aq>Bv zWKX?rRo$*zeS4;n<^6^a_4K{B>YP*O{B^48+^W;NYo5vduQ~WXr^U*~6Y0U#kytF9 zi5XVGsgGr%`IM2i3kM5rdkRB^R;M8s8L%?>T+}EybD%^to=C=WM!K-A;4DDJ?L^XA zP3zZLM$}GZ(r)#5O}sW^u>vXq1?D|q3?k0%{ow+V z!KuwgfT3N8FS2?fPGiKjbBUh34FV$puTI1)Burg28L=$53Eykdkreq>AIoR?MNcH! zpEG(eHNBYpCLcAruBHrXQgx%K1uXbu#qr1D}nUvABb7#D3GtyF5Dv^#^*-Xv| zTL~bLMAf?BpVdXGboJ)bSPRKSPZyL#f1B~j3 zaZxcpDV{nzb>U!f_-N<>BW-1Jp{bKcCQm*)KITlGd#(7?wKIcBok#eq;R130Am!JFeOjv7_;j zmDp)O2})-(espp7p^JMCPCRp(Ke!V=m>fM@ys)SE!UYiG;y0fwj(v@nc(9~I@#LFO z;;(i;iY?w6U*>F@enSfc9bmdH3u$s5YPhJx8w03ULOg%k@Ty0jnhEo>)y_!nA^?EZVAq7ajEq< z9W~F*oabg#SZmwCU3WPhZ7wk@Feg(Y!0=BZV&Y& zB37$#XI1D6Rz4Np)qne%p)c+tPN#G2Q0NObxc6PrXeKw*O1=*miN3f!#4C4%`rA4} zTM3i?wl>!0UjS!UhhNv}(5VB*j|UNFxv$%Y5iFfg^%%KAw^Ngh^cYF_Qk%{UfZH#O zIt_!Vx;CnU38LRpLYVG_(2Zu0s+ z3@%6r`(}-%IaOJz1ym|(0wz!`x#qS0I=C#$kSwKk?EekU7kh4Z zt|9@%?Pb6^nEPxJ`a**2J|GHu#J@P*x62%o7f(L2}p6Q z5F&FQGQ$C|PC1ViUw94F#imFPt?3ALcdp&$H+dq>BV-uzxqCOSpF3v`nFp7S{|T<& zgsWfk!%!oDip>u~ISly^m2Cj7X6jg5<}!r(@^2SeO~_zH6c*0Of;XD){_)M2A4%g`kr=FJblS9hd;hN{|R z*duO=%%#As`k{}EutQ1=(r2zG-X~4XrcNCNk3D|&KTVz(9UpsI^Z?^$z5$q50JaxN zj~8yGfHgT_O|H^@s1XFPaVUoYdm{y`uKk=mswUxOnE+WqHw?H75ODc@PH3o7IhF7& z5vPTU!%V^CsG~Qy0Q)NyU=ttA#2I%Wv$}{U0tZ7ptcT4QHdA24qbh!gKSWj2FCu>U zsMr<_=wS)#hk1D9LSCk)(T&R%P~S+b#OGAcU$LTMNm~`m$9~=$`#H#74+yeXv6*4P zdXvx_WnD_P;T%v+sY5Q6J0!Im>j%xWKa$&=%AmBJ-B5|<(xDYzm32dmq{Sj5+{n4L|Q%h!01!rz2T637!03SYzm9A8` zp1*3&oZ<^FO`Lcc2CMNiPh5QQKcgi9Ua~?=i7yO1>q6X9CyyUzGb$MWVDu54KO*B< zvyj=Yyg=L@nmY2zh&J;)XO^)v4QoD;!BCi|Y z;)27Z5$MqwV_80!Jh&Q{p(0jC78(6UE^QU`#!EbZYlwQ_ufqapW|a!-^Jxa71zc6QRCbCZ9!9 zlac3(C!L9BXatfh1{Lk0L!Pn)z74~pHT2akq7BS*NNg>>gIhGRck&#w;InUlwTVv$ zFcwGl7DxXpX$S+_;PwzS9clQ)KuKrG5a*Qw|MnPrSdJp zpcP#wC+2G!^)lG1ly?i#jo_REa8_GoxKhq*R94Zse~oB2Qv=aJso>SMLj$wo>dNYI zL7uI&(TC8mKwc&ZLS7N05pPuq<{n_`t>#F@lz%s!uE3kON(OfI_{SUZ^-4{18#hhG zLnmijqB}O)47!u*xr4m;xk{yMmIr5dy-N7{Ph3&Fm%Y7MEX4#{Vn%Nwoj?I?bzBf$ z7GC2iW7i;rF0_mo^5O%%kkc={_BL9dR(=q+&y7lgOK#S;g}yP=8E-4_q0W23AAwz$Hwn;O!Q-y$};7`xMNjV0RX(qgxl`@ZF68kU%7N zqYCCfAxY>ih+50eWzu~DXJ@`Zk~O-H!j1Q=e+$s$e?g2^m_H{?UFKZphgD7%l?@tu zUkbE;hG_?0hoUO);VQBkJ6M~8bQP~YKX^6Or}?iynwg915omh!IKUhH5vW{d3T{$8 zeh7-8u8&qr8f(kx~Y3s!h0`jPeN^AGEw^!G{dbOMY zITc!7AoFFqZsfvn)ugd%^i8E2@5fpJjeimVJHwHJ3xKEwwas;)=sqlkUSPpCsEW!q zvG(@&f1vW(>uHc(VXqdCEX-i@1qr#r4q}Dr6+kU^0P6}Y_Ia>a^~Yf@6Jiw9h|9qu z4i-$`2EmA^ipq%BBcSW20sJ+ovr<%3L=R?SicW|an)C2#-P;5K=k*`x(*B2HU4 zHB=<1Ha`HWd9^ZaqAEn2{u5yHUtp?Y{woR;$zfYG4RDSd1q4Be$FcqgGyMzMs zr=VTbX`vgfs(=RV+j6xB$J4>hXyjae!N>Kd|RliD>PYn1-;Wf@!Uk=0)*c$KKmM( zwByCVVO$U9_957=g_bY)O*pBD=Gptk$Qov1_qmDDvlGXUxaG<8(^Gu-sJ?idQ)Wfu zXus;%*NQJ6E1ur(p*~Prd_Y;83NMgnf~(2X@&bKUUQM4gHX4tlQ2-vRRb1h@Zwy`e zDT9(4j7@0`8XTcbaA%Qf`DtM)zgt)>JYL%qp-GI}l`eCWURp6L5&%EU} zlos~k;wjvd@9i~m_%#b__!xR^@Zz)XY8Ngq4x^R&2pSLmT$&(z~38{XR$|vmv>>>xDJ(YSBN$@D)o!M~K_B>=A z9-c{+La=*1;k^|Z6mEsGK+;8aBWbnVtlQ{7JL|Y$hdyzM>b^PaxQ?BI36xqnvyKZ5 z_Q=c4Ixd*qP$&65J1#eZSPye9T^J~SKK`athmPu`Gge{5sp-w2Gf<;WeKL~n%SZZP zxAxp9oPmmi=T2hp9m(~fBS~nYTnp6c-1-JS2{iuGAm;-XYe24 z9d3Mh-xvur^8l*(6R|Q5luBm>ggb7-Z!FVrB)$+j{UpruKL}OwJ?15WnQypM4)ei+ zu1p(*)!zzDVb$WV!7a}gel?gGpVxmPKwIg&{x;l3SV1hNu|7fDoFFO{bltZZGpoO@ZJEl*xWc**RUyU=yzWDISc$oq5^`^vD4d#b_7u#GSd z27sp5MI%I9=ZvBGw5J%%Rs_9iiUr`gQPPjOdR(>CLXanLNSzE&pQZS|7s1 zJp5(QcTuBAu)?>B3-muMZ$j5Dp8<{iegL}&{svX~4z41*?Q3Z9!E?Tl~S|>pPJmem4NWZ=(j2b9{FRNOP_0T-)AW9Da3t?3-xa_~ zqazcCk8e^&t?FuAAS_YT;r+M)3YPPBbQG(BqWLn1RM}hedxQqeacbaHvoR>RHZsEd z9%*#y;7E2Zflpbt!fEM5x(^O_J1Y_!!%=+LIc!}zKe9Q*PQ_h1KU#2_qpOAIg?MeZ zU5FrOy%Ony_S|@Tcf6w;-n-3l=D~UEXo*a%@MHmcLJnZt`JB|pzk=dqA%RaT>g8zp zP2Z_@pt+`SV}Rel^9Ov{j?Xp1rVKGQ84}(Wkw@~vIP@@ovyQ2R+(y3W%7snjU5n-jD=AcL~Ox4WB@iQ zkqg%e{09Y=ovZo*2A;Fj=EpH4%uVPI9HXJV?p}-w*ZN^{Zc+vFq|(Sjj*2MG`l(~UwWA%QE)|$D@9J1irh;??twqvuHWj^Lym$@ zazM2n35CBJqOQ?G2X(>inwBrd?ZKN+P>9}h+RoWadl*CH;4c`W1Rk!qA~st{*LNkw z7DKRZ${OhyII-{`B#01d(1lJPXvdv=)e<5MXzbE8-2o`fi?McTOWj5Yl#{7vh5jT+W7ds9_h(F9T7hE|rO4n|C`6 zI6(%zXo_wE{Xj+3iwn+mG!+QpVXcm?4qH1?J((nsygQTW&u6zlF^YO{%Mm+*@@y&_^MPI=vq%A7xCqIL_C3e#FllQP({>u(cKQX@sbp!Vg z^BYjwJOLlL{pM--wyj{kj_#g?4=*+^!97q|0BkO;+mysOgY+yND) z>8;;i6n+v576gTcs?9nSQqnQRV@Y^Z|I%^UJRkG%C-xXf45zc9r2r$!o?z$lOaixv@5mcy}xA_Yo<~Jv- zbj$yb>*7)>46~|7Zrj&Y+V(D}P&MFg0Akew?kX%;5a8acYO@Zwl(YmcX^$vHmvqln z@irAZ9lQv;D!~g)ta!YNqAB3e_J~Sy-O!c`Y=g&Dq;)o+q$L{&J3^@iggdVOzpP@V z(?4M~ZT0cw&akfw*zHafS>FL$4VvgfcD)En&?Z`Lp_X)p-DBktCB)A% zY#Tya5L|&~b~4kUFgp#go7cllwyLZo;BU4;MQ24ks}J@I&&ve+&DAB6w3_RMd(Oi+ ztS?Y(jYpEbLQr44gqS$Fqyc?$fey%ML*kMLBoTY_*78EQ(L}O3LFwej@8fF%; z<_+a_VcCPs4u1_wmV_^LeSnebru+yh zct;$mC;7kbtBQN{1>X;_U_rq5b5)ylzK@a)0>1hN1+aDCqqHUPJ<7r7jUF#m(bqwb z(618o8VU5!Tr}9wZ2BW_O{FdAgbG(A^4hRqL6CR1s?9p&QPM$>_ZuqOI^67qhR zBhM4)?o*N10gsTc67Xgk=r&RCnEG?S==P(Pw(v_(p=yAfMs(ZP74E`<1p(w&Rc+P* zl9CPr$m1&7IzUp|5+JWbD?IW-N*UEYt74*qC1Fw}Sk5Hu_{S>Ab&K8aLWN)p+@GjO z>#RyiOPVim&8y;#f2-o5Q#|1@ZN>XnMC)1-ltZB+8dxk{-IgKn8Z_69CYrCqmH7tJ zzzXvc`XdDy_|)6{Yj_wz6Yy4Z4AnUYAJVFuNM^nT_ead%hR-(hzrkloRPa9F^uN&q z-~?9w9aIwkicuwTKt_PY$mBNbck$<+qtEv%Ue{YDUMD=Cal9^%<8=bX*4|_$BJRSKt|1yiuW87RUd=pa=Oc&^ zmBFmoH50@Q+tH`f5u}2+-M2dh!huDATeUWJ1P2GgNv|G z9ldhZIH*#i4o5atV~~l?UKME_b|~o}6P<#Jwr-+BX-mWHySjMS5fuj=z6b}|{Y$HK zzj#-cXjEfY7VxUTu4h%^>+JeEks`pB#NShq*4dSk4r15usc7r$N@+`W)drIOQpG`M zSHhu6c5R~lRg5H6VAY?igx6X1XHX%Sr>~!{7*KRprKE#cb(xB`&Z?BQWK~Us=0+8L zolOb-D%o^CwW$!IslcSSsbtrg^cJWP%%pdzNb5{WNe40MgDToOlTzA}N&Q0~F%@~8 zMG5&TS@d#*KE70G3;!cj@XlYP@uiX|@H9dn-j`%w1lJ3hOesB zqQfjD9R#z-RkU@OrL-l?mW__6nCOs8m{bY5Gm4I=B-eSO??Q!Op6Dkk(mJbB(vs%O zMMqRTbc!cDrmcAYipuCn=^CO80srX82IzV6Qcj4Dbiu=_L`Uw2=*U{i39LN5=m;ZF zmFP&58y!L4W*i;i2h*KvAgSQg>Bk^B9{f99l?}OO4t`n;zdPA)qMcy7-(?;!p zvO}hfR5ZJz)s>-x9$-hmCzRSznKv;0aJ84s=BMpcL?U|Bjp&cFc4_dqaq1wZLP z+Nvr!AeCHOT9V}Y0&@6^RYHlFj-;D}Qsk0|sNhQ;WAVh23clnq7Edg>u2e$unB~3m z$gsY&yqnMwii-X3A%zrfK1Xj^g&Y)ct}4Witg-=pj+G&mRmee~V|7Sn{pAo8BGpi6 z#7)@;XBWsXI-sB0g5PgA@HC-QJm5ek zOH4tSnZuBP{5*0x9TbNhtc#PIfIbA_%Z0@*w_zJR+qJeMv>w`x{&5aNxb@w4KDgOsFZC!=Rp1N+@c*1d zsEc}*AxTts2zfp>+aX1~*O;D8m0j5!Y$1+Xjsm>XXO< zG6|IkB%%Kc)!iWxRJNvPE&NAXRXQDT8_0~$MtrfecF^wF!Fo!E>(x8l!5+!vfd&mR z&rU~NShD^Kc7a*U>~ut&*Ue5x02QLgQw+f5@$7U2&3`*TPJPtubYylqf`2Azb~=I+ z(9cdsU?QTLj=1l*H#yt(hPS5WFc`5>U5q{5aFSS~@5L3RVS6|oy=>9K=^+TNcmeZfx) z?oz0xDIzj=Yc2t|RfD>q=fwNv3o+P$mWWcBwd4!Z6{IQYLg^G#8A zifB~YWc5CzsB391ef6Wwxz_|0y#C>GqV#*97xM@3;e}v57Ayz^SE<^pgCHdx1cJA! zXzL(IX-g2)?gzU=#X$!_!l6nKMDOeIsE-GEJT%QLJ6)vG=6n$S|LDQyXm<#wd4QZdoNk}#m<{Phi1<0JKNdW*tB&X$eGOu3&YtxvYwd4n>4Zl~6R3eT^e3$#sL( zM3bS^=0-ozO3S*Q#|1@ZN>XnRPJjmjZ%~$;J>fYf@O#tEE4uLrr}{# z_BA@NuQ5wGO?zJ>BT$Wfjo$|YlT)Ag+l==$&NPC{vmL1;xWe-pM{vDa+Ok(dmNp^; zi^RTfQ6>Z&QpVF2l3-9W}sYw+FT`wUV{0D5`aO%g1 zMx}77lt+*qSuGdx_fJ-|uhPamj%DIghRdC!?H=H7-U}aI`0d7m1%cmxfs)>n1Evms zlyngIy{e+EgCC_W!A~1Xy`bWtgCF5gCHPe}N88(#Hs$+J!8_huPWR{wzCXc&1p(hb zsM@RpA0-_Gd{-}209yw>N?QV-CXBjJMPCO!LcdDTt7eY2Rh71+6)Iej$omKuEC}*G zt!lFld6aYzyO zQHP@pR%4Kf&K?zM9d;<`AQPSaD%!e<4y7#(x9{rWU58a1boe41{D(Z>cvnBss1)y# zbMLW$mlV_2=iYlwCBDwCr->8+a6)p}9dtUuRQ7ze+Zp zS&p`wRkG_$x(+G?GwH9YNb5{WNe40MXH~RyCZ)6`llq4~!YcAQixToxvgqXqeeA5X zg#%E*JAavW6nGk;5ARE|UkBGBz9bW8Zr-;P7M4B8q~Up$T6CDDq=R7gn2NRzvy`@k z*|O0Q6%!qD36m-zcSg|>mE<~4^c|=W%oDw%BCWG3B`s;bTy#XmL#KGcW7>-Muc(ZU zl&&Gl5b%$VbV1LPmvTaMq#YhsB|7pnL`OO(C$RGLa>_ps3ENi#gg32nT7U9Bt^=4Wt}xcdxr5Q?$_#4NnsU zSt_JNNI3Zb&cIW8P`P;cbn(UAQztJ>zIl?RLn0Z7NGg9t7BwJ;6PJ;UHIzHe^iYx- z4GOPESlZ?pagoaDpJuTPdI-~S7dCq7Fl)o%5<}dSD)i=Kxt?worLo}o=eG5lC zE!>?S2+&1Z1m~!klqXuo)zC3zIfyu>G)Hpj*^6Aa32zCj*mS(dE{jA zOjvk^KKTKN)~+tq+)r`@b>u*qa1K z<7dXk&+HyQ^Nop@&J^Ezta#v5@rhS3Tv%E&cLcpGSwGs0USFts*TwJd^V%kFGEJJU$z0DBt7 zKqI}(=aO*MY-gg7{5aZ=o`NVfAaiaqy-_)d5rVaLPKWW=(dF~E;jaBno_jBF-nhm*!52B`BY2W|Cr zFKe7d#$W=pXh-b4#R}CpH8G1YOJ z*Dp8?dAqlBW2cpX?HPDTx@vM7-8n5Xsva_)!3M%eg86h-;4JQ`xYKO3*F70b7NP zTso3O)@#9cFy0XW_^qsEms2zSJVI>G^Tf(t~73oQ$ zwoobSSZ{%z*948Rpnu@52Sl4`v2br935|oEz6^Z>CYF)I-P1@TYB8|-{9I%p%r3Xg zbrzv62jEHf0Tz>qRKhOYv+!fif~=7ZLq{>7qeij9n$Vq|2*{3lhjU%rwzJlzt}eK3 ztMXQ&r0vLH zIG*T>C*dDJcwRDt(BEXGBGA_!&O^txKv7HZHMtBYGtmfD?e!3K0eQgiq|1Spu?nGf ze?AK=7Jzhi!Up{lPcRDT$wU+BUcdl#4U3Vlu<|{gVu=)jFGMRzf1HQC5oX&^eV$dFFW#1vuJcIMsqX)&_V40(a0Utw^=#TUhxho2fYVC zlIqDMT^!+}*LZHar5hxQ4U8+Uv{<4Ko;qh2pwlh&(xOjbzy!||&E%1HfYB+MNhXOs zVfd-rOz$5A92NkFFmxS|bbG#g8{2+=aWu97z;4Cu#A5qb4A7Y2g}N8Zg=ix=l0J# zv*=E;97#yx4hDp+Az)cx6oUl@{n#;B5)#C*E3Vk7gmPRCWjl6kZtqTxtK?KF{!5(X z_1{eQOi%BuZjrF-D73dT^ZLEl?|t3<=1tGrtxXSq>F;OZ|C}zXWMm7&%d||UP|WC- z>&(p*)0Mnlu-!fGl5Or5H|eyNwT)J>QcmlxGYcrvMmCoz>jihc>vSS=JDanX(e^Et zp0=~ag4f(=GMbH+^={H=b(-v~ozuBXPS=`Z;qH~0JIh+ZDitl=MWjGE=T3bXsSqaE z=_0M1=8^^~*sig_>erk$&9=+g{)!DCE! zEj?7$2M|rgX|c6IbjdZkj7yAmr#0o-!#Lk*W@h+kuTjkFy_+@}y=#!&dh^*r20BpI zQ&tuj&(ez3%a}Zyh=Zqp%r?m z4VJZ%!5eMM)S>;8haMR}?o7V;)v1%uO`bedec)@82M(V;;Z%1Y9)IzvsRO&lj~-7D z<0h(yk4?R_r@Hg0i7#)T_^ZR!<6i{A@nfH#Ja7c4s=FUxtw*be9zXTjo#RIzn0WN? zwsGTzWM5C> zeW}ga!j_)IN9f-*`0tVp$l^O+7(aUO^ohOLFiB&v^C!_PT~F{#`sZPhPt z2bZ3D_EBh5{ftvRbP}~@)62a6N-n3{sazI@9GmF)nW`0CNo8$4&s}ydrp^iJP564C zG74nIdyj{*R<9*<-t0c#MOGXam9UGt0v7X`l&t=EUYZMD%2jF%8j}thL_7$RhrF&_ zPP-D}p`a=D1WnN?wrBQeCj9*VJQ~L+4`ZXuM@Hdc;&XX8u2ov0qo0mz6+|prU3rFfovg*LLT{S0+am008MCKIZYM}SVLfb z>+a4LN)XeMhQ~ZRMyoa#Um)pLpWv#AElIy7vK*yg#d1 zJngpK5H^S;DA>qj8i+2c2OlC~#>CjxQ~S17cW<9~_z2KXzPM-N@g3tQ_dqBBOJDV& z9TTGuRX_dc)PZf|NAI6{`3RiH`lV4cl-H~w%n@nz;4_m?Y(tkRMq&B0^|CO-wtALe z_~g!b3(~J^LG!<;ui60;{{awfb=rI%a5FjyO^pFIxv@~ypY5)W;SQpzH+;>m*|TP` zkhj^g%f-SVC)1h7v1Gk$p+5JalomAYR!~l2+Ez~_vuzVr z!MDOrYz1Ynm~ppb1AuYg1*n|nl$uog;%JvSiwkQ*-R?yj{KaQ9=E zs;IG1lj3C1Av9oSZ}mj_J%2X7=?^f|cY*2owae#*NaEUY0odgWb=VQn6FWvnGse%1 z*U;@P3u4gh+frMG*#tCnd4witd5o5U_@Cz1(qGgHl77w+vmnV^7#&zlQA)zg_S}I2 z4jp2E>Y=^k$HpN3q4T-mVe>VlG0F=qcCM(=-gi$G8pWLbe_GpWUJ~I#Fd6GutJ9H# zTf{P?d+@C;x5$6=o9EA(Wsj6}2s;uG0#wpA&c=khp4i-$fdB3;W;5N1jm7eiRnpRW z>ZU|*Z(`DYdi?l<)q{^txGzDD0q%lHNQPsueYjn=U?++d8wHH`Hkvd6Jy6Fp4;!ylUO4_4%s0kx#4qWqz1VsuReL8dSrKi`^GT&MkzT}o@37xm$Rqz z9DhbH=TADDHnc)P&xMtOY|p7}d!Xx{{!~Dy1rrl)F{GCfZ`uVfaFFXyiK+e`v0VAV za9GHgV(a8Wm2>|)vtZAy8qeg&Yb~AAd(7cJbv^(DM==q)9|fJgzi(jo}RjA zYxT(S>fxgS?q1V~o+z5ac*th-D0@vDeCpK0FMIBw#1T>g#Ql|l0lf@4*iCcE*lO5m*a)KvO7M?x@o=P()9~#+8 z2I2DTG&~hEvV%qr{@E$5Jcu4iK_F%R28A)?QN$uHiuiYSTg#FUzhozzBw5EO( zYQ)Ro+#_EZ8QC+>`Af{V_p86z1im9h-N%L{?N(r-3HN0=me z28Bx(Lp)zYZ!Y-1L_sWz{o!_tGG}pr6F&CCz*V)o$ZofKaqqxX7tkaCXJMZqqKX^# z_kzvdin+$SeM0of8uY=iAGNurMjM1aF6>85h%4ho{>b(7u?WM*=Cu><;R$D3_1Irm zcOO9r-LT<3cfNgf-)$Q!5I`tJpcTdEPUjlNLg}YNYd5g&tUP5sR8S}H83q?)g`5)}u z@pltAHPlV82YpOCcEVFPL82QXALsthSY2e{ekT^bd24E{qA`;MIvj?T(c8QGJNyI-X;?}dt+GY z8imwW+;hCKixYT37)i{v9iFLTH-flP!q4l+$EE!!g!}O^(vJ_rpJ28%>CA=gWlOP2 zuu~7l3I3|{4lw7!v|+ZQxdTSuoeHB|fcuCMj&iVpy)aIZjw*)A;j;x(0ufIy9-m!g zTze{EcOhuEm-IpgrmfU4Y~|xxkcrP+2WIdBs%FB3fsGw{p4tJ#L7Z)yU zE$AxVC9s21AIKE*TDIVt9pD+K1y10x=d{7iaKX+FWc9L(>1?=T)NR+?1x%fmd@+Mv z+~>67t&H@bJ$)nC2O6T0>^c|IZJb1gwJg0XWsT(fi#cHVfnsr}Qd$dS6!|dqYPN=U zL@o+9)6f>gj$1!?=lgxN*oblFVCm+cBhA{gR!S=r3nTer#d60g{SgbnE?2Yq5fc9b zTEW7+8QaQyH~jG&A|LpNfh6RHJK$u<4Rqua)&K_BZ$Va&R0-|6tl$(U>wXgU{LS{B z8pAiw?=MRPI6EJ zVm=Pk=6?9V{WqV4Z|hz28Fcm_d;}5t8k_@z#XxBD97&&52&JrF0tw6)=GWnX8kGm* zLK*LG18oTX6pfU(42{IUaH~nt$nBB1QYJ>_HX^2>XzXBgbIg5L_=}d3OG#Q zD4WiQtGICruN0uS4ahAX{_f4_56Es=tfgB6Q2DV>(}Sp{FpIu3k)FXOF(FXb)3x6QxFXO84gdCqHVlC1P9C=+1~ zg)&+u{UiiMZOkd^YMK73De4Mn5O0cFA!DubF=Z|If!nP`=MwIW=Y@C5M5(+$L`~BR z(arsM+j&#IlC!fo14MF0=#H9f2p>atKNgDeE|H`}VsY<)_w!OE*eb0-ifPClMI3v8 zqcfk}!4bLihBBkWonl$Di)9xiCXrwv3FC*{<`sC6f>);CjX6jxxK0~NFBJPtc!$pw zvkD&r+mGS9KHO8B>Kb+0Qg$(oI&53+5_nk-9pRfqqZ#RVEfP*LtT%x!S5sYZBB&kT zq`~;J(QAC{9+SO;qk7%QEP^f^JC;=xO_?Nj+H+a5QtXe@EZ&bppRxJOEx?vf{ij~m~lhw%RnpcJNN}6xs&NTpC*`FUv%^ypOnpks+s%= zG+6uz;2rU1^{>dpsAhGEm=E!mz98&*yo8CVxhN|1P+r2oTN%D7Q&+Vz{0%e+23JY5 z02-S`_z>qlSw>aTUz_i*iE+&^1G!TI6Y_xKb%BtO;pyPT4bxzuMt;YcgBr0oh#Ytp zeyv^$|C_|ZF_WUh!g0Z-z>o`EYOU7FTRLWZbYP%m=Ni(7Y zG9fCs5+MzR>vS@rpOWdXx{uxj4dUH9J2KWP-%{3s{crW{FH42)mB~<weo_Y$JS_0Z}`Q8ETBeJA!@ouV|ifk>RhG`FK~ z{{SvG@A1CvfNx{wPW-tGf8L8fNAc$v{=5%;zFw)sfq1FJFxj+Ii92yBG0ZqQkSl8Z zE>PhZk}mX^W)taA1Jj9W#kgb;7R`>CVqQj(UY(X=$@nS7Q?j{4H5FE&0XG1lc37Mx z@7FRhs%cRoMocM&5g*T3HMYpY!fsHMkRHn6eax?Qi=tFZw4F4 zDV_}&30ay>K_bg53d!pxOv18=^vJX7H8QKJuy!T3Y8-s6lCf6di?WUrQr#-!tqQ3q zZ(&J)MU{i=lSxp)jYtp|6d_@y&cR(q?5glCOTyLR-2quARNn0;TEy6EXUkZtyh~Zf z@$PmRZPRA^eu~+$(uy3ee&rLd}r{10~fd;|AM_7sKd316H>6qY?zIlK; z{z;!C$_qYZxdwM3PL#1$W*rrzDeE|pzDvei1!>A#fOO5ojZBCN*hEM}fjzCnjZA;l zbhQZ@#G9@h8EchqDQm(0wGuZn87lJ=8Pha>baO@GCVW2X* z#Ldl+xcM=a1b#oW#0_K6ki-qRoF;D2w`nJCxOy22p`hB-k$a#{*yNMP$6vZXs)E{g zK`>3n&kr{6Ux50a1e^RsjxtHKP zUc(oL`{3GYr(>9+anj+n>U-`+Tx3aN}e=BE&3{XzX_$JijvJl=xshAr^&A+%ZFF5 zUXK4G8c|weGLh~E2_3a#h$*FAE-*y_XDUp(Lc%v~=;6unkqmg?=EQR5KvZfkujkXHk))@54}B3FRShc+5IZhObhEO07*gw2 zt*5r99AKwrlCxD$VtJ3)VEOtWixr_WD??{ip)-OaVX@ehXGI`3{?c36Xn~4t;0boL zZuxow24s;Su#6 zgccHucy<1um*l%lU#}pTl8O{F1QI%t%QzvL90DGrk@Ui^unBbjoOvsmLg@6i1<&Qy zhy^t@%Sjm7Y+7D|%W_snAFCd?zv}!YDT-b_@ZJJp9As7i=Agzr3H zMMKLJnlpPSO1yc4oaCk@JgBH}R7f4Bf-P-rc*R8Tk|&pJ_ST$iAw?Yn-MXHPCbU?A zi{ux`uoH>-0dd`WxVCv^PvUJoiMOL=lCjx>P0;tgkF4>83uq?|efplnD*QjMNiQAs zTLeYD^?RKs93?W2%Rkp*)pD7>O4v4Z2ufIt|6BkBJfi8r0CTrajKNfqRdb(po^ zny}$`cuP8{u)Kc-{6{*bh-2 zCcr`~bVU3_R&K!UOn`+WLloD|1XyJH;sQIeG|U88T7Ky*bcUV@um;!71Xz4nBSc;^ z0TxUjC2_&+r|#3ccL1Eg`2fFphf zruzx&?;&vRV<*r|HbN4j(=0U@ zf9qMYP4W;|^)Tnn(16=|wmIH|o$F;{R1bC}V#KXyVGPQ)o<&fht!I);-kkD2nYyZH zMDKTJ%OkuYq*ip7Cpx2(@97*f`8V7OYwTLnYPTY#Zro8oOU{wjYF{tX4;nby}^ zFVkHWB;ExL;su67GS(`WQr2-?IwIq(aw+94xHNi$;w~9`l}8EthI;heY*5@^Z_gix z1`V5g&R~OL-F<^uIFJD&JDpg8gf3J8W;SbG;@qrfL4@=3H7V_`YcPUNjb)=xv7y z2*AXgfgcTQtmlidamT>%Qwr^RV{2Ap+PVjsViA0>93Hi`vWXJXGWK?*;}uD zACcJijPEp&Uehc*w*~a!b953k22&$@a2Mjlg~w#pQ4JQ#I!;{pEg5fBTu6Bfamg!w z5+Pi8?t3x`s*nOSSLRsnO1)84B+}a z$Tz;Eh$3`ilyw{k4#{|{AV_%&5LD#mhGqO!03`ey3cyAd zp4(Gze;$GcZ%F((Sg|V>@mArF@)qzHok;w)jJ*negndKdcWx4i z)p~pWGicB-pq@b@F><2(F;*-NP-l16xmHuwae&$-tybs>q%^?;RuZ^TXoyKeb|9Hj%v4 zM1OdgDR!<3&wXAtm#C(~&p`uj0B(slEgqDKQB8{yF=9ed2CZ;HF@j23c#cabzARH$ zHN(CL4T4cgT?s`=e}#nNA4B1}AIhw%!rH%JtHuebPRUrS@I_h238{W9fuPc9-GflQH$;d^unELo8KaPTvo!2($*~KCemTiLMbd(9fQ)*@#A%w9*afo zMB3;YBO+aN0XLD3>$o62&~ruMHp)*?w2e}rVr&(@7+b)rk;U3*`-nnqXhdJ{jc7{S zUl|yHpIb+D6OqIf%U50(F&B;>J$U+rQ+;{osr@gK8FA|HQ>2U=oQFE9_|dK7N53@j#L?=@_f#J`T)ppU44Y6fI4{;XE4AQeVxF0pM?+O7NxeX!#%!=s ztyk=JCg$O4ps`peH52pPQnP?9U72TM9z5%CF_E-D?M%#r&4kK@`ITcKlAEbyi{>9> zmUB|c_767Z@k%K@RwJ{-Wg%7N+00)-sWT|dc6q2U+jc+4Yet~C6b!ODzX)(Tds zXz4CaFrt)}?9!XpyT-NaU6i_N19s2cQl)Zn zu&i5_yTwg9O?J`Na_-t$P8*}qGjLcz@@6}o=}Nh*7vQH82(Lb;ot?>L3%c9q%!Rav z4ZodWxz2)2F|z?qai@pS zRZyh~bS{s$@FR}ErcktX?&7G^Vd-fben%lSJWwp>-BG6#-LaxyEY0Vkp#=;tA!qcQ zj?bhvW^E&t&S{nfodJ2Yfp?<4te1*qJC)P#*1??TIcU$kci7}C(1){NMO(8g79(nM znlgHSWf1svZq&*Jup&^DbuABPTEQJ@9d!xmM{XhYLb`~4r^0nwEB3(B)l01`e7{t@ zn9|GTVmW1Kg-lK_g9nhRX&bObms_7p6XxPNmj$i_SeQS7apH6mzTwuFiWdTno%yH_ z78uF^6Xl>!uG5jz3WF7GPzQ@=;J9g%ky_K|Iv198*vOViW%Lq&2P9>&v72GM3_wr8 zDA^3dgwgDDY8AT(Kd-?~Ip<{oaUGdTzLfG%3AV*2V4Bp+1uciX*M-kuydwbkr%IMy z$rMw=d4#F?`Y;-uDZV8JO4?4{owc$AwOy%9*3$ZOs4rB@7B*U7V}12v5e){f5fYoI$C9nQsuZI`SYdwb!uwX8H^8^yx1VtEh-)gnZR6#&YV zt>?i*Hh5$%oL_p)^6S8!o#laafIT|nv%i+HN4Z~wS_uD^Wp#T1%YZqd*Rbs$t~%%{BZ>2)Awl@LhAocY#B!PbUT2K<~$4*jHy>&(d&5&GM$yar?K z6BQWP78vS6d`u2gxnf$Qro9X@TA&X&o(ws#GBzQ!9;%c;L?>uxXKk=QnF+=KJ;ijk zFaQ{!Q^N&luCOZo0kUi!!532GWIWEnvl2ii->+w25RZTchOXNnV^JEYhEh5d<WIHL*K(sKi3S{rlD*9&*MeU*M^E}2kZ1OpPYg-jO4hMlstGW@O##?1my z3Xo;Pj0-$6`T&~HoePAs1uYMvPytaeuXoUlX4MQn--1q(@8(xvl$(dqlIXOe)AmRS zH^vvnEaP%mFYtAv-Mj)ejhRXGfqqgO|LC@fexu1mzv6_;CYY$O0^av*qMgwudXQ$K zM{O0SgLgVsqa&RK=%9XpYUB(W+l-F%mp?=3VDtb;^8Lk}ha*h7FmTeNZWTDTGO4)H z1pycM r!vf$Cf!+ipoSx^M#=f7IEu?dm48qzVnl9QhXpW@Q35o?O{mcFznO46( literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/conv2dbackpropfilterfusion.doctree b/master/doctrees/functionlib/dsplib/conv2dbackpropfilterfusion.doctree new file mode 100644 index 0000000000000000000000000000000000000000..317aa9cd357ee5b7faf74f0f464a9de96216eb78 GIT binary patch literal 44137 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 DB@dN} literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/conv2dbackpropinputfusion.doctree b/master/doctrees/functionlib/dsplib/conv2dbackpropinputfusion.doctree new file mode 100644 index 0000000000000000000000000000000000000000..88f6490173eecf3ca6c1c3fca4547a95d6fa5a7e GIT binary patch literal 44227 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

eF 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 delta 86 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 ILA)0Ie+1gm$N&HU literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/embeddinglookup.doctree b/master/doctrees/functionlib/dsplib/embeddinglookup.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1845acc47d0285052f22b79aece01bed0dd691fa GIT binary patch literal 31482 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/equal.doctree b/master/doctrees/functionlib/dsplib/equal.doctree index ba94dc22ebe20c1ea7551643e0aec224b0d090e4..cd5d0bfd77c6b2400b618c1ec2ec8e72ee330cea 100644 GIT binary patch delta 83 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 TWJEf;o7e!MEbNH9L$&WeHIe9K literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/expfusion.doctree b/master/doctrees/functionlib/dsplib/expfusion.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a1a8773f523dc851b2a00517ed1cc9f641ff2a22 GIT binary patch literal 80179 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 a@+5uu+87BJ8JwBqV9JEDf)NJVhyEWsfAw_$ literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/floordiv.doctree b/master/doctrees/functionlib/dsplib/floordiv.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6d369782b4bf934a2afc2f9fa93fde720c44ce9e GIT binary patch literal 31728 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/fusedbatchnorm.doctree b/master/doctrees/functionlib/dsplib/fusedbatchnorm.doctree new file mode 100644 index 0000000000000000000000000000000000000000..76e33059f0e4a856ebfd906224d3e584e7444143 GIT binary patch literal 44499 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

g? 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 bjE@ZjzZyX%j==l!4458)EN6&3k`DYI^7lm7 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/gru.doctree b/master/doctrees/functionlib/dsplib/gru.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4b74edec2b22edf49567df0b60fd7310dd6769e9 GIT binary patch literal 74736 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%0AIyOrGD^_apTxhc&3J?%n})hE zr1^igz12Fu0FAJ#i(rU>U4>YX^QWek4uAIa$xknR=EF;OJal&P$eH^d*)=uAOFkSL zIj@W`TdznERnu3ez>9W8uSkJYU>z@xsoqE62NlePShFR%=T?C$GKhF!&1NCKNrdX` z${ga0J9T7tCWv~RJGIy#Yx6S+nuay7*KZi;W}G)sKm?-J)L!ed zy%^Ku0C6A8qSK*L#J1@vSvR)Ps{}wUDD4akvI%IgrAP^&lI-Tl3G1wR=k)1aW9dv7j ztbeE~sj-?u!FAq5_)S<94=PNHtei)IB;u4#ofVFA6a9lIrKkZfVI>rnLzYLVVi>H* z1d?$TianwdyW(K8)H^j&hgr^9Y%L~mB2nf+VU2}2rAx7iG;s>mzh9|-rCI%ta`pcN zf0E7cBpE{ZdYXp@hp2Mw(v0J7?YCIPxL1S1I+iaQ!7iH^d?Z3z>VJlmF0`KZM=dQR2wY_~^#rhr< zYhiGlHL4dPfxL;yR_RxTx{>(ELRN@&9V4=-$iSac2qY`2%@*=cAVkwGvhp$9MQHKh zlo%W&LRHQ=g#_neJZwTs7$FzYx>uyZX0wcMAV&hTJH>T7fj@xxar_B&8xut>ye1Yd z>7=ZOR&`j`tC1jGS#MIY)|Itj{ry<}oPVKN=cBTCv0kj={X@_;fiB8b@RrIoa5V-0 z;5MuWm#c*6N|p=hQOS6>A;tg0+NuEZQotk39)3|LZDII{dk) zW#ivEA?<(2h2?t5x7nCF8;&;kC!|H{EIdYA=*^1pXdAv`m~)Y>;>(zU;re{z2<7F1 z7dem5$>0*%7@FX_7A7^+4BxFaAZwnAl*YbMe8b7HUH~8XF(U#4y9ODd!#g+UU|vQ; z8r3;J1k#IS)b_G0kIZd2LPoN_o2Oazy~cJ-hM;$BNN5dE9c?O{PZf9xbSVm5*!X*t z4N~%M#g9)Q2|j4*K9V|ps~L;|yTI*|L7XHj^7!l=cye-f$Uwm@8+N7PjDr^$M3xzP z&IG+>Bis0W#hvEP<{}xaxWVOk@OYX!mWS}cdsMs(?$?4sv}E5>>FXwF+W5MT*`(2=zg3;W&U3iE?6{iX*kmN)ki@o1TZQ^qW;$>RRdRk)X-+t-LQa=*Lv7b)XB@66oKIKv#t3FDP?69`K=OI$$6l(^QrGxhf&|Nq1Sm2nMFM_Tvd5kohUEFIkDI&@!G}W# z4xAT$rWLaw0(W>4i>UfpN=6Gr#a)QwwF(@`iuvYGwQm3+8pz!Y#x&!O8x@=#ogE3* zZTvYhz$;vkq2M;mk*$)evy39kQq-e#<<-rDS*yrK3$N}YXtQ}o<9rO4&NNs!_p^qa z1s;-hAnE+2FOo$SG%1QCjq`V}inq@B6KYE%9!=ok6Dt0?V&(kh{x?GJI&82rq=UkriUTlxeGr@`#ZrDOVcF$BPcrxJ_y!n z?C%FE-a7jeye0e71s{H@5}-3cE}%yS*u}(z@j(UZx^cq@5~Ld|Y*De+H7J6$1iC)> zFr^ZqgPn`$5$xSfNqDVFcOCMtOpW~SsaWff7px`ZHD3KYRQz?YbN)Soy&JFofJ$>6 z=(W_Kzgxvx2fAP_f!@Ze|09(Q9q?SnvVm`%Q0dh-kA>SXXzkUnLW3&1CsF6-{1U!z zPrUj|Flg-)l9uh&2Ml`Q)&CU=n0xi?s%x)4whnB=)YR^$kH70|gRX5q{RG`3p?Tu{ zS0P^vO3q7CM^iYzrZB_!=m{|fi_W_LThJxlsw7=7>wbGMy&cmwhRK*%F4VlS!WriC z(^(ah+cUSYEfSa;Exz(+uFi<5?Av!N?7U(J`*&5Gj7I=ux}9-448}4gvohyfAi5lH zV#&px09R*r%={LAOsT`kQAn^OcRBuvB=S6nNin%Th(T~6mj%-fLN42{8o4#_VE(UU zHyrx@a~s=YGoY}VtYTJNuW^L*7hSpy%pw^o8I`%ZF^BK8c? z4hP^bLV{S&xGUXY{7RJ=-RMLiMh@IH*#K-``naB4B~lIAw8ZL>YE(5|uhLRCzIiPY zB zgsh1Iy;sFwXFZ&M>oID}bsul#cuG;AZr6SMnM!+Iq2AAxNU_G}vntlQLKUpj6zY>I z-nv2+yrn|bg;u_%5}+$pE}%!H+C^yPv`TSZfj)%<>00w=RIGIcDp*UP>q9Gj!-{@M z2Rj$hBiOqOtz4keU5ESzBuIz+HWh0f@`AO5ye71ArHa1}cFw;?uy+$$d80~m9q8Aj z2K}un);iDyYYFr=p%qIdLkB#Uv25U5Csc-3nnx>b7_<(pT!h9$9ze!ID;MHrPeLoZ z;QwzHl9nA>2^jPuv~m;$%tI^es_W27w|l&udBSEZ!T$Qe8_-mCIT_dFsBYRj)rQhsfsYsd^NyI#? ze^6SWGkL)}jbHI%6>ptiA$UuDzQ$SHq2jNr2%LZGUbm&Q z_(P7T;+6=^e)*83P7RVl9POaB-N()FJYsaWe86Tw;n zUGLLArV^opor~xZ?7dv8@QqG$@^`EpqJe%_^VoDN^jgegYgyyJ$`ngeR9{B_pB`S-{=x^cbNuTivxx>`Ab1nFw!Z>U)7Ko_hf(A&7)vnm-n;JJ)t z1K&EK()Dg0#dh-#$sFkbe=^}Y(O_aj2mvR&_hK`&fy0|m@oZ+7*( zyWaAoS+(n(py}H6RxKK+N^`@*eG2$&(5Xx?Paxi12ixMYeQ=bXvHYpCz1Ywj=VG6O zwF>W4)puQUbu$vgs?96XHC;p{M%Q#H#K;bLlT9=`6vY zY(}u|X0rEpRWfxJ@NJfzsORWvEZ2iI2@gP@cz_{U2a--+`r`PR3Yrwfk;cjEA5{#R zbWWa7TN>GD0u1X^{B_03`L`Zhv(do8J1zDKc;5+ zpZH1I-!`ULn&#kIRi1VBCs?PkzqhD(>+DbPmh4X#WGJWv=nRkx=#c?-@!|XrREq1y z2Mb7$ZcOkV6>D9A3f2yQ_$CFC{U z``1+bb+B{(J%YU(@BOq&a~O6>A;ng0%#C8}GeuOwo_(fafxn4Sef_O7FdS z%-e=RYw!I4`V!dt*(0^BDW@j_a zbHn+eI8PsY;_TzcmhOA#HPPFO{l3{kn1wBj_n*?Cn6*4NtwbE+rfMno;peY{U6%wdT&@&`*BiZolvPIAmx~9~lW~%mQxfv|6tq zp& zhYrB^S`*l%aL%mYfFrseE^e^Vpy~NWxr&=LHP`i_CJxtJz{zK`4YG!dr)yE>K`

ot0?=@{MJmYxPo-$IRkzI`iMR|Fe+K2PlB5i&*(H^%9x*#)eFDPuj%I1YETtJ%C; zrbi}wV7Qq-p&$I{lk7no2i68B5<{LyAdV;oBsCL92;)pj^8ij--LsO=4_D!BKUr%o z*nSqd^Xpzfgq2+J{G10Ejv&hx?GiighHRo&5P}nU*&(uKg>oyP)Yss^Zj=_k-LrzMrPU3_ zLs!|M8kB9naou^BknyTn#Q`}*6O}a20K?X%RTw;Ur?rDzVEKO4+ci6j$KFi!kZ-w_ z8MiivO0|(vG6g`H#i6t)Asl9fBZ1B8^hf>>D{$qyi56-7`eC!Ys?#uzrRa5NEzDVgv0%72jCMhD*}uG28SA zRx;|9v8{FXraCG%UCy?i-SgWl4wW_pv|IBQcH7RQ;CYn;$_zrJ#wMp&{zi{IXJ?s< zmS7Rq9@ank)nO(-BImj}2eWd4q&o^K)IB~gvN{n-)JV$riM!l~ozy*0{qCujSYv(3WTc4BOSu|t<2J9Iv*Lubsg&vOp_fX9aV z4s{0VWGr6jOpUR;4b!3dfNJ~+t=j<|&u{z*r$aXhBcVIjhIYhAHzXd0)WZ_T;Xo=& zv`*rWmb&IQQ0X=%d5JgZEYb4h-8yYo&^zT_oJq`%iAVP{xLZ8G2lyRsT#s6W4R}!> wQ5+r&hYJiFAnEa%@G&dvRmKq=jCwp8Jf-Z&p>XCK`}z*sINw?9iJNF13SoRaFRe zTz#{hS6NzhoSKoZJ7_dDa=lTssX^U^l4{#1#C>N)EsMLJV!awXfc-g2F?W$GN6x#rU5>*?=zdbIh zj8D}o9Ep;V9|tA|USQFHfPSI?v0DfCXAuBlZ$4A18l-ES<+ox1$a z6Pf+{ZAYy+`}b!WbLa7-Rf@P@JoD({8}nCA|M}9}&owSS*_bGAOYwcs`54mRY~lfLc8=%*6nph3R;h@1+;tG7xVEp;0SkJOKkqA zp3`sDNA_$Wwa|z4^?aPtW!2G@e90=zgyA}|&w<`PY}K7=-8rHdnY%NhgoAb@b8E)P z>?;&4C$n#=rWPI+FVWE>nb8R45${z=t4upOz1?|aWZzfoY7rdn&Py?fB_G^UVLY6;f+7R>#LXM8tg>l z)N5BS%}Y`-tYPZo-(7g-{MAd(E`9UZ!iD1*L6G^U`E!|FvQmNkQCYQTh~tyrx^i?L z9667L=fAV?#4C%>AH$o=@0_@D^!TFt^5u(9G)`Q&eDSr$8-Lt5{_^7d+``${y*7A` z10ET^A=2rT-)X6Dp%Q=0PbQ5yxrYapUTOq%XVs3WjfRnmhxH2o;N$iS6Axw%joSn?i2@O)g*9y=j?oY z4r(Jx534m3aD(A?}p zvz&b1`?q#r`w53F8^D(A zD+2C6X&1dd0Pywf0TAZ?o*awdBr6BC7{#eZ#Wc<)975_RUAx{AkCz zb!`lzIRrXBlDAU9?ixB0 zGL!LDGH9^`_$%20iA0wu2$ZkX1`L=4O1W_RB)mf8ql7OLu2$uyj@73=eI1l-&$bD8sGi1#*ELkr*JElk!`sX;_9P)_DAy(C6OYEW{8!y&gCY2=TRQn_C4}_n8{)_3YWn5Qp1_?OxD}zU?)6`8e&YEyks`Cp8fpK z-zp))*H!ap7#1F%8e(g~-8ZWLXhV&pdR&j;{`WT2Lr&C0|5HvM!e;!Mzz%>IxXuS+ z)vWwpZw8Zjud6HLYkmkC&poGv`3p;PSAgbVY?Z*_+};LeG^#awYi}0~- z1Y>IkkFRDCCp9Y52<@^RQ&nuxMVM2uv9{WskwG0SuUs}z7>iK2de@}ms+bzh-yk?V zMD^UHJ~D|l-8!}b(bhssyRvxGPj5u{)v4Da&S~!f%P3|dlCpf2m+@9GBN_3?-Hd#I z=NZWu6~~LMhCAyl+u+M?a)E1R#cor)rkBJ)Opd^AtoMt z+v#@Ry+ z44g5CV)$``VVG;3K_Wd~4C*xRqY9?62s1WHDu0*NQ zXPdg(^bL!3c-|X}$6TP+e-|T=byQom<9!gqJ$qew3Qs;-atGxtFyy0;*N z3tpZI3L(qSe-t&>%J|SUCzbBJXx;1h0niulFybam`KwJl{6pP8{nbz&+Lx zz-3rjI+>;@vw1vDND}Nq$Qr@kN3i?rtkog^Y+TEekU!lv@~_0PPD0*e9YH=7?H9g= zhe~|?c{@&268=KeHRHd0MVb@X4dr^tG5Eq(@fQK&!`nQqQeK6d#&p)YHe7*k9}b!* zReVoWv1Xoe=ZIGUyx1mj5JgDj>sgjAYBz(Ei! zwOp2_1(%gKaTvvoth3Dbf%H7*op(nmb)4QmR50Y?k z9AF39@)fTwd@bC|mktH1;)GAl1fP+Eo#D1zZuippKfs6A#TPGLe)n+%>{>U4|AO{; zR=TN~I#_u8YmB~xmy>9;PW!=s23_-Vw3$xs2R{b-Db?EcXg|r-Z_%eMl_$8xK zDAkKv<}B2~+psTeU-5>bf2Zu8cr!)AAtRQi!K`vZ} zCuTo4A^z^lWX8uc_ul)ZPzAnMqeBp56H|AE$|+!UcV_2AP#(B(@nWYSkGL6PG&?03 zg?Fu45z`(KF{qIY-xdmwiT=n>?8Aa*O~c-^l9{+GeZ-p@{vRD2K!`!dcXpi{T9?bTbd^XQ|N@``gu1+J)&{4qQGu@chOZayb=og&>V?BC_`w%+Y zwI{9GWW4Jk&NJSdBPzbUv!ZH?WD0?;%ZNm@Qq~*-ch)0g98qV(x{4N=gDa@I;gGm* zGe5yAk>dzISFBMHgqdgE6-(as%i>WAxEuluz1~atycrap|FM0dfr=%|Bpq=gdA8;_ z2-mpWm48|KRf@dGs7v6p5Y1YA>Da>A`REam7{_%x!AytvhS*?imB4%b3P_u`1z`n{ z-fI`=+Vx&LW#|aY*e{?@atE`TFqXL&6{8`n>WU$(>Ixw&^LJWWlQka-m9gC|!K$kC zh|&{pqw0>KAn~-Xpn530i zj2ITiDiZ#|h(eFe$TBX50E*sJ>U+53aqUZ5&ix)LG;4a+JclNl-^3-dgps>;FH{uM zwb#O3+j(uel#Rv#e%`3h*W(aLTBe`jh_n;+c|DGGk}`O#|2Bk@`S*D6yjM8Db1{zh z2cT^UzPwKiwwoUBuoDqU15HdaN+KS7zc?NzAPIIMV2xn!ru9E2%hd%Kz7W^uBrU(U zZM+|dW1WPz$2x-ddf6k)NBrJLyBNnl32njtn$cdqB28Ih=S?eXFM7~Aajn4MA7IaZ z$iVy|p3EP4i*%TCbQKW_4*V8gir|3x0oD0OTp|;yXqkB#<#T2O*I{!3*OsmSZSe2E z?MZ?`EfFP8k-6s0{wa)*=b;id`%lG;W7y@(Lr_h(jNjl%`n;XzA z*%!9(i`m*^gUk4)rB_=aB=dloEq_1JUsXhLZ3UTxmH zi&ZkMkeA!8|DWlu?-$OkpikUdw?ZT4%x$>Nn}fLWEv)$w+#PYv8}Ne-cB*BAO~hV>zLgbc619m&cvQ_4><({E+loSIs(OZ?-bQmt9j z$YT-dZJmzgAVF)-I+m6+S`m+Rvi%O$U#Qn8IZpA?)h1c5Ea3spNqm78n|`GDZKeb_ zp0hWF1P4Sdi^#2cKrPjAmP3A5=WEtUePEKMrnL%^!zc=ihoXvvJ4Y>7@vyOGSq_?s zM4DLyWX4^#QHZAq%nS(9-ebK+xjKCmQ>D~9dW&Xsim(LRG6gntxGeN?j`dL-vQ2ar6p z=Q@_w)sp|%$u?`V1`u>qr*2E4PS#n}^7Uzm>p!U0DhQi^qNb^3l%y~e1&z8y?K3J! z{Zh0_!75U4g{A7w)aad~JRE&v^rfQJYF16r)k?91geIr}`i4j~8xZ^b5SLEQ1?Os- z-ZZf=e+tcK{eo}M23h;Y=!>SxY!meXdS~l^s6^SAtWSp8fOrwloriU0_oU0V)-*&w zi%Lbh3$dmt1l|FPfe63Q3B8N;t98dxf+BVuPNuNFV!d2de2oOQya3K! zt09$=7!L3fuIr=#K~dG#>P1UIx)-Q6X|q+!)|7Bft|$dZIbhg^(Aoi|XxM7Lq@gcf zE4!to!0LL@85;pH@y#EKW)pt92MQ#c;RsXYr^Yds6kF-9g_6)B*-xm>f{%5Tf=>of7*f!djs@Gjz2yCEVIP!w2gFF3zU09^p`UO5!GjYYo_jqaaInT7!dv-fTvrpji&Q zEz%5;-Ns|oTOy_Ol}UuI0k8kiMHYmNW`wl6sZiXT@6r7BeVV>mii&wO7exHUysh7a zbX@*k@8#db_*XNN7Qp6LaH%6;C7mqVenWls^Gn&y`Ab~9~jS*rr)@TH14M>Yw9)55F;YBjWM%q?Scg<9ndb*qL zY9xUbI}&=#Kq1Mdk%SO0uK|IO1P0rBqS&*2d-nRgj@=FK#$JRY&Ytek-1*MO`nV!M|G&&XAAe@`H$A!U+vC`O&h%p5OlLPNN~BWR zT*@exok^)&veai}?eY`l1)Iy8%I!{TA+f%gD;1JP*%^l%Ni&^E6^v|oP1%`7+3j?u zxJZ<5DH=&Toy)q#%_g(iY*|xoH(Q-1J8fqS<&`t>&Xud~D${$sp18``Kzv2&wleW| zn)3-Tv&-hpVt2x6OW1ZH-CeRFED1Luohp(bEy+xxSVSUzH)Ruj{MV#ZDepaWCz9(5 zMi1pFIW2agmtK|4>E>K>iqjf*Yi>?(nq`IW>@stGM%P0RnO(P$hPwLF*;Fx~D;V)& z8U!*_tPB4ayLgeVo>G=+Ad~LyLQeW8Q?&aQ6^b@$mPu!g^70Ex-KcLXYL@6NB=V-J zlH)_i`iEbBymIW=aQWcy{;jdf+piAqJUaa1v%@EM4WIt%@W}(eIyG?5iWR>)H5jWN ze4+Bp-d~+^kay_B&dN8o4)5Mx+4i04fx+tDZ&yz28hZPgv)|e?Jb1kF_GS>PKKXj} z@gpc-d1=epqlZVHd-E6lo2z?vR1dsHKlXlmWba!jRTfskbq_XX`%BfuyXHRw4uCr%e2dSZBk0B?w;~eMTaSb@;0EjMt&Ab!{Gd~7w#_<2g z@&7#hKOg8Z+s#h1!~BG~aQOs6kGa5{z)afKm$1!vcP5uyr`Ytq>iBWvR(Bh{>FmRa z3}9oVHnpYWc5MDlvDJW4U!whs@rTptO|cC~{6q{7CLYZA!*=I2n~=~QPcMkgpC4Oo zqlG-&e)jDrD%)Nh*?Vxorr7G$_kS{PuW9S4A=jgl!-Gn$MFUiSKtykw# zIXjkgl|_o>X{-{i)`m}RKl{kDT(IiXZ&mlau83!HdL$(;yPDM;Y*a}`_U}HscbA_; z+iD}5a?L8*z`~Fgc4*yF+$&~qC z(cynt*4@h&UAN0 zW4T=QZI7zHnb63VsOqE4_0=bOalQJ~4m_y7SL&%xQgqcP5_?f-;n|7L3V@1-uTZGIBfHWxzOKZ`89f(FZ3d22&f_+4?$(H^yIHDkX033p{wPya{mp^? zmNBBy^oRT!{aq?6P4ffR^tL@R{MPeB$M?0hwFR{1e57t>mb2aT9P?CPR;k1$Hf`{f zXGT#8GuF|O&gM&YM@OtPCPtoYaY8O*IF-|1 z$82oq*ojz7Sf#yaJP^+q*@dz0gq<`O#ux=G);we^Sc`>{%Hwa=u4r)De3b+X8I1FK zBi(Cac&suXc)hZFE1aauj1h;+?8y~+4I4j_Mka%QawQvbqqPP)dJ^CpFIQg2lFEtL zl2}K~Os7&tmWhWaPu74GCX<4XDAiG9MM@OLM@n1EPvO4SQ+K>OohT~R9(m+oWneov zxZNUEgE3d>txsXx}SwoVBRY}Ze29H-?d!aJ$Oy%XrRM8~(23$eRpKs}3 z8{_P&gD;73W0N*)j690kpm0lUq@*p<{=! zT6p%z3&ThD4xf6Wa(ExX;-xKUAC>-7Xav?&YvTF;I1EjYOoqmECJKHL| z4~b5KH8HT{_NctEW%wkPHD5vsU)&sd@(h0jlKfjr(esbGL{}!?4y6ugj6Ngay%9ew}g9BJe6_pT<1MAwTfNzT3 zD($&ndJiSV^_WjL_8`_%$RoPrx#;|#WSu{H+BUDJRp#M*CEomkoMXzBd2brK{sZc9 zxgOl51nW(zm)JFEF4~1$wpXc#)9Q*T71+eOPS0(gh@iY<#AL4ZEv~dV&Xp0ojK_hB z6}y#j!MrFQNXmO@n4j{P{HSp?Xl2B!!`0LjBDgq@1+Pba|F14~UkX-lFm**6m{I;C zT)iH~9_i@#zWVu6Bv8MneuMW~{wIPLJ7y3mS^gQ0B`1hwo)vZ3VwFkY7YtP@ofGUWwE1~63j6o)8Jc%*WQ&xLpBT0;1g{*8Yy9^jR*FmGlnaKID zc$L6nV36h?&bssQ%R;kxY?d~zAVVRqT{P5u3@EsQX(JkHD1QxVJ}bP9H=5=CTQ`mk z8y5!waW4eZ0AiY-orFXipB&J@*VEbkjddnLaUW9y*3WNrJDyQjz#W?qv8c1s%c0X% zjCnL0Q2rVlZ0+dy;Aa#;13rve=?$pL>Kf2X^bFX~6d9@*X~0cPhcMtm7*L&Q=*;NO zr#x0v-q(!f!dswyx(#=F;Dtx(YmKF5P1P0oIzCky)%?w4$0d)};$uM1My9DyrJ8c> zjq=x^ZBIwXhjHQ<#NRhjPYwQN1f`bs6 zX~d(z*+#?q$AR5?@GzSed@yT!p5!D>)G_3hu;r~x{LsehdUeWQWBWht==eYv6@yk!qe2?1&#Vzs z8h@%!d{2{ErpZvvNDQoFN<_Do1qObH3#y*5BtcZO&x09znZ%)$bInfqYs`KN9K;x` zoWrj>j|$2t*h^jz-6be zh#M2^q2{B3c3nBLf9N=Nwf2i;A0Hg7A3=rGIiRV|@ilw5m}j0JGxLNt5!wEK7{M|! zwE1dm4|^NDQ!|JZEFj>$Cc62Lo5qc^H|7oOImED5UrO3BpTx0;v36lAo15`vU0s1q zSg~=#;tH{m#`kM5q~hs(XBIm?eEh)3$+-+Rc8MPE%ar(Bl?rEujVaou+`bJHX1;C3 z_hJ>I`9jXZ0S2}o%cOkt$;#^R|y#kYP~2l{!exFg)YGVoO8z(Jl30h7Zg z&R|EYvh%UwQ?ICVb%ht-BX(I;jyyZ^)HXjKhxVjS>{NG&gjFfL!c^>zQ{A{~MYKQSky!9QBK(<}2h@!+r99hIXPV(VsBEW=cEk|r zhz(VC{s2m@K93^^uYnT6L`CVYu2{}CjY5o0J+MtZW=5$6+sHGr&JF-vXyLWjDm$JJ z96sRNiQqWWzaM8L+&x$l0J0D4fvxdFFzwFeGO_M-DqY~mQUG7V9^3UpQNHoV%m|8r zt`R%?!olHhoPY(fBS_oIyLZx$-CIE)Fc4&WGP#5udnlJRAby<9G(fiU_>&a`aInaC z=pgoG{ytVcS{{1)F%o&-H>-!ge)i0c>SNDUb`OxA4*wYe$JxU-G_~Xf(7`|jQWOS) zoY(jYx%F{&070?;spnxMP@|pgqsK>1@0Owr2$0`?*DVZlEAP1L_E_c7=STXVLv}PH z+Vf;3YWO5`nYw&%wnXJao2?`uUmWuZ$TeAE0z!LS4_%~fFszl>Pst~ON{M9Gi$IMk z?knfEAhBz$Ey^%vCW>r%*n=0}kXAw_RDAIU3S=gVLV26~edaPT0J!gb=X$<#J>R*W z?_9l3+}A@1CoVhjIz8L@&eb;{UFHp)f6-v*Y~Ew8bXw@tW;RzW4>(PT^uqz1L1$7X zk?k!ddT|(Md=dv?O+*XgXdfa56NO$nn@ZD&|3-s&eokxpF%zk@2i&I<`a6&$eKp36om!fN0D0Fzlmrr zl;Xo#cOWI>1SvFSwJ(N}vtKQuDBIeq<)c++bLIG(m0cK;?{ACYzqM;Wv+DXAR(yKx zTJd<-s_PdoUV_KAMT=tDoNX*!%HDLwc*Yo~(v!dLT9M96sOe&&ykF6d!(ydq0n;Bn z#Z%lJ%71HMSTc_iJ@rSJ<^3z08(FU^%w&XAAY{t)LJD?wbbPps!v_xDv~$;oOh92$ zUz`mVI;9fDxW{Sc30_P6C}M*nuHDZ;R<_XjCs_4(AKQy39C7rm_FpZ-bsDrKS>4MU zG&+yf!p3@Fdjwnwq01cZA?90v{#i_Ep^FIaIveGm-XOnz&4x-&VI>>&g3kP4FQfD@ zYuCEHi@=kwiiR8mnOI@w=WSy}ZFUHjw za3SrA51Cox5P1=|6SodSZm}Au$?T%|Xk+`hZT@qp+o8tlaN9iPKgjZ{lGmxMC;9gj z$!jyalK-bsNPY(-`H!QJobq$Y>tjXVTTz|A(U_CQZ+)m+y+&cz)am6`zdrP>wgcd3$mMfyTb8LyZ4Eiy** z)c@RAxh`OrD-{^$AmBS?Y*3mbAF9`(4u6UR*`ve55BIr@28K z>o5bi#pKC+EXtIf$;n0T+p^ib!Y(Jsa?`NfEk!XqR+tM{V5~9DnTXqAk~Q+QR3_i*E!3;oK$ z*)d#@^C*E!SH@ zxVEyIvwJfXhOKUkkuaL-YN%1(IgV1=752+oVY9Wu-p7Sqg@1y_p4**CXyl#zl8;Fw z5c_GUTBh{`>O}4dsq-vW7k8T^aDRvMKYw?<#D}R3aQwMiQNcge*KIOLv|HCe!|vd= ziRF+e6;H15Hz8}Vfmk;ov0ek&hsFP8z7ag8BfUaLTC@UA8f_kjWx3ag=jleV zQX+7znls)#Er4HcU7pr3bjIgvf&3IQViX~&@+CaE+LCi`;qB$4%i~oI56eJejlM){ z;Y{j}Zs?X9qYw9>4aoMfo=aE6KTz}r{NqYD%jdh8SL7y#(q_0y6CI@rlO|Ts1p$9@ zEA@Tw2!g;Fzphqs-{qp6;i5&rz~5>pTVWUwq(_0^pX*qJAvn79|64~og7o`QPTI_R z1`h&FDp>zbNBbot)&NPMRfz3Ft2p{6$OjJsPHwI>YbaJZi!s9LY#&zTXifA`-%~a8 z7oLU$PF-Zq(^cUoIxPuk#!w(y_jHYpbeM4k=}|!QW*v(#XhxU*E*j{W{uV z&=g|(pec`WrDdn%CAii#b&SF~Q_kr91gJSmfNs`RAq=3KP#_vWcj`!onOKk>1waqz zScCyIy7aH=NJo%93P6wPXomq*h^+-Ew>VY_B|w#fhu_yR3Iix-G)4fu*w=$9XW*#6 zZ?~fMp+D1AA`GJcfCAAV`ag7}!;CCQj{>6a>R5z9G`jRHEgJtALHZ~VovouC22mll z52A<;!c{74)k5~7YLeTJeq6^a45pmf`vOyMwP2Jz=`vj=?KzCfoVZUI}D~mY(Go`Hb-CDrX;yA{Zk#YFqm>?V+7L+HOqSf zqNA|$K3yHc>|92HXefP2M>@>Tf^-x+zonxcW@ka$XJ`KzN-^p1C%U%&a~;DlTXTkE zWb2v2*50b^=q>#Zx*CL8`ll!m&C+Leq{A#NNJp{sKj~k(Fl%E4vHvqc`%Ux(b9D`4SX}X5z0WSRK^X28UAkHsJU*9_50DvemdYW7G;R=d*;mJ1e45M4c@>rmIZY zFl+}3L~9ZIbfm*t1SbuvPs!t=d2Cz8H{c@{%DSeAAoRgHa8gj%E0F4f{E$wjFpwW) z)vdqvjBkb*J*iw@BAqQ;{|EcjP74y)o|V&<#)XG=x+jfOtSq06fJwtHTZci^Y3a+Q z*sjS6rIweu<8Bm~{ndp9PdtprR=&DQ+$1 z>sW>9pR+n={nszZqNYF6SIXFFwxQ2M0O%q|emCqOHIxTv#e1%1v$+A?srXt^JdZ0C zagr&!t~@}rI;e%t;H{f;6rD}VKrd2A*ttR(yyg>2-^RArhgp~5Wr9BSg0Bi;AGeJ8 z8+LPZ-E<(Z?Aye(Zh@u;S&zW#$YK@-oVK`~OHx(sVtD~RC`3=J12LOP#(Bh?2MOH; zS*{SWu+8-;%%j7J+4QL++5gCoHPj7iA+q;E7KNOQNbxJNo%h0%WPFRiK2Ed0uST7j z`m7Xah*Y1mxlSH@Gw8HrbMogjncPW%HX9KlKSjKh&ohxjRI%u0nx4(cG?|Ym z5x=5g+wgbjYf;V1rRgY&Nk-jxaZDF=bli6K^+#}I4X5|mX*>O~TAQ@RM=vvi1-!w` zgUA)!3siUUNg#2bUjbQzfdGN5ZUocaGHeJoZ*?ZKgS7DnO8&6I`>w#`1rhT}d~T|f zWm&p3mShp~OT{?^9!I~Fc1#m=v2iD*7njDCEbd%#Z5zwl)x~29xi(nRmFa9UQ%V`J zKP=j*bZ(LPsX#Jy^OVYxsW&D6javlm7(8?mu|#H~&_TZ+ynoFC9O|X0fBLWPs4I3; ztUd5@!Qu@!F6RF&a|w9*Vr^kEihSaso z7A)@0Ul^19lKacOR-XbD0Z-;hOm+#ptZ{Q*Zmo+` zUkBZr`mUa9Q}f6kRro*Q*3=wfE=|IYaq=TBiaV3VC1e5=e6B2zH`I-Zyb)cPr0n4_ z)P2e968L_h{jN*ol}c{xwnPCH{z3X`H!iY^?%~EYya`ANeICb8#_y^``Fd_j($hHr z)kO(10rw&NSTWTl30hirBq=FAB}htjMS_&x4M|!)PZFf2x*$QV zp8JvXBD)?zub$hH^c3F_lumUyf|}mlNLtZcjUc6UGxc4}dvz~fQyz_L@p`>lx8k{! zO=4B(ybEFB)t#S`z1w*gB8I$doD-ZhsWTwigwDGVnogc~A+#&675GK^w%Kwip z#9fBp)nM_E7RRl3FmoBO{tXo(Y`nlj${>8lM?psb(1 z)VL1r`so(00@ie_2g|A7XpVkbb5YPc_L&bo_L*;R?9+<+ zg7i^P`KXR|7%GL>K2%P{>bF2;@Cf8y9sMv+a{6Ng$}u?tc~n=0FkBu&foT2BDIMuB z%L>w?z~v8hEW&UZUHZS*k&YmJ6kJwyw8L;I#P;FR@^C57mZiOk!mo8K!l21nyr0k< z?cvAClQpg|44N${5Dl7_=tzedSCAeBH0SGBgh4a9^hO!#x{amPbCCSma8Ox_oGdaDZ}>^5qg{daYh2!rPt6o>}T zpXf-38CZ}W1w4PIV-W_==+ggEM>>M^QQ-NnI@)3I6k_|}xmkgyVt#ji-!etx6~o}k znT!!U$L5&h<+?hA*>^4qL_=q%j&zuP1?edEU8bWQW?wm2Bakz1k*4zsTy9mT$1(a{dGub}O-ZxfwT;Y<12LydzvCSlg) zOvcE%V{oYP1ziQgjQb13IA#dcPiPra#+xpM4iq>D^7xqN{N+z^he@z+w1^XA)-{4o^@|J%RIwoOOkIf>bFOSFIQ=EP04Fr*FH+9U_!ddKJW1AWJ*uQRvvsGYcx<(DiG9?w zRl8wLVeOE!RbSKCTy2<2Y`{)r4et2`vbwPW+fnsL8|PQ!A*jd>l9_AE7fepe>E{wm z{{F<0i?C@C{qD6SUo80&9xAN99YrX4ZDAQ8Fy=vktTu>wUKVmJO2$s< zqeb38968I2GabIXb>qlcZiFiNa@P+6WZ4lH@6WCe0%Um+Ozz7om8^>+X9YeTDBwkC z1dl#ZcKY8(-;LhzrTR}U`QwHe8L|#L)gj7{K8~D`aZM!1j5>~-QE`nYsGMUQIiuy8 zR?s@PIC4hHHM<~n&T-_7nhOj;?LEYiGkTv1Sn!Z?tU%kA&Cggj-H(#kg6{Q)J zxD`ZB2IY+z{zBomf>+oyP%CNtE>~EI+&9T3E_V)q$OXBEm z@9<=CCX#}237J@GhS={3$_)B~u!$kQ?~^OhcRI~aI2YN4M7Ee= zpHGP66VJT`qe$Q9Ye7y@^Z-9~_d`xvnUHA$SXHN$L)*(Zicq|n%c$!Lg%yi@a0(uKEn)n?m z&a57gq3@L`F9)2dMOrZRN3STl)=n|qw;VmjtgX<}5$&Sil&0TR}`K)f@J)2%IissBZwurq_|0NfQ# zs3?Ov;hHh|%~)tWh3BS+%=m39%Fc!OIz4^VCuPtTZ{S3qsaoMQ<8(j|E+T?b(zx-6 zW5R59rX@;tF772c7vR%B&eT+?FCTXi3Ei>;EJzrIEUqj8ndvNrVVwZrCFP4oDV2+F z=p#(cFgE0KMFaO?cqJK7l6L&TbTLhLDS=izl`bZ_GY0A+q-=?Mt!@e`Q^f5({HrAZ zj>s18NoPCN($u9&InMm`V4g?ebkS zu6Cy7jeHzRG0;ep9E_CGoq+7rI-E;P+s+r4c6A}SxG2BTHgnlUxk4`*)ojYi1VGNX zjhl4PLBJxDkluOK;w8}Mv_elZK%P=O^7AEmx?PS?yUr*qN*i_$)FH{;=ErfHDQPTSBw?+FHho?J4W?EwZv z*D#CviejldkS*PZPacC;g15(stXBeL`nqw0O3~g32}}dG`3*X=lgPC$Zr~E3OdMBs zQMU^#4LCE2GFiN6WO{hFHt0++vJaN=AvI?b?@-W!fkfObl}6jJD`EI9`lG)W$pvhhg7R`^r zSFrcy6m~}#yG4wx*|JsLk~38`CL=#JnFb_CKCt8|)MjNqUJo^e=R>Q2@#z{v7auI^ zMS(;&cdL(LtK`ZG&GOMl4_vUzXiT$%w8R@YLG&oeT!~seefut#$#6Ttt+d=G(w~4{ zww3Qe>%d82v@@u=2taU#ZpY$Fp6n(wn@$$DPys`|)D5)ZhPE7BA(T~K!B=7z{Xgaw B$-Mvo literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/matmulfusion.doctree b/master/doctrees/functionlib/dsplib/matmulfusion.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b543602dbc4641ead5feb6d6fadb46026dc85f1b GIT binary patch literal 80658 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/raggedrange.doctree b/master/doctrees/functionlib/dsplib/raggedrange.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ef8853d6d10021d00129a8d8cd954b79ca1cfbe4 GIT binary patch literal 62298 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
+ + +
+ +
+
+ +
+
+ +
+

Activation

+

对输入的数组中每一个元素执行激活函数计算,激活函数可选,具体函数见以下说明。

+
    +
  • Relu - 标准Relu函数。

    +
    +
    +\[output_i = \max(0, input_i)\]
    +
    +
  • +
  • Relu6 - 在标准Relu函数的基础上进行输出上限限制。

    +
    +
    +\[output_i = \min(\max(0, input_i),6)\]
    +
    +
  • +
  • Clip - 将输入裁剪到区间 [min_val, max_val]

    +
    +
    +\[output_i = \min(\max(input_i, \text{min_val}), \text{max_val})\]
    +
    +
  • +
  • LRelu - 带泄露的线性整流单元(Leaky Rectified Linear Unit),它在输入为正时保持线性,在输入为负时也保留一个很小的斜率,以避免标准 ReLU 中的“死亡神经元”问题。

    +
    +
    +\[\begin{split}output_i = +\begin{cases} +input_i, & input_i \ge 0 \\ +\alpha \cdot input_i, & input_i < 0 +\end{cases}\end{split}\]
    +
    +
  • +
  • Sigmoid - 常用的平滑非线性激活函数(又称逻辑函数),可以将任意实数映射到区间 \((0, 1)\),常用于二分类问题的输出层,表示概率意义的结果。

    +
    +
    +\[output_i = \frac{1}{1 + e^{-input_i}}\]
    +
    +
  • +
  • Tanh - 双曲正切激活函数(Hyperbolic Tangent),其输出范围为 \((-1, 1)\)

    +
    +
    +\[output_i = \tanh(input_i) = \frac{e^{input_i} - e^{-input_i}}{e^{input_i} + e^{-input_i}}\]
    +
    +
  • +
  • HSigmoid - 硬 Sigmoid 激活函数(Hard Sigmoid),是 Sigmoid 函数的近似形式,计算简单、效率更高。

    +
    +
    +\[output_i = \text{clip}\left(\frac{input_i + 3}{6}, 0, 1\right)\]
    +

    其中 clip(a, 0, 1) 表示将 a 限制在区间 \([0, 1]\) 内。

    +
    +
  • +
  • Swish - 自门控(Self-Gated)激活函数,由 Google 提出,结合了 Sigmoid 与线性特性,具有平滑且非单调的特点。

    +
    +
    +\[output_i = input_i \cdot \sigma(input_i) = \frac{input_i}{1 + e^{-input_i}}\]
    +

    其中 \(\sigma(x)\) 为标准 Sigmoid 函数。Swish 在深层网络中通常表现优于 ReLU

    +
    +
  • +
  • HSwish - 硬 Swish 激活函数(Hard Swish),是 Swish 函数的近似形式,计算简单且在移动端模型(如 MobileNetV3)中被广泛采用。

    +
    +
    +\[output_i = input_i \cdot \text{clip}\left(\frac{input_i + 3}{6}, 0, 1\right)\]
    +

    其中 clip(a, 0, 1) 表示将 a 限制在区间 \([0, 1]\) 内。

    +
    +
  • +
  • HardTanh - 硬双曲正切激活函数(Hard Tanh),是 Tanh 函数的分段线性近似形式,计算简单、梯度稳定,常用于量化或轻量网络中。

    +
    +
    +\[output_i = \text{clip}(input_i, min\_val, max\_val)\]
    +

    其中 clip(x, min_val, max_val) 表示当 \(x < min\_val\) 时输出 min_val,当 \(x > max\_val\) 时输出 max_val,否则输出 \(x\) 本身。

    +
    +
  • +
  • Gelu - 高斯误差线性单元(Gaussian Error Linear Unit),是一种平滑的非线性激活函数,结合了 ReLU 与概率特性。 该函数支持精确计算及非近似计算模式,近似算法由 Hendrycks & Gimpel (2016) 提出,用以替代精确形式 \(output_i=x\Phi(x)\) ,计算速度更快且精度损失极小。

    +
    +
    +\[\begin{split}\begin{aligned} +output_i = +\begin{cases} +0.5\,input_i \Bigl[ 1 + \tanh\!\Bigl( + \sqrt{\frac{2}{\pi}}\,(input_i + 0.044715\,input_i^3) +\Bigr) \Bigr], & flag = true, \\[6pt] +input_i \,\Phi(input_i) += \tfrac{1}{2}x \Bigl[ + 1 + \mathrm{erf}\!\Bigl(\tfrac{input_i}{\sqrt{2}}\Bigr) +\Bigr], & flag = false. +\end{cases} +\end{aligned}\end{split}\]
    +

    其中 \(\Phi(x)\) 为标准正态分布的累积分布函数。

    +
    +
  • +
  • Softplus - ReLU 的平滑近似形式,能在零点处保持可导性。

    +
    +
    +\[\begin{split}output_i = + \begin{cases} + input_i, & input_i \gt 88.0 \\ + \ln(1 + e^{input_i}), & \text{otherwise} + \end{cases}\end{split}\]
    +
    +
  • +
  • Elu - 在输入为正时保持线性,在输入为负时呈指数衰减,可缓解 ReLU 的“死亡神经元”问题。

    +
    +
    +\[\begin{split}output_i = + \begin{cases} + input_i, & input_i \ge 0 \\ + \alpha (e^{input_i} - 1), & input_i < 0 + \end{cases}\end{split}\]
    +
    +

    其中 \(\alpha\) 为超参数,通常取 \(\alpha = 1.0\)

    +
  • +
  • Celu - 连续指数线性单元(Continuously Differentiable ELU),是 ELU 的改进版本,保证在零点处连续可导。

    +
    +
    +\[\begin{split}output_i = +\begin{cases} +input_i, & input_i \ge 0 \\ +\alpha (e^{\frac{input_i}{alpha}} - 1), & input_i < 0 +\end{cases}\end{split}\]
    +

    其中 \(\alpha\) 为可调超参数,用于控制负区间的平滑程度。

    +
    +
  • +
  • HardShrink - 硬收缩激活函数(Hard Shrinkage),用于稀疏化输出。

    +
    +
    +\[\begin{split}output_i = +\begin{cases} + input_i, & \text{if } |input_i| > \lambda \\ + 0, & \text{otherwise} +\end{cases}\end{split}\]
    +
    +

    其中 \(\lambda\) 为阈值常数。

    +
  • +
  • SoftShrink - 软收缩激活函数(Soft Shrinkage),与 HardShrink 类似,但收缩过程更加平滑。

    +
    +
    +\[\begin{split}output_i = +\begin{cases} +input_i - \lambda, & \text{if } input_i > \lambda \\ +input_i + \lambda, & \text{if } input_i < -\lambda \\ +0, & \text{otherwise} +\end{cases}\end{split}\]
    +
    +
  • +
  • SoftsignOpt - 优化的软符号函数(Optimized Softsign),是一种平滑的压缩函数,用于将输入映射到有限区间。

    +
    +
    +\[output_i = \frac{input_i}{1 + |input_i|}\]
    +
    +
  • +
+
+
输入:
    +
  • Input0 - 输入数据地址。

  • +
  • length - 数组长度。

  • +
  • args(部分激活函数) - 激活函数计算参数(仅适用于部分函数)。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 计算结果地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享存储版本:

+
+
+void i8_relu_s(int8_t *Input0, int8_t *output, int length, int core_mask)
+
+ +
+
+void fp_relu_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_relu_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_relu6_s(int8_t *Input0, int8_t *output, int length, int core_mask)
+
+ +
+
+void fp_relu6_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_relu6_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_clip_s(int8_t *Input0, int8_t *output, int length, int8_t min_val, int8_t max_val, int core_mask)
+
+ +
+
+void fp_clip_s(float *Input0, float *output, int length, float min_val, float max_val, int core_mask)
+
+ +
+
+void hp_clip_s(half *Input0, half *output, int length, half min_val, half max_val, int core_mask)
+
+ +
+
+void i8_lrelu_s(int8_t *Input0, int8_t *output, int length, float alpha, int core_mask)
+
+ +
+
+void fp_lrelu_s(float *Input0, float *output, int length, float alpha, int core_mask)
+
+ +
+
+void hp_lrelu_s(half *Input0, half *output, int length, half alpha, int core_mask)
+
+ +
+
+void i8_sigmoid_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_sigmoid_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_sigmoid_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_tanh_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_tanh_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_tanh_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_hsigmoid_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_hsigmoid_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_hsigmoid_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_swish_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_swish_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_swish_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_hswish_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_hswish_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_hswish_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_hardtanh_s(int8_t *Input0, int8_t *output, int length, int8_t min_val, int8_t max_val, int core_mask)
+
+ +
+
+void fp_hardtanh_s(float *Input0, float *output, int length, float min_val, float max_val, int core_mask)
+
+ +
+
+void hp_hardtanh_s(half *Input0, half *output, int length, half min_val, half max_val, int core_mask)
+
+ +
+
+void i8_gelu_s(int8_t *Input0, float *output, int length, int approximate, int core_mask)
+
+ +
+
+void fp_gelu_s(float *Input0, float *output, int length, int approximate, int core_mask)
+
+ +
+
+void hp_gelu_s(half *Input0, half *output, int length, int approximate, int core_mask)
+
+ +
+
+void i8_softplus_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_softplus_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_softplus_s(half *Input0, half *output, int length, int core_mask)
+
+ +
+
+void i8_elu_s(int8_t *Input0, float *output, int length, float alpha, int core_mask)
+
+ +
+
+void fp_elu_s(float *Input0, float *output, int length, float alpha, int core_mask)
+
+ +
+
+void hp_elu_s(half *Input0, half *output, int length, half alpha, int core_mask)
+
+ +
+
+void i8_celu_s(int8_t *Input0, float *output, int length, float alpha, int core_mask)
+
+ +
+
+void fp_celu_s(float *Input0, float *output, int length, float alpha, int core_mask)
+
+ +
+
+void hp_celu_s(half *Input0, half *output, int length, half alpha, int core_mask)
+
+ +
+
+void i8_hardshrink_s(int8_t *Input0, int8_t *output, int length, int8_t lambd, int core_mask)
+
+ +
+
+void fp_hardshrink_s(float *Input0, float *output, int length, float lambd, int core_mask)
+
+ +
+
+void hp_hardshrink_s(half *Input0, half *output, int length, half lambd, int core_mask)
+
+ +
+
+void i8_softshrink_s(int8_t *Input0, int8_t *output, int length, int8_t lambd, int core_mask)
+
+ +
+
+void fp_softshrink_s(float *Input0, float *output, int length, float lambd, int core_mask)
+
+ +
+
+void hp_softshrink_s(half *Input0, half *output, int length, half lambd, int core_mask)
+
+ +
+
+void i8_softsignopt_s(int8_t *Input0, float *output, int length, int core_mask)
+
+ +
+
+void fp_softsignopt_s(float *Input0, float *output, int length, int core_mask)
+
+ +
+
+void hp_softsignopt_s(half *Input0, half *output, int length, int core_mask)
+
+ +

C调用示例:

+
+
 1//FT78NE示例
+ 2#include <stdio.h>
+ 3#include <activation.h>
+ 4
+ 5int main(int argc, char* argv[]) {
+ 6    float *input0 = (float *)0xA0000000;   //input在DDR空间
+ 7    float *output = (float *)0xC0000000;
+ 8    int length = 1000;
+ 9    int core_mask = 0xff;
+10    fp_tanh_s(input0, output, length, core_mask);
+11    return 0;
+12}
+
+
+
+

私有存储版本:

+
+
+void i8_relu_p(int8_t *Input0, int8_t *output, int length)
+
+ +
+
+void fp_relu_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_relu_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_relu6_p(int8_t *Input0, int8_t *output, int length)
+
+ +
+
+void fp_relu6_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_relu6_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_clip_p(int8_t *Input0, int8_t *output, int length, int8_t min_val, int8_t max_val)
+
+ +
+
+void fp_clip_p(float *Input0, float *output, int length, float min_val, float max_val)
+
+ +
+
+void hp_clip_p(half *Input0, half *output, int length, half min_val, half max_val)
+
+ +
+
+void i8_lrelu_p(int8_t *Input0, int8_t *output, int length, float alpha)
+
+ +
+
+void fp_lrelu_p(float *Input0, float *output, int length, float alpha)
+
+ +
+
+void hp_lrelu_p(half *Input0, half *output, int length, half alpha)
+
+ +
+
+void i8_sigmoid_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_sigmoid_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_sigmoid_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_tanh_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_tanh_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_tanh_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_hsigmoid_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_hsigmoid_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_hsigmoid_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_swish_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_swish_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_swish_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_hswish_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_hswish_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_hswish_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_hardtanh_p(int8_t *Input0, int8_t *output, int length, int8_t min_val, int8_t max_val)
+
+ +
+
+void fp_hardtanh_p(float *Input0, float *output, int length, float min_val, float max_val)
+
+ +
+
+void hp_hardtanh_p(half *Input0, half *output, int length, half min_val, half max_val)
+
+ +
+
+void i8_gelu_p(int8_t *Input0, float *output, int length, int approximate)
+
+ +
+
+void fp_gelu_p(float *Input0, float *output, int length, int approximate)
+
+ +
+
+void hp_gelu_p(half *Input0, half *output, int length, int approximate)
+
+ +
+
+void i8_softplus_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_softplus_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_softplus_p(half *Input0, half *output, int length)
+
+ +
+
+void i8_elu_p(int8_t *Input0, float *output, int length, float alpha)
+
+ +
+
+void fp_elu_p(float *Input0, float *output, int length, float alpha)
+
+ +
+
+void hp_elu_p(half *Input0, half *output, int length, half alpha)
+
+ +
+
+void i8_celu_p(int8_t *Input0, float *output, int length, float alpha)
+
+ +
+
+void fp_celu_p(float *Input0, float *output, int length, float alpha)
+
+ +
+
+void hp_celu_p(half *Input0, half *output, int length, half alpha)
+
+ +
+
+void i8_hardshrink_p(int8_t *Input0, int8_t *output, int length, int8_t lambd)
+
+ +
+
+void fp_hardshrink_p(float *Input0, float *output, int length, float lambd)
+
+ +
+
+void hp_hardshrink_p(half *Input0, half *output, int length, half lambd)
+
+ +
+
+void i8_softshrink_p(int8_t *Input0, int8_t *output, int length, int8_t lambd)
+
+ +
+
+void fp_softshrink_p(float *Input0, float *output, int length, float lambd)
+
+ +
+
+void hp_softshrink_p(half *Input0, half *output, int length, half lambd)
+
+ +
+
+void i8_softsignopt_p(int8_t *Input0, float *output, int length)
+
+ +
+
+void fp_softsignopt_p(float *Input0, float *output, int length)
+
+ +
+
+void hp_softsignopt_p(half *Input0, half *output, int length)
+
+ +

C调用示例:

+
+
 1//FT78NE示例
+ 2#include <stdio.h>
+ 3#include <activation.h>
+ 4
+ 5int main(int argc, char* argv[]) {
+ 6    float *input0 = (float *)0x10000000;   //input在DDR空间
+ 7    float *output = (float *)0x10004000;
+ 8    int length = 1000;
+ 9    fp_tanh_p(input0, output, length);
+10    return 0;
+11}
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/adamweightdecay.html b/master/html/functionlib/dsplib/adamweightdecay.html new file mode 100644 index 0000000..2bbd947 --- /dev/null +++ b/master/html/functionlib/dsplib/adamweightdecay.html @@ -0,0 +1,281 @@ + + + + + + + + + AdamWeightDecay — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

AdamWeightDecay

+

对权重张量执行 Adam Weight Decay 优化更新。

+
+
+\[\begin{split}\begin{aligned} +m_t &= \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \\ +v_t &= \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \\ +\hat{m}_t &= \frac{m_t}{\sqrt{v_t} + \epsilon} \\ +var_t &= var_{t-1} - lr \cdot (\hat{m}_t + decay \cdot var_{t-1}) +\end{aligned}\end{split}\]
+
+
输入:
    +
  • var - 待更新权重张量首地址。

  • +
  • m - 一阶动量张量首地址。

  • +
  • v - 二阶动量张量首地址。

  • +
  • gradient - 梯度张量首地址。

  • +
  • lr - 学习率。

  • +
  • beta1 - 一阶动量衰减系数。

  • +
  • beta2 - 二阶动量衰减系数。

  • +
  • epsilon - 数值稳定项。

  • +
  • decay - 权重衰减系数。

  • +
  • start - 参与计算的起始索引(闭区间)。

  • +
  • end - 参与计算的结束索引(开区间)。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • var - 原地写回更新后的权重张量。

  • +
  • m - 原地写回更新后的一阶动量张量。

  • +
  • v - 原地写回更新后的二阶动量张量。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32 数据类型。

  • +
  • MT7004 支持 fp16、fp32 数据类型。

  • +
+
+
+

共享存储版本:

+
+
+void hp_adamweightdecay_s(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)
+
+ +
+
+void fp_adamweightdecay_s(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)
+

C调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(void) {
+ 5        float *var = (float *)0xA0000000;        // DDR 存储
+ 6        float *m = (float *)0xB0000000;
+ 7        float *v = (float *)0xC0000000;
+ 8        float *gradient = (float *)0xD0000000;
+ 9        int start = 0;
+10        int end = 4096;
+11        int core_mask = 0xff;
+12        float lr = 1e-3f;
+13        float beta1 = 0.9f;
+14        float beta2 = 0.999f;
+15        float epsilon = 1e-8f;
+16        float decay = 1e-2f;
+17        fp_adamweightdecay_s(var, m, v, gradient, lr,
+18                                                 beta1, beta2, epsilon, decay,
+19                                                 start, end, core_mask);
+20        return 0;
+21}
+
+
+
+ +

私有存储版本:

+
+
+void hp_adamweightdecay_p(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)
+
+ +
+
+void fp_adamweightdecay_p(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)
+

C调用示例:

+
 1// MT7004 单核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(void) {
+ 5        half *var = (half *)0x10000000;        // L2 存储
+ 6        half *m = (half *)0x10002000;
+ 7        half *v = (half *)0x10004000;
+ 8        half *gradient = (half *)0x10006000;
+ 9        int length = 2048;
+10        float lr = 5e-4f;
+11        float beta1 = 0.9f;
+12        float beta2 = 0.999f;
+13        float epsilon = 1e-6f;
+14        float decay = 5e-3f;
+15        hp_adamweightdecay_p(var, m, v, gradient, lr,
+16                                                 beta1, beta2, epsilon, decay,
+17                                                 length);
+18        return 0;
+19}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/adder.html b/master/html/functionlib/dsplib/adder.html new file mode 100644 index 0000000..54116a2 --- /dev/null +++ b/master/html/functionlib/dsplib/adder.html @@ -0,0 +1,352 @@ + + + + + + + + + Adder — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Adder

+

Adder是一种卷积替代算子,它使用L1距离度量(绝对差的和)代替传统卷积中的点积操作。与标准卷积不同,Adder通过计算特征与卷积核之间的绝对差的负和来进行特征提取。假定输入X,filter表示为F,它按以下公式计算:

+
+\[Y(m,n,t) = - \sum_{i=0}^{d} \sum_{j=0}^{d} \sum_{k=0}^{C_{in}} |X(m+i, n+j, k) - F(i,j,k,t)|\]
+
+
输入:
    +
  • input_x - 输入数据的地址

  • +
  • input_w - 输入卷积核权重的地址

  • +
  • bias - 输入偏置的地址

  • +
  • param - 算子计算所需参数的结构体。其各成员见下述。

  • +
  • core_mask - 核掩码。

  • +
+
+
+

AdderParameter定义:

+
 1typedef struct AdderParameter {
+ 2    void* workspace_; // 用于存放中间计算结果
+ 3    int output_batch_; // 输出数据总批次
+ 4    int input_batch_; // 输入数据总批次
+ 5    int input_h_; // 输入数据h维度大小
+ 6    int input_w_; // 输入数据w维度大小
+ 7    int output_h_; // 输出数据h维度大小
+ 8    int output_w_; // 输出数据w维度大小
+ 9    int input_channel_; // 输入数据通道数
+10    int output_channel_; // 输出数据通道数
+11    int kernel_h_; // 卷积核h维度大小
+12    int kernel_w_; // 卷积核w维度大小
+13    int group_; // 组数
+14    int pad_l_; // 左填充大小
+15    int pad_u_; // 上填充大小
+16    int dilation_h_; // 卷积核h维度膨胀尺寸大小
+17    int dilation_w_; // 卷积核w维度膨胀尺寸大小
+18    int stride_h_; // 卷积核h维度步长
+19    int stride_w_; // 卷积核w维度步长
+20    int buffer_size_; // 为分块计算所分配的缓存大小
+21} AdderParameter;
+
+
+
+
输出:
    +
  • out_y - 输出地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享存储版本:

+
+
+void i8_adder_s(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, AdderParameter *param, int core_mask)
+
+ +
+
+void hp_adder_s(half *input_x, half *input_w, half *out_y, half *bias, AdderParameter *param, int core_mask)
+
+ +
+
+void fp_adder_s(float *input_x, float *input_w, float *out_y, float *bias, AdderParameter *param, int core_mask)
+
+ +

C调用示例:

+
 1void TestAdderSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    int core_id = get_core_id();
+ 3    int logic_core_id = GetLogicCoreId(core_mask, core_id);
+ 4    int core_num = GetCoreNum(core_mask);
+ 5    float* input_data = (float*)0x88000000;
+ 6    float* weight = (float*)0x89000000;
+ 7    float* output_data = (float*)0x90000000;
+ 8    float* bias_data = (float*)0x91000000;
+ 9    AdderParameter* param = (AdderParameter*)0x92000000;
+10    if (logic_core_id == 0) {
+11        memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+12        param->dilation_h_ = dilation[0];
+13        param->dilation_w_ = dilation[1];
+14        param->group_ = groups;
+15        param->input_batch_ = input_shape[0];
+16        param->input_h_ = input_shape[1];
+17        param->input_w_ = input_shape[2];
+18        param->input_channel_ = input_shape[3];
+19        param->kernel_h_ = weight_shape[1];
+20        param->kernel_w_ = weight_shape[2];
+21        param->output_batch_ = output_shape[0];
+22        param->output_h_ = output_shape[1];
+23        param->output_w_ = output_shape[2];
+24        param->output_channel_ = output_shape[3];
+25        param->stride_h_ = stride[0];
+26        param->stride_w_ = stride[0];
+27        param->pad_u_ = padding[0];
+28        param->pad_l_ = padding[2];
+29        param->workspace_ = (float*)0x10000000; // workspace空间需分配在AM内,计算过程中会将数据搬运到workspace空间内进行计算
+30    }
+31    sys_bar(0, core_num); // 初始化参数完成后进行同步
+32    fp_adder_s(input_data, weight, output_data, bias_data, param, core_mask);
+33}
+34
+35void main(){
+36    int in_channel = 4;
+37    int out_channel = 4;
+38    int groups = 4;
+39    int input_shape[4] = {1, 30, 30, in_channel}; // NHWC
+40    int weight_shape[4] = {out_channel, 3, 3, in_channel / groups};
+41    int output_shape[4] = {1, 10, 10, out_channel}; // NHWC
+42    int stride[2] = {2, 2};
+43    int padding[4] = {1, 1, 1, 1};
+44    int dilation[2]= {2, 2};
+45    float bias[4] = {0, 0, 0, 0};
+46    int core_mask = 0b1111;
+47    TestAdderSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+48}
+
+
+

私有存储版本:

+
+
+void i8_adder_p(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask)
+
+ +
+
+void hp_adder_p(half *input_x, half *input_w, half *out_y, half *bias, ConvParameter *conv_param, int core_mask)
+
+ +
+
+void fp_adder_p(float *input_x, float *input_w, float *out_y, float *bias, ConvParameter *conv_param, int core_mask)
+
+ +

C调用示例:

+
 1void TestAdderL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    float* input_data = (float*)0x10010000; // 私有存储版本地址设置在AM内
+ 3    float* weight = (float*)0x10020000;
+ 4    float* output_data = (float*)0x10030000;
+ 5    float* bias_data = (float*)0x10040000;
+ 6    AdderParameter* param = (AdderParameter*)0x10060000;
+ 7    memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+ 8    param->dilation_h_ = dilation[0];
+ 9    param->dilation_w_ = dilation[1];
+10    param->group_ = groups;
+11    param->input_batch_ = input_shape[0];
+12    param->input_h_ = input_shape[1];
+13    param->input_w_ = input_shape[2];
+14    param->input_channel_ = input_shape[3];
+15    param->kernel_h_ = weight_shape[1];
+16    param->kernel_w_ = weight_shape[2];
+17    param->output_batch_ = output_shape[0];
+18    param->output_h_ = output_shape[1];
+19    param->output_w_ = output_shape[2];
+20    param->output_channel_ = output_shape[3];
+21    param->stride_h_ = stride[0];
+22    param->stride_w_ = stride[0];
+23    param->pad_u_ = padding[0];
+24    param->pad_l_ = padding[2];
+25    param->workspace_ = (float*)0x10070000;
+26    param->buffer_size_ = 2048; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小
+27    fp_adder_p(input_data, weight, output_data, bias_data, param, core_mask);
+28}
+29
+30void main(){
+31    int in_channel = 4;
+32    int out_channel = 4;
+33    int groups = 4;
+34    int input_shape[4] = {1, 30, 30, in_channel}; // NHWC
+35    int weight_shape[4] = {out_channel, 3, 3, in_channel / groups};
+36    int output_shape[4] = {1, 10, 10, out_channel}; // NHWC
+37    int stride[2] = {2, 2};
+38    int padding[4] = {1, 1, 1, 1};
+39    int dilation[2]= {2, 2};
+40    float bias[4] = {0, 0, 0, 0};
+41    int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动
+42    TestAdderL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+43}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/applymomentum.html b/master/html/functionlib/dsplib/applymomentum.html new file mode 100644 index 0000000..203a98f --- /dev/null +++ b/master/html/functionlib/dsplib/applymomentum.html @@ -0,0 +1,275 @@ + + + + + + + + + ApplyMomentum — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

ApplyMomentum

+

对权重张量执行 Momentum/改进动量优化更新。

+
+
+\[\begin{split}\begin{aligned} +accu_t &= moment \cdot accu_{t-1} + g_t \\ +update_t &= \begin{cases} + (accu_t \cdot moment + g_t), & \text{if nesterov = True} \\ + accu_t, & \text{otherwise} +\end{cases} \\ +weight_t &= weight_{t-1} - learning\_rate \cdot update_t +\end{aligned}\end{split}\]
+
+
输入:
    +
  • weight - 待更新权重张量首地址。

  • +
  • accumulate - 动量累积张量首地址。

  • +
  • gradient - 梯度张量首地址。

  • +
  • learning_rate - 学习率。

  • +
  • moment - 动量系数。

  • +
  • nesterov - 是否启用 Nesterov 动量。

  • +
  • start - 参与计算的起始索引(闭区间)。

  • +
  • end - 参与计算的结束索引(开区间)。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • weight - 原地写回更新后的权重张量。

  • +
  • accumulate - 原地写回更新后的动量张量。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32 数据类型。

  • +
  • MT7004 支持 fp16、fp32 数据类型。

  • +
+
+
+

共享存储版本:

+
+
+void hp_applymomentum_s(half *weight, half *accumulate, const half *gradient, float learning_rate, float moment, bool nesterov, int start, int end, int core_mask)
+
+ +
+
+void fp_applymomentum_s(float *weight, float *accumulate, const float *gradient, float learning_rate, float moment, bool nesterov, int start, int end, int core_mask)
+

C调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3#include <stdbool.h>
+ 4
+ 5int main(void) {
+ 6    float *weight = (float *)0xA0000000;      // DDR 存储
+ 7    float *accumulate = (float *)0xB0000000;
+ 8    float *gradient = (float *)0xC0000000;
+ 9    int start = 0;
+10    int end = 4096;
+11    int core_mask = 0xff;
+12    float learning_rate = 1e-2f;
+13    float moment = 0.99f;
+14    bool nesterov = false;
+15    fp_applymomentum_s(weight, accumulate, gradient,
+16                        learning_rate, moment, nesterov,
+17                        start, end, core_mask);
+18    return 0;
+19}
+
+
+
+ +

私有存储版本:

+
+
+void hp_applymomentum_p(half *weight, half *accumulate, const half *gradient, float learning_rate, float moment, bool nesterov, int length)
+
+ +
+
+void fp_applymomentum_p(float *weight, float *accumulate, const float *gradient, float learning_rate, float moment, bool nesterov, int length)
+

C调用示例:

+
 1// MT7004 单核示例
+ 2#include <stdio.h>
+ 3#include <stdbool.h>
+ 4
+ 5int main(void) {
+ 6    half *weight = (half *)0x10000000;       // L2 存储
+ 7    half *accumulate = (half *)0x10002000;
+ 8    half *gradient = (half *)0x10004000;
+ 9    int length = 2048;
+10    float learning_rate = 5e-3f;
+11    float moment = 0.9f;
+12    bool nesterov = true;
+13    hp_applymomentum_p(weight, accumulate, gradient,
+14                       learning_rate, moment, nesterov,
+15                       length);
+16    return 0;
+17}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/assert.html b/master/html/functionlib/dsplib/assert.html new file mode 100644 index 0000000..6f2d34a --- /dev/null +++ b/master/html/functionlib/dsplib/assert.html @@ -0,0 +1,213 @@ + + + + + + + + + Assert — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Assert

+
+
+void assert(bool *Input, bool *output)
+
+ +

判断输入是否为 True。

+
+\[\begin{split}output_i = \begin{cases} + \text{True}, & \text{if } Input_i = \text{True} \\ + \text{False}, & \text{if } Input_i = \text{False} +\end{cases}\end{split}\]
+
+
输入:
    +
  • Input - 输入数据地址(布尔类型)。

  • +
+
+
输出:
    +
  • output - 计算结果地址(布尔类型)。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • 本算子只有一个版本

  • +
+
+

C调用示例:

+
 1// FT78NE/MT7004 示例(共享存储)
+ 2#include <stdio.h>
+ 3#include <stdbool.h>
+ 4
+ 5int main(int argc, char* argv[]) {
+ 6    bool *input  = (bool *)0xA0000000;
+ 7    bool *output = (bool *)0xC0000000;
+ 8    assert_s(input, output);
+ 9    return 0;
+10}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/attention.html b/master/html/functionlib/dsplib/attention.html new file mode 100644 index 0000000..c54bf9c --- /dev/null +++ b/master/html/functionlib/dsplib/attention.html @@ -0,0 +1,246 @@ + + + + + + + + + Attention — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Attention

+

多头缩放点积注意力机制(Scaled Dot-Product Attention)

+
+\[\text{Attention}(Q, K, V) = \operatorname{softmax}\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V\]
+
+
输入:
    +
  • Q - 查询矩阵地址(行优先),形状 \([B, H, L, D]\) 展平。

  • +
  • K - 键矩阵地址(行优先),形状 \([B, H, L, D]\) 展平。

  • +
  • V - 值矩阵地址(行优先),形状 \([B, H, L, D]\) 展平。

  • +
  • batch_size (B) - 批大小。

  • +
  • seq_len (L) - 序列长度。

  • +
  • head_num (H) - 多头数量。

  • +
  • head_dim (D) - 每头通道维数。

  • +
  • QK, softmax_out - 中间缓冲区地址,容量不小于 \(B\times H\times L\times L\)

  • +
  • core_mask(可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 输出地址(行优先),形状 \([B, H, L, D]\) 展平。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • 当前实现基于 fp32;输入/中间/输出缓冲区不应重叠。

  • +
  • 内存布局为行优先(row-major)。

  • +
+
+

共享存储版本:

+
+
+void fp_attention_s(float *Q, float *K, float *V, float *output, int batch_size, int seq_len, int head_num, int head_dim, float *QK, float *softmax_out, int core_mask)
+

C调用示例:

+
 1#include <stdio.h>
+ 2
+ 3int main(int argc, char* argv[]) {
+ 4    int B = 2, L = 128, H = 8, D = 64;
+ 5    float *Q = (float *)0xA0000000;      // DDR
+ 6    float *K = (float *)0xA1000000;      // DDR
+ 7    float *V = (float *)0xA2000000;      // DDR
+ 8    float *O = (float *)0xA3000000;      // DDR
+ 9    float *QK = (float *)0xA4000000;     // DDR
+10    float *SM = (float *)0xA5000000;     // DDR
+11    int core_mask = 0xff;
+12    fp_attention_s(Q, K, V, O, B, L, H, D, QK, SM, core_mask);
+13    return 0;
+14}
+
+
+
+ +

私有存储版本:

+
+
+void fp_attention_p(float *Q, float *K, float *V, float *output, int batch_size, int seq_len, int head_num, int head_dim, float *QK, float *softmax_out)
+

C调用示例:

+
 1#include <stdio.h>
+ 2
+ 3int main(int argc, char* argv[]) {
+ 4    int B = 1, L = 64, H = 4, D = 32;
+ 5    float *Q = (float *)0x10000000;   // L2
+ 6    float *K = (float *)0x10040000;   // L2
+ 7    float *V = (float *)0x10080000;   // L2
+ 8    float *O = (float *)0x100C0000;   // L2
+ 9    float *QK = (float *)0x10100000;  // L2
+10    float *SM = (float *)0x10200000;  // L2
+11    fp_attention_p(Q, K, V, O, B, L, H, D, QK, SM);
+12    return 0;
+13}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/avgpoolinggrad.html b/master/html/functionlib/dsplib/avgpoolinggrad.html new file mode 100644 index 0000000..77ed85f --- /dev/null +++ b/master/html/functionlib/dsplib/avgpoolinggrad.html @@ -0,0 +1,293 @@ + + + + + + + + + AvgPoolingGrad — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

AvgPoolingGrad

+

根据输入梯度对平均池化前的特征图计算反向传播梯度。

+
+
+\[output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w}\]
+

其中 \((y_h, y_w)\)\((x_h, x_w)\) 之间满足窗口与步长的映射关系。

+
+
输入:
    +
  • input - 反向传播输入梯度张量首地址。

  • +
  • output - 反向传播输出梯度张量首地址。

  • +
  • batch - 批大小。

  • +
  • output_h - 池化输出高度。

  • +
  • output_w - 池化输出宽度。

  • +
  • channel - 通道数。

  • +
  • input_w - 池化输入宽度。

  • +
  • input_h - 池化输入高度。

  • +
  • stride_w - 水平步长。

  • +
  • stride_h - 垂直步长。

  • +
  • pad_l - 左侧填充大小。

  • +
  • pad_u - 上侧填充大小。

  • +
  • window_w - 池化窗口宽度。

  • +
  • window_h - 池化窗口高度。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 原地累加平均池化反向传播梯度。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32 数据类型。

  • +
  • MT7004 支持 fp16、fp32 数据类型。

  • +
+
+
+

共享存储版本:

+
+
+void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
+
+ +
+
+void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask)
+

C调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(void) {
+ 5    const float *input = (const float *)0xA0000000;  // DDR 存储
+ 6    float *output = (float *)0xB0000000;
+ 7    int batch = 16;
+ 8    int output_h = 7;
+ 9    int output_w = 7;
+10    int channel = 64;
+11    int input_w = 14;
+12    int input_h = 14;
+13    int stride_w = 2;
+14    int stride_h = 2;
+15    int pad_l = 0;
+16    int pad_u = 0;
+17    int window_w = 2;
+18    int window_h = 2;
+19    int core_mask = 0xff;
+20    fp_avgpoolinggrad_s(input, output, batch, output_h, output_w,
+21                         channel, input_w, input_h,
+22                         stride_w, stride_h,
+23                         pad_l, pad_u,
+24                         window_w, window_h,
+25                         core_mask);
+26    return 0;
+27}
+
+
+
+ +

私有存储版本:

+
+
+void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
+
+ +
+
+void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx)
+

C调用示例:

+
 1// MT7004 单核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(void) {
+ 5    const half *input = (const half *)0x10000000;    // L2 存储
+ 6    half *output = (half *)0x10004000;
+ 7    int batch = 4;
+ 8    int output_h = 4;
+ 9    int output_w = 4;
+10    int channel = 128;
+11    int input_w = 8;
+12    int input_h = 8;
+13    int stride_w = 2;
+14    int stride_h = 2;
+15    int pad_l = 0;
+16    int pad_u = 0;
+17    int window_w = 2;
+18    int window_h = 2;
+19    int start_idx = 0;
+20    int end_idx = batch * output_h * output_w * channel;
+21    hp_avgpoolinggrad_p(input, output, batch, output_h, output_w,
+22                        channel, input_w, input_h,
+23                        stride_w, stride_h,
+24                        pad_l, pad_u,
+25                        window_w, window_h,
+26                        start_idx, end_idx);
+27    return 0;
+28}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/batchtospace.html b/master/html/functionlib/dsplib/batchtospace.html new file mode 100644 index 0000000..1734c10 --- /dev/null +++ b/master/html/functionlib/dsplib/batchtospace.html @@ -0,0 +1,318 @@ + + + + + + + + + BatchToSpace — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BatchToSpace

+

将输入张量在批维度上分块并重新分布到空间维度,同时按照 crops 对输出空间范围进行裁剪。

+
+
+\[\begin{split}\begin{aligned} +N_{\text{out}} &= \frac{N}{b_h \times b_w}, \\ +H_{\text{out}} &= b_h \times H - c_{\text{top}} - c_{\text{bottom}}, \\ +W_{\text{out}} &= b_w \times W - c_{\text{left}} - c_{\text{right}}, \\ + ext{output}[n, h, w, c] &= \text{input}[n', h', w', c] +\end{aligned}\end{split}\]
+

其中 \(N, H, W, C\) 分别表示输入的 batch、高度、宽度和通道数;\(b_h, b_w\)block_size\(c_{*}\) 来源于 crops\(n', h', w'\)BatchToSpace 映射关系确定。

+
+
输入:
    +
  • input - 输入数据地址。

  • +
  • input_shape - 输入形状,格式为 [batch, height, width, channel]

  • +
  • block_size - 分块因子,格式为 [block_h, block_w]

  • +
  • crops - 裁剪参数,格式为 [top, bottom, left, right]

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 输出数据地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32、fp64、cplx64、cplx128、int16、int8、int32 数据类型。

  • +
  • MT7004 支持 fp32、fp16、cplx64、int16、int32 数据类型。

  • +
+
+
+

共享存储版本:

+
+
+void i8_batchtospace_s(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void i16_batchtospace_s(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void i32_batchtospace_s(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void hp_batchtospace_s(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void fp_batchtospace_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void dp_batchtospace_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void c64_batchtospace_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void c128_batchtospace_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+

C 调用示例:

+
 1// 多核(共享存储)示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5        float *input = (float *)0xA0000000;   // 输入在 DDR 空间
+ 6        float *output = (float *)0xB0000000;
+ 7        int input_shape[4] = {400, 2, 2, 3};
+ 8        int block_size[2] = {2, 2};
+ 9        int crops[4] = {0, 0, 0, 0};
+10        int core_mask = 0xff;
+11        fp_batchtospace_s(input, output, input_shape, block_size, crops, sizeof(float), core_mask);
+12        return 0;
+13}
+
+
+
+ +

私有存储版本:

+
+
+void i8_batchtospace_p(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void i16_batchtospace_p(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void i32_batchtospace_p(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void hp_batchtospace_p(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void fp_batchtospace_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void dp_batchtospace_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void c64_batchtospace_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void c128_batchtospace_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+

C 调用示例:

+
 1// 单核(私有存储)示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5        float *input = (float *)0x10000000;   // 输入在 L2 空间
+ 6        float *output = (float *)0x10010000;
+ 7        int input_shape[4] = {400, 2, 2, 3};
+ 8        int block_size[2] = {2, 2};
+ 9        int crops[4] = {0, 0, 0, 0};
+10        fp_batchtospace_p(input, output, input_shape, block_size, crops, sizeof(float));
+11        return 0;
+12}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/batchtospacend.html b/master/html/functionlib/dsplib/batchtospacend.html new file mode 100644 index 0000000..3998a3d --- /dev/null +++ b/master/html/functionlib/dsplib/batchtospacend.html @@ -0,0 +1,314 @@ + + + + + + + + + BatchToSpaceND — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BatchToSpaceND

+

将输入张量的 batch 维度按 block 因子分解并重排到空间维度,随后根据 crops 参数对输出空间范围进行裁剪。

+
+
    +
  • 输入形状: [batch, height, width, channel]

  • +
  • block_size[block_h, block_w]

  • +
  • crops[top, bottom, left, right]

  • +
+
+
输入:
    +
  • input - 输入数据地址。

  • +
  • input_shape - 输入形状,格式为 [batch, height, width, channel]

  • +
  • block_size - 分块因子,格式为 [block_h, block_w]

  • +
  • crops - 裁剪参数,格式为 [top, bottom, left, right]

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 输出数据地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。

  • +
  • MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。

  • +
+
+
+

共享存储版本:

+
+
+void i8_batchtospacend_s(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void i16_batchtospacend_s(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void i32_batchtospacend_s(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void hp_batchtospacend_s(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void fp_batchtospacend_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void dp_batchtospacend_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void c64_batchtospacend_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+
+ +
+
+void c128_batchtospacend_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask)
+

C 调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0xA0000000;   // 多核版本:输入放在 DDR 地址 0xA0000000
+ 6    float *output = (float *)0xB0000000;  // 多核版本:输出放在 DDR 地址 0xB0000000
+ 7    int input_shape[4] = {400, 2, 2, 3};
+ 8    int block_size[2] = {2, 2};
+ 9    int crops[4] = {0, 0, 0, 0};
+10    int core_mask = 0xff;
+11    fp_batchtospacend_s(input, output, input_shape, block_size, crops, sizeof(float), core_mask);
+12    return 0;
+13}
+
+
+
+ +

私有存储版本:

+
+
+void i8_batchtospacend_p(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void i16_batchtospacend_p(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void i32_batchtospacend_p(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void hp_batchtospacend_p(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void fp_batchtospacend_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void dp_batchtospacend_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void c64_batchtospacend_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+
+ +
+
+void c128_batchtospacend_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size)
+

C 调用示例:

+
 1// FT78NE 单核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0x10000000;   // 单核版本:输入放在 L2 地址 0x10000000
+ 6    float *output = (float *)0x10010000;  // 单核版本:输出放在 L2 地址 0x10010000
+ 7    int input_shape[4] = {400, 2, 2, 3};
+ 8    int block_size[2] = {2, 2};
+ 9    int crops[4] = {0, 0, 0, 0};
+10    fp_batchtospacend_p(input, output, input_shape, block_size, crops, sizeof(float));
+11    return 0;
+12}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/broadcastto.html b/master/html/functionlib/dsplib/broadcastto.html new file mode 100644 index 0000000..dd0650d --- /dev/null +++ b/master/html/functionlib/dsplib/broadcastto.html @@ -0,0 +1,309 @@ + + + + + + + + + BroadcastTo — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BroadcastTo

+

将较小张量按 N-D 规则广播到目标形状并写入输出。

+
+
+
输入:
    +
  • input - 输入数据地址。

  • +
  • input_shape - 输入形状数组。

  • +
  • input_shape_size - 输入形状长度。

  • +
  • output_shape - 目标输出形状数组。

  • +
  • output_shape_size - 输出形状长度。

  • +
  • data_size - 单个元素字节数(例如 sizeof(float))。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 输出数据地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。

  • +
  • MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。

  • +
+
+
+

共享存储版本:

+
+
+void i8_broadcastto_s(int8_t *input, int8_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void i16_broadcastto_s(int16_t *input, int16_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void i32_broadcastto_s(int32_t *input, int32_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void hp_broadcastto_s(half *input, half *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void fp_broadcastto_s(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void dp_broadcastto_s(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void c64_broadcastto_s(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+
+ +
+
+void c128_broadcastto_s(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask)
+

C 调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0xA0000000;    // 输入在 DDR 地址 0xA0000000
+ 6    float *output = (float *)0xB0000000;   // 输出在 DDR 地址 0xB0000000
+ 7    int input_shape[4] = {1, 50, 1, 1};
+ 8    int output_shape[4] = {10, 50, 20, 1};
+ 9    int core_mask = 0xff;
+10    fp_broadcastto_s(input, output, input_shape, 4, output_shape, 4, sizeof(float), core_mask);
+11    return 0;
+12}
+
+
+
+ +

私有存储版本:

+
+
+void i8_broadcastto_p(int8_t *input, int8_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void i16_broadcastto_p(int16_t *input, int16_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void i32_broadcastto_p(int32_t *input, int32_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void hp_broadcastto_p(half *input, half *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void fp_broadcastto_p(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void dp_broadcastto_p(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void c64_broadcastto_p(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+
+ +
+
+void c128_broadcastto_p(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size)
+

C 调用示例:

+
 1// FT78NE 单核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0x10000000;   // 单核版本:输入放在 L2 地址 0x10000000
+ 6    float *output = (float *)0x10020000;  // 单核版本:输出放在 L2 地址 0x10020000
+ 7    int input_shape[4] = {1, 50, 1, 1};
+ 8    int output_shape[4] = {10, 50, 20, 1};
+ 9    fp_broadcastto_p(input, output, input_shape, 4, output_shape, 4, sizeof(float));
+10    return 0;
+11}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/conv2d.html b/master/html/functionlib/dsplib/conv2d.html new file mode 100644 index 0000000..0813ec4 --- /dev/null +++ b/master/html/functionlib/dsplib/conv2d.html @@ -0,0 +1,372 @@ + + + + + + + + + Conv2d — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Conv2d

+

对输入 Tensor 计算二维卷积,输入的 shape 为 \((N, H_{in}, W_{in}, C_{in})\),其中 \(N\) 为 batch size,\(C\) 为通道数,\(H\) 为特征图的高度,\(W\) 为特征图的宽度。

+

根据以下公式计算输出:

+
+\[out(N_i, C_{out_j}) = bias(C_{out_j}) + \sum_{k=0}^{C_{in}-1} \text{ccor}(\text{weight}(C_{out_j}, k), X(N_i, k))\]
+

其中,\(bias\) 为输出偏置,\(\text{ccor}\) 为 cross-correlation 操作,\(weight\) 为卷积核的值,\(X\) 为输入的特征图。

+
    +
  • \(i\) 对应 batch 数,其范围为 \([0, N-1]\),其中 \(N\) 为输入 batch。

  • +
  • \(j\) 对应输出通道,其范围为 \([0, C_{out}-1]\),其中 \(C_{out}\) 为输出通道数,该值也等于卷积核的个数。

  • +
  • \(k\) 对应输入通道数,其范围为 \([0, C_{in}-1]\),其中 \(C_{in}\) 为输入通道数,该值也等于卷积核的通道数。

  • +
+

因此,上面的公式中,\(bias(C_{out_j})\) 为第 \(j\) 个输出通道的偏置,\(weight(C_{out_j}, k)\) 表示第 \(j\) 个卷积核在第 \(k\) 个输入通道的卷积核切片,\(X(N_i, k)\) 为特征图第 \(i\) 个 batch 第 \(k\) 个输入通道的切片。卷积核 shape 为 \((\text{kernel_size}[0], \text{kernel_size}[1])\),其中 kernel_size[0] 和 kernel_size[1] 是卷积核的高度和宽度。若考虑到输入输出通道以及 group,则完整卷积核的 shape 为 \((C_{out}, \text{kernel_size}[0], \text{kernel_size}[1], C_{in}/\text{group})\),其中 group 是分组卷积时在通道上分割输入 \(x\) 的组数。

+
+
输入:
    +
  • input_x - 输入数据的地址

  • +
  • input_w - 输入卷积核权重的地址

  • +
  • bias - 输入偏置的地址

  • +
  • conv_param - 算子计算所需参数的结构体。其各成员见下述。

  • +
  • quant_param - 对int8类型进行量化计算所需参数的结构体。其各成员见下述。

  • +
  • core_mask - 核掩码。

  • +
+
+
+

ConvParameter及ConvQuantParameter定义:

+
 1typedef struct ConvParameter {
+ 2    void* workspace_; // 用于存放中间计算结果
+ 3    int output_batch_; // 输出数据总批次
+ 4    int input_batch_; // 输入数据总批次
+ 5    int input_h_; // 输入数据h维度大小
+ 6    int input_w_; // 输入数据w维度大小
+ 7    int output_h_; // 输出数据h维度大小
+ 8    int output_w_; // 输出数据w维度大小
+ 9    int input_channel_; // 输入数据通道数
+10    int output_channel_; // 输出数据通道数
+11    int kernel_h_; // 卷积核h维度大小
+12    int kernel_w_; // 卷积核w维度大小
+13    int group_; // 组数
+14    int pad_l_; // 左填充大小
+15    int pad_u_; // 上填充大小
+16    int dilation_h_; // 卷积核h维度膨胀尺寸大小
+17    int dilation_w_; // 卷积核w维度膨胀尺寸大小
+18    int stride_h_; // 卷积核h维度步长
+19    int stride_w_; // 卷积核w维度步长
+20    int buffer_size_; // 为分块计算所分配的缓存大小
+21} ConvParameter;
+22
+23typedef struct ConvQuantParameter {
+24    int32_t* left_shift_;
+25    int32_t* right_shift_;
+26    int32_t* multiplier_;
+27    int32_t* filter_zp_ptr_;
+28    int32_t output_zp_;
+29    int32_t mini_;
+30    int32_t maxi_;
+31    int per_channel_;
+32} ConvQuantParameter;
+
+
+
+
输出:
    +
  • out_y - 输出地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享存储版本:

+
+
+void i8_conv2d_s(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask)
+
+ +
+
+void hp_conv2d_s(half *input_x, half *input_w, half *out_y, half *bias, ConvParameter *conv_param, int core_mask)
+
+ +
+
+void fp_conv2d_s(float *input_x, float *input_w, float *out_y, float *bias, ConvParameter *conv_param, int core_mask)
+
+ +

C调用示例:

+
 1void TestConvSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    int core_id = get_core_id();
+ 3    int logic_core_id = GetLogicCoreId(core_mask, core_id);
+ 4    int core_num = GetCoreNum(core_mask);
+ 5    float* input_data = (float*)0x88000000;
+ 6    float* weight = (float*)0x89000000;
+ 7    float* output_data = (float*)0x90000000;
+ 8    float* bias_data = (float*)0x91000000;
+ 9    ConvParameter* param = (ConvParameter*)0x92000000;
+10    if (logic_core_id == 0) {
+11        memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+12        param->dilation_h_ = dilation[0];
+13        param->dilation_w_ = dilation[1];
+14        param->group_ = groups;
+15        param->input_batch_ = input_shape[0];
+16        param->input_h_ = input_shape[1];
+17        param->input_w_ = input_shape[2];
+18        param->input_channel_ = input_shape[3];
+19        param->kernel_h_ = weight_shape[1];
+20        param->kernel_w_ = weight_shape[2];
+21        param->output_batch_ = output_shape[0];
+22        param->output_h_ = output_shape[1];
+23        param->output_w_ = output_shape[2];
+24        param->output_channel_ = output_shape[3];
+25        param->stride_h_ = stride[0];
+26        param->stride_w_ = stride[0];
+27        param->pad_u_ = padding[0];
+28        param->pad_l_ = padding[2];
+29        param->workspace_ = (float*)0x10000000; // workspace空间需分配在AM内,计算过程中会将数据搬运到workspace空间内进行计算
+30    }
+31    sys_bar(0, core_num); // 初始化参数完成后进行同步
+32    fp_conv2d_s(input_data, weight, output_data, bias_data, param, core_mask);
+33}
+34
+35void main(){
+36    int in_channel = 4;
+37    int out_channel = 4;
+38    int groups = 4;
+39    int input_shape[4] = {1, 30, 30, in_channel}; // NHWC
+40    int weight_shape[4] = {out_channel, 3, 3, in_channel / groups};
+41    int output_shape[4] = {1, 10, 10, out_channel}; // NHWC
+42    int stride[2] = {2, 2};
+43    int padding[4] = {1, 1, 1, 1};
+44    int dilation[2]= {2, 2};
+45    float bias[4] = {0, 0, 0, 0};
+46    int core_mask = 0b1111;
+47    TestConvSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+48}
+
+
+

私有存储版本:

+
+
+void i8_conv2d_p(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask)
+
+ +
+
+void hp_conv2d_p(half *input_x, half *input_w, half *out_y, half *bias, ConvParameter *conv_param, int core_mask)
+
+ +
+
+void fp_conv2d_p(float *input_x, float *input_w, float *out_y, float *bias, ConvParameter *conv_param, int core_mask)
+
+ +

C调用示例:

+
 1void TestConvL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    float* input_data = (float*)0x10010000; // 私有存储版本地址设置在AM内
+ 3    float* weight = (float*)0x10020000;
+ 4    float* output_data = (float*)0x10030000;
+ 5    float* bias_data = (float*)0x10040000;
+ 6    ConvParameter* param = (ConvParameter*)0x10060000;
+ 7    memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+ 8    param->dilation_h_ = dilation[0];
+ 9    param->dilation_w_ = dilation[1];
+10    param->group_ = groups;
+11    param->input_batch_ = input_shape[0];
+12    param->input_h_ = input_shape[1];
+13    param->input_w_ = input_shape[2];
+14    param->input_channel_ = input_shape[3];
+15    param->kernel_h_ = weight_shape[1];
+16    param->kernel_w_ = weight_shape[2];
+17    param->output_batch_ = output_shape[0];
+18    param->output_h_ = output_shape[1];
+19    param->output_w_ = output_shape[2];
+20    param->output_channel_ = output_shape[3];
+21    param->stride_h_ = stride[0];
+22    param->stride_w_ = stride[0];
+23    param->pad_u_ = padding[0];
+24    param->pad_l_ = padding[2];
+25    param->workspace_ = (float*)0x10070000;
+26    param->buffer_size_ = 2048; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小
+27    fp_conv2d_p(input_data, weight, output_data, bias_data, param, core_mask);
+28}
+29
+30void main(){
+31    int in_channel = 4;
+32    int out_channel = 4;
+33    int groups = 4;
+34    int input_shape[4] = {1, 30, 30, in_channel}; // NHWC
+35    int weight_shape[4] = {out_channel, 3, 3, in_channel / groups};
+36    int output_shape[4] = {1, 10, 10, out_channel}; // NHWC
+37    int stride[2] = {2, 2};
+38    int padding[4] = {1, 1, 1, 1};
+39    int dilation[2]= {2, 2};
+40    float bias[4] = {0, 0, 0, 0};
+41    int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动
+42    TestConvL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+43}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/conv2d_transpose.html b/master/html/functionlib/dsplib/conv2d_transpose.html new file mode 100644 index 0000000..b1b4313 --- /dev/null +++ b/master/html/functionlib/dsplib/conv2d_transpose.html @@ -0,0 +1,364 @@ + + + + + + + + + Conv2dTranspose — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Conv2dTranspose

+

计算二维转置卷积,可以视为 Conv2d 对输入求梯度,也称为反卷积(实际不是真正的反卷积)。

+

输入的 shape 通常为 \((N, H_{in}, W_{in}, C_{in})\),其中:

+
+
    +
  • \(N\) 是 batch size

  • +
  • \(C_{in}\) 是空间维度

  • +
  • \(H_{in}, W_{in}\) 分别为特征层的高度和宽度

  • +
+
+
+
输入:
    +
  • input_x - 输入数据的地址

  • +
  • input_w - 输入卷积核权重的地址

  • +
  • bias - 输入偏置的地址

  • +
  • param - 算子计算所需参数的结构体。其各成员见下述。

  • +
  • core_mask - 核掩码。

  • +
+
+
+

ConvTransposeParameter定义:

+
 1typedef struct ConvTransposeParameter {
+ 2    void* workspace_; // 用于存放中间计算结果
+ 3    int output_batch_; // 输出数据总批次
+ 4    int input_batch_; // 输入数据总批次
+ 5    int input_h_; // 输入数据h维度大小
+ 6    int input_w_; // 输入数据w维度大小
+ 7    int output_h_; // 输出数据h维度大小
+ 8    int output_w_; // 输出数据w维度大小
+ 9    int input_channel_; // 输入数据通道数
+10    int output_channel_; // 输出数据通道数
+11    int kernel_h_; // 卷积核h维度大小
+12    int kernel_w_; // 卷积核w维度大小
+13    int group_; // 组数
+14    int pad_l_; // 左填充大小
+15    int pad_u_; // 上填充大小
+16    int dilation_h_; // 卷积核h维度膨胀尺寸大小
+17    int dilation_w_; // 卷积核w维度膨胀尺寸大小
+18    int stride_h_; // 卷积核h维度步长
+19    int stride_w_; // 卷积核w维度步长
+20    int buffer_size_; // 为分块计算所分配的缓存大小
+21} ConvTransposeParameter;
+
+
+
+
输出:
    +
  • out_y - 输出地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享存储版本:

+
+
+void i8_convtranspose_s(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +
+
+void hp_convtranspose_s(half *input_x, half *input_w, half *out_y, half *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +
+
+void fp_convtranspose_s(float *input_x, float *input_w, float *out_y, float *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +

C调用示例:

+
 1void TestConvTransposeSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    int core_id = get_core_id();
+ 3    int logic_core_id = GetLogicCoreId(core_mask, core_id);
+ 4    int core_num = GetCoreNum(core_mask);
+ 5    float* input_data = (float*)0x88000000;
+ 6    float* weight = (float*)0x89000000;
+ 7    float* output_data = (float*)0x90000000;
+ 8    float* bias_data = (float*)0x91000000;
+ 9    float* check = (float*)0x94000000;
+10    ConvTransposeParameter* param = (ConvTransposeParameter*)0x92000000;
+11    if (logic_core_id == 0) {
+12        memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+13        memset(output_data, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float));
+14        memset(check, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float));
+15        param->dilation_h_ = dilation[0];
+16        param->dilation_w_ = dilation[1];
+17        param->group_ = groups;
+18        param->input_batch_ = input_shape[0];
+19        param->input_h_ = input_shape[1];
+20        param->input_w_ = input_shape[2];
+21        param->input_channel_ = input_shape[3];
+22        param->kernel_h_ = weight_shape[1];
+23        param->kernel_w_ = weight_shape[2];
+24        param->output_batch_ = output_shape[0];
+25        param->output_h_ = output_shape[1];
+26        param->output_w_ = output_shape[2];
+27        param->output_channel_ = output_shape[3];
+28        param->stride_h_ = stride[0];
+29        param->stride_w_ = stride[0];
+30        param->pad_u_ = padding[0];
+31        param->pad_l_ = padding[2];
+32        param->workspace_ = (float*)0xA0000000;
+33    }
+34    sys_bar(0, core_num); // 初始化参数完成后进行同步
+35    fp_convtranspose_s(input_data, weight, output_data, bias_data, param, core_mask);
+36}
+37
+38void main(){
+39    int in_channel = 6;
+40    int out_channel = 6;
+41    int groups = 6;
+42    int input_shape[4] = {2, 5, 7, in_channel}; // NHWC
+43    int weight_shape[4] = {in_channel, 3, 3, out_channel / groups};
+44    int output_shape[4] = {2, 7, 9, out_channel}; // NHWC
+45    int stride[2] = {1, 1};
+46    int padding[4] = {0, 0, 0, 0};
+47    int dilation[2]= {1, 1};
+48    float bias[] = {0, 0, 0, 0, 0, 0};
+49    int core_mask = 0b1111;
+50    TestConvTransposeSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+51}
+
+
+

私有存储版本:

+
+
+void i8_convtranspose_p(int8_t *input_x, int8_t *input_w, int8_t *out_y, int *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +
+
+void hp_convtranspose_p(half *input_x, half *input_w, half *out_y, half *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +
+
+void fp_convtranspose_p(float *input_x, float *input_w, float *out_y, float *bias, ConvTransposeParameter *conv_param, int core_mask)
+
+ +

C调用示例:

+
 1void TestConvTransposeL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) {
+ 2    float* input_data = (float*)0x10000000; // 私有存储版本地址设置在AM内
+ 3    float* weight = (float*)0x10001000;
+ 4    float* output_data = (float*)0x10002000;
+ 5    float* bias_data = (float*)0x10003000;
+ 6    float* check = (float*)0x10004000;
+ 7    ConvTransposeParameter* param = (ConvTransposeParameter*)0x10005000;
+ 8    memcpy(bias_data, bias, sizeof(float) * output_shape[3]);
+ 9    memset(output_data, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float));
+10    memset(check, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float));
+11    param->dilation_h_ = dilation[0];
+12    param->dilation_w_ = dilation[1];
+13    param->group_ = groups;
+14    param->input_batch_ = input_shape[0];
+15    param->input_h_ = input_shape[1];
+16    param->input_w_ = input_shape[2];
+17    param->input_channel_ = input_shape[3];
+18    param->kernel_h_ = weight_shape[1];
+19    param->kernel_w_ = weight_shape[2];
+20    param->output_batch_ = output_shape[0];
+21    param->output_h_ = output_shape[1];
+22    param->output_w_ = output_shape[2];
+23    param->output_channel_ = output_shape[3];
+24    param->stride_h_ = stride[0];
+25    param->stride_w_ = stride[0];
+26    param->pad_u_ = padding[0];
+27    param->pad_l_ = padding[2];
+28    param->workspace_ = (float*)0x10006000;
+29    param->buffer_size_ = 1024; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小
+30    fp_convtranspose_p(input_data, weight, output_data, bias_data, param, core_mask);
+31}
+32
+33void main(){
+34    int in_channel = 6;
+35    int out_channel = 6;
+36    int groups = 6;
+37    int input_shape[4] = {2, 5, 7, in_channel}; // NHWC
+38    int weight_shape[4] = {in_channel, 3, 3, out_channel / groups};
+39    int output_shape[4] = {2, 7, 9, out_channel}; // NHWC
+40    int stride[2] = {1, 1};
+41    int padding[4] = {0, 0, 0, 0};
+42    int dilation[2]= {1, 1};
+43    float bias[] = {0, 0, 0, 0, 0, 0};
+44    int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动
+45    TestConvTransposeL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask);
+46}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/conv2dbackpropfilterfusion.html b/master/html/functionlib/dsplib/conv2dbackpropfilterfusion.html new file mode 100644 index 0000000..94ed8a0 --- /dev/null +++ b/master/html/functionlib/dsplib/conv2dbackpropfilterfusion.html @@ -0,0 +1,314 @@ + + + + + + + + + Conv2DBackpropFilterFusion — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Conv2DBackpropFilterFusion

+

计算二维卷积反向传播的权重梯度(Conv2D backprop filter fusion),支持常规卷积、Depthwise 卷积以及 1x1 优化路径,多核按批次与空间维度分块协同完成。

+
+
+\[dw = \text{Conv2DGradFilter}(x, dy)\]
+
+
输入:
    +
  • dy - 输出梯度张量首地址,形状 [batch, out_h, out_w, out_channel]

  • +
  • x - 正向输入张量首地址,形状 [batch, in_h, in_w, in_channel]

  • +
  • conv_param - 卷积参数结构体地址,包含 stridepaddilationgroup、输入输出维度及共享工作空间指针等信息。

  • +
+

ConvParameter 字段说明:

+
    +
  • workspace_ - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。

  • +
  • output_batch_ - 输出梯度 dy 的批次数(通常等于输入批次数)。

  • +
  • input_batch_ - 正向输入 x 的批次数,用于与 output_batch_ 校验。

  • +
  • input_h_ / input_w_ - 正向输入特征图的高度与宽度。

  • +
  • output_h_ / output_w_ - 输出梯度特征图的高度与宽度。

  • +
  • input_channel_ / output_channel_ - 输入与输出通道数,需与 group_ 配合满足整除关系。

  • +
  • kernel_h_ / kernel_w_ - 卷积核的高与宽。

  • +
  • group_ - 组卷积数量,group_ = 1 表示普通卷积。

  • +
  • pad_l_ / pad_r_ / pad_u_ / pad_d_ - 分别表示左右上下方向的填充大小。

  • +
  • dilation_h_ / dilation_w_ - 核心采样间隔(膨胀系数)。

  • +
  • stride_h_ / stride_w_ - 滑动窗口在高、宽方向的步长。

  • +
  • buffer_size_ - 分配给 workspace_ 的缓冲区字节数,在运行前需要正确设置。

  • +
  • nweights_ - 卷积权重 w 的元素总数,用于内部分块和校验。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • dw - 卷积核梯度张量首地址,形状 [out_channel, in_channel/group, kernel_h, kernel_w]

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32 数据类型。

  • +
  • MT7004 支持 fp16、fp32 数据类型。

  • +
  • 需在 conv_param->workspace_ 中预先分配共享工作空间,长度不少于 conv_param->buffer_size_

  • +
+
+
+

共享存储版本:

+
+
+void hp_conv2dbackpropfilterfusion_s(const half *dy, const half *x, half *dw, ConvParameter *conv_param, int core_mask)
+
+ +
+
+void fp_conv2dbackpropfilterfusion_s(const float *dy, const float *x, float *dw, ConvParameter *conv_param, int core_mask)
+

C调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3#include "conv_parameter.h"
+ 4
+ 5int main(void) {
+ 6    const float *dy = (const float *)0xA0000000;   // DDR 存储
+ 7    const float *x = (const float *)0xB0000000;
+ 8    float *dw = (float *)0xC0000000;
+ 9    ConvParameter *param = (ConvParameter *)0xB0001000;
+10    // 设置 ConvParameter 字段
+11    param->workspace_ = (void *)0xB0002000;
+12    param->buffer_size_ = 0x20000;
+13    param->input_batch_ = 1;
+14    param->input_h_ = 3;
+15    param->input_w_ = 3;
+16    param->input_channel_ = 4;
+17    param->output_batch_ = 1;
+18    param->output_h_ = 3;
+19    param->output_w_ = 3;
+20    param->output_channel_ = 4;
+21    param->kernel_h_ = 2;
+22    param->kernel_w_ = 2;
+23    param->group_ = 2;
+24    param->pad_u_ = 1;
+25    param->pad_d_ = 0;
+26    param->pad_l_ = 1;
+27    param->pad_r_ = 0;
+28    param->dilation_h_ = 1;
+29    param->dilation_w_ = 1;
+30    param->stride_h_ = 1;
+31    param->stride_w_ = 1;
+32    param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
+33    int core_mask = 0xff;
+34    fp_conv2dbackpropfilterfusion_s(dy, x, dw, param, core_mask);
+35    return 0;
+36}
+
+
+
+ +

私有存储版本:

+
+
+void hp_conv2dbackpropfilterfusion_p(const half *dy, const half *x, half *dw, ConvParameter *conv_param)
+
+ +
+
+void fp_conv2dbackpropfilterfusion_p(const float *dy, const float *x, float *dw, ConvParameter *conv_param)
+

C调用示例:

+
 1// MT7004 单核示例
+ 2#include <stdio.h>
+ 3#include "conv_parameter.h"
+ 4
+ 5int main(void) {
+ 6    const half *dy = (const half *)0x10000000;   // L2 存储
+ 7    const half *x = (const half *)0x10020000;
+ 8    half *dw = (half *)0x10040000;
+ 9    ConvParameter *param = (ConvParameter *)0x10060000;
+10    // 设置 ConvParameter 字段
+11    param->workspace_ = (void *)0x10070000;
+12    param->buffer_size_ = 0x10000;
+13    param->input_batch_ = 1;
+14    param->input_h_ = 3;
+15    param->input_w_ = 3;
+16    param->input_channel_ = 4;
+17    param->output_batch_ = 1;
+18    param->output_h_ = 3;
+19    param->output_w_ = 3;
+20    param->output_channel_ = 4;
+21    param->kernel_h_ = 2;
+22    param->kernel_w_ = 2;
+23    param->group_ = 2;
+24    param->pad_u_ = 1;
+25    param->pad_d_ = 0;
+26    param->pad_l_ = 1;
+27    param->pad_r_ = 0;
+28    param->dilation_h_ = 1;
+29    param->dilation_w_ = 1;
+30    param->stride_h_ = 1;
+31    param->stride_w_ = 1;
+32    param->nweights_ = 4 * 2 * 2 * 2;  // 示例值
+33    hp_conv2dbackpropfilterfusion_p(dy, x, dw, param);
+34    return 0;
+35}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/conv2dbackpropinputfusion.html b/master/html/functionlib/dsplib/conv2dbackpropinputfusion.html new file mode 100644 index 0000000..15757f4 --- /dev/null +++ b/master/html/functionlib/dsplib/conv2dbackpropinputfusion.html @@ -0,0 +1,314 @@ + + + + + + + + + Conv2DBackpropInputFusion — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Conv2DBackpropInputFusion

+

计算二维卷积反向传播的输入梯度(Conv2D backprop input fusion),支持普通卷积、Depthwise 卷积以及 1x1 优化路径,多个核心通过核掩码协同完成批次并行。

+
+
+\[dx = \text{Conv2D}^\top(dy, w)\]
+
+
输入:
    +
  • dy - 输出梯度张量首地址,形状 [batch, out_h, out_w, out_channel]

  • +
  • w - 卷积权重张量首地址,形状 [out_channel, kernel_h, kernel_w, in_channel/group]

  • +
  • conv_param - 卷积参数结构体地址,包含 stridepaddilationgroup、输入输出维度、批次数及共享工作空间指针等信息。

  • +
+

ConvParameter 字段说明:

+
    +
  • workspace_ - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。

  • +
  • output_batch_ - 输出梯度 dy 的批次数(通常等于输入批次数)。

  • +
  • input_batch_ - 正向输入 x 的批次数,用于与 output_batch_ 校验。

  • +
  • input_h_ / input_w_ - 正向输入特征图的高度与宽度。

  • +
  • output_h_ / output_w_ - 输出梯度特征图的高度与宽度。

  • +
  • input_channel_ / output_channel_ - 输入与输出通道数,需与 group_ 配合满足整除关系。

  • +
  • kernel_h_ / kernel_w_ - 卷积核的高与宽。

  • +
  • group_ - 组卷积数量,group_ = 1 表示普通卷积。

  • +
  • pad_l_ / pad_r_ / pad_u_ / pad_d_ - 分别表示左右上下方向的填充大小。

  • +
  • dilation_h_ / dilation_w_ - 核心采样间隔(膨胀系数)。

  • +
  • stride_h_ / stride_w_ - 滑动窗口在高、宽方向的步长。

  • +
  • buffer_size_ - 分配给 workspace_ 的缓冲区字节数,在运行前需要正确设置。

  • +
  • nweights_ - 卷积权重 w 的元素总数,用于内部分块和校验。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • dx - 输入梯度张量首地址,形状 [batch, in_h, in_w, in_channel]

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持 fp32 数据类型。

  • +
  • MT7004 支持 fp16、fp32 数据类型。

  • +
  • 需在 conv_param->workspace_ 中预先分配共享工作空间,并设置 conv_param->buffer_size_

  • +
+
+
+

共享存储版本:

+
+
+void hp_conv2dbackpropinputfusion_s(const half *dy, const half *w, half *dx, ConvParameter *conv_param, int core_mask)
+
+ +
+
+void fp_conv2dbackpropinputfusion_s(const float *dy, const float *w, float *dx, ConvParameter *conv_param, int core_mask)
+

C调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3#include "conv_parameter.h"
+ 4
+ 5int main(void) {
+ 6    const float *dy = (const float *)0xA0000000;   // DDR 存储
+ 7    const float *w = (const float *)0xB0000000;
+ 8    float *dx = (const float *)0xC0000000;
+ 9    ConvParameter *param = (ConvParameter *)0xB0001000;  // 卷积参数共享区域
+10    // 设置 ConvParameter 字段
+11    param->workspace_ = (void *)0xB0002000;               // 共享工作空间
+12    param->buffer_size_ = 0x20000;
+13    param->input_batch_ = 1;
+14    param->input_h_ = 5;
+15    param->input_w_ = 5;
+16    param->input_channel_ = 4;
+17    param->output_batch_ = 1;
+18    param->output_h_ = 3;
+19    param->output_w_ = 3;
+20    param->output_channel_ = 8;
+21    param->kernel_h_ = 3;
+22    param->kernel_w_ = 3;
+23    param->group_ = 1;
+24    param->pad_u_ = 1;
+25    param->pad_d_ = 1;
+26    param->pad_l_ = 1;
+27    param->pad_r_ = 1;
+28    param->dilation_h_ = 1;
+29    param->dilation_w_ = 1;
+30    param->stride_h_ = 2;
+31    param->stride_w_ = 2;
+32    param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
+33    int core_mask = 0xff;
+34    fp_conv2dbackpropinputfusion_s(dy, w, dx, param, core_mask);
+35    return 0;
+36}
+
+
+
+ +

私有存储版本:

+
+
+void hp_conv2dbackpropinputfusion_p(const half *dy, const half *w, half *dx, ConvParameter *conv_param)
+
+ +
+
+void fp_conv2dbackpropinputfusion_p(const float *dy, const float *w, float *dx, ConvParameter *conv_param)
+

C调用示例:

+
 1// MT7004 单核示例
+ 2#include <stdio.h>
+ 3#include "conv_parameter.h"
+ 4
+ 5int main(void) {
+ 6    const half *dy = (const half *)0x10000000;   // L2 存储
+ 7    const half *w = (const half *)0x10020000;
+ 8    half *dx = (half *)0x10040000;
+ 9    ConvParameter *param = (ConvParameter *)0x10060000;
+10    // 设置 ConvParameter 字段
+11    param->workspace_ = (void *)0x10070000;
+12    param->buffer_size_ = 0x10000;
+13    param->input_batch_ = 1;
+14    param->input_h_ = 5;
+15    param->input_w_ = 5;
+16    param->input_channel_ = 4;
+17    param->output_batch_ = 1;
+18    param->output_h_ = 3;
+19    param->output_w_ = 3;
+20    param->output_channel_ = 8;
+21    param->kernel_h_ = 3;
+22    param->kernel_w_ = 3;
+23    param->group_ = 1;
+24    param->pad_u_ = 1;
+25    param->pad_d_ = 1;
+26    param->pad_l_ = 1;
+27    param->pad_r_ = 1;
+28    param->dilation_h_ = 1;
+29    param->dilation_w_ = 1;
+30    param->stride_h_ = 2;
+31    param->stride_w_ = 2;
+32    param->nweights_ = 8 * 3 * 3 * 4;  // 示例值
+33    hp_conv2dbackpropinputfusion_p(dy, w, dx, param);
+34    return 0;
+35}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/crop.html b/master/html/functionlib/dsplib/crop.html new file mode 100644 index 0000000..4190997 --- /dev/null +++ b/master/html/functionlib/dsplib/crop.html @@ -0,0 +1,233 @@ + + + + + + + + + Crop — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Crop

+

类似于slice(张量切片)。不过只支持四维。

+
+
输入:
    +
  • input - 输入数据地址。

  • +
  • in_shape - 输入张量形状。

  • +
  • out_shape - 输出张量形状。

  • +
  • type_size - 输入和输出张量数据类型的长度。

  • +
  • offset - 每一维度裁剪开始的偏移量

  • +
  • axis - 裁剪开始的维度

  • +
  • core_mask - 核掩码。

  • +
+
+
输出:
    +
  • output - 输出地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享/私有存储版本:

+
+
+void anytype_crop_anycore(void *input, void *output, int *in_shape, int *out_shape, int type_size, int *offset, int axis, int core_mask)
+
+ +

各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型,改变type_size参数即可。

+

C调用示例:

+
 1void TestCropSMCFp32(int* in_shape, int* out_shape, int axis, int* offset_, int core_mask) {
+ 2    int core_id = get_core_id();
+ 3    int logic_core_id = GetLogicCoreId(core_mask, core_id);
+ 4    int core_num = GetCoreNum(core_mask);
+ 5    float* input = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可
+ 6    float* output = (float*)0x98000000;
+ 7    int* input_shape = (int*)0xA8000000;
+ 8    int* output_shape = (int*)0xA8200000;
+ 9    int type_size = sizeof(float);
+10    int* offset = (int*)0xA8410000;
+11    if (logic_core_id == 0) {
+12        memcpy(offset, offset_, sizeof(int) * (4 - axis));
+13        memcpy(input_shape, in_shape, sizeof(int) * 4);
+14        memcpy(output_shape, out_shape, sizeof(int) * 4);
+15    }
+16    sys_bar(0, core_num); // 初始化参数完成后进行同步
+17    anytype_crop_anycore(input, output, in_shape, out_shape, type_size, offset, axis, core_mask);
+18}
+19
+20void main(){
+21    int in_shape[4] = {2, 3, 3, 5};
+22    int out_shape[4] = {2, 2, 2, 5};
+23    int axis = 1;
+24    int offset[3] = {1, 1, 0};
+25    int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可
+26    TestCropSMCFp32(in_shape, out_shape, axis, offset, core_mask);
+27}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/crop_and_resize.html b/master/html/functionlib/dsplib/crop_and_resize.html new file mode 100644 index 0000000..ea9bc2c --- /dev/null +++ b/master/html/functionlib/dsplib/crop_and_resize.html @@ -0,0 +1,270 @@ + + + + + + + + + CropAndResize — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

CropAndResize

+

从输入图像Tensor中提取切片并调整其大小。仅支持双线性插值方法。

+
+
输入:
    +
  • src - 输入数据的地址。

  • +
  • box_idx - boxes的索引,box_idx[i]的值表示第i个框的图像的值。

  • +
  • boxes - 第i行表示box_index[i]图像区域的坐标,并且坐标[y1,x1,y2,x2]是归一化后的值。归一化后的坐标值y,映射到图像y*(image_height-1)处,因此归一化后的图像高度范围为[0,1],映射到实际图像高度范围为[0,image_height-1]。我们允许y1>y2,在这种情况下,视为原始图像的上下翻转变换。宽度尺寸的处理类似。坐标取值允许在[0,1]范围之外,在这种情况下,我们使用extrapolation_value外插值进行补齐。

  • +
  • param - 算子计算所需参数的结构体。其各成员见下述。

  • +
  • extrapolation_value - 外插值。

  • +
  • core_mask - 核掩码。

  • +
+
+
+

CropAndResizeParameter定义:

+
 1typedef struct CropAndResizeParameter {
+ 2    int* input_shape_; // 输入张量形状
+ 3    int* output_shape_; // 输出张量形状
+ 4    int* x_lefts_; // 用于存储预处理结果
+ 5    int* x_rights_; // 用于存储预处理结果
+ 6    int* y_tops_; // 用于存储预处理结果
+ 7    int* y_bottoms_; // 用于存储预处理结果
+ 8    void* x_weights_; // 用于存储预处理结果
+ 9    void* y_weights_; // 用于存储预处理结果
+10    void* line_buffers_; // 用于存储中间结果
+11} CropAndResizeParameter;
+
+
+
+
输出:
    +
  • output - 输出地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持int8, fp32

  • +
  • MT7004 支持fp16, fp32

  • +
+
+

共享/私有存储版本:

+
+
+void i8_crop_and_resize_anycore(int8_t *src, int8_t *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, float extrapolation_value, int core_mask)
+
+ +
+
+void hp_crop_and_resize_anycore(half *src, half *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, float extrapolation_value, int core_mask)
+
+ +
+
+void fp_crop_and_resize_anycore(float *src, float *dst, int *box_idx, float *boxes, CropAndResizeParameter *param, half extrapolation_value, int core_mask)
+
+ +

私有及共享空间版本均使用这些函数。

+

C调用示例:

+
 1void TestCropAndResizeSMCFp32(int* input_shape, int* output_shape, float* inp_boxes, int32_t* inp_box_idx, float extrapolation_value, int core_mask) {
+ 2    int core_id = get_core_id();
+ 3    int core_num = GetCoreNum(core_mask);
+ 4    int logic_core_id = GetLogicCoreId(core_mask, core_id);
+ 5    float* input = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可
+ 6    float* output = (float*)0x89000000;
+ 7    float* boxes = (float*)0x8A000000;
+ 8    int* box_idx = (int*)0x8B000000;
+ 9    CropAndResizeParameter* param = (CropAndResizeParameter*)0x8C000000;
+10    if (logic_core_id == 0) {
+11        memcpy(boxes, inp_boxes, sizeof(float) * output_shape[0] * 4);
+12        memcpy(box_idx, inp_box_idx, sizeof(int) * output_shape[0]);
+13        param->input_shape_ = (int*)0x8D000000;
+14        memcpy(param->input_shape_, input_shape, sizeof(int) * 4);
+15        param->output_shape_ = (int*)0x8E000000;
+16        memcpy(param->output_shape_, output_shape, sizeof(int) * 4);
+17        param->line_buffers_ = (void*)0x8F000000;
+18        param->x_lefts_ = (int*)0x90000000;
+19        param->x_rights_ = (int*)0x91000000;
+20        param->y_bottoms_ = (int*)0x92000000;
+21        param->y_tops_ = (int*)0x93000000;
+22        param->x_weights_ = (void*)0x94000000;
+23        param->y_weights_ = (void*)0x95000000;
+24        PrepareCropAndResizeBilinear(param->input_shape_, boxes, param->output_shape_, param->y_bottoms_, param->y_tops_,
+25                                        param->x_lefts_, param->x_rights_, param->y_weights_, param->x_weights_); // 做预处理
+26    }
+27    sys_bar(0, core_num); // 初始化参数完成后进行同步
+28    fp_crop_and_resize_anycore(input, output, box_idx, boxes, param, extrapolation_value, core_mask);
+29}
+30
+31void main(){
+32    int input_shape[4] = {1, 4, 4, 4};
+33    int output_shape[4] = {1, 8, 8, 4};
+34    float boxes[4] = {0, 0, 0.5, 0.5};
+35    int box_idx[1] = {0};
+36    int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可
+37    float extrapolation_value = 0.5;
+38    TestCropAndResizeSMCFp32(input_shape, output_shape, boxes, box_idx, extrapolation_value, core_mask);
+39}
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/depthtospace.html b/master/html/functionlib/dsplib/depthtospace.html new file mode 100644 index 0000000..5b77d14 --- /dev/null +++ b/master/html/functionlib/dsplib/depthtospace.html @@ -0,0 +1,307 @@ + + + + + + + + + DepthToSpace — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

DepthToSpace

+

将输入张量的深度通道按 block_size 分解并重排到空间维度(Depth -> Space)。

+
+
+
输入:
    +
  • input - 输入数据地址。

  • +
  • in_shape - 输入形状,格式为 [batch, height, width, channel]

  • +
  • block_size - block 因子(单个整数)。

  • +
  • data_size - 单个元素字节数(例如 sizeof(float))。

  • +
  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

  • +
+
+
输出:
    +
  • output - 输出数据地址。

  • +
+
+
支持平台:

FT78NE +MT7004

+
+
+
+

备注

+
    +
  • FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。

  • +
  • MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。

  • +
+
+
+

共享存储版本:

+
+
+void i8_depthtospace_s(int8_t *input, int8_t *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void i16_depthtospace_s(int16_t *input, int16_t *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void i32_depthtospace_s(int32_t *input, int32_t *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void hp_depthtospace_s(half *input, half *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void fp_depthtospace_s(float *input, float *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void dp_depthtospace_s(double *input, double *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void c64_depthtospace_s(float *input, float *output, const int *in_shape, int block_size, int data_size, int core_mask)
+
+ +
+
+void c128_depthtospace_s(double *input, double *output, const int *in_shape, int block_size, int data_size, int core_mask)
+

C 调用示例:

+
 1// FT78NE 多核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0xA0000000;   // 多核版本:输入放在 DDR 地址 0xA0000000
+ 6    float *output = (float *)0xB0000000;  // 多核版本:输出放在 DDR 地址 0xB0000000
+ 7    int in_shape[4] = {10, 16, 16, 4};
+ 8    int block_size = 2;
+ 9    int core_mask = 0xff;
+10    fp_depthtospace_s(input, output, in_shape, block_size, sizeof(float), core_mask);
+11    return 0;
+12}
+
+
+
+ +

私有存储版本:

+
+
+void i8_depthtospace_p(int8_t *input, int8_t *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void i16_depthtospace_p(int16_t *input, int16_t *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void i32_depthtospace_p(int32_t *input, int32_t *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void hp_depthtospace_p(half *input, half *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void fp_depthtospace_p(float *input, float *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void dp_depthtospace_p(double *input, double *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void c64_depthtospace_p(float *input, float *output, const int *in_shape, int block_size, int data_size)
+
+ +
+
+void c128_depthtospace_p(double *input, double *output, const int *in_shape, int block_size, int data_size)
+

C 调用示例:

+
 1// FT78NE 单核示例
+ 2#include <stdio.h>
+ 3
+ 4int main(int argc, char *argv[]) {
+ 5    float *input = (float *)0x10000000;   // 单核版本:输入放在 L2 地址 0x10000000
+ 6    float *output = (float *)0x10040000;  // 单核版本:输出放在 L2 地址 0x10040000
+ 7    int in_shape[4] = {10, 16, 16, 4};
+ 8    int block_size = 2;
+ 9    fp_depthtospace_p(input, output, in_shape, block_size, sizeof(float));
+10    return 0;
+11}
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/dsplib_index.html b/master/html/functionlib/dsplib/dsplib_index.html index 26a3d86..d974f35 100644 --- a/master/html/functionlib/dsplib/dsplib_index.html +++ b/master/html/functionlib/dsplib/dsplib_index.html @@ -54,6 +54,51 @@
  • 自定义算子列表
  • DSP Library C API Reference
  • @@ -91,6 +136,51 @@ diff --git a/master/html/functionlib/dsplib/eltwise.html b/master/html/functionlib/dsplib/eltwise.html new file mode 100644 index 0000000..dc7145b --- /dev/null +++ b/master/html/functionlib/dsplib/eltwise.html @@ -0,0 +1,321 @@ + + + + + + + + + Eltwise — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + +
    +
    + +
    +

    Eltwise

    +

    输入两个等长数组以及控制参数,根据控制参数的值决定对两个数组做对位相加、对位相乘或取最大值操作。

    +
    +\[\begin{split}\mathbf{output_i} = +\begin{cases} +\mathbf{Input0_i} \cdot \mathbf{Input1_i}, & \text{if } \text{eltwise_mode} = \text{Eltwise_PROD} \\[6pt] +\mathbf{Input0_i} + \mathbf{Input1_i}, & \text{if } \text{eltwise_mode} = \text{Eltwise_SUM} \\[6pt] +\max(\mathbf{Input0_i}, \mathbf{Input1_i}), & \text{if } \text{eltwise_mode} = \text{Eltwise_MAXIMUM} +\end{cases}\end{split}\]
    +
    +
    输入:
      +
    • Input0 - 第一个输入数据地址。

    • +
    • Input1 - 第二个输入数据地址。

    • +
    • length - 计算长度。

    • +
    • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

    • +
    +
    +
    输出:
      +
    • output - 计算结果地址。

    • +
    +
    +
    支持平台:

    FT78NE +MT7004

    +
    +
    +
    +

    备注

    +
      +
    • FT78NE 支持int8, int16, int32, fp32, fp64, cplx64(除最大值), cplx128(除最大值)

    • +
    • MT7004 支持fp16, fp32, int16, int32, cplx64(除最大值)

    • +
    +
    +

    共享存储版本:

    +
    +
    +void i8_eltwise_s(int8_t *Input0, int8_t *Input1, int8_t *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void i16_eltwise_s(int16_t *Input0, int16_t *Input1, int16_t *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void i32_eltwise_s(int *Input0, int *Input1, int *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void hp_eltwise_s(half *Input0, half *Input1, half *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void fp_eltwise_s(float *Input0, float *Input1, float *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void dp_eltwise_s(double *Input0, double *Input1, double *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void c64_eltwise_s(float *Input0, float *Input1, float *output, int length, int eltwise_mode_, int core_mask)
    +
    + +
    +
    +void c128_eltwise_s(double *Input0, double *Input1, double *output, int length, int eltwise_mode_, int core_mask)
    +

    C调用示例:

    +
     1//FT78NE示例
    + 2#include <stdio.h>
    + 3#include <eltwise.h>
    + 4#define Eltwise_PROD 0
    + 5#define Eltwise_SUM 1
    + 6#define Eltwise_MAXIMUM 2
    + 7int main(int argc, char* argv[]) {
    + 8    float *input0 = (float *)0xA0000000;   //input在DDR空间
    + 9    float *input1 = (float *)0xB0000000;
    +10    float *output = (float *)0xC0000000;
    +11    int length = 1000;
    +12    int eltwise_mode_ = Eltwise_SUM;
    +13    int core_mask = 0xff;
    +14    fp_eltwise_s(input0, input1, output, length, eltwise_mode_, core_mask);
    +15    return 0;
    +16}
    +
    +
    +
    + +

    私有存储版本:

    +
    +
    +void i8_eltwise_p(int8_t *Input0, int8_t *Input1, int8_t *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void i16_eltwise_p(int16_t *Input0, int16_t *Input1, int16_t *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void i32_eltwise_p(int32_t *Input0, int32_t *Input1, int32_t *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void hp_eltwise_p(half *Input0, half *Input1, bool *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void fp_eltwise_p(float *Input0, float *Input1, float *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void dp_eltwise_p(double *Input0, double *Input1, double *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void c64_eltwise_p(float *Input0, float *Input1, float *output, int eltwise_mode_, int length)
    +
    + +
    +
    +void c128_eltwise_p(double *Input0, double *Input1, double *output, int eltwise_mode_, int length)
    +

    C调用示例:

    +
     1//FT78NE示例
    + 2#include <stdio.h>
    + 3#include <eltwise.h>
    + 4#define Eltwise_PROD 0
    + 5#define Eltwise_SUM 1
    + 6#define Eltwise_MAXIMUM 2
    + 7
    + 8int main(int argc, char* argv[]) {
    + 9    float *input0 = (float *)0x10810000;   //input在L2空间
    +10    float *input1 = (float *)0x10820000;
    +11    float *output = (float *)0x10830000;
    +12    int length = 1000;
    +13    int eltwise_mode_ = Eltwise_SUM;
    +14    fp_eltwise_p(input0, input1, output, eltwise_mode_, length);
    +15    return 0;
    +16}
    +
    +
    +
    + +
    + + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/embeddinglookup.html b/master/html/functionlib/dsplib/embeddinglookup.html new file mode 100644 index 0000000..9986e55 --- /dev/null +++ b/master/html/functionlib/dsplib/embeddinglookup.html @@ -0,0 +1,273 @@ + + + + + + + + + EmbeddingLookup — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + +
    +
    + +
    +

    EmbeddingLookup

    +

    传入一个矩阵和一组索引,根据给定的索引提取对应的行(向量),若此行不曾被标记为“已正则化”,则对此行进行正则化处理,将结果拼接输出,若已经正则化过则直接输出。

    +
    +\[\begin{split}\forall k \in [1, ids\_size], \quad +\begin{cases} +\text{if } \textbf{is_regulated}[i_k] = 0, & + \begin{cases} + \displaystyle X_{i_k} \leftarrow + X_{i_k} \cdot \frac{\text{max_norm}} + {\sum_{j=1}^{layer\_size\_} X_{i_k, j}} \\[10pt] + \textbf{is_regulated}[i_k] \leftarrow 1 + \end{cases} \\[12pt] +\text{输出向量 } Y_k \leftarrow X_{i_k} +\end{cases}\end{split}\]
    +
    +
    输入:
      +
    • input_data - 输入矩阵数据地址。

    • +
    • ids - 输入索引的存储地址。

    • +
    • max_norm - 最大范数约束。

    • +
    • is_regulated - 记录矩阵行是否被正则化的标志数组。

    • +
    • ids_size_ - 输入索引个数。

    • +
    • layer_size_ - 输入矩阵的列数。

    • +
    • layer_num_ - 输入矩阵的行数。

    • +
    • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

    • +
    +
    +
    输出:
      +
    • output - 结果输出地址。

    • +
    +
    +
    支持平台:

    FT78NE +MT7004

    +
    +
    +
    +

    备注

    +
      +
    • FT78NE 支持fp32

    • +
    • MT7004 支持fp16, fp32

    • +
    +
    +

    共享存储版本:

    +
    +
    +void hp_embeddinglookup_s(half *input_data, int *ids, half *output, half max_norm_, bool *is_regulated, int ids_size_, int layer_size_, int layer_num_, int core_mask)
    +
    + +
    +
    +void fp_embeddinglookup_s(float *input_data, int *ids, float *output, float max_norm_, bool *is_regulated, int ids_size_, int layer_size_, int layer_num_, int core_mask)
    +

    C调用示例:

    +
     1//FT78NE示例
    + 2#include <stdio.h>
    + 3#include <embeddinglookup.h>
    + 4
    + 5int main(int argc, char* argv[]) {
    + 6    float *input_data = (float *)0xA0000000;   //input在DDR空间
    + 7    float *output_data = (float *)0xA0872c00;
    + 8    int layer_size = 4;//列
    + 9    int layer_num = 5;//行
    +10    float max_norm = 4.5;
    +11    int ids[]={0,1,3};
    +12    int ids_size  = 3;//提取三行
    +13    bool *output = (bool *)0xC0000000;
    +14    bool is_regulated_[5] = {0};//layer_num
    +15    int core_mask = 0xff;
    +16    fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num, core_mask);
    +17    return 0;
    +18}
    +
    +
    +
    + +

    私有存储版本:

    +
    +
    +void hp_embeddinglookup_p(half *Input0, half *Input1, bool *output, int length)
    +
    + +
    +
    +void fp_embeddinglookup_p(float *Input0, float *Input1, bool *output, int length)
    +

    C调用示例:

    +
     1//FT78NE示例
    + 2#include <stdio.h>
    + 3#include <embeddinglookup.h>
    + 4
    + 5int main(int argc, char* argv[]) {
    + 6    float *input_data = (float *)0x10810000;   //input在DDR空间
    + 7    float *output_data = (float *)0x10820000;
    + 8    int layer_size = 4;//列
    + 9    int layer_num = 5;//行
    +10    float max_norm = 4.5;
    +11    int ids[]={0,1,3};
    +12    int ids_size  = 3;//提取三行
    +13    bool *output = (bool *)0xC0000000;
    +14    bool is_regulated_[5] = {0};//layer_num
    +15    fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num);
    +16    return 0;
    +17}
    +
    +
    +
    + +
    + + +
    +
    + +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/master/html/functionlib/dsplib/equal.html b/master/html/functionlib/dsplib/equal.html index 8613b6c..8ce0def 100644 --- a/master/html/functionlib/dsplib/equal.html +++ b/master/html/functionlib/dsplib/equal.html @@ -23,7 +23,7 @@ - + @@ -54,6 +54,51 @@
  • 自定义算子列表
  • DSP Library C API Reference
  • @@ -167,9 +212,9 @@ 7 float *input1 = (float *)0xB0000000; 8 bool *output = (bool *)0xC0000000; 9 int length = 1000; -10 int core_mask = 0xff; -11 fp_equal_p(input0, input1, output, length, core_mask); -12 return 0; +10 int core_mask = 0xff; +11 fp_equal_p(input0, input1, output, length, core_mask); +12 return 0; 13} @@ -220,12 +265,12 @@ 3#include <equal.h> 4 5int main(int argc, char* argv[]) { - 6 float *input0 = (float *)0x10000000; //input在L2空间 - 7 float *input1 = (float *)0x10001000; - 8 bool *output = (bool *)0xC0000000; - 9 int length = 1000; -10 fp_equal_p(input0, input1, output, length); -11 return 0; + 6 float *input0 = (float *)0x10810000; //input在L2空间 + 7 float *input1 = (float *)0x10820000; + 8 bool *output = (bool *)0x10830000; + 9 int length = 1000; +10 fp_equal_p(input0, input1, output, length); +11 return 0; 12} @@ -238,7 +283,7 @@

    jk}@>ado;LxI*R@-YXtShVJmk5`-E;|Td!+5#Ud$;bC$ zakc)IeEfbpd~75iWTRe-Y~@RLF|o)#Cl+~&rbXVfN#8tR-2y-Ox5!iP7I`k-a^SwE zwG}>!?hMgj=n!TkOfWkl0~i)NL;Ql*j>$?q!`i{j0|U$S=F+|m(x&HzPWr9eB*Zq4 zD(y5^!Ur#3a7r*?&kJMmE3nvt*GlAy#3#YZmdK^k%obqjYFWq69{}0!F5Lt(5Hcm0 u%b-ddjE)iXotJcax__G5&2%%HNEe}$p3e0XSJR#({*}8T5=Rt!m;8VGRN%b; literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/resize.doctree b/master/doctrees/functionlib/dsplib/resize.doctree new file mode 100644 index 0000000000000000000000000000000000000000..16710deae08773051e8277b78ee720232d1c9d3a GIT binary patch literal 24233 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/reversev2.doctree b/master/doctrees/functionlib/dsplib/reversev2.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ed505968951e347b54ddaf447b396976fc1db7bf GIT binary patch literal 17209 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 sybHqhU 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/scatter_elements.doctree b/master/doctrees/functionlib/dsplib/scatter_elements.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ab3f05179edb610bb5681e656f15e36e0011f943 GIT binary patch literal 95145 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 literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/sgd.doctree b/master/doctrees/functionlib/dsplib/sgd.doctree new file mode 100644 index 0000000000000000000000000000000000000000..beacfbeded4b326491b7d7319a3d86c93ba0f37a GIT binary patch literal 40512 zcmeHQ3y>Vec|J+^T-}`>NHVq%Suhr-(>;U`=4BjX`7Jo}kZd_6Snci3-Rx+0XW5xW z5(JmPmeH9(fLR{qje{i|0}|$8A%tUBDlW$^my5Dpae@Oj)}5pz6tJ?S5mvnb?d1r`^?{JKao3o4l zaI?*9H#@GV_L*H?o11g>{n;DQVK3c)0r)0V~q5vcpYwfoZPCK z^US4Yx7U^O`8MZx?SkEP!=_y@hOfEC99~Q0GhE0Ovrfq_8!0CT0C_TO82>xNY{>9f zrAYbD=SGLollp2G)jI`-w8r|x}v>dyVY+Hpf7ar9faPwxEc>xb@1B=O&1vcG?;ksCMN{(f9c zerqS|8pd~Q&z+O^?Vr4V2N^F0r8BULN6kT2-ClO#aMr$neBeb>EbC{p52`P2RF!kg|F6N7kQx&d7&1Z>C1O zdGp2V&tA1^4K5QyL&+lM*?H%2b7mcr3`%mWbmr}KlbCyqS%{Nw{S1r#z6LB})R z`>P$-EBhy?8zWw>3oa`S!!Ma(Pq(g#lbU(VC0eJ29b4H+zZu%T;tC7(Ck z`ljDSCPmcVy&<7E=Gq%A#f+yl?5PYBD=!|a+8wuS7so@Cd5HkD5JfvPlBzEUr;!}4 z0{=zuzr;H&&Z9yAx#)}d9kC9Z(F!1GIS1w=Z_0(wuZg)br{Yxb;`mZ+e5BuGL?UH-D_ z^JaBmbPO3;t>{O^bfP~8Bd-bpOwu>5$P(sKtA)bWKPw66h5iw#ouqpVhzjd;po$6$ zK3+UW2uZcGhJd93%95T$xOr;@Wd)vop)V%?MJa$rdc_scTtIyfg{sFc1cd$(0bzNZ z&Vx`?WETN>RAlf~0Z1XVPSF%FdMRa8PdE|V2xSmrJC%4W{i|aDos5br#%^Hw1jVAK zMu-vpBVz0mj{=QeR-*#E3TUGOoF4@ygxDQ^1PxfdnzE`Voe0vQEJBcEno7|P@hTm_ zBz@zGuLrPg3R_Qu5Fh$S#CPs-KQc$S+^_MgNFo&pyr}yY^Z8ilo%q9ep!&G~&h(e$rJDr=gHQx}qpcIo ziv|P9u;2|#J2V;yIG&Op96j6YM(AtUU52jNB4S(~` z%GZ6NSJO3Oq13Vykpv^zpKjJ_ppAOA7;pC0*)iB7{%s9oYl%lw0r9jIm_8XD*Yr;S zwpA2cJkLh@4>Ib4*L^I-Gcl8pA3NuGA#r;PT-G!q2G$i+V0r-%wS0y#u2)NBCIo6B zqvNV&5wLBb*z{D11&8!!YN_untONjBa|u-V4dIc9Li=N25>AQqXS1$8rm$baEH!1n zv^<(42;~Ptxq%uFGA}Yt_>r1+-<#Y9zT$e5CE)93Du)_x;?H|;v656yX_wcLN94Sm z&PxHmV2B{Non<)!%XqXgoz@=o0f}E>Brfr0C4%v!(HXV&;veDoyhI>MA1_Oq1mh0U zaas$L@#YyrOQu@woL+c{Tg|w1PQ&=^Z3?^gb zn+B7yb4^Upn#JeT#`qWv-{h=+g&@gNL*8X$jP`B+wZ^*j^F>RcfMYQfCcF*lKSle8 z7SxZF4#3pwLT`|R|k1#lH=<(SD16~_~VPxdq;nNZG!l`{(fdv{_1G03`Bl{VnE;` z24e`9ER8E-2vsQI&qAcPcx|ZMFt&x}C4Yvim+165P&ZJ{(Mpm&RD_`10HrJ5iDoH< zf{v7feEHg>sP;f^yy_(~L*i!DY#(u}X$aE#01*L~q1iuT4vavOEnX|CNisFm^x;k~ zxx>m!+)7#UBrjZT=dwwGq|Z#}$C5nvH;`mk!2{AjGGiAVm$!>}{6KOnZ>Qa)6n7Sl zew+FFa%(O~VOoYV5E5W-Gjx55s3d;vA+ zy2J~{`jmP~N{h9Wevwi71^g3r$9-NW%D4t8dQ`q)-qD{%Sj1k}wnF|qCO)sTR5l!= ze6>N|wyn==WU!DjM=C)I1|HTTMG@Zqx8&pv+>_5(*rd9{4vA`+4CqF!R+bcXZA0~4 zs5|q&)=dzi|1{Z3APBo;7rw%uMaSs+Yu$y$ni;`0{uJ&-H7;uw1ZC|)I#)yhC4(wL zT+=z~C30DK|J+#4C|6Pch~{*8+;FSb0l@S+3U-zn%81uR3lI54cji1+tw?4(mI_{6 z$xt{$nW2=ky)bI$0rDc--cl*8LpMG{upp$}G^t-)TstgHst0>6ynOw~1G2=-@>(f& zYd4{+JLja*MZ37YU{{>#L}gT3l)g|+JEO#KpG03QrjJtrSuXzZHK2A2ucAwh?02BC zM)uqd$YD#S7%m{; zIKoZ7Nv>BR)0reg)>M;Rq=qS9ouWL-O#MIwoke^x`ahjz@umEA70)rG9A}n2 zr-H4UWt?njmIXyee2xVTz7c*`g-EA3hN!7C>;%Ot829^`kVo>`Xg_~Cu`8dGS5%zX zD#yg%5MIK7c=PEs6=)m zq0`BH42Y+bQ&pgKI^m!torEf>xIRKHzAjd&Q0a8RP&HK--Aos}o{13KXH8>rd|btX zP7xoDt%y&nKomYYOBx8OzPJv82A_v}RETt1V2GNkg@tS)goAA=Rp{4>r&NsSl(8?i zGQOh%ty2aEEh$5;9^(p;8-1nxNQF?R6o#;=O6l^Wohn_-!Cf&c=x?9)qbk~UdN>?g z55H4^*6D$Rmh`}j&$t4jrD(0~iq%agd4{5?lJ6jrC&gTZ#>kRTU+&9PlVlriz-w)EihCw)I$B?L43)3CpP7}IhsUC`B7Q66KR43pT0`M8cP-F zfmqOcuroYW!ZxckvNT(&y9mThfauLvW5&|dkd9o<`*!z2@NDj*U zc#$fYOp*oVc>#`ae z`m9ff+PrVm45JJj31F{8MvBL z;IkP3-!!i>z_^Zsns|eDqGOuGmG;|Lq1)8h}@kjQf zQc8lSE)^W@33K$+TXhEY$!V4z$q}fYVD#@#^EwnyzB-GXivjVhaG46U&I&o`I8oJ= zD%iTHDu*3@LbB!{GRGfHYf@@#fMJ6 z7coL&cRh z7r}sdFtM%*xQXVUZc{OG4f@w)@^}L3W(CTF%=4(iN>e?pbB&h z>f@N`_f)WTCd$c{O!Rw!QWYtkpQ=#k43wd0s)05qrSqDK6P=EaVL&_!{k;mbPRAUy zq=!ESdZ?Gj>FQLhlsaWFJWW-`%=0*>sJPH6Vi^X+Q^c?ev`!Hmw4{jD2=?(cS(U)K zK!ro61csxjN|<2+XM>6bodzzAt$~aRv`zyYw4{OYKm#?&o2yg^bmC_SnkxQ=$s21& zz(FK+GohkiC;OeTWq+p%v`+RMv?Tlc0?HLhn@3bAbkb)inkxOKByA3<7}2TWKx{R9 zUjZEFZrb44r1w+$RRUB`s=GQ9Pb<+R0*wX(W6=ri%Ue@-(NZDAx%+i2?D}-PJ14I-zsWlF-i&gf6FPKA?iGvvdZ% zsUn|Anr5Slex2ag#}@pU3ban}9JD0(QXqI$e#TYd(21Ynn4$RV4-fJ)EPX+O>O2us z8*+;U=2i&6&%Ri<;mZ0Fk;zi)2jm|q_!-Kxd>1#<rOJ}F8q`#{-8?cuW-1u9>0-+lKNg8_6L=n?{ZCT=80@ zk;aQg_PWIQ=_xn4{DR~-{#lu1)eW222{p-0nXK(5x2CRj2hX@JxoK0P!1}UcAbz{R zZ?8=Doq-b^{GzQD{60m1u@yQt!SQF(I3@TxdI~53$}n-bE0bi*KyrC<;GPUTW)?N{XvC4kiv`|IJ23i3%w;GO(&n&jFYE}mBJ|Ye~fr-`Shrf z#}5Q2x8hva>O?TV$;`eV*m$yWIi|@y=C^owQ(!a^YZ#9qlWWxBh(9=^xCb~bOqPSW9F zv88$Pk$Z4>3gap9?p!gGuVjtn`y4l$vxm(0%T1(Qj5H=lK>^u!(?`;EE0WjJ2`Ro8+2&KCk z(P`EBbTltOLBpC==e{>+^9u<`*KK2C><(i}+HHyZXBdO4r4GLPB7=ukN%y#WA~(+E zH>Aou3~}L{!uZ0~Vi9ya4co`M3?u`Q4J3s`27E_F{nP;En~5HOeOd>SjI;sYPY!TT z&K!AU9N!&EcZT}HTEWOJ8`$ewBqF{}c)z#pj21dUeQ(>@8)9evYVm^x4mI%h!2+lUOP zvTFQ2arUf4q+wK7$~v6;s1IHzb34w z>ECDQ-)HIHZ_>X9=-=naUqX(mR3xyyBpM*NHIL%6EcdK(P4z zrh%@=qDB_K*U&HS;&+MIpN|LI8CJRQJVk}SGnv7p94^O^KB*08^v+gWE=kF zT9&sG<lTy(F`@5F%6OWS4fVi+q`XmqdA3N&)Xim+F@=te45q3pQD0a-xVC(Ou>1yLM3T=en5Z>rbi7)xJ zM%K%uXz9;EkM#2mc1B`b((MZZb%Mw{tY;J3EpPt*+mni3Yr z41b88(>g$bgN|c{FR5Vb%#g#D%&<`v&`}i z;~o`govY!XkAD~X$tsLGr7XpO=<+N12XdB!T%Rt^L}|)d4|Qi!d?}x&;yH$t2_P8AGIQ&m9|V=Q{c zi`%6N@%kH_ODf`Z;?Ktx|7TU8b>ios!{YbaLrfu*Brg3xlBYtV6Fx&SL*dsS9)$dB z3OH&bP_e+&FW^{=Hw-xz7`*CQ^Kr8&1ss_d;7vOF=sA4=RFme)qpHAR0lKRsdhYkrcqc?@d1^A~F1#?kzpBXPOVNi!dOb zxh+?L)|ndz9Vb?@Mg?0JE8(!ij|JMjr5CCY=uDF#sJ|FDIG%Mr6RQ;bZpPlys& zxt0x#kQjSQ$5o(p`sJYG=(nPRte?Z&jdUP#?!cUsS=?nJ6b)GEsfF_GJ|coq;kG zO*PQwglm7N;zXz8-(o;K3vKOHtYA7FbI_6=VuWiKs_^KP!SFOy88Z*p_N%ziDPlPW z#8bpMD$qJbaL|$>8iZ>jZ%CCo5fd!>p6od*6Qwg&Pl&^irp(2@pp;o56d z2z26S2%0MXnS^VjiSF$XP)e>aJ4 zuyWj*Q0-zB0-fL)f*A_F{%}pGwl>xf3rzh`?N5kYg1vT#`h-HYKf=wXglaEGsP;vU z2@8L1sJ1UuVI6B@(FdTj#v6-1sL*V9%5&xjyMVbBX3p&e=KiCf6X{=7BGOLc*nE& z91pgO6SprePs8Q%E9m#-6WA#;C$s?0)-410Xr^5uTcpgD-Xgc0E;@Po^{-T^Y>(qR zdSqu*pV#KvE0hy|i|_;+86Ib;O*9@3)N`MSMz`99fJDe1gru zF2zC#7jw(D?SfQeEVm7xha0YXa~TO_Bi9ymNbt)_nQRU2AqNnTrZZc}U69ho4%qb; zjsXn$B5>&DF0aSIImg&voZ5y>WCd&{>viz0(NZd77YZ2Y0N_&AV&o0llG>WX)_VH2 zIWPl!d_X?!U`IO|y30n%F1x9`aW(cTubb^9ut52jZQcT7TMklm({9BPo$$q`tT9>{ z$MD{*>2i^Lr4Mk8bO9}0P)EifED`#0MaV2=6f-vYmLI-gS8>M%&l#j=H=iWmOc~{} zT~3+lVm42{pVv-E#j(!bJSO=Nlr{>b>Me`hiGZ*kfz5lp3~oS!7=4m_BQn^VPk4as zIVMDuC!fK@?qwRWWHolrKgGc}9ttK_4Fz(l_PihbWWesBz@R6{5^ z9EZ(p!ff|?(-qfF1x?;;e9zPC$yN&3Woys_mC5j4+JMIZqg=#tjFx${h1xqYfS{@5 z7?rG@!Y3!uYre6qWIIMGJdzqp#!X$Fb8^gT=cTeaCq0@szze6cL(CS;ylyb#;Am&| z;XN1*@0J?N<-r`L`4aLANbq4x@^L<>hd|3h>vPNLt^Vb@S>6INv zo`1U6TQW*12*toe%`jsmEu%PVAw^~fKAP*gCFi{1VKh5KrR}b17l-WfI40F%(vuQ^ zo+%ff&x4bIMmo_x_?}g3AkW_NSSA9Vv;^Rn3-II0%x3WFS_Y%DStm_)oab$#QM9P0!|)JT~)!v zCVN3opx5j&mA5l#F4|=o69=Mapm;XrAZ02-jK=35v3Il=)VVnq@@Jl40@h<^a>X&& z0Cx=wiLY=fqmgd80(P7NSDMYoR_c{tGB~pUUnh3Ag96hqT;N!oL9Z<-0~_x1DV*m{ zTrZ`10f9_3?il$o=GG=WoNIG+72hcKI+;VECm_tn!Q(m14L8L;gh}mY0f>TSx$wAv zku}EXR@a46D>-9g8zxn%kFx=1rUmmG@(y)ogKCu6;! z_swp4fIK~7-Xcew&_hsYt&BygX)N+8W|5b*iq{iXFh$vu$-ztr%^-udka;ZnG2X&0 ztRH3y45EPVcltI%yDo|}`n|g(h+P6J9kft_Pj|*wF~Jr`Vevay9N}d$c7^y5tV9_* zpJ%$mQq!@Px8Dv~?W|sg8H022G4~*P2S&mW`p!mbp6fSLJ&5IMMR5q6~3MFSsDwizw z8(F(_Q>k-%X=|y&X~`!x6>`OV(kMAi&?0H3GpW3hEv+v((?oMSohd9<{U;ZUq@B)X z{qAP7Imw*7zSLp1IL&t2&KQBWoVN1^5=moi?#zUpG)tl#G@H2A*evW9Kvw)5$pq7BXqXD6gn1>xA_WF}E4z(IK4oK5u0XH!zef%1!)^ z=oM{>&SX2$C*CTV)6FByHm4=-N5Y)oO!5M-c8QtmHa>&fJj8^MXo zjo8r6tA{>y>(En=zjDpThHu$DeElbecHTO)b9cl}KI@?!>4G-Rb@H5WPGdm96xBbBFAARMH$A>=ixuG39Ufy=4%+OqCO!y-C0LfYc zL@xU)y_oYYhHd6zl3rX9tRQR~I~&?+xF)8=^L}YxmHnwn1e4cI7m3UAh~yx+qwSk zSjOnJyJPuupJ`X%xg&@d%*22Z7{}0;KYQTX$15RSqIAbhL*R7BHlxPWgV#!rckbVJ-Oznk#soiey&b)oT*B^rZSP=k zz)3NS`V)nX9qB9>9lGI>SGEmyx~Ri=lY=? zkM7^|xuMVBHgx3!2L^Wz?|N8awu&rWvnQCrT+t4u@R~i9DQq1sJu>WUAA0JGLpMN> zW$rg@c<0)aR<1c~!v;6S8#bJ`_N1jtSHR2G#fxKE;LfU5D*3WuOrpTdk@yE5eR}B5 z>i{m+J8;7Cm$z;29XN3X{F5BWZ1$flTfPzw!LXN|DF0P2MF)>t(l7(w#qi++pc1Xs zoyDRaPfr=W>1v$#&b;zsv!J>UgMWcAyHu?iCFM1Fblk$Aw%oWk5@p&RpqM9SV z*AdPSf!Xlf5Fk;`3qSW0Z6hB{qtoK&(5v!+BYv%YU#(iZM%CJ8sI~8Q>uhV8Kmppw zT>+4AYELnfG3@FDY!TF~WSujwW=WRASS)uj!03#(4VhH1^SNwaz!|5-NAm{X?3T-t zKk!1WfnN#(&ccA_I&Z1ANR-jCg&u>oWK9B8t5{=wGgZt*V*^}Bdt-K1M=;SU<9L&d zW8OD1O*i62u(dqJ%LBiS6ULj}FdhkEth#)b5pOPtJ=5e2l%;$k6HMw{e2w+|n-yMw z%cu|6^7A2xwe)iWl<0CtaEF)K$pG+iZe~SeJ+tRTR{SdS`@PEiwgpXj(VOCx-ty3Y zP%CC)iacM=ZM7{;8S#0@?dN=+9S!*;_Bx(thgWY@Mt-@LuOh$FS3SSr5--0~0N^{^ z{EEhUe&4SuQgjPaMV_q*ux?kTdU}ObFQ!uin@2y0))YXf6-UUq)eP;w3 zMSCst3&czoXG_GE)N}Qi8ZFCa4rjOzG$^~TF~L2|B|{6qjB}$vpQ(729NJg#;mpQ2 z6O{y51rAjbpj|WL#k9rW$CRUYIwN`_`KP$UhGp?>qMp}%c2G7bfVlB)1;Z;{!@PJy z`-*t4c?0%croS0+&WjY@%~OY2UXl;54)5i3F21cS$J<~gIN>Gu1W0hbCu(JL0*0I3 zsgU0Fb)*;Ci}Y46+|DGq3oSY07P*o^GO(rEP^*f6D9{-8yw%MJG2-mN2Kg+gis$(2 z+miA*tJwC}JYQ8=f3FYVZrI(EUN6akBi>Hdx`UBdZx`PVfxcDdH}08HJNHz@>++^^ z0oV7ye3)OmPl)8Lc}x{O#i=-#tfIY4Esw821ykqiag};WKr0F8Bq5qkujuC`FLd0e z?Ei&v)!Jxyl$`>psT~8XF2_F8@^^oSNSL#H28D$#Zt9FnT!5+Ht z>Og5c9ZDly3J?NY@SN_RMX@(bW?K}CNMe(jt0<5ifz$Gf-l#E1%RbMo)j$=o#e?nF z8)ws>re`sT=@D)Y5aqj_-;zVdb!WupG9?O!!f{q>d=fg;8Hr zN0dZ+8Kvqo4PQP)d{@=BWUUmTk(W~rfjJG+w7Mm+Je?Yt)84fgKhVyhU0q=be^pnP zwXPCYC68w#9m=(F2Q;izjm3Juz4lQ3%SMO6I6c>!91sRm#^yjxQv0E57oeQU zaJ4d@b}vA7z=cG(#s=3woq6e%@!)m9cmXbLtd4nC3*j&ForZcCUe&+2l-w%aX~Ee;x47H1UqSPH7kOT3x;MvRpb93t1CaVphiOn7sVe z9rIqwZ5CV+%4G|-I2sEG`r2VnCejWD)C3nZ=AU26m;R|qrzAp?Gh25Z)MB_^TE1N2 zjA{Qx?B{p`h;KBuY|7vHiU^H1#-M|9r?nq8G8|0JL5M35h|{AT6?`YxJzOn zZxoFDWrjGLw0=y4XO=r$aml~m013O|I-Ik8Y)rv&`S3jr(x=@k4DzapRF#^XwgDq6 zZYqdxhWji6?PbZdUWTxEXOYe%3E|Pud+Dcf+Jtarw_XE;&=gR4oC+N(^Qh+woJ!^T z6X`6R_9x+<5qRxRN~blQf})-7O&j?V-2VcH6Zt;FE?F}G)0y0#OS$P^H}1Ls0BH6@^G!)0`Fx5}Jww}iMw zr2UNZ*Pc^$%bQBDMHY9hSi=wrr!8HGC$hQhmi}C^P#P@u;7iEWr9`1e@UjJl1B+p^ z8!791!F1pSVHLEjTwbl0uq3F8AfciD!DVE*_QVIo4Kc+;#a%+qIJM}*2~t(B5Yf;~Zc z_*e0=$C?PQeC|*4rjL>@-1%d*2AUu<#wDW~RA{yo>m5}dI&f!;wE!BIr;By0c*&h6 zRwuN!y5YeczO@9NtuI+C#L<=TP)W`#9D{f<$oX+-Sr<7K^f}PaONI3wc%gzCVW~bTh z>s4^|$}iyGL`LU~+Zdk8Ux$WJmA(r9@Dl$bf=pH=1^qNkMKAGi=b*T$P@ZGB&wa=D zWANXEzM zzZZjMc+Mf|dJLN)sd8H*Y586RmDchBpP&|Ih$5&o6e&UBlAC|J95@B8lcQH*BcV9@ z5$M3<=#3aOm1zad>9M$fiP&Cz!`Aq#LW{zU2 zG#4pT#ra%Wlu-m_X8C8B|5TQL3>|p<{3QlWWm!RMnF!p>pz;tn;%DK{m?tW#3S)M|XXOA}YI?!f+1w&2 z^bb0dvpMhSH1F^tA?j}_L44Gk-s_prLJhItH=3T!dB?nV0!i2_7`6=x8HhCyy$8M2 z2~}Sy`qn4mptpCe=URhxFLZR~r!FZe9o8d(W6tgJnnDOz zD4K9kyQ&~xzqywctS|k)8AtNgfqO7B)H;Be5g)el z$nDI+NC;=-x=>uL6)YjxTmD+|IOZ<3mi$lXP$`LZSib|0t>43gUM*i2hdrrJ>HWxf z{}LSURbyo)bcE%|zywtrj~a5MGg(b*w>c!kf9+@BpX<%Q3rGg4N%%EI$sYn(HSNBN zD0zY}8(1g8Q|n29uug(!LR!a*W~F@jygLMreEA>HvM%{jL32)FCQL%GsZ$t*9o({6 z>tNuXZX&Pq_?ex7;Zt)<;_K_TmRVXv|Bj5RCZbRGmzBCybU_O>sxV`ZuXkJ>(4n$s zXyXzxxxNwct~!Nf^bs)jS1=muH}Fu&!-cM693H+48#7hb6*Py37hu>F4;8k?!!MM1 z=qc(x5qmHL6cMF?NQp>E=xinOa%>=!%5xcX;H}%&V9->86|}bhs4kb^jKNd855DJj zW6%uGIn;a|pvJRO6ka;%`4>^u*Hr`XB&d>sbO@SMZWG=@!;PUW`7&Tp65iR+mqKws@(#-$ESU2l0KU#` ztraIS7l@b~VO=l&(d4OsqCE(2Cd9Y?bXXUQJ|Bb!U7B%)Z0kdCe5VzM$4+YlJcjh@ zBf-*j;tj9_)2>IfbiVY zeca+cUhY0#;XZy?JicK{@(IgXN^+=KR7!FPSmoK4tk6CXkN+zWwF9HgN zG%2cRc0z~1R6UBfew~b&p$aHsrb0;$Mc zfl8GMp5YFGqu@EvGBj(c>7<}Jd;QxnY-+Esu(iDop(Njr;Zt)<;_K_ImRVX!PROW+ zlw`@;x|C!=i-3}>Gxphf$MuZsSb3vU`Nf9r4cA;Hc?68z3HGgP;h~a;PrHtBc=!`& zSr-o#G>3<;V%QW96}HAhN=g1BW`H81G!Q8fBT|nA`JUf`K{Gt(knP`)J_EBsgkE;dYpbOt1ePC-TK;3dm#D z%{r9h=ddb670ItahrrZ4nzvrPfSI8RCSpcYj%SA0fe6P{8i8(%yyJ_O`!Qds!uvDm z(2#753|5nkw~jvZD+J@IfvLz;izkXMo>VMf_#vM#71>WxA#Z{Xl_A&E#Cq=EYzD9f zb>d;5fUgt7_d$i(St-x`*(D7}o?CzghnhPInzNB#hGA11d4;WQWC)q~Gz_0gti-Rr zeW>xR9e{p{vJAvCRL9C`_?>osAS*=T*o*JEJDk= z1Y!lvVc=C5HpM`Ntuc@ih;PIUP!yB~BBfv?0`UXbKq!^t9_YYZp1*`aQzb@0GgXeS zVer%@gYWqdFldJ79BTd)!=|XI+}5aBOCWv~GeXf*8i|yi5eUQ++mI4Lk+TUp@W?q6 zgQilfpqb=627{-_$@hE_2F>uCL(Y>iY>J%9ZH=6?Kzuf4f}*B05h*pJ5r{WnBca%N z33TAGvmb+|a;%`4?7RYlr`XB&d=P_Xc+O$xtr#}NPUW`7&YA-8J(v}WpwddD1Z_kh z-i!H9CHG0_z@z1NFlZ{d3R+7*4T1P2%mx*HX(RgZk5C}~cg%k({I9aZ{}&9J3crHZ z!e2umZfi%DTq^w1MuXw6-klJL!vY5jrn*497tZr^6)GSQKLKw>A`l-90`XJI5=^_1 z3B(>i6aw*Ska8&yyU#{lAns)e#GzIV3&c0O0&xge{$8oC5WBx#8dE>eqJ6P-`6utR z!``>iX$J$}0LJ+eZ2j9R#;~Jxh{Wr#N<$UO3!y_`dLF}Dv(lIus%Ro+bdfm35KJV- z8wrs({En|!UV-^a72i$Jp;88_>)v8yu$oBxk+H!33YoY~O~Js|P3vEe((E?yRAKeX z5Av;8kSX5XGq{tFX1jpAc2Qg5gu#llaw_+!~_l4Kk{l zsM@X-SEZ_I=QMO`U&6*frS_ks6O8W{9>$=l)GBCBYJZDiQ>j(hT52h^a@@2!H+9lL zq`8emtvn1H2zAOm2RiW9iQ_P6D!~d`qi6L`Ag;jRDQfaPKNEvyc+R2b`!H;Zn#ygB znzhu*^_UT=^hhI-(lY|JvWN|XBIl*hfk)0OF=#5q3YtmI8!>o_oP5vk#Go0TbIAEH zhE0)Exvi0tRx6*vOinDy>9H&_>kCMVS9oayy{|kCrE6&{T32w3dJx zYUMeY4J!Q7M)ctyp<0>1{HMado*n)i22F)uL2Kc!p;m6iY*68sHX00n_3ngP89viy z!Bkf(&xf-HT@DGTm22S5NYu(>K&^bAvINs^WNM`c5QSR#2&7!9mF}}qS1VI2wKCMI zVYO2J=v@f6Bb6)mWDH-f^j?nUEv;kP)jAZ*?_t%3Dwf}Z4uL5eji!pu;G6EUMJ zmLZm4iY4AiD3;-Od@=1+%vY)aAA}AKDVE4!HN|rK*q8wonq|8;537on@D1f+;(Ds3 z_tKB_lo`l&k|N(k=)fb~Tnw5boPy@;f)`@g)Gk4Nk16M<%JkDm0bnR$*zH6Q`uG6T6QVr zGLIRc(kl%_n%+p1%WJWLP^aHlLkHgUy%mF|60D##f>u{9@5SILYVtk*A_mRyoI}m8 zV%QWlmD?IMYblq{V@4=?N+XfdGXmvu7#jvf&YwdE9yx!5K~pJK&`ffUn_1_o$oG6Y z2F>uCL(ZcxY>J%9ZH=6?a@mEMpr|QLL`uzQl*==*kx=YB4Lb1H`Cbf~%CUlGvU5EK zPnAx-=NmC-hUXl1Zo#lAb}F|ucGgrbug0uU1eI1IC1@kc<(-)SRB~^J4m?^uj6qY$ zRnS@jYABa`FdJ0(rH$yrKSJg519W_ik``)st8%lXL@ zSJeC@KK#y2xLL#69SfY@l~z}fG@hN$K0iA@Ws%fA@LF!uO?pp4c>0K1q(7oy`mdr z&h3`hV9*rZ6f|cKd^3hk?SU1xwg(_|%g4^_91VZh5JUs-{~udb{NwYz$Ot zAD2!rM9Xhs&{S#_G$*w$V%St_6}FaIO0;|#GeG558i+Kvk%*SBV*{biynhcJcuU2U z*~p4SC0Ic-&%Ebi@Dw%qo-f3p8J=^fxg5i$sHxo6s98(2JRLJa(Nh|Ul%5fYmKS2f zpvZYXbl{OQg+Ws(R?tjx<}rARoP5u>VbBcEIpn+^!=}io+}6lRifG9-Ek3-7k?UwGd(H1QiB$q8;SyQ!~1FB`XUBj~FC#7r|Mjjit zoaxHt7!L(m~GRp;~8uf3QVs(>P9H1Tpa%0c+qLj8xRsx|}p5`E9t zFQ3OerpobmphH9YB{F19zx-Rh`SKT7q$vsxyOHLIn18^aDcUJ$&YpPE9Avjg?THn( zwkIG&%-I+|ML>yPeI>3TV*Xr4RTD8IxcTyUY#3B_-wGXgMdj}>Xezr3nv>mkVc1l5 z6}FaLO2=G_8KBZD4MdvWNOa5$HW2D$+=LFi1aHBhsRS!%=E?Xq7(7KyzUMb%&q39`%L`u&Hbj)vI!=T9d9CYB3^Pe$jD#Z$#NzRusc#52S z&wqtMGd$;z^RE~-MNZ|mMowDCY@3TLyc9L1iAbp#jgGkx8wthE7!w-4X-q#RW1f^;^SDW;6rDFr)~&Mh`iYi)(!u#fd8(pm9i z_OV31FA3igX(sZqE_i;~y7is0D_UdlU+^36VyDKu`y@M;Za!nF{O@GZ3=ALKchk_0 zdxv&C5PQcvJ`fw)wR`AO+hXNrK{WYkMIG+U0GvX*W={ysYvrN|&&ywZxo-J-K)hmk zcWn9All}L-@4#HQ!hLsXcTD{sXcPEKOx0{zcWl{GXt>P%3pDks7MNPPxwlsu3VpF6 z1a+WjcgMWXzL&l1j(Hx5Z{LJQ@q(EcFuG%f^yNmbSH`zfd}C+ci1#N78#|?mykQsf z+1S#PTeqqY>i&1a|G!DNUt(q*8s6OpOGmk!JCif%tdY$XN;{qA-dsLulm?wCnMAg) znCLS~)`AJ}BSF*5bf1}lKRXVyz5qqhnPO(*qGzGBzI5)?L;;GHH3O`wdh}MU9#vlu zM7KmUbSoF*D6R=D1yAHPA@^Cs*MtH~!J%DU2kzfKylZgi^S2FM`M`m}ox{5xUKL&p zP87iaDP3sfNQd%ru(C$3yyaj8wBs%ZtIQ+JHn|p9pB&%R&e|w1c z(yO4!T()3C#e^2YVj4JHuB(BAT8S0CQwci}7qzxi-p>7{Kop&^LrShYguhdR^8+53ghjo3U zF)~=~5>Js>q)6l7+u= z9pkX@khg^QjTXg11gnp~BW!NL>tEf*GJ_C=EnP!$>X$z6%=&rD(5)4!o6l zEe1^`SV1!t?H&xC+F$TJAHbj)o^z=AKQL^Hn#ygBnzb$lUWXZ>=qZgvO3w%`2HuSg zgCggrp#zVcyD?}g#R{59&V3j>MNYow-@~98o^#0gBMh4&r*c~(Cw(#S0A_-srZf>L zHKVy0_*ZNs6gyvs4m@_Y9aiVssGynbJRF0k*va?21B0g6sh~ORJQ2gD*r~8JcGkQY zxEixU5mZ`yUvxXJa24%?k>18MCH`OCLBzzS}xLLzO@Ncs9r z)gs57dv(Z>-@xh$RTiIx4uQ#dDz8NT6J~}gk%$>hj+}+jEOgs^wN~OwKM(+4ksQX{ zrK;`Ep+iH8Br;x2k+esR>lK>hG=0u7MadtE3rzA-%wz>nRwbJcN49lTw8uk-%4m;R zl@zWus7fA$?E9)DUIHrxp})9<;Rr$tvFK1!M?rJ8j>|D@YU`-5wVewgOP-G5Q<;_c z)%OcEWXV6tsA{t0bf2(w>5?R4KUnX$E`$!F$=Dd!x8}n`B@fSc9pmuuGH4n4dMJvA z3Yx>ik7C#q4;8k?LrR$ZIA(w%qBIaG5hD>MAH)Vion7Ax9e8W>;}|rRU8(^4~Bc6g{PpNa-1YFxh+rQX(jFj)M+7a?Zk_ zsT3<{COKmmJVj2v=Zi6DhUXk|o`PXhE0Gek5n=Mn znEzCApMnlNT7DOUrjo0mwFJ}4^B69EhHdJ zJ_T<^B21nN!sOG+66Aek!lVZfg)lkwNKcq_pN+mSdBSp*Fd1qVl`t6s7Gez?)Pza- zdNhQ|vEyDH!ej@KEOfd_mBoe7Aut(Fm_GW?b= zOrDLoOI6!16iSl1d+Qz7Q?6s>{Yyi)PL6=O zSAu=(qwr8k$S=8$d4!~R_!6`XEg2LK6*Py3!x%QjLxrvJkWwgrgBhTRC=EnP#7Gp% zsYfAMpiZ+VLkHes{T2+GO0a@vo@O71!BblfzUM12Xolw;YMzN?lSV1$%c_jui>ZfoqUsZdTn8d(u3f=Vlq60{M8@)*p2D!E5M2OcdKVbD}^6||Os8Vcpfm<=lY z(nf>fuil+dD8nb)ESTyFWej$ex+qfK;af+*n~^A#r-4Fwl(GbQADKew0Ysrt_Cw0$ zt&{Gv(N-wunFBQi%Gt@qp;is+lOJ_&oDAW1n2AiU|M_kC;!PDM$BtihD3aG=b%ZK| zS3`%uL{1INE~X0EJk?hrCyL%>ZSC9jM)(^@ghwnv3cnhZARh*QdQ0L8Q=)hZzFUO#%1S@FfdGk&Tp4wCJJ--EmW_Zq_<~5UwlpNET6^fwJN~8pBL~`7Y`A;QxD|Fz|@&*i=O0I&|5>P{O z{1j$`3cs|`VEC(dCnU%42{j9*y5x8zY^ZhBBOp0$g*PLS98U+y@gvF-;U6y>BB{-?pp1tN2Y79mkSqb;ypd zVzq=Sg$JQSU;@6KR~G+-nW4%eVn&x8Lma?lN4$}c9mDVVvSZskWQRwU*D27UQfa8` zE=Xjsn(R0*D*Ubx9@~Q70IuX5Z8O#EHgMm82&-3qR6DS!Qbb$mMwKIzoQOeFLFe`?d%7^u`5(h0_1c@qXr zrB*?6Qo94grc$f0wbW7y*e5UpRBok#NOK#B0`?F#5b8AUKIp((7@okOsRS!%t@2EO z4@7u%$9?Wsov&l?6gByt|1S)h;W>wz|B7K#)KqS3)U2g|{Sq@m(Nh|Ul%5eNV3Xz} z%QZ#L@z8-s&e<3=m0|_WBe%nC(NX(dvEHll#-!~Ca`y9YY(X!$)1no6#M))G)d0s9eVg9^X2(O~$icPA9E z@VOlern&;QKXd{fP{4i)Z$_eky&V*=e^r(s?;}&dJb)+^u(k!B0_Hv&bps;pep3lIb z8J=^fc{GMiQB%3CQL~mBc06W;qNg+xDLo@l!&YO%pvZYTbl{QmeHb*AVg=14=Z7$O zs&4W<&tT9D&pG709K)u_sod7cNvmPkU?wPPN)wS%Ga5DQ)7VHTcHRLUcE0Gek5jE^}%zrAmzlRPy zTDBaEEV)#26||OszfAN$z|-RYZfW^bJcnX7sPIc04TisZcR~#dpX0G$s;go1V8^7N zhzHcLBjL?R)UY!^4Le#{g1nDR4f6n^P{YoFl*{|U+-IY$hRsi&xT5A~P~ofV!_6Aj z!>)1f2nz#`$}KaN_AA0;%C$PwuwJa5Q01@(Is_)+nY_|yV`iw*h?vpTuvuXiAaYo> zR-lJrZ~3at)tI|fmAw)=G$e>2POU_NUSbh7k5E44O)83%*2dP^pr*-rDp^}*fwk!6gfW(9eCvY7zRzHSV1$% zc?Skhk(2NFgBUc!a}GJ5z_2NDDz`Oq(n8pCm9H&_;x?m6-oj za#uhH9xdOAK~u?9&{_g&2w`h68&vqEjRwPCy*nXy55cxoKL-y8VHd-j zkqBXDf)KV&S%SQeObGJ;q7cHahLlSo%zZZ6LfC@jvgIplDq(X#2@AJtSPHvVN?~E- zQMz$PSHs4dcXbG2cVl&hDvO_n4uQ$InpYwp#mrD85;3C*VzW_}g?`7jYBP|;(D!^z z>}#0ERKa})Iy9t-Aw$+QvA>y{#D0o}mg3z1aYM@y#{Lb1rg)~HIs2^FF>Gp|rLeVS zo)E^SbRc^~ig6OZ`r=wc82h1&swRv@aFbXJ8wQo#BcTJYiY&&Usq89fPIgbhu&L}S zY%RN#Hg*nXfJ(145NUcN(Z&+kK&TVE_0WNr;4B7BC0Ic-Pw+mB!Bf=adwwkj&G4K< z&D$_+ikix8jheNzv3oHi6g{PpNa-1YHuhy~7!*05f(|@#eg}i5QmmkvDgfc+Mf`Z!v6&oXTyDoU}GJuCvaCQJRR9n$c)uhhZb3*f|F}@Ys1A22JHyK{MI8 z0)wa6$@lzB44UCNhn?@kuqk#bw>5Uw)W+6hR;b!3twc)DMzpaa=0BC(OQ8dgmRDiW zRB{!xmVg@C*vBy&RQRQh2E$*yJE4t*&+%9=)wQuZU=y#Ojt8`{Tj0$|w6WEojoqd! zLEgjKSckc|b9+ht#@L*$uGO)FyRSM>df>o4d-m_U?zO$QcXi2+4CTF6)?P@O3FqtL zvs$6%z)>im-j#z&p zofW@Z8cXE+lHIYSnaIbw;Q3|i)_2CPXpO;t!S5G}of`9Q;ObnudD&9=-^tJl>?(tU zJBN2Y3}HLC@1~(0_YRl#4efd$_MYXjp#&{upxv_5fda!WC^6uF3ttb2M4~_Zj=-n~lXs%aAxwBKcnK$fW zJ{wzla_d(0>9zmPwPMoWbgq3t?*}z1NuX-Spd#$F=E38jH6I?W1rx*rJlk5bj)i~L zm(FcX6rlE4GvJjfEAP_EO7*%fx+R*STe+r2ak=0ZFg|&?z&qL3f>>FcW;Em_RxjjSD4SZka%??@({HA-uo zDFwr}MVTtW$AfdpqMgnZ7Wd|JS=-2_O3tLePh^Tlp>$J8E>f0IbJm#C*ElVGM%KtD z>|7pD#BJ(E!A|rKz>BH*T+RkJjo$R;k~3~e$(bt6$HC@CXwa%&7V{Z+)o$mK@t#C- zqj(qGXa;}tTT0HXUVzEwY$NdIPN%(KB<*amKfbv)m+vp_bfy*Te0m_B%=Py}#{vKz zA&(dt!#xt;l(x-yGLtA2U?5;mb?^_g<&A+{-i~LC%M1wRc&8P9$-sZv?94Pary+uN z!Y&rPM$Jxh%IGQf0p7GtiF_6!2rcqPq92a5Kq``k7?SW$R$(KX%!%co7yRhPG>IGT zeWd17R$C*VO=Lv& zrn^U6t_uQ`4-FKIVk#Hk+%Gsa!`M8KD;V)$PnRf3JAPTZkd~~S9#5qU3HTZX7>n|9 zvNuy;*0sT43NSa^X$PR~s#&}@oq@r@T%RkRfsuldcc-S26=*5Q`qX@46J$%iJa?Qk zQ%pA?Pqq)Zm`V4i?b3NO-s(&nFb3i6CBd5dY=1BF#fmcZe{ z;(;x;naeKD<@;b#%@HkK2cTu#Hu@n$He_T99A9+o(iITTY5Cq{1-v*?hCj}O7aubb ztlenj7pD!o*R=ulV2Nq>XTVsCo#=syl(Nmzxl^2@fR_Dne}4J{kXJ%WgU*b?maLuF z95>T_W(NL%!V@z&!Tz>Fe*)&(rA3(71qjq^_qBW(haFWyh4v`1WlSU?@p8&Rl-&?Q z?~TO)FafH3(oWkDe_06zfjzloI@=2zP^Dp(s1=1`PerqIzo2g>myq*uqFa@KGW|V9 z3MTOu@W3<-8*I!;LaU8&19r2SIBe%c*>%01DUd}mE*P0!S=I)f2}bs^(wbtAGes5@ zn8CorbT*ZSxnaj`*!~(&pnx|s!6{&t4b>JfQbw;R=FTkbXg1Lgrr=O^- z$KWjSb8(jVj%G`Ii?b!ZtH#nK#Eb&PmOWdeniCY;gaav}H6Stz%9we4K)b?Z= z=qX|a!UagMb1PR_z`T)$-fkYnWJfyq;eBBvdm c>K}IbHC3H}0iXK>wOUi64y%$SPv#c?7k_q@P5=M^ literal 0 HcmV?d00001 diff --git a/master/doctrees/functionlib/dsplib/spacetobatchnd.doctree b/master/doctrees/functionlib/dsplib/spacetobatchnd.doctree new file mode 100644 index 0000000000000000000000000000000000000000..14e9bb422d8502161355f8861fd4764adab556b5 GIT binary patch literal 97822 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 cqIa6d*F;%wKs*ny(CSFBJS^LSr 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 max\_val` 时输出 max_val,否则输出 :math:`x` 本身。 + +- ``Gelu`` - 高斯误差线性单元(Gaussian Error Linear Unit),是一种平滑的非线性激活函数,结合了 ``ReLU`` 与概率特性。 该函数支持精确计算及非近似计算模式,近似算法由 *Hendrycks & Gimpel (2016)* 提出,用以替代精确形式 :math:`output_i=x\Phi(x)` ,计算速度更快且精度损失极小。 + + .. math:: + + \begin{aligned} + output_i = + \begin{cases} + 0.5\,input_i \Bigl[ 1 + \tanh\!\Bigl( + \sqrt{\frac{2}{\pi}}\,(input_i + 0.044715\,input_i^3) + \Bigr) \Bigr], & flag = true, \\[6pt] + input_i \,\Phi(input_i) + = \tfrac{1}{2}x \Bigl[ + 1 + \mathrm{erf}\!\Bigl(\tfrac{input_i}{\sqrt{2}}\Bigr) + \Bigr], & flag = false. + \end{cases} + \end{aligned} + + + 其中 :math:`\Phi(x)` 为标准正态分布的累积分布函数。 +- ``Softplus`` - ``ReLU`` 的平滑近似形式,能在零点处保持可导性。 + + .. math:: + + output_i = + \begin{cases} + input_i, & input_i \gt 88.0 \\ + \ln(1 + e^{input_i}), & \text{otherwise} + \end{cases} + +- ``Elu`` - 在输入为正时保持线性,在输入为负时呈指数衰减,可缓解 ReLU 的“死亡神经元”问题。 + + .. math:: + + output_i = + \begin{cases} + input_i, & input_i \ge 0 \\ + \alpha (e^{input_i} - 1), & input_i < 0 + \end{cases} + + 其中 :math:`\alpha` 为超参数,通常取 :math:`\alpha = 1.0`。 +- ``Celu`` - 连续指数线性单元(Continuously Differentiable ELU),是 ``ELU`` 的改进版本,保证在零点处连续可导。 + + .. math:: + output_i = + \begin{cases} + input_i, & input_i \ge 0 \\ + \alpha (e^{\frac{input_i}{alpha}} - 1), & input_i < 0 + \end{cases} + + 其中 :math:`\alpha` 为可调超参数,用于控制负区间的平滑程度。 +- ``HardShrink`` - 硬收缩激活函数(Hard Shrinkage),用于稀疏化输出。 + + .. math:: + + output_i = + \begin{cases} + input_i, & \text{if } |input_i| > \lambda \\ + 0, & \text{otherwise} + \end{cases} + + 其中 :math:`\lambda` 为阈值常数。 + +- ``SoftShrink`` - 软收缩激活函数(Soft Shrinkage),与 ``HardShrink`` 类似,但收缩过程更加平滑。 + + .. math:: + + output_i = + \begin{cases} + input_i - \lambda, & \text{if } input_i > \lambda \\ + input_i + \lambda, & \text{if } input_i < -\lambda \\ + 0, & \text{otherwise} + \end{cases} + +- ``SoftsignOpt`` - 优化的软符号函数(Optimized Softsign),是一种平滑的压缩函数,用于将输入映射到有限区间。 + + .. math:: + + output_i = \frac{input_i}{1 + |input_i|} + +输入: + - **Input0** - 输入数据地址。 + - **length** - 数组长度。 + - **args(部分激活函数)** - 激活函数计算参数(仅适用于部分函数)。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 计算结果地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void i8_relu_s(int8_t* Input0, int8_t* output,int length, int core_mask) +.. c:function:: void fp_relu_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_relu_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_relu6_s(int8_t* Input0, int8_t* output,int length, int core_mask) +.. c:function:: void fp_relu6_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_relu6_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_clip_s(int8_t* Input0, int8_t* output,int length, int8_t min_val, int8_t max_val, int core_mask) +.. c:function:: void fp_clip_s(float* Input0, float* output,int length, float min_val, float max_val, int core_mask) +.. c:function:: void hp_clip_s(half* Input0, half* output,int length, half min_val, half max_val, int core_mask) +.. c:function:: void i8_lrelu_s(int8_t* Input0, int8_t* output,int length, float alpha, int core_mask) +.. c:function:: void fp_lrelu_s(float* Input0, float* output,int length, float alpha, int core_mask) +.. c:function:: void hp_lrelu_s(half* Input0, half* output,int length, half alpha, int core_mask) +.. c:function:: void i8_sigmoid_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_sigmoid_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_sigmoid_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_tanh_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_tanh_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_tanh_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_hsigmoid_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_hsigmoid_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_hsigmoid_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_swish_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_swish_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_swish_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_hswish_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_hswish_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_hswish_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_hardtanh_s(int8_t* Input0, int8_t* output,int length, int8_t min_val, int8_t max_val, int core_mask) +.. c:function:: void fp_hardtanh_s(float* Input0, float* output,int length, float min_val, float max_val, int core_mask) +.. c:function:: void hp_hardtanh_s(half* Input0, half* output,int length, half min_val, half max_val, int core_mask) +.. c:function:: void i8_gelu_s(int8_t* Input0, float* output,int length, int approximate, int core_mask) +.. c:function:: void fp_gelu_s(float* Input0, float* output,int length, int approximate, int core_mask) +.. c:function:: void hp_gelu_s(half* Input0, half* output,int length, int approximate, int core_mask) +.. c:function:: void i8_softplus_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_softplus_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_softplus_s(half* Input0, half* output,int length, int core_mask) +.. c:function:: void i8_elu_s(int8_t* Input0, float* output,int length, float alpha, int core_mask) +.. c:function:: void fp_elu_s(float* Input0, float* output,int length, float alpha, int core_mask) +.. c:function:: void hp_elu_s(half* Input0, half* output,int length, half alpha, int core_mask) +.. c:function:: void i8_celu_s(int8_t* Input0, float* output,int length, float alpha, int core_mask) +.. c:function:: void fp_celu_s(float* Input0, float* output,int length, float alpha, int core_mask) +.. c:function:: void hp_celu_s(half* Input0, half* output,int length, half alpha, int core_mask) +.. c:function:: void i8_hardshrink_s(int8_t* Input0, int8_t* output,int length, int8_t lambd, int core_mask) +.. c:function:: void fp_hardshrink_s(float* Input0, float* output,int length, float lambd, int core_mask) +.. c:function:: void hp_hardshrink_s(half* Input0, half* output,int length, half lambd, int core_mask) +.. c:function:: void i8_softshrink_s(int8_t* Input0, int8_t* output,int length, int8_t lambd, int core_mask) +.. c:function:: void fp_softshrink_s(float* Input0, float* output,int length, float lambd, int core_mask) +.. c:function:: void hp_softshrink_s(half* Input0, half* output,int length, half lambd, int core_mask) +.. c:function:: void i8_softsignopt_s(int8_t* Input0, float* output,int length, int core_mask) +.. c:function:: void fp_softsignopt_s(float* Input0, float* output,int length, int core_mask) +.. c:function:: void hp_softsignopt_s(half* Input0, half* output,int length, int core_mask) + +**C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *output = (float *)0xC0000000; + int length = 1000; + int core_mask = 0xff; + fp_tanh_s(input0, output, length, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void i8_relu_p(int8_t* Input0, int8_t* output,int length) +.. c:function:: void fp_relu_p(float* Input0, float* output,int length) +.. c:function:: void hp_relu_p(half* Input0, half* output,int length) +.. c:function:: void i8_relu6_p(int8_t* Input0, int8_t* output,int length) +.. c:function:: void fp_relu6_p(float* Input0, float* output,int length) +.. c:function:: void hp_relu6_p(half* Input0, half* output,int length) +.. c:function:: void i8_clip_p(int8_t* Input0, int8_t* output,int length, int8_t min_val, int8_t max_val) +.. c:function:: void fp_clip_p(float* Input0, float* output,int length, float min_val, float max_val) +.. c:function:: void hp_clip_p(half* Input0, half* output,int length, half min_val, half max_val) +.. c:function:: void i8_lrelu_p(int8_t* Input0, int8_t* output,int length, float alpha) +.. c:function:: void fp_lrelu_p(float* Input0, float* output,int length, float alpha) +.. c:function:: void hp_lrelu_p(half* Input0, half* output,int length, half alpha) +.. c:function:: void i8_sigmoid_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_sigmoid_p(float* Input0, float* output,int length) +.. c:function:: void hp_sigmoid_p(half* Input0, half* output,int length) +.. c:function:: void i8_tanh_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_tanh_p(float* Input0, float* output,int length) +.. c:function:: void hp_tanh_p(half* Input0, half* output,int length) +.. c:function:: void i8_hsigmoid_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_hsigmoid_p(float* Input0, float* output,int length) +.. c:function:: void hp_hsigmoid_p(half* Input0, half* output,int length) +.. c:function:: void i8_swish_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_swish_p(float* Input0, float* output,int length) +.. c:function:: void hp_swish_p(half* Input0, half* output,int length) +.. c:function:: void i8_hswish_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_hswish_p(float* Input0, float* output,int length) +.. c:function:: void hp_hswish_p(half* Input0, half* output,int length) +.. c:function:: void i8_hardtanh_p(int8_t* Input0, int8_t* output,int length, int8_t min_val, int8_t max_val) +.. c:function:: void fp_hardtanh_p(float* Input0, float* output,int length, float min_val, float max_val) +.. c:function:: void hp_hardtanh_p(half* Input0, half* output,int length, half min_val, half max_val) +.. c:function:: void i8_gelu_p(int8_t* Input0, float* output,int length, int approximate) +.. c:function:: void fp_gelu_p(float* Input0, float* output,int length, int approximate) +.. c:function:: void hp_gelu_p(half* Input0, half* output,int length, int approximate) +.. c:function:: void i8_softplus_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_softplus_p(float* Input0, float* output,int length) +.. c:function:: void hp_softplus_p(half* Input0, half* output,int length) +.. c:function:: void i8_elu_p(int8_t* Input0, float* output,int length, float alpha) +.. c:function:: void fp_elu_p(float* Input0, float* output,int length, float alpha) +.. c:function:: void hp_elu_p(half* Input0, half* output,int length, half alpha) +.. c:function:: void i8_celu_p(int8_t* Input0, float* output,int length, float alpha) +.. c:function:: void fp_celu_p(float* Input0, float* output,int length, float alpha) +.. c:function:: void hp_celu_p(half* Input0, half* output,int length, half alpha) +.. c:function:: void i8_hardshrink_p(int8_t* Input0, int8_t* output,int length, int8_t lambd) +.. c:function:: void fp_hardshrink_p(float* Input0, float* output,int length, float lambd) +.. c:function:: void hp_hardshrink_p(half* Input0, half* output,int length, half lambd) +.. c:function:: void i8_softshrink_p(int8_t* Input0, int8_t* output,int length, int8_t lambd) +.. c:function:: void fp_softshrink_p(float* Input0, float* output,int length, float lambd) +.. c:function:: void hp_softshrink_p(half* Input0, half* output,int length, half lambd) +.. c:function:: void i8_softsignopt_p(int8_t* Input0, float* output,int length) +.. c:function:: void fp_softsignopt_p(float* Input0, float* output,int length) +.. c:function:: void hp_softsignopt_p(half* Input0, half* output,int length) + +**C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10000000; //input在DDR空间 + float *output = (float *)0x10004000; + int length = 1000; + fp_tanh_p(input0, output, length); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/adamweightdecay.rst.txt b/master/html/_sources/functionlib/dsplib/adamweightdecay.rst.txt new file mode 100644 index 0000000..a83c44d --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/adamweightdecay.rst.txt @@ -0,0 +1,108 @@ +AdamWeightDecay +================= +对权重张量执行 Adam Weight Decay 优化更新。 + + .. math:: + + \begin{aligned} + m_t &= \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \\ + v_t &= \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \\ + \hat{m}_t &= \frac{m_t}{\sqrt{v_t} + \epsilon} \\ + var_t &= var_{t-1} - lr \cdot (\hat{m}_t + decay \cdot var_{t-1}) + \end{aligned} + + + 输入: + - **var** - 待更新权重张量首地址。 + - **m** - 一阶动量张量首地址。 + - **v** - 二阶动量张量首地址。 + - **gradient** - 梯度张量首地址。 + - **lr** - 学习率。 + - **beta1** - 一阶动量衰减系数。 + - **beta2** - 二阶动量衰减系数。 + - **epsilon** - 数值稳定项。 + - **decay** - 权重衰减系数。 + - **start** - 参与计算的起始索引(闭区间)。 + - **end** - 参与计算的结束索引(开区间)。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **var** - 原地写回更新后的权重张量。 + - **m** - 原地写回更新后的一阶动量张量。 + - **v** - 原地写回更新后的二阶动量张量。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + +**共享存储版本:** + +.. c:function:: void hp_adamweightdecay_s(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask) +.. c:function:: void fp_adamweightdecay_s(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 17 + + // FT78NE 多核示例 + #include + + int main(void) { + float *var = (float *)0xA0000000; // DDR 存储 + float *m = (float *)0xB0000000; + float *v = (float *)0xC0000000; + float *gradient = (float *)0xD0000000; + int start = 0; + int end = 4096; + int core_mask = 0xff; + float lr = 1e-3f; + float beta1 = 0.9f; + float beta2 = 0.999f; + float epsilon = 1e-8f; + float decay = 1e-2f; + fp_adamweightdecay_s(var, m, v, gradient, lr, + beta1, beta2, epsilon, decay, + start, end, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_adamweightdecay_p(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length) +.. c:function:: void fp_adamweightdecay_p(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length) + + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 15 + + // MT7004 单核示例 + #include + + int main(void) { + half *var = (half *)0x10000000; // L2 存储 + half *m = (half *)0x10002000; + half *v = (half *)0x10004000; + half *gradient = (half *)0x10006000; + int length = 2048; + float lr = 5e-4f; + float beta1 = 0.9f; + float beta2 = 0.999f; + float epsilon = 1e-6f; + float decay = 5e-3f; + hp_adamweightdecay_p(var, m, v, gradient, lr, + beta1, beta2, epsilon, decay, + length); + return 0; + } + diff --git a/master/html/_sources/functionlib/dsplib/adder.rst.txt b/master/html/_sources/functionlib/dsplib/adder.rst.txt new file mode 100644 index 0000000..75a9e7e --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/adder.rst.txt @@ -0,0 +1,170 @@ +Adder +================= + +Adder是一种卷积替代算子,它使用L1距离度量(绝对差的和)代替传统卷积中的点积操作。与标准卷积不同,Adder通过计算特征与卷积核之间的绝对差的负和来进行特征提取。假定输入X,filter表示为F,它按以下公式计算: + +.. math:: + + Y(m,n,t) = - \sum_{i=0}^{d} \sum_{j=0}^{d} \sum_{k=0}^{C_{in}} |X(m+i, n+j, k) - F(i,j,k,t)| + +输入: + - **input_x** - 输入数据的地址 + - **input_w** - 输入卷积核权重的地址 + - **bias** - 输入偏置的地址 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**AdderParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct AdderParameter { + void* workspace_; // 用于存放中间计算结果 + int output_batch_; // 输出数据总批次 + int input_batch_; // 输入数据总批次 + int input_h_; // 输入数据h维度大小 + int input_w_; // 输入数据w维度大小 + int output_h_; // 输出数据h维度大小 + int output_w_; // 输出数据w维度大小 + int input_channel_; // 输入数据通道数 + int output_channel_; // 输出数据通道数 + int kernel_h_; // 卷积核h维度大小 + int kernel_w_; // 卷积核w维度大小 + int group_; // 组数 + int pad_l_; // 左填充大小 + int pad_u_; // 上填充大小 + int dilation_h_; // 卷积核h维度膨胀尺寸大小 + int dilation_w_; // 卷积核w维度膨胀尺寸大小 + int stride_h_; // 卷积核h维度步长 + int stride_w_; // 卷积核w维度步长 + int buffer_size_; // 为分块计算所分配的缓存大小 + } AdderParameter; + +输出: + - **out_y** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void i8_adder_s(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, AdderParameter *param, int core_mask) +.. c:function:: void hp_adder_s(half* input_x, half* input_w, half* out_y, half* bias, AdderParameter *param, int core_mask) +.. c:function:: void fp_adder_s(float* input_x, float* input_w, float* out_y, float* bias, AdderParameter *param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 32 + + void TestAdderSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float* input_data = (float*)0x88000000; + float* weight = (float*)0x89000000; + float* output_data = (float*)0x90000000; + float* bias_data = (float*)0x91000000; + AdderParameter* param = (AdderParameter*)0x92000000; + if (logic_core_id == 0) { + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0x10000000; // workspace空间需分配在AM内,计算过程中会将数据搬运到workspace空间内进行计算 + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_adder_s(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 4; + int out_channel = 4; + int groups = 4; + int input_shape[4] = {1, 30, 30, in_channel}; // NHWC + int weight_shape[4] = {out_channel, 3, 3, in_channel / groups}; + int output_shape[4] = {1, 10, 10, out_channel}; // NHWC + int stride[2] = {2, 2}; + int padding[4] = {1, 1, 1, 1}; + int dilation[2]= {2, 2}; + float bias[4] = {0, 0, 0, 0}; + int core_mask = 0b1111; + TestAdderSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_adder_p(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask) +.. c:function:: void hp_adder_p(half* input_x, half* input_w, half* out_y, half* bias, ConvParameter *conv_param, int core_mask) +.. c:function:: void fp_adder_p(float* input_x, float* input_w, float* out_y, float* bias, ConvParameter *conv_param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 27 + + void TestAdderL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + float* input_data = (float*)0x10010000; // 私有存储版本地址设置在AM内 + float* weight = (float*)0x10020000; + float* output_data = (float*)0x10030000; + float* bias_data = (float*)0x10040000; + AdderParameter* param = (AdderParameter*)0x10060000; + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0x10070000; + param->buffer_size_ = 2048; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小 + fp_adder_p(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 4; + int out_channel = 4; + int groups = 4; + int input_shape[4] = {1, 30, 30, in_channel}; // NHWC + int weight_shape[4] = {out_channel, 3, 3, in_channel / groups}; + int output_shape[4] = {1, 10, 10, out_channel}; // NHWC + int stride[2] = {2, 2}; + int padding[4] = {1, 1, 1, 1}; + int dilation[2]= {2, 2}; + float bias[4] = {0, 0, 0, 0}; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestAdderL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/applymomentum.rst.txt b/master/html/_sources/functionlib/dsplib/applymomentum.rst.txt new file mode 100644 index 0000000..4c291ab --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/applymomentum.rst.txt @@ -0,0 +1,101 @@ +ApplyMomentum +================= +对权重张量执行 Momentum/改进动量优化更新。 + + .. math:: + + \begin{aligned} + accu_t &= moment \cdot accu_{t-1} + g_t \\ + update_t &= \begin{cases} + (accu_t \cdot moment + g_t), & \text{if nesterov = True} \\ + accu_t, & \text{otherwise} + \end{cases} \\ + weight_t &= weight_{t-1} - learning\_rate \cdot update_t + \end{aligned} + + + 输入: + - **weight** - 待更新权重张量首地址。 + - **accumulate** - 动量累积张量首地址。 + - **gradient** - 梯度张量首地址。 + - **learning_rate** - 学习率。 + - **moment** - 动量系数。 + - **nesterov** - 是否启用 Nesterov 动量。 + - **start** - 参与计算的起始索引(闭区间)。 + - **end** - 参与计算的结束索引(开区间)。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **weight** - 原地写回更新后的权重张量。 + - **accumulate** - 原地写回更新后的动量张量。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + + +**共享存储版本:** + +.. c:function:: void hp_applymomentum_s(half *weight, half *accumulate, const half *gradient, float learning_rate, float moment, bool nesterov, int start, int end, int core_mask) +.. c:function:: void fp_applymomentum_s(float *weight, float *accumulate, const float *gradient, float learning_rate, float moment, bool nesterov, int start, int end, int core_mask) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 15 + + // FT78NE 多核示例 + #include + #include + + int main(void) { + float *weight = (float *)0xA0000000; // DDR 存储 + float *accumulate = (float *)0xB0000000; + float *gradient = (float *)0xC0000000; + int start = 0; + int end = 4096; + int core_mask = 0xff; + float learning_rate = 1e-2f; + float moment = 0.99f; + bool nesterov = false; + fp_applymomentum_s(weight, accumulate, gradient, + learning_rate, moment, nesterov, + start, end, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_applymomentum_p(half *weight, half *accumulate, const half *gradient, float learning_rate, float moment, bool nesterov, int length) +.. c:function:: void fp_applymomentum_p(float *weight, float *accumulate, const float *gradient, float learning_rate, float moment, bool nesterov, int length) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 13 + + // MT7004 单核示例 + #include + #include + + int main(void) { + half *weight = (half *)0x10000000; // L2 存储 + half *accumulate = (half *)0x10002000; + half *gradient = (half *)0x10004000; + int length = 2048; + float learning_rate = 5e-3f; + float moment = 0.9f; + bool nesterov = true; + hp_applymomentum_p(weight, accumulate, gradient, + learning_rate, moment, nesterov, + length); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/assert.rst.txt b/master/html/_sources/functionlib/dsplib/assert.rst.txt new file mode 100644 index 0000000..2efdcd0 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/assert.rst.txt @@ -0,0 +1,45 @@ +Assert +================= + + +.. c:function:: void assert(bool* Input, bool* output) + +判断输入是否为 True。 + +.. math:: + + output_i = \begin{cases} + \text{True}, & \text{if } Input_i = \text{True} \\ + \text{False}, & \text{if } Input_i = \text{False} + \end{cases} + +输入: + - **Input** - 输入数据地址(布尔类型)。 + +输出: + - **output** - 计算结果地址(布尔类型)。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - 本算子只有一个版本 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE/MT7004 示例(共享存储) + #include + #include + + int main(int argc, char* argv[]) { + bool *input = (bool *)0xA0000000; + bool *output = (bool *)0xC0000000; + assert_s(input, output); + return 0; + } + diff --git a/master/html/_sources/functionlib/dsplib/attention.rst.txt b/master/html/_sources/functionlib/dsplib/attention.rst.txt new file mode 100644 index 0000000..5863eea --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/attention.rst.txt @@ -0,0 +1,79 @@ +Attention +================= + +多头缩放点积注意力机制(Scaled Dot-Product Attention) + +.. math:: + + \text{Attention}(Q, K, V) = \operatorname{softmax}\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V + +输入: + - **Q** - 查询矩阵地址(行优先),形状 :math:`[B, H, L, D]` 展平。 + - **K** - 键矩阵地址(行优先),形状 :math:`[B, H, L, D]` 展平。 + - **V** - 值矩阵地址(行优先),形状 :math:`[B, H, L, D]` 展平。 + - **batch_size (B)** - 批大小。 + - **seq_len (L)** - 序列长度。 + - **head_num (H)** - 多头数量。 + - **head_dim (D)** - 每头通道维数。 + - **QK, softmax_out** - 中间缓冲区地址,容量不小于 :math:`B\times H\times L\times L`。 + - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 输出地址(行优先),形状 :math:`[B, H, L, D]` 展平。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - 当前实现基于 fp32;输入/中间/输出缓冲区不应重叠。 + - 内存布局为行优先(row-major)。 + +**共享存储版本:** + +.. c:function:: void fp_attention_s(float *Q, float *K, float *V, float *output, int batch_size, int seq_len, int head_num, int head_dim, float *QK, float *softmax_out, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 13 + + #include + + int main(int argc, char* argv[]) { + int B = 2, L = 128, H = 8, D = 64; + float *Q = (float *)0xA0000000; // DDR + float *K = (float *)0xA1000000; // DDR + float *V = (float *)0xA2000000; // DDR + float *O = (float *)0xA3000000; // DDR + float *QK = (float *)0xA4000000; // DDR + float *SM = (float *)0xA5000000; // DDR + int core_mask = 0xff; + fp_attention_s(Q, K, V, O, B, L, H, D, QK, SM, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void fp_attention_p(float *Q, float *K, float *V, float *output, int batch_size, int seq_len, int head_num, int head_dim, float *QK, float *softmax_out) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 12 + + #include + + int main(int argc, char* argv[]) { + int B = 1, L = 64, H = 4, D = 32; + float *Q = (float *)0x10000000; // L2 + float *K = (float *)0x10040000; // L2 + float *V = (float *)0x10080000; // L2 + float *O = (float *)0x100C0000; // L2 + float *QK = (float *)0x10100000; // L2 + float *SM = (float *)0x10200000; // L2 + fp_attention_p(Q, K, V, O, B, L, H, D, QK, SM); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/avgpoolinggrad.rst.txt b/master/html/_sources/functionlib/dsplib/avgpoolinggrad.rst.txt new file mode 100644 index 0000000..9a4093d --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/avgpoolinggrad.rst.txt @@ -0,0 +1,120 @@ +AvgPoolingGrad +================= +根据输入梯度对平均池化前的特征图计算反向传播梯度。 + + .. math:: + + output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w} + + 其中 :math:`(y_h, y_w)` 与 :math:`(x_h, x_w)` 之间满足窗口与步长的映射关系。 + + 输入: + - **input** - 反向传播输入梯度张量首地址。 + - **output** - 反向传播输出梯度张量首地址。 + - **batch** - 批大小。 + - **output_h** - 池化输出高度。 + - **output_w** - 池化输出宽度。 + - **channel** - 通道数。 + - **input_w** - 池化输入宽度。 + - **input_h** - 池化输入高度。 + - **stride_w** - 水平步长。 + - **stride_h** - 垂直步长。 + - **pad_l** - 左侧填充大小。 + - **pad_u** - 上侧填充大小。 + - **window_w** - 池化窗口宽度。 + - **window_h** - 池化窗口高度。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 原地累加平均池化反向传播梯度。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + + +**共享存储版本:** + +.. c:function:: void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask) +.. c:function:: void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 20 + + // FT78NE 多核示例 + #include + + int main(void) { + const float *input = (const float *)0xA0000000; // DDR 存储 + float *output = (float *)0xB0000000; + int batch = 16; + int output_h = 7; + int output_w = 7; + int channel = 64; + int input_w = 14; + int input_h = 14; + int stride_w = 2; + int stride_h = 2; + int pad_l = 0; + int pad_u = 0; + int window_w = 2; + int window_h = 2; + int core_mask = 0xff; + fp_avgpoolinggrad_s(input, output, batch, output_h, output_w, + channel, input_w, input_h, + stride_w, stride_h, + pad_l, pad_u, + window_w, window_h, + core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx) +.. c:function:: void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 21 + + // MT7004 单核示例 + #include + + int main(void) { + const half *input = (const half *)0x10000000; // L2 存储 + half *output = (half *)0x10004000; + int batch = 4; + int output_h = 4; + int output_w = 4; + int channel = 128; + int input_w = 8; + int input_h = 8; + int stride_w = 2; + int stride_h = 2; + int pad_l = 0; + int pad_u = 0; + int window_w = 2; + int window_h = 2; + int start_idx = 0; + int end_idx = batch * output_h * output_w * channel; + hp_avgpoolinggrad_p(input, output, batch, output_h, output_w, + channel, input_w, input_h, + stride_w, stride_h, + pad_l, pad_u, + window_w, window_h, + start_idx, end_idx); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/batchtospace.rst.txt b/master/html/_sources/functionlib/dsplib/batchtospace.rst.txt new file mode 100644 index 0000000..251c107 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/batchtospace.rst.txt @@ -0,0 +1,96 @@ +BatchToSpace +================= +将输入张量在批维度上分块并重新分布到空间维度,同时按照 ``crops`` 对输出空间范围进行裁剪。 + + .. math:: + + \begin{aligned} + N_{\text{out}} &= \frac{N}{b_h \times b_w}, \\ + H_{\text{out}} &= b_h \times H - c_{\text{top}} - c_{\text{bottom}}, \\ + W_{\text{out}} &= b_w \times W - c_{\text{left}} - c_{\text{right}}, \\ + ext{output}[n, h, w, c] &= \text{input}[n', h', w', c] + \end{aligned} + + 其中 :math:`N, H, W, C` 分别表示输入的 batch、高度、宽度和通道数;:math:`b_h, b_w` 为 ``block_size``;:math:`c_{*}` 来源于 ``crops``;:math:`n', h', w'` 由 ``BatchToSpace`` 映射关系确定。 + + 输入: + - **input** - 输入数据地址。 + - **input_shape** - 输入形状,格式为 ``[batch, height, width, channel]``。 + - **block_size** - 分块因子,格式为 ``[block_h, block_w]``。 + - **crops** - 裁剪参数,格式为 ``[top, bottom, left, right]``。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32、fp64、cplx64、cplx128、int16、int8、int32 数据类型。 + - MT7004 支持 fp32、fp16、cplx64、int16、int32 数据类型。 + + +**共享存储版本:** + +.. c:function:: void i8_batchtospace_s(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void i16_batchtospace_s(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void i32_batchtospace_s(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void hp_batchtospace_s(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void fp_batchtospace_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void dp_batchtospace_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void c64_batchtospace_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void c128_batchtospace_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) + + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + // 多核(共享存储)示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 输入在 DDR 空间 + float *output = (float *)0xB0000000; + int input_shape[4] = {400, 2, 2, 3}; + int block_size[2] = {2, 2}; + int crops[4] = {0, 0, 0, 0}; + int core_mask = 0xff; + fp_batchtospace_s(input, output, input_shape, block_size, crops, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_batchtospace_p(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void i16_batchtospace_p(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void i32_batchtospace_p(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void hp_batchtospace_p(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void fp_batchtospace_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void dp_batchtospace_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void c64_batchtospace_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void c128_batchtospace_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // 单核(私有存储)示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 输入在 L2 空间 + float *output = (float *)0x10010000; + int input_shape[4] = {400, 2, 2, 3}; + int block_size[2] = {2, 2}; + int crops[4] = {0, 0, 0, 0}; + fp_batchtospace_p(input, output, input_shape, block_size, crops, sizeof(float)); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/batchtospacend.rst.txt b/master/html/_sources/functionlib/dsplib/batchtospacend.rst.txt new file mode 100644 index 0000000..4ccc630 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/batchtospacend.rst.txt @@ -0,0 +1,91 @@ +BatchToSpaceND +================= +将输入张量的 batch 维度按 block 因子分解并重排到空间维度,随后根据 ``crops`` 参数对输出空间范围进行裁剪。 + + + - 输入形状: ``[batch, height, width, channel]`` + - ``block_size``: ``[block_h, block_w]`` + - ``crops``: ``[top, bottom, left, right]`` + + 输入: + - **input** - 输入数据地址。 + - **input_shape** - 输入形状,格式为 ``[batch, height, width, channel]``。 + - **block_size** - 分块因子,格式为 ``[block_h, block_w]``。 + - **crops** - 裁剪参数,格式为 ``[top, bottom, left, right]``。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。 + - MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。 + + +**共享存储版本:** + +.. c:function:: void i8_batchtospacend_s(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void i16_batchtospacend_s(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void i32_batchtospacend_s(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void hp_batchtospacend_s(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void fp_batchtospacend_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void dp_batchtospacend_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void c64_batchtospacend_s(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) +.. c:function:: void c128_batchtospacend_s(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size, int core_mask) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + // FT78NE 多核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 多核版本:输入放在 DDR 地址 0xA0000000 + float *output = (float *)0xB0000000; // 多核版本:输出放在 DDR 地址 0xB0000000 + int input_shape[4] = {400, 2, 2, 3}; + int block_size[2] = {2, 2}; + int crops[4] = {0, 0, 0, 0}; + int core_mask = 0xff; + fp_batchtospacend_s(input, output, input_shape, block_size, crops, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_batchtospacend_p(int8_t *input, int8_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void i16_batchtospacend_p(int16_t *input, int16_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void i32_batchtospacend_p(int32_t *input, int32_t *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void hp_batchtospacend_p(half *input, half *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void fp_batchtospacend_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void dp_batchtospacend_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void c64_batchtospacend_p(float *input, float *output, const int *input_shape, const int *block_size, const int *crops, int data_size) +.. c:function:: void c128_batchtospacend_p(double *input, double *output, const int *input_shape, const int *block_size, const int *crops, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE 单核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 单核版本:输入放在 L2 地址 0x10000000 + float *output = (float *)0x10010000; // 单核版本:输出放在 L2 地址 0x10010000 + int input_shape[4] = {400, 2, 2, 3}; + int block_size[2] = {2, 2}; + int crops[4] = {0, 0, 0, 0}; + fp_batchtospacend_p(input, output, input_shape, block_size, crops, sizeof(float)); + return 0; + } + + diff --git a/master/html/_sources/functionlib/dsplib/broadcastto.rst.txt b/master/html/_sources/functionlib/dsplib/broadcastto.rst.txt new file mode 100644 index 0000000..8866a98 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/broadcastto.rst.txt @@ -0,0 +1,84 @@ +BroadcastTo +================= +将较小张量按 N-D 规则广播到目标形状并写入输出。 + + 输入: + - **input** - 输入数据地址。 + - **input_shape** - 输入形状数组。 + - **input_shape_size** - 输入形状长度。 + - **output_shape** - 目标输出形状数组。 + - **output_shape_size** - 输出形状长度。 + - **data_size** - 单个元素字节数(例如 sizeof(float))。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。 + - MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。 + +**共享存储版本:** + +.. c:function:: void i8_broadcastto_s(int8_t *input, int8_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void i16_broadcastto_s(int16_t *input, int16_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void i32_broadcastto_s(int32_t *input, int32_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void hp_broadcastto_s(half *input, half *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void fp_broadcastto_s(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void dp_broadcastto_s(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void c64_broadcastto_s(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) +.. c:function:: void c128_broadcastto_s(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size, int core_mask) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE 多核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 输入在 DDR 地址 0xA0000000 + float *output = (float *)0xB0000000; // 输出在 DDR 地址 0xB0000000 + int input_shape[4] = {1, 50, 1, 1}; + int output_shape[4] = {10, 50, 20, 1}; + int core_mask = 0xff; + fp_broadcastto_s(input, output, input_shape, 4, output_shape, 4, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_broadcastto_p(int8_t *input, int8_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void i16_broadcastto_p(int16_t *input, int16_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void i32_broadcastto_p(int32_t *input, int32_t *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void hp_broadcastto_p(half *input, half *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void fp_broadcastto_p(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void dp_broadcastto_p(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void c64_broadcastto_p(float *input, float *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) +.. c:function:: void c128_broadcastto_p(double *input, double *output, const int *input_shape, int input_shape_size, const int *output_shape, int output_shape_size, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + // FT78NE 单核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 单核版本:输入放在 L2 地址 0x10000000 + float *output = (float *)0x10020000; // 单核版本:输出放在 L2 地址 0x10020000 + int input_shape[4] = {1, 50, 1, 1}; + int output_shape[4] = {10, 50, 20, 1}; + fp_broadcastto_p(input, output, input_shape, 4, output_shape, 4, sizeof(float)); + return 0; + } + diff --git a/master/html/_sources/functionlib/dsplib/conv2d.rst.txt b/master/html/_sources/functionlib/dsplib/conv2d.rst.txt new file mode 100644 index 0000000..0c0e537 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/conv2d.rst.txt @@ -0,0 +1,192 @@ +Conv2d +================= + +对输入 Tensor 计算二维卷积,输入的 shape 为 :math:`(N, H_{in}, W_{in}, C_{in})`,其中 :math:`N` 为 batch size,:math:`C` 为通道数,:math:`H` 为特征图的高度,:math:`W` 为特征图的宽度。 + +根据以下公式计算输出: + +.. math:: + + out(N_i, C_{out_j}) = bias(C_{out_j}) + \sum_{k=0}^{C_{in}-1} \text{ccor}(\text{weight}(C_{out_j}, k), X(N_i, k)) + +其中,:math:`bias` 为输出偏置,:math:`\text{ccor}` 为 cross-correlation 操作,:math:`weight` 为卷积核的值,:math:`X` 为输入的特征图。 + +- :math:`i` 对应 batch 数,其范围为 :math:`[0, N-1]`,其中 :math:`N` 为输入 batch。 +- :math:`j` 对应输出通道,其范围为 :math:`[0, C_{out}-1]`,其中 :math:`C_{out}` 为输出通道数,该值也等于卷积核的个数。 +- :math:`k` 对应输入通道数,其范围为 :math:`[0, C_{in}-1]`,其中 :math:`C_{in}` 为输入通道数,该值也等于卷积核的通道数。 + +因此,上面的公式中,:math:`bias(C_{out_j})` 为第 :math:`j` 个输出通道的偏置,:math:`weight(C_{out_j}, k)` 表示第 :math:`j` 个卷积核在第 :math:`k` 个输入通道的卷积核切片,:math:`X(N_i, k)` 为特征图第 :math:`i` 个 batch 第 :math:`k` 个输入通道的切片。卷积核 shape 为 :math:`(\text{kernel_size}[0], \text{kernel_size}[1])`,其中 kernel_size[0] 和 kernel_size[1] 是卷积核的高度和宽度。若考虑到输入输出通道以及 group,则完整卷积核的 shape 为 :math:`(C_{out}, \text{kernel_size}[0], \text{kernel_size}[1], C_{in}/\text{group})`,其中 group 是分组卷积时在通道上分割输入 :math:`x` 的组数。 + +输入: + - **input_x** - 输入数据的地址 + - **input_w** - 输入卷积核权重的地址 + - **bias** - 输入偏置的地址 + - **conv_param** - 算子计算所需参数的结构体。其各成员见下述。 + - **quant_param** - 对int8类型进行量化计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ConvParameter及ConvQuantParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ConvParameter { + void* workspace_; // 用于存放中间计算结果 + int output_batch_; // 输出数据总批次 + int input_batch_; // 输入数据总批次 + int input_h_; // 输入数据h维度大小 + int input_w_; // 输入数据w维度大小 + int output_h_; // 输出数据h维度大小 + int output_w_; // 输出数据w维度大小 + int input_channel_; // 输入数据通道数 + int output_channel_; // 输出数据通道数 + int kernel_h_; // 卷积核h维度大小 + int kernel_w_; // 卷积核w维度大小 + int group_; // 组数 + int pad_l_; // 左填充大小 + int pad_u_; // 上填充大小 + int dilation_h_; // 卷积核h维度膨胀尺寸大小 + int dilation_w_; // 卷积核w维度膨胀尺寸大小 + int stride_h_; // 卷积核h维度步长 + int stride_w_; // 卷积核w维度步长 + int buffer_size_; // 为分块计算所分配的缓存大小 + } ConvParameter; + + typedef struct ConvQuantParameter { + int32_t* left_shift_; + int32_t* right_shift_; + int32_t* multiplier_; + int32_t* filter_zp_ptr_; + int32_t output_zp_; + int32_t mini_; + int32_t maxi_; + int per_channel_; + } ConvQuantParameter; + +输出: + - **out_y** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void i8_conv2d_s(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask) +.. c:function:: void hp_conv2d_s(half* input_x, half* input_w, half* out_y, half* bias, ConvParameter *conv_param, int core_mask) +.. c:function:: void fp_conv2d_s(float* input_x, float* input_w, float* out_y, float* bias, ConvParameter *conv_param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 32 + + void TestConvSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float* input_data = (float*)0x88000000; + float* weight = (float*)0x89000000; + float* output_data = (float*)0x90000000; + float* bias_data = (float*)0x91000000; + ConvParameter* param = (ConvParameter*)0x92000000; + if (logic_core_id == 0) { + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0x10000000; // workspace空间需分配在AM内,计算过程中会将数据搬运到workspace空间内进行计算 + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_conv2d_s(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 4; + int out_channel = 4; + int groups = 4; + int input_shape[4] = {1, 30, 30, in_channel}; // NHWC + int weight_shape[4] = {out_channel, 3, 3, in_channel / groups}; + int output_shape[4] = {1, 10, 10, out_channel}; // NHWC + int stride[2] = {2, 2}; + int padding[4] = {1, 1, 1, 1}; + int dilation[2]= {2, 2}; + float bias[4] = {0, 0, 0, 0}; + int core_mask = 0b1111; + TestConvSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_conv2d_p(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, ConvParameter *conv_param, ConvQuantParameter quant_param, int core_mask) +.. c:function:: void hp_conv2d_p(half* input_x, half* input_w, half* out_y, half* bias, ConvParameter *conv_param, int core_mask) +.. c:function:: void fp_conv2d_p(float* input_x, float* input_w, float* out_y, float* bias, ConvParameter *conv_param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 27 + + void TestConvL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + float* input_data = (float*)0x10010000; // 私有存储版本地址设置在AM内 + float* weight = (float*)0x10020000; + float* output_data = (float*)0x10030000; + float* bias_data = (float*)0x10040000; + ConvParameter* param = (ConvParameter*)0x10060000; + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0x10070000; + param->buffer_size_ = 2048; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小 + fp_conv2d_p(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 4; + int out_channel = 4; + int groups = 4; + int input_shape[4] = {1, 30, 30, in_channel}; // NHWC + int weight_shape[4] = {out_channel, 3, 3, in_channel / groups}; + int output_shape[4] = {1, 10, 10, out_channel}; // NHWC + int stride[2] = {2, 2}; + int padding[4] = {1, 1, 1, 1}; + int dilation[2]= {2, 2}; + float bias[4] = {0, 0, 0, 0}; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestConvL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/conv2d_transpose.rst.txt b/master/html/_sources/functionlib/dsplib/conv2d_transpose.rst.txt new file mode 100644 index 0000000..b2a0cb0 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/conv2d_transpose.rst.txt @@ -0,0 +1,179 @@ +Conv2dTranspose +================= + +计算二维转置卷积,可以视为 Conv2d 对输入求梯度,也称为反卷积(实际不是真正的反卷积)。 + +输入的 shape 通常为 :math:`(N, H_{in}, W_{in}, C_{in})`,其中: + + - :math:`N` 是 batch size + - :math:`C_{in}` 是空间维度 + - :math:`H_{in}, W_{in}` 分别为特征层的高度和宽度 + +输入: + - **input_x** - 输入数据的地址 + - **input_w** - 输入卷积核权重的地址 + - **bias** - 输入偏置的地址 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ConvTransposeParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ConvTransposeParameter { + void* workspace_; // 用于存放中间计算结果 + int output_batch_; // 输出数据总批次 + int input_batch_; // 输入数据总批次 + int input_h_; // 输入数据h维度大小 + int input_w_; // 输入数据w维度大小 + int output_h_; // 输出数据h维度大小 + int output_w_; // 输出数据w维度大小 + int input_channel_; // 输入数据通道数 + int output_channel_; // 输出数据通道数 + int kernel_h_; // 卷积核h维度大小 + int kernel_w_; // 卷积核w维度大小 + int group_; // 组数 + int pad_l_; // 左填充大小 + int pad_u_; // 上填充大小 + int dilation_h_; // 卷积核h维度膨胀尺寸大小 + int dilation_w_; // 卷积核w维度膨胀尺寸大小 + int stride_h_; // 卷积核h维度步长 + int stride_w_; // 卷积核w维度步长 + int buffer_size_; // 为分块计算所分配的缓存大小 + } ConvTransposeParameter; + +输出: + - **out_y** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void i8_convtranspose_s(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, ConvTransposeParameter *conv_param, int core_mask) +.. c:function:: void hp_convtranspose_s(half* input_x, half* input_w, half* out_y, half* bias, ConvTransposeParameter *conv_param, int core_mask) +.. c:function:: void fp_convtranspose_s(float* input_x, float* input_w, float* out_y, float* bias, ConvTransposeParameter *conv_param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 35 + + void TestConvTransposeSMCFp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float* input_data = (float*)0x88000000; + float* weight = (float*)0x89000000; + float* output_data = (float*)0x90000000; + float* bias_data = (float*)0x91000000; + float* check = (float*)0x94000000; + ConvTransposeParameter* param = (ConvTransposeParameter*)0x92000000; + if (logic_core_id == 0) { + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + memset(output_data, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float)); + memset(check, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float)); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0xA0000000; + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_convtranspose_s(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 6; + int out_channel = 6; + int groups = 6; + int input_shape[4] = {2, 5, 7, in_channel}; // NHWC + int weight_shape[4] = {in_channel, 3, 3, out_channel / groups}; + int output_shape[4] = {2, 7, 9, out_channel}; // NHWC + int stride[2] = {1, 1}; + int padding[4] = {0, 0, 0, 0}; + int dilation[2]= {1, 1}; + float bias[] = {0, 0, 0, 0, 0, 0}; + int core_mask = 0b1111; + TestConvTransposeSMCFp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_convtranspose_p(int8_t* input_x, int8_t* input_w, int8_t* out_y, int* bias, ConvTransposeParameter *conv_param, int core_mask) +.. c:function:: void hp_convtranspose_p(half* input_x, half* input_w, half* out_y, half* bias, ConvTransposeParameter *conv_param, int core_mask) +.. c:function:: void fp_convtranspose_p(float* input_x, float* input_w, float* out_y, float* bias, ConvTransposeParameter *conv_param, int core_mask) + + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 30 + + void TestConvTransposeL2Fp32(int* input_shape, int* weight_shape, int* output_shape, int* stride, int* padding, int* dilation, int groups, float* bias, int core_mask) { + float* input_data = (float*)0x10000000; // 私有存储版本地址设置在AM内 + float* weight = (float*)0x10001000; + float* output_data = (float*)0x10002000; + float* bias_data = (float*)0x10003000; + float* check = (float*)0x10004000; + ConvTransposeParameter* param = (ConvTransposeParameter*)0x10005000; + memcpy(bias_data, bias, sizeof(float) * output_shape[3]); + memset(output_data, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float)); + memset(check, 0, output_shape[0] * output_shape[1] * output_shape[2] * output_shape[3] * sizeof(float)); + param->dilation_h_ = dilation[0]; + param->dilation_w_ = dilation[1]; + param->group_ = groups; + param->input_batch_ = input_shape[0]; + param->input_h_ = input_shape[1]; + param->input_w_ = input_shape[2]; + param->input_channel_ = input_shape[3]; + param->kernel_h_ = weight_shape[1]; + param->kernel_w_ = weight_shape[2]; + param->output_batch_ = output_shape[0]; + param->output_h_ = output_shape[1]; + param->output_w_ = output_shape[2]; + param->output_channel_ = output_shape[3]; + param->stride_h_ = stride[0]; + param->stride_w_ = stride[0]; + param->pad_u_ = padding[0]; + param->pad_l_ = padding[2]; + param->workspace_ = (float*)0x10006000; + param->buffer_size_ = 1024; // 私有存储版本中,必须设置该参数,用于确定分块计算的大小 + fp_convtranspose_p(input_data, weight, output_data, bias_data, param, core_mask); + } + + void main(){ + int in_channel = 6; + int out_channel = 6; + int groups = 6; + int input_shape[4] = {2, 5, 7, in_channel}; // NHWC + int weight_shape[4] = {in_channel, 3, 3, out_channel / groups}; + int output_shape[4] = {2, 7, 9, out_channel}; // NHWC + int stride[2] = {1, 1}; + int padding[4] = {0, 0, 0, 0}; + int dilation[2]= {1, 1}; + float bias[] = {0, 0, 0, 0, 0, 0}; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestConvTransposeL2Fp32(input_shape, weight_shape, output_shape, stride, padding, dilation, groups, bias, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/conv2dbackpropfilterfusion.rst.txt b/master/html/_sources/functionlib/dsplib/conv2dbackpropfilterfusion.rst.txt new file mode 100644 index 0000000..4a6ae12 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/conv2dbackpropfilterfusion.rst.txt @@ -0,0 +1,139 @@ +Conv2DBackpropFilterFusion +========================== +计算二维卷积反向传播的权重梯度(Conv2D backprop filter fusion),支持常规卷积、Depthwise 卷积以及 1x1 优化路径,多核按批次与空间维度分块协同完成。 + + .. math:: + + dw = \text{Conv2DGradFilter}(x, dy) + + 输入: + - **dy** - 输出梯度张量首地址,形状 ``[batch, out_h, out_w, out_channel]``。 + - **x** - 正向输入张量首地址,形状 ``[batch, in_h, in_w, in_channel]``。 + - **conv_param** - 卷积参数结构体地址,包含 ``stride``、``pad``、``dilation``、``group``、输入输出维度及共享工作空间指针等信息。 + + ConvParameter 字段说明: + + - ``workspace_`` - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。 + - ``output_batch_`` - 输出梯度 ``dy`` 的批次数(通常等于输入批次数)。 + - ``input_batch_`` - 正向输入 ``x`` 的批次数,用于与 ``output_batch_`` 校验。 + - ``input_h_`` / ``input_w_`` - 正向输入特征图的高度与宽度。 + - ``output_h_`` / ``output_w_`` - 输出梯度特征图的高度与宽度。 + - ``input_channel_`` / ``output_channel_`` - 输入与输出通道数,需与 ``group_`` 配合满足整除关系。 + - ``kernel_h_`` / ``kernel_w_`` - 卷积核的高与宽。 + - ``group_`` - 组卷积数量,``group_ = 1`` 表示普通卷积。 + - ``pad_l_`` / ``pad_r_`` / ``pad_u_`` / ``pad_d_`` - 分别表示左右上下方向的填充大小。 + - ``dilation_h_`` / ``dilation_w_`` - 核心采样间隔(膨胀系数)。 + - ``stride_h_`` / ``stride_w_`` - 滑动窗口在高、宽方向的步长。 + - ``buffer_size_`` - 分配给 ``workspace_`` 的缓冲区字节数,在运行前需要正确设置。 + - ``nweights_`` - 卷积权重 ``w`` 的元素总数,用于内部分块和校验。 + + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **dw** - 卷积核梯度张量首地址,形状 ``[out_channel, in_channel/group, kernel_h, kernel_w]``。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + - 需在 ``conv_param->workspace_`` 中预先分配共享工作空间,长度不少于 ``conv_param->buffer_size_``。 + + +**共享存储版本:** + +.. c:function:: void hp_conv2dbackpropfilterfusion_s(const half *dy, const half *x, half *dw, ConvParameter *conv_param, int core_mask) +.. c:function:: void fp_conv2dbackpropfilterfusion_s(const float *dy, const float *x, float *dw, ConvParameter *conv_param, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 34 + + // FT78NE 多核示例 + #include + #include "conv_parameter.h" + + int main(void) { + const float *dy = (const float *)0xA0000000; // DDR 存储 + const float *x = (const float *)0xB0000000; + float *dw = (float *)0xC0000000; + ConvParameter *param = (ConvParameter *)0xB0001000; + // 设置 ConvParameter 字段 + param->workspace_ = (void *)0xB0002000; + param->buffer_size_ = 0x20000; + param->input_batch_ = 1; + param->input_h_ = 3; + param->input_w_ = 3; + param->input_channel_ = 4; + param->output_batch_ = 1; + param->output_h_ = 3; + param->output_w_ = 3; + param->output_channel_ = 4; + param->kernel_h_ = 2; + param->kernel_w_ = 2; + param->group_ = 2; + param->pad_u_ = 1; + param->pad_d_ = 0; + param->pad_l_ = 1; + param->pad_r_ = 0; + param->dilation_h_ = 1; + param->dilation_w_ = 1; + param->stride_h_ = 1; + param->stride_w_ = 1; + param->nweights_ = 4 * 2 * 2 * 2; // 示例值 + int core_mask = 0xff; + fp_conv2dbackpropfilterfusion_s(dy, x, dw, param, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_conv2dbackpropfilterfusion_p(const half *dy, const half *x, half *dw, ConvParameter *conv_param) +.. c:function:: void fp_conv2dbackpropfilterfusion_p(const float *dy, const float *x, float *dw, ConvParameter *conv_param) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 33 + + // MT7004 单核示例 + #include + #include "conv_parameter.h" + + int main(void) { + const half *dy = (const half *)0x10000000; // L2 存储 + const half *x = (const half *)0x10020000; + half *dw = (half *)0x10040000; + ConvParameter *param = (ConvParameter *)0x10060000; + // 设置 ConvParameter 字段 + param->workspace_ = (void *)0x10070000; + param->buffer_size_ = 0x10000; + param->input_batch_ = 1; + param->input_h_ = 3; + param->input_w_ = 3; + param->input_channel_ = 4; + param->output_batch_ = 1; + param->output_h_ = 3; + param->output_w_ = 3; + param->output_channel_ = 4; + param->kernel_h_ = 2; + param->kernel_w_ = 2; + param->group_ = 2; + param->pad_u_ = 1; + param->pad_d_ = 0; + param->pad_l_ = 1; + param->pad_r_ = 0; + param->dilation_h_ = 1; + param->dilation_w_ = 1; + param->stride_h_ = 1; + param->stride_w_ = 1; + param->nweights_ = 4 * 2 * 2 * 2; // 示例值 + hp_conv2dbackpropfilterfusion_p(dy, x, dw, param); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/conv2dbackpropinputfusion.rst.txt b/master/html/_sources/functionlib/dsplib/conv2dbackpropinputfusion.rst.txt new file mode 100644 index 0000000..b63263b --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/conv2dbackpropinputfusion.rst.txt @@ -0,0 +1,137 @@ +Conv2DBackpropInputFusion +========================= +计算二维卷积反向传播的输入梯度(Conv2D backprop input fusion),支持普通卷积、Depthwise 卷积以及 1x1 优化路径,多个核心通过核掩码协同完成批次并行。 + + .. math:: + + dx = \text{Conv2D}^\top(dy, w) + + 输入: + - **dy** - 输出梯度张量首地址,形状 ``[batch, out_h, out_w, out_channel]``。 + - **w** - 卷积权重张量首地址,形状 ``[out_channel, kernel_h, kernel_w, in_channel/group]``。 + - **conv_param** - 卷积参数结构体地址,包含 ``stride``、``pad``、``dilation``、``group``、输入输出维度、批次数及共享工作空间指针等信息。 + + ConvParameter 字段说明: + + - ``workspace_`` - 指向算子运行时使用的临时工作空间,需满足对齐与容量要求。 + - ``output_batch_`` - 输出梯度 ``dy`` 的批次数(通常等于输入批次数)。 + - ``input_batch_`` - 正向输入 ``x`` 的批次数,用于与 ``output_batch_`` 校验。 + - ``input_h_`` / ``input_w_`` - 正向输入特征图的高度与宽度。 + - ``output_h_`` / ``output_w_`` - 输出梯度特征图的高度与宽度。 + - ``input_channel_`` / ``output_channel_`` - 输入与输出通道数,需与 ``group_`` 配合满足整除关系。 + - ``kernel_h_`` / ``kernel_w_`` - 卷积核的高与宽。 + - ``group_`` - 组卷积数量,``group_ = 1`` 表示普通卷积。 + - ``pad_l_`` / ``pad_r_`` / ``pad_u_`` / ``pad_d_`` - 分别表示左右上下方向的填充大小。 + - ``dilation_h_`` / ``dilation_w_`` - 核心采样间隔(膨胀系数)。 + - ``stride_h_`` / ``stride_w_`` - 滑动窗口在高、宽方向的步长。 + - ``buffer_size_`` - 分配给 ``workspace_`` 的缓冲区字节数,在运行前需要正确设置。 + - ``nweights_`` - 卷积权重 ``w`` 的元素总数,用于内部分块和校验。 + + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **dx** - 输入梯度张量首地址,形状 ``[batch, in_h, in_w, in_channel]``。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + - 需在 ``conv_param->workspace_`` 中预先分配共享工作空间,并设置 ``conv_param->buffer_size_``。 + +**共享存储版本:** + +.. c:function:: void hp_conv2dbackpropinputfusion_s(const half *dy, const half *w, half *dx, ConvParameter *conv_param, int core_mask) +.. c:function:: void fp_conv2dbackpropinputfusion_s(const float *dy, const float *w, float *dx, ConvParameter *conv_param, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 34 + + // FT78NE 多核示例 + #include + #include "conv_parameter.h" + + int main(void) { + const float *dy = (const float *)0xA0000000; // DDR 存储 + const float *w = (const float *)0xB0000000; + float *dx = (const float *)0xC0000000; + ConvParameter *param = (ConvParameter *)0xB0001000; // 卷积参数共享区域 + // 设置 ConvParameter 字段 + param->workspace_ = (void *)0xB0002000; // 共享工作空间 + param->buffer_size_ = 0x20000; + param->input_batch_ = 1; + param->input_h_ = 5; + param->input_w_ = 5; + param->input_channel_ = 4; + param->output_batch_ = 1; + param->output_h_ = 3; + param->output_w_ = 3; + param->output_channel_ = 8; + param->kernel_h_ = 3; + param->kernel_w_ = 3; + param->group_ = 1; + param->pad_u_ = 1; + param->pad_d_ = 1; + param->pad_l_ = 1; + param->pad_r_ = 1; + param->dilation_h_ = 1; + param->dilation_w_ = 1; + param->stride_h_ = 2; + param->stride_w_ = 2; + param->nweights_ = 8 * 3 * 3 * 4; // 示例值 + int core_mask = 0xff; + fp_conv2dbackpropinputfusion_s(dy, w, dx, param, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void hp_conv2dbackpropinputfusion_p(const half *dy, const half *w, half *dx, ConvParameter *conv_param) +.. c:function:: void fp_conv2dbackpropinputfusion_p(const float *dy, const float *w, float *dx, ConvParameter *conv_param) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 33 + + // MT7004 单核示例 + #include + #include "conv_parameter.h" + + int main(void) { + const half *dy = (const half *)0x10000000; // L2 存储 + const half *w = (const half *)0x10020000; + half *dx = (half *)0x10040000; + ConvParameter *param = (ConvParameter *)0x10060000; + // 设置 ConvParameter 字段 + param->workspace_ = (void *)0x10070000; + param->buffer_size_ = 0x10000; + param->input_batch_ = 1; + param->input_h_ = 5; + param->input_w_ = 5; + param->input_channel_ = 4; + param->output_batch_ = 1; + param->output_h_ = 3; + param->output_w_ = 3; + param->output_channel_ = 8; + param->kernel_h_ = 3; + param->kernel_w_ = 3; + param->group_ = 1; + param->pad_u_ = 1; + param->pad_d_ = 1; + param->pad_l_ = 1; + param->pad_r_ = 1; + param->dilation_h_ = 1; + param->dilation_w_ = 1; + param->stride_h_ = 2; + param->stride_w_ = 2; + param->nweights_ = 8 * 3 * 3 * 4; // 示例值 + hp_conv2dbackpropinputfusion_p(dy, w, dx, param); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/crop.rst.txt b/master/html/_sources/functionlib/dsplib/crop.rst.txt new file mode 100644 index 0000000..1a8fdf9 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/crop.rst.txt @@ -0,0 +1,64 @@ +Crop +================= + +类似于slice(张量切片)。不过只支持四维。 + +输入: + - **input** - 输入数据地址。 + - **in_shape** - 输入张量形状。 + - **out_shape** - 输出张量形状。 + - **type_size** - 输入和输出张量数据类型的长度。 + - **offset** - 每一维度裁剪开始的偏移量 + - **axis** - 裁剪开始的维度 + - **core_mask** - 核掩码。 + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享/私有存储版本:** + +.. c:function:: void anytype_crop_anycore(void *input, void *output, int *in_shape, int *out_shape, int type_size, int* offset, int axis, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型,改变type_size参数即可。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 17 + + void TestCropSMCFp32(int* in_shape, int* out_shape, int axis, int* offset_, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float* input = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* output = (float*)0x98000000; + int* input_shape = (int*)0xA8000000; + int* output_shape = (int*)0xA8200000; + int type_size = sizeof(float); + int* offset = (int*)0xA8410000; + if (logic_core_id == 0) { + memcpy(offset, offset_, sizeof(int) * (4 - axis)); + memcpy(input_shape, in_shape, sizeof(int) * 4); + memcpy(output_shape, out_shape, sizeof(int) * 4); + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + anytype_crop_anycore(input, output, in_shape, out_shape, type_size, offset, axis, core_mask); + } + + void main(){ + int in_shape[4] = {2, 3, 3, 5}; + int out_shape[4] = {2, 2, 2, 5}; + int axis = 1; + int offset[3] = {1, 1, 0}; + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + TestCropSMCFp32(in_shape, out_shape, axis, offset, core_mask); + } diff --git a/master/html/_sources/functionlib/dsplib/crop_and_resize.rst.txt b/master/html/_sources/functionlib/dsplib/crop_and_resize.rst.txt new file mode 100644 index 0000000..f8daebd --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/crop_and_resize.rst.txt @@ -0,0 +1,94 @@ +CropAndResize +================= + +从输入图像Tensor中提取切片并调整其大小。仅支持双线性插值方法。 + +输入: + - **src** - 输入数据的地址。 + - **box_idx** - boxes的索引,box_idx[i]的值表示第i个框的图像的值。 + - **boxes** - 第i行表示box_index[i]图像区域的坐标,并且坐标[y1,x1,y2,x2]是归一化后的值。归一化后的坐标值y,映射到图像y*(image_height-1)处,因此归一化后的图像高度范围为[0,1],映射到实际图像高度范围为[0,image_height-1]。我们允许y1>y2,在这种情况下,视为原始图像的上下翻转变换。宽度尺寸的处理类似。坐标取值允许在[0,1]范围之外,在这种情况下,我们使用extrapolation_value外插值进行补齐。 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **extrapolation_value** - 外插值。 + - **core_mask** - 核掩码。 + +**CropAndResizeParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct CropAndResizeParameter { + int* input_shape_; // 输入张量形状 + int* output_shape_; // 输出张量形状 + int* x_lefts_; // 用于存储预处理结果 + int* x_rights_; // 用于存储预处理结果 + int* y_tops_; // 用于存储预处理结果 + int* y_bottoms_; // 用于存储预处理结果 + void* x_weights_; // 用于存储预处理结果 + void* y_weights_; // 用于存储预处理结果 + void* line_buffers_; // 用于存储中间结果 + } CropAndResizeParameter; + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享/私有存储版本:** + +.. c:function:: void i8_crop_and_resize_anycore(int8_t* src, int8_t* dst, int *box_idx, float *boxes, CropAndResizeParameter* param, float extrapolation_value, int core_mask) +.. c:function:: void hp_crop_and_resize_anycore(half* src, half* dst, int *box_idx, float *boxes, CropAndResizeParameter* param, float extrapolation_value, int core_mask) +.. c:function:: void fp_crop_and_resize_anycore(float* src, float* dst, int *box_idx, float *boxes, CropAndResizeParameter* param, half extrapolation_value, int core_mask) + +私有及共享空间版本均使用这些函数。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 28 + + void TestCropAndResizeSMCFp32(int* input_shape, int* output_shape, float* inp_boxes, int32_t* inp_box_idx, float extrapolation_value, int core_mask) { + int core_id = get_core_id(); + int core_num = GetCoreNum(core_mask); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + float* input = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* output = (float*)0x89000000; + float* boxes = (float*)0x8A000000; + int* box_idx = (int*)0x8B000000; + CropAndResizeParameter* param = (CropAndResizeParameter*)0x8C000000; + if (logic_core_id == 0) { + memcpy(boxes, inp_boxes, sizeof(float) * output_shape[0] * 4); + memcpy(box_idx, inp_box_idx, sizeof(int) * output_shape[0]); + param->input_shape_ = (int*)0x8D000000; + memcpy(param->input_shape_, input_shape, sizeof(int) * 4); + param->output_shape_ = (int*)0x8E000000; + memcpy(param->output_shape_, output_shape, sizeof(int) * 4); + param->line_buffers_ = (void*)0x8F000000; + param->x_lefts_ = (int*)0x90000000; + param->x_rights_ = (int*)0x91000000; + param->y_bottoms_ = (int*)0x92000000; + param->y_tops_ = (int*)0x93000000; + param->x_weights_ = (void*)0x94000000; + param->y_weights_ = (void*)0x95000000; + PrepareCropAndResizeBilinear(param->input_shape_, boxes, param->output_shape_, param->y_bottoms_, param->y_tops_, + param->x_lefts_, param->x_rights_, param->y_weights_, param->x_weights_); // 做预处理 + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_crop_and_resize_anycore(input, output, box_idx, boxes, param, extrapolation_value, core_mask); + } + + void main(){ + int input_shape[4] = {1, 4, 4, 4}; + int output_shape[4] = {1, 8, 8, 4}; + float boxes[4] = {0, 0, 0.5, 0.5}; + int box_idx[1] = {0}; + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + float extrapolation_value = 0.5; + TestCropAndResizeSMCFp32(input_shape, output_shape, boxes, box_idx, extrapolation_value, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/depthtospace.rst.txt b/master/html/_sources/functionlib/dsplib/depthtospace.rst.txt new file mode 100644 index 0000000..4ff302e --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/depthtospace.rst.txt @@ -0,0 +1,84 @@ +DepthToSpace +================= +将输入张量的深度通道按 block_size 分解并重排到空间维度(Depth -> Space)。 + + 输入: + - **input** - 输入数据地址。 + - **in_shape** - 输入形状,格式为 ``[batch, height, width, channel]``。 + - **block_size** - block 因子(单个整数)。 + - **data_size** - 单个元素字节数(例如 sizeof(float))。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。 + - MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。 + + +**共享存储版本:** + +.. c:function:: void i8_depthtospace_s(int8_t *input, int8_t *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void i16_depthtospace_s(int16_t *input, int16_t *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void i32_depthtospace_s(int32_t *input, int32_t *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void hp_depthtospace_s(half *input, half *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void fp_depthtospace_s(float *input, float *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void dp_depthtospace_s(double *input, double *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void c64_depthtospace_s(float *input, float *output, const int *in_shape, int block_size, int data_size, int core_mask) +.. c:function:: void c128_depthtospace_s(double *input, double *output, const int *in_shape, int block_size, int data_size, int core_mask) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE 多核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 多核版本:输入放在 DDR 地址 0xA0000000 + float *output = (float *)0xB0000000; // 多核版本:输出放在 DDR 地址 0xB0000000 + int in_shape[4] = {10, 16, 16, 4}; + int block_size = 2; + int core_mask = 0xff; + fp_depthtospace_s(input, output, in_shape, block_size, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_depthtospace_p(int8_t *input, int8_t *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void i16_depthtospace_p(int16_t *input, int16_t *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void i32_depthtospace_p(int32_t *input, int32_t *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void hp_depthtospace_p(half *input, half *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void fp_depthtospace_p(float *input, float *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void dp_depthtospace_p(double *input, double *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void c64_depthtospace_p(float *input, float *output, const int *in_shape, int block_size, int data_size) +.. c:function:: void c128_depthtospace_p(double *input, double *output, const int *in_shape, int block_size, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + // FT78NE 单核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 单核版本:输入放在 L2 地址 0x10000000 + float *output = (float *)0x10040000; // 单核版本:输出放在 L2 地址 0x10040000 + int in_shape[4] = {10, 16, 16, 4}; + int block_size = 2; + fp_depthtospace_p(input, output, in_shape, block_size, sizeof(float)); + return 0; + } + + diff --git a/master/html/_sources/functionlib/dsplib/dsplib_index.rst.txt b/master/html/_sources/functionlib/dsplib/dsplib_index.rst.txt index 6817511..b63f4c0 100644 --- a/master/html/_sources/functionlib/dsplib/dsplib_index.rst.txt +++ b/master/html/_sources/functionlib/dsplib/dsplib_index.rst.txt @@ -3,5 +3,50 @@ DSP Library C API Reference .. toctree:: :maxdepth: 1 - - equal \ No newline at end of file + + equal + activation + expfusion + reverse_sequence + reversev2 + fillv2 + squeeze + unsqueeze + expand_dims + leaky_relu + lstm + scatter_elements + reduce + resize + crop_and_resize + crop + conv2d + adder + conv2d_transpose + gru + assert + range + raggedrange + linspace + matmulfusion + attention + floor + floordiv + embeddinglookup + eltwise + adamweightdecay + applymomentum + avgpoolinggrad + batchtospace + batchtospacend + broadcastto + depthtospace + spacetodepth + spacetobatch + spacetobatchnd + fusedbatchnorm + groupnormfusion + conv2dbackpropinputfusion + conv2dbackpropfilterfusion + sgd + scalefusion diff --git a/master/html/_sources/functionlib/dsplib/eltwise.rst.txt b/master/html/_sources/functionlib/dsplib/eltwise.rst.txt new file mode 100644 index 0000000..dbae68d --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/eltwise.rst.txt @@ -0,0 +1,99 @@ +Eltwise +================= + +输入两个等长数组以及控制参数,根据控制参数的值决定对两个数组做对位相加、对位相乘或取最大值操作。 + +.. math:: + + \mathbf{output_i} = + \begin{cases} + \mathbf{Input0_i} \cdot \mathbf{Input1_i}, & \text{if } \text{eltwise_mode} = \text{Eltwise_PROD} \\[6pt] + \mathbf{Input0_i} + \mathbf{Input1_i}, & \text{if } \text{eltwise_mode} = \text{Eltwise_SUM} \\[6pt] + \max(\mathbf{Input0_i}, \mathbf{Input1_i}), & \text{if } \text{eltwise_mode} = \text{Eltwise_MAXIMUM} + \end{cases} + +输入: + - **Input0** - 第一个输入数据地址。 + - **Input1** - 第二个输入数据地址。 + - **length** - 计算长度。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 计算结果地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64(除最大值), cplx128(除最大值) + - MT7004 支持fp16, fp32, int16, int32, cplx64(除最大值) + +**共享存储版本:** + +.. c:function:: void i8_eltwise_s(int8_t* Input0, int8_t* Input1, int8_t* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void i16_eltwise_s(int16_t* Input0, int16_t* Input1, int16_t* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void i32_eltwise_s(int* Input0, int* Input1, int* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void hp_eltwise_s(half* Input0, half* Input1, half* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void fp_eltwise_s(float* Input0, float* Input1, float* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void dp_eltwise_s(double* Input0, double* Input1, double* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void c64_eltwise_s(float* Input0, float* Input1, float* output,int length, int eltwise_mode_, int core_mask) +.. c:function:: void c128_eltwise_s(double* Input0, double* Input1, double* output, int length, int eltwise_mode_, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 14 + + //FT78NE示例 + #include + #include + #define Eltwise_PROD 0 + #define Eltwise_SUM 1 + #define Eltwise_MAXIMUM 2 + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *input1 = (float *)0xB0000000; + float *output = (float *)0xC0000000; + int length = 1000; + int eltwise_mode_ = Eltwise_SUM; + int core_mask = 0xff; + fp_eltwise_s(input0, input1, output, length, eltwise_mode_, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_eltwise_p(int8_t *Input0, int8_t *Input1, int8_t *output, int eltwise_mode_, int length) +.. c:function:: void i16_eltwise_p(int16_t *Input0, int16_t *Input1, int16_t *output, int eltwise_mode_, int length) +.. c:function:: void i32_eltwise_p(int32_t *Input0, int32_t *Input1, int32_t *output, int eltwise_mode_, int length) +.. c:function:: void hp_eltwise_p(half* Input0, half* Input1, bool* output, int eltwise_mode_,int length) +.. c:function:: void fp_eltwise_p(float* Input0, float* Input1, float* output, int eltwise_mode_,int length) +.. c:function:: void dp_eltwise_p(double* Input0, double* Input1, double* output, int eltwise_mode_,int length) +.. c:function:: void c64_eltwise_p(float *Input0, float *Input1, float *output, int eltwise_mode_, int length) +.. c:function:: void c128_eltwise_p(double *Input0, double *Input1, double *output, int eltwise_mode_, int length) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 14 + + //FT78NE示例 + #include + #include + #define Eltwise_PROD 0 + #define Eltwise_SUM 1 + #define Eltwise_MAXIMUM 2 + + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10810000; //input在L2空间 + float *input1 = (float *)0x10820000; + float *output = (float *)0x10830000; + int length = 1000; + int eltwise_mode_ = Eltwise_SUM; + fp_eltwise_p(input0, input1, output, eltwise_mode_, length); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/embeddinglookup.rst.txt b/master/html/_sources/functionlib/dsplib/embeddinglookup.rst.txt new file mode 100644 index 0000000..858cc87 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/embeddinglookup.rst.txt @@ -0,0 +1,101 @@ +EmbeddingLookup +================= + +传入一个矩阵和一组索引,根据给定的索引提取对应的行(向量),若此行不曾被标记为“已正则化”,则对此行进行正则化处理,将结果拼接输出,若已经正则化过则直接输出。 + +.. math:: + + \forall k \in [1, ids\_size], \quad + \begin{cases} + \text{if } \textbf{is_regulated}[i_k] = 0, & + \begin{cases} + \displaystyle X_{i_k} \leftarrow + X_{i_k} \cdot \frac{\text{max_norm}} + {\sum_{j=1}^{layer\_size\_} X_{i_k, j}} \\[10pt] + \textbf{is_regulated}[i_k] \leftarrow 1 + \end{cases} \\[12pt] + \text{输出向量 } Y_k \leftarrow X_{i_k} + \end{cases} + +输入: + - **input_data** - 输入矩阵数据地址。 + - **ids** - 输入索引的存储地址。 + - **max_norm** - 最大范数约束。 + - **is_regulated** - 记录矩阵行是否被正则化的标志数组。 + - **ids_size_** - 输入索引个数。 + - **layer_size_** - 输入矩阵的列数。 + - **layer_num_** - 输入矩阵的行数。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 结果输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void hp_embeddinglookup_s(half* input_data,int* ids, half* output, half max_norm_, bool* is_regulated, int ids_size_, int layer_size_, int layer_num_ , int core_mask) +.. c:function:: void fp_embeddinglookup_s(float* input_data,int* ids, float* output, float max_norm_, bool* is_regulated, int ids_size_, int layer_size_, int layer_num_ , int core_mask) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 16 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input_data = (float *)0xA0000000; //input在DDR空间 + float *output_data = (float *)0xA0872c00; + int layer_size = 4;//列 + int layer_num = 5;//行 + float max_norm = 4.5; + int ids[]={0,1,3}; + int ids_size = 3;//提取三行 + bool *output = (bool *)0xC0000000; + bool is_regulated_[5] = {0};//layer_num + int core_mask = 0xff; + fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_embeddinglookup_p(half* Input0, half* Input1, bool* output,int length) +.. c:function:: void fp_embeddinglookup_p(float* Input0, float* Input1, bool* output,int length) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 15 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input_data = (float *)0x10810000; //input在DDR空间 + float *output_data = (float *)0x10820000; + int layer_size = 4;//列 + int layer_num = 5;//行 + float max_norm = 4.5; + int ids[]={0,1,3}; + int ids_size = 3;//提取三行 + bool *output = (bool *)0xC0000000; + bool is_regulated_[5] = {0};//layer_num + fp_embeddinglookup_s(input_data, ids, output_data, max_norm, is_regulated_, ids_size, layer_size, layer_num); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/equal.rst.txt b/master/html/_sources/functionlib/dsplib/equal.rst.txt index bd9ff0c..8045d6b 100644 --- a/master/html/_sources/functionlib/dsplib/equal.rst.txt +++ b/master/html/_sources/functionlib/dsplib/equal.rst.txt @@ -42,7 +42,7 @@ Equal .. code-block:: c :linenos: - :emphasize-lines: 10 + :emphasize-lines: 11 //FT78NE示例 #include @@ -74,16 +74,16 @@ Equal .. code-block:: c :linenos: - :emphasize-lines: 9 + :emphasize-lines: 10 //FT78NE示例 #include #include int main(int argc, char* argv[]) { - float *input0 = (float *)0x10000000; //input在L2空间 - float *input1 = (float *)0x10001000; - bool *output = (bool *)0xC0000000; + float *input0 = (float *)0x10810000; //input在L2空间 + float *input1 = (float *)0x10820000; + bool *output = (bool *)0x10830000; int length = 1000; fp_equal_p(input0, input1, output, length); return 0; diff --git a/master/html/_sources/functionlib/dsplib/expand_dims.rst.txt b/master/html/_sources/functionlib/dsplib/expand_dims.rst.txt new file mode 100644 index 0000000..14c4aa0 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/expand_dims.rst.txt @@ -0,0 +1,42 @@ +ExpandDims +================= + +对输入张量在给定的轴上添加额外维度。由于该算子仅改变张量形状,因此其DSP算子的作用是将数据从输入张量完整拷贝到输出张量。 + +输入: + - **src** - 输入地址 + - **total_copy_size** - 计算得到的总共需拷贝的数据量,单位为字节。 + - **core_mask** - 核掩码。 + +输出: + - **dst** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享/私有存储版本:** + +.. c:function:: void anytype_expand_dims_anycore(void* src, void* dst, int total_copy_size, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 8 + + void main(){ + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + int core_num = GetCoreNum(core_mask); + float* src = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* dst = (float*)0x98000000; + int shape[3] = {1, 10, 10}; + int total_copy_size = shape[0] * shape[1] * shape[2] * sizeof(float); + anytype_expand_dims_anycore(src, dst, total_copy_size, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/expfusion.rst.txt b/master/html/_sources/functionlib/dsplib/expfusion.rst.txt new file mode 100644 index 0000000..9c67ae1 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/expfusion.rst.txt @@ -0,0 +1,101 @@ +ExpFusion +================= + + + + 传入一个数组,逐元素计算其乘上输入因子(可选择)后的指数值,再将指数值乘上输出因子后输出。 + + .. math:: + + dst_i = \exp(src_i \cdot s_{in}) \cdot s_{out} + \quad \text{where} \quad + s_{in} = + \begin{cases} + 1, & scale = 1 \\ + in\_scale, & scale \neq 1 + \end{cases} + + \quad s_{out} = out\_scale + + 输入: + - **src_data** - 输入数据地址。 + - **length** - 计算长度。 + - **in_scale** - 输入缩放因子,当scale != 1时启用。 + - **out_scale** - 输出缩放因子。 + - **scale** - 输入缩放因子启用控制。 + - **core_mask** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **dst_data** - 计算结果地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享存储版本:** + +.. c:function:: void i8_expfusion_s(int8_t* src_data, int8_t* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void i16_expfusion_s(int16_t* src_data, half* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void i32_expfusion_s(int* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void hp_expfusion_s(half* src_data, half* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void fp_expfusion_s(float* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void dp_expfusion_s(double* src_data, double* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void c64_expfusion_s(float* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) +.. c:function:: void c128_expfusion_s(double* src_data, double* dst_data, int length, float in_scale, float out_scale, int scale, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 12 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *output = (float *)0xC0000000; + int length = 1000; + float in_scale = 0.5, out_scale = 1.2; + int scale = 1; + int core_mask = 0xff; + fp_expfusion_s( input0, output, length, in_scale, out_scale, scale,core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_expfusion_p(int8_t* src_data, int8_t* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void i16_expfusion_p(int16_t* src_data, half* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void i32_expfusion_p(int* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void hp_expfusion_p(half* src_data, half* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void fp_expfusion_p(float* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void dp_expfusion_p(double* src_data, double* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void c64_expfusion_p(float* src_data, float* dst_data, int length, float in_scale, float out_scale, int scale) +.. c:function:: void c128_expfusion_p(double* src_data, double* dst_data, int length, float in_scale, float out_scale, int scale) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + //FT78NE示例 + #include + #include + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10810000; //input在L2空间 + float *output = (float *)0x10820000; + int length = 1000; + float in_scale = 0.5, out_scale = 1.2; + int scale = 1; + fp_expfusion_p( input0, output, length, in_scale, out_scale, scale); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/fillv2.rst.txt b/master/html/_sources/functionlib/dsplib/fillv2.rst.txt new file mode 100644 index 0000000..0cac948 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/fillv2.rst.txt @@ -0,0 +1,71 @@ +FillV2 +================= + +创建一个Tensor,根据指定的shape,将其值由value进行填充。 + +输入: + - **value** - 填充值的地址 + - **length** - 由指定shape计算出的张量总长度。 + - **type_size** - 填充值的数据类型的长度 + - **core_mask** - 核掩码。 + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享存储版本:** + +.. c:function:: void anytype_fillv2_s(void* value, void* output, int length, int type_size, int core_mask) + +对于不同数据类型,改变type_size参数即可。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 15 + + void main() { + float* input = (float*)0xA0000000; + float value = 789.1; + float* output = (float*)0x88000000; + int i; + int length = 1000; + int core_mask = 0b1111; + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + if (logic_core_id == 0) { + *input = value; + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + anytype_fillv2_s(input, output, length, 4, core_mask); + } + +**私有存储版本:** + +.. c:function:: void anytype_fillv2_p(void* value, void* output, int length, int type_size, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 9 + + void main() { + float* input = (float*)0x10000000; + float value = 789.1; + float* output = (float*)0x10010000; + int i; + int length = 1000; + int core_mask = 0b0001; // 要启动哪一个核,就将哪一位设置为1,只允许存在一个核心启动 + *input = value; + anytype_fillv2_p(input, output, length, 4, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/floor.rst.txt b/master/html/_sources/functionlib/dsplib/floor.rst.txt new file mode 100644 index 0000000..aa5236e --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/floor.rst.txt @@ -0,0 +1,78 @@ +Floor +================= + + + + 传入一个浮点型数组,对于数组中每一个元素执行向下取整操作。 + + .. math:: + + dst_i = floorf(src_i ) + + 输入: + - **input** - 输入数据地址。 + - **length** - 计算长度。 + - **core_mask** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 计算结果地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持fp32, fp64 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + + +.. c:function:: void hp_floor_s(half* src_data, half* dst_data, int length, int core_mask) +.. c:function:: void fp_floor_s(float* src_data, float* dst_data, int length, int core_mask) +.. c:function:: void dp_floor_s(double* src_data, double* dst_data, int length, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *output = (float *)0xC0000000; + int length = 1000; + int core_mask = 0xff; + fp_floor_s( input0, output, length,core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_floor_p(half* src_data, half* dst_data, int length) +.. c:function:: void fp_floor_p(float* src_data, float* dst_data, int length) +.. c:function:: void dp_floor_p(double* src_data, double* dst_data, int length) + + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 8 + + //FT78NE示例 + #include + #include + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10000000; //input在L2空间 + float *output = (float *)0xC0000000; + int length = 1000; + fp_floor_p( input0, output, length); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/floordiv.rst.txt b/master/html/_sources/functionlib/dsplib/floordiv.rst.txt new file mode 100644 index 0000000..1fdd465 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/floordiv.rst.txt @@ -0,0 +1,81 @@ +FloorDiv +================= + + + + 传入两个等长的浮点型数组,对于数组中对位元素做除法,再对除法所得结果执行向下取整操作。 + + .. math:: + + dst_i = floorf(\frac{input0_i}{input1_i}) + + 输入: + - **input0** - 被除数数据地址。 + - **input1** - 除数数据地址。 + - **length** - 计算长度。 + - **core_mask** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 计算结果地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持fp32, fp64 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + + +.. c:function:: void hp_floordiv_s(half* src_data0, half* src_data1, half* dst_data, int length, int core_mask) +.. c:function:: void fp_floordiv_s(float* src_data0, float* src_data1, float* dst_data, int length, int core_mask) +.. c:function:: void dp_floordiv_s(double* src_data0, double* src_data1, double* dst_data, int length, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *input1 = (float *)0xB0000000; + float *output = (float *)0xC0000000; + int length = 1000; + int core_mask = 0xff; + fp_floordiv_s( input0,input1, output, length,core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_floordiv_p(half* src_data0, half* src_data1, half* dst_data, int length) +.. c:function:: void fp_floordiv_p(float* src_data0, float* src_data1, float* dst_data, int length) +.. c:function:: void dp_floordiv_p(double* src_data0, double* src_data1, double* dst_data, int length) + + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + //FT78NE示例 + #include + #include + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10810000; //input在L2空间 + float *input1 = (float *)0x10820000; + float *output = (float *)0x10830000; + int length = 100; + fp_floordiv_p( input0, input1, output, length); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/fusedbatchnorm.rst.txt b/master/html/_sources/functionlib/dsplib/fusedbatchnorm.rst.txt new file mode 100644 index 0000000..6095913 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/fusedbatchnorm.rst.txt @@ -0,0 +1,91 @@ +FusedBatchNorm +================= +对输入张量执行融合批归一化(Fused Batch Normalization),在多核间拆分批量单元并行完成归一化与仿射变换。 + + .. math:: + + \hat{x}_{b,c} = \frac{x_{b,c} - mean_c}{\sqrt{variance_c + \epsilon}}, \quad y_{b,c} = scale_c \cdot \hat{x}_{b,c} + offset_c + + + 输入: + - **input** - 输入张量首地址,形状为 ``[unit, channel]``。 + - **scale** - 缩放系数数组首地址,长度为 ``channel``。 + - **offset** - 平移系数数组首地址,长度为 ``channel``。 + - **mean** - 归一化均值数组首地址,长度为 ``channel``。 + - **variance** - 归一化方差数组首地址,长度为 ``channel``。 + - **epsilon** - 数值稳定项。 + - **channel** - 通道数。 + - **unit** - 归一化单元数量(批量大小 × 高 × 宽)。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 写回融合批归一化计算结果的张量首地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + +**共享存储版本:** + +.. c:function:: void hp_fusedbatchnorm_s(const half *input, const half *scale, const half *offset, const half *mean, const half *variance, float epsilon, int channel, int unit, int core_mask, half *output) +.. c:function:: void fp_fusedbatchnorm_s(const float *input, const float *scale, const float *offset, const float *mean, const float *variance, float epsilon, int channel, int unit, int core_mask, float *output) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 15 + + // FT78NE 多核示例 + #include + + int main(void) { + const float *input = (const float *)0xA0000000; // DDR 存储 + const float *scale = (const float *)0xB0000000; + const float *offset = (const float *)0xB0001000; + const float *mean = (const float *)0xB0002000; + const float *variance = (const float *)0xB0003000; + float *output = (float *)0xC0000000; + int channel = 64; + int unit = 1024; + float epsilon = 1e-5f; + int core_mask = 0xff; + fp_fusedbatchnorm_s(input, scale, offset, mean, variance, + epsilon, channel, unit, core_mask, + output); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_fusedbatchnorm_p(const half *input, const half *scale, const half *offset, const half *mean, const half *variance, float epsilon, int channel, int unit, half *output) +.. c:function:: void fp_fusedbatchnorm_p(const float *input, const float *scale, const float *offset, const float *mean, const float *variance, float epsilon, int channel, int unit, float *output) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 14 + + // MT7004 单核示例 + #include + + int main(void) { + const half *input = (const half *)0x10000000; // L2 存储 + const half *scale = (const half *)0x10004000; + const half *offset = (const half *)0x10008000; + const half *mean = (const half *)0x1000C000; + const half *variance = (const half *)0x10010000; + half *output = (half *)0x10014000; + int channel = 32; + int unit = 512; + float epsilon = 1e-4f; + hp_fusedbatchnorm_p(input, scale, offset, mean, variance, + epsilon, channel, unit, output); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/groupnormfusion.rst.txt b/master/html/_sources/functionlib/dsplib/groupnormfusion.rst.txt new file mode 100644 index 0000000..0947ddc --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/groupnormfusion.rst.txt @@ -0,0 +1,100 @@ +GroupNormFusion +================= +对输入张量执行分组归一化融合操作(Group Normalization Fusion),在多核环境中按批次拆分并行完成均值、方差与归一化计算。 + + .. math:: + + \hat{x}_{(b,u,c)} = \frac{x_{(b,u,c)} - \mu_{(b,g)}}{\sqrt{\sigma^2_{(b,g)} + \epsilon}}, \quad y_{(b,u,c)} = \hat{x}_{(b,u,c)} \cdot scale_c + offset_c + + 其中 :math:`(b,u,c)` 表示批次、空间位置与通道索引,:math:`g` 为通道所属分组。 + + 输入: + - **input** - 输入张量首地址,形状 ``[batch, unit, channel]``。 + - **scale** - 通道缩放系数首地址,长度为 ``channel``。 + - **offset** - 通道偏移系数首地址,长度为 ``channel``。 + - **mean** - 批次 × 分组的均值缓冲区首地址,长度为 ``batch * num_groups``。 + - **variance** - 批次 × 分组的方差缓冲区首地址,长度为 ``batch * num_groups``。 + - **epsilon** - 数值稳定项。 + - **num_groups** - 分组数。 + - **channel** - 通道总数。 + - **unit** - 每批次内的归一化单元数(H×W)。 + - **batch** - 批次数。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 写回分组归一化结果的张量首地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + + +**共享存储版本:** + +.. c:function:: void hp_groupnormfusion_s(const half *input, const half *scale, const half *offset, half *mean, half *variance, float epsilon, int num_groups, int channel, int unit, int batch, int core_mask, half *output) +.. c:function:: void fp_groupnormfusion_s(const float *input, const float *scale, const float *offset, float *mean, float *variance, float epsilon, int num_groups, int channel, int unit, int batch, int core_mask, float *output) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 17 + + // FT78NE 多核示例 + #include + + int main(void) { + const float *input = (const float *)0xA0000000; // DDR 存储 + const float *scale = (const float *)0xB0000000; + const float *offset = (const float *)0xB0001000; + float *mean = (float *)0xB0002000; + float *variance = (float *)0xB0003000; + float *output = (float *)0xC0000000; + int num_groups = 8; + int channel = 64; + int unit = 49; + int batch = 32; + float epsilon = 1e-5f; + int core_mask = 0xff; + fp_groupnormfusion_s(input, scale, offset, mean, variance, + epsilon, num_groups, channel, unit, + batch, core_mask, output); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_groupnormfusion_p(const half *input, const half *scale, const half *offset, half *mean, half *variance, float epsilon, int num_groups, int channel, int unit, int batch, half *output) +.. c:function:: void fp_groupnormfusion_p(const float *input, const float *scale, const float *offset, float *mean, float *variance, float epsilon, int num_groups, int channel, int unit, int batch, float *output) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 16 + + // MT7004 单核示例 + #include + + int main(void) { + const half *input = (const half *)0x10000000; // L2 存储 + const half *scale = (const half *)0x10004000; + const half *offset = (const half *)0x10008000; + half *mean = (half *)0x1000C000; + half *variance = (half *)0x10010000; + half *output = (half *)0x10014000; + int num_groups = 4; + int channel = 32; + int unit = 36; + int batch = 16; + float epsilon = 1e-4f; + hp_groupnormfusion_p(input, scale, offset, mean, variance, + epsilon, num_groups, channel, unit, + batch, output); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/gru.rst.txt b/master/html/_sources/functionlib/dsplib/gru.rst.txt new file mode 100644 index 0000000..4441a91 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/gru.rst.txt @@ -0,0 +1,201 @@ +GRU +================= + +将多层门控循环单元 (GRU) RNN 应用于输入序列。 + +GRU 网络模型中有两个门:更新门和重置门。将两个连续的时间节点表示为 :math:`t - 1` 和 :math:`t`。给定一个在时刻 :math:`t` 的输入 :math:`x_t`,一个隐藏状态 :math:`h_{t-1}`,在时刻 :math:`t` 的更新门和重置门使用门控制机制计算。更新门 :math:`z_t` 用于控制前一时刻的状态信息被带入到当前状态中的程度,重置门 :math:`r_t` 控制前一状态有多少信息被写入到当前候选集 :math:`n_t` 上 + +对于输入序列中的每个元素,每一层计算以下函数: + +.. math:: + :nowrap: + + \begin{align*} + r_t &= \sigma(W_{ir}x_t + b_{ir} + W_{hr}h_{(t-1)} + b_{hr}) \\ + z_t &= \sigma(W_{iz}x_t + b_{iz} + W_{hz}h_{(t-1)} + b_{hz}) \\ + n_t &= \tanh(W_{in}x_t + b_{in} + r_t \odot (W_{hn}h_{(t-1)} + b_{hn})) \\ + h_t &= (1-z_t) \odot n_t + z_t \odot h_{(t-1)} + \end{align*} + +其中 :math:`\sigma` 是 sigmoid 激活函数,:math:`\odot` 是 Hadamard 积(逐元素乘积)。:math:`W, b` 是公式中输出和输入之间的可学习权重。例如,:math:`W_{ir}, b_{ir}` 是用于将输入 :math:`x_t` 转换为 :math:`r_t` 的权重和偏置。 + +注意,本算子中候选门 :math:`n_t` 的计算与原始论文和Mindspore框架略有不同。在原始实现中,:math:`r_t` 和上一隐藏状态 :math:`h_{(t-1)}` 之间的 Hadamard 积 (:math:`\odot`) 在与权重矩阵 :math:`W` 相乘和加上偏置之前进行: + +.. math:: + + n_t = \tanh(W_{in}x_t + b_{in} + W_{hn}(r_t \odot h_{(t-1)}) + b_{hn}) + +本算子采用 PyTorch 实现方式,是在 :math:`W_{hn}h_{(t-1)}` 之后完成的: + +.. math:: + + n_t = \tanh(W_{in}x_t + b_{in} + r_t \odot (W_{hn}h_{(t-1)} + b_{hn})) + +输入: + - **input** - 输入数据的地址。 + - **weight_g** - 可学习的输入-隐藏权重的地址。 + - **weight_r** - 可学习的隐藏-隐藏权重的地址。 + - **input_bias** - 可学习的输入-隐藏偏置的地址。 + - **state_bias** - 可学习的隐藏-隐藏偏置的地址。 + - **hidden_state** - 初始隐藏状态的地址。 + - **buffer** - 用于存储中间计算结果。 + - **gru_param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**GruParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct GruParameter { + int input_size_; // 输入input中预期特征的数量 + int hidden_size_; // 隐藏状态h中的特征数量 + int seq_len_; // 输入batch中每个序列的长度 + int batch_; // 总批次数 + int output_step_; // 每次循环中output步长 + int bidirectional_; // 是否为双向GRU + int input_row_align_; // 输入行对齐值 + int input_col_align_; // 输入列对齐值 + int state_row_align_; // 隐藏状态行对齐值 + int state_col_align_; // 隐藏状态列对齐值 + int check_seq_len_; // 进行计算的序列长度 + } GruParameter; + +输出: + - **output** - 输出地址。 + - **hidden_state** - 最终的隐藏状态。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享存储版本:** + +.. c:function:: void i8_Gru_s(int8_t *output, int8_t *input, int8_t *weight_g, int8_t *weight_r, int8_t *input_bias, int8_t *state_bias, int8_t *hidden_state, int8_t *buffer[4], GruParameter *gru_param, int core_mask) +.. c:function:: void hp_Gru_s(half *output, half *input, half *weight_g, half *weight_r, half *input_bias, half *state_bias, half *hidden_state, half *buffer[4], GruParameter *gru_param, int core_mask); +.. c:function:: void fp_Gru_s(float *output, float *input, float *weight_g, float *weight_r, float *input_bias, float *state_bias, float *hidden_state, float *buffer[4], GruParameter *gru_param, int core_mask); + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 41 + + void TestGruSMCFp32(int check_seq_len, int seq_len, int batch_size, int input_size, int bidirectional, int hidden_size, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float *output = (void*)0x88000000; + float *input = (void*)0x88100000; + float *weight_g = (void*)0x88200000; + float *weight_r = (void*)0x88300000; + float *input_bias = (void*)0x88400000; + float *state_bias = (void*)0x88500000; + float *hidden_state = (void*)0x88600000; + float** buffer = (float**)0x88700000; + float *output_hidden_state = (void*)0x88800000; + GruParameter* param = (GruParameter*)0x88900000; + int hidden_state_batch = 1; + int num_directions = 1; + if (bidirectional) { + hidden_state_batch = hidden_state_batch * 2; + num_directions = num_directions * 2; + } + int input_col_align = hidden_size; + int state_col_align = hidden_size; + if (logic_core_id == 0) { + memcpy(output_hidden_state, hidden_state, hidden_state_batch * batch_size * hidden_size * sizeof(float)); + memcpy(check_output_hidden_state, hidden_state, hidden_state_batch * batch_size * hidden_size * sizeof(float)); + buffer[0] = (void*)0x88A00000; + buffer[1] = (void*)0x88B00000; + buffer[2] = (void*)0x88C00000; + buffer[3] = (void*)0x88D00000; + param->batch_ = batch_size; + param->bidirectional_ = bidirectional; + param->hidden_size_ = hidden_size; + param->input_col_align_ = input_col_align; + param->input_size_ = input_size; + param->output_step_ = batch_size * hidden_size * num_directions; + param->seq_len_ = seq_len; + param->state_col_align_ = state_col_align; + param->check_seq_len_ = check_seq_len; + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_Gru_s(output, input, weight_g, weight_r, input_bias, state_bias, output_hidden_state, buffer, param, core_mask); + } + + void main() { + int check_seq_len = 2; + int seq_len = 2; + int batch_size = 2; + int input_size = 2; + int bidirectional = 0; + int hidden_size = 2; + int core_mask = 0b1111; + TestGruSMCFp32(check_seq_len, seq_len, batch_size, input_size, bidirectional, hidden_size, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_Gru_p(int8_t *output, int8_t *input, int8_t *weight_g, int8_t *weight_r, int8_t *input_bias, int8_t *state_bias, int8_t *hidden_state, int8_t *buffer[4], GruParameter *gru_param, int core_mask) +.. c:function:: void hp_Gru_p(half *output, half *input, half *weight_g, half *weight_r, half *input_bias, half *state_bias, half *hidden_state, half *buffer[4], GruParameter *gru_param, int core_mask); +.. c:function:: void fp_Gru_p(float *output, float *input, float *weight_g, float *weight_r, float *input_bias, float *state_bias, float *hidden_state, float *buffer[4], GruParameter *gru_param, int core_mask); + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 35 + + void TestGruL2Fp32(int check_seq_len, int seq_len, int batch_size, int input_size, int bidirectional, int hidden_size, int core_mask) { + float *output = (void*)0x10000000; // 私有存储版本地址设置在AM内 + float *input = (void*)0x10004000; + float *weight_g = (void*)0x10008000; + float *weight_r = (void*)0x1000C000; + float *input_bias = (void*)0x10010000; + float *state_bias = (void*)0x10014000; + float *hidden_state = (void*)0x10018000; + float** buffer = (float**)0x1001C000; + float *output_hidden_state = (void*)0x10020000; + GruParameter* param = (GruParameter*)0x10024000; + int hidden_state_batch = 1; + int num_directions = 1; + if (bidirectional) { + hidden_state_batch = hidden_state_batch * 2; + num_directions = num_directions * 2; + } + int input_col_align = hidden_size; + int state_col_align = hidden_size; + memcpy(output_hidden_state, hidden_state, hidden_state_batch * batch_size * hidden_size * sizeof(float)); + memcpy(check_output_hidden_state, hidden_state, hidden_state_batch * batch_size * hidden_size * sizeof(float)); + buffer[0] = (void*)0x10030000; + buffer[1] = (void*)0x10034000; + buffer[2] = (void*)0x10038000; + buffer[3] = (void*)0x1003C000; + param->batch_ = batch_size; + param->bidirectional_ = bidirectional; + param->hidden_size_ = hidden_size; + param->input_col_align_ = input_col_align; + param->input_size_ = input_size; + param->output_step_ = batch_size * hidden_size * num_directions; + param->seq_len_ = seq_len; + param->state_col_align_ = state_col_align; + param->check_seq_len_ = check_seq_len; + fp_Gru_p(output, input, weight_g, weight_r, input_bias, state_bias, output_hidden_state, buffer, param, core_mask); + } + + void main() { + int check_seq_len = 2; + int seq_len = 2; + int batch_size = 2; + int input_size = 2; + int bidirectional = 0; + int hidden_size = 2; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestGruL2Fp32(check_seq_len, seq_len, batch_size, input_size, bidirectional, hidden_size, core_mask); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/leaky_relu.rst.txt b/master/html/_sources/functionlib/dsplib/leaky_relu.rst.txt new file mode 100644 index 0000000..769eca8 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/leaky_relu.rst.txt @@ -0,0 +1,75 @@ +LeakyReLu +================= + +Leaky ReLU激活函数。 + +该激活函数定义如下: + +.. math:: + leaky\_relu(x) = + \begin{cases} + x, & \text{if } x \geq 0; \\ + \alpha \cdot x, & \text{otherwise.} + \end{cases} + +其中, :math:`\alpha` 表示 alpha 参数。 + +输入: + - **input** - 输入数据的地址。 + - **elem_cnt** - 计算长度。 + - **alpha** - 公式中的alpha参数。 + - **core_mask** - 核掩码。 + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + + +**共享存储版本:** + +.. c:function:: void fp_leaky_relu_s(float* input, float* output, int elem_cnt, float alpha, int core_mask) +.. c:function:: void hp_leaky_relu_s(half* input, half* output, int elem_cnt, half alpha, int core_mask) +.. c:function:: void i8_leaky_relu_s(const int8_t* input, int8_t* output, int elem_cnt, float alpha, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 7 + + void main() { + float* input = (float*)0x82000000; + float* output = (float*)0x88000000; + int length = 1000; + float alpha = 0.9; + int core_mask = 0b1111; + fp_leaky_relu_s(input, output, length, alpha, core_mask); + } + +**私有存储版本:** + +.. c:function:: void fp_leaky_relu_p(float* input, float* output, int elem_cnt, float alpha, int core_mask) +.. c:function:: void hp_leaky_relu_p(half* input, half* output, int elem_cnt, half alpha, int core_mask) +.. c:function:: void i8_leaky_relu_p(const int8_t* input, int8_t* output, int elem_cnt, float alpha, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 7 + + void main() { + float* input = (float*)0x10000000; // 私有存储版本地址设置在AM内 + float* output = (float*)0x10010000; + int length = 1000; + float alpha = 0.9; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + fp_leaky_relu_p(input, output, length, alpha, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/linspace.rst.txt b/master/html/_sources/functionlib/dsplib/linspace.rst.txt new file mode 100644 index 0000000..ba87351 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/linspace.rst.txt @@ -0,0 +1,68 @@ +LinSpace +================= + +生成从 ``start`` 到 ``end`` 的等间距序列,线性插值 + +.. math:: + + \text{output}_i = \text{start} + i \cdot \frac{\text{end} - \text{start}}{\text{length} - 1},\quad i = 0, 1, \dots, \text{length} - 1 + +输入: + - **start** - 序列起始值。 + - **end** - 序列终止值(包含)。 + - **length** - 序列点数;要求 length ≥ 2。 + - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 输出序列地址(float32)。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - 多核版本按行数均匀分割,各核处理自己的段落。 + - 步长计算为 (end - start) / (length - 1)。 + +**共享存储版本:** + +.. c:function:: void fp_linspace_s(float *output, float start, float end, int length, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + #include + + int main(int argc, char* argv[]) { + float *output = (float *)0xA0000000; // DDR + float start = 0.0f; + float end = 100.0f; + int length = 1001; + int core_mask = 0xff; + fp_linspace_s(output, start, end, length, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void fp_linspace_p(float *output, float start, float step, int num) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + #include + + int main(int argc, char* argv[]) { + float *output = (float *)0x10000000; // L2 + float start = 1.5f; + float step = 0.5f; + int num = 1000; + fp_linspace_p(output, start, step, num); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/lstm.rst.txt b/master/html/_sources/functionlib/dsplib/lstm.rst.txt new file mode 100644 index 0000000..f693278 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/lstm.rst.txt @@ -0,0 +1,181 @@ +LSTM +================= +一种常用的 循环神经网络(RNN) 模块,用于处理具有时序依赖特征的数据(如语音、文本、时间序列等)。每个时间步的公式化描述如下。 + +.. math:: + + \begin{aligned} + i_t &= \sigma(W_{ii} x_t + W_{hi} h_{t-1} + b_i) && \text{(输入门)} \\[6pt] + f_t &= \sigma(W_{if} x_t + W_{hf} h_{t-1} + b_f) && \text{(遗忘门)} \\[6pt] + g_t &= \tanh(W_{ig} x_t + W_{hg} h_{t-1} + b_g) && \text{(候选状态)} \\[6pt] + o_t &= \sigma(W_{io} x_t + W_{ho} h_{t-1} + b_o) && \text{(输出门)} \\[6pt] + c_t &= f_t \odot c_{t-1} + i_t \odot g_t && \text{(细胞状态更新)} \\[6pt] + h_t &= o_t \odot \tanh(c_t) && \text{(隐藏状态更新)} + \end{aligned} + +- :math:`x_t` : 当前时间步输入向量 +- :math:`h_{t-1}` : 上一时间步的隐藏状态 +- :math:`c_{t-1}` : 上一时间步的细胞状态 +- :math:`i_t, f_t, g_t, o_t` : 四个门(输入门、遗忘门、候选门、输出门) +- :math:`W_*` : 对应的权重矩阵 +- :math:`b_*` : 偏置项 +- :math:`\sigma(\cdot)` : Sigmoid 函数 +- :math:`\odot` : 元素乘 + + + +输入: + - **input** - 输入序列数据,形状为 :math:`(seq_len, batch, input_size)`,即每个时间步的输入特征。 + - **weight_i** - 输入到各门 :math:`(input、forget、cell、output)` 的权重矩阵,大小为 4 * hidden_size * input_size。 + - **weight_h** - 上一隐藏状态到各门的权重矩阵,大小为 :math:`4 * hidden_size * hidden_size` + - **input_bias** - 输入部分的偏置项,对应 4 个门的偏置。 + - **state_bias** - 隐藏状态部分的偏置项(也是 :math:`4 * hidden_size`),与 input_bias 一起求和形成总偏置。 + - **hidden_state** - 当前批次初始隐藏状态输入( :math:`h₀` ),执行后更新为最后时刻的隐藏状态输出( :math:`hₜ`) + - **cell_state** - 当前批次初始细胞状态输入( :math:`c₀`),执行后更新为最后时刻的细胞状态输出( :math:`cₜ`)。 + - **buffer** - 临时工作区指针数组(中间计算缓存,如门值、激活结果、临时矩阵等,用于优化性能)。 + - **LstmParameter** - LSTM 配置参数结构体,包含输入大小、隐藏层维度、序列长度、是否双向等信息。 + - **core_mask** - 核掩码(仅适用于共享存储版本)。 + +**LstmParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct LstmParameter { + int input_size_;//每个时间步输入向量的维度(输入特征数)。 + int hidden_size_;//LSTM 隐藏状态的维度(每个门的内部计算大小)。 + int project_size_;//投影层输出维度(用于 LSTMP,有则在输出前线性压缩隐藏状态)。 + int output_size_;//实际输出维度,等于 hidden_size_ 或 project_size_(取决于是否使用投影层)。 + int seq_len_;//输入序列的时间步数(序列长度)。 + int batch_;//批次大小(一次处理的样本数量)。 + // other parameter + int output_step_;//指定输出第几个时间步的结果(通常为最后一步或每步)。 + bool bidirectional_;//是否为双向 LSTM(true 表示前向和后向各一层)。 + float zoneout_cell_;//单元状态的 Zoneout 比例(防止过拟合的正则化参数)。 + float zoneout_hidden_;//隐藏状态的 Zoneout 比例(防止过拟合)。 + int input_row_align_;//输入张量的行对齐参数(用于 DMA 或 SIMD 加速的内存对齐)。 + int input_col_align_;//输入张量的列对齐参数。 + int state_row_align_;//状态张量(hidden/cell)的行对齐参数。 + int state_col_align_;//状态张量的列对齐参数。 + int proj_col_align_;//投影层矩阵的列对齐参数。 + bool has_bias_;//是否包含偏置项(true 表示使用 bias)。 + } LstmParameter; + +输出: + - **output** - 计算结果地址,存放 LSTM 每个时间步输出结果的缓冲区,维度通常为 :math:`(seq\_len, batch, output\_size)` + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持fp32 + - MT7004 支持fp32 + +**共享存储版本:** + +.. c:function:: void fp_Lstm_s(float *output, const float *input, const float *weight_i, const float *weight_h, const float *input_bias,const float *state_bias, float *hidden_state, float *cell_state, float *buffer[9],const LstmParameter *lstm_param, int core_mask) + +**C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 40-42 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + LstmParameter *lstm_param = (LstmParameter *)0x90000000; + lstm_param->seq_len_ = 20; + lstm_param->batch_ = 1; + lstm_param->input_size_ = 2000; + lstm_param->hidden_size_ = 3; + lstm_param->bidirectional_ = false; + float * input = (float *)0xA0000000; //input在DDR空间 + float * weight_i = (float *)0xA1000000; + float * weight_h = (float *)0xA3000000; + float *input_bias_ =(float *) 0xB0900000; + float * state_bias_ =(float *) 0xB0B00000; + float * output_s = (float *)0xC0000000; + float *hidden_state_s = (float *)0xC0100000; + float *cell_state_s = (float *)0xC0200000; + float *buffer[9]; + float * packed_input_ = (float *)0xB0000000; + buffer[0] = packed_input_; + float * gate = (float *)0xB0100000; + buffer[1] = gate; + float * packed_state = (float *)0xB0200000; + buffer[2] = packed_state; + float * state_gate = (float *)0xB0300000; + buffer[3] = state_gate; + float * cell_buffer = (float *)0xB0400000; + buffer[4] = cell_buffer; + float * hidden_buffer = (float *)0xB0500000; + buffer[5] = hidden_buffer; + float * packed_output = (float *)0xB0600000; + buffer[6] = packed_output; + float * left_matrix = (float *)0xB0700000; + buffer[7] = left_matrix; + float * packed_ptr = (float *)0xB0800000; + buffer[8] = packed_ptr; + int core_mask = 0xff; + fp_Lstm_s(output_s, input, weight_i, weight_h, input_bias_, + state_bias, hidden_state_s, cell_state_s, buffer, + lstm_param, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void fp_Lstm_p(float *output, const float *input, const float *weight_i, const float *weight_h, const float *input_bias, const float *state_bias, float *hidden_state, float *cell_state, float *buffer[9], const LstmParameter *lstm_param) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 38-40 + + //FT78NE示例 + #include + #include + int main(int argc, char* argv[]) { + LstmParameter *lstm_param = (LstmParameter *)0x10000000; + lstm_param->seq_len_ = 4; + lstm_param->batch_ = 1; + lstm_param->input_size_ = 2; + lstm_param->hidden_size_ = 3; + lstm_param->bidirectional_ = false; + float * input = (float *)0x10000200; //input在DDR空间 + float * weight_i = (float *)0x10000400; + float * weight_h = (float *)0x10000600; + float *input_bias_ =(float *) 0x10000800; + float * state_bias_ =(float *) 0x10000A00; + float * output_s = (float *)0x10000C00; + float *hidden_state_s = (float *)0x10000E00; + float *cell_state_s = (float *)0x10001000; + float *buffer[9]; + float * packed_input_ = (float *)0x10001200; + buffer[0] = packed_input_; + float * gate = (float *)0x10001400; + buffer[1] = gate; + float * packed_state = (float *)0x10001600; + buffer[2] = packed_state; + float * state_gate = (float *)0x10001800; + buffer[3] = state_gate; + float * cell_buffer = (float *)0x10001A00; + buffer[4] = cell_buffer; + float * hidden_buffer = (float *)0x10001C00; + buffer[5] = hidden_buffer; + float * packed_output = (float *)0x10001F00; + buffer[6] = packed_output; + float * left_matrix = (float *)0x10002000; + buffer[7] = left_matrix; + float * packed_ptr = (float *)0x10002200; + buffer[8] = packed_ptr; + fp_Lstm_p(output_s, input, weight_i, weight_h, input_bias_, + state_bias, hidden_state_s, cell_state_s, buffer, + lstm_param); + return 0; + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/matmulfusion.rst.txt b/master/html/_sources/functionlib/dsplib/matmulfusion.rst.txt new file mode 100644 index 0000000..bfbe446 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/matmulfusion.rst.txt @@ -0,0 +1,93 @@ +MatMulFusion +================= + +矩阵乘法融合(可选偏置和激活),计算: + +.. math:: + + C = \operatorname{act}(A \times B + \text{bias}) + +其中 ``A`` 形状为 :math:`M\times K`,``B`` 为 :math:`K\times N`,``C`` 与可选的 ``bias`` 为 :math:`M\times N`。 +激活 ``act`` 支持: + +- ``0``: 无激活(Identity) +- ``1``: ReLU +- ``2``: ReLU6 + +输入: + - **A** - 输入矩阵 A(行优先,连续存储)。大小 M×K。 + - **B** - 输入矩阵 B(行优先,连续存储)。大小 K×N。 + - **bias** - 偏置矩阵(可为 NULL,大小 M×N)。 + - **M, N, K** - 维度参数。 + - **activation_type** - 激活类型,取值 {0,1,2}。 + - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **C** - 输出矩阵(行优先,大小 M×N)。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - 复数类型的激活逐分量应用于实部与虚部。 + - 请确保输入按行优先连续布局,且不发生类型范围溢出;int16/int32 计算未做饱和裁剪。 + - 共享存储版本要求地址位于 GSM/DDR/SMC 等共享可见空间。 + +**共享存储版本:** + +.. c:function:: void i16_matmulfusion_s(int16_t *A, int16_t *B, int16_t *C, int16_t *bias, int M, int N, int K, int activation_type, int core_mask) +.. c:function:: void i32_matmulfusion_s(int32_t *A, int32_t *B, int32_t *C, int32_t *bias, int M, int N, int K, int activation_type, int core_mask) +.. c:function:: void fp_matmulfusion_s(float *A, float *B, float *C, float *bias, int M, int N, int K, int activation_type, int core_mask) +.. c:function:: void dp_matmulfusion_s(double *A, double *B, double *C, double *bias, int M, int N, int K, int activation_type, int core_mask) +.. c:function:: void c64_matmulfusion_s(float complex *A, float complex *B, float complex *C, float complex *bias, int M, int N, int K, int activation_type, int core_mask) +.. c:function:: void c128_matmulfusion_s(double complex *A, double complex *B, double complex *C, double complex *bias, int M, int N, int K, int activation_type, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 12 + + #include + #include + + int main(int argc, char* argv[]) { + float *A = (float *)0xA0000000; // DDR + float *B = (float *)0xA1000000; // DDR + float *C = (float *)0xA2000000; // DDR + float *bias = (float *)0xA3000000; // DDR,可为 NULL + int M = 512, N = 512, K = 512; + int activation_type = 1; // ReLU + int core_mask = 0xff; // 8 核 + fp_matmulfusion_s(A, B, C, bias, M, N, K, activation_type, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void i16_matmulfusion_p(int16_t *A, int16_t *B, int16_t *C, int16_t *bias, int M, int N, int K, int activation_type) +.. c:function:: void i32_matmulfusion_p(int32_t *A, int32_t *B, int32_t *C, int32_t *bias, int M, int N, int K, int activation_type) +.. c:function:: void fp_matmulfusion_p(float *A, float *B, float *C, float *bias, int M, int N, int K, int activation_type) +.. c:function:: void dp_matmulfusion_p(double *A, double *B, double *C, double *bias, int M, int N, int K, int activation_type) +.. c:function:: void c64_matmulfusion_p(float complex *A, float complex *B, float complex *C, float complex *bias, int M, int N, int K, int activation_type) +.. c:function:: void c128_matmulfusion_p(double complex *A, double complex *B, double complex *C, double complex *bias, int M, int N, int K, int activation_type) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + #include + + int main(int argc, char* argv[]) { + double *A = (double *)0x10000000; // L2 + double *B = (double *)0x10020000; // L2 + double *C = (double *)0x10040000; // L2/DDR + double *bias = NULL; // 可为 NULL + int M = 128, N = 128, K = 128; + int activation_type = 0; // None + dp_matmulfusion_p(A, B, C, bias, M, N, K, activation_type); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/raggedrange.rst.txt b/master/html/_sources/functionlib/dsplib/raggedrange.rst.txt new file mode 100644 index 0000000..e445805 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/raggedrange.rst.txt @@ -0,0 +1,88 @@ +RaggedRange +================= + +为每个区间生成等差序列并拼接到一个一维输出,同时返回每段的边界索引。 + +.. math:: + + \begin{aligned} + L_k &= \left\lceil \frac{\text{limit}_k - \text{start}_k}{\text{delta}_k} \right\rceil,\quad k=0,\dots,\text{range\_count}-1 \\ + \text{splits}[0] &= 0,\quad \text{splits}[k+1] = \text{splits}[k] + L_k \\ + \text{values}[\text{splits}[k] + j] &= \text{start}_k + j \cdot \text{delta}_k,\quad j=0,\dots,L_k-1 + \end{aligned} + +输入: + - **starts** - 各段起始值数组地址。 + - **limits** - 各段终止上界数组地址(半开区间 [start, limit) 语义)。 + - **deltas** - 各段步长数组地址,要求 ``delta_k != 0``,且方向与 ``limit_k - start_k`` 一致,否则该段长度视为 0。 + - **range_count** - 段数 K。 + - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **values** - 扁平化拼接的结果数组地址,长度为 ``splits[range_count]``。 + - **splits** - 长度为 ``range_count + 1`` 的整型数组,记录各段边界,且 ``splits[0] = 0``。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - 当前实现覆盖 int8、int16、int32、fp32、fp64 五种类型。 + - 不进行数值饱和裁剪;请确保序列不会在对应类型范围内溢出。 + - 共享存储版本要求输入/输出地址位于共享可见的存储空间(如 GSM/DDR/SMC 等)。 + +**共享存储版本:** + +.. c:function:: void i8_raggedrange_s(int8_t *starts, int8_t *limits, int8_t *deltas, int range_count, int8_t *values, int *splits, int core_mask) +.. c:function:: void i16_raggedrange_s(int16_t *starts, int16_t *limits, int16_t *deltas, int range_count, int16_t *values, int *splits, int core_mask) +.. c:function:: void i32_raggedrange_s(int32_t *starts, int32_t *limits, int32_t *deltas, int range_count, int32_t *values, int *splits, int core_mask) +.. c:function:: void fp_raggedrange_s(float *starts, float *limits, float *deltas, int range_count, float *values, int *splits, int core_mask) +.. c:function:: void dp_raggedrange_s(double *starts, double *limits, double *deltas, int range_count, double *values, int *splits, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 12 + + #include + #include + + int main(int argc, char* argv[]) { + float *starts = (float *)0xA0000000; // DDR + float *limits = (float *)0xA0100000; // DDR + float *deltas = (float *)0xA0200000; // DDR + float *values = (float *)0xA0300000; // DDR + int *splits = (int *)0xA0400000; // DDR + int range_count = 3; + int core_mask = 0xff; + fp_raggedrange_s(starts, limits, deltas, range_count, values, splits, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void i8_raggedrange_p(int8_t *starts, int8_t *limits, int8_t *deltas, int range_count, int8_t *values, int *splits) +.. c:function:: void i16_raggedrange_p(int16_t *starts, int16_t *limits, int16_t *deltas, int range_count, int16_t *values, int *splits) +.. c:function:: void i32_raggedrange_p(int32_t *starts, int32_t *limits, int32_t *deltas, int range_count, int32_t *values, int *splits) +.. c:function:: void fp_raggedrange_p(float *starts, float *limits, float *deltas, int range_count, float *values, int *splits) +.. c:function:: void dp_raggedrange_p(double *starts, double *limits, double *deltas, int range_count, double *values, int *splits) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + #include + + int main(int argc, char* argv[]) { + int32_t *starts = (int32_t *)0x10000000; // L2 + int32_t *limits = (int32_t *)0x10001000; // L2 + int32_t *deltas = (int32_t *)0x10002000; // L2 + int32_t *values = (int32_t *)0x10003000; // L2/DDR + int *splits = (int *)0x10004000; // L2/DDR + int range_count = 2; + i32_raggedrange_p(starts, limits, deltas, range_count, values, splits); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/range.rst.txt b/master/html/_sources/functionlib/dsplib/range.rst.txt new file mode 100644 index 0000000..f5e7db7 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/range.rst.txt @@ -0,0 +1,78 @@ +Range +================= + +生成等差序列,逐元素写入输出: + +.. math:: + + output_i = start + i \times delta,\quad i = 0, 1, \dots, \text{length} - 1 + +输入: + - **start** - 序列起始值。 + - **delta** - 公差。 + - **length** - 序列长度。 + - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 + +输出: + - **output** - 输出数据地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持 int8, int16, int32, fp32, fp64。 + - MT7004 支持 fp16, fp32, int16, int32(如需 fp16,请使用相应 fp16 实现)。 + +**共享存储版本:** + +.. c:function:: void i8_range_s(int8_t* output, int8_t start, int8_t delta, int length, int core_mask) +.. c:function:: void i16_range_s(int16_t* output, int16_t start, int16_t delta, int length, int core_mask) +.. c:function:: void i32_range_s(int32_t* output, int32_t start, int32_t delta, int length, int core_mask) +.. c:function:: void fp_range_s(float* output, float start, float delta, int length, int core_mask) +.. c:function:: void dp_range_s(double* output, double start, double delta, int length, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + #include + #include + + int main(int argc, char* argv[]) { + float *output = (float *)0xA0000000; // DDR + float start = 1.5f; + float delta = 0.5f; + int length = 1000; + int core_mask = 0xff; + fp_range_s(output, start, delta, length, core_mask); + return 0; + } + +**私有存储版本:** + +.. c:function:: void i8_range_p(int8_t* output, int8_t start, int8_t delta, int length) +.. c:function:: void i16_range_p(int16_t* output, int16_t start, int16_t delta, int length) +.. c:function:: void i32_range_p(int32_t* output, int32_t start, int32_t delta, int length) +.. c:function:: void fp_range_p(float* output, float start, float delta, int length) +.. c:function:: void dp_range_p(double* output, double start, double delta, int length) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + #include + #include + + int main(int argc, char* argv[]) { + float *output = (float *)0x10000000; // L2 + float start = 1.5f; + float delta = 0.5f; + int length = 1000; + fp_range_p(output, start, delta, length); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/reduce.rst.txt b/master/html/_sources/functionlib/dsplib/reduce.rst.txt new file mode 100644 index 0000000..ad2646e --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/reduce.rst.txt @@ -0,0 +1,211 @@ +Reduce +================= + +对指定维度进行归约。 + +输入: + - **src_data** - 输入数据的地址 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ReduceParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ReduceParameter { + void** data_buffers_; // 用于存储中间计算结果 + int* outer_sizes_; // 处理某个规约轴时,该轴之前所有轴的元素数 + int* inner_sizes_; // 某个规约轴之后的所有元素数 + int* axis_sizes_; // 规约轴的元素数 + int total_num_; // 输入张量的总元素数 + int num_axes_; // 待规约轴的数目 + int mode_; // 规约模式 + int output_num_; // 输出张量的总元素数 + /**该算子会根据ReduceParameter中的mode_参数选择实际规约所使用的方法。共有如下几种方法: + Reduce_Mean=0, + Reduce_Max=1, + Reduce_Min=2, + Reduce_Prod=3, + Reduce_Sum=4, + Reduce_SumSquare=5, + Reduce_ASum=6, + Reduce_L2Norm=7 + **/ + } ReduceParameter; + +输出: + - **dst_data** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64 + - MT7004 支持fp16, fp32, int16, int32 + +**共享存储版本:** + +.. c:function:: void i8_reduce_s(int8_t* src_data, int8_t* dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void i16_reduce_s(int16_t* src_data, half* dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void i32_reduce_s(int* src_data, float* dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void hp_reduce_s(half* src_data, half* dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void fp_reduce_s(float* src_data, float* dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void dp_reduce_s(double* src_data, double* dst_data, ReduceParameter* param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 50 + + void PackParam(ReduceParameter* param, int ndim, int* input_shape, int num_axes, int* axes) { + int tmp_input_shape[8]; + int total_num = 1; + int i, j, k; + for (i = 0; i < ndim; i++) { + tmp_input_shape[i] = input_shape[i]; + total_num *= input_shape[i]; + } + param->total_num_ = total_num; + int offset_size = 0; + for (i = 0; i < num_axes; ++i) { + int axis = axes[i]; + int outer_size = 1; + for (j = 0; j < axis; j++) { + outer_size *= tmp_input_shape[j]; + } + param->outer_sizes_[offset_size] = outer_size; + int inner_size = 1; + for (k = axis + 1; k < ndim; k++) { + inner_size *= tmp_input_shape[k]; + } + param->inner_sizes_[offset_size] = inner_size; + param->axis_sizes_[offset_size] = tmp_input_shape[axis]; + offset_size++; + tmp_input_shape[axis] = 1; + } + } + + void TestReduceSMCFp32(int* input_shape, int ndim, int* axes, int num_axes, int mode, int keep_dims, int core_mask) { + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + int core_num = GetCoreNum(core_mask); + float* input = (float*)0x88000000; + float* output = (float*)0x98000000; + ReduceParameter* param = (ReduceParameter*)0xA8480000; + if (logic_core_id == 0) { + param->num_axes_ = num_axes; + param->mode_ = mode; + param->data_buffers_ = (void**)0xA8483000; + param->inner_sizes_ = (int*)0xA8484000; + param->outer_sizes_ = (int*)0xA8485000; + param->axis_sizes_ = (int*)0xA8486000; + int i; + for (i = 0; i < num_axes - 1; i++) { + param->data_buffers_[i] = (void*)(0xA8490000 + 0x1000000); + } + PackParam(param, ndim, input_shape, num_axes, axes); + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_reduce_s(input, check, param, core_mask); + } + + void main(){ + int input_shape[3] = {4, 5, 5}; + int ndim = 3; + int axes[1] = {1}; + int num_axes = 1; + int mode = 7; + int keep_dims = 1; + int core_mask = 0b1111; + TestReduceSMCFp32(input_shape, ndim, axes, num_axes, mode, keep_dims, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_reduce_p(int8_t* src_data, int8_t* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void i16_reduce_p(int16_t* src_data, half* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void i32_reduce_p(int* src_data, float* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void hp_reduce_p(half* src_data, half* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void fp_reduce_p(float* src_data, float* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) +.. c:function:: void dp_reduce_p(double* src_data, double* dst_data, void* tmp_src_data, void* tmp_dst_data, ReduceParameter* param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 59 + + void PackParam(ReduceParameter* param, int ndim, int* input_shape, int num_axes, int* axes) { + int tmp_input_shape[8]; + int total_num = 1; + int i, j, k; + for (i = 0; i < ndim; i++) { + tmp_input_shape[i] = input_shape[i]; + total_num *= input_shape[i]; + } + param->total_num_ = total_num; + int offset_size = 0; + for (i = 0; i < num_axes; ++i) { + int axis = axes[i]; + int outer_size = 1; + for (j = 0; j < axis; j++) { + outer_size *= tmp_input_shape[j]; + } + param->outer_sizes_[offset_size] = outer_size; + int inner_size = 1; + for (k = axis + 1; k < ndim; k++) { + inner_size *= tmp_input_shape[k]; + } + param->inner_sizes_[offset_size] = inner_size; + param->axis_sizes_[offset_size] = tmp_input_shape[axis]; + offset_size++; + tmp_input_shape[axis] = 1; + } + } + + void TestReduceL2Fp32(int* input_shape, int ndim, int* axes, int num_axes, int mode, int keep_dims, int core_mask) { + float* input = (float*)0x10000000; // 原始输入输出数据需分配在AM中 + float* output = (float*)0x10010000; + float* tmp_input = (float*)0x88000000; // 临时输入输出空间需分配在DDR或SMC中 + float* tmp_output = (float*)0x98000000; + ReduceParameter* param = (ReduceParameter*)0x10020000; + param->num_axes_ = num_axes; + param->mode_ = mode; + param->data_buffers_ = (void**)0x10021000; + param->inner_sizes_ = (int*)0x10022000; + param->outer_sizes_ = (int*)0x10023000; + param->axis_sizes_ = (int*)0x10024000; + int i, j; + for (i = 0; i < ndim; i++) { + int reduce_axis = 0; + for (j = 0; j < num_axes; j++) { + if (axes[j] == i) { + reduce_axis = 1; + break; + } + } + if (!reduce_axis) { + length *= input_shape[i]; + } + } + for (i = 0; i < num_axes - 1; i++) { + param->data_buffers_[i] = (void*)(0xA8490000 + 0x1000000); // 每一个中间计算结果空间都需分配在DDR或SMC中 + } + param->output_num_ = length; + PackParam(param, ndim, input_shape, num_axes, axes); + fp_reduce_p(input, check, param, core_mask); + } + + void main() { + int input_shape[3] = {4, 5, 5}; + int ndim = 3; + int axes[1] = {1}; + int num_axes = 1; + int mode = 7; + int keep_dims = 1; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestReduceL2Fp32(input_shape, ndim, axes, num_axes, mode, keep_dims, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/resize.rst.txt b/master/html/_sources/functionlib/dsplib/resize.rst.txt new file mode 100644 index 0000000..16992d5 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/resize.rst.txt @@ -0,0 +1,96 @@ +Resize +================= + +对输入图像使用给定的插值方式去调整为给定的尺寸大小。 + +输入: + - **input** - 输入数据的地址 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ResizeParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ResizeParameter { + int* input_shape_; // 输入张量形状 + int* output_shape_; // 输出张量形状 + int* x_lefts_; // 用于存储预处理结果 + int* x_rights_; // 用于存储预处理结果 + int* y_tops_; // 用于存储预处理结果 + int* y_bottoms_; // 用于存储预处理结果 + void* x_weights_; // 用于存储预处理结果 + void* y_weights_; // 用于存储预处理结果 + void* line_buffers_; // 用于存储中间结果 + int method_; // 所用的插值方法,0:最邻近插值,1:双线性插值,2:双三次插值 + int coordinate_transform_mode_; // 像素点对齐方式,0:非对称,1:中心对齐,2:偏移半像素 + float cubic_coeff_; // 一个仅在双三次插值中使用到的系数 + } ResizeParameter; + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, fp32 + - MT7004 支持fp16, fp32 + +**共享/私有存储版本:** + +.. c:function:: void i8_resize_anycore(int8_t* input, int8_t* output, ResizeParameter* param, int core_mask) +.. c:function:: void hp_resize_anycore(half* input, half* output, ResizeParameter* param, int core_mask) +.. c:function:: void fp_resize_anycore(float* input, float* output, ResizeParameter* param, int core_mask) + +私有及共享空间版本均使用这些函数。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 30 + + void TestResizeFp32SMC(int* input_shape, int* output_shape, ResizeMethod method, CoordinateTransformMode mode, float cubic_coeff, int core_mask) { + int core_id = get_core_id(); + int core_num = GetCoreNum(core_mask); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + float* input = (float*)0x84000000; // 测试私有空间时地址设置在私有空间内即可 + float* output = (float*)0x85000000; + ResizeParameter* param = (ResizeParameter*)0x86000000; + if (logic_core_id == 0) { + param->coordinate_transform_mode_ = mode; + param->method_ = method; + param->cubic_coeff_ = cubic_coeff; + param->input_shape_ = (int*)0x87000000; + memcpy(param->input_shape_, input_shape, sizeof(int) * 4); + param->output_shape_ = (int*)0x87100000; + memcpy(param->output_shape_, output_shape, sizeof(int) * 4); + param->line_buffers_ = (void*)0x88000000; + param->x_lefts_ = (int*)0x89000000; + param->x_rights_ = (int*)0x8A000000; + param->y_bottoms_ = (int*)0x8B000000; + param->y_tops_ = (int*)0x8C000000; + param->x_weights_ = (void*)0x8D000000; + param->y_weights_ = (void*)0x8E000000; + if (method == BILINEAR) { + PrepareResizeBilinear(param); // 做预处理 + } else if (method == CUBIC) { + PrepareResizeBicubic(param, cubic_coeff); // 做预处理 + } + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_resize_anycore(input, check, param, core_mask); + } + + void main(){ + int input_shape[4] = {2, 4, 4, 4}; + int output_shape[4] = {2, 8, 8, 4}; + ResizeMethod method = NEAREST; + CoordinateTransformMode mode = ALIGN_CORNERS; + float cubic_coeff = -0.75; + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + TestResizeFp32SMC(input_shape, output_shape, method, mode, cubic_coeff, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/reverse_sequence.rst.txt b/master/html/_sources/functionlib/dsplib/reverse_sequence.rst.txt new file mode 100644 index 0000000..49c00ad --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/reverse_sequence.rst.txt @@ -0,0 +1,105 @@ +ReverseSequence +================= + +对输入序列进行部分反转。 + +输入: + - **src** - 需反转数据的地址 + - **seq_lengths** - 指定反转长度,为一维向量。 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ReverseSequenceParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ReverseSequenceParameter { + int* shape_; // 输入和输出张量的形状 + int* strides_; // 一个记录张量每一维步长的数组 + int seq_dim_; // 指定反转的维度 + int batch_dim_; // 指定切片维度 + int ndim_; // 输入和输出张量的维度 + int type_size_; // 输入和输出张量数据类型的长度 + int copy_elem_num_; // 在inner_count循环中一次应被拷贝的元素数目 + int outer_stride_; // 外层元素间的步长 + int outer_count_; // 外层元素数 + int inner_stride_; // 内层元素间的步长 + int inner_count_; // 内层元素数 + } ReverseSequenceParameter; + +输出: + - **dst** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享/私有存储版本:** + +.. c:function:: void anytype_reverse_sequence_anycore(void* src, void* dst, int* seq_lengths, ReverseSequenceParameter* param, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型,改变param中的type_size_参数即可。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 41 + + void Resize(ReverseSequenceParameter* param) { + param->strides_ = (int*)0xA8020000; + ComputeStrides(param->shape_, param->strides_, param->ndim_); + int less_dim = param->batch_dim_ > param->seq_dim_ ? param->seq_dim_ : param->batch_dim_; + int greater_dim = param->batch_dim_ < param->seq_dim_ ? param->seq_dim_ : param->batch_dim_; + // calculate the size of elements should be copied at one time + param->copy_elem_num_ = CountElementAfterDim(param->shape_, greater_dim, param->ndim_); + // calculate the number of elements before the less axis and the stride + param->outer_count_ = CountElementBeforeDim(param->shape_, less_dim); + param->outer_stride_ = param->shape_[less_dim] * CountElementAfterDim(param->shape_, less_dim, param->ndim_); + // calculate the number of elements between the less axis and the greater axis and the stride + param->inner_count_ = 1; + int i; + for (i = less_dim + 1; i < greater_dim; i++) { + param->inner_count_ *= param->shape_[i]; + } + param->inner_stride_ = param->shape_[greater_dim] * CountElementAfterDim(param->shape_, greater_dim, param->ndim_); + } + + void TestReverseSequenceFp32(int* shape, int* orig_seq_lengths, int seq_dim, int batch_dim, int ndim, int core_mask) { + int core_id = get_core_id(); + int core_num = GetCoreNum(core_mask); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + float* input_data = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* output_data = (float*)0x98000000; + float* check = (float*)0xB8000000; + int* seq_lengths = (int*)0xC8000000; + ReverseSequenceParameter* param = (ReverseSequenceParameter*)0xA8000000; + int i; + if (logic_core_id == 0) { + param->shape_ = (int*)0xA8010000; + memcpy(param->shape_, shape, sizeof(int) * ndim); + memcpy(seq_lengths, orig_seq_lengths, sizeof(int) * shape[batch_dim]); + param->batch_dim_ = batch_dim; + param->seq_dim_ = seq_dim; + param->ndim_ = ndim; + param->type_size_ = sizeof(float); + Resize(param); + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + anytype_reverse_sequence_anycore(input_data, output_data, seq_lengths, param, core_mask); + } + + void main(){ + int shape[3] = {3, 4, 10}; + int seq_lengths[3] = {1, 2, 3}; + int ndim = 3; + int seq_dim = 1; + int batch_dim = 0; + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + TestReverseSequenceFp32(shape, seq_lengths, seq_dim, batch_dim, ndim, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/reversev2.rst.txt b/master/html/_sources/functionlib/dsplib/reversev2.rst.txt new file mode 100644 index 0000000..3efed46 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/reversev2.rst.txt @@ -0,0 +1,109 @@ +ReverseV2 +================= + +对输入Tensor按指定维度反转。 + +输入: + - **src** - 需反转数据的地址 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ReverseV2Parameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ReverseV2Parameter { + int* axis_flag_; // 用于存储需反转的轴,需反转的轴对应于数组索引的元素被置为1,其余元素为0 + int* input_shape_; // 输入张量的形状 + int* input_strides_; // 一个记录输入张量每一维步长的数组 + int** cur_coord_; // 二维数组,每个元素存储对应核心所使用的cur_coord数组地址,这个数组用于记录当前循环到的元素坐标 + int ndim_; // 输入和输出张量的维度 + int axis_ndim_; // 需反转的轴的数目 + int num_elem_; // 元素总数 + int type_size_; // 输入和输出张量数据类型的长度 + } ReverseV2Parameter; + +输出: + - **dst** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享/私有存储版本:** + +.. c:function:: void anytype_reversev2_anycore(void* src, void* dst, ReverseV2Parameter* param, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。对于不同数据类型,改变param中的type_size_参数即可。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 50 + + void Resize(ReverseV2Parameter* param, int* axis) { + int i; + param->input_strides_[param->ndim_ - 1] = 1; + for (i = param->ndim_ - 1; i > 0; i--) { + param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i]; + } + for (i = 0; i < param->ndim_; i++) { + // initialize axis_flag array by 0 + param->axis_flag_[i] = 0; + } + for (i = 0; i < param->axis_ndim_; i++) { + param->axis_flag_[axis[i]] = 1; + } + param->num_elem_ = 1; + for (i = 0; i < param->ndim_; i++) { + param->num_elem_ *= param->input_shape_[i]; + } + } + + void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) { + int type_size = 4; + int core_num = GetCoreNum(core_mask); + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + float* input_data = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* output_data = (float*)0xA8000000; + float* check = (float*)0xC8000000; + ReverseV2Parameter* param = (ReverseV2Parameter*)0x84000000; + if (logic_core_id == 0) { + int i, j; + param->axis_ndim_ = axis_ndim; + param->input_shape_ = (int*)0x84003000; + for (i = 0; i < ndim; i++) { + param->input_shape_[i] = shape[i]; + } + param->ndim_ = ndim; + param->type_size_ = type_size; + param->input_strides_ = (int*)0x84004000; + param->axis_flag_ = (int*)0x84005000; + param->cur_coord_ = (int**)0x84006000; + for (i = 0; i < 4; i++) { + param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL); + for (j = 0; j < ndim; j++) { + param->cur_coord_[i][j] = 0; + } + } + Resize(param, axis); + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + anytype_reversev2_anycore(input_data, output_data, param, core_mask); + } + + void main(){ + int shape[3] = {10, 10, 1000}; + int ndim = 3; + int axis[3] = {0, 1, 2}; + int axis_ndim = 3; + int core_mask = 0b1111; + TestReverseV2(shape, ndim, axis, axis_ndim, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/scalefusion.rst.txt b/master/html/_sources/functionlib/dsplib/scalefusion.rst.txt new file mode 100644 index 0000000..d472537 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/scalefusion.rst.txt @@ -0,0 +1,89 @@ +ScaleFusion +================= + + + + 传入一个数组,逐元素乘上因数,并加上偏置的值后输出。 + + .. math:: + + dst_i = src_i \cdot scale_i + bias_i + + 输入: + - **src_data** - 输入数据地址。 + - **length** - 计算长度。 + - **scale** - 缩放因子数组首地址。 + - **bias** - 偏置数组首地址。 + - **core_mask** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **dst_data** - 计算结果地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64 + - MT7004 支持fp16, fp32, int16, int32 + +**共享存储版本:** + +.. c:function:: void i8_scalefusion_s(int8_t* src_data, int8_t* dst_data, int length, float* scale, float* bias, int core_mask) +.. c:function:: void i16_scalefusion_s(int16_t* src_data, int16_t* dst_data, int length, float* scale, float* bias, int core_mask) +.. c:function:: void i32_scalefusion_s(int* src_data, int* dst_data, int length, float* scale, float* bias, int core_mask) +.. c:function:: void hp_scalefusion_s(half* src_data, half* dst_data, int length, half* scale, half* bias, int core_mask) +.. c:function:: void fp_scalefusion_s(float* src_data, float* dst_data, int length, float* scale, float* bias, int core_mask) +.. c:function:: void dp_scalefusion_s(double* src_data, double* dst_data, int length, double* scale, double* bias, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 12 + + //FT78NE示例 + #include + #include + + int main(int argc, char* argv[]) { + float *input0 = (float *)0xA0000000; //input在DDR空间 + float *output = (float *)0xC0000000; + float *scale = (float *)0xB0000000; //scale在DDR空间 + float *bias = (float *)0xB1000000; //bias在DDR空间 + int length = 1000; + int core_mask = 0xff; + fp_scalefusion_s( input0, output, length, scale, bias, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_scalefusion_p(int8_t* src_data, int8_t* dst_data, int length, float* scale, float* bias) +.. c:function:: void i16_scalefusion_p(int16_t* src_data, int16_t* dst_data, int length, float* scale, float* bias) +.. c:function:: void i32_scalefusion_p(int* src_data, int* dst_data, int length, float* scale, float* bias) +.. c:function:: void hp_scalefusion_p(half* src_data, half* dst_data, int length, half* scale, half* bias) +.. c:function:: void fp_scalefusion_p(float* src_data, float* dst_data, int length, float* scale, float* bias) +.. c:function:: void dp_scalefusion_p(double* src_data, double* dst_data, int length, double* scale, double* bias) + + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + //FT78NE示例 + #include + #include + int main(int argc, char* argv[]) { + float *input0 = (float *)0x10810000; //input在L2空间 + float *output = (float *)0x10820000; + float *scale = (float *)0x10830000; //scale在L2空间 + float *bias = (float *)0x10840000; //bias在L2空间 + int length = 1000; + fp_scalefusion_p( input0, output, length, scale, bias); + return 0; + } + diff --git a/master/html/_sources/functionlib/dsplib/scatter_elements.rst.txt b/master/html/_sources/functionlib/dsplib/scatter_elements.rst.txt new file mode 100644 index 0000000..986ecae --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/scatter_elements.rst.txt @@ -0,0 +1,178 @@ +ScatterElements +================= + +返回一个新tensor,根据指定索引和更新值对input中的元素进行指定操作(替换或相加)。不支持隐式类型转换。举例:一个三维输入tensor的返回为: + +.. code-block:: python + + output[indices[i][j][k]][j][k] = updates[i][j][k] #if axis == 0, reduction == "none" + output[i][indices[i][j][k]][k] += updates[i][j][k] #if axis == 1, reduction == "add" + output[i][j][indices[i][j][k]] = updates[i][j][k] #if axis == 2, reduction == "none" + +输入: + - **input** - 输入数据的地址 + - **indices** - 指定索引。 + - **updates** - 更新值。 + - **param** - 算子计算所需参数的结构体。其各成员见下述。 + - **core_mask** - 核掩码。 + +**ScatterElementsParameter定义:** + +.. code-block:: c + :linenos: + + typedef struct ScatterElementsParameter { + int* indices_stride_; // 对应于indices数组每一维度的步长 + int* output_stride_; // 对应于output数组每一维度的步长 + int input_dims_; // 输入张量的维度数 + int axis_; // 指定索引所在的轴 + int input_axis_size_; // 索引所在轴的元素数 + int indices_total_num_; // indices数组的总元素数 + int input_total_num_; // input数组的总元素数 + int reduction_type_; // 规约类型,0代表none,1代表add + } ScatterElementsParameter; + +输出: + - **output** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + - 如果 indices 中有多个索引向量对应于同一位置,则输出中该位置值是不确定的。 + - 如果 indices 的值超出 input 索引上下界,则相应的 updates 不会更新到 input,也不会抛出索引错误。 + +**共享存储版本:** + +.. c:function:: void i8_scatter_elements_s(int8_t* input, int8_t* output, int* indices, int8_t* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void i16_scatter_elements_s(int16_t* input, int16_t* output, int* indices, int16_t* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void i32_scatter_elements_s(int* input, int* output, int* indices, int* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void hp_scatter_elements_s(half* input, half* output, int* indices, half* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void fp_scatter_elements_s(float* input, float* output, int* indices, float* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void dp_scatter_elements_s(double* input, double* output, int* indices, double* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void c64_scatter_elements_s(float* input, float* output, int* indices, float* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void c128_scatter_elements_s(double* input, double* output, int* indices, double* updates, ScatterElementsParameter* param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 40 + + void PackParam(ScatterElementsParameter* param, int* indices_shape, int* input_shape) { + param->indices_stride_[param->input_dims_ - 1] = 1; + int i; + for (i = param->input_dims_ - 1; i > 0; --i) { + param->indices_stride_[i - 1] = param->indices_stride_[i] * indices_shape[i]; + } + param->output_stride_[param->input_dims_ - 1] = 1; + for (i = param->input_dims_ - 1; i > 0; --i) { + param->output_stride_[i - 1] = param->output_stride_[i] * input_shape[i]; + } + param->indices_total_num_ = 1; + for (i = 0; i < param->input_dims_; i++) { + param->indices_total_num_ *= indices_shape[i]; + } + param->input_total_num_ = 1; + for (i = 0; i < param->input_dims_; i++) { + param->input_total_num_ *= input_shape[i]; + } + param->input_axis_size_ = input_shape[param->axis_]; + } + + void TestScatterElementsSMC(int* input_shape, int* indices_shape, int ndim, int axis, int reduction_type, int core_mask) { + int core_num = GetCoreNum(core_mask); + int core_id = get_core_id(); + int logic_core_id = GetLogicCoreId(core_mask, core_id); + void* input_data = (void*)0x88000000; + void* output_data = (void*)0x98000000; + int* indices_data = (int*)0xA8000000; + void* updates_data = (void*)0xB8000000; + ScatterElementsParameter* param = (ScatterElementsParameter*)0xC8000000; + if (logic_core_id == 0) { + param->axis_ = axis; + param->input_dims_ = ndim; + param->indices_stride_ = (int*)0xC8020000; + param->output_stride_ = (int*)0xC8040000; + param->reduction_type_ = reduction_type; + PackParam(param, indices_shape, input_shape); + } + sys_bar(0, core_num); // 初始化参数完成后进行同步 + fp_scatter_elements_s(input_data, output_data, indices_data, updates_data, param, core_mask); + } + + void main() { + int input_shape[2] = {8, 30}; + int indices_shape[2] = {3, 3}; + int ndim = 2; + int axis = 0; + int reduction_type = 0; + int core_mask = 0b1111; + TestScatterElementsSMC(input_shape, indices_shape, ndim, axis, reduction_type, core_mask); + } + +**私有存储版本:** + +.. c:function:: void i8_scatter_elements_p(int8_t* input, int8_t* output, int* indices, int8_t* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void i16_scatter_elements_p(int16_t* input, int16_t* output, int* indices, int16_t* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void i32_scatter_elements_p(int* input, int* output, int* indices, int* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void hp_scatter_elements_p(half* input, half* output, int* indices, half* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void fp_scatter_elements_p(float* input, float* output, int* indices, float* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void dp_scatter_elements_p(double* input, double* output, int* indices, double* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void c64_scatter_elements_p(float* input, float* output, int* indices, float* updates, ScatterElementsParameter* param, int core_mask) +.. c:function:: void c128_scatter_elements_p(double* input, double* output, int* indices, double* updates, ScatterElementsParameter* param, int core_mask) + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 34 + + void PackParam(ScatterElementsParameter* param, int* indices_shape, int* input_shape) { + param->indices_stride_[param->input_dims_ - 1] = 1; + int i; + for (i = param->input_dims_ - 1; i > 0; --i) { + param->indices_stride_[i - 1] = param->indices_stride_[i] * indices_shape[i]; + } + param->output_stride_[param->input_dims_ - 1] = 1; + for (i = param->input_dims_ - 1; i > 0; --i) { + param->output_stride_[i - 1] = param->output_stride_[i] * input_shape[i]; + } + param->indices_total_num_ = 1; + for (i = 0; i < param->input_dims_; i++) { + param->indices_total_num_ *= indices_shape[i]; + } + param->input_total_num_ = 1; + for (i = 0; i < param->input_dims_; i++) { + param->input_total_num_ *= input_shape[i]; + } + param->input_axis_size_ = input_shape[param->axis_]; + } + + void TestScatterElementsL2(int* input_shape, int* indices_shape, int ndim, int axis, int reduction_type, int core_mask) { + void* input_data = (void*)0x10000000; // 私有存储版本地址设置在AM内 + void* output_data = (void*)0x10001000; + int* indices_data = (int*)0x10002000; + void* updates_data = (void*)0x10003000; + ScatterElementsParameter* param = (ScatterElementsParameter*)0x10004000; + param->axis_ = axis; + param->input_dims_ = ndim; + param->indices_stride_ = (int*)0x10005000; + param->output_stride_ = (int*)0x10006000; + param->reduction_type_ = reduction_type; + PackParam(param, indices_shape, input_shape); + fp_scatter_elements_p(input_data, output_data, indices_data, updates_data, param, core_mask); + } + + void main() { + int input_shape[2] = {8, 30}; + int indices_shape[2] = {3, 3}; + int ndim = 2; + int axis = 0; + int reduction_type = 0; + int core_mask = 0b0001; // 私有存储版本只能设置为一个核心启动 + TestScatterElementsL2(input_shape, indices_shape, ndim, axis, reduction_type, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/sgd.rst.txt b/master/html/_sources/functionlib/dsplib/sgd.rst.txt new file mode 100644 index 0000000..b4bb87c --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/sgd.rst.txt @@ -0,0 +1,109 @@ +SGD +================= + 对权重张量执行带动量与权重衰减的随机梯度下降更新。 + + 输入: + - **weight** - 待更新权重张量首地址。 + - **accumulate** - 动量累积张量首地址。 + - **gradient** - 梯度张量首地址。 + - **learning_rate** - 学习率。 + - **dampening** - 动量阻尼系数。 + - **moment** - 动量系数。 + - **nesterov** - 是否启用 Nesterov 动量。 + - **weight_decay** - 权重衰减系数。 + - **start** - 参与计算的起始索引(闭区间)。 + - **end** - 参与计算的结束索引(开区间)。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **weight** - 原地写回更新后的权重张量。 + - **accumulate** - 原地写回更新后的动量张量。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32 数据类型。 + - MT7004 支持 fp16、fp32 数据类型。 + + +**共享存储版本:** + +.. c:function:: void hp_sgd_s(half *weight, half *accumulate, const half *gradient, float learning_rate, float dampening, float moment, bool nesterov, float weight_decay, int start, int end, int core_mask) +.. c:function:: void fp_sgd_s(float *weight, float *accumulate, const float *gradient, float learning_rate, float dampening, float moment, bool nesterov, float weight_decay, int start, int end, int core_mask) + + + + .. math:: + + \begin{aligned} + g'_t &= g_t + weight\_decay \cdot w_{t-1} \\ + m_t &= moment \cdot m_{t-1} + (1 - dampening) \cdot g'_t \\ + u_t &= + \begin{cases} + m_t \cdot moment + g'_t, & \text{if nesterov = True} \\ + m_t, & \text{otherwise} + \end{cases} \\ + w_t &= w_{t-1} - learning\_rate \cdot u_t + \end{aligned} + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 17 + + // FT78NE 多核示例 + #include + #include + + int main(void) { + float *weight = (float *)0xA0000000; // DDR 存储 + float *accumulate = (float *)0xB0000000; + float *gradient = (float *)0xC0000000; + int start = 0; + int end = 4096; + int core_mask = 0xff; + float learning_rate = 1e-2f; + float dampening = 0.0f; + float moment = 0.9f; + bool nesterov = true; + float weight_decay = 1e-2f; + fp_sgd_s(weight, accumulate, gradient, learning_rate, + dampening, moment, nesterov, weight_decay, + start, end, core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void hp_sgd_p(half *weight, half *accumulate, const half *gradient, float learning_rate, float dampening, float moment, bool nesterov, float weight_decay, int length) +.. c:function:: void fp_sgd_p(float *weight, float *accumulate, const float *gradient, float learning_rate, float dampening, float moment, bool nesterov, float weight_decay, int length) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 15 + + // MT7004 单核示例 + #include + #include + + int main(void) { + half *weight = (half *)0x10000000; // L2 存储 + half *accumulate = (half *)0x10002000; + half *gradient = (half *)0x10004000; + int length = 2048; + float learning_rate = 5e-3f; + float dampening = 0.0f; + float moment = 0.9f; + bool nesterov = false; + float weight_decay = 5e-3f; + hp_sgd_p(weight, accumulate, gradient, learning_rate, + dampening, moment, nesterov, weight_decay, + length); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/spacetobatch.rst.txt b/master/html/_sources/functionlib/dsplib/spacetobatch.rst.txt new file mode 100644 index 0000000..d8391ab --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/spacetobatch.rst.txt @@ -0,0 +1,86 @@ +SpaceToBatch +================= +将输入在空间维度按照 block_size 分块并重新排列到 batch 维度,同时根据 paddings 执行必要的零填充。 + + 输入: + - **input** - 输入数据地址。 + - **block_size** - 分块因子,格式为 ``[block_h, block_w]``。 + - **paddings** - 填充参数,格式为 ``[top, bottom, left, right]``。 + - **input_shape** - 输入形状,格式为 ``[batch, height, width, channel]``。 + - **data_size** - 单个元素字节数(例如 sizeof(float))。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。 + - MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。 + + +**共享存储版本:** + +.. c:function:: void i8_spacetobatch_s(int8_t *input, int8_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void i16_spacetobatch_s(int16_t *input, int16_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void i32_spacetobatch_s(int32_t *input, int32_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void hp_spacetobatch_s(half *input, half *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void fp_spacetobatch_s(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void dp_spacetobatch_s(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void c64_spacetobatch_s(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void c128_spacetobatch_s(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) + + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + // FT78NE 多核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 输入在 DDR 地址 0xA0000000 + float *output = (float *)0xB0000000; // 输出在 DDR 地址 0xB0000000 + int block_size[2] = {2, 2}; + int paddings[4] = {0, 0, 0, 0}; + int input_shape[4] = {1, 100, 10, 10}; + int core_mask = 0xff; + fp_spacetobatch_s(input, output, block_size, paddings, input_shape, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_spacetobatch_p(int8_t *input, int8_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void i16_spacetobatch_p(int16_t *input, int16_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void i32_spacetobatch_p(int32_t *input, int32_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void hp_spacetobatch_p(half *input, half *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void fp_spacetobatch_p(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void dp_spacetobatch_p(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void c64_spacetobatch_p(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void c128_spacetobatch_p(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE 单核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 单核版本:输入放在 L2 地址 0x10000000 + float *output = (float *)0x10040000; // 单核版本:输出放在 L2 地址 0x10040000 + int block_size[2] = {2, 2}; + int paddings[4] = {0, 0, 0, 0}; + int input_shape[4] = {1, 100, 10, 10}; + fp_spacetobatch_p(input, output, block_size, paddings, input_shape, sizeof(float)); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/spacetobatchnd.rst.txt b/master/html/_sources/functionlib/dsplib/spacetobatchnd.rst.txt new file mode 100644 index 0000000..3afde44 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/spacetobatchnd.rst.txt @@ -0,0 +1,87 @@ +SpaceToBatchND +================= +将输入在空间维度按照 block_size 分块并重新排列到 batch 维度,同时根据 paddings 执行必要的零填充。 + + 输入: + - **input** - 输入数据地址。 + - **block_size** - 分块因子,格式为 ``[block_h, block_w]``。 + - **paddings** - 填充参数,格式为 ``[top, bottom, left, right]``。 + - **input_shape** - 输入形状,格式为 ``[batch, height, width, channel]``。 + - **data_size** - 单个元素字节数。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持的数据类型: fp32、fp64、cplx64、cplx128、int16、int8、int32。 + - MT7004 支持的数据类型: fp32、fp16、cplx64、int16、int32。 + + +**共享存储版本:** + +.. c:function:: void i8_spacetobatchnd_s(int8_t *input, int8_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void i16_spacetobatchnd_s(int16_t *input, int16_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void i32_spacetobatchnd_s(int32_t *input, int32_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void hp_spacetobatchnd_s(half *input, half *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void fp_spacetobatchnd_s(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void dp_spacetobatchnd_s(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void c64_spacetobatchnd_s(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) +.. c:function:: void c128_spacetobatchnd_s(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size, int core_mask) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 11 + + // FT78NE 多核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0xA0000000; // 输入在 DDR 地址 0xA0000000 + float *output = (float *)0xB0000000; // 输出在 DDR 地址 0xB0000000 + int block_size[2] = {2, 2}; + int paddings[4] = {0, 0, 0, 0}; + int input_shape[4] = {1, 100, 10, 10}; + int core_mask = 0xff; + fp_spacetobatchnd_s(input, output, block_size, paddings, input_shape, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_spacetobatchnd_p(int8_t *input, int8_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void i16_spacetobatchnd_p(int16_t *input, int16_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void i32_spacetobatchnd_p(int32_t *input, int32_t *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void hp_spacetobatchnd_p(half *input, half *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void fp_spacetobatchnd_p(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void dp_spacetobatchnd_p(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void c64_spacetobatchnd_p(float *input, float *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) +.. c:function:: void c128_spacetobatchnd_p(double *input, double *output, const int *block_size, const int *paddings, const int *input_shape, int data_size) + + **C 调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 10 + + // FT78NE 单核示例 + #include + + int main(int argc, char *argv[]) { + float *input = (float *)0x10000000; // 单核版本:输入放在 L2 地址 0x10000000 + float *output = (float *)0x10040000; // 单核版本:输出放在 L2 地址 0x10040000 + int block_size[2] = {2, 2}; + int paddings[4] = {0, 0, 0, 0}; + int input_shape[4] = {1, 100, 10, 10}; + fp_spacetobatchnd_p(input, output, block_size, paddings, input_shape, sizeof(float)); + return 0; + } + + diff --git a/master/html/_sources/functionlib/dsplib/spacetodepth.rst.txt b/master/html/_sources/functionlib/dsplib/spacetodepth.rst.txt new file mode 100644 index 0000000..ea98858 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/spacetodepth.rst.txt @@ -0,0 +1,91 @@ +SpaceToDepth +================= +将输入张量的空间维按块(block)重组到深度通道(channel)中。 + + 假设输入形状为: \[N, H, W, C\],块大小为 B,则输出形状为: + + .. math:: + + \text{out\_shape} = [N, H/ B, W / B, C * B * B] + + 对应元素映射为: + + .. math:: + + output[n, h_{out}, w_{out}, c * B * B + (l * B + m)] = input[n, h_{out} * B + l, w_{out} * B + m, c] + + 输入: + - **input** - 输入数据地址,按 NHWC 存储。 + - **in_shape** - 指向长度为4的数组,表示输入维度 \[N, H, W, C\]。 + - **block** - block 大小。 + - **data_size** - 每个元素的字节大小。 + - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 + + 输出: + - **output** - 输出数据地址。 + + 支持平台: + ``FT78NE`` + ``MT7004`` + + .. note:: + - FT78NE 支持 fp32, fp64, cplx64, cplx128, int16, int8, int32 + - MT7004 支持 fp32, fp16, cplx64, int16, int32 + +**共享存储版本:** + +.. c:function:: void i8_spacetodepth_s(int8_t* input, int8_t* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void i16_spacetodepth_s(int16_t* input, int16_t* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void i32_spacetodepth_s(int32_t* input, int32_t* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void hp_spacetodepth_s(half* input, half* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void fp_spacetodepth_s(float* input, float* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void dp_spacetodepth_s(double* input, double* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void c64_spacetodepth_s(float* input, float* output, const int* in_shape, int block, int data_size, int core_mask) +.. c:function:: void c128_spacetodepth_s(double* input, double* output, const int* in_shape, int block, int data_size, int core_mask) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 9 + + #include + + int main(int argc, char* argv[]) { + float *input = (float *)0xA0000000; // 多核版:输入在 DDR 区域 + float *output = (float *)0xB0000000; // 多核版:输出在 DDR 区域 + int in_shape[4] = {1, 8, 8, 1}; // N,H,W,C + int block = 2; + int core_mask = 0xff; + fp_spacetodepth_s(input, output, in_shape, block, sizeof(float), core_mask); + return 0; + } + + +**私有存储版本:** + +.. c:function:: void i8_spacetodepth_p(int8_t* input, int8_t* output, const int* in_shape, int block, int data_size) +.. c:function:: void i16_spacetodepth_p(int16_t* input, int16_t* output, const int* in_shape, int block, int data_size) +.. c:function:: void i32_spacetodepth_p(int32_t* input, int32_t* output, const int* in_shape, int block, int data_size) +.. c:function:: void hp_spacetodepth_p(half* input, half* output, const int* in_shape, int block, int data_size) +.. c:function:: void fp_spacetodepth_p(float* input, float* output, const int* in_shape, int block, int data_size) +.. c:function:: void dp_spacetodepth_p(double* input, double* output, const int* in_shape, int block, int data_size) +.. c:function:: void c64_spacetodepth_p(float* input, float* output, const int* in_shape, int block, int data_size) +.. c:function:: void c128_spacetodepth_p(double* input, double* output, const int* in_shape, int block, int data_size) + + **C调用示例:** + + .. code-block:: c + :linenos: + :emphasize-lines: 8 + + #include + + int main(int argc, char* argv[]) { + float *input = (float *)0x10000000; // 单核版:输入在 L2 + float *output = (float *)0x10010000; // 单核版:输出在 L2 + int in_shape[4] = {1, 8, 8, 1}; + int block = 2; + fp_spacetodepth_p(input, output, in_shape, block, sizeof(float)); + return 0; + } diff --git a/master/html/_sources/functionlib/dsplib/squeeze.rst.txt b/master/html/_sources/functionlib/dsplib/squeeze.rst.txt new file mode 100644 index 0000000..b8c064e --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/squeeze.rst.txt @@ -0,0 +1,42 @@ +Squeeze +================= + +返回删除指定axis中大小为1的维度后的Tensor。由于该算子仅改变张量形状,因此其DSP算子的作用是将数据从输入张量完整拷贝到输出张量。 + +输入: + - **src** - 输入地址 + - **total_copy_size** - 计算得到的总共需拷贝的数据量,单位为字节。 + - **core_mask** - 核掩码。 + +输出: + - **dst** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享/私有存储版本:** + +.. c:function:: void anytype_squeeze_anycore(void* src, void* dst, int total_copy_size, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 8 + + void main(){ + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + int core_num = GetCoreNum(core_mask); + float* src = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* dst = (float*)0x98000000; + int shape[3] = {1, 10, 10}; + int total_copy_size = shape[0] * shape[1] * shape[2] * sizeof(float); + anytype_squeeze_anycore(src, dst, total_copy_size, core_mask); + } \ No newline at end of file diff --git a/master/html/_sources/functionlib/dsplib/unsqueeze.rst.txt b/master/html/_sources/functionlib/dsplib/unsqueeze.rst.txt new file mode 100644 index 0000000..7786d94 --- /dev/null +++ b/master/html/_sources/functionlib/dsplib/unsqueeze.rst.txt @@ -0,0 +1,42 @@ +UnSqueeze +================= + +对输入张量在给定的轴上添加额外维度。由于该算子仅改变张量形状,因此其DSP算子的作用是将数据从输入张量完整拷贝到输出张量。 + +输入: + - **src** - 输入地址 + - **total_copy_size** - 计算得到的总共需拷贝的数据量,单位为字节。 + - **core_mask** - 核掩码。 + +输出: + - **dst** - 输出地址。 + +支持平台: + ``FT78NE`` + ``MT7004`` + +.. note:: + - FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128 + - MT7004 支持fp16, fp32, int16, int32, cplx64 + +**共享/私有存储版本:** + +.. c:function:: void anytype_unsqueeze_anycore(void* src, void* dst, int total_copy_size, int core_mask) + +各种数据类型、私有及共享空间版本均使用该函数。 + +**C调用示例:** + +.. code-block:: c + :linenos: + :emphasize-lines: 8 + + void main(){ + int core_mask = 0b1111; // 测试单核时核掩码设置为0b0001即可 + int core_num = GetCoreNum(core_mask); + float* src = (float*)0x88000000; // 测试私有空间时地址设置在私有空间内即可 + float* dst = (float*)0x98000000; + int shape[3] = {1, 10, 10}; + int total_copy_size = shape[0] * shape[1] * shape[2] * sizeof(float); + anytype_unsqueeze_anycore(src, dst, total_copy_size, core_mask); + } \ No newline at end of file diff --git a/master/html/functionlib/dsplib/activation.html b/master/html/functionlib/dsplib/activation.html new file mode 100644 index 0000000..f72f5e0 --- /dev/null +++ b/master/html/functionlib/dsplib/activation.html @@ -0,0 +1,887 @@ + + + + + + + + + Activation — MindSpore Signal+ 使用手册 alpha 文档 + + + + + + + + + + + + + + + + + + + + + +