From f557fbbb2c23d37106a2a4616d82303fd2c4f3a7 Mon Sep 17 00:00:00 2001 From: jjsnam Date: Sat, 25 Jul 2026 14:55:10 +0800 Subject: [PATCH] feat(lab3.5): publish Ascend C operator lab - Add Lab 3.5 documentation covering Ascend 910B architecture (AIC/AIV separation, UB/MTE2/MTE3/V pipelines, TQue/PipeBarrier sync), Ascend C API overview (LocalTensor/TBuf/TQue/TPosition, DataCopy(Pad), Cast/Add/ Reduce), profiling workflow (msprof op + simulator), and step-by-step optimization guide (pipeline, UB reuse, tiling, copy efficiency, reduction/precision). - Add lab3.5 student kit under src/lab3p5/: env.sh, checker (build/run/ test_op/case_specs/get_time), and three implementation paths (src/ascendc baseline, src/triton, src/tilelang). - Ascend C baseline: row-parallel FP16 I/O with FP32 compute, DataCopyPad for non-aligned tail, BlockReduceSum + WholeReduceSum for the H-axis reduction, TQue double-buffered in/out queues. - Document scoring curve (120-point scale, 20-point bonus) and submission rules (upload src// only). Signed-off-by: jjsnam Co-Authored-By: Sushidesu486 Co-Authored-By: zgyxclyty Co-Authored-By: ckyasb <3376380559@qq.com> Co-Authored-By: Hzw-ZuttoZutto <692596316@qq.com> --- .../Lab3.5-AscendC-Op/image/ai-core-basic.png | Bin 0 -> 23728 bytes .../image/ai-core-coupled.png | Bin 0 -> 30797 bytes .../image/ai-core-separated.png | Bin 0 -> 39744 bytes .../image/ascendc-copyin-size.png | Bin 0 -> 22046 bytes .../image/ascendc-copyout-size.png | Bin 0 -> 15054 bytes .../image/ascendc-double-buffer.png | Bin 0 -> 22653 bytes .../image/ascendc-pipeline.png | Bin 0 -> 50197 bytes .../image/ascendc-ub-reuse.png | Bin 0 -> 38805 bytes .../empty_kernel_overhead_vs_aiv_cores.svg | 1 + docs/lab/Lab3.5-AscendC-Op/image/msprofop.png | Bin 0 -> 85680 bytes .../image/msprofopsim-left.png | Bin 0 -> 62629 bytes .../image/msprofopsim-right.png | Bin 0 -> 87180 bytes docs/lab/Lab3.5-AscendC-Op/image/score.png | Bin 0 -> 117428 bytes docs/lab/Lab3.5-AscendC-Op/index.md | 680 ++++++++++++++++++ src/lab3p5/.gitignore | 4 + src/lab3p5/README.md | 56 ++ src/lab3p5/checker/build.sh | 58 ++ src/lab3p5/checker/case_specs.py | 18 + src/lab3p5/checker/get_time.py | 48 ++ src/lab3p5/checker/profile.sh | 75 ++ src/lab3p5/checker/run.sh | 51 ++ src/lab3p5/checker/test_op.py | 180 +++++ src/lab3p5/env.sh | 81 +++ src/lab3p5/src/__init__.py | 1 + src/lab3p5/src/ascendc/CMakeLists.txt | 31 + src/lab3p5/src/ascendc/CMakePresets.json | 67 ++ src/lab3p5/src/ascendc/build_op.sh | 39 + .../src/ascendc/common/pytorch_npu_helper.hpp | 583 +++++++++++++++ .../src/ascendc/extension/custom_op.cpp | 62 ++ src/lab3p5/src/ascendc/op_host/CMakeLists.txt | 57 ++ .../ascendc/op_host/fused_add_rms_norm.cpp | 152 ++++ .../src/ascendc/op_kernel/CMakeLists.txt | 23 + .../ascendc/op_kernel/fused_add_rms_norm.cpp | 475 ++++++++++++ .../op_kernel/fused_add_rms_norm_tiling.h | 43 ++ src/lab3p5/src/ascendc/setup.py | 35 + src/lab3p5/src/tilelang/__init__.py | 15 + src/lab3p5/src/tilelang/fused_add_rmsnorm.py | 51 ++ src/lab3p5/src/triton/__init__.py | 15 + src/lab3p5/src/triton/fused_add_rmsnorm.py | 32 + zensical.toml | 1 + 40 files changed, 2934 insertions(+) create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ai-core-basic.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ai-core-coupled.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ai-core-separated.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ascendc-copyin-size.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ascendc-copyout-size.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ascendc-double-buffer.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ascendc-pipeline.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/ascendc-ub-reuse.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/empty_kernel_overhead_vs_aiv_cores.svg create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/msprofop.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/msprofopsim-left.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/msprofopsim-right.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/image/score.png create mode 100644 docs/lab/Lab3.5-AscendC-Op/index.md create mode 100644 src/lab3p5/.gitignore create mode 100644 src/lab3p5/README.md create mode 100644 src/lab3p5/checker/build.sh create mode 100644 src/lab3p5/checker/case_specs.py create mode 100644 src/lab3p5/checker/get_time.py create mode 100755 src/lab3p5/checker/profile.sh create mode 100755 src/lab3p5/checker/run.sh create mode 100644 src/lab3p5/checker/test_op.py create mode 100644 src/lab3p5/env.sh create mode 100644 src/lab3p5/src/__init__.py create mode 100644 src/lab3p5/src/ascendc/CMakeLists.txt create mode 100644 src/lab3p5/src/ascendc/CMakePresets.json create mode 100755 src/lab3p5/src/ascendc/build_op.sh create mode 100644 src/lab3p5/src/ascendc/common/pytorch_npu_helper.hpp create mode 100644 src/lab3p5/src/ascendc/extension/custom_op.cpp create mode 100644 src/lab3p5/src/ascendc/op_host/CMakeLists.txt create mode 100644 src/lab3p5/src/ascendc/op_host/fused_add_rms_norm.cpp create mode 100644 src/lab3p5/src/ascendc/op_kernel/CMakeLists.txt create mode 100644 src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm.cpp create mode 100644 src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm_tiling.h create mode 100644 src/lab3p5/src/ascendc/setup.py create mode 100644 src/lab3p5/src/tilelang/__init__.py create mode 100644 src/lab3p5/src/tilelang/fused_add_rmsnorm.py create mode 100644 src/lab3p5/src/triton/__init__.py create mode 100644 src/lab3p5/src/triton/fused_add_rmsnorm.py diff --git a/docs/lab/Lab3.5-AscendC-Op/image/ai-core-basic.png b/docs/lab/Lab3.5-AscendC-Op/image/ai-core-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..68c41c84817847f6e5a9408079a4104c0d3fb4d4 GIT binary patch literal 23728 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 PImUZg<+o+h#=-vsR94F| literal 0 HcmV?d00001 diff --git a/docs/lab/Lab3.5-AscendC-Op/image/ai-core-coupled.png b/docs/lab/Lab3.5-AscendC-Op/image/ai-core-coupled.png new file mode 100644 index 0000000000000000000000000000000000000000..29b1ce10ba1d0422d3b0279fe2ca06ab15482901 GIT binary patch literal 30797 zcmce-byQu?)+M@e4;+F8mk`_%2rj_`!QI{69S#Xju;6aNg1dW=-~@LK65Jhn^Sk%^ zZufgV`i=hQF<_j*kzKXxRIN4FoO6ZB%SvFN5~2bCfbmgMR1pARvj7052N@B3hUq}M z5_~|hm(*|qfEV4*e=vP^g~k9t4tx~-pzNNuzvSkQ(?f=M>~_hFM3J7*ODz!(4WuW~ z{7x%|5qew=M-NLWR+07lLtG9yDl#o?Pb5}T2yJ$*q>`vS1^+qLH!R6RTVKD|!~r#f ze=JXZGic;ymm24e5G0p}M)pyor!Ec_)c))chJZh5J#H&LG%y5q*5O2c*YDZJbv7bs zVKhd~<1B-f%|yZ|&#~8)M{rASGF4M;4jz#(Qj}%JwSCZp>yXBl=O11|Adp6Slzn-4 z*}|`ee_K4>DZxjR3AAn=0bRt}nf%0~zp$7}NrZ#Z{cI8gPJ)Y7ex~6bwI-Sjw}pbE zYcH)Dlw@n=XB|jH&M>yaMH-_Dz3`_ug@TIQ~}tcvXd<$?TEhLc>8p=dGBKd!x!8l zePRb(<8>?mEe`MYu_1E-^Wz9u5Ea<${${>1K(fKaj|Fgv#{VQ8oAAV4n6%M!Kl-%% z`;iYg0C#5NpHYgNOf?FYtYw0@LNjrGQBk}NWLikf0fy-E)j~lu=k}=qKo!k-%QZG6 z;5+cdhXc(I+1Nf6oEd)Ff04xl-Ne3aao9)L)ahy`5)#>DvIY0Vt4Js~kpxtadRZRS z)j_RG2B4RM1uDytn|aZnx-o~=@nMt6v6sU0VLXj^}C!OrA;R4-teq<{&D>EVI}S6OQhCd4ojL$p)+ zSTFH+BB@7WUwE_VqYH}9*TJWTrK=kFt#ES<7^Vrq5y z;Dw#%b%-naA&c~T%+pg~PVi4UPP-D6nJ{aKL=jPCjbkLNnBthK2;Co;y)>B~^z2;v zt&J=Tv9wDUYMV!}$b(+AMhBV;+0rht+xT-Dj>0RzHB6?_?|dPl+Z(y z-(qlR{v zS}u=8k{I1oKUtS{rt#L-CnRJ)2qvz-=OYRxat%*o=n^yxI^D z7pi)AIkuN8q0uOv(*m=%BY=+;~EWJO{I%dv(?cT|^zg+wBJPH0$Ut3ybTA2VN!dBmKV$J)hnVSw*> zc?O$!rYO&0Mt*veT%n#c+KPxZ5-D=;xrmY^s zaW78_J8W%_G1Klv+( z`+;PlPL=4hT!Oc5q0XlvOXBMTHSZ?lTzuGb%^fWxRRjW#I9=Tf$#qkf^};r)rMGy40$QIv(D0JClCk4cu{?7j z__1%TnDL;sc7o!fqROT%@OojqM=fZFhljJ56RPK)JCN|Zlgmr-gZan&sJ~Oi_*`xK zXL;(C`%Xi86$BT1oV0dxq5wbPpc+dRz(Tf870@gO6;p*izg7AZWLuvVJ4QgRh|Rk?t){?Qg;7 z6P{}Yeu!QwFAeU88p`swAngQzIni0WbVrNT8ygbyt~ib=%TIYw1LqGu&o9jf4ARSa zig?0N=4*YtBT~8d_=(Y!Xa_jLED;U;J>W`iqJpQ1Rza*Q{t*1f@}IN)(?s&5mHG9t zfJCCOsHidXKcT=RMSk;Ke%Tbj>wR9D#9`$eD?MMYP!v52R|t%fDC9%qF3NAP z4L2h<)G_pf!3)jcCnhz?Av{cImR_z@wQGj$u-(3ZMaG9!Db*w4eo5yb1M8(aDt`oj zjmFx@j5ro1ltp@N)BpIos}qo#CO08!RVMo?Cvc{$VOM^!L-0ThP@OeZestM1hKEY@ z?QHuB!m;o+;ZaIEKorF~xHDfEZkoS@GVCU@I-DC3V7XvUdvlNh6(&ol==%$(-5I+f zR&yFJ%Ema5DO$fTS1<~&{lRe3n=t!i%XQjKqryXV_VgI4jSWYuKwa;>wh+=F9l<=j zG@cv5qU&46fGzuEbGbJIUUGZ%jnQZNm_{sO?o+gbyVJa)vda~%n@{G3^1-_|dpW4e6r8ZBVeIA;#xe66pzct&&~v>6ode zN!)#PtsuKd5qA{b^JOASdf)hpTgv?YBHkBIjH9lzZW<$Spn->rN_@IC7=P7*mx`lY z;69+#T3!4=siqPc$k6jqh9|-<(GRLSKAJN17#L%>@kxr$@@}Scb^HhxaK7k1J{OUx zxJ?u-RJJV9WW!&0?-M~?>>He#kE-kag9Mzz4(1*pWhlutWMO+8O=XF)jqnN zVzOKQ?y5P+FM=&CgRILvL~LCxV*(*Jo)n}+tf)-$&Oy4F;ewb)o$13;8Q^hGazw@+ z9#H2HJ*ncvf^xcii4BoltR(v^DCn5(3oyW2mTqL4NVPsvt$n+>^Ve(!Ux2rj1Aru`Uzr=jS zj3X*Zz#ZQaly(6_4^FD=aH}i+P19JGZ-TRf-5nB}QK#qTmbS#cTru1E?hEznKcv^H z@dJB!&t$>Kt(cTbqxnh`!*w+ zDXx!~nskcETO^uxmwVcTkL=P;-->Gh^0faUET7Qwv@r_6;ES4c@a z*cFf6VDTf%YLrI4+7-)p;f!k1k`sV_uzOq_TDZBL>dHziF!&R+q29R0)%I|LBcOh( zr=QBWMh3-1N4-PT%LYt+N8*zyO0hfIcS$&=p#wTro6AI#8c zzauwx$SK_KSa}Eipi)Q@GY)WIP(Uz<2xJh?g|r{sKu`*v#2GiDd4u-!A}k z#K7@Z>}}VYG;Q2GEZwaak1mTy{iXwiOnXhzWMpWSbUb~Se@`$c36zGg-_ zJq@1V3g<`TfN3<5+&4_eXP7JGqHYq|(&su}0+F>VjGxE#X(w*dgW`S1$sG$@g59I3 zxW;EP5?4bRzhAVlaxqhwmr_Xlvs**_VEK($OuKy42VCAh@x1 z$;p!H7PTK$zkGwfVOG-7l3cDouqU?``G$#Yx3wGqtlBjK%J|7xCgsB4r)Q52cb4f* z=NQeHSC1ZjvV9QSs6|lU+3^e+7*WS<**_#7IRkKE0IT2YG$<6rmtQ8AzsJSq-V4)c z6t{PF>+*hA+?Yck8{)Ap6&R$vOfvW;^ylWz36DZ|#3z`TPAn(~FF%ms-c9i>3U{ND z($shG5EUemsSv{S*Dy{c7iFqpIy*CM5(w*`{@AsRCDxJ9IPr?vSiBb4-r)&C_mgpi zk1I^mCE>?zc01}y;_SP&ec|IdVuO@-8(s0JpO9O}L&EJ? zirWYPzv!1SgKNa{lni6Le+_kpQef|<%XA`|TBg&RS3Fn>n<+5IdW`BO(i;PZ$~p7@*ZvJYOv4ig1~A-bIEhEvvxe= zdyOy<^P|q!T1B00k8Whf(f~kXW8-X%1r=%NzK!L^))r!fI2`yJFNFYOFh6b1E+5zO z6iF{eSMfA$#G|7FB0wTH_80Hk8}0)cT=-Z7>{{JEy`XS-rRZIbhSD-Ro`(g32sqjp zTv~cuQqOBhiB2jfY7>CUWvI< z=k;S*syxZt9HUFj2#XqHXa|TIQ^UacoByt%Q)PTYr;)plxH22<>0H5#Ys|F82RAfo@*FS-i3QdJQJ97(#E)Kn`T-;GhuNc@lM zZ^@^rO{Te++y_Y$$>FQM|0Ht}X`BVgmp3CY)K!%6Qi0P~b^hg8T76!daIw$hZT!~obJ8a?G!%na2dR-6qysc)*{ZiFB?Ocb z(bVX%C@zZwA1%t9X%Z>^8?WK`jZ;fM&*}3j6`@Wdh(%S4O|D4yXy$BKUq4VTk6+)?bWWrgxUMv5rH!Qmm?-~L_bYP$DOE3gp= zrH97ZoQq#{UT?m`>)+6_<+W*&Jx(M>=Tz$p2pCW7@8**( zP5rb7N8aw$HgeCfIdzdg2is-O?RW0(o<>sxQTDs*8ZGta?|59pncaLKZp~}6F+O6X zcUxyy5M0PtFo+v0_DjS#P!BtQk_uH}5EOk{cFWb0#uQ!ALwYG87*t(^@~7-qGPqO> z;8Iai;+vG?o_>*N{qhVM&+oomAN^GDzL@heZ9VL2#L;ec#kJwR6t$OJ{vG~3z|X-g z{Ic*58G8HQ+TpTJbJn<`E&fWP3d57;q(*zH>HBX1Roi&jBjUzca=r%}fc{3~Zrk;$$4# z3O&TAbkafx@nUcPb`t=QdSwaZw_M`jjrhVf*Y)U64PZh*%=nbS_1RC3xHDX?R^=>Qe9jIsN)OTlJ|aF&jd((@s}{xg5LSZ zn>$v46aiF?WHnaHMTv%L4X&+GPmJdjFLP-7Wrl{u)j1R_cZp&2D4yw-`7zb{(07Cp zT(@_!`;R94`9qKSlb5ykU)Z)M$WBC~#IJ4lEX;o>BLHb1LnYFq5ec{q>7R=P8ZY*) z*wNM?fzhu&w~|KLY&UbSEhj#LF_k@qUcJqpFyH%_1opG=pz@I)O;nCjJ?(_+gSZu+31v$~A9 z?FbrcCoey&ZW2=!~CBKidAKF(nFI7YZIf#KV{whIc zJ)WpoKe7QUa`+4~fySY=mjH-ua0rG=w$>1U245y3e3rBi5%VAZ_`xwlVI~8)x|L|Y zBEli^Pa`%qau+JR8!MTq*&Tyhcwu66!Sbp9%e33fEtT>tIl^x*PfGpwOFm7ws+#fu z9pyoSe68Lwt|!(vVQ!EXc)!$*zNaoHxD0=g;Z^OkhUP2|?Y!)54J_5FU+u~6hT!1^ zLAt{+75^8S%M71~wAqP;oe)DnmldfhJ+}w>{Fx@TGts@{vTN&39KeIB2(#|8_ezi^E5VNh==h4l z($ShiBi_P>#3DF@3)Z6sf0N8s*ZzFTE+6@s!)>=_xrHn0ivF`&geJ==s_*zQF8g|8 zl^I0Ot6(XV3xZDo0IO90_XlJ@V^-YOj{Vh3mSRxj!=6BXYG3vr7~`@BUl+!2nq+)% z$lvNcZg;HiUF(eZ4f`=LH5C!@%kui8_k(4&X(@ThqWxl+$`;BC3#ii5eJJzI0!`$@ z3l=-U$--CAtt;`>JrD_7{J%BzHDdvwSY6K61CtgzIOB~%PlOSOKy*SvPz+0ycMITvWlE`XoBSloiww*GZ4=*>_s;p^p0B`P}B}j2=9$hHbilUFP3HlEOf#(%wKP zICycUvR&c23x4U)}J&OdnifND8A{{=wB zWi<7-x+0#B>*v~w6ZNNYg43Tqg}Uzm{#?Y>5wAlL*%6NF+l%A#UNGRFteq=dZ+4&9 zyIl!&S8OHScDmV@s}A7~P%gG5tS^wsWrKA|8lNwL2nZK_Y+uZ~MgBbNK3o2R1#9Pb z&EKZUgLY=x@_BM|;(5TooJ~Yu#9NInJ#=8;%-Klym*J!ZbiShDGiR9&r>NJzN6gjp zz(5nsu$wp|{WoW;YeYAND&HKr9r)o_a;>$dn#bb88DeW7_^0xhTl*Dw zvwVDf5Xkr|qUmz6Gdv~`#)c=9YHCf+)D*?CIo%GgXxGeRc~@6cwo=F}zMT*#{sgPXtXGX2YOJ`zDFSZYqNSGE}JG5|J8=Ow?b~=7Y%&+_S*MO+HfbAp5SXo^sXoT zG*%L~HuyA#WUIWtaAAi*fjizk(_~m%;QI#0rTUbCAW&j(TlTl-Xc|OJuvj`^Cw5=k62NuNYXj z57u@jIB@7|iD19Dxci(MvZGt+Zt*bifb!Y6UZ(?K5LwoPLgIGTODKV_@XDhJ&Js7; zHP8E@WF;9tQKwDszq|nY8%or^{BOqBU-%0?#hT;3Iqvm_`zlU;)ABR3;I$?vM7=(D z9bP{DegEOg@jA95svk_?m^2mhGzLbEbsoJ6NMhx=o85jgHa5=ky!eZEWiYlE6C10f zp9z-L0a)s+PgK@72Jg0f*~wu1{lW6hA6Qi#%AwX8Eo#hOiFVjg8;DqLzg^38yqYLl z$laMd7&naadvY@LKj`lZB0sI9$hT=Hd`x<~y+EmVHzG0gvL1CNY@a{0%H)459Clqv zQ>8Y0VnkyfpTK_`(I^=GT8u4_0qd&^8wT5Q9{{`Am-j;jUY15J?Rb}Qzw&oFJ>DZg zFD5BDm+5HVjIz;(H-EKs#a5`ZK*o^Z_X2QVuS{j=#ue*4Y;DK&#Mqvc_xKZB!a|~h zG>+j3XHWSd2Rt%H1z|6OJmInw;Xlz;;rMgFua8P( zca<dl6M{=5AhW)46v3tQvtEmyNH;$BR3C6LOj8mO zjqfQk4t+Hk?i=Lxn>%#e36*pqK~S2G3C`Wi;$-x(Ee)mRN$e&QL$)4b*si&gxuwEg zg#%Yuy`Dx03R{XiHu_o;GeTt%F#oCiqrL2hVg3%N6k3ZIb!=f^Jie8H> z`vQIfyirPUmJ3zdved8u@)}J9!Atzis+OOosFeH4G1C8t&Ay;)L=Ow2mrc&YOyOeZ zAoKcb51%e*v3S;-Lt(%gKN_19%iM*B;^OPSlra>13W$c}o`-?Gw(x+cM0$HajoHWl zNn@7XC8wk``w0s2XmnkxV+Bg_=d-H77||5cM(ik`b-5>~Dh>63FEe z6NfLi=E~f?T;DjEeaczOAJ^|2X(iy>;U?yH{66dZf5X(l+MKEO6D5MO`w;pRqD=iV zFEuFVk%1B$!|#6+bui8c^HYUd^`zgv#R92k1IaCdRGipkPftK*D|s!S1msI zGw>%Q?C?vXM5|(!UoFp3d&$4Kx(qK{a>UkS?GuD&Ir+7~%Yu>%fnQCG9)&8t4+)CGYs^}k!7ohx}RyPa$FDQH|}rFuD3T)03lmj=Jz)9Arh2csq+nu zjURHyg}~oD#ScPBbsU5kIMhe&c~T0f`|TG=vTFEXBI_lI=$2xk_Y3qU84VxRdLoHc zk(>)sdIRo_*KIJ-hdVq20}`<)epk}R<6JU948_g_ClR^f4gMg57={y%iphVEJY6Pu z1XSMYum$83<%RrpPLyW zg}Q(DH&x~Mtk_n=;NRq*SlX{21{!3>TJ@ij#{v;AoSeBu>wXs%U2|Vzdf?;mArkPD z=*WGvRQ(u!JhtiFcY#D%^%ZS0>v}3O4QeI;GL};a@bEbwC-T)R z@86~Iop3H^^5Y}<3CeHzHt`>mBVzbgb_kGVV&k_Ze)@+nM9-9!?NCD&1!}zH?LmfrahzVHx*@!b8v1ejSlD&GH`$isya@$b$x`je8;4@XW$+P!`NWMtf+{cdS z`u0X+u`gw+cnste5d_|s=pg}IPH%8Q!ZFxZ=d=vHm2aKe`L8`$oy~$~#moPua_bwS z2YN@=-W|nxgPXXTR{FZdAG~zmKgZPW5=4}>tt`a6u7^xDg7i(8IXQQ6MJxa^I(pag zLwn+^xKvDbVfK3m5v(C;h(L;|y zHx(vSdh#%#YY*B9%7*aP&JcsfzJV%iBTt!gxpP2=3SGpLtj^X|C>Y}$RqDWtum<2o zfd?lLbOr=yP6;X#@pX^aMlXGT6``JohSJtO9*EUQ?-ejgL?9dvy1_Po1k8@cAI68r zQHlt+DRQ!hi>)=d0m#fUlv9=K8aP zO;7F5AIa=rB3FQ6X?x^^=OL#CKtFx?si-4)Tzpv?QfSES!=r*kK#`ZGt*J#J3J;aV z%b-`4YFtY5{5y^DwfdMC7Z%POVRb8l$PK>+A2f7Z^syyrk zI!3Z6fZ(I`<5tZu8C@+cREnQslb*_@08oi9DXYHpeap z4W(%l)RaQ3{b6c8BZFovKu@!I1=ND7w+3muu=LCO6nm+^=fnLT9Az?sGP6sXMLA*5 zeTk#gp*2hdO%)XXC<@Y`qQFeeEWq(X*b^2DfL+Iq_3-#ckL;nL@bze?W-C}O7apHn z)$sm~Mh*P>m^Yk-2VjH{KWsfU;}*iw@%*I8=W$k{fexFo;d*b!7fEgV9*5#mI{Po_4~z_rIyF>gp_0k#E4i|8m^f`=@W3Kcm?$APEV=ee zNO8YqX08nuK`kbyJaiRFG*ubTYvjFkoig}CbCmKhpWA-)bKVZmaA4n#ReuK_c-G>w zel6J?AGQ!oTDhAwTJn0@<2SLpv7D-pTv#Qs`I39qTy%@9aa5XLrh=q{?o4IT=Vv=Z zX&w@y=+YOE?;TJHFAXqjUc2u?ki0eOm+`Nz6etLM>_!^WZ3h?nWPf^Hu zgtIK!WbU&F+67(yS}%EC+>g%JHlP|m;y2q%#3pb(_LaNeG?qQnrzy3}J{0DPUF~Ck z4}~O`dh>mLp*-cRtk#3okybt-$o}EP5A0uNdUKH$Jl?$2vwK8JPTnOL7liGkxHypq zU7ye&hosjhLWt;y{O?O{ah}<3jAoWBsi_>e(&8K2$o@lKsXBIZbOmTh0kW@L`OYbG zbGXtE;;EFQtq^OF={KhHt)?t+p%~jdd|#-* zfQ3Io4F^2ay~(c<*-Qs$0O*-n?6LVami4?FO0ZvePv2402UT$%N?ydAr|8OSlRGibWxG^-YEr9Zb)ec zqGSo_A_rpNk%N9gY?jX0iLfZSSFdr{J|Uk8=V2A%B}Sj7mhS!NcXTQXSjn%}J51^J@;VMC&lSv#Dm0%MbrN{Is;{l`Xc8x6Uevf?l)g5E6j9%oC zpKL(A9ftSy;UEA+Oo z8b8#Q0s|bMH{INQ{KwVcd-h|qcAxRt9bu(bz4~V(80DR+<{AkEqTs;>{Wig!9yf`O zIF$(d`}5%LZ#d!e&~WJ+l>)Te$=fLvZ70E}R}raoUCEnVLuu>;+as?Hu9N2e9A0(J z8Q(jYb7uI`9(~XOb$;6v`u?_*QKR}MsrKFnr zECW?2VLEyEZa1Z8>vpXG=rgI>`lp`g93-zvn$CL%F#0MTyB)k6cj4df3)rDXB%GcU zqsX!7rSaSZTdah(zYta{KYnR}8;=@sWc@tm$za0KfQv4OW(5)D9qGeT9hk^b(SuP| z9WBZk7R7H1^9F3A5KARN?mL8Rx=g6McNhS`L+1ec5H`2ARzXVyXiwq;l5E|SQ$mpL zR=3I8de&A9De^>ZZC_x^;%5|Sq@35Foh@2&B?|ZpKl;aA;gA0o6iy~5`+`a{=zSd?judjrhnALAE zdV9`_3b)n*N0!LCE7*=wb+l|pT=*8->MVFc$p^G`MEG|X=x_b}5YncH=H`ZZ?qLc) zFUDtW>Bhv1hFNp^IZoXDPFbQpIHPL=PM7Vj1@zewfuJDZK*A}UU$xefV@SK9a`qDQ z;+6VNorIO!cf8p{(mBi}syp1j&7kx|ok7%(R>2$jDx7Z%By@gNx6_^Nf&RKm@H_AC z`AMCBDE;Y^_391}Sk5ql8u+H=ck5ive>sI4&U-=A;z%%v9}rOf<3)Q;OrpxF&&C@m zWI>CcNe$O=e%AQG>{sodQyGAaRdM;= zv+!}QzPi4V3r`+XT#oT`gX`?VJ0lBhnhH8B!oRBjeeN zLD?Wn0tkWrS4i{O7Eg3xzb*m0JFVyWJ_3NXzNJK2@F_h=7Lty3UOsLP02US&1UIMV zlf^5*_DFiqmL^6Z!=^aEw`FH%Ytw;&pO$7MN+Cre| zqtey}UA+C25YLxyC4ZaW@fz#Ud~!B_n^tC{;teYvLB&h=S+rb#hwwjUX?Rv>%5Zl#DCebD8a!w|e>1CX;dQ?PGNzr`ylU|hYOO}?UoFNvYm_Y}b>kGXzmlG< zq`a=yeN9Om|LnA5A-ADqUQ7%^_L{+))Oz#KEhf#By61&B3=w;FIrCo9cwTzWvackd zV#BKCvA>}97HNVlpQ2Ve*OBTUhm5B-c~)Tqk~*j zT+Hb9>y>=1rAqMR2JG*z;w9xogo}dDUZvb{P=$vj5E|T1-+dPo6XOqBptTl*Ka@+z z%F6otfDUmiVg1hgsER+q!%27J-th2nZ`_O_4&>%z1?+G6h zqtMXqlxT>rG&fLFPqWc=bLMV$sm*RnY&zrAOh_k&7;q8~)}NW&&%VbTE%0s?BqeVo zUekOf(=uOiTj|Skwec%af8+*ML;G%%BI&|DFM0VfTzL$3_w^xBiAQ#Yiv%0oU1nCg z4qFcS`n_qo+6nDn9xqfYZ`1kf{7`Dh#swC`k1Ow|rH>I7m5v*Zma zfHj&oCD=*Coh$W9C_*>`Mt^!D`u}L6PR!k(t0p>4P&uAjEM5zx$rJ}A(dpij&iWPa z2yklEgEmR?wMS6b1731AHW;g!lHPC;T_JNxT1qd8Y^Oxq7pa8$a$*8u6VCF+k`{dV zXee7YiD1CBP#FL`r-vJ8Tk2fD)!q{E?bnLXb7bfocb0Td|DDkIN&US)bYtanr#@|6 zL~}DQAcT)?Jokg~ou#Cdl&H71w*SMkcAM_D6frxi$NI2jk@VJMeW9qRXe0bEZ=Lor z`RXkOwzLaHXZd_R*e8`!RTKvkH(6Oe$Ui}^0A*- zl3J#8Cv`{oGc$J+DL9(b@m#1fh4<|*O3=k4>*!2!`8rP$UwBRvG=K>ePrZG%oDb>) z)Q%rdt8xfd#x3A(_7y<>k-G(6E{~A&5`zFEFcSe2z^?N_Hf;b`M6hf)LW()_-3 z>URWPSlQ@)5m!RU(AA|Tr2*$U(*YJr**eXa<}+nJm3{b3+E72)j0z($@cxbIn1yp3 zA;LlmILHREUSqKwC}KxD*lC3A0{?2yp~p9Kmwkxf3Bc+REDHtxOB4|iHReRmQvRVP z9zp90`HfM%?QLFQ83u~O6iJttaiK4mx_&i!7)3myM#3RGIWx)bG^BD)b2TAT<_vV@ z!#H21V9YjLJN+c#eIXgT8gy~e0i_u)U3m#WQDWp)uiI8CHfMd^XG#=SYa3^rj=OYh z*0h@63(Q`8VH*6dxW7=3uP`1ZT&lP+e_=IS;{cbFdk6G4V@!a%*5+*LSj+DohKSRa zwo*n&NT~gt*$8931qCysHbd3b>w$zuH7o>w&uH;SSb7}(*RtR|Wg1kCd7FrzCub@M zRsEC^S<2AXS#1|3GFS$Yw_=yPIbtu<{Y5)gCRJ;By;jX~+&&|YGu!TT(PVhU|MBt) z?2)l|D-R0CXE9um(>gibQG?km{rq&9T5jX}`2G89ZCPoNYSUpD0O`d&B8#2f;`q)B zpo7ehG!QE%W*E)E;f7*QT4DwS?D45Gu;yJSFV!D9`;r=MNC@j1`fA!goHe7>+AQpS zu-0h8j*28ijlVVJCKAy7T!-n__X{rAMuD<13)BM*u0s?6=&Okpf7ya=qbNZXay#66 zy}n59Dn4*0yp5Gn?L1n!rXs9qC=j}4l#M<1Qs~JgyewM)Yb)zfU+vMhpxZi%W zZ-{ORy+_GP97z+iv8k}&y-c0jIUq8;mE`qm6S~WQyEE#}$;&^uKucI%qZpmbVFw4G zbYxA1muC^w`>xkuJb!qu&Thy|vl@Oa7;e4tXSXdx&=vNH(G1}43%Bv1!++)0k%Ec8?rr$ia_KF$ zCb65GoU`u_7GL!$*bLvco!cR!!u3Pj@ZbHg{GI~Fx7Ap%U{*n>(^^^R-QsZGnMDB; zZTaSm7qVo^k=Sm=3mn*8Im^tB*YOf~lhoXRHAeI03rY%7)L=qt9%MNA9qd`B)YO;h%DM zBmhir=In$MuJ-9XTyBSpe*ZO$>5Pno-zi1Yg%@mQ8ym{#WGj(Kid#n$LgxBheP8F` zXubSh7UIQNp~<^|TAM(^5B_!Z;f%+JymnMH+nzCfWxB&%KaSceJunJnAA*sZ#8<(5 zCPte1&I|AFWYI*&Rv-w`6dLFD1+v1V0{acVU~yZ^SK8#4JpAam3{XKhqFBE9)wXkQ ztd}||VNwlZIOSiNNS?(t(iYc8D}FYr|He^wmR4;#?YD_0TP~T$7>=8m+2p6#4i4NMA;7y4Z%Yh@6^EF8&Q)UukC1Q z^XU@q%cF(x;Z)A`-+9urw;PxZ_G_>p`wj(NKKc^-VE^ghxC@x>6m|)Oij-4*uYYCd zW&-jBk$7+!KBP)-WQ58|mns~(J%_yQ-h=u%>qB}yl+m}=U30m z@B$3z;G?K3SWEot5oDdg=d;rV(tmt0B-WP&xx0Y8ZHTaFTBKZtvZYAwsmD^2ze7Ss z0VS9qz{G`GYP;0Y0P@&a!k=nRig-{cc;Y98q_`Wag5{u~ogAz)unUO@`94Z<&&6;^ z($UOdU}S9e6Q&`+(SnmwL5)PuM$bfeZcc$H5bENu6 zDdN_u-L(zDfpaQRG-&1UTtY?^<$kT z$>_1h+eoM)jHdwsddNA^!dAej@WFS<(LE43_czWNz6P%ga<|GttvoJ~9khA~(WVCY z7SX3uo-TihD^0=HThThhVQ^v=pu3b_6s-Ai6w6>mRbT0)P*b-}?0y!g{b&Hb>AhjZ z^P2>~H+^GfcgG@+LW61LJ~&$-0Ri1l=_4>EeH(Zw{7PUD?5PX`30+I3yar2IEjkAk zeC)~jX%28b=Dtxs-{wBJB}Bzre3V@)?aqW#f~vS)$p`)RDFGGPkFWBqa|u)` z9USQ3NOaJ^HICt6gYt0f!XdodSdYc$ZNh#|GFAqFi?1)%K&%4_T|0LZ)<4g!`Ut^* zU}< z7JuP#cku8tvCTG~*C3=MEO9k_ZEX#l+Q@8$FH;IwMJ_IC*H}-@=d|U^q<>AGSYflV zs-?I#{U!=bD%j21(Yz^9PZVB z_VumB^e-c9xg_))$K+y>E|1idsy5?VR$ETht6$Dx-?z8kMMmX}JaIkVj=b@QN9n40~*e-G}pmoeRD4~5{!Ko}?VW3umjAFtG zfv1Cf+aI~Q>a*5=`JR72za=wDg4DRcd%OBqw8xQ~Y1=!aEx&plGfiq~NW#7C(mfm= zW9X+M6^G}&ijog#hAy|>fy~KB>e;gX;#n=3p~Z}jTb|SQSJZ96^Hn&$yP=6ijx*9G z*FDuGQ_j^{H>axR`|Rn!=kN2iKdd>fZObkmmnDg zvL~zSb%C3|;(?#+E7;T1LqN{4C7yT6SmO3Id6|hft9cbX*x$z$fKuU^vZ=$ElCe!I zngiB@BD1aEjZTPBeD~x)K_tJ!0$-nl`nj(dra+aJ;@2A^*Se=E9{e}pJ$!>l%>sf( zrIB)v=A87FpN?Zu@mr7luQ`!h&j*Mc3fejR4DwRT%(YB11K@kH>JnBK?FV$ZJ+Ys+ z0J|Y-mXNG#mY&YE;89L!=8Ynk)7HVn58{sMCPy{+gG;siG0i(0*%_e&+iox%Lo9^Y zUzm5-lkSZuUgLnfE?<~G3nQ6>sNym#Esgn#x*2>D5_6kFI)*sFwk0xy|LR-pOZjUY zi=U>8-mj=Icl)QFI8m)^rWll0gNh%A!sU)y1d-gH?&wDdmJ(CTxQU=giQZie?dX5@ zU*4S!Cz4J77}lE(0EIfz`>Hp}EF4>p=NJW%vmhApEls=>eeHoGL{wNd_xPpR%)}>V zpGPz$wz~Ix;{u;_$>3H`{9hv!$__;51F_S%NtbiU%00 zL7<9wv}a^?Oc_fc`lnJw!6LlxEw;7S)Ro$?j}` zo>EaxQBjfmVrX!ua`X|nPiz0CGhajXZY%Rkz>??susPyQRfC!Fx>r zn;o{bs)Rn=ivm!r5n^v(8#;uk~ANuYERA4CYMpfu>~g^+UO9 zaQsd(H;|P$+j82&X9|aW^HSKx)@BMX?P^a|yUN`ogDyq~MBD7;o7UqJdT%DeY4RuQ z%-K=KFmlUKE8)Xcxum0AEPC1?`HUzrO*jo3Ml5;qW6QVpFV=p1WiQX=_mIMyYA8jj zcq!R@sU2Ot*Y4rnx_q-c!9G%sn0-EqIq&GJbKI*0|0Ag!(lamE1ZCHS)g#=*vdB`U zw$wqA9045nZ7NN?@*!|P*MqC5>4`(jquE~vdTCumBKa;e=FGkag%bNStU?18L*-c8 zsmgaH0TXK_F!T9;l*^Y_#?kqk6Mr=EM5Mx32L%qZrJwF+68`w4LY143n7{Be;VMFB z%$)tTC`}cQV6HW)c@Dv5$ejs$O@6HqU26OPd>|8TK4x}r>Y(JrKm3sNiw@Xn-}~ zp3kNaXt0USqK{K(aUg7Yw8rmY{-uw2Ov~v#1>Zd$2@UCZ2WRgj8w~hQ=_U*dFn{h4 z$d+AFRAcg}+!;Tv%9uR{Wd`h0pB*SvgT?gjSKCWz%KORy!D?0CJ`pur4`Zf|d{^Zs zQAhGDE-tZorZCJIXZ!YTOM=x|{4GGi7FN!`iP;yp?7d{@4+t6^s3-4U$-!-%4dGj} z`F(Lx&Bw>=;^(In0aADtw(ho_6BTs_Eju5>TKXr8^M`DnwxkiuEv-B@Mqu2LJ_ebX zX*Q3KexHdU67G6@8pF6dfRq9;Q8wbIQY&nXLa~ktx#zp?Uo@DF?Ga5e49#7ig3%&? z-aKXs<$ziwpQJyjJYHHc+noFI>3({sIqmK6CtdRmvF!QET(={IT~RwHNQIodg7G4U z*=gSym5+sVS9K+u0xeF~Wf^3*j1ZBO0eWniWz(C8*N}cb&f@MUrQ-#(X0q(Ud%=d? zIZAm8kEr#}HcoB!&8LpH3!*k|!ckuN`3SRKNNST)w^YA#iNKzS2z*YN%POEbPXRw^ zMI*a!>zr{y$ldvZKk0~{F$2crIp|FjFtHVQRA+%|fcl$q#mQc?S8G$+;{m<^-}4&X za3Dec%&Quoq*aEtM>pT=VsdW0q5=kEVzLB2&%kkJTdiao>MMV^CikUHIdWkWm0_`c zJ4aPr{T?kfs$l}gF6}zG(Cxl7SEN9x6BeCp6>4ga=q=4f*s5YGA+@us#9taW41JsF zr>i&1pR*R)2}mv;73>}p)m9!ip`^C{?t%2r+`mw>i#S~PE8RcwAU9FEzdk8!^JFDF z8F|p-2-L^)u76W-?M18%RcHswUyzRDYG6+2pi45&f!V9(ly-Gi&~KV$tvWj*KQhV% z6x0EJP#@-U@AkE#0G7UTlX~xGaoT@ksluj(>f_ee4(@s84k>^!Nz^-4;d|Wq6_*0@{39Z3f=6Fxh2T6{OewWu-lu5rR)J*ZSQ(lzYd2K zUG0F5G+GjFlhxV`qlH{rpLRUr{R!9414_80>=jv~H|A1yY}g0P!#D>49VcyFXi*3m zU^Yne?#p;Bd8QIAc}UNe8MFBP82dS)c8(zI$wCVA>r^+6YsWB|)3A3Qf27+muyC)d zauB&aG=5z^F@94) z5_amvsD9p;*q$r`$vpIGx?}L1B0(viDP<7qV z-4s<)n0TmLrr(oVCfmjxkZK~d8LqOs`XJZ-cfaw84_C7RQ)ur~154&b%GU z)KDA;(;1)c$9O9ieMw}LW$Zq>(N&`k6S&58>OtO$d=;`nqT|wsT>LW8G}i~Y5Z^)I zpc&+R6N3+J!V|enQvZJA+mRBmKQ?+s(*Hai|7LkC3%NJQZG*i&TPz2}(ycw%=XK;s zcBCMB?_RLYO0)j*jvLBkuNDSD?yxW#Nk(VL`MB-WQSdny%n@89pJe(l$?w0Zah!5J z{z`&x)&zrDXylGTLM{7TBqS%*j#F_Lhv>|RZq2)Vd@>qEuKI^$ByX-^6&t-`uR$}{ z@s8&l{~Fbo49w@Fxqz6b!PF#X9ideG;C(^k%1Y3xg4taPj9&n{AxD|Lw|>R=_oq2d zim!gvGY0`zWY0sXg{n%bt3^Sil(JvUJE#l%!hmIj47;rtN3P>{68Bb%r(|~0KVJja zFz08VV^bM>#1bwZ=aaPlz$)*Z&q$${TXuIN*q*GunMOE~!3XbYsHve3NxsCzRc=D< z*AIh={Dem>6UkP`izJL2p*iZQ#%nWD!F_$Nb&HL(HVeK2m;NOBfILg9p6?l}i=%j` zQ{m34<;(500?sPfCK!|v;4GN)G77_k4mjJCkb?b+rDT2b=?vc(<~|@*_L}A=&|gJ6 zTYFn^>+}3WGqf2`{4ux|6O#QrY;Tcba2OwW`St79p@7y_uoIRuAhSn6VzzD*3WMow zHC?qim61_NN6N?S=Vjf^)HCsqZ8};rXq31INOPo>Cy-FenCQZN??b)fgHVQwy_ZoO z9Z-}8myl2*_9eS1&g744;_LY@&qChy1jgUiM$z=(<0g=Q%5UW*b6jX==CXnurRj)0#8_j?9-0~gQ!eby@ zu*%QN&$ozN2s*=C9xsHAR#-lKmVMXrbxTxa-)lD*-URnww2)^ldGsD?HeH^wqKHP- z3ZR?QPH11E7Q#*Y>8<}6QpA1x)=#70+nr{UX#uEJwG%qp|AKn{GhdmYJELD7WhSbc z+qnVYO?UT_euVJx73xGR9h&OElGpt;G^Gb>ktQl z%wV3^FuCiorXB*sQEm;Sq!zOVt*7r%*T+Wa9|h_@*Qga-S#%>wqIxIv@5ufJL`wN- zX{~;xbj*uPd*+o60KK>E`aBqYsXPXIP6;I?r=b68q4hd}6IZ0GN6xiUj(w?;;xSb3 zdYN}Al`!?y=X3nEqH&AQKapW()de|mQEyu5>i03xKf4ac>{*Q*Uec^t>OQct~~#sppYu( z;oe$UF$yhD=n@q7O&IYPcq;?Ih_{g4-Q8)3fU7B4bhv~mnS)*NV#wgz>9QC08U#8@ z>z$wP@DWbrHU}?#=}8!E1GA*|wA=7(qOQ#zFBi1NZK;PtkcT1&Gj3o4bmsp_C$DDL z!cZs=n5)8gt0LWlDE+x-W=AQ-1;GeW53!q>dB6kc!~igO3~XYu{iYkr0AfZMT;KVJ z{eN{%xo&;s?7XV)04K6FOoVxqCxqq;E>wLzbcpTY3H+=QwNy%Zd9z!dthzYn@VfQ8 z{C~*0qYb(f%krm}!X$D@t5q*^bKOkfk8b9Fx*qR8(zsn%llh^o)H!@J(8?Zp(v_6m z`o&%p(F&GPz(g+fK9_35Zw;0}W4RFJzFv>WjEWI58)$$X>(|I#2h9=GN^bV*#a@n_ z$~%r9C5XKPN+&y&?+Y%kkY4|u1xV&vWu5_4{(t&jQ&r)5>!d&uY@AN(qYKl3UC>%hwDKxE7|94>2L%u5RgNC)iz?J(YzPKO8zST_~-h z_GF{EQNhy-V-Gm<@oZ*5faAH^+gxw&%~m$fgfEERHOkxsI~1%-O~<`%^u#>@#xg=4 zJ?1Y!d;Q#F`Wmo#VIz0ha)kW!=u z#@zY|XrJ3PMGmtKBn%A?o-jT7(SHii@%&xlzm4|SjSpw5s#-j@sR$EL@8zz07OCGD z2NYB8y3xkC(fa&js`T%6y=&dFv*Wj?eTD#Z=U;*%($X~k=}w?*+cvT4UArp~r4D`e z1JI5XEkOR>qrh~-fq-^;PM{vP9|h1`)bpR#QN?{OsC9o5Uq=|Txg+6!QWmZ?r`}rDi@Bg?3wf$E_WwZ<6yqd#Hk^Dzjm#SmiHFvta}VRfiV` zO@z-lKNs6ka5>dtW!T@;LOPXuZK4o10)_&}qm6zZ{D+D^rOLEw1Uk9V8g);6SzT@h zj%U6Beg4dzuP~Z19Oh*4CbI;2sKsYuI^%t#yhGa}*W0K){-x==C)NY%g%EBFpPVvY z=B?@ND*b8uTFll0YT9kA;aRl&w!|jtpcVAch&ki3uRjtnE^+$OBtmb=9-0`q-5B2H zu`-}=$2fJ&4kDHgI@cA8$eh@Ft8yMpZKOA4$Cp+c1OF+a)0;}VRu4K$lBH_X4{@jN zs{4>a(R%>%p(3JFB%<#p+GC1F;*4KvkBE!0aWqy*ET(Mh)64T6jINKpPaGPfREH77 z>0h63{-z=B*OQIPJ&9}wdG5CT+UhC50M{GG8wXyG0!tu&CXxsWcm=!t*2XF5==`F{1}+wNmpp4H{mTX+a8xOUmt=@N9h8=`!S%kNhsZ6?7??9u zanA#Rb?uI2g{Oc@Fu*atBhNzf_`dRLkTC(~l^&|7!U(98pdBj`t?^3_FFm`eFMj57LYMOR=U%OteOdd!(~E!ipz3oEC^v5~D3p2yia+Q=X zxF354sr8Dk*4CQ0aD-~d!0K!?J|4AH?$3_8oZblQiw+gTHNhAHun6~l19|zYwh@u; za)@V#DdYxSq4D7zyX_QXkl)ow;>l_!>J)VLppn7O!_BViAJLrPY_oK$wO4qv`tPlk z-_6d>W5c8)W&8e-qtY#_nAv~xv8ItpP6x8R_5rtT2dDhT;=`2>{yxkPGPbY~k$e0!;8*RB?LT$wKjeDtqjOd(>eRo^ zGW2dvXeqrQb7g`=Xw&6htcuvu$m_D37xNB@v(qdCoY->1`i#Ns3#xlG&?IljN0Cw* z_c?b#RtobD>)wmO`ZOQQq^nd0>p@4!-K^sPm@a*56iq{#-}59^&PbOYE$Z2G6DEP1 z9f2940)`74tnK8PZ}AhwVM6}Zl&tfc?gr^pz+XhOhbm-YGr)bhv99!p0Ee?m2s&f& z_LT6L9N+$%ib1vue7RCPzi`(N=txumHy;mM2>6~hE$wmgcbr067?w6;jGHf2foJmT z|4Al_PsP{mE;Lq1dp?B5Q}|M|CH5t}2P~}geAv7a3IJOf#6s3EonII$(aQ=~ zr31=61AEIBiB-{i!Z@)+b0SI#1y3H{P(|fnZ0oUhx>KTijib4K^Ylnz6AHbiYl+&J z94Lo9pTcU|mT>2E9A43Navz*TE3uSX-%%us;z-`0&9#GbCV}`#{WJf9Y1b2}wli&v zIQ%-7W`^bS({R|`wcFAN31ZX+oY;AeR6~B`pQ8AG7N2#)zOa6tgT?T7teR6hfuBke zrlVQG`A!P@jCb(Gp4^KktE|1I%3hwGG;1ryc*^n}iL&n9Q=faqvu|MOa|goJvz_5S z#%?F2(WVjxgy}v0zzf2P780q}>0_4*4AMU^7Lw&H>=D_!J2=o)tVzKCS|ye;hr$|L zA%+5*(;JgjUY9rJU$wi;Hr>vjVO>ZcT)g`2D_?i$$O*6{`F!pMYL0PgVvi^8QS1%= z`|8Z8q!lq_*nc5zJ4d41zEL2Uc#X3p;NX%AuuuZ2{ zW_Q%Dy)Et-O4Cxq=JR6;##^CQooG{AvyFRDX7fYs;qy7U+ORQ~N!CxzQ0d&-ZR%y5 zM9^Rm#)qlFV}eON4!*}=*x>P`&(KJm98 ztG&@;jkfL`%5A1?$4ZLWmkXYM1n(wKSAS4oTXtCp4;`b|Z|K<_B)g|%1V0r>)D>WN zZvIUMM>${sdl_cpAq9!-_|eAWdlB!s_u^<(EX(U8Vd-hFoL<3pVxc*Q*VNMIQNKDt z65t%QROzV1iG?m*Q8KWiH;VIh+oDlsa6T$o*R<*usaER5MJ~|m>NH) zVEEiXKTUV0;0V3g5y+d+JstejmO80NlE9Ob@5`YO9i83G5GXM{6txTYkl5=-RYU;%`I?!t% z)ybtcQj?q#Q`xf+FidS1SF%`x*!`>A53LO<`MxZ7J}|2eRdRfu%YPx@GB!_Zf!&<)e8IBK$P#VqgUtN+P(Ck`k}%u3r(GJ8zDw3#4#{a)ihe} z1K5aAP5ANETB4xF z1THB3MTZn05Xp|!+Rl%!!EYCO0x%HZ6xYo>0Gj_Fzt@&d2tgo5^z|MA|F?7ge?Gnh zl8nCju$HC{k*YG>)fkBg9^~{qkvfc93J!z3}2l9U4&(xIRdgFyFwscG9*< zs{L<$-ahwcK&sGQKxgh4@JzOtJ84ETrvM2AC8hN#3$x`}PYs{Pu1;9-oEJ%e!~%eDZDayw zeu=G^zzn)aP#RAnZre>1Zx&`~0;7@IH>ss+JWcl$OrUe$fMrlDvyl*`br_e<8W@>` z>If8})dw;mqFlFeHJ-j2jUyj?jr z+p9OuS(9$1*W5?~)~4nX)Dq@cOmGqzvFv$EZ{OJ#-1e)Vb|%>>{SM@j?4AK5hov?( zuwcjg;Z+z)J6X>;nJ&oB!h};NV)Hd9A0!ZT5oFT(z>Le~aXGalH&{*Z7Knp*tApZ? z6r5ncf7LB-pzH;Z_Zj&Ogx#Y4q-Bg165C}-YaKi7rhYfD2X%yO1l0svG0m3`PVuU( zC^(SXP|AGh#vDyi^H)E z{Q|YVc>8KE;_at>xPevyu^*~HpaCLz6WayhDkp%m!CA{ZcTMJN+(#TvcvB@ zA~uN@lo2|8hoMKZCi6DjwpFiAPiaW6LqAm&Z$8mt;wx6t@v$k zfjQEbgaMs6_Neijcu_b~WBxyaC>~oWL#JG`d(PempE^#IUdI5H3(6NB3U1F3-lG)EX$^Tm$DYc)=(qX)|#s zAtR_|arVF@*#wUIDHxSpqkIQgucJZ-%#Dm3=gm`fe+~DnJr#m`=FpH}cxyN6;Z6Bf ze6~e5Ae4hI;2ly;oatNhv+n}5_e~|FOME}cag<5WBOSCgiNFi9kHn~tMNC`-z8REw zJ_5-54Cp+Tu}g-;^ry&B3_FCSryW-!TRpRH9Q01O3^i~3{8Sm(LF8h`Sx1@_kMFW< zJs9@7jbzOPMRzq$*@|Egc`?cbrXM6^wH=R%ZTq7WZ(P$_0MJ^eP9pg8{Ur(f>AoxS zi`U&Zgt?39mjpJrb`0rN(?Tv==Y$A9Hq_7Gf z?JwL@0XbvS8ykkfP7wex*O@f2iqZsJXXC=PPVrE6T<<;d|6s!Z8|Hb$C7IVGaX3#c zvDv>Rz{N@YYjUzwu3DmCShoglvcfX8udmONProyJ(el&N7;gq1Jgr#^`LaOC`=%Dq z(v_(vNon!>^o-VH$L2f$J`Qu!%%3P#xTDBh>FgG74W7ZKSDJU>4dOHNK^WU`DF=~8-yuAayzj0t^~t=!`@ z;A-rttE)SaHF5|ni@CBY5g;_-H8s3@OY#rchw2uO!XVgzt@}iti88|oq7W&qU-t_J zrLru68a`}fuuOZ_{p4)O#QKF811FI$HGff8A+-{a|^4ZTlqoLoi@cl4Q%o(Hr%6wOKQrb#6 z?=-)-TCEpI6cij7B-|@c-Ur|d`Z_9o8d>^u*j<+g+bxo4DZ)Ag%fahU6K`#MaFwrrivr_sH{&DEXlx|$gLh-m!qz`=4XHU!-^@#zq!bjceij!O z@2lM3Ef>zuMAS42FQ1w{mdrcfotl~oa*;eY#!ZySIAM@pMq;?eJ4`xSeiPH?t${u3 zy}y4;{$|>fuy9}L%+<7=2n9S%_L zDi)!cY+(@_X9WiD%RZ*Pcm(WyqM$L%u*v&C2*k|HeD9MK{NuB19^e%c5}=PA3r$?H zzZtud{6AUxDU%<%2n*SC?Fnb~rG>L4#S*D+FwD_-r@D}TqSN-Hf@)jyZfSlP{^Grf>! z**3jbY(zn=I}_8l6jV`I-~5ReL>uRd3|Q2v?3;hYiulC@$7Ym%F#GgCcNTnEY7A zMP(mKGtZSJQ%)?&s84;)=^}$x(BF>`G+g&Z(%h+#OUu-&3Qd1`?N1FIB2RunXGeD~ zLFSQCWcWZgLyu$^yIbVMgq@&L9K+J`va+yK^{=z%>0_t5C138q& z;P>gprF*1sNSm39?qjAjioS!h3r(`%HVU90Fv?Z{Idm}8cBA}aii0q7O6nM zsMMlBQFi1?h}LY&3`g<7o?!6B+!(vldlu7hF0k5~{BSTStvI%7Hs1KD@0|&RkV)Cn zOQaevjA;5-pC*Bug$aaotL?1Zg&BiC7$=|hC&Y{TY=jL@*1(9s-%^*0wgv8gy7twc zLXX+&({JewHK0Dk*69xlQ-fu4(T0Wu}ZxA0=Ou+6hYx_U{ zA$02o5>hfd3Puwg53lUW8A$_{id6AAR@Ie#NSYKSj)|U?-J}liCw=PNFI651QX`Y#LO$z{o zI+8KJF=&@aH$NOmE}7rkl9F8AW(AVDf0!T7_FxhXd50_fP+kTo=gNr%f+~%Vpl# zNfaUipcz!??zc)CLW>Uk$#B_Qxha3umt@G|WB0yuX84&+`Xd11y0w{Y_bc8V;<|N% zl02-VqZly=y!{ix&-=4Hr;_XJ_~H_=l%GyV9_`XaJH8CM0Hl3DzwPC9$8k=TT z;@1N{s~lW0v@E%hW}@^b^QD==9i4GTg+f4pm^t7zSy^UYfHr>ud^{@L9s5SzThTHg z6!3Z*k{Vk6{+G*>_@Wb$cy{&=o>6lcc+*q`YO01HpTLyB^JRg0o6JG;Equy=<+it$ z@?v^d3r(4XhwEz@DMg8%(63EFqk&?>s3o6hprB5v1rp+^Zeg+y)kD%~wsi6bkW$Ty zLWta?F!&tN_ZapIUIe{l^9N`^&Tix1-b^o79#(y9`iGb%VSyS3GW|b?xTk}yxR8<~ zjLS7-8zek3a2O<_uA0zYc@P9okdCJFc|~p6CnTnS1$S^lmZy}TN_%dl-KGvR^<=Yo z`j`n>ojuM-Ns3xz|A9X`yP!GoZ7%#uMF4tlZJl8oDMfcI0C?JkqcbuP5nDGiuE9B5 z*qWfcKzP~G!O4zkCR^drts86>CF~R5Uqn3re(-wx?7{~y+-pmTC8{*GY*gh!KeeVA zg=C%0yK!*z;=yO*a8Gvg!mu4@!Emd>E;|unD2#d&-Xd!sOsuzf`s3-C=npzoa{)`>^K_wj~OH6m>;Ow#!UF zsOBXXrCC|?9l*Xp2?#su17JaoebohroOksjetubLF)=Yro%_wgLHv~1n~gJI zoF<3XBRcdQe14?@-N#(h5=#&?%BHNAePpe-EF*D}8bJtgirHtO#xMXK) zY;y7x4**NpUA>LCOUVKiu*M8e*y^~fO(>A5nu0cGVF`xcabNN24RmD>afUTV9tSpO zvqOeE&+Hvl)*?{x2B+B_Z(OrBUVnJ@`3-S#MLrq6 z=<`02|Bv_nGRO`6OGnM9>wuC#;p*J|>C2a0^FUF_0o1nZD~$=TIPG>8G4d88b(p%A zRxH6=H#ax%ONcW$1cN-e(e2u7T<>P}nE3#@Hew}&g02w66y)U@>ophw3z%=-Qib_l z!-^Bh=C&4R+hzqbnm5#qeBKw5}(iu-l>GKYuT@;y<}B=jQ`af66Do zOw-^de>J~&@xqFl2>=@vZytHDD4Lru9Klgh1Z?^`I--B@M^_T`%af_vHCgb1O>zotZ~MG8oL)GPzAZU8zglT(^eDHH&0GZuA&TlDNV}S zsVyBEO3{N%dtzph!iB@aikbv902Djy85}en0V;=#4XbTkxlIPw#ai!`;s%@nROMga zxL3w^@qnKEB2|(sbyqHHY3c9ZYCc}x2B6{s29S}lDVG)kmlFW#JDeT+Hv90NWven* zpdL1U-5lp_Zyft)ONC;|qaD|_k4@(w6G|iAA^bHaiQ9-`wC*u&ITOJ&8~ilhKTza_ z-PvZ@wh*&-(tvd|*6flXS${8vbn34x9(*L)Z);=_h5d@*N4i@2D4Po1y?jpgbCf70 z+EZkirH7jCj`i7OHAwmGq4y#fD1flb-QC-R5?_p(Wx$&!$X1@ zZMhUD!DkMxuC9YnV3!KNktpE@*QMF--q_o_y6%W{CE+_3wzDz=F6*;ALJ@~r4x9Wf za{X_9!DZEBMWk7$l%e894ImH^|z=nQ1T_JwJx=Mx$ zOc!gPKQX4?re5dr#*qDW>4@}AVnX)7fEOK3!J|XCh==#?-J5kyL$u}s^g9jw{>_90 z-YuB9L%m)LtXQw+W2bL+K$Yfv{`~nZ1v$BV7Y@qh4ZZ~TP;;5kxf`R5_1cheW{>qR z_XR+JB1QzsIn?)i+eB(7jVb@t`BOMxOMsok1iu@PuksHUyaMk-AE3i}*HmUp(PwlR zJ1h?zmEPq|3z?arMczGSGjW-=Gg7Pjhq`=8E}`n#UXJO`uO<$*V|x7CNO+=%EV~U@ zR>s#>aK#5{vRSs+XV`x@Otb#&x`0DwZ<@;#!5v7fHm8hHvUwej&g-eWy;Ql?rz z!V7*5b22QF#KKW*EzuGa?+KHwsNAN37!i=eR-d?z z9!X56VL|QDdwv*_EVZ?~!Dm@a&6Mwq@72wYQ_FYPFN0q^0zyw1Tr{E(jZYW-ebnIDi0&6SdY&u3>^ z&J+^SaEz^EY37O&ZE!&Cg6RE~n8w9c0x}M_7~#W;WD)0NJ?W-@Kam|x$>1*}ds%HK z06_10{(`%+pqLT<`?CDyH=O|Rj|LcoM#9Z~xaIQJ*i`u0SMu75GNAG3C zptxY4h6}D~pO3A7a7l}>lR69eKm?Emw1H+w<0USDWHczeosM7+D< zB|_apXP~?dWdeJwom_#MdSM5p9VL%^$P9p1x*m6HTX@n(q)(Pq>v*|FOI;P22+%@Z zleAL-ynrOW%JS8vFOCf<0hV&oMvMTK@-7N6j+1A&hvS&y3oAzU9ectvcloj0PGlw| zgp}BmFEm7MCH&>X-7TtLpKY4~OvX=dR?(G}M+hPiZ&@fnU35L$^+r;CbPTi_U`Vl(Yb`ujII z(eEBY5VN3<>*M=C6;uS=F^?a8gW#fqV^nl$DzO2KL z7{KFLbGSJF_Y1^3IfOC>5iRQa$l)0*0k(+-wv8@^ zsQqpajd=qncBRUd1w6S2Y^h%vag8dHkb)q+d2l%s6AKG3czziQQ<(#?0mVP0At(;s z|51c2jLGMPvVghaYd+XLapIdR{TCjx_r(rfc}A)I6|Q`elJRi902V(X;~KR8v^kE- z=*-2{30uKprsQr(8+|kqB_cK;IR~e0@CFGOH|*Md9a@DKt3aJqrOb#k`hmChs{_&i zB%$I5j$IU)D$@xjo;09Ix0<$}6K4tK)6O zCc05%3k(%?5h~LrXNqMYONC}gLGwVY^>TJQ(E;>@HNKiu`&e*D!LZsO`Dltl`Xdax z&=pH_b8`iU2MO+`ExL&Ny5MZJIj;dZ2e!DlxSP$N5a|7n6IFOwA`hrb5&~2-G>{id zt>3jQYIVGbYcUZpx+xhMv8IX|GgY_Q+%~6XR`>QSW3OcJ(m%pCIhc8woE`wFkhf=W zAJv=)TQI%y;=$IBDHaz}Qj4j1E-?jM4qyRUdHJr6K#t>LRRmzX$eH9IJd`^T1H%)x zi&}=VW{d^^sE!_u(s>@dKcVd=6#JBFpa8P(-t`nrm@1b)dS64@P`-;?=np3e!>H!B z*!>2ZUtA(Ocn1yRg|Hw<3a&XROq($tKApFpP36z&&rU|k7BCkpaTbe{r8)7W{56WX z+W@grjpS%<;>a5V^{6xcA((bS9Qw?63oZrP)${=YKPa=FaQNI$XI^ zN^ndqbx>U_=;`TUVgEu~sI!$0PbiH^O^wtjUC>gWx%-`Oayg7K+$WGKn!u*}HDB-3 zxism+rny(Eb#ARO&L&;14pvrO+5BeWw_jFsg2dolp-UQ%shk`|cV(^rCT}Maviq76*gT)z@GN)yOs!AjGEuU}sk6PMA8l$kqOo-IJ5sXs8HiVBkDk1rs2rC{J%Q z#+P0Y#HY4$_=Wk^bdXDKDn`uLkUlwH_UUA+UC{U;T{zs27$_B{UHK@Bx(?@ub?p$>9<{Z(tGuu!%_ z6EzG|231KK%F)NfWL=ug`_J_{wkmpY21PgITL=>heG2+sJ4J6aT=(Gs%(P9%8~hk- zX`{|o)mK?oswaWM62~()H3)tUL4RC43Ps3$kM234d@enG&UEJSy!bB6y3-$Uj1|#e zU$<*kcn&3MJ#BjN@vHYNj=6LW%=H+o@xwC?^|*rDlm=hUk>BM5TVO8#T+S;ceKFg` ztES00K}@Rm+=aX)5sGhphUNt{SbZ?4MkaTbJBcz67ddV}lgskm<@a3K=`2MHeOenb-3@N zKvMqjuN#~b+29}j!_C@ReAcC0t@6~=G95v`p^!dv;vHrP;G$NzVuEXvP!86{#(J!# zwyspuXy&XZH4KUG+kpIfbP5GBfuDxB0?gVtw~wogX7g^^R9BQ zK3wIREi{A_3P%Bf*7(m`siv1d=LMlTpS(98FtnXFvboY+%ZoLcedt8D!Ue*mX<|011 z2^iQ}5eBd@raIQ6mjjwxByPaIs`Qx>dP_P*;VtO7DTg0^+Er$kfnpsJOhE!`gU28w zcwnQ~;)vBo7S53vI!6-ef%e0Ar@s(vr-+u~-5g^sIDQI*OgrEF$;b&pfz?TWC(CbV zL&o^V{A8ra-HmqLJ$$f@Yft#o5mr=Rx({CRRepwiwEggdH3ML@5gq!S&k2vmrxx&Z z^@=oGA@AC=$;WE)MR2jcg$6PvG&+84IvrngmK!Z}gew)Y_(t6On)}Ff(X)>95!>MH zK$B2Et~5o%Ncy%AVvRKiBpm(}FCXiDdhqC9zdbB`e!y9$5wTxFSaO_NaETIQ?#o){ z$6OVi8KuBdh?FJ4B?4U$<_Ub`8f^d>3e1TKP2`*>u~efFmh2(p>?@xAsZISpMM9qWpg z_l~%~I-GfwIr0Abt(2Wd02rO|%G-@DhR-B7%z4 z2!G(H3?aRQ_7O~S)wm!F2VsPjMtNsPAi}BMo!c^W4Fofy?MWoCKnmq}Cf%2s`vMu? z`<6(j&KhoYw8VU4@VfiY9F)LHQbKpxgob#u2u!8Rjo!WEj$qKGCpus>uKQ@c*|I2X zxly>?m#Mj8URp*Y>hpMU^7{yFYhyTqL^k9O1?nQeo|zM-sopEp?(#mlnBdb^cjj}q zz{@DSn9{Ny`2qP>(ELp$491sGG$AG%5VL0#C5gpE#&jBd*`|tP7J-?icc9p7&KD{t zZe*ly9l9L1zqmC*qFjHpl-BY&Ji*BDEz4z3x5?tZUFXokf>$#;JwArWEHr>gJ|Q}D zojz#1K~Ndi9+S?-Y9qZxM>2nse2~Tv%Pxghv?EhU6+#90 z+&_t;-&YXDBs_UuC_xx1F2fsT6>bRtd*KHrwj5l$B`}$eF_b3C)AH3X9NJHpdg8$i?z&3h0oS2;z)R%Qhe~u z6pswu=~XginfW5GEs9BMz*%Iww!Qu54#_k|BryUW>F}ZUn6n-`25Uk8SD2<_`+duu zsXSu*VbXAi*zEChC{-1~)6!^6?yGmGNLF7cTuNmit%2aZ|6U(kPa^2ce!VT?cC#CW zXan(2OtT1#mATUO5(P*_PhrUS|9tcr@qFT*EZB^EQ{CF#Ik#~vYya-v;q+zRus#Yf z+iZ*U^TLN(QJ8hXIZ#9p1;J-gujFzFZPX|~Of2gdp>V)uaKe0y$~j9Vqd?8=ys~w+ z*&WBgcZ2m{n)?OGC*T%@wyv+2@{RNqs? zVD$oQe%SfIu%6>G{by5No?Nc!3Eb53X51{27_bMGY4z5OmxN%ohM62OZ~&ck|690`YeO%ttwJy z9V!h8Zrb$7%`;&1ky2q|GWM$TxqoUMB#V=h9x z&HKn7J#C4D1XSnJG;D44RlVlGK^+$X*4NtEu8)c;bxkez1Eye0ax!f`Sl1>uug=jA zVM?ce#*3z;rmXGm#_v0C6Di0e`IEqBGusSXchbsaNP~NNoVOi8*8(0CWFt$dPa)|u9swqDnG`c@&?}UmnS2yG3Ct0 zd}`UM!fqj|YFk(_%V<+XcqVgd*l+oUVAysD+hh3|R@>-1b1lq((YaOm^B=QKuF<<67*#)0o5Nq2d4b<&-N~kXaRty&dLz~ORsY8JR#7icX-+&!>GYF}@@9)4Kxoyx z@PL?^D6O{@guM^9=cOCxocw&ns^=?$)Q{jPWBUycq=V={jd0YUjPF_>TUknz(UZ?f z!21@X`FOGV`1G{1cgLnNAw5axgzR9hnuI-?Ff=2BvYE$G(*L5yVh&k3-RFxfRcg%F zuV1%s{|DChW1IXps>^>a*tus>g%U9h$RVu$DN5_t&+XGG?c$6I{yWi={w)yFfK zKuS4d%5sDqP%56ME5SWr#?- zUu<-Fv!#YK`bS5li>GZ$iuNCNRXIGj5VlNHM=9hJOZ!#X1UzV>9#1(%4C{VXh2^R- z`QPoQ;LY7dw1P#dazaVNkY|~svE%peq5C4`Z0WLnW=)p9L}pDRQ zw=a3u;7N6K%o?7SM-1h~#KXq1P(r@&yf?Y^3L#b0GdV?)71Bzu(FjUCX`{Vd zH(wcY8a~;pgq2hsvMi-Q$XGtw!HvH6J*AU#)&plYXZ?T;IW*_axIK519 zvq!?9W+_C$ZKr_6Tt~phM#T?t%g6Ni*lnhOp7m?IF!a@jr;pY_k}r)uRk;dX=D(L% zRobS+GKI*7Fr~ao=`dI*MknUA3X~`K2KD{hPdLtAqrtY$&P@~9&ng8Ds!H%mCCit={8(js zDrgUB9*ut}RQOdv4e(SBaWMwFZ3gXl*9hDrO)w>7fjhf4Pz9B5*GH7>rpw_%Jg*-a zdzC#AvJ%y^x*Dy^ahUBal~8`T85}M8gbwqX#N;8ZdR&9!;m8|=_0IQ@uJH1AG9R|y z36afXDz+WN---$%gS^scy`ZnsrH|+Z6JE_clUD7u_uJ%p^5xc^;V55}ldn_M=D374PKZ;1Ta3!u!^@js7Hl;hX= zG1bcFNbK_Dh$e_`=nqmKLg5;j%JjnFv7V<}??tn)OkN z``-Des&Y*pGnPk$r2J4;iDTj_oucCwH7^OzHDkXTo&U1B&%Q-Xx69(SH_3WYH-vL(KOc)J!-ta!`Ul^tW{KDZ z_wlpZq5^a;h>y=FIy5yY5+CJzKgYq!GFE;(q|Tx36PFvBrna4G6)ZDU?7CGy%a}2L zEf?xLc5iUdV5_J2T4#^$Y{=pzWzC9_^-2RNNG>{SYnZhfuZ7Q%e96P)K5HB{WxqS_ zaua@qD}#Q}8M!|bli-0=c~?inarCxwfqe`_doun4>CNHJpyJNYL;{JZ|MV!yV#tLD zj90voA2w(vQ&3P}%P)?GdfjVs-Hu+MJVfH%ncnq)@kvZWBTwq$XTwk9(e=aY_gjQ4 z5AU&4QuW6v3*hp`bTPJz%JBQHZY#$1`c}NI*nggfv?u*;GwIGy7&kZ1RIPuBO7_tM zLjtk+Y5=}OUjzZgJo5EmW3|0wQP?e7vgz!13>MoNtY@!;I_q2Y$*3Cz`;c!}ydZVo zs2B*ow>J9h6anbBUGsN}L{9PPuUu`)HZnfgoa|~MoRxZRuT4^K-0jvMK$o|GqsD-g zpLNB`vKD>}-4g-)$?xYOCHiYHFky|#WMmx^J(~?O)Jj?JWJ;{Q32rD4R0M;5M87}m zKOom4QM6o`@UxYn#$v{Slgfnu*VlN@e-t63Vf5F+NLU+ndrv0<+AflkQtNL&F(F+( zTOG=44V>ihn9r6?NP*Jd>mV_F4GfWg%U=@U6QhuS*Z0daC(h*QRWj{Wkz8 zHWE{34F-%otBL=qo)s5V-T5ST{7SJ_QNT8tY+W&{XxX5oE@F9B9f|*?Y~ks=6_+KF z`V(_~gNYSS27bjT*>?RGAtCazp{xZVLCU%bRQ$v~BA^o%{QM=pVY6Xcc=J$gHn*69 zdMpzv0~(gL?6wEvD>kYdea~8UzhZ3rF=rLITA&%!OLOH2iE+*01;I|y2K9vZR8oY^ zXM#_+v&wvK$3SnJFx11X)b}xl?mpA@Sgdi2+F1&m@P1?V)%sWlloH>G{B+}yJ$3M0 zu{0}+FA6A1;`JWX}6` zI5r%o$~BT7i!8Z_h0c{+n~yug2`_)4G!B0MP(h*zlAAH~@te__0TMdU>w-=Pxg8vt zpi5^@IKjzPQX2rw&CShLnhM^2x!_Eku;3cEtOegng=(0XTc)7BA;t0Fti~u;cE(>0 z2R|(Za&L=Cz86noEGZodmw5k%E!FUYlx$}OzYNMZ+CmVIz!9g0j2n*}Eiz4z%$w}N zas|0Vf_j8PL@m+1>{v|eFzCBD9j~%WVWBo_T8I`C`T$W1v3~be3xRTE*+EU><4cp& zmcWKUBnD+hqp{$+c(@HaWE)UT~)){8*3%Sa@7;HACp4I(r zkBK6}{>!lH5YewR`;%(4vLT2scUj~=N;7sg@!*7BqW?h$CxDtj^JXQJ0$8i*v6Af-h37Df@aCdq;3_Y(a5ha)hggjzrsblPr%9?>${9{4KBv zR|RL6*D&YgX7bj9z1xO9D7^%p#m}^`ca7*Y)1TwA-{U-YLDB6+c)OroTPQ;sDFE_Q z=bqHR{8ataDCi||L|Eth>J%J%0_bNC2MzkcTVNJ+iF6y67IKwdqsO zy&`_5c;FX}8RM74U*qHB_fvFAzhu3LQK1$TT=04rO^4{Uy+&LdCs8llE}JPbb*5DN z;K;UaIJ3gAvRMy0vfx^hrIMpkIG$(Iggy04OJ{3NlzT?8|04^qptrs3V~!1ugRYx1 z#*iIX*R+A183QQbttSNL{9tbAlgc_1WgV@4xw{77qFb=6+)YQH?$;e?Hb+lzQlIAf z&i~_ACe%AIJMcjk5Q5V-eta={i@>eaJJ{$TdZ1~^{V!iVXV=gNRyQ`nXKDJ7*(lA5 zlwLB6Z3|khFm}aBFw?~T75cKqgB_W>s2_c5;nF;`#D9B0t8tJ?ziV?)Ms7VLmn93ZvU*o+*y$7*gr$tdL_KTh`3L! zR9e(NszuZKII5OtrEa7pibsrqymNtVg zER-Tr>)Wc>tRzT$nov3jNY=Llh}l?tuFC6AkMS12CF2y1CEs)ZU1Zlm-NUHdpuC5o z<@0tYMf-4Q-V*1NfHNvhaFCJ3lg9N%J-QCFJ*ce3XyIGV>!hw8U0C2j(XjVhImT<<9wMN^{*sUD<1%`*=o!;u(M$yoi|Ruk zhSBhN8t8k_jMbLtCS6~*XrBB|LsMd85}JOZLnS$b3c|cTyoPGNwI;BrQO|gRd=J9W ziU|l!!+thhSiTS@G;b~!{X0W#D^^mkLgp5zYi98*c@%%ur!CRpQeJ>b3aGFqT+GiC zyLS(@;-$-h&12l<1s7 z`8=4VOI^{?-NWb`(Ol2ipxUhfKzn15@A%Kxu5KRttADI-)J(HGls;vWCiuKUdU|~D zz4q8%(W*K^Y+a}$Uf^YUmd#x{mT`z?FPw-w(>;hFQDlC)N$xnB2(gx2>kDGOZPJ(M zIW=C5T_J3&xTr_j?Zsa{YSXsOLwAh4d%eP#==bF@uZp`ECfY^C9+J_Z0fPutW63gp zAmZ=cM_0B2>+_V}&6&xh=KLzY_z>zWJ+$BFc?(9SiYmbK9{QzsDU0Y&KeCYd!G=Qb z7D5UbO{DO?v^rh-x)4tAZ9KOyV1HNBVKsQ<`n>DpdV9vO`gm!dOw-vJ!=8;HZCGL|l$$6`f7!{N7Pc7_`>9f+`GPJBOl*T#6VPZavu zuAtJSiWtU|@q6{WpA*5mmdtc78$TU57I)o9cKYIzUP`=X%V#L&31(ov1|m-0)UY24 zJX2)w78eJbL+esK2((*4?D%XxE%2~(t=Hzk9nz%v;DPSe%a7BE7E753qxTM^6mQ+g zQ8W)L5C@U-HX6R@KSWau^C9_2x7u>MCJya>q{=Z2#;q8t=-OF}-d`0?E2E(}hplhE>h( zI8G$Q4hBH<^?;QYoTjanBU7T+QO4I0I^BAQdV#I{R61>dJ7 zIlyEd3dgvg!567twg1s}_Y^(Dysp)=w)xol;#V$L8uIy7G3F2@78cZ7zQUB7yD`H` zqbXJ_@D> zeccdca%f3pOX-3zpqq?mivvLR1Y%?z@+(^dUOddK*#UZ>LA@La=x=Z*8&!X&no^#h z-;te{*ccI8jp9PC@Oi=rMErdm?!&Qe&i67qzi67;Hve9B4Cd`esmxW z|Iii%J~s|iW3D}3>nI%2r;tOE1moMjeUA6n-6k#hVboL{o5yqAXNT76ZS{tf;xmH78FcJqS`7BSEZc3S(NUP*FJN^r?i_TucLC& zD4GfbrL-!LQ}tfeizkv}T{~ReV%O?^c@?R`O*_7lI6#l3&Ifk5l5`+c7ktfY7Z-fX z>C?)cG?&!Zl~QywiIU<;~YUZq>UVAQ;yAZMe}Q zCnl{|485u12aksh<3|Edjt}e5 z7PURP!gGy9%=55U?L772F(GKqP}YzDHg5|g-Z=)7Jzp@Pagim?5O1a@AuFTSFP z9)_s*6>EamJ^JHqTQ=hUdf-mEXb;F!-CP${L);3`;m?brA+9CdGZ(iNN+pKe7&tN) zGApA7F9}N^xy-&nO%nypIEmk@N^2}h`5TzYZ8yXGGtn|ZKj-dY6Yx9oP7BD_Bttz| z0!+VLN=D111!SpE?LTu<9=kataLhl40T6Arqo6Qmx)SUX@R{pC7uBsKHvi_r6w2uWXKLnC#@8Lf)9*K}psDEA;LLq)y%{jU{z+#0=;3(MX(MdPMf;md z4pQbpA<61S>F?dLSwS#ysJq6QqLxEkTe85<0h0b!ZElQcNg+Gs8~35MzKx|%Zcg(m zHBG{%0<0IuKaG+Xq zqvd8r2hYi!KB$B(_rRS;WV2akf|v14!0B(hIXD9+kS@=K*Ar+xPCT-&Pdqky;_*Th z2b>oLtzUWsqm8P%2KHj$&+{0`XNvlBu+XoBFsJ`fm-@;H{mG~LkPHdy zYiVV0tlZKVf(uPe3j+91FrfTng6|ULT6oJ0yE@YAOvdHy#FYzIK@&`;2Cc)Nf(Pbh zDI?K5gulk(PN}d)lN<@L6!X^*rTX?`r0A2@gsYN!4x)o3vbx=K>QNhvqA8@aOf@}c z-k{refBUX}-cI|Rm`K1QZ5NoeIMTtO=!M{UdC)sVBTfC{1!8$5mvDH4S(hcix3=MQ zmDG#Rs!O%^du*IF2j|tR(Q)8hE|QR=fD^x*ANGp4R$dJfFTV}iVlOWu^QnS9 zQf)^h&p4G1?Y!?fFqd!CY&3p+%45N+2#SiOj$j7;n?$E?p&KXl9Y2b|8KMn_gw8e& z^zbSxgU2gP82~XI9b$Cy2!F#=0l*K8dKno;e9YXBFP<^l_&G)Rc*=};c!mgk$Dsti z|G(zk&aSkkx#pR6Cd?_P+0w%e(Y=Gmea4{trZ_W-JtqS&p()rGU=;228Krev@fr+h zR;ggAH?T*Y|NMvq<%%>1*@wCcpS4-+mI1G3r#>E7*8|wAy}a~`uq?6SDGBhM`)YI7 zvUc7}!O47u8z>^(hBP0!nRn7Y`)u4+(~?R`IFjeS&2?JVHSqF+a?*toM3 z$#*+6cI`DMXVt~V9T=?Gy-JO*Vc4_}!JheDyS=e9e|7?0Zg)+^G2<}nw}wdaa?$HR z`8UdMkw^L!Pf@K3#+9@9&zMy|l-WfENYb%Yc-zfGz%Uv$_0K>gb9Cc1EH~F*u-$!q znRZ%jdShnzef`R&n52snUL_hd58u+fB{$MzaOJWC|dSIlqf z5EHLm8*x*FcVxtPca9BAoPkdXX}jg0W=?@}_LnJV!gG)JW@eiL`4bkDL1L3xaI-B| z3|s74uyzy_-~n-9{LgnSNi}MTok(fD)&%_vPN=w>R|;VNUYY#0biQ5jDWq{xjWu47 zWP$ebXLij}06-)^|t-wt|~s0*o3^F_=z9bGB`FRT@n+EMS` zDv>?9AdavW!z*;UL5=4avA;)*^rJUH7&-QnO;0eu#N{K>Ant}Fcr%>=M7(em_S z{9w`VskUJVZPGE{|A%Or^!#XDLj6MuA{=B>`^CHI@<Yy*`#{EraGfkGhlQHa%yCVZy>C#?|s=s$zL7Z zMETzIo?(*sox{qH*RO>0t@Mb}zY7V1`qb~|=^PIa3g+7V2Erz;vsLCL`rAqe!e9L( zMd>?!>jq=wM~TI59iD)M|N8OzT}0Y3QoxT|Zi?vC=7RR0)O}ulEex+Jyt*9jA>}L2 zAu9YH``xzpU>H;q3|X#j+vz+oGOkf@ftawi<$hJU>-YMVDHkCNn=ac4zdm)55hyUc z|NJ}usU2lZ7=@jk-8y0!UaIk~Y2i;O#AqyS$<4i678VX}t@bMoa!Eeu(udrhbACeE z4T^|}5SqE_=>~UF6Y#uimj{7+?=8Fc?-wNxzM8rZCP7m@?i6F@ADDh2Lf1`Vwa`W z-Rv&^mI*)1*;WUB5xt)%!0}oQRznPFG;wY7vmb0Rek~4&UEz;@7qJu8VEOR{Br`9~ z2hgoV0!{+4hrpM(}Uw@bq62d<5abptVgv!vr0~15l1YX|W z;plsp^HI-fw%T*=doLqii3Lw1vGQ9?OhosFw%q!y=dkQEm6%EML_8D>UT>Ag(9+jb zV2HX88IDK}ar;0EWVp^^KC2Vvk3z;wl(1i-Qgn>Jz2jt@3KKiL4vNeEo8QuT%ZGwR zk^YMdB&eVflW|(C2~i>y^}$VK(}xDE=SU+fD(nSi%=U;>8Q~2@XTtI0?G_3NKvLZU zic@ZZ&VEp2#v|2B~GX`aX}w)Wzd@;dkLPn6pZS?daSg4K0e4f0OZRcJM*^ z;&DzCQaiN0p7?qt6B7GXgBJqQ=|CC=qr+2vS-EQj;z)e>z~#MLFw&W=VPjab>@vS6 zK&n(U5mM?5bN}UU+159s&ZOv|oVZ5#>=QVsj`y))xcKD$t_<(Qyu3(3DShZd?}I}G zDK~sa2iZuUr880@6n3Y@OQx{g0eT~k%hTC4$XEMI#Yy%xB{!F8R!LtnI1r11^CwWQ zv^V$Zn*$XcRNArt`2WvwfB0k>S&Pcm?~WRLgwggjM_yn5E*HyH**I8v3id!tj(-8V z_5XYAf||-(J_xu_H}@IE90p-dff+FVFaH*jk+vl=br!a@wLLyRXNvzG)Q;Ao9Pe@D zQ7VuSC;Cs&szSWBp-BM7K{9t?4ofXPcke^BS}mA>4CB~@?=5bEDJeyrpeP6PC8Fop zpG+w`f%i5@H298U#}9nE;d{;w&S30);bdT#L+f^cmQS!LLtF{vIhio3u3s8fD})VV zjyP>gsg-Yn;KnZ15yTk`?rD-AgYq%Q@%4Y~lwo`rmG3| zRLgw17WC0E2KV$S2iAVfq5vrCrK8>E-Ev(Yshqz0p#5%j=Gtmj?-EVb`2Im&gwx|R z2g!Z3bOkd~!1>c`qp9F>vPh3ttChK`NR>^WYk@XrUrb|Mp+rXsSgBOX1~o=Ln|a`heU-i<;kVm|6o91 z3`0?J33scv{f&(gkbV7WXz9@yex^e^s?A~{4Y~@X*T@OBzC8gJN z%4qA$yW(a|A+CKwgwlFw)CiGio> z!TlQWk1#fkTU@Fr!i)&yNq34$nLA0zOQl`x(Kfwvi-a--O`^3RuLM!1VyWg@9ahV! zqR%?DmK|MPFp8oVuvxrz!A-%z>W9j7-%RN}jC%r{sW+6etmD1W)-VeYK9+p)T{*-2 zPYiuJdcX|xC_u4~&j*4lqxe&Val5iPih9|ZPjT3XM`RlHebmb;(Dk-UpiTV5v6dr& z=SqKjm}40k+4Y>aQv)RhC=mPAZ>MVS0gh(wb>L{bsT!Lo^>m#qQYT?#9Jqe}*mrz- zDQ&dmp;0dr?}sTfDIprdIRRGuOsLHV;Q;sh*UjVviC&!+Tx?LQCL(qlQq5y2H#o^W zWip^ZQKacA6OPY%vUOdbIT2?Mu`U{i=Es%C)|Mj3LJnUM<*xt-AGDZJ21N7Zgt4uc zod41nI6dH|^(#(iH%x-e2T!xD3p-8g?FVqfoflv5;(QIf8(4;lc|e2{ofm|swo<t)$p5jm@!NR6<_ce?%EnEByVJq9dxs&3tijy{?H{kBqsP)P zjN)2MGhgxgKA^s{p6Ce~WB^OvV0XNnLD9(bH2E#a*2t~D=aS=a7_=z^9TM#W%O^25 zZ$jT9kiDJvL?v$S^k}Vo1!5Mg1Nwqk=;ERpK4Ox{M?QM6i1;}_qpv{l~TVF7qp$7k7 zf*l6v7lSXT`?~+d8YQ8RB*dSi&({8C*TWyy{w6+%o|%iBT!UD~#avL_*br z3wA$OKz$`V|FwYMbFxrLXl+nWDBmiAYJ+DEw1dS7&xVT7<8ZNku|e0bdTzx*X^8d&J98i5am_-6&5)!@yBABjf=A#1{Ag-DvaB@{pbep9i#OH_3^d^S_ z5FK3ghd=&ak(r6HZQPr&tObC2P~v>*267DL`%>mOkumm;P%r6EW=_g;A-T@>io<#h zb6zDXD-ZdZ&cSKl@8%R12Z!6sMwm~whN9P#h0WKLyEs>V;(I#-kw0oWcUOFScL+RI z9}xmijFQWwdSl{_F+TZ6f+BC_%_3->zT`V41FcgQZ)VW_=>Vj1nWlxojZqLBfmJG6 zZT4V=%zKgLMpKdiL6-ne=imMHSuencutfkAOj({)N@sJd6c0Lxn7acOGp#Tlmj`f$ zhK57XO~Qdo?~*wte_drE!p$=&Y$eLYU%5^&DU9yiy{Ca17KrQve_ zXM{UGy0$wvD4aS1|3krNPQvq-#HbAkE^tEx3jX26B*a`k72}>&piMah7FRK!(a*c= z>AxpQ{rQ>7@f^WoHiwP}qA1?|yWFH>FkNXWn zvY~ONn}Jgr1^@$^4URX^mxpsf@e^&v$H$?$C)1%J1#$MEZXx&IWW`UO4whWKaGf9f zPOe;Ce($7OOCX2jhlHpoNW!VH%!(hhbh>8+hi&49x-O@-q(2CaJy!c6@6Cxzsi}!c zO{&ULMK1q#*}l7@L4ud1G~=yKZcdAqA#YG^J)1jda36F1(CTzo>br6)z{;v0{j^`0 zm!JiK8D!sX&Bl80)xGc4O`pc$7GqaFjvrSXvBqhd$%2=#!DdbGT={A9jYW z{sLF+1>t0Ov90UT{c?+XS7-M)1Db)FeBp6(oGdaLVWnEKYsyA7ABPc7=Q zMVhbMM2}^cZe|y1M@jhHBva2UomNySEXN*StHq_4E>zQ7NKH7t`+0ffQEr&1-g9$n z+o6~0Y`ytgKz~ME&nrN#&bmmiov@Q0kYt2r7>D(Q2#dXW^X7K-;fiZFav;(+|8+3> z-bA)JA@lF~jQu}y#Dt^LB-H%estl3G*c*`~7ex;u3GkLW4H6`ziEw#wiT)6nO>X%1t(^y6z*G(^iv&=MXseyI@ zkIlmVc(%fn*~~KDKs{)J!_d6poZfm*WGdwO-q5LfdReH>Nm|2nCf$B64o;+P)OTlD z5dTYMiAOTnzS*RQNV&z=WsxunZQEgKZC8g69(zzzv9pRUql3#rRc-7;`vQO)yI_5W zPri<2|69e6i&A%`sizi>&BAmX$b7q;9Es) z)qRNr20`Y~auBdo$KP=KZM_5^OLD>>VtKE+M%{HB7HoAm@AYqXbk|HHt5-I`<0s>M?i8Ra7OQ&L> zge)Zu(z$dj4GPlDN~1_F-OWGvednC-`p)^!^`GlMTnPB?yfgF8JTvp$_Y*G`x%MeS z%igGmQJ`t7&V5K=;q#Y7Zowf`V@}_;@j7SHO;NGK^+Tiu!XZqacjBSi3mug?N$a*v zVXd26Yj_a08{%dY9sS){Yvr za8?<8dEfl}{2n4}5CV}Cnxg|IhM&jhR?pAc0)*QtDfDM9Uhd^+Lm>U7{jI^pUA??^ z!>r7)^TPJh5D4WIaUyZPMa`9zE|3ACmR`}Q%!PFET`iD|Szdh377nTGSsPZeFBPG+ zFI!=a0&a3{YRyBYd}I)a2k1+24*W3v{p)Hr2n5E6&lztQ+sY(zyOkXe(*KQ8e1L6_ z@jNGuhVL3Afa+~iFvqoyivoelv;Cpa@}hfd!nRtcI+5XdIuoZ~mBAkL$~ z9gN!9)!zlLGu7gjxk6g6LF7o~DL6saA(l@~*C3F9k1US(K&|*j4AK%oKHkUwU;OCL zKnxh;k)Ivhr!BCPllY;K@?Pbnm5KKeqa(+}R%Q)3xQM<&25C@h>WHHSpV%NKeu(a- zC=NCaD;vn3)mJSA_LbtT9TNzM@p%F}%k;j+SdNs46ce_+QPL<>lofMM$-X;n`$0oGsGQYc_y5 zYJ}y6I35I8HaS^6vobhC2eRH5V5L~U+)YEl*xG&*_FIp6zDwyEKdVaV{ptpJ4Yl;@ z92o;~x^#2bOGej)>Gk2F$4RrP3wec^sUL31r61jX)CDVZI#~{}Az~gi&&p@dxBMn6Ycr^N1&D#4k2mBfC|{u zSLBf<5v8i&kk-MM5qwYq#bpI6Nz>K*R+o1sgzPp^qT$wDmpAoVJ*mZdW-q#dbH9Vq$C)HNypd{P@vYSfT4-L8>Yq-&E{5=f0}K^dje70ki4z^Y9sbW1 z=GZ3&a4=9E3?JW$Y^>(p4*OoDodFsSZoV9GR16>Q`tspaO8%QHv==5~)MAlpcuzd# z3f54f#*?JL6pUTY4fQQNN_JFam5{N^34GLU?Vl>Q|>c` z6ZW;LevKxGiAwE8zcXQr&f5&G{f}Yg)*AKWK+T{UfQv8oe$A8(r$q}5p5Q{t>xJk0 z=XR%u`0bMXhpuJg{wDiYn2xM4j27PK#(Fl=XUHE`yErk%-OTqf*P6wWRw%D}C)2>+lnd367u{W2Hke2`H9MedR%c4<{tn*)``Nc&X$VD>( zyx)<>%h~XeJZ&;t0!X~pcl<>mv6(!@?B^rD7n6$=8;Yxv+`U?^YP=rEVZNu zDSg?BjGpr83Za@0X`3L*3T2(1V!WL5g z)&8rHpr`Wqi_{Jc`3-Nc+8#V6aIaZ4ZuLh8RU(8pLaVCO3{JPxBsVhM4c-=Z z)SA5G-18e%eTzY^j9$nx1mnI@v_4e}U+Pbj>K1ET3M69eZ>5kekUjlPfmzNk)HOXNA64IJ9PO+-_2Nw#E=nSo-Z4Kr zFzH(=`jd0YY2ggBeiF+5Q9)YvgXz7D5{@ z*8fC}fLVlFayIbayNp3d2qORND=mjoCWK6)a&Z zPHkVk*$P7s+aRfU_LyZ3G6u<)>5Abxz@~Ni{MwNms)Jdo33MZ)jNYqhTXXF=Ag#l+ zR*CnZ@xnGJa@kYIP+B2{+O^6Ag>c3~FfQ*-3Lya*#N?-b^K%FAh1QF~TUd)+YyHZb zsiMTQSm&zC0@8|mxNsw8TOyszM zC53AupqMn(Z=6BrYGvE54Cj*NF+u29Uk46t9l5qx#4ZJO@#VV2HP$t(QQj4+-`*8P zQ%KL5GkCRi+{i`4EG=i(GF3i%OZgpGnc309{ZEqgafpJK8o>$<@} z$_g{&1$~KQw}H7hPy@ZIgylFRO>ZDuz3)%=uACyg;)P&BeGw6)#dLRR0D#U9SfD2d zmSuJCMx~Xm@BG22L3o?e!)5Zoi7u@BJ0;d@br8qnyE^a#r z7o;HB=JOlL3(lt!zSm-8KQJ=&Uc4ybZUCCV2?!KFfi@WZE(WBzq&y1|$TY^j_>Ut} zrM?IpVDhq9r0fpny)9ucjTQ_h`46&y8wa{*Tuctur)0M6#G;e@l5jnPpWO(?+^`6 z^-5^kVZUC-zSH%T^jO3ERP&hQPG2G8hW02ABMQ*B_o+AEswLY+P9Dx;6;?Q*qh3ZD zI7>FDj=hg#M@Qt^t0zEtp7;~xbvZ z#$vE2Prh6j12NZ4zn7ZaJn-Y(6*N+z}L+2y=l)-ufp20iMYki_?37hp|{m}kP z_4xr%AB^Ai*alsy!#4$jRHBpKshV}?#6NaC*PUV87?pDQ6V>7Wz;<;%L?C_Ts|-S4 zt-;GG!*WCvKndniN^xy;a!*9t*N72*KUvpeHr0C%2xGRFzGjyg}X$wuuV8REkS*}8uSr5fCFZwHh2k^;Pw5omp zL(q>To3$7+12v1TP}EVu`&R)~VVcV}ZCH%C!PLoXrLc%&3pxZJ!tj?JNqdB0)tDG5 z1VWdpeYLmfPQ!Dv?iypPhDqC3o33pVs{=LC?tP%abr^*vU!e0<4IY^ImmF3VkClBM zU^ipfTeEnnbFW^seZ;`UD9JM_oq&jrot*~3S8|NS6;YkmnJMiZW#D?ZxTMGK3mC&1 zT2{_4T(s-5oX4o`w{X3SPbB9bD$-Xf`Fo>CW$_>%Eei!5i^51PvZKEyn5BKtLKReq z9jK|ttsxmi>P4_4L6JUQ+o4|;E?!yWJE!+?PI&~T*L*HG-{1Ixx|y+$c+eN?U;llj zLZV1CR;iuwuk~QAjL~k@EV*=4+81G*mhR_RoywE!Az#Tw8b$Xqu12@ zrZHe^fI~(TkqJw>=CC%Z=Mn3usf0{8Nu;obN_`&)Xiykc4&Ksya$4CHr5$u}2A1nj z>ybdMPt*OhYo=vc=vY19nqRglQ=wGnb|WQ8tY+nV!nJH`qg~c5;wf2^OylEoN1cTg z8-DF~|62DaEBJe|WS|6d{h8A9`?f{e4ZtRIqkn}U`z5*`z#XaD;~%H!hPYybjc#nM z>)PNjCs}9#!k8zhhn2!{w^cL$kBCma7Y*4Ge0Sx8&dh~vG$nu1!v>678`AF#nyb!I{e^6Z$H>vze2kQ3uqiw)brNOm(~mN@bh!bo3rC3GaW2G(K z#bT?H>U--9Kgqpo!8Wh)UTbBKGWeC!WsQYb0&jt9H~xY7{{oow%(d5%*K!C_06!wd z?AVqyW=tJ0POHe|38WtE#!a+ujca(!b8o+ zo}SO*ut;!0UW&WyYttBw0_mKOlUY3fv296w-Tb4o0QN&HoR zG1$KFm@ze@=2Au8bt3VbOK0vrax~J4AnFyA3o!MV0DQ^BSbwmXQc}(p0fXlj5^a3xv0Bl-TA1Sp#o?+Gw^4qG4)kuQAaY6aWC6PW@cb#v5y~>@%Zi4F?8ek zu{o4Z($%`ODjM(Oon656xaCROjk-%h?85(dh^POHt_t{yt@l1~3zVB(mt&@U4uwjT zl&rCFayBv%6UJCsTDs*)NK+D@a#0f3jqWN3j$S^)N2E;S%tfXEhq0z9&G=_-ZthzC z>uZplCjhK}$Gmt*^Qb&Ebym>q`B*R2bwYgFj*gC_dau24U(U}{50-yMMMcfE7;yA^ zU7~schxyLvXM6g5_wJ?rqH&4EVUDEq?aBl!zhx+T@2!lmKe~foNDpMY-xl~i#ZpmG zO&h&no-D`!RLq$dW%iku5fJ$DJ{nXSR)85w88g;BO@c@`N~MXuBLAc|NZ-4xt5L0y0vfc zky#G_P9{LdY$!_=557iLgv-LZ10WdGRalY0qEFpF=mcgh^~e4D_m^tRj({#ZhC;au z`tR-!m6nxZp~?tnCpqqat^e;3g}-t^`aU8$K?X==dpa+Ww(W(~$8Yx^w$+&xj?6Z{ z%{G9C7muFv*nGkM!29U;Pf8x#CYj>NZGm}z%NWe_e_Mo`UUjm8ye0$#S*!&>qECIE z*pQNPlzBmgEWcs(CNf-wfRgp{X^pmze5_Q)_4b_2M&OVfYQSZ_ifuSv$xjIpKr25G zYO6aQ(KR{yi&TZYCK4kPX$D+=uh6K(IGuYAwgMvOqE~0#a7=Mm(spU{X{@IaX~2?2 zAr+0;0*5=o#Y9I(=S$O=(k=c3K_kJ0&bMie-`S7FJi)RQ{&4>Gy{8d=08M|duBlk8 zROBZehj`!ROnt>0;`F9}=5nC?8kGc!t01p=V!S&%0=FuC=%e^+f5YD1X$8hEOViTdj?$RmNFt0x}5PODAt> zUnJK~?M9%ypk4}^`oHoC0*C=OC$~e(Y~v3V%M)}}`_)k@t91N)PzH5%^sArcNTd2{ z@zsAOEr@W63L8SlLeB>}*nz^VnjfusOWa~hVzWuk*kFCh3JGEWeT-N9mQlu5&zqZ` zp|3quDQjUobO9Y_UcL^Mfwn8Huq|(W)FFYG0?I64!Rgb3);}KF)4My$BfCjSIx{TG zSD@1D47r^{%k(eDq(~qFZ^26LnR^YbL51aS?Nnz-zx34gGRpH7>WdXt7~IKw#7hAY zXx%^p=A2}eYnd5(kiY%XtHMtE>Oe5c5?iv4MN#E#kE^n(WfOdS45Uu(uaV*22K|KU zh4COis!e&NByx{Q*W#BU^KwG5E)nF$WzT-rDn|!yy@f5T6?NA3>E@JX4_UWQ_kPIB zqWEMO455_xpUlbs%XIzEK02!BgIHg?#2Qbw(n?Tkb2R6TPYCs*RpQS&5l$&0qS5n! zE&Pvn1YkMF&^Mq(+AjoEeCHcz`De_O>xzgXeozzl%U@y|d!J1>>s}-qyuOH-cMOWv znLJoQoOhstmy+B3LY0J2Y}{fp)qnqXxIIiOvzUvL?3a(0mW%d}3bb_mQ4N1fr0B)E zinUfa%i9+#e?_R4+F{3p=9a^~&iEZMLvkV#f9u3RMRAre{v&*%e=`a;t3#=M$2s9jO;o6?52p+90$n(X z6PR7`A^on8l=H~<$P(JVY7nA+S%lDPhg)P_>be^t!v#Ne2_bS_PiG6B5qOI#(wQkJ zlrwvT_0xJf`Q@@KAwj-rrP-)sH}TLgj3e-3^ozCM{Z4lG0$)xAG#ywRY;@1{eBpaU z7-PdI`VvqybIBx$mu{JGhOyG#YWov#m8Sf|fQ$bgH6yRp#tyEuO*F8J zHaML)4XmY4aw$(=PYNBiFZXiA2g9! zftRc31FkAT)cGDJ-(-jT!sB92GlhI+X28J3{q%FZ0ngbPmoE3H9>60@8?nc`J?c6V z?{w}wwo#HzkDaN)Y{sPW=-)Ek{Hz;lZ9W6DI_B3Sr6~p6u8I#DYH1@4we-H2pDR=R4-U4X))jP9 z=7*B{-tVsQ>zthRT6d1goE@coiMjJ~eS$N@)ph3cy{Ro8DN$IAj<2$>zVYw-EgbPJ zG(w1rbM`o6?7*Z>VPw&T)r&Tz1LI{Z0Bgf(i1|8=x1j)Q`|fDXGj-pA7mC`)h}y;Y z>DyZrmOGX0j@-UjWj0p#I$uo2=~@DD0(kkzvx_oG zbESE|(fkh@XhsE>Mr3r<3(qe?W|iF7=xtq?Z{x7-lCi?It-b0YwU9UxyCpfG zH#(lssF(N`Nt>)!Z|rrbt=reIwt^~=u`v2GG;;86xV}uIxs&1Im76_(l5=&s@l@!O zqT#~GC?h@Z314s8Q0edg#J0)XRa80TqOhlQTdAJA+>)u=9of7kBYhE;|MWeLFQ#8x z-_rtJKd0m`ITexT*7}_=-Qq~cNRsBrcYK^1BQzyRTL^1ha|V;=<#xpD7^54s$BU&6($ObTUh>@ZLnW?3qYy7!JIz>I+D@{H8Il68^6?N_$%>QSD;BcEL|Fc?79o+Y? zU)cHiOC?mfsftDTUlT?On~`G#cKKJ)_Dt_usA#MmJx5h|DozxZ={n<1qq= z2x=0jOM??~e;^EOC9rrCT0${IM8nC*O1FSa1+>7h(tEM<%=L_8x&3ZFSldxiFC@O} zrW(wjV@%72r7E0Zuj_WV@bmF%wWpQXpx)**WXo2&16V?}a-YJ64`p=HNjd0IMp5=$ zU;5?hw+u#-)AxH#JP`}B$s}BVm1oXh?+qsu@iA;@)rt1+KV4w_#QQ9E20m$X;3;v6_*m&MN$AV=w+z19qk^H`9;U5nDDvn{konXmr{+{ zzMgU})H86&$iR#8PmHfGznNn|u348mCyn^>>r6i+EO#aBr6W%Ib*IHL^NOrK?;+RA z#Z&i%8ZWEqF!vM_H^nvFOTtW9+1-gcu;%vKI4i=5gaAQQCWCm@EGK=Zpq$QsD$ER7 zIKeixXSjBUcfRcBcc`-cFFn7-4MsUnCZ7EOj4x`Hqs`z*boNWDIUa{ zPAzwXFdO^$vIby&u9aH?=V`*f^R$eSIH{1r^cEyw^Pc1At+cW|W;>AM+L*BSDzj^) zPmn4E(h}Y@CRZ<{SypMs$F+?i4`RA3{*&2Jw53fo;nOHW?;r<@1P3*!QJy@oEW+5^ zY?L+8*n#%n6)J*8vB#H(vPBn(5a4}PXa9p?*vDK4w4cQvYZb@M@m@%9t?9EBm%)$lRAiZg$ed078c>$d%bmaU!RY=17 z01mGsMlI)Ub1CuLOmy61GGV_j^5er~UhM>cEPsM(sIb#BDt7m4y`BqGVP(>M-24BB zYS+_W+u=7w!x=tV4U)^Kgdd-N_+DiaH+8Op#s#}YXAksfn$$S7bsc;KE!uyB?Gf$#_tWF!Ks%Q#ih2)Mlcg%b$(mPLb%fq>l=wQpKfo#*D+< zpQ-u7D70+ko&%6%eH&ib(ZOA9Qkwm)76EF55|S6Rl_O@3xZu40ZwG8QGwwk`QL$Cu z!Yg3xV+mC$Rw1>^qx< zkhx6A4c`OpMD6Y-H!64LA^s`MX5D-Q*%dL0hAer{_M18%@H;$Xf;NhlJpb2sNDcv! zj+}?%88N_!|Lbl(G?%U_f5EI#l{S~b6LdwG_xWhe6xMcc#1!q^R;R-c_yyGb{`)pI z(lHBv@3=;GGbQwQ|HNGFtsI?x{woN};`?e|=-evrYAg{<7>u=oK${+XZC=9joe^6S zV{c_)h1iZcmHgYEjCyfILxWyCh$ppj-OP^moRq}ZBZN&fjZIBW9iV9|o`81Yr!iAA z*gk7%;WZFl1B?#UYDO-2cg?$W{JAig>nhiz++$o{ijT9|vBb-7Hm$r1DgVnIA|M)qz}NVk z@P4I|OG3gE$J9SOJY3ZF75H*ADi5Zno%E?IDJkWhN4(@&My+6h-C5$B7ob>ZMPdud z6ST{`l`w)d*MV6ok$HLc`}gl3;PGSy*-pLsk z?{hnrQqFx*&4kaPPFCEnx zPSoi^PQkKOG)+x^KNB&gV&~+PH4mxbDA*wUSPVERUI_`nao;*90ir*2)%4atf&az% zJRq4kqd)8>13^#At=aMmWfJ`UGN@3T`D%ZwJ`om~BGeYLGFoVmYCHH$CS_yG^4D%N z%FQj0@uM;=EiHV$jp3e+{!=Ww9Sap;nd}7Yf0Upa9J-Hnj(dN7n$y(Oto+Z#g8LE` zRo;x8T6S`Bq6S6pniq!l_4Qp83m|CCk^zmDpXU#XFN{8E@31Ac*A>K2aI&|BmMF|=aqKS4xnMMMtiM>oRWq~cK-j^!utHNtkMPq`Z3Q@n@eD5PlZ}G?DX|^)zmsf>$4}e=oRPDwr_uj0~gcLxo@RJhtBh zwIf((e#ga4k+SMjQ}z%iN@*Axp4JFhMrLTeX`a;zMYO|eIb>!1J@@)P-Qli0LV=O@ z7i}}-T>kRs&!3HWJ<-{kO9Q8%PP=m6-nd0@aqzFv0D}CzqH7EtdI{ER)i&1DAp&zx z(_SpDJ$?ODJnU9%TwI)<3(U>UEsiZAG0`VKLx`Q>1`|_CB=}(I;AD-z@l><2OjNe3 z40?xNSVzIv+(<@IK511|^TQ!(Iq8;YV%8eDy;y8}pT72}z6;fd(z;x7YfRmqW^FZU z+31#7GVd5e!v`a->dNxgUDZ3#xdk5b(4B7zsTv`-qDBU*$>Rkc^+W}wL*I1r{aswV zm>d=@sOXE0MkFu+ezKx=X2Zl-N5>5@lEIW0%f-!2YQve*W92EzRo(1|$ncBiJW|zC zA!K=N=1E^OngjpikR*re8n^NFtc_5}+q?Euj%Unp0Hp2Ks>-Mk6lwTW7_AfQwjWD) zt9Ox}PM}@K_%Y37DtpTOSo3ez*kmqWoT(47D8cHV4d$Qre=}mfmXp|`L+-^GG4krZW!?w36=Ap z*}JAFMA)lmZX}yMa03o7@UnRElh3!aPUNdqq?P|J-0^F0J=zYubkVYY)WY#X3g0Tq zv2bbzIB9|Nm2Z3x_=Q4B-Zs%{+bK$5q@_471kl`okt3$Yx7uCinM;gFGI%(Hdjd+e z1UAt|+ZmXZJGj~ZKE5>Jdl>;!hMZP;XYDYNU2w`5P_!_(ho^d>v%@r35%tf7GS9?- zyAdc3=d-1&t1Xd&LIe&U5N4pdo*eCc$K$7!qmReyUkcgTcd>Pp^Z|EQQ4wZfmhkun z?4dNnV=yTRDSrPf>^pFW@a;e$H`gdQd0#Kr&wUK=Kn{2h>?k+W328GAY^zpof&qd+ za`?gE2{^MO3>$Lk=Kuu~@b&R*$Q_+K&Z@?iUdoF93Rx55TU~#s87y)vD#ZF_`Jb(W z?AdIHn*#k)1*Uy9b=p5jF3@D?zykuSeydM)MW)^gu&TM2wY^IG`%o2$$|G)Iw|;b{C{%I&d*w%#INlkOcxm)c?;ZCuOE^FUjkVE^+bVJp-xC&ON9sS>A>Ro zRdF^%bhIFrEIBD6Za)T_30e*UM)tg4H*qeCd+X6um0Ek?nlU_DjO-a}yLd|NWB-lm zdaoOzfmBP)6Gek1t+mU?vdPTwwIbb|R$gpUx<2~RjkZp|GSf3U)!OZsNn&oPmUWxz z&_OAON9mu{7{7J(GNuipdO~g8&#g9AD6Fmn!rwGk=mg8;di-_9W~dFeUO`A1O`NE~ zBF%dgAmi&r=Qk=R46bQ_RfEVa{&eyL5No-X4T4`kwS;(+$iFn4YjNZ#E;4 z)4u|b?RpEms-)-M`P*7JHLQF5uxP15~O=%s7@1A$z`TO2Pp??9oL zaRztxxmMWRQY3}((6ZuML#uPyjPElmh6x88u7jGf=;?ki_OgNMw_ZyQ*pyn4P0RJl zScMSAeE(@bBVC+$Sn=8{Vo5c4SyMv#pH)_+2Kb?RQ$(=sPaQG{VOc+iSBcji$UCVsFC*+kFOHikhJ>ZC{V z7bja)-0v2Odhf!%>?h9oG zv7X>3=9QrZrO#;ty~s(DuJGKu53VgA17!UC-xt*_5km(LTLoRakc&T&M$%hNs&xK( z?=M>npY)v??IK9_{-bj?A78fn_pQF<`E2s>dV)GTbfd@1I6YjVkgL%axiO~VO-_@i z{o{&3Hgb)zfBG%?@T$9sjphU-o(K@|boXRr9y`?SepQopC_Udfc9+~fEZbd@#%>f( zt^*%(Rrg2P`wX?#qm$8?(_` zAtoxYa2FC0$DhQ}vC%8-8;kIiW+H6vcsTFrb z0qFsb$B@uhcNN={UDMo7reshV^#=?^b*m}#lf7^FWi)L%sK5z?Vq4C+)jNU_;ojQ` zCoNyf53lf>vQ3iutsoJ`+PA^*Lfxb2y7CBO{Xq#Sn@SQ-+ zru#g}^~m#s^{-~LVfXOBiSCW*vREDT{Twp{h#)bIfTUh!WrdQwdouCdeX0}N_7#TR zIXcVBk$g5y$*uc0zpn1(;@ug4T>1C!qT|K(6`x35MufibwJ+wodj~@id;5#<`S(wb zJv+oOHrrg7)$v-9*So*2Vs#7(`Og-Odwh*EO+a2;YlB2V~ zd1oGs{CQ@ggwmnn$9DBiVp9bkQ%J0s*Kck}X&3wCW^~@m08@oClo2QiJzf`Z#F5FP zh8>zVqGOJv&eo1yKy;NNLa$LF#qSVf?78p9fNYVdsMOLh&cYh|C^1O7X@tv-k1l_1 zIF={ar#Id>#=CT{hfLI*V!VZ4@9IrCuZ>Cmo;9CxJQ61xzj$HfIrP+YMrXo}!L^;$ zVWrjGcyyo@v-JH2p0w+t$b+#`=#+QX%5kG~E{OQb0}>7gOG(7~;^|8ror8ypnd}M3 z?_c&MeH;zWmfy6xZklqglqp1 zK0kORy;hGV3Qi7v#a2GvTSInl+Q%PkO<>L<#Hx}jO&Z;zsk&1NH55b8?q`rXGd7#H z@kHPfCyf4V!w1;lcDLT2<0H;0vHVO+RSk+mAZ*B1?Y~BTJ@S0epZFt=Pv$AYL@m#BUJ2T#ELdX<;t0}BtwTJcOq%?l8?K0|1IuZHb z{PjO-BgQMS$f{G7gGp!oNXBJ-Ex&dCrwxHsmrUk1GO|S-RdQpb=f1!&mOTBf-t0E!_GGb6D?_xmHjooOYOh9#Mb8^d;h$MiOBLSL0oFT-#)lV0lo66#nj>tBryCz zOdkVVo~6PHyE8J>9Pr1WyTQa@p1YrWwjiIdGMF`N{zqI!n@FP6K(;RW846hXFYWX^ z=^uosXgRBKmzs9`{pWE26MQZJTp}1j>nkl$5+GaDo*eT-`9UA3C*UpW+27?Y0^r{G zDnz1(#-%<3T~M(B9i&Iga6?J)1Lbe{tyP>}jR6S%kZp?agE zIBY&wxE0N8G}<0*&o>TNEdY3T1HdcPvB)7AnCIa>)a8}1_b}ht0#hw#=j}@mWd~(V zTU%RQEHYf6?eqZ@Py$SrmX;jQ!6gB+Mvs%wSWP2rz0AFPziFYi6W|SKdV2Svf^CTa zrZ)BvU9u|=04w1)yK`i`cXG!4;K2h)8nY}+k(AM(%pR|+M?BXNPak>FuhbI36;|A~ z1ON}4|0UM%Rt%@W&6j>V)dCBzp$^I@90u^qGlFgAIz8_BPt*Gr-Pt=}1{%_Z99Seg zi4O{5ZbUY`X1*jQCUP(HKowAh4kg-BO*?x=j35s;w_&UP59HJ$a8kt}aXP-qrz|Ob z2OeydcZdnqz_>jNlzSB^U>Og-=_mm`4S9VnuuNG~bMPt_nce>5htU@l%K1x$sEn-a zMQdBRMTn;$C2>LCIf%!N({=HC@}wo<&Ye3aHAPaLG&>(N99p)4R~zITW%e)}P!N_O zp3|_}>^X7uoUQsWU8%4goxRV1a{Lr8l&@Art^5GI7HyHF-H8gMaS`kCFg&|5xN6jSwmXVNA9BCJm?5X5D^mUu8jbiyPUyC;4o?t2;;M#U5LKwzKSk z_c$|M#c`9qp59^f19dnyFEurF)G9Z{aho=s33CwkuA&@kPd!18on^TkXc~8r_3OU} z5q3tfwF^8(liH}M`Zg-KY2>slQxR9Hs?+NE;HJHG6^X7ix zTC{G)KH zcYZ|{6al(X&L#tYd#~Nlbl%lyNMyOXuobU9DmM1^%ww}qJ0@%euYL7pkGRXqecoCM zi`ePZx(-IMK50udFIZy=+rR7?zFBu)QN@PzaT5dozby$|{9pYFi0Se$f>8GG#k;Da z#myW5Z7}pRWE%ry_w}2KviT*VM%?LIGm!&7AdZpM)`KGTKF%gzkjdV=%@a&p|H^d) zbrsdTY?Gckev^Gz$9MIkPUDRK;o8E*MD5OD^@{V>T*`(!2lVOvDEl}eGIqz$FDUi3 zgJLTG;8V{NJ-IRej+FVO1$Wh(&aj_XqE$6?^v!E{GVyiOu%9bI!llRa#yJS|9W!We zTt8i9R*$)5@6O4bca}t4x48``+q}#MmK)tY*09rU9%q%jA-I`u;Bb6i$jb0pQ<|kl44WO8OuX3NCkZLY3M?@PVdwIiWn|E5dE4EGSak4+O8T*>G#r?0}z2X|3XdoL@ zS=JQR#4xa*y}aDuPok?2Ui_-2MGUunTL@KoC~OOG~-QaKTGn( z^T_%;i6)qj`Sgp_BYL`nt4VNnqMC3kR_;w;`{%Z)Yj%YDgzIg-o2>`^d`QrV*5|j> zGV^f0O#{^#P6Uo5d>v9(4zF%1uTE|}Gs%p>-^qF8#M#<^v*(-E5^d|XB5(gWs`B(G zO=YrRjznc`tk>jWk4j()o+3WCllFJ&z$8bZwz-8_RC8okxjR#lw;wdl>={3SI)n*g z+@eb9bq9NeY2Rf^{?&trqLmKee!aS27Aikp)}>3-|As#0NFtS1cWv@YtYd?Qvmb#y z$I;fE@md-&yd`TxYTw)>$FhNTf<}lXBph#1!D-jZVHVp22l=qBRx4bJh@h%?bY6pz zlXiDWb&LeO8Wq}8J~os# znK(`zT755)C9jgP+KT+RAiw57XlylGzaPeS}78p%1 z%iRBeU7~$e8_T7YwTkncHZ^co%zbG)8pWkW9=?$v?)2x^%LmAp?^JlAP4cfF-{?_B z+}fqk=E}_L-l?++JbA-hZ6RDS(&zi=4q@|+0EC@gqIID!$Mx3Mo5A0|KD@3DQR0XU zuc)jn!n=Q)M2gmIT{Tma$XqZEnfr1jzwK*!sKC3|2`rkoe)u|cOpQIf&SY(CD_Q=_ zSXH&Bf(3QOPoK^}GAWsxg&ObOpc%{Sf{J|K8QC;j_4k@1Vpqh;s`0;|%og!IXR`#c z2ns{mq+9NIn~+V|yOUbVYHB_D39%dE6o>mS@X;J#wCJuTFES9;LF%Xon~T01^JwJ` zH`1D^3Ag!>dT7X>m!)LITzUL(VyBKw?&)$f27@_{iHYIs+i4)ZYY{T0BA-n9=9SyK zY8`M-sPSa}O{QXI+k9~BZurc|dTjsg2pt{I4-sIxqS*vzaW>$HJZiT7$d8$M*YqK< zgQavDcH%PYGjkwDPHAG3AmlsaPgSiZuXAt?9Uhh|4;=77JwUYrb5 zSlEAU))VYiU!|V?g~Hc1-GqElJ<~HkKjv(d5l-GyV$14?DlgG7a_-;SL^p9 zJ9xGpZJ?f{Io@)VmrRn;kl$w#vh415UOZ{Ipxo?_d367VKwp75N6S6RurZWqUb~yA z$9nPd=_rj>ylYfEu@6bLHzirh^}5g#BY&aF3!eLzJ1PM{CZ7|x zZr(TRHo^0mxlna+aq->yYbQE^Z)m8i>&`Ft^yyO?LOe*@*FNm%==q~*4;2*^T~|BR zv=`MsVcx=<4bFic$zlw@Iu6bjrTe5(VOvO7S04y-gpx3OWQYIlK7_S3vF{9sCK-U8 zgy(3EzAls|te)Aas{(TEn=$t}xzXU+Uz3%UmFe+v8?DHXlUyvi1Xc&sVE%Y{dG!OB ziK(JbXm`z?Q4*erh=`2bCV8jNvYoT&`IwTh%Kovz+ZeU%@EZ}VfoDU@yXxQCrLP`- z_;@-(Q6@v03D+w~L;%H#}(%y+sr1`*!NWu_GgE zAZBiR0isIQS>{iU7W?WlsneKFIDG{lzwcb%KEvTh=bxMP-}(r=2~@a+N68Kc*3@Tj zetFikC8rp-ldZ5OeFx!yFAAx`HwoJhZPgx=(ONimI{SXpU3T*fuWy{hWl_afFX7^C z;4(z;*D&HMgZtz4HbpeF_d}@z2T9XnKzjh|(vigOqTM8Y_>_}FH5CLGZ~-B|N{(Nd zen4N(>NKJnAkc(1tD0e|a2IuCSU<>II(+=SYy|9jwjNXVAx9({x~4SmO(-KcLj`&U zwu-+B<9j53`1tqF$)}cwJheYIVds(;rLS~D?8DcXA`T%wGc$(lV8`jk!-WcXMXRR8~uD=_#A3@>l(mk_*py+=k2ss1wFt-^W%(&_ zW+Zl#(51IDcK)~i$ybkO1&r1AFo;0)KPVKvGCKT}>?_4E{t2FcyS6ZYGcwbU`WM01 zE8VT^cd-gsKl;PPrG2*9u_ZUwVghOHk;wEDJY9(?2kUTGkK4AS?NpIH8ViYihF?s| zm*|pn9qZ`DKQ(KM(K|X&u3v2k!_lRD$d78c-rZdPcAQD?3Quqm{JVAqI;5iF{q#uJ zP{1zp>m13;O;*8_W;#WQjW0>u=^J(Zi#F=j2>+A^Qu~t0vutJnXT^g_V>y89k5S7U=b4&5$Pdq-87w5WbatG+$8zUy78iD z`)Gt%iQh=b@g=F5P`&@1UVRUb?PhSTyt$oB%D;V>0en##z*Cy)#qR_VgbHNOwngr- zuw49)(ysg+>bDD*M7D%58cQi-E143qmIm2H$eJRQJzGQ8B-`+nElVchm2BC@*d<0x zh%z#aJ(Fc{h;bD#U%&ph{VF3X5>1MpVD340|roJ9{L z*AYamY;Btg$VfC((lM|nT|Y)7wzB2$kzcAU;?r7as+63(1CcRKa;*3rpA$-(ifDnUABq&=yt z(XRggkaSd{^f`r@LV5eC>vt;|f+JlmemzvR@4{mv?72tBqoBMzjQdpQp2fyiKq86`kb=#IKl) ztnb7yX7=d1EPj-J)z#d7GA+cT?O?MlX|>Yjxp*~^*4(!`fr1C^wYI&RQy3c^MZSXL zCcT;{ib2OwG27Ln%fB}^Hbw;5UxuRK-E*{^K0WiIZGEDh5cACj-&j!kl0r`OyHcm~ zSXBVD7S83Ws}10%=#nGHxS4O7dhy<@`s^NQSG%J=_4=+%omIZ+pHnFf;?+w)7r3%S zC_jc(cx#MKH!j}V2xTM>{u&*k)~FW$Sg7&s>174A<58||j1c8Xk>rc(RN+B(Z5>!( ztL*AS@`BK@h8Gnb%UhW4{RH(@56Fx&=*#?%V7r_}9XmLvce6z^1?ezhlhfyX1v*nN ztFEhc&t0b(+M;%@tlYM`%M<(#7}GmuwHNy*)OtH$Bdfgx8`yfMm#ZUa&i@6{?~!xO+X z^i!TMWh@cS9s4zpKvae7M^Mc;%Ib0^N%Kz|?7}6xe?M(-DyvHvDYH(!q;6Th-65a* z))1z|pp}-CNE@-d&Lfk~i#HL5hed>vA1QQ>3=UEiz1Fnd0mJer4}J3o?OwD!Q0V&XIuK2fOsv(36T*5#2|dz+d4=tDMOEE4sWIM9F=+5?sdUFaA4huQuj z5hc%AJS~GN{IL)xenpP+3n4o@Tj`7Zg-m>39ICGDHi8Z)wizN!z!U29?Wto199B!f zB;4lvenGrA!~F}b*&Z?HFtu1wQBj~iU@+UbTk%HW@z5=5H-F6ZdE6VTsI%K4{+^ZW zu3+)6Wf^+O1ZlRfh(9%HI0g{b43@g^&QLo5y2fYs^qyDDc0+q4HfxDGnZpq&mYzG7 zm~;CIUuLw%8H#3lUhnY6I>jtmQi2L`C=42^;>@hwmuRfC_0dC}5ydaqzf25))>q%S z!!pt(S{WO>zVg~+Dr}@TixYUfb_l-#bgzXY5#9}8C5(T za&o#A6tu-huzB4x=L(qH8W$Ir6YvsXzu{E~2!(eee11xvGxH~b(3(C#=02TbfS8kx z_}n>yzAJN04GfhZEG zIJuP!Mj(@8v0r%|T|z?kmiQm)C4BXK0GW>nN`wzUoCM;(S{=q72?dmud#mG3@}!sq zzcEjKO$|+IfClhW`O>Da=yAi7QSX+At`dlNz?)XDW*Lq~`$K)yDu(VEGOrYFbtbj= z_H=f*jjYS?4VeeJ1uUs5%F46-NlAL{{qkrA*1~s+zQfrz6_r~3?!A^Y&>LdV= z4qrfHNvsqjK>Wl$)nb{`;PcKrJE>%(EAvgCr3^Izo(9=0L%A<~`Uh{}^UvNh15r8r zddh7(k3{Pk0*t3;uDTfh#~DX2>Vg8|{>nDKD07J2wM1%^@ew}%6O3J) z>ipk~$KU_zB0HfG;=W^3c`bJq1hI3|(7{c$;PA$wKI~kT^7Xx}8WU zKfi1)`V1o1si2Zh7f`Gm`PiGCu(u#!OLT^#MGUcurZEKv4GS9O7iWuX ziM0nk923L!72Y2;QA?hMp2J zC&gaaGCc3iKtGhbDF%kuDCsD)f<$hc$`C5Cd4BWMw^$P0dH>Do-clUOqD(%n*uz#^ ze67?FX0G@-zH#w#Z0oL6gJyz(usbeUtnCH((spu6-Lz&ugtHx(yP(QSS%wuoWE!_l zdM}&!nhq?r;Zs$WZ*|=!*xT#yP;6=(jRog))2xvWk!GR~tl__C-#@;xNTy3p;bgq1ov*h(v0=$8LgTbwXh5c# zQrmSGnpzj+))P67D<`ZmbP1-&p*w?|^W0o5uJ>d~Sv>9%F>^ z_Wj`1UcR?0v75x-!aDK@{e`Oqn^yjB{Jy_6w4N#qZtEC_goH>|SyvRzD$Js{Yk;Hs z&~GbD_Uc{{pTkF-W0USuVW8kx#FGfkX&LM}ubz+eeW(}H0LwV@yC1$+$3BOa&14Wo z>tP;(a?+@v;=LOor*pa_y6#`}e3z|tPE$p&i76$X-|e%-S$s(?mZ6G`|C7$2#2vV~ zeM8I|Dd^QV^0Y0LaVFH_C1?QBb*R`zyzbHx<%9S+1C+>ibIK{A14lr2S89T=SF@*5 zdTEaRdg53@8@w^D7r&flqsn9&#nwz>`?<=z(xw;s}mzgzy^?A=)n zn%0Pzc<~wtW+hwEU{WG;4!MeaPjLap-zG`}+-vJboa5;l-?9Bqq%u8{Vi7?zOSQ*D?A&hzd&jW8A@zf-gmXEJ~4gj1U{7gThmt{mUzwk7wGj^KAQ`!dA#!c z`X^IcWdUa;cOB(qp2o-`j>?jfzyO-MF3@h%%vSYqkk5VWatF`d>$pO|JJ_B%7S5X9 zDzIM!S{~2^?*WDmv^=2sr5`TF|1RAXN>*EojZNA+doWjFX_(-ylI z$azbn^2n4EAwu7lQ<8KKKL!?ivFoq?1i=B>jk2ms_E-KljQ{)LN#}mJ>U2kv`r;$h P;f9NzwlShY%Q5P|gb)Wv literal 0 HcmV?d00001 diff --git a/docs/lab/Lab3.5-AscendC-Op/image/ascendc-copyin-size.png b/docs/lab/Lab3.5-AscendC-Op/image/ascendc-copyin-size.png new file mode 100644 index 0000000000000000000000000000000000000000..c09d3e798e3b41a87f90697e845c823718ba93fb GIT binary patch literal 22046 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�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 literal 0 HcmV?d00001 diff --git a/docs/lab/Lab3.5-AscendC-Op/image/ascendc-double-buffer.png b/docs/lab/Lab3.5-AscendC-Op/image/ascendc-double-buffer.png new file mode 100644 index 0000000000000000000000000000000000000000..10543beec9d14d28a3b3b0fb248f8bdc0dead091 GIT binary patch literal 22653 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 z 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 QL4I)Us>YQZ`8$vQ7k@AV-~a#s literal 0 HcmV?d00001 diff --git a/docs/lab/Lab3.5-AscendC-Op/image/ascendc-ub-reuse.png b/docs/lab/Lab3.5-AscendC-Op/image/ascendc-ub-reuse.png new file mode 100644 index 0000000000000000000000000000000000000000..52e31ac4bc90001d06ff3d150e6f239944edab52 GIT binary patch literal 38805 zcmb5Vby!qizcwx)AR;IrAYBrYf^^5gPy-?j0!k=DDh!>{-3>!`N;imfH%N}sLwCo! z@%udIea^Yg^?R@1ABwYQv-Wnyz3%v|z_&_ZoX4b(A3S(~BPR=b_uv7V)Pn~o&mLg_ zf1^vLVF6#D*uDcxJ}4a`M*<%newKhpJa|wZj(zg=tfh5!%^>^H`T%UK=v^cm;pWU7{J0RT7%ALxvwW$O0e|rU8l`_#jTJqC;ruM@Z z^6a_VTRcKS!sEj9058c;_#koWh{T5xZit68tQB;1(GizvWx0jp;{~Y$FGUg)S6o{W zXIq7;latjcf_chktcc+i27jQbEF|K3W|_FWv8ot}2?ENBtuR8SBexhK}no>z|ZqgibAa?*f{G((25(r z-X+fwHK#->S_*n_`EY@s9Nx0gG}-wPZfe&#czAvgG8i{dFB@K_haZRe##^AmDmYG4 zYn?~rO7dVJU)iJq(!HChP?py@(3v4uo)+Aap}eu4uPo^{WS~LHtED$xFS}mbpmDsx z_pXVj{H>ZMdZ&*oWjgso-)y))m%!3FKHUiwpkK-`$Wr%Obme; ziQ(P0|Lij7c^C-_0&nTFJxQ3lM3%JbT@uNDEin6Vk>=v1V?yI-w`diHDG`*%XTky; zd&;mI>s21_+o)qt>$fu}ZgXmr@+dnSS+=*N7`8f_T;wcI4<@XotQp*nOvM{x)iMi1 z$1haX-_g?j_K0KXcWzdkzLw_D5f-1;&5gpZ%e}dbx&0QilE7Nb`hHD0FC!ZUw|G_j zI4DS7nOki3gGLy5s-Pg0qL!5M_*({;#DthrL>RW*MKLP!VRGK#_jeVmOr$d~pnK?$ zX`3uJ_K6s<>uZY)tAz#@H7@qx=R2zVeIqatpcl`)a?R^UMTyP&vUFbxy>*;cT~*E> zl6H1FGRv9=ji1b$3L<*H>hh7UMw&LntzGlbf4q?Ac-QQFa$1-z{HKjrz9ZU5p<_|X z#F}q`2+NxHGuw?s6Q5oE0H2j}*!gRRlKnx1<+hfztLcek)_h0hW3l)hG2wmn8GnxW zTc+y^L=dKPEA^oUVer=$^`&56{}T6v*%9)ZkG>nNR^{ca_;ys{O^KEZEx|9YdL_Sh z%@E6L1Jf>Ox_g*l52DR*G$fr#=4X_ExbpX3?6YEj?2%>hjR=}AUr}H55cuC4L0&`-h458`HSY(OV<+6XvLo3x7mG zx;aU+F|WzE&{{k`t*rO#xxTw)`s&5{k~=j%xio53`~+@VaKsa?xcHGFltBi&%f?nj>$aXK=##^I}GC zr9McWRU%qcho0`IJ9}8w_cWhg)Rsg+ORx7YGH=L#2#RgY;Ull}@gBdA4lXpu`=(r( zGz8&RKQlz56i9es#{C>;nGBlSO=?vI9lOvdb0tbIG>!nCNcd7N%HQIq>!IHHz?ih+rDcr>?_}_(CYo_t4hmjVEeeqw{m)!drCX% zUP=a8uOD?!-R5qauzpME->!zYf^L(C6b2A18qSb#iPQJf`DC-%pw?=EgiA_X0$LEU z7iho7*UD(aK7wt%79`N`L8MvRA_d!?7XqNd;qlN&>hy#iM^kZi?CpZL59yz(Cd|8+WNgLzuC_6tXISrx z2rSWUk-Ic#2Wu=Hp<|Xb-Ml}>aT~kAc#j}}Zb&jZVb+hsQptAKdzAMJ;J%kZzp0UFGG17+hyasu=gt1(0WBo6nt0iVz$= zLQ7AqK24h`(M0IV+&4q*bC$x|GWc8@Dw?H+(EH4sOI@>OH;##x^iFWz2<@yl;2}PYBfF>E2{niU zFG zGDLnKmgYz>>I;vj)$TW!huy^ao{;zS08Wyf2qdWD)CzE5GXF*|yoaGIQLs{-*IY{X zLl^%9^}HkvES+Z-A+HN*f&J#gzwqbvix3bE-A2E9F98>JMVXwYhh3oNGO!O(YKxn; z7;jS@n;ZN{Eq$DXk$WReuMA)aZ~N#i^W09-#4r}mP+KW|p~X4>iw2dj3sYNdxE8!DyuC-Wzfw-)4j$oM_*`Bz}2PD0DJBoSa(O#E3fD zm(p`~wK(R7_%se41rdF!k1HHH(maX-Kh= zl<_ns5`~U3?x!($Lzi>Se{bMWZCt}7VfIr4CoW>PP_t|?rNM4XG_QhaB00yV40R#E zcAi(IxXjduW|miPyw~6Pn7eO>yZU~YLtO<4eMr*fD^v|hW=gfiO)4#LGH*Q1R4)qd z3?MeZ*Vfiv+AJ#LoI-ISypUMPj^KTwoM8 zVQngOGbVcuR6a6MLtI<~c{n0d;a;_fE7&#*>ZH#IAN_`{>F@p;ZG`LDI;b)5P=lg! z?EKe4A{#qV)?ymnxPya>9q>6NUQVEaN`E4z;MK$KaH!2V54^*_^hO%-qMsXL32tXhr7}>mcc}fQA(#Zo{`hyeGtuBb zYHcY2n0c#Ig_c`ymnBGFn%onbYp&s!Thsg@6c|Bw309)6%Xq6uQ!@m1QYm_0p#2Z- zS}V1@7ks0B{6hk!4WCR*&E~KhwxoHiGW&j55^xUwdn%S+GyIDd{@-N^kVF+Ho3p*Rdr4@Rx?@(_fPA`w;6Dkod_M2rAdSyV4CL6tkGX}lMnwBN#9&v3Bai#sR z_qpm4lbiK8Z|3L}Hs;At<1dWicBQP#blbvw5RraGaN~L*6cNVzt~XQ(7T+~GoY;cBd`+F zncvybAZOc4T*_6rDV1`eUczSbTSmV!SthwSrIzEa-)`#-HrFQNej9(?n78o3K;elD)efYY%g+d*UMhQiAb2 zW6&Fj(E-4v>4Bg7UWAskIMJewDsX&?jfab%uety9m2ocgiT>+9$@!M8QA)Wo^8vQB zmYHb&OMKd8$`&Oo{g2TV@Abr)WFcmMi0i3!Phf}U>b4MpCsulMA zx2Xv1AMc14oR7;}Y=M6oN=<_)3-Y3#U}SM^ELL)~S{uGDL|p_uks5fIQnnvN_4|5(7V{ZQ8z&VzPU7;+Y?fjz^+lj;TRPE4bAboEbrgs50sdy@Z7=~U5 z!~+w)ok=XUPgLotqEP7AA)?U)?s>-_cHV~LW>qW;XrqGcht)^X!hW+)bB=6h-+H8W zi1}ruz58^lghrW3}v5k3^y%cvq18WOp!jg$A1&C)hdk*{$Gi;5dom=*rig}{%@+%TlFS_+I zPH(osP45u_RCEV z`C%qh1?}i{a`G6nxzRk5B`AS_f?u^>W~|V%@mJFvmOof8$d1hw{lyz_r@kQis^@Xf z1GZ>r0Vq~2)pL(1R+#3^Zx$v$x)ihuu)r7Likk z4_*3jM$7Ko%zP9#Rk ztKw7S#yqI%i`YB(pO`%`K|R&s0IES_#Lug#^t*hj zHw?ZLUlE98ISdr-F6~(Y&N@Ln{#KdMTyC7`5TD)uj-9}gPHE)RsJp` z0u)mP{kaTmrb=sCJ>@q? zc3Bt@Kh4p0ioT=jb)e(u&(!j->jE{=a9qY;**(ma8S%7VjR`6_ggli7ie=aJnVvnOQzljGdg2I@;> z#kuC+%w}2twRb1mK0C6EO8yt<7eXuV3BnQ?VwG0~(62<(CAw#HOK^GPwuu0;$yaiX zf%dzLEG>%-dRCbjIHWN}dC-5hi+}xQp=y*3fq;`ie5s7Uf3`XIhaO&Q{ ze`0S+0z2Wq?|(d8j}35}f8E;PLQC-fzAFv^I@y}Gh8(<&Xi}-aLzbtxA}TYMKih@{ zhks7;Kq35M|6+LkD-3rZ-fIw;dSg)IJ~^ItS8`3*&)%HMuE|%~JF`?0h;DdVk+yL; z*B>iXR!~s3@Clkque-m)&SIHYkakY5aZSr|x%qTEvQ=JiZ5jQeoz?CL8>`r2s~~F` zvMDt;iPyD3!de(UhCpQlsiVqxq)4HzkPgcvVh=RNjBtHp?wekpP?D+RhZE?Wskw z>29AvN!5{alG*G&#$DsF_^I<%O6knIn!rzNg6#U2`5nw?lLacn0wE(5dY8J(qa95S z?q9wn6py>ztS~ejUWP4270vp^ej743Yq)uGL}%W@%qS&R9tlehRkHq=(|GDELpj{M z&#Zu9=-zLc8I}QANxm!L9?;qS+yC`}`+*o&DX4;>X#UJqGOZ@&pmAhw&nCBUhKads&iamx;4;>(Vb=f)f>IxUY@JdKuz8f z-nbd0#T>8@(f=-rxkoDr`Ls#1_b$?ZExhNcw#5H&14Iq)f2@N4KC2HI3IqPf!+qE1 zegEAcFRBxPI!N^j;2LaiA<5|D^9?HSpSHXIwM@vqm0QxD3_m*$j(zNCkuKP2Cz1FG zc)O9^(J_KSTk@froA6$aXp~(0L;zigFviJ~0~$Cj0h%`f%@vxgQpft|8x3fO2f@Kv zU?zh{8WW15?;Zi?3m%H5z!xFRUVM1oD$+d=9|XRPSFdrGQg!@4vi-k=+r4clD+k+~ zSx1RAe*JCSL#-&Zv> z?o}M&H2Z;j#=z%t^NP2U`U+Jq?_-7-1OR>qV?BCh`Vs!m1=&W|x4yDQZp9vS+4UnQ zUmhC60cWA#Cb_9WVmeIj?ic~_Gd{gDKiSFpx(gD;U#bdpRaJYZWA79LuOO1nz29MD zDSeG-)2|-9y-f5wvK^AqVf!IT&q0RC7N)cXc^=h&XUeAA^Bko_w^TlL#I^UA*vJc; z2)`&~dE}Ctp~BNi=#Qvq%yih#E~=tiZ4Xh%h5U_y`L)&hwJP+rx$*4j(^>9=R$82F z!t>ouPHo=EYhq{vytik#-izS~qT@MC&1*?(t_Z`9kK1d-yVHQIi^#5D^eEWn2ud?4 z)BjHEEEk1djNi#D_vIZw=z$~$^sTlQjccKW5{vkKb6V2g*0X+sWW5__rpbkX$U2VO?PLm7X{~6-!?&EI$4{D;?$xPY<06Ml%W*|{ z6Ek;cCm>M>*^DmA)XPjsy@_G^-~#9ifCP2{6IpK{nF(WevC@E&(Op>1Dich#rB|w? z4kZl+T$G{;3%Bt>nfiF{&^BzrvaAX2Ck$?3KWMrjY5-9sOp<^3(ey{`W(+AZP~3tx zx~cG=XT=WuxBJD97|ce}+vH9*C!@u}&HOV^Gz(SDwi$wm|C8YkZ87oSc*~{HeLqZo z#DD4iY^&DywtnzJ*=h6nFyH8pKg%IDjF9OguQ^g8zoGuQyw5IL0 zTzJ7?(8%$etjqh<=>aCL3*s_Q^v0lNaJY4z8I$F5c&d$#LCa?SBqm9Iq`LN*N6psP z-UFuFvdOBz`P=hf_L&y@(?&GPYIV#jq1*Q&QzZ-aC~e=&e($EKDs$$@UOTzx)*z1# zaVvRD`dZ#9lQETy@e;>PXxnwfX|V9iFF!&J=k{AJbe;1ZD;7QVP4kUghwXV?t4wVL zk7p%w4tQCM$!v?)OiT<)2-C^7`3VQae*)3I&g`an`X5pb2MQ;zzyQ?sd~#-DYW z3)-jMJK46Bi%D8c;R%=)LHEu(<)+X(#lg8(tMzSeho%V7y_dfJ_(W_#k7Y4gr{)!W zTGfpC8$``oZm4zc|s2u>I5eI$yZH*hS~oii$RJL!9r;g5 zUBA)c(<)}97}26&YU@nnEGVn`>b*|7S6a*aUjH=@U)Mm?Nce>YjTs1Hll*9A?|RTx z()jQyHB<|rvCqyR9UmrO`+$@$eDqffwIv6%<xbD4G2W`mQ?sj(F1Jx2|5#6JrC?sbSB%I_5(B z*F@K^O8OW?_CGhAI+=2N$cw0}vHjpt=gN5N;bSrFU#q4P8xhM_Vx`pxN; zS9Ef97O(fnt7TgG*%IGj69Ds4sZaRt$7ak%3;uD6@By_%Y7sf#u#C% zqVsy)Ec?LvS016_h1dcvIriAO8%)Q*{YbHTxlnZ|5NR@WdD?7q+NKOFdlVmBoIqAu?kz1 z;>N6-dG$?^P9$RP$*OF>bK5q1MwK(ZxLkBA9DH3<>Em z{uESToO9H-a!xEBz?1MR|0p&xZ}n5(TUh(qW?E}npH8}+T{Sj0@u8cy;#@b$e)#vC zb_>kYXJZj4R!}n+uEFVHF32?fX$1OLjFXQUNP}%C`B{cXq68uhT3l&o@HM+-S0-ub zDh_rQu;BEzbq_o{xR!q;q?+u#y()-v^9HV|4UEDVnVbn*4;I$Su|yKX9)%tz*wF@_ zi{+x4i!6>}(9Y~)ESGs{N@ zQP1r?*Si9%Eyd-Xms`(H5}=~wVLf6P&{~lM+4Qn1j2vcjlp9zjHsiXfEZ~)gePiA;C2G8{eo$%rU7nJWV__S=+x7$#-BVI}kG4XAS$Gs)EUg91p0Xf~FUjKjj(&+xR{47Shd<$juvUgdizPE}0y&0& zgMLdn?zm#kC%kX1ug&J}eo0TaH89zB{Sg$lAAn*qGL=bh)>-n~l4bKI$>kH8akUyXX8;HnlT9zLc^ zOHyU-Dlmvj`BIJBa#pQxSnST#iTw3GR%B`_`&9AVGkbmR|NRXT3Y~G2x(IL>-MO@j z^&2HD=9|>#=W|12OiWDVz_8`elFp@^{>~OOf9dI~##o_R+N8_Gfsh6Lm-Tdos(C|q zf9`EEPeJzXa@zE--JQZ&4L%QrGCRg5rtkf*$ovUbT1CN4^uN7pYh(!n9b^}z^$w7( z2W+rAa|@)+z_x>2Z!S-CRrTGi>F`JDmJL%?^d!9~R1Be;=3L|4ezIz2M0gAoCtih4 z*txg$kra`&+$V1mwU@~wB|FkYIZ;A|*cqIrRXb6&no8BkZzN=A06DCXSXyah4b@td zv%?BBwg;j4hrj9DY5F}z22ht~7^q$v5kSmW^1Pk5_?c?0HRn`dTy9HObXj=X=NO@j z%`02LpngHCQlJe=fISz!%zEbXG%l!GSE18?JUn;~!v}VEaX?>jy&5iWyy%pgYqscB z;9*s)BoZ#;e@`ly_(r)?`@ZkbEi4U|O$UCK9Tq$P6kUEl5#FSxwB~|be;Zh`Rvz_j z36ZYq^V7OY=+o0H3O*jvbA2BZfpr&DdNs~LzC7~KULptGym9O zult`=BF6W6j1U<{s|P>(b#zVga!s_M`!kw(TF6gqI=#z4_HoF+U0tA|os7Fsa@=iT z5!GD-r>rnuhPE5xe0LhQ_*xzVNviK;uC?9pGvVYs4t|1*aSc8`ANRg(XP|&rZ`3)8 zoz-n{*J*7EJOWple4c@5$jPqu!;1>k=DnbU+f`)>+|KT*SEYxJfYZBj5aSnG!c}sW z^b2j|tVz9d$(PSI2UlwGPbzqIR1|S zd%fp$ym@CtA(ZyMb%3dMd~xj!Ssd9_0i4C+r-JqH_m!uoBp-9y*47QIa{OD41BC@o zh`aBNi>T_>tB+1q!z8EQ^wF9>{r-(dP+YZk9x5&4X20Cbf`+anqTH>_6pNg|iw?7Q zs`+Ijsxusk!Alq$vs`nWg`cQ`uy>&>OhP_nY0B>&>`sC8Vbf7>x(y)k$AA~5zV z==7`i-Ft0n(b*aSMIa9}YOJ&B-L^S2HQi)c`!H4<@zIO!=lnO0JM%cl%h=xgVvp7H zuA3<^!Cy3~tmJaW^+&@D<0i+Of}S3xb=-tM zA+UCTo}K*Dy5PEQHQ?AuXPC-k%^|InuY2~rcF_+I+)u+^lr#%Rq8>+uRW*~7l=MQFFmC04SF>sPb|J2Gx(=k)` zQT2s90yhpf&xsJl1U!Vtf^JhjI6t(G1?J z|6fgeUBU&%rHd2+K-Qud{U%kAr$&9hb!FC@8f{2BFh6tS38lf0O_KJJ12?DtMbt>s zByZ#OS<7Chc3=0z%jDwwoo5ISiAW9(rYmFz_Thv9Ents%^3k*&2x|b*p(gh4 zN6Wqf$KV|Y14TqCpGGvr=)~58Ld1up?*&F9Qo`eNtjV(_p6OB4X-zp99`7mPH&u+T z%6vN9CuK42;)LqhTx(a#t0x@cjyt`_o_j?j&Yx?|v^JEp%w6O0_G1eT>6-MjV!nd7 zwdc6JT6O?Z&QSb}z#pd5!l9rX_P#3JyL=^>>5gMY2)_P<_507yzKnO3vTPjF@(G#qGkN z0$~rvemxRo^L^+dl!!h<{Hy=PBHB^1#_vW=fF_?{tyO`NPW!EN+O4aapdV%pU=0@V zR}}loBT({h5%YYHV0~W|vCoHV`wK!13U>Wvqjv`~&DVRqbRJHNXiHzk-&c#WRiaf4 zc<%i%oz5?mB>}_a^cVLyzbr{AQZmr8MJxn{Ob|rmv8CLm#iV94VuDvHrxb7LnuK!l zq}chyNA8*zmi;&51Tu@8pmvsrDzeiIb%Q*stuJ%L*w?u?41%3NZdby8$lrZI2ITKn zGO5~3AOr0rlYS}p|BX~PQfg%R?yJI9Ve1a#_v$a=s2=0u_-DcTly20~UVgA($hqfk zNLjb5(Tx&I!l6eZdW-#R!00@2{z*5fsQ0C8T1xy4LU88`C~bp#N|a4(9Y4D~%#;`! zGv0EHtl|yJPgCbddVE>-5+3`N9EzO_4{@%>`daOQa)&#ScQZx%9OueC<5Dc0b(Y7g zm^r_EFW|Kt$O)W|2MqEbXD*US%z=8|w;{8bi?)-&YLy;9G4TDgd-?p;P5>^spy0;u zKUsjg$(2~HnmFb|#~$`KrmQ{XAUa5I@abr42m2*3)Y3+w5nPxnsD^FSLWO&~fcmY# z1(#EWq&`*OVBWYF(=;T3ElFJwkN#Hw6bx0*xpNM=RdA8IWGF&?P0vh`f%i3;AYR9S z&)W{$sFSX)#qmgQ{oA~&#cA%}`cM2KYqt@e&QK4TzTf7!gAor~rip-)Qh**}H`ev2q`b>kH858|`O}ms8064+*dZ&v92V>(V~2%h4;pa% z*GnZVj&iR93>FD6*!7p>GkEl2+X02~xjeD}R{l5+``Z9N7&P=bDX_4P{GQQ9b<#`D zpIOvd+|;}){{ks+Tq?m&y!*pQ^Rdh*ufYez8ulm+K8*|_S6M7HS^|=rUfA$0NB^?7 zn@j*uB^QT$qx+uqzM4{HZx}C)gP&%E3t0^3gemXdQF_mT-veg0EX$;ahXh3x!k1zL#69CnfL3T-dVL$y4rBh0`x`mt1(-Df~Q4 z@}A-#^lfw?>yJu|JVqhscTI`yY6;6GP!2nnZMwXD|L5s8-k?rZ)GAOCV+;pEr=)GA za{jG(g;l(YBlZRv%4D9_p2F!|DF>+STkssi#=tets+g84AsBResCV5I-Pa(PX>A`b zpWN(fRG=l}^W;|pOU%?oxoWts6Q+?n_nC`b@iWu;ubjPO?`Q;ZaC5v_6gq)A*KE25 zZ(~xXaWKIo{YyhT&-b<2Uf&l z71tdGchNohTkG=$L^b@2Ri7-4@d!wi8r8c)dp84ym-a9S_7Ph!}2rvN(0p<(y=Gy7Q(lI*|~G_6sP88|$T} zkYgNb{=VHMF>O6w-bg>bg+no3aYaSK5I+0$8$VbmbCha;xa9&NUvDpO@7@HBe^C!r z2lW}~ynaph8xdTtfZ^K7pnKidfqy`#hlzx?El0_sB?rl-8D#c&Kd5I6%Lhu2r;C=m z1no9qxyw(20^)ik(f+OEXlJMf-4Yr#1mCD8!rKjodHdjs8elcN*7DeA?hyesOg`Ci6UmPWE^VAVD_d7k&44ldIb$1wS6HAPQo9dWpRK!ycErcob-r2WCD&H9lQN%E(33P;$r(nmh#}QchM(E%Mjgb%&>@8z2mWMSVhGLR-*u(4`6s~ z9#;+)SY9YIGjogp65S768VGVUhW~T*Z`EP8=)d{Kzo|}U3LUM4I6cWd9SLA*IN2EA z8wFE|sF?h{a&NKxi`M*q{g8o($EV&XZ7x<0qcQjY^<}El$=q2p{`#oHe=nS50zRtT zQ7gfHgZU;O82_PK-{8;g%~yO3d&&DRWMBNk`pd;W%3?6Wbg0*nrCf8fDrZxyP3cv+!rtt?l(v zlNTT=VRWG;vG{2t+^=^yB23tOMCs`wY$K1zow6@Lg0NB`4tVi-M62cdStsro(g8Zq z`WDU?BYQeoKU6V%Az MMO7AapnCvC@6 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 literal 0 HcmV?d00001 diff --git a/docs/lab/Lab3.5-AscendC-Op/image/empty_kernel_overhead_vs_aiv_cores.svg b/docs/lab/Lab3.5-AscendC-Op/image/empty_kernel_overhead_vs_aiv_cores.svg new file mode 100644 index 00000000..e4450f89 --- /dev/null +++ b/docs/lab/Lab3.5-AscendC-Op/image/empty_kernel_overhead_vs_aiv_cores.svg @@ -0,0 +1 @@ +00.511.522.5Task Duration (µs)0510152025303540启动 AIV 核数0.67 µs2.25 µs \ No newline at end of file diff --git a/docs/lab/Lab3.5-AscendC-Op/image/msprofop.png b/docs/lab/Lab3.5-AscendC-Op/image/msprofop.png new file mode 100644 index 0000000000000000000000000000000000000000..f33f47f40827da14c6feefe199be28c017bbf46e GIT binary patch literal 85680 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

k=gV9pnKqqHZ4IpE%)X9GnHm-8 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 +
AI Core 分离架构示意
+ + +每个核内还有多级片上存储:AIV 侧的 **UB(Unified Buffer,向量计算的快速访存区)**、AIC 侧的 L1、L0A/L0B/L0C 等。多个 AI Core 之间相互独立,通过 tiling 把数据切分到各核上并行执行。 + +!!! note "AI Core 耦合架构" + + 事实上,AI Core 也存在耦合架构,即可以直接在 AIV 的 UB 与 AIC 的 L1 Buffer / Buffer L0C 之间搬运数据而不需要经过全局内存。这种架构常见于边缘推理系列(如昇腾 310B 系列等)。 + +#### AIV 内部结构 + +!!! warning "本实验不涉及 AI Cube" + + 由于算子本身不涉及矩阵乘法相关的运算,同时 AIC 算子的编写门槛较高,我们不会对 AIC 相关的开发框架和硬件特性做展开,感兴趣的同学可以自行了解。 + +每个 AIV 核内关键资源如下(on Ascend 910B4 NPU): + +| 资源 | 容量/规格 | 用途 | +| --- | --- | --- | +| **UB(Unified Buffer)** | 192 KiB / AIV | 向量计算的快速访存区,所有 Vector 指令的操作数必须在 UB 上 | +| **Vector 单元** | 256B(VLEN) | 执行 Cast/Add/Mul/Reduce 等向量指令 | +| **MTE2 搬运单元** | — | GM → UB 的数据搬入 | +| **MTE3 搬运单元** | — | UB → GM 的数据搬出 | +| **Scalar 单元(S)** | — | 标量运算、地址计算、控制流 | + +!!! note "数据搬运与流水" + + AIV 上有 MTE2(GM→UB)、V(Vector 计算)、MTE3(UB→GM)三条独立的流水线。在本次实验中,同学们需要了解以下两种同步机制: + + 1. **`TQue` 队列语义自动同步**:当你用 `inQueX.AllocTensor` → `DataCopy` → `inQueX.EnQue` 发射数据搬入 UB 指令后,再 `inQueX.DeQue` 取出来给 Vector 用时,**`EnQue` / `DeQue` 内部会自动插入 MTE2→V 的同步事件**——你不需要手动 `SetFlag/WaitFlag`。同理,输出端 `outQueY.EnQue` → `outQueY.DeQue` 也会自动处理 V→MTE3 的同步。这一机制主要保证内存搬运和向量计算流水线之间的依赖被正常处理。 + + 2. **`PipeBarrier` 显式屏障**:这一屏障用于保证某一条流水线内部的同步关系,常用的是 `PIPE_V`。Ascend NPU 的 V 流水线被设计为直接操作内存。Ascend NPU 不保证 V 流水线内部的 RAW 依赖能够被自动、正确地处理。开发者需要在存在 RAW 依赖的指令之间显式调用 PipeBarrier(),以确保本核此前发出的所有 V 指令均已执行完成。 + 为了减少频繁插入屏障带来的编程负担,bisheng 编译器提供了 --cce-auto-sync 选项。启用后,编译器会根据可见的 LocalTensor 读写依赖自动插入必要的屏障。不过,当代码中涉及指针运算、容器传递或手工地址操作时,编译器的依赖分析可能失效,此时就需要同学们手动插入屏障。 + + 更多有关同步的信息,感兴趣的同学可以参考 [Ascend C API列表](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/ascendcopapi/atlasascendc_api_07_0003.html). + +### 算子开发路径 + +本实验框架支持 Ascend C、TileLang 和 Triton 三种算子开发路径。总体而言,Ascend C 更接近昇腾硬件,开发者需要显式处理数据切分、片上存储、数据搬运和计算流水;TileLang 与 Triton 则提供了更高层的 DSL 编程模型,由编译器承担更多底层实现工作。 + +- **Ascend C** Ascend C 是昇腾原生的 C/C++ 算子编程语言与 API 体系。它通过 DataCopy、Cast、Add、Mul、BlockReduceSum 等接口屏蔽部分指令级细节,同时保留对核间切分、片上存储、数据搬运、队列、同步和流水的细粒度控制,适合需要深入调优硬件性能的场景。一个完整的 Ascend C 自定义算子通常由三部分组成: + + - **算子原型(Op 定义)**:声明算子的输入、输出与属性,注册推理 shape 与数据类型的推导函数,以及 tiling 函数。其中 OpDef 类与注册宏等骨架可由 CANN 的 `msopgen` 工具从算子信息 JSON 自动生成,但 tiling 函数中的切分逻辑仍需开发者手写; + - **Host 侧 tiling**:在 Host 上根据输入 shape、数据类型和平台信息,计算切分参数,决定每个核处理多少数据、UB 如何分配,并把 tiling 数据传给 kernel(类比于 CUDA 中设置 grid/block 维度并准备 kernel 参数的 host 侧代码,但额外承担了数据分区与 UB 规划); + - **Kernel 实现**:在 AI Core 上执行真正的计算,负责 GM↔UB 搬运、UB 内计算、结果写回(类比于 CUDA 中的 kernel 函数)。 + +- **TileLang** 在 Lab 3 中已登场,是一种面向高性能计算的 DSL。它把 tiling、shared memory、pipeline 等概念直接暴露为语言原语,同样可编译到昇腾 NPU 后端(见 [tilelang-ascend](https://github.com/tile-ai/tilelang-ascend))。相较 Ascend C,它省去了手写 host tiling 与 GM↔UB 搬运的样板代码,但在某些细节上对硬件的控制力可能弱于原生路径。 + +- **Triton** 是基于 block 的算子编程模型,通过 [triton-ascend](https://github.com/triton-ascend/triton-ascend) 后端可编译到昇腾 NPU。它以 `tl.program_id` 切分任务、以 block 为单位组织计算,写法接近你在 GPU 上的经验,便于把已有的 GPU kernel 快速迁移过来。 + +三种路径最终编译出的都是跑在 Ascend NPU 上的机器码,性能上限由硬件决定。路径之间的差异在于「你能在多大程度上接近硬件」。 + +!!! warning "多种实现路径" + + 我们提供了 AscendC、TileLang、Triton 三种实现路径的代码框架。你只需要选择一种路径实现即可,**多种实现不会带来进一步加分!** + + 同时,为了使大家接触和了解国产计算生态,我们**鼓励大家在本实验中使用 AscendC 完成你的算子**。代码框架中我们只针对 AscendC 路径提供基线实现,实验文档也会以 AscendC 算子开发为主。 + + 但是同样需要注意,使用 AscendC 路径**不会自动给你带来额外加分**。 + +## 性能分析 Profiling + +性能优化离不开测量。只有从 profiling 结果找到根据并针对性分析,才能找到更合理有效的优化方向。 + +对标 NVIDIA 的 Nsight System,Nsight Compute 等性能分析工具,华为也提供了 MindStudio 一族工具,命令行主要体现为 `msprof` 类指令,而桌面图形化版可以前往对应位置[下载 MindStudio Insight](https://www.hiascend.com/document/detail/zh/mindstudio/latest/GUI_baseddevelopmenttool/MindStudioInsight/docs/zh/user_guide/overview.md)。 + +本实验主要涉及以下两个 Profile 指令: + +### `msprof op`:分析算子的宏观特点 + +`msprof op` 对目标算子进行板端采集。主要的性能分析结果集中在宏观指标,包括算子运行时间,NPU 上各个单元(如 Vector 等)的利用率,UB 等不同层级缓存间的带宽,L2 Cache 的命中率,不同 AI Core 任务量是否均匀等。 + +!!! tip "一个简单的例子" + + 运行以下指令即可进行一次标准的算子性能数据采集: + + ```bash + # 采集默认的计算、访存、流水线和资源冲突指标 + msprof op \ + --kernel-name="fused_add_rms_norm" \ + --launch-count=1 \ + --aic-metrics=Default \ + --output=./op_prof \ + python3 checker/test_op.py 2 + ``` + + 将生成目录中的 `visualize_data.bin` 导入 MindStudio Insight 可以查看图形化结果。 + +分析结果时可以考虑检查以下问题: + +- `Block Dim` 与各核工作量是否符合 tiling 设计,是否存在空闲核、明显拖尾或负载不均匀; +- Vector 等运算单元的利用率是否较高; +- UB 高速缓存的利用带宽是否够高,次一级的 L2 Cache 命中率是否足够。 + +!!! note "如何读取分析的数据" + + 利用率表示该运算单元处于活跃状态的比例,不一定等同于『有效工作』的比例。多条流水线可以重叠,因此不同单元之间的利用率没有明显关系;单个指标较高或较低也不足以单独证明瓶颈。 + +!!! example "`msprof op` 结果可视化示例" + + 以下图片展示了一个 AIV 部分的 Profile 结果,可以看到不同层级缓存之间利用的带宽,Vector 单元的利用率,以及 L2 Cache 的命中率等。 + +
+ msprof op 结果可视化示例 +
`msprof op` 在 MindStudio Insight 中的可视化结果。
+
+ +### `msprof op simulator`:观察指令流水与同步 + +Simulator 在 CPU 上模拟指定 SoC 的指令执行,适合检查指令发射顺序、流水线空泡、`SetFlag/WaitFlag` 等同步事件和资源冲突。主要生成的结果是一个流水图(也叫 Timeline)。 + +它不是真实 NPU 计时工具:仿真耗时不能与 `Task Duration(us)` 比较,缓存、带宽竞争和运行时调度也应以板端结果为准。 + +!!! tip "一个简单的例子" + + 运行以下指令即可进行一次标准的算子模拟数据采集: + + ```bash + msprof op simulator \ + --soc-version=Ascend910B4 \ + --kernel-name="fused_add_rms_norm" \ + --launch-count=1 \ + --output=./op_sim \ + python3 checker/test_op.py 2 + ``` + + 由于是 CPU 侧模拟算子在 NPU 上的行为,所以我们需要显示指定 -soc-version 为 Ascend 910B4。 + +!!! warning "不要尝试模拟真实数据规模" + + 由于是 CPU 模拟,实际上 `msprof op simulator` 的性能非常糟糕,考虑到我们通过这个指令得到的结果主要是用来分析不同单元流水线之间的运转情况,模拟时请**设置较小的数据规模**,以便在合适的时间和资源使用下完成模拟。 + +!!! example "`msprof op simulator` 流水线示例" + + 以下两张流水图表明了同一个计算功能在不同实现下的模拟流水图,其中上三角形是各种同步 flag。你应该可以明显看到右图中的 Vector 利用率相比于左图有明显提升(少了很多空泡和停顿)。 + +
+
+ 优化前 msprof op simulator 流水图 +
优化前:Vector 流水存在较多空泡与同步停顿
+
+
+ 优化后 msprof op simulator 流水图 +
优化后:Vector 流水更连续,同步空泡明显减少
+
+
+ + 不同流水线之间的 Timeline 还可以展示是否产生了流水线重叠执行(即同一时间不同硬件单元同时工作),详见思考题。 + +### 从现象提出可验证的假设 + +Profiler 给出的是证据,而不是自动生成的优化结论。可以按“现象—假设—实验”的方式推进: + +| 观测现象 | 可优先检查 | 下一步实验 | +| --- | --- | --- | +| MTE2/MTE3 时间较长,Vector 经常等待 | 搬运粒度过小、重复读写 GM、未形成流水 | 合并搬运或复用 UB 数据,通过流水开启双缓冲技术 | +| Vector 流水长时间连续工作 | 指令数量、规约层数、类型转换或高代价指令 | 优化计算逻辑,实现更高性能的同样计算功能等 | +| 各流水线都存在大段空泡 | 过宽的屏障、Scalar 依赖、tile 太少 | 用 simulator 对齐空泡与同步事件,再收窄同步范围 | +| 部分核明显更早结束 | 多核切分不均或尾块集中 | 调整 Tiling 和 NPU 侧 Init 时的工作分配 | +| Roofline 接近带宽上限 | 算子可能受 GM 带宽约束 | 优先减少 GM 往返,而不是继续增加 Vector 指令并行度 | + +每次只改变一个主要因素,先跑完整正确性测试,再重复计时。只有当对应指标与端到端耗时同时朝预期方向变化时,才能较有把握地解释优化收益。 + +## Ascend C 简介 + +Ascend C 通过 C++ 模板与 intrinsic 暴露 AIV 上的存储、搬运与计算指令。下面只列出本实验会接触到的核心概念,作为阅读 baseline 代码和继续编写 Ascend C 代码的参考。 + +### Tensor 编程模型 + +在 Ascend C 的编程模型中,主要操作的数据被视作一个 Tensor。 + +!!! tip "你也可以操作单个数据" + + Ascend C 也提供了单个数据的 API(如 `GetValue` 和 `SetValue`)。但这两个 API 的性能通常比较糟糕。 + +- **UB 与 LocalTensor**。Vector 指令的操作数必须位于 AIV 内的 UB(Unified Buffer)上。Ascend C 以 `LocalTensor` 表示一段 UB 上的逻辑数据视图,承载实际数据类型 `T`(如 `half`、`float`)与长度信息,本身不直接分配内存,需从 `TBuf` 或 `TQue` 中获取。`GlobalTensor` 则是 GM 上的对应视图,用于 `DataCopy` 等搬运 API 的源/目的。 + +- **TPosition**。`TPosition` 是一个枚举,标识缓冲区在存储层级中的物理位置,常见的三种取值如下: + + - `VECIN`:与 MTE2 流水衔接的输入侧 UB,通常作为搬入队列位置; + - `VECOUT`:与 MTE3 流水衔接的输出侧 UB,通常作为搬出队列位置; + - `VECCALC`:纯 Vector 侧的 UB,不参与 `TQue` 的跨流水线同步,常用于常驻或中转数据。 + +- **TBuf**。`TBuf` 是 UB 上的静态缓冲区,由 `TPipe::InitBuffer` 在 kernel 启动前按字节大小分配,生命周期与 kernel 一致。它直接持有 `LocalTensor`,不参与任何同步事件的插入,适合存放常驻数据(如 weight)或临时中转缓冲(如平方缓冲、规约暂存)。 + +- **TQue 与流水**。`TQue` 在 `TBuf` 之上提供队列语义,用 `AllocTensor → EnQue → DeQue → FreeTensor` 描述一段 LocalTensor 在流水阶段间的所有权与同步事件转移。`BUFFER_NUM` 控制队列深度,设为 2 即为相邻 tile 的搬入与计算提供交叠空间。 + +### 内存搬运类 API + +`DataCopy` 用于 GM↔UB 间对齐、连续或规则分段的数据搬运; + +`DataCopyPad` 进一步支持非 32B 对齐的尾块,可通过 `isPad`、`leftPadding`/`rightPadding`、`paddingValue` 控制尾部的填充值,避免越界读写或破坏对齐。`DataCopyExtParams` 以 `blockCount` / `blockLen` / `srcStride` / `dstStride` 描述多段搬运的几何。 + +### Vector 计算 API + +Vector 侧的元素级与逐元素运算包括 `Cast`(类型转换,可指定 `RoundMode`)、`Add`、`Mul`、`Div`、`Sqrt`、`Rsqrt` 等,通常以 `dst, src0, src1, maskCount` 形式调用;`Duplicate` 用标量广播填充一段 LocalTensor。所有调用都按 32B 对齐(FP16 16 元素、FP32 8 元素)操作,非对齐尾数由 mask 或 `DataCopyPad` 处理。 + +沿一维规约的指令以 `Reduce` 为主。可以指定规约长度等参数,规约操作包括求和,取极值等。同时 AscendC 提供了更底层的 `BlockReduce` 与 `WholeReduce` 操作,用来减小 `Reduce` 的开销。感兴趣的同学可以进一步了解这些 API 的使用方法。 + +!!! tip "查阅官方 API 参考" + + 上述 API 的支持数据类型、对齐、mask、repeat、临时空间与同步的要求,以及功能和使用方法的详细描述,都在 Ascend C 官方 API 文档里有所说明,实际编写算子时,请及时查阅相关 API 文档。详见 [Ascend C API 列表](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/ascendcopapi/atlasascendc_api_07_0003.html)。 + + +## 编写高性能的 Ascend C 算子 + +!!! warning "不要照抄优化思路!" + + 以下给出的是可能有效的优化方向,而不是必须实现的。请始终以性能结果和 profiling 结果为准。 + +### 让搬运与计算形成流水 + +AIV 的 MTE2、Vector 和 MTE3 可以分别执行搬入、计算和搬出。由于这三个单元本身是相互独立的,因此如果在同一时间重叠不同单元的执行将能够大幅掩盖时间,获得加速。Ascend C 的编程模型中倡导把一个 tile 的处理拆成 `CopyIn → Compute → CopyOut` 三段式,明确生命生产者和消费者关系,并用 `TQue` 在阶段间传递 LocalTensor 的所有权与同步事件。这样的编写范式能够更好的让编译器识别依赖关系,并且**自动**开启流水。 + +
+
+ ![Ascend C CopyIn、Compute、CopyOut 三段流水编程范式](image/ascendc-pipeline.png) +
+
Ascend C 三段流水编程范式。图源:昇腾社区
+
+ +将队列的 buffer 数设为 2(或者更多),可以为相邻 tile 交叠提供空间:当一份数据参与 Vector 计算时,另一份数据才有机会同时搬入或搬出。这个也被称作 Double Buffering 技术。 + +!!! note "不一定更快" + + Double Buffer 并不总是保证自动加速,同时其是否生效还需要满足相邻阶段之间没有不必要的全局同步等条件。 + +### 让中间结果留在 UB + +融合算子的主要价值,是让前一阶段的输出直接成为后一阶段的 UB 输入,而不是每经过一步就写回 GM。官方示例中的反例执行两次 GM 往返,正例则在 `VECCALC` 中保留中间值。 + +
+
+ ![连续 Vector 计算中经由 GM 中转与在 UB 内复用中间结果的对比](image/ascendc-ub-reuse.png) +
+
连续 Vector 计算的中间结果应尽量在 UB 内衔接。图源:昇腾社区
+
+ +对本算子而言,$R=x+\mathit{residual}$ 随后还要用于输出 `residual_out`、平方和规约以及计算 $y$。只要 UB 容量允许,就应保留可复用的 $R$,并把写回 `residual_out` 的副本交给输出队列,避免为后续计算再次读取 GM。`weight` 在所有行上相同,也可以按核或按 tile 复用。与此同时,应统计所有常驻 buffer 与双缓冲队列的总占用,避免为了复用而挤压 tile 大小或导致 UB 超限。 + +### 根据 shape 设计 Tiling + +多核和单核 tiling 需要一起设计: + +- 运行时通过平台接口查询 AIV 核数与 UB 容量,不把某个环境中的数值写死到策略中; +- 各行相互独立时,优先沿独立维(如 $B$)切分。使用商和余数分配大小核,使各核行数最多相差 1,避免简单向上取整造成尾部空闲核; +- 当独立维很小时,盲目启动全部 AIV 没有收益。沿其他维(如 $H$)切分虽然能增加并行度,却会引入跨核规约或额外 pass,需要根据实测决定是否值得; +- tile 大小既要满足 UB 预算,也要让每核有足够多的 tile 支撑流水。最大的 tile 不一定最快,最小的 tile 也会增加循环和搬运启动开销。 + +??? example "从启动开销的角度思考为什么不一定需要启动全部 AIV" + + 在 NPU 中,每个核在被启动时都要单独付一次初始化开销(加载配置、建立执行上下文、准备片上资源等),且这部分几乎无法通过流水、搬运或规约优化消除——它只和「启动了多少个核」有关。下面是用一个 body 几乎为空的算子,只改变 `<<>>` 下发 AIV 数目,用 `msprof op` 测得的 Task Duration,可以近似认为是启动开销: + +
+ ![空 kernel 的运行时间和启用 AIV 数目的关系](image/empty_kernel_overhead_vs_aiv_cores.svg) +
空 kernel 的运行时间和启用 AIV 数目的关系
+
+ + 它随启动核数近似线性增长(约 2 核 0.67 µs → 40 核 2.25 µs),本身处在微秒量级,在大算子里几乎被 profiling 波动淹没;但当算子整体只有几微秒、单核计算量又很小时就占比可观。因此计算量过小的任务要选择「够用就好」的核数,而不是无脑写满全部 AIV。 + +公开评测 shape 中既有 $B=1$,也有 $H$ 非 32B 对齐的情况。一个只对 $[256,1024]$ 快、但在小 $B$ 或尾块上出错的 tiling 不是有效实现。 + +### 提高搬运效率 + +MTE 搬运存在固定启动成本,单次搬运过小时难以充分利用带宽。 + +??? example "单次搬运量与有效带宽的关系" + + 以下是昇腾社区对于不同搬运量带宽利用率的一个测试,可以看到小的数据搬运并不能很好的利用带宽。相关结果数据并不一定适用于我们的 910B4 NPU 上,只是表明一个相关趋势。 + +
+
+ HBM 到 UB 的单核带宽随单次搬运数据量变化 +
HBM → UB
+
+
+ UB 到 HBM 的单核带宽随单次搬运数据量变化 +
UB → HBM
+
+
+ +

图源:昇腾社区

+ +若 UB 预算和数据布局允许,可以尝试用一次 `DataCopy` 搬运多行,或用 `blockCount`、`blockLen` 与 stride 参数表达规则的多段搬运,减少逐行发射指令的开销。与此同时需要注意: + +- GM 起始地址、每行 stride 和 UB 地址的对齐会共同影响搬运效率; +- 非对齐尾块应使用 `DataCopyPad` 或等价 mask 正确处理,不能为了对齐越界读写; +- 合并搬运会增加 UB 占用,并可能减少每核 tile 数,应与 Double Buffer 一起重新评估; + +### 选择合适的规约实现与精度 + +高效的归约操作是本实验中这个算子能够获得高性能的关键一环。Ascend C API 中提供的 `Reduce` 类算子可能存在较多的同步 Flag 设置和边界检测情况,实际上可能并不能获得很好的性能。因此,Ascend C API 同时提供了更加底层的 `BlockReduce` 操作和 `WholeReduce` 操作。两者在单次执行速度和吞吐效率上各有优劣,但是合作起来就可能获得比原生 `Reduce` 更好的规约性能和运算单元利用率。 + +同时,本实验的输入输出是 FP16,但这并不意味着平方和也适合在 FP16 中累加。使用 FP32 作为中间结果通常更稳健,但会占用更多 UB,也可能增加 Cast 和 Vector 计算开销。可以尝试减少重复 Cast、缩短 FP32 数据的存活范围; + +!!! danger "禁止一味地使用低精度来获得更高性能" + + 任何低精度或近似方案都必须通过我们最后的精度校验! + +??? tip "拓展阅读" + + - [Ascend C 算子性能优化实用技巧 01:流水优化](https://www.hiascend.com/zh/developer/techArticles/20240819-1) + - [Ascend C 算子性能优化实用技巧 02:内存优化](https://www.hiascend.com/zh/developer/techArticles/20240823-1) + - [Ascend C 算子性能优化实用技巧 03:搬运优化](https://www.hiascend.com/zh/developer/techArticles/20240906-1) + - [Ascend C 算子性能优化实用技巧 04:Tiling 优化](https://www.hiascend.com/zh/developer/techArticles/20240920-1) + - [Ascend C 算子性能优化实用技巧 05:API 使用优化](https://www.hiascend.com/developer/techArticles/20241107-1) + +## 实验任务 + +你的任务是在昇腾 910B4 NPU 上实现并优化 `FusedAddRmsNorm` 算子。你可以从 **Ascend C、Triton-Ascend、TileLang-Ascend** 中任选一种开发路径;只需完成一种实现,尝试多种路径不会带来额外加分。 + +实现需要同时满足以下要求: + +- 保持给定的输入、输出和属性接口; +- 通过公开与隐藏测试的正确性检查; +- 在指定评测配置下尽可能优化 kernel 性能; + +### 接口与计算语义 + +设 $B$ 为行数,$H$ 为隐藏层宽度: + +| 张量 | 参数类型 | 形状 | 数据类型 | 含义 | +| --- | --- | --- | --- | --- | +| `x` | 输入 | $[B,H]$ | FP16 | 输入 | +| `residual` | 输入 | $[B,H]$ | FP16 | 残差 | +| `weight` | 输入| $[H]$ | FP16 | RMSNorm 缩放权重 | +| `eps` | 输入| 标量 | FP16 | 防止除零的微小偏移 | +| `y` | 输出|$[B,H]$ | FP16 | 归一化结果 | +| `residual_out` |输出| $[B,H]$ | FP16 | 残差加法结果 | + +对每一行 $b\in[0,B)$,算子计算: + +$$ +\begin{aligned} +R_b &= x_b + \mathit{residual}_b, \\ +\mathit{rms}_b &= \sqrt{\dfrac{1}{H}\sum_{i=0}^{H-1}R_{b,i}^{\,2} + \varepsilon}, \\ +y_b &= \dfrac{R_b}{\mathit{rms}_b} \odot w, \\ +\mathit{residual\_out}_b &= R_b. +\end{aligned} +$$ + +三个开发路径对 checker 暴露的入口均为 `fused_add_rmsnorm(x, residual, weight, eps)`,其中 `eps` 默认为 $10^{-6}$。 + +??? note "关于 `enable_pdl` 属性" + + Ascend C 的底层算子定义中还保留了一个布尔属性 `enable_pdl`,用于与 FlashInfer 原始签名保持一致。FlashInfer 中该属性控制是否启用 NVIDIA CUDA 12.3+ 引入的 **Programmatic Dependent Launch(PDL,程序化依赖启动)**——允许后一个 kernel 在前一个 kernel 完全结束前就开始发射与初始化,以掩盖 kernel launch 延迟。 + + 在昇腾 NPU 上不存在对等的硬件机制,因此本实验中该属性不产生任何实际效果:PyTorch 扩展胶水层会固定向算子传入 `false`,Triton 与 TileLang 路径也无需暴露该属性。你不需要在实现中处理它,也不应期望通过它获得性能收益。 + +!!! warning "本实验采用非原地接口" + + FlashInfer 原始接口会原地修改输入,而本实验规定 `x` 和 `residual` 为只读输入,并返回独立的 `y` 与 `residual_out`。请勿改变这一约定。 + +### 修改范围与限制 + +你可以修改所选路径目录下的实现,并在该目录内增加必要的辅助文件: + +| 开发路径 | 可修改目录 | +| --- | --- | +| Ascend C | `src/ascendc/` | +| Triton-Ascend | `src/triton/` | +| TileLang-Ascend | `src/tilelang/` | + +允许自行设计 kernel、tiling、核数、片上存储布局和针对不同 shape 的实现分支。禁止: + +- 修改 `checker/`、`env.sh`、输入生成、golden 或计时逻辑; +- 调用已有 RMSNorm、FusedAddRmsNorm 或等价高层算子代替被测计算; +- 硬编码测试数据、隐藏 shape 或输出结果; +- 利用评测程序漏洞绕过计算或正确性检查; +- 依赖课程环境中未提供的额外软件包或自建工具链。 + +可以参考开源实现,但需要在报告中注明来源,并说明自己的实现与修改。 + +## 代码框架 + +实验代码位于仓库的 `src/lab3p5/`: + +```text +src/lab3p5/ +├── env.sh # 加载课程 CANN 与 Python 环境 +├── README.md # 代码框架使用与提交说明 +├── checker/ +│ ├── build.sh # 构建并安装 Ascend C 算子 +│ ├── run.sh # 正确性检查 +│ ├── profile.sh # 固定性能 case 的 msprof 采集 +│ ├── test_op.py # 输入生成、FP32 golden 与逐元素比较 +│ ├── case_specs.py # 公开测试配置 +│ └── get_time.py # 解析 op_summary 中的 kernel 时间 +└── src/ + ├── __init__.py + ├── ascendc/ + │ ├── op_host/ + │ │ ├── CMakeLists.txt + │ │ └── fused_add_rms_norm.cpp # 算子注册与 Host tiling + │ ├── op_kernel/ + │ │ ├── CMakeLists.txt + │ │ ├── fused_add_rms_norm.cpp # Device kernel + │ │ └── fused_add_rms_norm_tiling.h # Tiling 数据结构 + │ ├── extension/custom_op.cpp # PyTorch 扩展胶水 + │ ├── common/pytorch_npu_helper.hpp # PyTorch NPU 辅助头文件 + │ ├── CMakeLists.txt / CMakePresets.json + │ ├── build_op.sh # 构建 Ascend C 算子与 wheel + │ └── setup.py + ├── triton/ + │ ├── __init__.py + │ └── fused_add_rmsnorm.py # Triton kernel 与 launcher + └── tilelang/ + ├── __init__.py + └── fused_add_rmsnorm.py # TileLang kernel 与 launcher +``` + +### 选择开发路径 + +| 路径 | 建议先阅读 | 运行方式 | +| --- | --- | --- | +| Ascend C | `src/ascendc/op_host/fused_add_rms_norm.cpp`、`src/ascendc/op_kernel/fused_add_rms_norm.cpp` | 直接运行 checker;脚本会在当前任务中按需构建并安装算子 | +| Triton-Ascend | `src/triton/fused_add_rmsnorm.py` | 提交任务时设置环境变量 `LANG=triton` | +| TileLang-Ascend | `src/tilelang/fused_add_rmsnorm.py` | 提交任务时设置环境变量 `LANG=tilelang` | + +Ascend C 路径提供了一个以正确性为主的 baseline:Host 侧读取 shape 和属性并生成 tiling;Device 侧按行分配工作,FP16 数据进入 UB 后主要使用 FP32 计算,再转换为 FP16 输出。它已经展示了 `TQue`、`TBuf`、数据搬运、Vector 计算和规约的基本组织方式,但同步、流水和 tiling 仍有优化空间。 + +本文不逐项复述 Ascend C API。使用接口前,请直接查阅对应 CANN 版本的 [Ascend C API 参考](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/ascendcopapi/atlasascendc_api_07_0003.html),尤其注意支持的数据类型、对齐、mask、repeat、临时空间和同步要求。 + +### 构建与自测 + +所有命令都应在 `src/lab3p5/` 下执行。NPU 任务通过 `hpc submit` 提交到 `lab3p5` 分区;`run.sh` 和 `profile.sh` 会自行加载 `env.sh`,一般不需要在提交任务前手动 `source`。 + +```bash +# 正确性:运行全部公开 case +hpc submit -p lab3p5 bash checker/run.sh +hpc submit -p lab3p5 -e LANG=triton bash checker/run.sh +hpc submit -p lab3p5 -e LANG=tilelang bash checker/run.sh + +# 正确性:只运行一个公开 case;编号从 1 开始 +hpc submit -p lab3p5 bash checker/run.sh 2 + +# 性能:固定 shape 性能测试(256×1024),不接受 case 参数 +hpc submit -p lab3p5 bash checker/profile.sh +hpc submit -p lab3p5 -e LANG=triton bash checker/profile.sh +hpc submit -p lab3p5 -e LANG=tilelang bash checker/profile.sh +``` + +`checker/run.sh` **只负责正确性检查**;`checker/profile.sh` **只采集 student 算子的性能**,使用 `msprof op --warm-up=10` 并输出一次 `Task Duration(us)`。进行性能测试前,应先用 `run.sh` 验证正确性。 + +Ascend C 路径下,每次改动代码后需要自己进行编译,编译脚本已经写好为 `checker/build.sh`,在 Devpod 内即可进行。TileLang 和 Triton 路径会自动触发编译,不需要同学们手动进行。 + +## 如何获取计算资源 + +我们通过[实验平台](https://platform.s.zjusct.io)提供 **arm64-910b** DevPod,容器拉取的镜像中已经配有本实验所需的 CANN 工具链和 Triton/Tilelang 包环境,一般不需要自行安装工具链。更详细的平台和文件同步说明见[集群使用](https://hpc101.zjusct.io/guide/)。你需要做的包括: + +1. 登录实验平台; +2. 创建预设为 `arm-910b` 的 DevPod; +3. 在 DevPod 中获取课程仓库并进入 `src/lab3p5/`; +4. 执行 `source ./env.sh` 后开始构建和测试。 +5. 在需要在 NPU 上执行算子时使用 `hpc submit -p lab3p5 ` 即可提交至分配有一张 910B4 NPU 的计算分区执行你的命令。 + +!!! warning "家目录不共享!" + + 华为为我们提供的 Ascend 910B4 8 卡裸金属机器地理上分布于华北-乌兰察布地区。距离超算队在杭州的集群和其他硬件资源有一定的地理距离。由于 NFS 对于时延有较高要求,本平台的家目录不会与其他硬件资源的家目录共享。 + +!!! danger "请注意区分 Devpod" + + 在创建 Devpod 时,Lab 4 任务一所需的鲲鹏环境对应的 Devpod 预设为 `arm64-920b`,而 Lab3.5 的预设 Devpod 为 `arm64-910b`,两者环境和家目录均不互通,**请注意区分**。 + +## 评分方式 + +评测包括**正确性**和**性能**两部分。只有通过正确性检查的实现才会进入性能计分。 + +### 正确性验证 + +我们提供多个 Case 测试你的算子。公开 case 由 `checker/case_specs.py` 定义。下表同时给出代码中的 case 索引和命令行编号: + +| case 索引 | 命令行编号 | $B\times H$ | 说明 | +| --- | --- | --- | --- | +| 0 | 1 | $32\times4096$ | 小规模、对齐 | +| 1 | 2 | $256\times1024$ | 性能评测配置 | +| 2 | 3 | $1\times4096$ | 单行 | +| 3 | 4 | $1997\times3037$ | 行数与尾部均不对齐 | +| 4 | 5 | $2048\times4096$ | 大规模、对齐 | + +输入由固定 seed 在运行时**随机**生成。正式评测还会使用不同 shape 的隐藏 case(保证数据范围大致一致),因此不能只针对公开配置硬编码实现。 + +Golden 在 FP32 下完成残差加法、平方和、均值、开方、除法和权重缩放,最后转换为 FP16。`y` 与 `residual_out` 均需逐元素通过检查。 + +对参考值 $g_i$ 和输出值 $o_i$,元素在满足下列任一条件时通过(相对精度或绝对精度小于给定阈值): + +$$ +|o_i-g_i|\le 10^{-3} +\quad\text{或}\quad +\frac{|o_i-g_i|}{\max(|g_i|,10^{-12})}\le 10^{-3}. +$$ + +整个张量要求错误元素比例为 0。一个更快但未通过全部正确性检查的实现不会获得性能分数。 + +### 性能评分 + +为了方便 OJ 等实现,性能测试只涉及单个 Shape,评测配置为: + +- **Shape**:$[256,1024]$; +- **输入输出类型**:FP16; +- **`eps`**:$10^{-6}$; +- **指标**:被测 kernel 的 `Task Duration(us)`(来自 `msprof op` 的结果,热身 10 次)。 + +基于我们的基线和优化结果,目前的评分曲线如下(对数曲线): + +
+ 性能评分曲线 +
性能评分曲线(横轴为 kernel 耗时,纵轴为得分)。
+
+ +我们提供的 Ascend C 基线性能为起始评分点,满分 120 分,超出的 20 分将作为 Bonus。 + +## 实验报告要求 + +实验报告提交 PDF,重点说明你如何从测量得到优化决策,不需要重复大段背景知识或 API 文档。报告至少应包含: + +- 使用的开发路径、测试环境、软件版本和运行命令; +- 算子的计算过程、数据依赖和初始实现; +- baseline 的正确性、性能数据和 profiling 证据; +- 每项主要优化针对的瓶颈、关键修改及其收益; +- 最终正确性结果和性能结果; +- 尝试过但未采用的方案及原因; +- [思考题](#思考题)作答; +- 参考过的资料或开源实现。 + +较长的代码、完整 profiler 输出和构建日志不必全部放入正文,只需保留能够支持结论的部分。 + +!!! tip "失败尝试也值得记录" + + 没有带来加速的尝试可以帮助说明原先的瓶颈判断、优化的副作用,或不同指标之间的取舍。 + +!!! danger "关于 AI 使用" + + 本实验允许使用 AI Agent 辅助开发和理解资料,但最终报告应由你自行组织和核实,禁止使用 AI 生成。 + +## 思考题 + +!!! tip "这里可能没有标准答案" + + 部分思考题可能没有一个标准的正确答案。我们更希望看到你在实验过程中遇到的实际情况以及你个人的思考和理解,即使可能存在错误。 + +1. 对 $[256,1024]$、FP16 配置,估算算子必须进行的 GM 读写量和主要浮点操作数。说明你的计数口径,计算算术强度,并结合 `msprof` 结果判断实现更接近计算瓶颈还是访存瓶颈。 +2. 你的算子是否开启了 Double Buffer 流水?请你通过 `msprof op simulator` 的结果向我们证明。如果你开启了双缓冲流水,请说明你是显示编写了依赖还是让编译器自动识别开启的? +3. (Bonus)我们讲到了 `TQue` 相关的概念,结合你对相关文献的阅读和实际的编程以及 Profiling 体验,`TQue` 本身是否是一个真实存在的队列?我们在 `EnQue` 和 `DeQue` 时相关的 LocalTensor 是否发生了在队列之间的拷贝或移动? +5. (Bonus)今年第一季度,华为正式推出了新一代 NPU Ascend 950PR,引入了很多新的变化。请阅读相关资料,向我们展示一下相比 910 系列,950PR 带来了哪些新的硬件特性?你也可以比较昇腾 NPU(910B 系列)与 NVIDIA GPU 在硬件设计理念,开发语言等方面的异同。或者搜索一下一代代昇腾 NPU 和 NVIDIA GPU 的迭代过程,你有什么发现? +6. (Bonus)今年是我们首次将 NVIDIA GPU 以外的其他异构计算平台引入到课程和实验中,欢迎你给我们分享你的体验,对于昇腾 NPU 的使用体验或者相关开发语言(Ascend C、Triton-ascend、TileLang-ascend)的使用体验等(锐评也可以,不会扣分的!)。 + +## 提交要求 + +需要提交: + +1. **实现代码**:所选开发路径对应的完整目录; +2. **实验报告**:单独的 PDF 文件。 + +请在课程平台对应的 Lab 3.5 任务中分别上传代码目录和报告 PDF;具体文件名与上传入口以任务开放时的页面说明为准。 + +代码上传规则如下: + +| 开发路径 | 上传目录 | 平台放置位置 | +| --- | --- | --- | +| Ascend C | `src/ascendc/` | `src/ascendc/` | +| Triton-Ascend | `src/triton/` | `src/triton/` | +| TileLang-Ascend | `src/tilelang/` | `src/tilelang/` | + +新增辅助文件必须位于所选路径目录内,并保证代码能在课程提供的干净环境中构建和运行。 + +请勿提交: + +- `checker/`、`env.sh` 或对这些文件的修改; +- `build_out/`、`dist/`、wheel、custom OPP 安装目录等构建产物; +- `PROF*`、`op_prof/`、`op_sim/`、`prof_out/` 等 profiling 原始目录; +- 测试数据、缓存或其他与实现无关的大文件。 + +## 参考资料 + +### 算法与参考实现 + +- [Root Mean Square Layer Normalization](https://arxiv.org/abs/1910.07467) +- [FlashInfer: Kernel Library for LLM Serving](https://github.com/flashinfer-ai/flashinfer) +- [FlashInfer `fused_add_rmsnorm` 文档](https://docs.flashinfer.ai/generated/flashinfer.norm.fused_add_rmsnorm.html) + +### Ascend C 与性能分析 + +- [Ascend C 开发文档](https://www.hiascend.com/document/detail/zh/canncommercial/80RC31alpha001/devguide/ascendc) +- [Ascend C API 参考](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/ascendcopapi/atlasascendc_api_07_0003.html) +- [Ascend C 最佳实践](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/850alpha002/opdevg/ascendcbestP/atlas_ascendc_best_practices_10_0031.html) +- [msProf 算子调优工具](https://www.hiascend.com/document/detail/en/canncommercial/850/devaids/optool/atlasopdev_16_0082.html) +- [CANN 软件下载与文档](https://www.hiascend.com/software/cann) + +### 其他开发路径 + +- [Triton 文档](https://triton-lang.org/) +- [triton-ascend](https://github.com/triton-ascend/triton-ascend) +- [TileLang 文档](https://tilelang.com/) +- [tilelang-ascend](https://github.com/tile-ai/tilelang-ascend) diff --git a/src/lab3p5/.gitignore b/src/lab3p5/.gitignore new file mode 100644 index 00000000..202a7200 --- /dev/null +++ b/src/lab3p5/.gitignore @@ -0,0 +1,4 @@ +build*/ +*egg*/ +.whl +__pycache__/ diff --git a/src/lab3p5/README.md b/src/lab3p5/README.md new file mode 100644 index 00000000..04e5b696 --- /dev/null +++ b/src/lab3p5/README.md @@ -0,0 +1,56 @@ +# FusedAddRmsNorm(Lab 3.5) + +请选择 Ascend C、Triton-Ascend 或 TileLang-Ascend 中的一种实现 `fused_add_rmsnorm`。正式评测会使用隐藏 case,请勿针对公开 shape 硬编码。 + +## 提交 NPU 任务 + +在 `lab3p5/` 根目录使用 `hpc submit` 将任务提交到 `lab3p5` NPU 分区。任务默认使用当前目录作为工作目录。 + +### Ascend C + +```bash +hpc submit -p lab3p5 bash checker/run.sh # 正确性测试 +hpc submit -p lab3p5 bash checker/profile.sh # 性能测试 +``` + +主要修改 `src/ascendc/op_kernel/` 和 `src/ascendc/op_host/` 下的算子代码。 + +### Triton-Ascend + +```bash +hpc submit -p lab3p5 -e LANG=triton bash checker/run.sh +hpc submit -p lab3p5 -e LANG=triton bash checker/profile.sh +``` + +实现文件:`src/triton/fused_add_rmsnorm.py`。 + +### TileLang-Ascend + +```bash +hpc submit -p lab3p5 -e LANG=tilelang bash checker/run.sh +hpc submit -p lab3p5 -e LANG=tilelang bash checker/profile.sh +``` + +实现文件:`src/tilelang/fused_add_rmsnorm.py`。 + +如需后台提交,可添加 `-d`,再使用 `hpc logs -f ` 查看日志。 + +## Checker 说明 + +- `checker/run.sh` 只执行正确性测试;不传参数时运行全部公开 case。 +- `hpc submit -p lab3p5 bash checker/run.sh 2` 可单独运行 case 2,即 `256×1024`。 +- `checker/profile.sh` 只测试并输出 student 算子的性能。 +- 性能测试固定使用 case 2(`256×1024`),不接受 case 参数。 +- 性能采集使用 `msprof op --warm-up=10`,最终输出一次 `Task Duration(us)`。 + +## 提交代码 + +验证完成后,通过 HPC101 平台上传所选语言对应的整个目录: + +| 实现 | 提交目录 | +| --- | --- | +| Ascend C | `src/ascendc/` | +| Triton-Ascend | `src/triton/` | +| TileLang-Ascend | `src/tilelang/` | + +只提交其中一个实现目录。不要提交 `checker/`、`env.sh`、`README.md`、构建产物或 profiling 输出目录。 diff --git a/src/lab3p5/checker/build.sh b/src/lab3p5/checker/build.sh new file mode 100644 index 00000000..887553a8 --- /dev/null +++ b/src/lab3p5/checker/build.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Build + install the FusedAddRmsNorm Ascend C op AND the pybind extension. +# Run AFTER `source env.sh` (from the kit root). Lives under `checker/` now; +# ROOT still resolves to the kit root (parent of this dir) so paths match the +# runtime layout the README documents. +# +# IMPORTANT: this script runs in a subshell, so the custom_opp set_env.bash it +# sources (registers the aclnn op with libopapi.so via ASCEND_CUSTOM_OPP_PATH +# / LD_LIBRARY_PATH) does NOT leak to the caller. After this returns, either +# `source ./env.sh` again, or `source $CUSTOM_OPP_HOME/vendors/customize/bin/ +# set_env.bash` to make aclnnFusedAddRmsNorm resolvable at runtime. run.sh does +# the former automatically. +set -e +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT/checker" + +OP_DIR="$ROOT/src/ascendc" +export CUSTOM_OPP_HOME="${CUSTOM_OPP_HOME:-$HOME/custom_opp}" +# env.sh must be sourced first so the system CANN (ASCEND_TOOLKIT_HOME) is on +# PATH — we don't second-guess its location here. +: "${ASCEND_TOOLKIT_HOME:?env.sh not sourced — run 'source ./env.sh' first (ASCEND_TOOLKIT_HOME unset)}" + +echo "=== [build] patch op CMakePresets -> system CANN ===" +python3 - <", cv["ASCEND_CANN_PACKAGE_PATH"]["value"]) +PY + +echo "=== [build] build + install custom op ===" +cd "$OP_DIR" +rm -rf build_out +export ASCEND_HOME_PATH="${ASCEND_HOME_PATH:-$ASCEND_TOOLKIT_HOME}" +export DDK_PATH="$ASCEND_HOME_PATH" +export NPU_HOST_LIB="$ASCEND_HOME_PATH/$(arch)-$(uname -s | tr '[:upper:]' '[:lower:]')/devlib" +bash build_op.sh 2>&1 | tail -6 +RUN_PKG="$(ls build_out/custom_opp_*.run 2>/dev/null | head -1)" +[[ -z "$RUN_PKG" ]] && { echo "[build] no .run produced"; exit 1; } +"$RUN_PKG" --quiet --install-path="$CUSTOM_OPP_HOME" 2>&1 | tail -2 +# set_env.bash (generated above) already prepends op_api/lib to LD_LIBRARY_PATH +# and sets ASCEND_CUSTOM_OPP_PATH — no manual LD_LIBRARY_PATH poking needed. +# shellcheck disable=SC1091 +source "$CUSTOM_OPP_HOME/vendors/customize/bin/set_env.bash" +export CUSTOM_OPP_SOURCED=1 + +echo "=== [build] build + install pybind wheel ===" +cd "$OP_DIR" +# setup.py + extension/custom_op.cpp + common/pytorch_npu_helper.hpp all live +# under src/ascendc/ now (setup.py is a sibling of extension/ and common/). +python3 setup.py build bdist_wheel +pip3 install dist/custom_ops-*.whl --force-reinstall --no-deps + +echo "[build] done." diff --git a/src/lab3p5/checker/case_specs.py b/src/lab3p5/checker/case_specs.py new file mode 100644 index 00000000..7b1975d9 --- /dev/null +++ b/src/lab3p5/checker/case_specs.py @@ -0,0 +1,18 @@ +"""Public case specifications for FusedAddRmsNorm. + +Each case is just a spec — inputs are generated on the fly from `seed` (so the +kit ships NO .bin data), and the golden is computed in-process (fp32, then cast +fp16) by test_op.py. The judge swaps this file for a hidden case_specs.py with +different shapes; test_op.py itself never changes. + +Tuple layout: (B, H, eps, data_range, seed) + data_range in {"S": (-1,1), "M": (1,10), "L": (-1000,1000)} +""" + +CASES = [ + (32, 4096, 1e-6, "S", 1001), # small, aligned + (256, 1024, 1e-6, "S", 1002), # regular, aligned + (1, 4096, 1e-6, "S", 1003), # single row — scalar-bound + (1997, 3037, 1e-6, "S", 1004), # misaligned B + misaligned H (tail handling) + (2048, 4096, 1e-6, "S", 1005), # large, aligned +] diff --git a/src/lab3p5/checker/get_time.py b/src/lab3p5/checker/get_time.py new file mode 100644 index 00000000..a8d65cf8 --- /dev/null +++ b/src/lab3p5/checker/get_time.py @@ -0,0 +1,48 @@ +"""Read the single Task Duration(us) produced by ``msprof op``. + +``msprof op`` performs warm-up internally and writes one selected operator to +``OPPROF_*/OpBasicInfo.csv``. This parser deliberately rejects zero or multiple +rows instead of silently mixing different operators or shapes. + +Usage: + python3 checker/get_time.py +""" +import csv +import sys +from pathlib import Path + +def read_task_duration(root: Path) -> float: + csv_paths = sorted(root.rglob("OpBasicInfo.csv")) + if len(csv_paths) != 1: + raise RuntimeError( + f"expected one OpBasicInfo.csv under {root}, found {len(csv_paths)}" + ) + + with csv_paths[0].open("r", encoding="utf-8-sig", newline="") as f: + rows = list(csv.DictReader(f)) + durations = [ + row.get("Task Duration(us)", "").strip() + for row in rows + if row.get("Task Duration(us)", "").strip() + ] + if len(durations) != 1: + raise RuntimeError( + f"expected one Task Duration(us) in {csv_paths[0]}, found {len(durations)}" + ) + return float(durations[0]) + + +def main(): + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} ", file=sys.stderr) + sys.exit(2) + try: + duration = read_task_duration(Path(sys.argv[1])) + except (OSError, ValueError, RuntimeError) as exc: + print(f"[ERROR] {exc}", file=sys.stderr) + sys.exit(1) + print(f"{duration:.4f}") + + +if __name__ == "__main__": + main() diff --git a/src/lab3p5/checker/profile.sh b/src/lab3p5/checker/profile.sh new file mode 100755 index 00000000..c4e8572d --- /dev/null +++ b/src/lab3p5/checker/profile.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# FusedAddRmsNorm — single-operator performance test (msprof op). +# +# Measures the student's operator only. NO correctness check here — use run.sh +# for that. +# +# Performance is measured on case 2 only (B=256, H=1024; one-based case ID). +# Usage (from anywhere — the script resolves the kit root itself): +# bash checker/profile.sh # Ascend C, case 2 +# LANG=triton bash checker/profile.sh # Triton, case 2 +# LANG=tilelang bash checker/profile.sh # TileLang, case 2 +set -e +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +if (( $# != 0 )); then + echo "[ERROR] profile.sh always profiles public case 2; no case argument is accepted." >&2 + exit 2 +fi +# Every `hpc submit` starts a fresh container, so always activate the complete +# CANN/Python/custom-OPP environment in this shell. +# shellcheck disable=SC1091 +source "$ROOT/env.sh" + +LANG="${LANG:-ascendc}" +# Resolve the backend. `LANG` doubles as the POSIX locale var on locale-enabled +# images (here it's exported as zh_CN.UTF-8), so a strict `== ascendc` check +# would wrongly skip the Ascend C build. See checker/run.sh for the rationale. +case "$LANG" in + triton|tilelang) BACKEND="$LANG"; NEED_BUILD=0 ;; + *) BACKEND="ascendc"; NEED_BUILD=1 ;; +esac +export PYTHONPATH="$ROOT:$ROOT/checker:${PYTHONPATH:-}" +PROFILE_CASE_NUM=2 +PROFILE_SHAPE="256x1024" +PYTHON_BIN="$(python3 -c 'import sys; print(sys.executable)')" + +# Ascend C needs the op + wheel installed in the current HPC container. A wheel +# left in the shared directory by an earlier job does not imply that its Python +# extension is installed in this fresh container. +if (( NEED_BUILD )); then + if ! python3 -c "import custom_ops_lib" >/dev/null 2>&1; then + bash checker/build.sh + fi + # build.sh runs in a subshell, so re-source the generated custom OPP env. + # shellcheck disable=SC1091 + source "$ROOT/env.sh" +fi + +echo "############################## STUDENT OP ($BACKEND) ##############################" +echo "=== [profile] student:$BACKEND case $PROFILE_CASE_NUM ($PROFILE_SHAPE) under msprof op ===" +PROF_DIR="prof_out" +rm -rf "$PROF_DIR" +mkdir -p "$PROF_DIR" +if ! LANG="$BACKEND" timeout 180 msprof op \ + --warm-up=10 \ + --output="$ROOT/$PROF_DIR" \ + "$PYTHON_BIN" checker/test_op.py --profile "$PROFILE_CASE_NUM"; then + echo "[ERROR] msprof op failed for student:$BACKEND" >&2 + exit 1 +fi +if ! STUDENT_US=$(python3 checker/get_time.py "$ROOT/$PROF_DIR"); then + echo "[ERROR] failed to read Task Duration for student:$BACKEND" >&2 + exit 1 +fi + +echo "" +echo "=========================== SUMMARY ===========================" +printf " student (%s): %s us\n" "$BACKEND" "$STUDENT_US" + +if [[ "$STUDENT_US" == "0.0000" ]]; then + echo " [ERROR] student op reported zero Task Duration" + exit 1 +fi +echo "Performance profiling complete." diff --git a/src/lab3p5/checker/run.sh b/src/lab3p5/checker/run.sh new file mode 100755 index 00000000..134c1a7a --- /dev/null +++ b/src/lab3p5/checker/run.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# FusedAddRmsNorm — functional / correctness test (NO profiling). +# +# Runs `checker/test_op.py` (generates inputs from seed, fp32 golden, compares). +# Use `bash checker/profile.sh` for msprof performance numbers. +# +# Usage (from anywhere — the script resolves the kit root itself): +# bash checker/run.sh # Ascend C: all cases +# LANG=triton bash checker/run.sh # Triton: all cases (no build) +# LANG=tilelang bash checker/run.sh # TileLang: all cases (no build) +# bash checker/run.sh # single case +set -e +ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" +# Every `hpc submit` starts a fresh container, so always activate the complete +# CANN/Python/custom-OPP environment in this shell. +# shellcheck disable=SC1091 +source "$ROOT/env.sh" + +LANG="${LANG:-ascendc}" +# Resolve the backend. `LANG` doubles as the POSIX locale var on locale-enabled +# images (here it's exported as zh_CN.UTF-8), so a strict `== ascendc` check +# would wrongly skip the Ascend C build. test_op.py only special-cases +# triton/tilelang and treats everything else as ascendc — mirror that: only +# those two values take the no-build path; any other value (incl. a locale) +# is the Ascend C default. This keeps `LANG=triton bash run.sh` (README) working. +case "$LANG" in + triton|tilelang) BACKEND="$LANG"; NEED_BUILD=0 ;; + *) BACKEND="ascendc"; NEED_BUILD=1 ;; +esac +export PYTHONPATH="$ROOT:$ROOT/checker:${PYTHONPATH:-}" +CASE_NUM="${1:-}" + +# Ascend C needs the op + wheel installed in the current HPC container. A wheel +# left in the shared directory by an earlier job is not enough. +if (( NEED_BUILD )); then + if ! python3 -c "import custom_ops_lib" >/dev/null 2>&1; then + bash checker/build.sh + fi + # build.sh runs in a subshell, so re-source the generated custom OPP env. + # shellcheck disable=SC1091 + source "$ROOT/env.sh" +fi + +echo "=== [run] correctness ($BACKEND) ===" +if [[ -n "$CASE_NUM" ]]; then + python3 -u checker/test_op.py "$CASE_NUM" +else + python3 -u checker/test_op.py +fi +echo "=== [run] correctness done ===" diff --git a/src/lab3p5/checker/test_op.py b/src/lab3p5/checker/test_op.py new file mode 100644 index 00000000..02d23df0 --- /dev/null +++ b/src/lab3p5/checker/test_op.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +# coding=utf-8 +"""FusedAddRmsNorm — correctness and single-launch profiling entry. + +Cases are generated on the fly from `case_specs.py` (random inputs by seed) — +NO .bin data ships in the kit. The judge swaps `case_specs.py` for a hidden one +with different shapes; this file itself never changes. + +Flow (mirrors the S9 samples Concat/Transpose): + 1. import custom_ops_lib (the student's built extension / Triton / TileLang) + 2. for each case: generate inputs from seed, run the op on NPU, compare + against the fp32-computed golden + +Profiling mode launches the selected operator exactly once. ``msprof op`` owns +the warm-up/replay loop and writes the final Task Duration to OpBasicInfo.csv. + +Usage (from kit root, after `source ./env.sh`): + python3 checker/test_op.py # run all cases + python3 checker/test_op.py # run a single case + python3 checker/test_op.py --profile # one launch, no verification +""" +import argparse +import os +import sys +import torch +import torch_npu + +# Pick the backend: Ascend C (default, via the pybind wheel), Triton +# (LANG=triton), or TileLang (LANG=tilelang). The latter two are pure Python and +# need no wheel build. +_lang = os.environ.get("LANG", "ascendc").lower() +if _lang in ("triton", "tilelang"): + import importlib + importlib.import_module(f"src.{_lang}") # registers `custom_ops_lib` in sys.modules + import custom_ops_lib +else: + import custom_ops_lib + +torch.npu.config.allow_internal_format = False +torch.npu.set_device(int(os.environ.get("ASCEND_DEVICE_ID", "0"))) + + +# --------------------------------------------------------------------------- +# Case specs (public; judge replaces this module with a hidden one) +# --------------------------------------------------------------------------- +import case_specs # noqa: E402 + + +DATA_RANGES = {"S": (-1.0, 1.0), "M": (1.0, 10.0), "L": (-1000.0, 1000.0)} + + +def gen_inputs(B, H, data_range, seed): + """Deterministic random inputs from seed (reproducible across runs/judge).""" + g = torch.Generator(device="cpu") + g.manual_seed(seed) + lo, hi = DATA_RANGES[data_range] + x = (torch.rand(B, H, generator=g) * (hi - lo) + lo).to(torch.float16) + r = (torch.rand(B, H, generator=g) * (hi - lo) + lo).to(torch.float16) + w = (torch.rand(H, generator=g) * 2.0).clamp(min=0.01).to(torch.float16) + return x, r, w + + +def golden(x, residual, weight, eps): + """fp32 compute then cast fp16 (matches the lab3.5_frame golden).""" + R = residual.float() + x.float() + ms = torch.mean(R * R, dim=-1, keepdim=True) + rms = torch.sqrt(ms + eps) + Y = (R / rms) * weight.float() + return Y.to(torch.float16), R.to(torch.float16) + + +# --------------------------------------------------------------------------- +# Verification (ported verbatim from the upstream checker verify_result.py) +# --------------------------------------------------------------------------- +def verify_result(real, golden_t): + """Element passes if abs_err<=tol OR rel_err<=tol, where rel_err uses + |golden| (clamped to eps) as the denominator — NOT max(|real|,|golden|). + The whole tensor passes only if error_ratio <= 0.0 (zero mismatches), + matching the upstream checker exactly. + """ + if golden_t.dtype == torch.float32: + tol = 1e-4 + else: + tol = 1e-3 + # Match the upstream checker: rel_err = abs_err / |golden| (clamped to eps). + out = real.detach().cpu().to(torch.float64).reshape(-1) + g = golden_t.detach().cpu().to(torch.float64).reshape(-1) + eps = 1e-12 + denom = torch.where(g.abs() < eps, torch.tensor(eps), g.abs()) + abs_err = (out - g).abs() + rel_err = abs_err / denom + pass_check = (abs_err <= tol) | (rel_err <= tol) + error_ratio = float((~pass_check).sum().item()) / g.numel() + # upstream: return error_ratio <= 0.0 + ok = error_ratio <= 0.0 + if not ok: + # show up to 100 failing indices, like the upstream checker + bad = torch.where(~pass_check)[0] + for i, idx in enumerate(bad[:100]): + gv = float(g[idx]); ov = float(out[idx]) + dv = abs(gv) if abs(gv) > eps else eps + print(f" idx={int(idx):06d} expected={gv:.9f} actual={ov:.9f} " + f"rdiff={abs(ov-gv)/dv:.6f}") + print(f" error_ratio={error_ratio:.6f} (tolerance: 0.0000)") + else: + print("test pass") + return ok + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- +def run_case(idx, spec): + B, H, eps, data_range, seed = spec + name = f"case_{idx}" + x, r, w = gen_inputs(B, H, data_range, seed) + gy, gres = golden(x, r, w, eps) # CPU golden + + x_d, r_d, w_d = x.npu(), r.npu(), w.npu() + y, resout = custom_ops_lib.fused_add_rmsnorm(x_d, r_d, w_d, eps) + if y is None: + print(f"[{name}] execution returned None (timeout?)") + return False + y = y.cpu() + resout = resout.cpu() + + ok_y = verify_result(y, gy) + ok_r = verify_result(resout, gres) + print(f"[{name}] {B}x{H} y={'pass' if ok_y else 'FAIL'} " + f"residual_out={'pass' if ok_r else 'FAIL'}") + return ok_y and ok_r + + +def profile_case(idx, spec): + """Launch only the selected op; msprof op performs warm-up and replay.""" + B, H, eps, data_range, seed = spec + x, r, w = gen_inputs(B, H, data_range, seed) + x_d, r_d, w_d = x.npu(), r.npu(), w.npu() + custom_ops_lib.fused_add_rmsnorm(x_d, r_d, w_d, eps) + torch.npu.synchronize() + print(f"[profile] case_{idx} {B}x{H} launched once") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("case_num", nargs="?", type=int) + parser.add_argument( + "--profile", + action="store_true", + help="launch one case once for msprof op; skip golden and verification", + ) + args = parser.parse_args() + + case_num = args.case_num + cases = case_specs.CASES + + if case_num is not None: + # 1-based case number, mirroring S9 test_op.py + i = case_num - 1 + if i < 0 or i >= len(cases): + print(f"[ERROR] case_{case_num} not found (have {len(cases)} cases)") + sys.exit(2) + if args.profile: + profile_case(i, cases[i]) + return + ok = run_case(i, cases[i]) + sys.exit(0 if ok else 1) + + if args.profile: + print("[ERROR] --profile requires a case number") + sys.exit(2) + + all_ok = True + for i, spec in enumerate(cases): + all_ok &= run_case(i, spec) + sys.exit(0 if all_ok else 1) + + +if __name__ == "__main__": + main() diff --git a/src/lab3p5/env.sh b/src/lab3p5/env.sh new file mode 100644 index 00000000..d4275de4 --- /dev/null +++ b/src/lab3p5/env.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# lab3.5 student kit — environment activation. +# Source from the kit root: source ./env.sh +# +# Activates the system CANN toolkit and ensures python3 is on PATH. Relies only +# on system-level paths under /usr/local/Ascend and /usr/local/python* — no +# hard-coded home directories, no competition-specific conda env. +# +# NOTE: this file is *sourced* into an interactive shell, so do NOT add `set -e` +# here — it would leak into the caller's shell and terminate it on the first +# non-zero return. + +_KIT_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" + +# --- 1. System CANN toolkit ------------------------------------------------- +# The image may expose `msprof` without the full runtime library paths (notably +# libhccl.so). Therefore command availability is not a sufficient activation +# check. Source set_env.sh once per shell, preferring the `cann` symlink. +if [[ -z "${_LAB3P5_CANN_ENV_SOURCED:-}" ]]; then + for _set_env in \ + /usr/local/Ascend/cann/set_env.sh \ + /usr/local/Ascend/ascend-toolkit/latest/set_env.sh \ + /usr/local/Ascend/cann-8.5.0/set_env.sh; do + if [[ -f "$_set_env" ]]; then + # shellcheck disable=SC1090 + source "$_set_env" + _LAB3P5_CANN_ENV_SOURCED=1 + break + fi + done + unset _set_env +fi + +# --- 2. Logical NPU device --------------------------------------------------- +export ASCEND_DEVICE_ID="${ASCEND_DEVICE_ID:-0}" + +# --- 3. python3 -------------------------------------------------------------- +# The system interpreter lives outside the default PATH on this image; put it +# back if python3 isn't already resolvable. The kit depends on torch/torch_npu, +# which live in the cp311 site-packages under /usr/local/python3.11.14 — so prefer +# that interpreter before falling back to /usr/bin/python3 (the OS 3.10, which +# has none of the kit packages). /usr/local/bin is kept for cmake/ninja/pip. +if ! command -v python3 >/dev/null 2>&1 || ! python3 -c "import torch, torch_npu" >/dev/null 2>&1; then + for _py in /usr/local/python3.11.14/bin /usr/local/bin /usr/bin; do + if [[ -x "$_py/python3" ]]; then + export PATH="$_py:$PATH" + break + fi + done + unset _py +fi + +# --- 4. Custom operator package (built by build.sh) ------------------------- +# set_env.bash is generated at build time and already exports +# ASCEND_CUSTOM_OPP_PATH plus prepends op_api/lib to LD_LIBRARY_PATH — so we +# only source it. Guard with a flag so re-sourcing doesn't pile up duplicates. +# CUSTOM_OPP_HOME matches build.sh's --install-path (overridable). +export CUSTOM_OPP_HOME="${CUSTOM_OPP_HOME:-$HOME/custom_opp}" +if [[ -z "${CUSTOM_OPP_SOURCED:-}" ]] && [[ -f "$CUSTOM_OPP_HOME/vendors/customize/bin/set_env.bash" ]]; then + # shellcheck disable=SC1091 + source "$CUSTOM_OPP_HOME/vendors/customize/bin/set_env.bash" + export CUSTOM_OPP_SOURCED=1 +fi + +# --- 5. Make the kit importable -------------------------------------------- +# test_op.py imports `case_specs`, `custom_ops_lib`, and `src.` by name. +# `src` lives under the kit root; `case_specs`/`test_op`/`get_time` live under +# the sibling `checker/` dir. Put both on PYTHONPATH so a bare +# `python3 checker/test_op.py` resolves every import. +export PYTHONPATH="$_KIT_ROOT:$_KIT_ROOT/checker${PYTHONPATH:+:$PYTHONPATH}" + +# --- 6. Sanity checks (loud, not silent) ----------------------------------- +if [[ -z "${ASCEND_TOOLKIT_HOME:-}" ]]; then + echo "[env.sh] ERROR: ASCEND_TOOLKIT_HOME is unset — no CANN set_env.sh found under /usr/local/Ascend" >&2 +fi +if ! command -v python3 >/dev/null 2>&1; then + echo "[env.sh] ERROR: python3 not found on PATH" >&2 +fi + +echo "[env.sh] CANN=${ASCEND_TOOLKIT_HOME:-?} device=${ASCEND_DEVICE_ID} python=$(command -v python3 || echo '?')" +unset _KIT_ROOT diff --git a/src/lab3p5/src/__init__.py b/src/lab3p5/src/__init__.py new file mode 100644 index 00000000..208a5474 --- /dev/null +++ b/src/lab3p5/src/__init__.py @@ -0,0 +1 @@ +"""Marker so `src` is a package and `src.` is importable.""" diff --git a/src/lab3p5/src/ascendc/CMakeLists.txt b/src/lab3p5/src/ascendc/CMakeLists.txt new file mode 100644 index 00000000..4e82197c --- /dev/null +++ b/src/lab3p5/src/ascendc/CMakeLists.txt @@ -0,0 +1,31 @@ +# ---------------------------------------------------------------------------------------------------------- +# Copyright (c) 2025 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. +# ---------------------------------------------------------------------------------------------------------- + + +cmake_minimum_required(VERSION 3.16.0) +project(opp) +find_package(ASC REQUIRED) +set(package_name ${vendor_name}) + +npu_op_package(${package_name} + TYPE RUN + CONFIG + INSTALL_PATH ${CMAKE_BINARY_DIR}/ +) + +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/framework) + add_subdirectory(framework) +endif() +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/op_host) + add_subdirectory(op_host) +endif() +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/op_kernel) + add_subdirectory(op_kernel) +endif() \ No newline at end of file diff --git a/src/lab3p5/src/ascendc/CMakePresets.json b/src/lab3p5/src/ascendc/CMakePresets.json new file mode 100644 index 00000000..21212bb5 --- /dev/null +++ b/src/lab3p5/src/ascendc/CMakePresets.json @@ -0,0 +1,67 @@ +{ + "version": 1, + "cmakeMinimumRequired": { + "major": 3, + "minor": 16, + "patch": 0 + }, + "configurePresets": [ + { + "name": "default", + "displayName": "Default Config", + "description": "Default build using Unix Makefiles generator", + "generator": "Unix Makefiles", + "binaryDir": "${sourceDir}/build_out", + "cacheVariables": { + "CMAKE_BUILD_TYPE": { + "type": "STRING", + "value": "Release" + }, + "ENABLE_SOURCE_PACKAGE": { + "type": "BOOL", + "value": "True" + }, + "ENABLE_BINARY_PACKAGE": { + "type": "BOOL", + "value": "True" + }, + "ASCEND_COMPUTE_UNIT": { + "type": "STRING", + "value": "ascend910b" + }, + "ENABLE_TEST": { + "type": "BOOL", + "value": "True" + }, + "vendor_name": { + "type": "STRING", + "value": "customize" + }, + "ASCEND_CANN_PACKAGE_PATH": { + "type": "PATH", + "value": "/usr/local/Ascend/cann-8.5.0" + }, + "ASCEND_PYTHON_EXECUTABLE": { + "type": "STRING", + "value": "python3" + }, + "CMAKE_INSTALL_PREFIX": { + "type": "PATH", + "value": "${sourceDir}/build_out" + }, + "ENABLE_CROSS_COMPILE": { + "type": "BOOL", + "value": "False" + }, + "CMAKE_CROSS_PLATFORM_COMPILER": { + "type": "PATH", + "value": "/usr/bin/aarch64-linux-gnu-g++" + }, + "ASCEND_PACK_SHARED_LIBRARY": { + "type": "BOOL", + "value": "False" + } + } + } + ] +} \ No newline at end of file diff --git a/src/lab3p5/src/ascendc/build_op.sh b/src/lab3p5/src/ascendc/build_op.sh new file mode 100755 index 00000000..9759204f --- /dev/null +++ b/src/lab3p5/src/ascendc/build_op.sh @@ -0,0 +1,39 @@ +#!/bin/bash +if [ -z "$BASE_LIBS_PATH" ]; then + if [ -z "$ASCEND_HOME_PATH" ]; then + if [ -z "$ASCEND_AICPU_PATH" ]; then + echo "please set env." + exit 1 + else + export ASCEND_HOME_PATH=$ASCEND_AICPU_PATH + fi + else + export ASCEND_HOME_PATH=$ASCEND_HOME_PATH + fi +else + export ASCEND_HOME_PATH=$BASE_LIBS_PATH +fi +echo "using ASCEND_HOME_PATH: $ASCEND_HOME_PATH" +script_path=$(realpath $(dirname $0)) + +BUILD_DIR="build_out" +HOST_NATIVE_DIR="host_native_tiling" +mkdir -p build_out +rm -rf build_out/* + +ENABLE_CROSS="-DENABLE_CROSS_COMPILE=True" +ENABLE_BINARY="-DENABLE_BINARY_PACKAGE=True" +ENABLE_LIBRARY="-DASCEND_PACK_SHARED_LIBRARY=True" +cmake_version=$(cmake --version | grep "cmake version" | awk '{print $3}') + +target=package +if [ "$1"x != ""x ]; then target=$1; fi + +cmake -S . -B "$BUILD_DIR" --preset=default +cmake --build "$BUILD_DIR" --target binary -j$(nproc) +cmake --build "$BUILD_DIR" --target $target -j$(nproc) + +# Install path mirrors build.sh / env.sh (CUSTOM_OPP_HOME, plural). Falling back +# to $HOME/custom_opp keeps a bare `bash build_op.sh` self-consistent. +INSTALL_PATH="${CUSTOM_OPP_HOME:-$HOME/custom_opp}" +"$BUILD_DIR/custom_opp_ubuntu_aarch64.run" --quiet --install-path="$INSTALL_PATH" \ No newline at end of file diff --git a/src/lab3p5/src/ascendc/common/pytorch_npu_helper.hpp b/src/lab3p5/src/ascendc/common/pytorch_npu_helper.hpp new file mode 100644 index 00000000..6414dfa5 --- /dev/null +++ b/src/lab3p5/src/ascendc/common/pytorch_npu_helper.hpp @@ -0,0 +1,583 @@ +/****************************************************************************** + * Copyright (c) 2022 Huawei Technologies Co., Ltd + * All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +#ifndef PYTORCH_NPU_HELPER_HPP_ +#define PYTORCH_NPU_HELPER_HPP_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#include "torch_npu/csrc/aten/NPUNativeFunctions.h" +#include "torch_npu/csrc/core/npu/NPUStream.h" +#include "torch_npu/csrc/framework/OpCommand.h" +#include "torch_npu/csrc/framework/interface/EnvVariables.h" +#include "torch_npu/csrc/framework/utils/CalcuOpUtil.h" +#include "torch_npu/csrc/framework/utils/OpPreparation.h" + +#define NPU_NAME_SPACE at_npu::native + +#define __FILENAME__ (strrchr("/" __FILE__, '/') + 1) + +typedef struct aclOpExecutor aclOpExecutor; +typedef struct aclTensor aclTensor; +typedef struct aclScalar aclScalar; +typedef struct aclIntArray aclIntArray; +typedef struct aclFloatArray aclFloatArray; +typedef struct aclBoolArray aclBoolArray; +typedef struct aclTensorList aclTensorList; + +typedef aclTensor *(*_aclCreateTensor)( + const int64_t *view_dims, uint64_t view_dims_num, aclDataType data_type, + const int64_t *stride, int64_t offset, aclFormat format, + const int64_t *storage_dims, uint64_t storage_dims_num, void *tensor_data); +typedef aclScalar *(*_aclCreateScalar)(void *value, aclDataType data_type); +typedef aclIntArray *(*_aclCreateIntArray)(const int64_t *value, uint64_t size); +typedef aclFloatArray *(*_aclCreateFloatArray)(const float *value, + uint64_t size); +typedef aclBoolArray *(*_aclCreateBoolArray)(const bool *value, uint64_t size); +typedef aclTensorList *(*_aclCreateTensorList)(const aclTensor *const *value, + uint64_t size); + +typedef int (*_aclDestroyTensor)(const aclTensor *tensor); +typedef int (*_aclDestroyScalar)(const aclScalar *scalar); +typedef int (*_aclDestroyIntArray)(const aclIntArray *array); +typedef int (*_aclDestroyFloatArray)(const aclFloatArray *array); +typedef int (*_aclDestroyBoolArray)(const aclBoolArray *array); +typedef int (*_aclDestroyTensorList)(const aclTensorList *array); + +constexpr int kHashBufSize = 8192; +constexpr int kHashBufMaxSize = kHashBufSize + 1024; +extern thread_local char g_hashBuf[kHashBufSize]; +extern thread_local int g_hashOffset; + + +#define AT_ALL_SCALAR_TYPE_AND_ACL_DATATYPE_PAIR(_) \ + _(at::ScalarType::Byte, ACL_UINT8) \ + _(at::ScalarType::Char, ACL_INT8) \ + _(at::ScalarType::Short, ACL_INT16) \ + _(at::ScalarType::Int, ACL_INT32) \ + _(at::ScalarType::Long, ACL_INT64) \ + _(at::ScalarType::Half, ACL_FLOAT16) \ + _(at::ScalarType::Float, ACL_FLOAT) \ + _(at::ScalarType::Double, ACL_DOUBLE) \ + _(at::ScalarType::ComplexHalf, ACL_DT_UNDEFINED) \ + _(at::ScalarType::ComplexFloat, ACL_COMPLEX64) \ + _(at::ScalarType::ComplexDouble, ACL_COMPLEX128) \ + _(at::ScalarType::Bool, ACL_BOOL) \ + _(at::ScalarType::QInt8, ACL_DT_UNDEFINED) \ + _(at::ScalarType::QUInt8, ACL_DT_UNDEFINED) \ + _(at::ScalarType::QInt32, ACL_DT_UNDEFINED) \ + _(at::ScalarType::BFloat16, ACL_BF16) \ + _(at::ScalarType::QUInt4x2, ACL_DT_UNDEFINED) \ + _(at::ScalarType::QUInt2x4, ACL_DT_UNDEFINED) \ + _(at::ScalarType::Undefined, ACL_DT_UNDEFINED) \ + _(at::ScalarType::NumOptions, ACL_DT_UNDEFINED) + +constexpr aclDataType kATenScalarTypeToAclDataTypeTable + [static_cast(at::ScalarType::NumOptions) + 1] = { +#define DEFINE_ENUM(_1, n) n, + AT_ALL_SCALAR_TYPE_AND_ACL_DATATYPE_PAIR(DEFINE_ENUM) +#undef DEFINE_ENUM +}; + +#define GET_OP_API_FUNC(apiName) \ + reinterpret_cast<_##apiName>(GetOpApiFuncAddr(#apiName)) + +#define MEMCPY_TO_BUF(data_expression, size_expression) \ + if (g_hashOffset + (size_expression) > kHashBufSize) { \ + g_hashOffset = kHashBufMaxSize; \ + return; \ + } \ + memcpy(g_hashBuf + g_hashOffset, data_expression, size_expression); \ + g_hashOffset += size_expression; + +inline const char *GetOpApiLibName(void) { return "libopapi.so"; } + +inline const char *GetCustOpApiLibName(void) { return "libcust_opapi.so"; } + +inline void *GetOpApiFuncAddrInLib(void *handler, const char *libName, + const char *apiName) { + auto funcAddr = dlsym(handler, apiName); + if (funcAddr == nullptr) { + ASCEND_LOGW("dlsym %s from %s failed, error:%s.", apiName, libName, + dlerror()); + } + return funcAddr; +} + +inline void *GetOpApiLibHandler(const char *libName) { + auto handler = dlopen(libName, RTLD_LAZY); + if (handler == nullptr) { + ASCEND_LOGW("dlopen %s failed, error:%s.", libName, dlerror()); + } + return handler; +} + +inline void *GetOpApiFuncAddr(const char *apiName) { + static auto custOpApiHandler = GetOpApiLibHandler(GetCustOpApiLibName()); + if (custOpApiHandler != nullptr) { + auto funcAddr = + GetOpApiFuncAddrInLib(custOpApiHandler, GetCustOpApiLibName(), apiName); + if (funcAddr != nullptr) { + return funcAddr; + } + } + + static auto opApiHandler = GetOpApiLibHandler(GetOpApiLibName()); + if (opApiHandler == nullptr) { + return nullptr; + } + return GetOpApiFuncAddrInLib(opApiHandler, GetOpApiLibName(), apiName); +} + +inline c10::Scalar ConvertTensorToScalar(const at::Tensor &tensor) { + c10::Scalar expScalar; + const at::Tensor *aclInput = &tensor; + if (aclInput->scalar_type() == at::ScalarType::Double) { + double value = *(double *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::Long) { + int64_t value = *(int64_t *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::Float) { + float value = *(float *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::Int) { + int value = *(int *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::Half) { + c10::Half value = *(c10::Half *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::Bool) { + int8_t value = *(int8_t *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::ComplexDouble) { + c10::complex value = *(c10::complex *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::ComplexFloat) { + c10::complex value = *(c10::complex *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } else if (aclInput->scalar_type() == at::ScalarType::BFloat16) { + c10::BFloat16 value = *(c10::BFloat16 *)aclInput->data_ptr(); + c10::Scalar scalar(value); + expScalar = scalar; + } + return expScalar; +} + +inline at::Tensor CopyTensorHostToDevice(const at::Tensor &cpu_tensor) { + at::Tensor cpuPinMemTensor = cpu_tensor.pin_memory(); + int deviceIndex = 0; + return cpuPinMemTensor.to(c10::Device(torch_npu::utils::get_npu_device_type(), deviceIndex), + cpuPinMemTensor.scalar_type(), true, true); +} + +inline at::Tensor CopyScalarToDevice(const c10::Scalar &cpu_scalar, + at::ScalarType scalar_data_type) { + return CopyTensorHostToDevice( + scalar_to_tensor(cpu_scalar).to(scalar_data_type)); +} + +inline aclTensor *ConvertType(const at::Tensor &at_tensor) { + static const auto aclCreateTensor = GET_OP_API_FUNC(aclCreateTensor); + if (aclCreateTensor == nullptr) { + return nullptr; + } + + if (!at_tensor.defined()) { + return nullptr; + } + at::ScalarType scalar_data_type = at_tensor.scalar_type(); + aclDataType acl_data_type = + kATenScalarTypeToAclDataTypeTable[static_cast(scalar_data_type)]; + TORCH_CHECK( + acl_data_type != ACL_DT_UNDEFINED, + std::string(c10::toString(scalar_data_type)) + " has not been supported") + c10::SmallVector storageDims; + // if acl_data_type is ACL_STRING, storageDims is empty. + auto itemsize = at_tensor.itemsize(); + if (itemsize == 0) { + AT_ERROR("When ConvertType, tensor item size of cannot be zero."); + return nullptr; + } + if (acl_data_type != ACL_STRING) { + storageDims.push_back(at_tensor.storage().nbytes() / itemsize); + } + + const auto dimNum = at_tensor.sizes().size(); + aclFormat format = ACL_FORMAT_ND; + switch (dimNum) { + case 3: + format = ACL_FORMAT_NCL; + break; + case 4: + format = ACL_FORMAT_NCHW; + break; + case 5: + format = ACL_FORMAT_NCDHW; + break; + default: + format = ACL_FORMAT_ND; + } + + if (at_tensor.unsafeGetTensorImpl()->is_wrapped_number()) { + c10::Scalar expScalar = ConvertTensorToScalar(at_tensor); + at::Tensor aclInput = CopyScalarToDevice(expScalar, scalar_data_type); + return aclCreateTensor(aclInput.sizes().data(), aclInput.sizes().size(), + acl_data_type, aclInput.strides().data(), + aclInput.storage_offset(), format, + storageDims.data(), storageDims.size(), + const_cast(aclInput.storage().data())); + } + + auto acl_tensor = aclCreateTensor( + at_tensor.sizes().data(), at_tensor.sizes().size(), acl_data_type, + at_tensor.strides().data(), at_tensor.storage_offset(), format, + storageDims.data(), storageDims.size(), + const_cast(at_tensor.storage().data())); + return acl_tensor; +} + +inline aclScalar *ConvertType(const at::Scalar &at_scalar) { + static const auto aclCreateScalar = GET_OP_API_FUNC(aclCreateScalar); + if (aclCreateScalar == nullptr) { + return nullptr; + } + + at::ScalarType scalar_data_type = at_scalar.type(); + aclDataType acl_data_type = + kATenScalarTypeToAclDataTypeTable[static_cast(scalar_data_type)]; + TORCH_CHECK( + acl_data_type != ACL_DT_UNDEFINED, + std::string(c10::toString(scalar_data_type)) + " has not been supported") + aclScalar *acl_scalar = nullptr; + switch (scalar_data_type) { + case at::ScalarType::Double: { + double value = at_scalar.toDouble(); + acl_scalar = aclCreateScalar(&value, acl_data_type); + break; + } + case at::ScalarType::Long: { + int64_t value = at_scalar.toLong(); + acl_scalar = aclCreateScalar(&value, acl_data_type); + break; + } + case at::ScalarType::Bool: { + bool value = at_scalar.toBool(); + acl_scalar = aclCreateScalar(&value, acl_data_type); + break; + } + case at::ScalarType::ComplexDouble: { + auto value = at_scalar.toComplexDouble(); + acl_scalar = aclCreateScalar(&value, acl_data_type); + break; + } + default: + acl_scalar = nullptr; + break; + } + return acl_scalar; +} + +inline aclIntArray *ConvertType(const at::IntArrayRef &at_array) { + static const auto aclCreateIntArray = GET_OP_API_FUNC(aclCreateIntArray); + if (aclCreateIntArray == nullptr) { + return nullptr; + } + auto array = aclCreateIntArray(at_array.data(), at_array.size()); + return array; +} + +template +inline aclBoolArray *ConvertType(const std::array &value) { + static const auto aclCreateBoolArray = GET_OP_API_FUNC(aclCreateBoolArray); + if (aclCreateBoolArray == nullptr) { + return nullptr; + } + + auto array = aclCreateBoolArray(value.data(), value.size()); + return array; +} + +inline aclBoolArray *ConvertType(const at::ArrayRef &value) { + static const auto aclCreateBoolArray = GET_OP_API_FUNC(aclCreateBoolArray); + if (aclCreateBoolArray == nullptr) { + return nullptr; + } + + auto array = aclCreateBoolArray(value.data(), value.size()); + return array; +} + +inline aclTensorList *ConvertType(const at::TensorList &at_tensor_list) { + static const auto aclCreateTensorList = GET_OP_API_FUNC(aclCreateTensorList); + if (aclCreateTensorList == nullptr) { + return nullptr; + } + + std::vector tensor_list(at_tensor_list.size()); + for (size_t i = 0; i < at_tensor_list.size(); i++) { + tensor_list[i] = ConvertType(at_tensor_list[i]); + } + auto acl_tensor_list = + aclCreateTensorList(tensor_list.data(), tensor_list.size()); + return acl_tensor_list; +} + +inline aclTensor *ConvertType(const c10::optional &opt_tensor) { + if (opt_tensor.has_value() && opt_tensor.value().defined()) { + return ConvertType(opt_tensor.value()); + } + return nullptr; +} + +inline aclIntArray *ConvertType( + const c10::optional &opt_array) { + if (opt_array.has_value()) { + return ConvertType(opt_array.value()); + } + return nullptr; +} + +inline aclScalar *ConvertType(const c10::optional &opt_scalar) { + if (opt_scalar.has_value()) { + return ConvertType(opt_scalar.value()); + } + return nullptr; +} + +inline aclDataType ConvertType(const at::ScalarType scalarType) { + return kATenScalarTypeToAclDataTypeTable[static_cast(scalarType)]; +} + +template +T ConvertType(T value) { + return value; +} + +template +auto ConvertToOpApiFunc(const Tuple ¶ms, void *opApiAddr, + std::index_sequence) { + typedef int (*OpApiFunc)( + typename std::decay(params))>::type...); + auto func = reinterpret_cast(opApiAddr); + return func; +} + +template +auto ConvertToOpApiFunc(const Tuple ¶ms, void *opApiAddr) { + static constexpr auto size = std::tuple_size::value; + return ConvertToOpApiFunc(params, opApiAddr, + std::make_index_sequence{}); +} + +inline void Release(aclTensor *p) { + static const auto aclDestroyTensor = GET_OP_API_FUNC(aclDestroyTensor); + if (aclDestroyTensor == nullptr) { + return; + } + aclDestroyTensor(p); +} + +inline void Release(aclScalar *p) { + static const auto aclDestroyScalar = GET_OP_API_FUNC(aclDestroyScalar); + if (aclDestroyScalar == nullptr) { + return; + } + aclDestroyScalar(p); +} + +inline void Release(aclIntArray *p) { + static const auto aclDestroyIntArray = GET_OP_API_FUNC(aclDestroyIntArray); + if (aclDestroyIntArray == nullptr) { + return; + } + + aclDestroyIntArray(p); +} + +inline void Release(aclBoolArray *p) { + static const auto aclDestroyBoolArray = GET_OP_API_FUNC(aclDestroyBoolArray); + if (aclDestroyBoolArray == nullptr) { + return; + } + + aclDestroyBoolArray(p); +} + +inline void Release(aclTensorList *p) { + static const auto aclDestroyTensorList = + GET_OP_API_FUNC(aclDestroyTensorList); + if (aclDestroyTensorList == nullptr) { + return; + } + + aclDestroyTensorList(p); +} + +template +void Release(T value) { + (void)value; +} + +template +void CallRelease(Tuple t, std::index_sequence) { + (void)std::initializer_list{(Release(std::get(t)), 0)...}; +} + +template +void ReleaseConvertTypes(Tuple &t) { + static constexpr auto size = std::tuple_size::value; + CallRelease(t, std::make_index_sequence{}); +} + +template +constexpr auto ConvertTypes(Ts &... args) { + return std::make_tuple(ConvertType(args)...); +} + +template +auto call(Function f, Tuple t, std::index_sequence) { + return f(std::get(t)...); +} + +template +auto call(Function f, Tuple t) { + static constexpr auto size = std::tuple_size::value; + return call(f, t, std::make_index_sequence{}); +} + +template +void AddParamToBuf(const std::array &value) { + MEMCPY_TO_BUF(value.data(), value.size() * sizeof(bool)); +} + +template +void AddParamToBuf(const T &value) { + MEMCPY_TO_BUF(&value, sizeof(T)); +} + +void AddParamToBuf(const at::Tensor &); +void AddParamToBuf(const at::Scalar &); +void AddParamToBuf(const at::IntArrayRef &); +void AddParamToBuf(const at::ArrayRef &); +void AddParamToBuf(const at::TensorList &); +void AddParamToBuf(const c10::optional &); +void AddParamToBuf(const c10::optional &); +void AddParamToBuf(const c10::optional &); +void AddParamToBuf(const at::ScalarType); +void AddParamToBuf(const string &); +void AddParamToBuf(); + +template +void AddParamToBuf(const T &arg, Args &... args) { + AddParamToBuf(arg); + AddParamToBuf(args...); +} + +uint64_t CalcHashId(); +typedef int (*InitHugeMemThreadLocal)(void *, bool); +typedef void (*UnInitHugeMemThreadLocal)(void *, bool); +typedef void (*ReleaseHugeMem)(void *, bool); + +#define EXEC_NPU_CMD(aclnn_api, ...) \ + do { \ + static const auto getWorkspaceSizeFuncAddr = \ + GetOpApiFuncAddr(#aclnn_api "GetWorkspaceSize"); \ + static const auto opApiFuncAddr = GetOpApiFuncAddr(#aclnn_api); \ + static const auto initMemAddr = \ + GetOpApiFuncAddr("InitHugeMemThreadLocal"); \ + static const auto unInitMemAddr = \ + GetOpApiFuncAddr("UnInitHugeMemThreadLocal"); \ + static const auto releaseMemAddr = GetOpApiFuncAddr("ReleaseHugeMem"); \ + TORCH_CHECK( \ + getWorkspaceSizeFuncAddr != nullptr && opApiFuncAddr != nullptr, \ + #aclnn_api, " or ", #aclnn_api "GetWorkspaceSize", " not in ", \ + GetOpApiLibName(), ", or ", GetOpApiLibName(), "not found."); \ + auto acl_stream = c10_npu::getCurrentNPUStream().stream(false); \ + uint64_t workspace_size = 0; \ + uint64_t *workspace_size_addr = &workspace_size; \ + aclOpExecutor *executor = nullptr; \ + aclOpExecutor **executor_addr = &executor; \ + InitHugeMemThreadLocal initMemFunc = \ + reinterpret_cast(initMemAddr); \ + UnInitHugeMemThreadLocal unInitMemFunc = \ + reinterpret_cast(unInitMemAddr); \ + if (initMemFunc) { \ + initMemFunc(nullptr, false); \ + } \ + auto converted_params = \ + ConvertTypes(__VA_ARGS__, workspace_size_addr, executor_addr); \ + static auto getWorkspaceSizeFunc = \ + ConvertToOpApiFunc(converted_params, getWorkspaceSizeFuncAddr); \ + auto workspace_status = call(getWorkspaceSizeFunc, converted_params); \ + TORCH_CHECK(workspace_status == 0, \ + "call " #aclnn_api " failed, detail:", aclGetRecentErrMsg()); \ + void *workspace_addr = nullptr; \ + if (workspace_size != 0) { \ + at::TensorOptions options = \ + at::TensorOptions(torch_npu::utils::get_npu_device_type()); \ + auto workspace_tensor = \ + at::empty({workspace_size}, options.dtype(kByte)); \ + workspace_addr = const_cast(workspace_tensor.storage().data()); \ + } \ + auto acl_call = [converted_params, workspace_addr, workspace_size, \ + acl_stream, executor]() -> int { \ + typedef int (*OpApiFunc)(void *, uint64_t, aclOpExecutor *, \ + const aclrtStream); \ + OpApiFunc opApiFunc = reinterpret_cast(opApiFuncAddr); \ + auto api_ret = \ + opApiFunc(workspace_addr, workspace_size, executor, acl_stream); \ + TORCH_CHECK(api_ret == 0, "call " #aclnn_api " failed, detail:", \ + aclGetRecentErrMsg()); \ + ReleaseConvertTypes(converted_params); \ + ReleaseHugeMem releaseMemFunc = \ + reinterpret_cast(releaseMemAddr); \ + if (releaseMemFunc) { \ + releaseMemFunc(nullptr, false); \ + } \ + return api_ret; \ + }; \ + at_npu::native::OpCommand cmd; \ + cmd.Name(#aclnn_api); \ + cmd.SetCustomHandler(acl_call); \ + cmd.Run(); \ + if (unInitMemFunc) { \ + unInitMemFunc(nullptr, false); \ + } \ + } while (false) + +#endif // PYTORCH_NPU_HELPER_HPP_ \ No newline at end of file diff --git a/src/lab3p5/src/ascendc/extension/custom_op.cpp b/src/lab3p5/src/ascendc/extension/custom_op.cpp new file mode 100644 index 00000000..6d803740 --- /dev/null +++ b/src/lab3p5/src/ascendc/extension/custom_op.cpp @@ -0,0 +1,62 @@ +/* + * FusedAddRmsNorm — Ascend C (aclnn) entry for the student framework. + * + * This file is the ONLY C++ the student must touch for the Ascend C backend. + * It wires the op's aclnn API into a torch custom op so test_op.py can call it. + * + * The actual kernel lives in op/op_host + op/op_kernel (the FusedAddRmsNorm + * aclnn op you build with build.sh). Here we just launch it via EXEC_NPU_CMD, + * exactly like the S9 samples (Concat/Transpose). + */ +#include +#include "../common/pytorch_npu_helper.hpp" + +using namespace at; + +/** + * FusedAddRmsNorm host launch. + * residual_out = residual + x + * y = residual_out / sqrt(mean(residual_out^2, dim=-1) + eps) * weight + * + * Args: + * x : (B, H) float16 + * residual : (B, H) float16 + * weight : (H,) float16 + * eps : float + * Returns: + * tuple(y, residual_out) — both (B, H) float16. + * + * NOTE: this default impl just calls the aclnn API you registered. If you + * prefer a hand-written Ascend C kernel (op/op_kernel/*.cpp), that path is + * wired too — just make sure aclnnFusedAddRmsNorm resolves to your kernel + * after build.sh + install. + */ +std::tuple fused_add_rmsnorm_impl_npu( + const Tensor &x, const Tensor &residual, const Tensor &weight, + double eps) { + Tensor y = at::empty_like(x); + Tensor residual_out = at::empty_like(x); + + // aclnnFusedAddRmsNorm(x, residual, weight, eps, enable_pdl, y, residual_out) + // Profiling warm-up is handled by `msprof op --warm-up`, so a normal op + // invocation launches exactly one FusedAddRmsNorm kernel. + bool enable_pdl = false; + EXEC_NPU_CMD(aclnnFusedAddRmsNorm, + x, residual, weight, eps, enable_pdl, + y, residual_out); + return std::make_tuple(y, residual_out); +} + +TORCH_LIBRARY(fusedaddrmsnorm, m) { + m.def("fused_add_rmsnorm(Tensor x, Tensor residual, Tensor weight, " + "float eps) -> (Tensor y, Tensor residual_out)"); +} + +TORCH_LIBRARY_IMPL(fusedaddrmsnorm, PrivateUse1, m) { + m.impl("fused_add_rmsnorm", &fused_add_rmsnorm_impl_npu); +} + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("fused_add_rmsnorm", &fused_add_rmsnorm_impl_npu, + "FusedAddRmsNorm (residual+x then RMSNorm)"); +} diff --git a/src/lab3p5/src/ascendc/op_host/CMakeLists.txt b/src/lab3p5/src/ascendc/op_host/CMakeLists.txt new file mode 100644 index 00000000..d2be0a50 --- /dev/null +++ b/src/lab3p5/src/ascendc/op_host/CMakeLists.txt @@ -0,0 +1,57 @@ +# ---------------------------------------------------------------------------------------------------------- +# Copyright (c) 2025 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. +# ---------------------------------------------------------------------------------------------------------- + + +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} ops_srcs) +npu_op_code_gen( + SRC ${ops_srcs} + PACKAGE ${package_name} + OUT_DIR ${ASCEND_AUTOGEN_PATH} +) + +file(GLOB autogen_aclnn_src ${ASCEND_AUTOGEN_PATH}/aclnn_*.cpp) +set_source_files_properties(${autogen_aclnn_src} PROPERTIES GENERATED TRUE) +npu_op_library(cust_opapi ACLNN + ${autogen_aclnn_src} +) + +target_compile_options(cust_opapi PRIVATE + -fvisibility=hidden +) + +file(GLOB group_proto_src ${ASCEND_AUTOGEN_PATH}/group_op_proto/*.cc) +file(GLOB proto_src ${ASCEND_AUTOGEN_PATH}/op_proto.cc) +set_source_files_properties(${group_proto_src} PROPERTIES GENERATED TRUE) +set_source_files_properties(${proto_src} PROPERTIES GENERATED TRUE) +npu_op_library(cust_op_proto GRAPH + ${ops_srcs} + ${group_proto_src} + ${proto_src} +) +target_compile_options(cust_op_proto PRIVATE + -fvisibility=hidden +) + +file(GLOB fallback_src ${ASCEND_AUTOGEN_PATH}/fallback_*.cpp) +set_source_files_properties(${fallback_src} PROPERTIES GENERATED TRUE) +npu_op_library(cust_optiling TILING + ${ops_srcs} + ${fallback_src} +) +target_compile_options(cust_op_proto PRIVATE + -fvisibility=hidden +) + +npu_op_package_add(${package_name} + LIBRARY + cust_optiling + cust_opapi + cust_op_proto +) diff --git a/src/lab3p5/src/ascendc/op_host/fused_add_rms_norm.cpp b/src/lab3p5/src/ascendc/op_host/fused_add_rms_norm.cpp new file mode 100644 index 00000000..7182ed91 --- /dev/null +++ b/src/lab3p5/src/ascendc/op_host/fused_add_rms_norm.cpp @@ -0,0 +1,152 @@ +/** + * @file fused_add_rms_norm.cpp + * @brief Host tiling + registration for the FusedAddRmsNorm operator. + * + * Op: FusedAddRmsNorm(x, residual, weight, eps, enable_pdl) -> (y, residual_out) + * residual_out = x + residual + * y = residual_out / sqrt(mean(residual_out^2, dim=-1) + eps) * weight + * + * Inputs are FP16 ND tensors of shape (B, H); weight is (H,). Outputs mirror the + * (B, H) shape. The kernel is row-parallel and reduces the H axis in FP32. + * + * Tiling carries B, H, the 32B-aligned H (for UB sizing), the align unit, and + * eps. Multi-core split is over the B (row) axis: each AIV core owns a disjoint + * contiguous range of rows — no cross-core sync or workspace needed. + */ +#include "../op_kernel/fused_add_rms_norm_tiling.h" +#include "register/op_def_registry.h" +#include "tiling/platform/platform_ascendc.h" + +constexpr int sizeFP16 = 2; +constexpr int alignSizeB = 32; // 32B UB / DataCopy alignment unit +// ALIGN_NUM mirrors the kernel constant (16 FP16 / 32B). Kept local here so the +// host does not need the kernel's constexpr in scope. +constexpr int32_t kAlignNum = alignSizeB / sizeFP16; + +namespace optiling { +static ge::graphStatus TilingFunc(gert::TilingContext* context) { + FusedAddRmsNormTilingData tiling; + + // --- Read shapes: x is (B, H); weight is (H,). --- + const gert::StorageShape* x_shape = context->GetInputShape(0); + if (x_shape == nullptr) { return ge::GRAPH_FAILED; } + const auto& xs = x_shape->GetStorageShape(); + int32_t numDims = static_cast(xs.GetDimNum()); + + int32_t B = 1; + int32_t H = 1; + if (numDims == 0) { + // scalar input — treat as a single element (degenerate, but safe). + B = 1; H = 1; + } else if (numDims == 1) { + // (H,) — a single row. + B = 1; + H = static_cast(xs.GetDim(0)); + } else { + // (B, H) (or higher rank — collapse the leading axes into B). + H = static_cast(xs.GetDim(numDims - 1)); + B = 1; + for (int32_t i = 0; i < numDims - 1; ++i) { + B *= static_cast(xs.GetDim(i)); + } + } + if (H <= 0) H = 1; + if (B <= 0) B = 1; + + // 32B-aligned H (in FP16 elements). UB tiles and vector op counts use this; + // the reduce runs on the exact H (tail ignored). + int32_t alignedHidden = (H + kAlignNum - 1) / kAlignNum * kAlignNum; + + // --- Read eps (OPTIONAL, default 1e-6). enable_pdl is unused by the kernel. --- + float eps = 1e-6f; + const gert::RuntimeAttrs* attrs = context->GetAttrs(); + if (attrs != nullptr) { + const float* epsPtr = attrs->GetFloat(0); // eps (Float, index 0) + if (epsPtr != nullptr) eps = *epsPtr; + } + + tiling.set_batchSize(B); + tiling.set_hiddenSize(H); + tiling.set_alignedHidden(alignedHidden); + tiling.set_alignNum(kAlignNum); + tiling.set_eps(eps); + + // --- Multi-core: split rows across all AIV cores. --- + auto ascendcPlatform = platform_ascendc::PlatformAscendC(context->GetPlatformInfo()); + context->SetBlockDim(ascendcPlatform.GetCoreNumAiv()); + + tiling.SaveToBuffer(context->GetRawTilingData()->GetData(), + context->GetRawTilingData()->GetCapacity()); + context->GetRawTilingData()->SetDataSize(tiling.GetDataSize()); + return ge::GRAPH_SUCCESS; +} +} + + +namespace ge { +// Output shapes mirror the x/residual input (B, H). y and residual_out both have +// the same shape as x. +static ge::graphStatus InferShape(gert::InferShapeContext* context) { + const gert::Shape* x_shape = context->GetInputShape(0); + if (x_shape == nullptr) { return GRAPH_FAILED; } + gert::Shape* y_shape = context->GetOutputShape(0); + gert::Shape* resout_shape = context->GetOutputShape(1); + if (y_shape == nullptr || resout_shape == nullptr) { return GRAPH_FAILED; } + + *y_shape = *x_shape; + *resout_shape = *x_shape; + return GRAPH_SUCCESS; +} + +static ge::graphStatus InferDataType(gert::InferDataTypeContext* context) { + // y and residual_out share x's dtype (FP16). + context->SetOutputDataType(0, context->GetInputDataType(0)); + context->SetOutputDataType(1, context->GetInputDataType(0)); + return ge::GRAPH_SUCCESS; +} +} + + +namespace ops { +class FusedAddRmsNorm : public OpDef { +public: + explicit FusedAddRmsNorm(const char* name) : OpDef(name) + { + this->Input("x") + .ParamType(REQUIRED) + .DataType({ge::DT_FLOAT16}) + .Format({ge::FORMAT_ND}) + .UnknownShapeFormat({ge::FORMAT_ND}); + this->Input("residual") + .ParamType(REQUIRED) + .DataType({ge::DT_FLOAT16}) + .Format({ge::FORMAT_ND}) + .UnknownShapeFormat({ge::FORMAT_ND}); + this->Input("weight") + .ParamType(REQUIRED) + .DataType({ge::DT_FLOAT16}) + .Format({ge::FORMAT_ND}) + .UnknownShapeFormat({ge::FORMAT_ND}); + this->Output("y") + .ParamType(REQUIRED) + .DataType({ge::DT_FLOAT16}) + .Format({ge::FORMAT_ND}) + .UnknownShapeFormat({ge::FORMAT_ND}); + this->Output("residual_out") + .ParamType(REQUIRED) + .DataType({ge::DT_FLOAT16}) + .Format({ge::FORMAT_ND}) + .UnknownShapeFormat({ge::FORMAT_ND}); + this->Attr("eps").AttrType(OPTIONAL).Float(1e-06); + this->Attr("enable_pdl").AttrType(OPTIONAL).Bool(false); + + this->SetInferShape(ge::InferShape).SetInferDataType(ge::InferDataType); + + this->AICore() + .SetTiling(optiling::TilingFunc); + this->AICore().AddConfig("ascend910b"); + } +}; + +OP_ADD(FusedAddRmsNorm); +} diff --git a/src/lab3p5/src/ascendc/op_kernel/CMakeLists.txt b/src/lab3p5/src/ascendc/op_kernel/CMakeLists.txt new file mode 100644 index 00000000..609362ee --- /dev/null +++ b/src/lab3p5/src/ascendc/op_kernel/CMakeLists.txt @@ -0,0 +1,23 @@ +# ---------------------------------------------------------------------------------------------------------- +# Copyright (c) 2025 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. +# ---------------------------------------------------------------------------------------------------------- + + +npu_op_kernel_sources(ascendc_kernels + KERNEL_DIR ./ +) + +npu_op_kernel_library(ascendc_kernels + SRC_BASE ${CMAKE_CURRENT_SOURCE_DIR}/ + TILING_LIBRARY cust_optiling +) + +npu_op_package_add(${package_name} + LIBRARY ascendc_kernels +) diff --git a/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm.cpp b/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm.cpp new file mode 100644 index 00000000..832c3c40 --- /dev/null +++ b/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm.cpp @@ -0,0 +1,475 @@ +/** + * @file fused_add_rms_norm.cpp + * @brief Kernel implementation of FusedAddRmsNorm on Ascend C (910B). + * @details + * Op: FusedAddRmsNorm(x, residual, weight, eps) -> (y, residual_out) + * residual_out = x + residual + * y = residual_out / sqrt(mean(residual_out^2, dim=-1) + eps) * weight + * + * Row-parallel baseline (correctness-first, not perf-tuned): + * - Each AIV core owns a contiguous range of rows (block-strided over B). + * - Per row: load x and residual (FP16 GM -> UB via DataCopyPad, zero-padded + * to the 32B-aligned H), cast to FP32, add -> residual_out (FP32); cast + * residual_out back to FP16 and store to GM; square + reduce (FP32 + * BlockReduceSum/WholeReduceSum) to one scalar sumSq; rstd = + * rsqrt(meanSq + eps) computed via the vector Rsqrt on a broadcast tile; + * y = residual_out * rstd * weight, cast to FP16, store to GM. + * - All arithmetic in FP32 for precision; FP16 only on the GM boundary. + * + * Tail handling: H need not be a multiple of 16. UB tiles are sized to + * alignedHidden (rounded up to ALIGN_NUM); DataCopyPad zero-pads the read so + * the tail is well-defined, and the reduce runs on exactly hiddenSize (the + * padded tail is excluded via the SetMaskCount/SetVectorMask path + * used by ReduceNormal). Vector ops run on alignedHidden; the padded tail + * carries garbage but is never written back (CopyOut uses blockLen = H bytes). + * + * Row size: when alignedHidden fits in one UB tile (the lab cases, H<=4096), + * a whole-row path is taken. Larger rows stream through the tile in chunks + * (two passes: pass 1 accumulates sumSq, pass 2 applies rstd*weight and + * writes both outputs), with the weight streamed per chunk. + */ +#include "kernel_operator.h" + +namespace { +constexpr int32_t BUFFER_NUM = 2; // double-buffered in/out queues +// 32B / sizeof(half) == 16: the UB / DataCopy / vector-op alignment unit. +constexpr int32_t ALIGN_NUM = 16; +// UB tile cap (FP32 elements). 910B4 UB = 192 KiB; one FP32 tile of 16 KiB +// (4096 elems) is small and well within budget even with double buffering. +constexpr int32_t TILE_MAX_ELEMS = 4096; +} + +/** + * @brief FusedAddRmsNorm kernel class (FP16 I/O, FP32 compute, row-parallel). + */ +class KernelFusedAddRmsNorm { +public: + __aicore__ inline KernelFusedAddRmsNorm() {} + + __aicore__ inline void Init(GM_ADDR x, GM_ADDR residual, GM_ADDR weight, + GM_ADDR y, GM_ADDR residual_out, + FusedAddRmsNormTilingData& tiling, AscendC::TPipe* pipeIn) { + this->pipe = pipeIn; + this->blockIdx = AscendC::GetBlockIdx(); + + this->batchSize = tiling.batchSize; + this->hiddenSize = tiling.hiddenSize; + this->alignedHidden = tiling.alignedHidden; + this->alignNum = tiling.alignNum; + this->eps = tiling.eps; + + // Per-row UB footprint (capped so a single row tile fits in UB even when + // H is huge; rows larger than this stream in chunks). alignedHidden is a + // multiple of ALIGN_NUM, and TILE_MAX_ELEMS is 4096 == 16*256, so + // tileElems is always a multiple of ALIGN_NUM. + this->tileElems = this->alignedHidden; + if (this->tileElems > TILE_MAX_ELEMS) this->tileElems = TILE_MAX_ELEMS; + if (this->tileElems < this->alignNum) this->tileElems = this->alignNum; + + // Row-parallel split: contiguous range of rows per core. + int32_t totalRows = this->batchSize; + int32_t blockNum = static_cast(AscendC::GetBlockNum()); + int32_t rowsPerBlock = (totalRows + blockNum - 1) / blockNum; + this->startRow = static_cast(this->blockIdx) * rowsPerBlock; + this->endRow = this->startRow + rowsPerBlock; + if (this->endRow > totalRows) this->endRow = totalRows; + + // GM tensors (element counts guarded against 0). + uint64_t totalElems = static_cast(this->batchSize) * + static_cast(this->hiddenSize); + if (totalElems == 0) totalElems = 1; + xGm.SetGlobalBuffer(reinterpret_cast<__gm__ half*>(x), totalElems); + residualGm.SetGlobalBuffer(reinterpret_cast<__gm__ half*>(residual), totalElems); + yGm.SetGlobalBuffer(reinterpret_cast<__gm__ half*>(y), totalElems); + residualOutGm.SetGlobalBuffer(reinterpret_cast<__gm__ half*>(residual_out), totalElems); + uint64_t weightElems = static_cast(this->hiddenSize > 0 ? this->hiddenSize : 1); + weightGm.SetGlobalBuffer(reinterpret_cast<__gm__ half*>(weight), weightElems); + + // UB buffers. + // inQueX / inQueRes : FP16 input tiles (double-buffered). + // outQueY / outQueResOut : FP16 output tiles (double-buffered). + // weightHalfBuf : weight row in FP16 (loaded per chunk / once). + // weightFp32Buf : weight in FP32 (Mul operand). + // resoFp32Buf : residual_out in FP32 (add result; reused as y source). + // sqBuf : squared FP32 tile (reduce source) / rstd broadcast. + // scalarBuf : one FP32 scalar (reduce result staging). + // reduceTmpBuf : scratch required by the Block/Whole reduce intrinsics. + uint32_t tileBytesFp16 = static_cast(this->tileElems) * sizeof(half); + uint32_t tileBytesFp32 = static_cast(this->tileElems) * sizeof(float); + pipe->InitBuffer(inQueX, BUFFER_NUM, tileBytesFp16); + pipe->InitBuffer(inQueRes, BUFFER_NUM, tileBytesFp16); + pipe->InitBuffer(outQueY, BUFFER_NUM, tileBytesFp16); + pipe->InitBuffer(outQueResOut, BUFFER_NUM, tileBytesFp16); + pipe->InitBuffer(weightHalfBuf, tileBytesFp16); + pipe->InitBuffer(weightFp32Buf, tileBytesFp32); + pipe->InitBuffer(resoFp32Buf, tileBytesFp32); + pipe->InitBuffer(sqBuf, tileBytesFp32); + pipe->InitBuffer(scalarBuf, 32); // 1 FP32 scalar, 32B-aligned + pipe->InitBuffer(reduceTmpBuf, 32); // reduce scratch, 32B-aligned + } + + __aicore__ inline void Process() { + if (this->startRow >= this->endRow) return; + if (this->hiddenSize <= 0) return; + + if (this->alignedHidden <= this->tileElems) { + ProcessWholeRows(); + } else { + ProcessChunkedRows(); + } + } + +private: + // ------------------------------------------------------------------ + // Whole-row path (H fits in one UB tile) + // ------------------------------------------------------------------ + __aicore__ inline void ProcessWholeRows() { + AscendC::LocalTensor weightFp32 = weightFp32Buf.Get(); + AscendC::LocalTensor resoFp32 = resoFp32Buf.Get(); + AscendC::LocalTensor sq = sqBuf.Get(); + AscendC::LocalTensor scalar = scalarBuf.Get(); + + // Weight loaded once (full row, zero-padded to alignH), reused per row. + LoadWeightRow(weightFp32, 0, this->hiddenSize, this->alignedHidden); + + const int32_t H = this->hiddenSize; + const int32_t alignH = this->alignedHidden; + const float invH = 1.0f / static_cast(H); + + for (int64_t row = this->startRow; row < this->endRow; ++row) { + uint64_t base = static_cast(row) * static_cast(H); + + // --- Load x, residual (FP16 GM -> UB) --- + AscendC::LocalTensor xLocal = inQueX.AllocTensor(); + AscendC::LocalTensor resLocal = inQueRes.AllocTensor(); + CopyInRow(xLocal, xGm, base); + CopyInRow(resLocal, residualGm, base); + inQueX.EnQue(xLocal); + inQueRes.EnQue(resLocal); + xLocal = inQueX.DeQue(); + resLocal = inQueRes.DeQue(); + + // residual_out (FP32) = Cast(x) + Cast(residual) + AscendC::Cast(resoFp32, xLocal, AscendC::RoundMode::CAST_NONE, alignH); + AscendC::PipeBarrier(); + AscendC::Cast(sq, resLocal, AscendC::RoundMode::CAST_NONE, alignH); + AscendC::PipeBarrier(); + AscendC::Add(resoFp32, resoFp32, sq, alignH); + AscendC::PipeBarrier(); + inQueX.FreeTensor(xLocal); + inQueRes.FreeTensor(resLocal); + + // --- Write residual_out (FP32 -> FP16 GM) --- + AscendC::LocalTensor resOutLocal = outQueResOut.AllocTensor(); + AscendC::Cast(resOutLocal, resoFp32, AscendC::RoundMode::CAST_NONE, alignH); + AscendC::PipeBarrier(); + outQueResOut.EnQue(resOutLocal); + resOutLocal = outQueResOut.DeQue(); + CopyOutRow(resOutLocal, residualOutGm, base); + outQueResOut.FreeTensor(resOutLocal); + + // --- Reduce sum(residual_out^2) over the row (FP32) --- + AscendC::Mul(sq, resoFp32, resoFp32, alignH); + AscendC::PipeBarrier(); + ReduceNormal(scalar, sq, H); + AscendC::SetFlag(EVENT_ID0); + AscendC::WaitFlag(EVENT_ID0); + float sumSq = scalar.GetValue(0); + + // rstd = 1 / sqrt(meanSq + eps). The 910B Rsqrt intrinsic is a fast + // approximation (~0.2% error, enough to blow the fp16 tol); instead + // compute rms = Sqrt(mean+eps) and divide, matching the fp32 golden + // (torch.sqrt then divide) closely. Sqrt+Div are both ~1-ULP. + float meanPlusEps = sumSq * invH + this->eps; + AscendC::Duplicate(sq, meanPlusEps, alignH); + AscendC::PipeBarrier(); + AscendC::Sqrt(sq, sq, alignH); // sq = rms + AscendC::PipeBarrier(); + + // --- y = (residual_out / rms) * weight (FP32), cast FP16, write GM --- + AscendC::Div(resoFp32, resoFp32, sq, alignH); // /= rms + AscendC::PipeBarrier(); + AscendC::Mul(resoFp32, resoFp32, weightFp32, alignH); // *= weight + AscendC::PipeBarrier(); + AscendC::LocalTensor yLocal = outQueY.AllocTensor(); + AscendC::Cast(yLocal, resoFp32, AscendC::RoundMode::CAST_NONE, alignH); + AscendC::PipeBarrier(); + outQueY.EnQue(yLocal); + yLocal = outQueY.DeQue(); + CopyOutRow(yLocal, yGm, base); + outQueY.FreeTensor(yLocal); + } + } + + // ------------------------------------------------------------------ + // Chunked-row path (H > UB tile): two streaming passes per row. + // Pass 1: stream chunks, accumulate sum(residual_out^2) -> rstd. + // Pass 2: stream chunks, apply rstd*weight, write y + residual_out. + // (Weight is streamed per chunk in pass 2.) + // ------------------------------------------------------------------ + __aicore__ inline void ProcessChunkedRows() { + AscendC::LocalTensor weightFp32 = weightFp32Buf.Get(); + AscendC::LocalTensor resoFp32 = resoFp32Buf.Get(); + AscendC::LocalTensor sq = sqBuf.Get(); + AscendC::LocalTensor scalar = scalarBuf.Get(); + + const int32_t H = this->hiddenSize; + const int32_t chunkElems = this->tileElems; // multiple of ALIGN_NUM + const float invH = 1.0f / static_cast(H); + + for (int64_t row = this->startRow; row < this->endRow; ++row) { + uint64_t base = static_cast(row) * static_cast(H); + + // --- Pass 1: residual_out + accumulate sum-of-squares --- + float sumSq = 0.0f; + int32_t off = 0; + while (off < H) { + int32_t n = (H - off > chunkElems) ? chunkElems : (H - off); + int32_t nAlign = (n + this->alignNum - 1) / this->alignNum * this->alignNum; + + AscendC::LocalTensor xLocal = inQueX.AllocTensor(); + AscendC::LocalTensor resLocal = inQueRes.AllocTensor(); + CopyInChunk(xLocal, xGm, base + off, n, nAlign); + CopyInChunk(resLocal, residualGm, base + off, n, nAlign); + inQueX.EnQue(xLocal); + inQueRes.EnQue(resLocal); + xLocal = inQueX.DeQue(); + resLocal = inQueRes.DeQue(); + + AscendC::Cast(resoFp32, xLocal, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + AscendC::Cast(sq, resLocal, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + AscendC::Add(resoFp32, resoFp32, sq, nAlign); + AscendC::PipeBarrier(); + AscendC::Mul(sq, resoFp32, resoFp32, nAlign); + AscendC::PipeBarrier(); + ReduceNormal(scalar, sq, n); + AscendC::SetFlag(EVENT_ID0); + AscendC::WaitFlag(EVENT_ID0); + sumSq += scalar.GetValue(0); + + inQueX.FreeTensor(xLocal); + inQueRes.FreeTensor(resLocal); + off += n; + } + + float meanPlusEps = sumSq * invH + this->eps; + + // --- Pass 2: recompute residual_out, apply rstd*weight, write y + res_out --- + off = 0; + while (off < H) { + int32_t n = (H - off > chunkElems) ? chunkElems : (H - off); + int32_t nAlign = (n + this->alignNum - 1) / this->alignNum * this->alignNum; + + AscendC::LocalTensor xLocal = inQueX.AllocTensor(); + AscendC::LocalTensor resLocal = inQueRes.AllocTensor(); + CopyInChunk(xLocal, xGm, base + off, n, nAlign); + CopyInChunk(resLocal, residualGm, base + off, n, nAlign); + inQueX.EnQue(xLocal); + inQueRes.EnQue(resLocal); + xLocal = inQueX.DeQue(); + resLocal = inQueRes.DeQue(); + + AscendC::Cast(resoFp32, xLocal, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + AscendC::Cast(sq, resLocal, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + AscendC::Add(resoFp32, resoFp32, sq, nAlign); + AscendC::PipeBarrier(); + inQueX.FreeTensor(xLocal); + inQueRes.FreeTensor(resLocal); + + // residual_out -> GM (FP16) + AscendC::LocalTensor resOutLocal = outQueResOut.AllocTensor(); + AscendC::Cast(resOutLocal, resoFp32, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + outQueResOut.EnQue(resOutLocal); + resOutLocal = outQueResOut.DeQue(); + CopyOutChunk(resOutLocal, residualOutGm, base + off, n); + outQueResOut.FreeTensor(resOutLocal); + + // y = (residual_out / rms) * weight (Div+Sqrt path, see whole-row). + AscendC::Duplicate(sq, meanPlusEps, nAlign); + AscendC::PipeBarrier(); + AscendC::Sqrt(sq, sq, nAlign); + AscendC::PipeBarrier(); + AscendC::Div(resoFp32, resoFp32, sq, nAlign); + AscendC::PipeBarrier(); + LoadWeightRow(weightFp32, off, n, nAlign); // weight chunk for this offset + AscendC::Mul(resoFp32, resoFp32, weightFp32, nAlign); + AscendC::PipeBarrier(); + + AscendC::LocalTensor yLocal = outQueY.AllocTensor(); + AscendC::Cast(yLocal, resoFp32, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + outQueY.EnQue(yLocal); + yLocal = outQueY.DeQue(); + CopyOutChunk(yLocal, yGm, base + off, n); + outQueY.FreeTensor(yLocal); + + off += n; + } + } + } + + // ------------------------------------------------------------------ + // Helpers + // ------------------------------------------------------------------ + // Load `realN` weight elements from GM offset `off`, zero-pad the tail up + // to `nAlign` (nAlign >= realN, both multiples of ALIGN_NUM), and Cast them + // into the FP32 weight tile `wFp32[0..nAlign)`. The padded tail is zero, so + // the later Mul(reso, reso, wFp32, nAlign) is correct for the real elements + // and harmless (×0) for the tail — which is never written back anyway + // (CopyOut uses blockLen = n bytes). + __aicore__ inline void LoadWeightRow(AscendC::LocalTensor& wFp32, + int32_t off, int32_t realN, int32_t nAlign) { + AscendC::LocalTensor wHalf = weightHalfBuf.Get(); + AscendC::DataCopyExtParams copyParams; + copyParams.blockCount = 1; + copyParams.blockLen = static_cast(realN * sizeof(half)); + copyParams.srcStride = 0; + copyParams.dstStride = 0; + AscendC::DataCopyPadExtParams padParams; + padParams.isPad = (realN < nAlign); + padParams.leftPadding = 0; + padParams.rightPadding = static_cast(nAlign - realN); + padParams.paddingValue = 0; + AscendC::DataCopyPad(wHalf, weightGm[static_cast(off)], copyParams, padParams); + AscendC::PipeBarrier(); + AscendC::Cast(wFp32, wHalf, AscendC::RoundMode::CAST_NONE, nAlign); + AscendC::PipeBarrier(); + } + + // Copy a full aligned row (alignedHidden elems) from GM half -> UB half, + // with zero-padding of the tail when hiddenSize < alignedHidden. + __aicore__ inline void CopyInRow(AscendC::LocalTensor& dst, + AscendC::GlobalTensor& src, uint64_t off) { + AscendC::DataCopyExtParams copyParams; + copyParams.blockCount = 1; + copyParams.blockLen = static_cast(this->hiddenSize * sizeof(half)); + copyParams.srcStride = 0; + copyParams.dstStride = 0; + AscendC::DataCopyPadExtParams padParams; + padParams.isPad = (this->hiddenSize < this->alignedHidden); + padParams.leftPadding = 0; + padParams.rightPadding = static_cast(this->alignedHidden - this->hiddenSize); + padParams.paddingValue = 0; + AscendC::DataCopyPad(dst, src[off], copyParams, padParams); + AscendC::PipeBarrier(); + } + + // Copy `n` elems (padded to nAlign) from GM half -> UB half. + __aicore__ inline void CopyInChunk(AscendC::LocalTensor& dst, + AscendC::GlobalTensor& src, + uint64_t off, int32_t n, int32_t nAlign) { + AscendC::DataCopyExtParams copyParams; + copyParams.blockCount = 1; + copyParams.blockLen = static_cast(n * sizeof(half)); + copyParams.srcStride = 0; + copyParams.dstStride = 0; + AscendC::DataCopyPadExtParams padParams; + padParams.isPad = (n < nAlign); + padParams.leftPadding = 0; + padParams.rightPadding = static_cast(nAlign - n); + padParams.paddingValue = 0; + AscendC::DataCopyPad(dst, src[off], copyParams, padParams); + AscendC::PipeBarrier(); + } + + // Copy a full row (hiddenSize elems) from UB half -> GM half. Only the first + // hiddenSize elements are written (blockLen = hiddenSize * sizeof(half) bytes). + __aicore__ inline void CopyOutRow(AscendC::LocalTensor& src, + AscendC::GlobalTensor& dst, uint64_t off) { + AscendC::DataCopyExtParams copyParams; + copyParams.blockCount = 1; + copyParams.blockLen = static_cast(this->hiddenSize * sizeof(half)); + copyParams.srcStride = 0; + copyParams.dstStride = 0; + AscendC::SetFlag(EVENT_ID0); + AscendC::WaitFlag(EVENT_ID0); + AscendC::DataCopyPad(dst[off], src, copyParams); + AscendC::PipeBarrier(); + } + + // Copy `n` elems from UB half -> GM half (byte-granular blockLen). + __aicore__ inline void CopyOutChunk(AscendC::LocalTensor& src, + AscendC::GlobalTensor& dst, + uint64_t off, int32_t n) { + AscendC::DataCopyExtParams copyParams; + copyParams.blockCount = 1; + copyParams.blockLen = static_cast(n * sizeof(half)); + copyParams.srcStride = 0; + copyParams.dstStride = 0; + AscendC::SetFlag(EVENT_ID0); + AscendC::WaitFlag(EVENT_ID0); + AscendC::DataCopyPad(dst[off], src, copyParams); + AscendC::PipeBarrier(); + } + + // High-performance FP32 reduce: BlockReduceSum loop + WholeReduceSum. + // Reduces the first `totalElements` of src into dst[0] (one FP32 scalar). + // Uses SetMaskCount + SetVectorMask(totalElements) so only the + // first totalElements participate (the UB tail, if any, is ignored). + // NOTE: this clobbers `src` in place (BlockReduceSum writes partial sums + // back into it); callers must not rely on src afterwards. + __aicore__ inline void ReduceNormal(const AscendC::LocalTensor& dst, + const AscendC::LocalTensor& src, + const int totalElements) { + constexpr int elemsPerBlock = 32 / sizeof(float); // 8 + int currentLen = totalElements; + AscendC::SetMaskCount(); + while (currentLen > (elemsPerBlock * 8)) { + int blockCount = (currentLen + elemsPerBlock - 1) / elemsPerBlock; + int repeat = (blockCount + 7) / 8; + AscendC::SetVectorMask(currentLen); + AscendC::BlockReduceSum(src, src, repeat, + AscendC::MASK_PLACEHOLDER, 1, 1, 8); + currentLen = blockCount; + } + AscendC::SetVectorMask(currentLen); + AscendC::WholeReduceSum(dst, src, AscendC::MASK_PLACEHOLDER, 1, 1, 1, 8); + AscendC::SetMaskNorm(); + AscendC::ResetMask(); + } + +private: + AscendC::TPipe* pipe; + int32_t blockIdx; + int32_t batchSize; + int32_t hiddenSize; + int32_t alignedHidden; + int32_t alignNum; + int32_t tileElems; + int64_t startRow; + int64_t endRow; + float eps; + + AscendC::GlobalTensor xGm; + AscendC::GlobalTensor residualGm; + AscendC::GlobalTensor weightGm; + AscendC::GlobalTensor yGm; + AscendC::GlobalTensor residualOutGm; + + AscendC::TQue inQueX; + AscendC::TQue inQueRes; + AscendC::TQue outQueY; + AscendC::TQue outQueResOut; + AscendC::TBuf weightHalfBuf; + AscendC::TBuf weightFp32Buf; + AscendC::TBuf resoFp32Buf; + AscendC::TBuf sqBuf; + AscendC::TBuf scalarBuf; + AscendC::TBuf reduceTmpBuf; +}; + + +extern "C" __global__ __aicore__ void fused_add_rms_norm(GM_ADDR x, GM_ADDR residual, GM_ADDR weight, + GM_ADDR y, GM_ADDR residual_out, + GM_ADDR workspace, GM_ADDR tiling) { + GET_TILING_DATA(tilingData, tiling); + AscendC::TPipe pipe; + KernelFusedAddRmsNorm op; + op.Init(x, residual, weight, y, residual_out, tilingData, &pipe); + op.Process(); +} diff --git a/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm_tiling.h b/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm_tiling.h new file mode 100644 index 00000000..62c01380 --- /dev/null +++ b/src/lab3p5/src/ascendc/op_kernel/fused_add_rms_norm_tiling.h @@ -0,0 +1,43 @@ +/** + * @file fused_add_rms_norm_tiling.h + * @brief Tiling data definition for the FusedAddRmsNorm operator + * + * Op: FusedAddRmsNorm(x, residual, weight, eps, enable_pdl) -> (y, residual_out) + * residual_out = x + residual + * y = residual_out / sqrt(mean(residual_out^2, dim=-1) + eps) * weight + * + * Inputs/outputs are FP16 ND tensors of shape (B, H); weight is (H,). The kernel + * is row-parallel (one row per work item, split across AIV cores) and computes + * in FP32 for precision, casting back to FP16 on the way out. + * + * Only op_host includes this header. The kernel accesses the tiling fields + * through the GET_TILING_DATA(tilingData, tiling) macro (it must NOT include + * this file — that would pull in graph/types.h and break the kernel compile). + */ +#ifndef FUSED_ADD_RMS_NORM_TILING_H +#define FUSED_ADD_RMS_NORM_TILING_H + +#include "register/tilingdata_base.h" + +namespace optiling { +// 32B UB alignment unit == 16 FP16 elements == 8 FP32 elements. +constexpr int32_t ALIGN_NUM = 16; + +BEGIN_TILING_DATA_DEF(FusedAddRmsNormTilingData) + // Number of rows (B) in the (B, H) input. + TILING_DATA_FIELD_DEF(int32_t, batchSize); + // Hidden size (H) — the per-row reduction length. + TILING_DATA_FIELD_DEF(int32_t, hiddenSize); + // hiddenSize rounded up to a multiple of ALIGN_NUM (FP16 32B alignment). + // UB tiles are sized to this; vector ops run on alignedHidden, reduce runs + // on hiddenSize (the tail is masked out / ignored). + TILING_DATA_FIELD_DEF(int32_t, alignedHidden); + // 32B alignment unit in elements (== ALIGN_NUM, mirrored for the kernel). + TILING_DATA_FIELD_DEF(int32_t, alignNum); + // eps added inside the sqrt for numerical stability. + TILING_DATA_FIELD_DEF(float, eps); +END_TILING_DATA_DEF; + +REGISTER_TILING_DATA_CLASS(FusedAddRmsNorm, FusedAddRmsNormTilingData) +} +#endif // FUSED_ADD_RMS_NORM_TILING_H diff --git a/src/lab3p5/src/ascendc/setup.py b/src/lab3p5/src/ascendc/setup.py new file mode 100644 index 00000000..abc4ffcd --- /dev/null +++ b/src/lab3p5/src/ascendc/setup.py @@ -0,0 +1,35 @@ +"""Build the student's custom-op extension into a wheel and install it. + +Mirrors the S9 `Transpose/setup.py` exactly. Produces a `custom_ops_lib` +module that test_op.py imports. +""" +import os +import torch +from setuptools import setup, find_packages +from torch.utils.cpp_extension import BuildExtension + +import torch_npu +from torch_npu.utils.cpp_extension import NpuExtension + +PYTORCH_NPU_INSTALL_PATH = os.path.dirname(os.path.abspath(torch_npu.__file__)) + +exts = [] +ext1 = NpuExtension( + name="custom_ops_lib", + sources=["./extension/custom_op.cpp"], + extra_compile_args=[ + '-I' + os.path.join(PYTORCH_NPU_INSTALL_PATH, "include/third_party/acl/inc"), + # Make `../common/pytorch_npu_helper.hpp` resolvable from extension/custom_op.cpp. + '-I' + os.path.dirname(os.path.abspath(__file__)), + ], +) +exts.append(ext1) + +setup( + name="custom_ops", + version='1.0', + keywords='custom_ops', + ext_modules=exts, + packages=find_packages(), + cmdclass={"build_ext": BuildExtension}, +) diff --git a/src/lab3p5/src/tilelang/__init__.py b/src/lab3p5/src/tilelang/__init__.py new file mode 100644 index 00000000..b113492e --- /dev/null +++ b/src/lab3p5/src/tilelang/__init__.py @@ -0,0 +1,15 @@ +"""TileLang-Ascend entry. When USE_TILELANG=1, test_op.py imports this so that +`custom_ops_lib.fused_add_rmsnorm(...)` resolves to the TileLang kernel below. +Requires tilelang-ascend (Ascend target) installed. +""" +import sys + +from .fused_add_rmsnorm import fused_add_rmsnorm, BackendUnavailable + + +class _Lib: + def fused_add_rmsnorm(self, x, residual, weight, eps): + return fused_add_rmsnorm(x, residual, weight, eps) + + +sys.modules["custom_ops_lib"] = _Lib() diff --git a/src/lab3p5/src/tilelang/fused_add_rmsnorm.py b/src/lab3p5/src/tilelang/fused_add_rmsnorm.py new file mode 100644 index 00000000..22f43329 --- /dev/null +++ b/src/lab3p5/src/tilelang/fused_add_rmsnorm.py @@ -0,0 +1,51 @@ +"""TileLang-Ascend FusedAddRmsNorm kernel — skeleton. + +Students: implement `_build_kernel` (the `@T.prim_func` body) and the +`fused_add_rmsnorm` launcher. The tilelang-ascend backend must be installed +(separate `tilelang-ascend` package) — otherwise `BackendUnavailable` is +raised and the harness skips this backend. +""" +from __future__ import annotations + + +class BackendUnavailable(RuntimeError): + """Raised when the TileLang Ascend backend is not installed.""" + + +_backend_ok: bool | None = None +_kernel_cache: dict = {} + +try: + import tilelang + import tilelang.language as T +except Exception: # pragma: no cover + tilelang = None + T = None + + +def _ascend_target_available() -> bool: + """True iff the ascend target detector is registered (tilelang-ascend installed).""" + if tilelang is None: + return False + try: + from tilelang.backend.target import list_target_detectors + return any("ascend" in str(d).lower() for d in list_target_detectors()) + except Exception: + return False + + +def _check_backend() -> bool: + global _backend_ok + if _backend_ok is not None: + return _backend_ok + _backend_ok = _ascend_target_available() + return _backend_ok + + +def fused_add_rmsnorm(x, residual, weight, eps: float = 1e-6): + """x,residual: (B,H) fp16; weight: (H,) fp16. Returns (y, residual_out).""" + # TODO: implement + raise NotImplementedError("fused_add_rmsnorm not implemented") + + +KERNEL_NAME_HINT = "addrmsnorm" diff --git a/src/lab3p5/src/triton/__init__.py b/src/lab3p5/src/triton/__init__.py new file mode 100644 index 00000000..9c14173f --- /dev/null +++ b/src/lab3p5/src/triton/__init__.py @@ -0,0 +1,15 @@ +"""Triton-Ascend entry. When USE_TRITON=1, test_op.py imports this so that +`custom_ops_lib.fused_add_rmsnorm(...)` resolves to the Triton kernel below — +no wheel build needed. +""" +import sys + +from .fused_add_rmsnorm import fused_add_rmsnorm + + +class _Lib: + def fused_add_rmsnorm(self, x, residual, weight, eps): + return fused_add_rmsnorm(x, residual, weight, eps) + + +sys.modules["custom_ops_lib"] = _Lib() diff --git a/src/lab3p5/src/triton/fused_add_rmsnorm.py b/src/lab3p5/src/triton/fused_add_rmsnorm.py new file mode 100644 index 00000000..3003726e --- /dev/null +++ b/src/lab3p5/src/triton/fused_add_rmsnorm.py @@ -0,0 +1,32 @@ +"""FusedAddRmsNorm — Triton-Ascend kernel skeleton. + +Students: implement `_fused_add_rmsnorm_kernel` and the launch in +`fused_add_rmsnorm`. The grid is pinned to the physical vector-core count by +convention; you may adjust it. +""" +import torch +import triton +import triton.language as tl + + +@triton.jit +def _fused_add_rmsnorm_kernel( + x_ptr, residual_ptr, weight_ptr, y_ptr, resout_ptr, + B, H, + eps, + BLOCK_H: tl.constexpr, +): + # TODO: implement kernel + pid = tl.program_id(0) + pass + + +def fused_add_rmsnorm(x, residual, weight, eps: float = 1e-6): + """x,residual: (B,H) fp16 NPU; weight: (H,) fp16. Returns (y, residual_out).""" + # TODO: launch kernel + raise NotImplementedError("fused_add_rmsnorm not implemented") + + +# Expose the same module name the test harness imports. +def custom_op(x, residual, weight, eps): + return fused_add_rmsnorm(x, residual, weight, eps) diff --git a/zensical.toml b/zensical.toml index bb2cd9e2..67a477df 100644 --- a/zensical.toml +++ b/zensical.toml @@ -26,6 +26,7 @@ nav = [ { "Lab 1: 简单集群搭建" = "lab/Lab1-MiniCluster/index.md" }, { "Lab 2: MoE 的向量化计算" = "lab/Lab2-Vectorization/index.md"}, { "Lab 3: GDN Prefill 前向优化" = "lab/Lab3-GDN-Prefill/index.md" }, + { "Lab 3.5: 昇腾算子开发与优化" = "lab/Lab3.5-AscendC-Op/index.md" }, { "Lab 4: AMSS-NCKU 数值相对论程序优化" = "lab/Lab4-AMSS-NCKU/index.md"}, { "Lab 5: Gemma4 端到端推理优化" = "lab/Lab5-Gemma4/index.md"} ] },

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 +