From 9c129d6131b069c3b821083218b23c185727d240 Mon Sep 17 00:00:00 2001 From: Mukesh Garg Date: Tue, 28 Apr 2026 18:20:28 -0700 Subject: [PATCH] =?UTF-8?q?ADR-0023=20D9.7+:=20charge=20PE=E2=86=94bank=20?= =?UTF-8?q?fabric=20hop=20for=20SRAM/HBM=20IPCQ=20slots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cube SRAM and HBM live on the cube NoC behind router-attached links (sram_to_router_bw_gbs=128, hbm_to_router_bw_gbs=256). Previously the slot-IO model treated them as if they were per-PE local, so the buffer_kind sweep showed TCM ≈ SRAM at 64 KB / PE. pe_ipcq._handle_recv and pe_dma._handle_ipcq_inbound now charge a PE→bank compute_drain_ns on top of the intrinsic slot-IO for SRAM/HBM. TCM stays free of this hop. Adds an internal IpcqRecvCmd.consume field that gates the recv-side hop+slot-IO charges (used by a follow-up diagnostic API; default True keeps current behavior). Post-fix at 64 KB / PE: TCM 12.0 µs < HBM 21.4 µs < SRAM 24.3 µs. SRAM is slowest because its 128 GB/s bank link is the narrowest in the system — narrower than HBM's 256 GB/s. The existing ordering test is rewritten from tcm --- .../buffer_kind_sweep.csv | 16 +- .../buffer_kind_sweep.png | Bin 69684 -> 75718 bytes src/kernbench/common/ipcq_types.py | 8 + src/kernbench/components/builtin/pe_dma.py | 20 +- src/kernbench/components/builtin/pe_ipcq.py | 35 ++- tests/test_ipcq_buffer_kind_latency.py | 74 ++++--- tests/test_ipcq_buffer_kind_locations.py | 208 ++++++++++++++++++ 7 files changed, 317 insertions(+), 44 deletions(-) create mode 100644 tests/test_ipcq_buffer_kind_locations.py diff --git a/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.csv b/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.csv index c41cccf..2496d4e 100644 --- a/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.csv +++ b/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.csv @@ -1,12 +1,12 @@ buffer_kind,sip_topology,n_sips,n_elem,bytes_per_pe,latency_ns -hbm,torus_2d,6,128,256,2002.0399999999827 -hbm,torus_2d,6,1024,2048,3541.0399999999827 -hbm,torus_2d,6,8192,16384,15889.03999999999 -hbm,torus_2d,6,32768,65536,58225.03999999998 -sram,torus_2d,6,128,256,1762.0399999999827 -sram,torus_2d,6,1024,2048,2293.0399999999827 -sram,torus_2d,6,8192,16384,6577.039999999986 -sram,torus_2d,6,32768,65536,21265.03999999992 +hbm,torus_2d,6,128,256,1858.0399999999827 +hbm,torus_2d,6,1024,2048,2389.0399999999827 +hbm,torus_2d,6,8192,16384,6673.039999999986 +hbm,torus_2d,6,32768,65536,21361.03999999992 +sram,torus_2d,6,128,256,1774.0399999999827 +sram,torus_2d,6,1024,2048,2389.0399999999827 +sram,torus_2d,6,8192,16384,7345.039999999986 +sram,torus_2d,6,32768,65536,24337.039999999935 tcm,torus_2d,6,128,256,1678.0399999999827 tcm,torus_2d,6,1024,2048,1957.0399999999827 tcm,torus_2d,6,8192,16384,4225.039999999986 diff --git a/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.png b/docs/diagrams/allreduce_latency_plots/buffer_kind_sweep.png index 194b9751c4206019d69e781d2b326311726ee710..3eb62b80269a488deb83e03fcc9bcdc67b56e461 100644 GIT binary patch literal 75718 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�lsF=)@x0{48TaW6g(98H*LiIyBd zEegtQujue;K)}{>!=|UaB7IkTnJQDc@L9uG+efj9Fgz7-o-zeb!}VRniUmkdsQtoN z5Y)^ps=lGY-zr)M2})fn_t?T656s@%_@j0Kd5{vEy{$-h^+I~hLGhyB%akG3u*Xh; zMphY;hb5rKuwJ_K0O_wXz5>+N)~v&q@E2rG(8vV#i6zc{ikCEiwex5%y`9@ip>5fM zH$e61(ez1ba=MOB2bt%;Zv1l&5`r7jx}aH!DkLwqo68JxRuXZ9WS|X>BMWZA^q~*l zDP!4QPQhwqWVelNe5Bz7;YbD*PfJ$j*v~KGyu+Tzg5>ymo*5XVT8L8ahFyHd$2^D`AAXF8TB<8(z_(nHsgMznrTl3zdfJTu&$e_bVD--TsN;-#h zJJ=dkgtr?6sBC>6gcrDZwzW7hYQW)GJ6;s1!`Ij7Kxcp;j%=(7GQL2{A*brVFg}-i zrHmI5?(>Y~NK3pjyBabQglSE3pRwqU;5OX;1nh8}d70Qzo3FQ&FUj<{3&=P_g47PG z==O9~c{pYdZ&luCX2DOXUT298UL$Au4y|^F-6Ln2ro;DKTI5WxfDKNXN7ze{BkHQfU6KKk8%G!dicHDZo+Z-Bm}9s zBQ@W#4mMgJsmYl$zVePb01tPvGmB1#095_fUt~1ftXCJzi2zBON@E}pG^XB=DiZ-q zCFpMEp!D2;gaTxfqNc0wLkX|n-QLcv;+$M{lb3B!4o!-y>4nbaPUY*>@_t#G>iG}- zetPYTza~S?Z~rmce)uTlaeR>;dplSy!AhcVTT*WMQU&V6cAApmh^F0UJ4W(-`lq_! z3KV}V`;jSX?*i}KjM=_CLwTgvB4Wz3X2GMz4ngFx|aya197Dw$0T~| z@bry|=(9bk`bU~4``!U4y)v`c?5_)iulu-!=n|HfUSFUHrlB0sz=?wfF66XST=sinLW>USfL^D zH~&LuVI9rAP86TBAE%=W>z%Hvt%e$Lk<{0A-<+b=%Txo-2aQXfQJ=*D>4RjxFXA(P zMMgxZ|J=llj{bs|pHz=<$xzHgUp0?<$P=l%5CPxGnZIl@gtE~J; zP0H*8XW0o_{w~#K#E$(3Ffd6Ax8c}B2rQrqs#P%I-LoyQ*he?qIlqgXy6nj z!%Ya;gkA}#Ckm6hu<8OcH1c%l1Jh0qd<<49!m6!>AVQ3soTKpMi$10=Xn<=!1j)_o z-4OSHikS)VIs>#v>X(6zF0i62EDi9hk&Hty@&ZAn$JlOqZlU6-d2f=%?op5IiFROhB~!=bQ?o|)0fwt_ z7QVHn{A=?pe(2A0IG}{fS2-+b-k*|?_)j}Lf~dLDWX;8KCqlet8F)kd)Lr|%s=@Og z8?y`(bLJ&DwFXR3=0EGIjcVmu5R)zJ#bnpyP90&|dl|@hHwz?47LS?Qp3(IpS(h2N zxg^43H!cNCt$|WBYGZ<4;KcI-Lt zcx>I?cY+AR-G5Rc-4fWnC-Hk1)Bj)L57Z7}x-BjcgIH_M&T^9MPoQ{-@(>R;@>rTK zLcm)n*Zl!+ZD*-lM)rNvF7f^X1{O=;`)33uV2HyW9M6i>9)yjt3RiP0v0QLDB#n+C zzmRj(qkEw;s0Zs@2&ryXw9yHg^9v*UJRg%*fr45Egz1V96j+0?sxg5?}#q?(BDjxQQR?h#aJ06*^+$VHZ#u==;Y({)_d*O)8wEF~518EnWkVjg8W0ao_tvpN%oS(HRHv{d&Q)ON_AT4yDiB5o0W3a3CFOFpHcRd~josS{z z0g2wDg<47=3%m;S=V45&`HPI zslPezMf10{`P}pO$Wvl`@1`u$1ktXpo$8qy%Dn3<@TKt* z(!52@xof&?N(w#bT5qr8Q{PSZy{u#-EV6@4eDdLZZ9wV~V#&V$t?}_nk|Y$1BDFO$ z0xku=3#raMhz_RphMVkw9s|qZ0AL7Kd5!P%wPB+Je!1)?g2mH5@5w2VMC9;0&MVf? zNYd?)|NU`)Saw}^S--q;wz@JV(#rOm-(MH%4pbolylMjv9La!hD1SySA(scm+@(F6CR}HM?hMnAgjdjv}T{o{xO*?fYEPS{Ji^>KmixeY1bAV zEFb1j{y=YY?o3X9F@meESwMs{h2W|tfU621U%kJ-3XVS`I5dX%39P6i$wYQ!wL~oo zJzr&qeoXs-dD%RAWU5UT=J0-j8;IX!N&o;}275bFa3FU+%p%`f~Dkb~+Wi>d) z{^_1w1*aMAeu4TdPNev)m`R-jPxzh{^NF)p?;@R_K&oa9fo9shR}gmi@I5XDi$(TG zf*J6>*V+2HOG832-eQlaVK6K-c#p0nQ?zN8Ccy+&RFSJEZ2?A)b!r?alIgqjLvIm#Bbf`;ZUW`JX!{BPgKc-;8XD)1#4kA@~ zlR^|d-`~$qon_`!%M-=+p?sb-MxJY|z<>L>OkKnFE?&i%nSgL}&Wo>I*|#LJI5pD_-O21M5I85E@h+XVrla`~#}o_3c|TMBr~S}f=Q0gg zHvM^8`Ey!Ze+cStOjaYF^(PRpwI_Z`zEfGG-8(N{Zp_^><{FzhUH7eVS;?#?Icv8k z>D;1gvwN<;A{c~Q>iRqh9tQ^tO)zdgGEPredd&ZlhC2PcnD#n*e2Sq5oK~VykM6&O zs;>MaU0s-d3dTp&3mdCDI`O1w*j`gUiU+awAgeG2+#5lyphm$ETA!SD6Mt1tK{`o1 z>D_+CQ5trKsdsl&mpZNv^o;%?2wr zHdbqMWzN}&aV$6>IIXjMJ0ggBmWSd>@$_{NtXjn5&jn9g?o^9LvRa%bvoKzM>hW~7 zSWqLKCaZjir3QT^3&Qi$MZ6u1@Xz{_VWktWdYnR7Nh-5owwC>e3o8@lHka)Ay%?6UgA!_$d8@0EsldbKSqELJ|@SLoBt9S|bY5?WTlTtGZPtJJT5mY?2 zS(%Mp*FeQ{EiG)6V`ca}rB8^aKS zatlIGKI1TW_uh6`*@MnIyBQrO{Zq<=srOQ8KYhX&DM~37KWw)qTG;=rvFRz|d!We1 zm?o0T%UiA|fI%ng>#7_Oo@ya%t?_+`+OpHW-d8#(e2IO*jA#h}np+#ijV0Nt#wec> z^Vry(&GP*7+a3SRG_@}N4);6Gm8UGvQ0dUgR`BEZq~CEH!>Ju%9u<)`4UX< z2q6)=w?J)U+RU7XQ+ASv>vHkHe+Q4}P6fIg_)_<+uDJ{A*2cE0KBcUEjYZ2&%OcY8 zR#rtV`+j1U8BY38wENsZPD6xBhHQXc#C-jg9_!tIgJ|9*<`-0q3#QwbuduiKPYfJ- z@m)5bb#lm+DOJ|jJMz21F$zQytEaDjxU@9m@8kFtbxbW-PKvLnGvE?5vvu&s zpzfnb$M(n;RrG{-VK%Q;PPf^K%&ctpF9P+z$T`ud@A}7Yn}>ifHr3KkqBQxXDs5|$ zd|3D9*!O3XonsbEukKSE_C{ReKtEcMZHynPjEeRhcGL9+b+aF0ykn6UW130_Ia@=R zqJJw@*07mwSXVJJoOT%e9A`36s*Novc@(o-R+Uv|7L0QI9T>v9^N}^OGLVefcCt+j zJew_V+Y)BrpC|f7OY>3qSiPu-Lva-juOs;enYq?{5U>KLdt? zbDw2uN4ZztYuTDw|KH>|cMH}eHF5}Iy56q~n<+|j*HDvTeIc$z>2 zrYgvpRd+|zlYzTHw78#V?!b)ms-`qgfvzxu;)GqCr95)^2A?ualvtBx5@Y5(ug;;K z+n-gYv;2?aCv6F?49)lClz;8fv(OLSu0Sl(sLmM*ROq5_Y*U$30uOn5ONXSY%rwCv zvs<|53fVXPa?_5_p`nIT(T~bEq8p5it6$fo$f5Q#ao*p1=b24STwd{D)erv4$i15F z+vz5sNtU4x{PbJFGXDI_D}ide@KiHz#-vkEq<^4<}wq zEnS=5WibpJsUkKRl8n{;YX-<8rbSL6+L}ln0_sW8%|qYIzEk@;8o$=sT`?~wmt$ek zy0Mw}!?3}~Dn6cUZ_B~F$k4hreu64yI)hK|lR}Epklp)W%u-y%Xx&m~PDD>u3~QdT za$Cp#4dX>x&DAZr?Ht$8!EOV!;y~I7yZG}8S)WzC<%rY%H=9;yhw~6ervYm|txTe( znd_*m-qu<|a%5NR3veJ&NOajh_KL1^YGv0oS#vXYTk6|7$CP0UPfeZd*8@N=_?KJn7>O1$_)1~#SX&kSw*R3%-%^l~+y{pd5p*MGO zrST&D(|32zJbfn+b$h;m!KKscX>H&LJs+xMr+iB8DGmISU^~2Q z$jk^@ZhN0_Gu^n}vG-ORasT)24vE2-$FLVu$6Tbb?KCq*Emrt{FmO;kq&ocbo{?R% zaB;rmP4mHwZ!HX08k&=$UZ1QdrT!sB8dHE(!(49bEsGo5d!Y=zlV>|y`;M}4s)smW z+EUdsZoTJwl9aQvIru|Q*|~&w&@M*f=t02`4fKct4o>Sj^TsKg|}@71vYw1gS)ddOJ}HTi8N+kSZrqND=r(EA@|dmbdT`F5Gn;jHa9}*dn{1&qxy4T2&&Fm7jjgxUNfczJeN=Wl z<^^mjWM84l#xt=l4@~x6svlh@>MW8jpQdw|?(q%}sF`P8W|NpQFXPcw^)Sv-ypQei zuksvA{#cpD$HdV_a^veuGclHAP;s6VKeV|td_o|0UtE8YAky*nh?M>{fsuH&f)`&=uhqI3+G_%?51XKxw( z3h_Zca$VO@<4>7J`DDtCoz5TV^AiioTWpnn5Zce7p4u8^SF6|hd%x_OV=bfR&LqES z6G?=rMoV)A-^5PP8#a!BwUm^hb9h)THk+9xP_T#_)eXJ@M^o~9H0IwN@3E+fI$6)# z@8~nkmp2$yDs*FLd40Ky^3GKD6}ONPZsQM)Mp``BGaQ!8sFZo#c}T@-V>W99yE`P-^yYN>^NJee1maA%EYqAGtO}=rmA67`}`+kL|1Cuk2_Fl%=aS?X9 z!DL@rJ{R|%B!-30T$X#=&dtAL2G~!JhiDG0-cQ;7tY(^OfD<=${Q1RGFKV_-B3dcK z*6vEPyQ<<8$qm=VNWHh+0PIQ(to*>uC$a{?Xp`5QCbO=$a5$C+FZ zx^m@Kh%S1IfkDl#e|dot-EgXZvQ0ji+ftW(g+fw6OV-QG-uT79dn~7}gHPh^?U}Yx zn{Pi)EEkw}EfR0?TM0vphq4GK-?S7-m|4-xCwg)3Rpeqj#EZ$`OhU^3A6akV z5Y-!X3uB@pC4x!{N|#CrLrDrqH^YE}Gy@Vtmp=>|>F(|tx{N^tWauu5p+maidj{}* z@BQvSFlWv=&)Koo+H2QAEZ@rsEPm6GM@_M^bk|rEM)>)Qw>>*?3Q~~@4(dXuGBfWS z*q=)KZ~yKkC2k{`9Q-4BNAO8nuUU}}+`MgCG5g&@ zcP9qr;oi4e+GbD^Wop2?%G8OCTlo-%(2nVWusVJQoE@%`V^+G|A>V z<;xfjWOoZaS-=YIO$wr{w3PeJ_p4ZP151_FIIQGGfesOPLg$_wuX!#337zlYj#*Yh zCRhlf>3K9w0~TCAcL$pSu>wb|2hhC8>AoVW2J9m!E^7yVHu_i}Pi!OFc)VhbhBq9p zLNcB?oCN@GYvH7=$%v3Pf(C8bmhAmZfW!gAq01v|eXF7V5!_Diu;=>2#M(g51lxdj z5?f@4e#PiYXrZuMG6!%fu&Tx3{wQh#OhFV7sSm&o9$Q;F6UtkT*p*PUv@gOK6&=JR z4KGas;|qJ>;j;)}2>b%q3HMzyuu2VQAG; z1LqOsRUwCi8-Z&*72`Yj_^N5v&IF%)`$}ZLfo%=^FJ3 z3e0O@SPakyV8*>DiAVfnfCsC6L%Cn)Z2bEjFU1JJ&OsX+8}Tbwe@Gba8aB%9)nH3f zFJmT8=<8+FJ87ZE)fU2WR_O4Y;gb#4l(xe3$B2eq;p!=JcXwigx05wg0;|3`wI6)b zT#^0ha$Gk_y11`2nQBLy=6^4)D=};q$fyU7Ob#5tmR1k!`$a@*BCYmz{u6;d87hFz z+?IC0N*rtRp?w}~dUaK;EOOZEi<0d238{?tm$tbkF(XE@e#WgEn^+tN@=38-cw!=C zm&aJK&*#tfn&uLUF>7Ic7JEZ&9(piFmv{3j31@;p6>IN<;=Sgsy3@~sNwvQg94EkK7qP5(YK*P~xQPx(99~S$kONjAySBN;|*BZNWh-SNrsvv`( z;ZZGjoM_i@Kw$ej68?$CDI)&ke#I?FH0;!JVV8CKM;>M)NA>#kI= z8if6z^w^uMRb$cv>vFNtkZTE{x=*-lTipwyA;Tuk{qp8@oS>V3$uEubeVx0(z1XFtV9nK-5e)L$dr9r*Ph&O_J;N_l^SogQRpNX124*}Md#RhRJZJc7an)%8 zC+Sh=TM;PPYIs8xyFtj|JZ{97c%8I%Ey=#0kkxR`{5wxqzIaF2bX&)-#hE^C77uWC z_YgW7QW0A3<0NjI7UCGQ{rx(DrvkTGnnZ+Q%8)XEH%>+yDF3J9Jwc4D)#U^Gb>~FT z*~)40ZNL@CR!kJC*HvS@HQz-%Qt_noC+}^OD7YYMV@ac&28*5O=nPvOWuASpQgd;* z>GAkRQJ>=hVFT*d>% zNLY|!2tjS$&p2is;DWPO&1ayU1zA(ljpHpDl;ajF^Bl_r=_=Q(@k2W~2XmP|RKA8y z6;#yN>UX+-9-4Rx_A4!b?1}KeZeZtv_Q4#l={dOqcO$UY41!!u3l`43LMW(&wfDzH zJ|i-s12^Gg5Um3TR}llSxvPO#L%hPOsashF>wpvn`KN5_H&+LfkdP2^6)X8S4C0sa zJRF$_2ir1irhoF2`tUlp0?X)(n?ymZML=Uda1Q^ z=$Tp6J4VB%;@d%^V+C7_qV82Zb$ln{Jc|69_5es@hq2mP;x??4|C}3eZVJ9}rho&R z6mrH|aVCX{Ada$6JH_<-n7ao#iPQGo4zr#voYW;EFUTgbk>%O#Zym6F9? zD-vAm?9g>G$-7Fl>Zv_UASjScT`mgb!Jbl$m#RM)cD5eNN{^~ew_7?N(6DG# zJ+bFcF;OgUoZ>7QmgBxGNiRIMIZ0>o8}&|R-D=GJ`;!FjT;pk*%Uu_vXRj3xXQW!7 zS`N;Qr+5KLT37b*$V}UM6rz&#M59NguDeVgirK z6-Y%k_!fFD{D;0KZf%-$hZ44OR4y~fXKSmc6eWu;71k?kM3z@p@SiHmQVR=4y82zW zTnI1z5ha=sH6+Iol_%^-+>Ue6T)MUf zFlOW%8AZ9$Jj53$l#2V6@Kja%)Lj@fy2)6Ck?to{0Waao-Ato^jcIfRrI zU;g?+U`=Hb{?Y5RfL~Q;B)P318bQ39!`_<=yrvtY2w9^ z$hKh3d@0hP?Z98)&AlE=4mX&K(q}nruM~@dF*7f^t<~E)3zm$kazEUc)Ehfm4R$fy ziS@xO_}ZXRtkSnvw6OOWc+t<*%&>GQ5+y zNnL3LvGP%v$fD?gkYBy%yB1sLD&;=DVb4oDWkQfsZ@2sNS$2Mctodp6ulGam0$WqI z-8=YSXA?fwY+?9gO9WXBoTD^az|Dn_kC&^1&syo9H4oxV`)+sLy;crJlb5*TT4@?{ z+kB%;6X=8#BlaMHR{j*TnDS?G_Zpu|$2pKmv5CAEg$UUWkDEt?Dp?<1SG%wj_R`vP z&LAud&~^A#pdu^P8#lPK(bk$EEM(6Q2Hg;Km|3k=`o)-!KRXm)DXtUqMBA zR46_K(S=u5?j~o2+NiHB2Y3_ZLO|RN?zjJbr(1LP<^CHIi)Hu7UW9!w-^9UkV}wXi ze$CScC?BF~);uwdVJe~80s)YwaQ)>#t&>9=A^Yhr?}#&`=}PLwP_SrzeiEnqspSv` z75Tn|Bu%Z@sf1T#U1I2Rlw87Et>$X4T4I`1;r}2_8j@^^LA&z}VV@TE>T5w8e~IVc zFR|?%19(BsLw~6BiuIT7VQGY&zH$gQ9INS4>O`(L+l4VHScz*3&KLh~K^cet6rq=@rrPN%m&s#(70O4~J-H_NV zhghR2O_ot#s-7bnPKB#UNSv+6nUgw-nj4O^gFV*ERO`s^&N(a`q+MSKKHLs(!{m0r zuA2Y*gvWUHFEN`K4q;LlW$K@$)#PyU4aD?mHS4-9$^*Jjb z45|p&?_g7xxqU|fI0p~O{-qkKxTu$0i7WtKWubC00q<|GQ=COlomW}9Tkl8TY~4IG zqpSF+*roR5XbNmRM!lPMsqC6I2~Zm0&Q<98A8Z=h-*(W&6IzsRIfTkfkL+q6jN>xO zt!O-woiAl&mH}^2vG93AAs??tqdq5EHv=-RpG{{yh!PAvaTBG1*_e8s2Ru=>^;>6s zxhS07MPKIxF@y;a?ym9&cgP2UE?L(-HPAlHD^xKk(i5Z!e1(OZ+zzGdg&g6ijjilfR^ z8Pt?UPvI!VMl+i8F;T!G-32LAQ0abU@!tlx@~7Kxm|ejix+E=kOyIki2@yWgf-uP6 zf;nVm{=#I^S3KR{Yu>I|+}>|xzHQ+gWj{P`Rdc*|0X1Dh{1d&zw(8KzyCMOu zsw{A{nr)?1XBNgg>fnkhCEy!R-cv|$q9*q>C{iSJtJ6A-Eu}MX7K?{EQj17r1up1; z=(2qC;sfjrFBfpdYvWL?(ruk5?L$#fSTz8`a74VVn@~uCJy;}hE;(cnnI;-l$E`V0 z@Ec@4p+}O6iTo-yNoABh7$ zKp01q|6DS0bctIY34>M3O}sFAs%P2tCoZky<}r8lvHwcu;$KPRr7Iom4gWHd9(_cg zuIAd4%430CPjr10iKy8mXfk^HcaQI#hW0^6OWXEWM!A{oeet$2fU^I%KA(Dg_zQl| z%lN`*%*)jM@I!cc-Lmc4m5lezYOY+39a-BTRO##KnQFI@D5`<-c5{&L9psiDqR&EP zzUL#wqsU4b`OfLA;Lg1UI6%_84*rp$+@%AuVKgkY%Ryn_GxSS^@h>%Yu&y1hwKW7d zuBH?4>2^$ye`VLL6!-M7snD=u$NR56o4Vkv=re3f#~v%;3p$1Ti)HTq`&Gr2)IXB|A(<*&Vm}jqOlPgH=)}rqJ z5PJbu204*>b&%TAkf%I-D?qj-R9eCy5PZc-@SP7YE4i!cP$P)3m9NhZBt|(OS-$y+0C=!=#l|$B( z@6%(V1?biuNltWsu!W-p+uDGzJSg{M-AA$jo^c8PpS8Vu%yt0MS$PPvI-UL|OYJZk z!>N_be!3?;bU9c$VXaYdb>=Pg+V%ORj5x%0oCq_d@wvgijVq$RzVSh3uLRxQhd!t0 z#JC!RN!V7O5GeSq7P4{k5`aCUQZiydkI}h4#R$&%T)*YV=S?lXCwfWxr_l`>9qyI1 z2F`WO8F9f6^2?fczOefFI(p6i%ciYv9&u{-`%eUB1#_m0&1pE}K4kn)-MI4|&pDnV zx_}=f_YD5n25fTAij+AxjCsUU>bit|eYF3cI$d64*lfL)1Aj)K{U7{3VU21oV-|24 zK6BLGxzmd|IZUwQrnJ+5_cU>$yAGEB^TEU%4=;xF>}bRxQP^Kf`S(kLNty?L7k?Sy zPO#8x!b)b_Te@l}3WK%!S2x-s28(EdZ9tE9xIMAJirD?^ueQ7`t?M}S!hPHG^Hx-| zyg!!`>BSe=8n;=8^w1l^pdV!rn`jAZLZ~OM(^VEr4Ahs4 zuALTRA$EyiY5}8Y0*c`bkhDx+U4-=;QBm~nHm);RE$NoggLlBdAc3W+k@je)FNY+x&4_8yuA_wdN{U4sIigPV=qcQ?UZ3A+= zT12q2j7DVtgqs|ybY}pT_rYq+$&$iLW^-U6mT#7|DBH3hZuhfc3~~I%J))MY7W=;f z{{1hoj)wcNy0rOGNrwGjcwbOU<^NWUr@rQhR%XG%?fh(17N~^M=Q0Zdv=Z;n^^Y+U z^t7ba-PUFs2^~b)(l8e{)^|zAVLHdqS+15D7kL*CR#<=oQ(=^l@v)Hc1uyn<>;z%x>ez93AfxoB=K$zQtYMy^59 z6|IBZD1%%?H`Gqbht@zp9{9gZkcvN8PQRYdD4e9P=w9~9^Vr_k?W7b#T`4y}{Z!Pm zby*(6M0DligLboP46n^uwz=<8+G{5k5!_Z0rLVENW!={Bx)RF=h2zneG{2oAUGf{4 zUGQ&u(~*{5Vdm>H6+lcrQj6blo#@f|4|&bPdkoBGdyJx{RWp99=5H`aVqHSK2_@N< z>^sIbkml-|uD&csRlLx9_0OSsWoK;-*LhnrwSL9m!mO~f4)nqE0}A4 zjWRO6{V>;rqifedud4u&H;aiu)K_MI%`4Mbn055DHMS>kJVA}u9Q?iHw_D{r>UIC( zk#pzgen<<+(Ho17LL(Rkc|1+DeVQx#U%aO~b8Wn$V{oOSf*T`C)p zU{jO}=n>DlJwPlDS+BZ;xCjfKf~0dYNu&3xmw$m?{)4Qw%KuY7_6m$Dhwm=+gQn&? zCA%)RsqrGfHZ>uOV;q6F_}StY56ZZO>sZ-LS_?7q)iAx`vsz6SSd9f7^7V0W8?=Ag;V3`Z^?#aD1CK-Gkaa_{S zBxk_R06JUbUE}D@h)U^44!mn@y+)iJeU)vMQfzD8EJJ2C)Z-CDcGDM0>34Dq2ydZuW@R$F{t}d&z#91pufXwx}A8chm!I7wO-_V;AFA+vA-i zE~J^s8`Ek8&nf21iOVXXVXr{ME#+k4&hs5RrZuzmx(FkKswuaH&zk8a_db$gUd7}B zS03`3Wv~KZ?r=4XHK?cu!JGx6Vcoj7ux>HP8cX3$LK`E*3J5x{1M!b^*gH#J&^dZh zFtB@p?CXx5H+~m_M7w~i_srT(uL zr{(x^Hr2o1n_-Ux9}YR4Lg+@BgJ;~8V2$-m`QdjXE5!bgar?9>2x9nn#qb_rh?hD* z{sPipfb5I`WG6{T_85}BnSBZWLSd1-&cqxZ=}C2i7+&||zh6Y=_spo$N7+L~NJ z1DW$MQn`7=I;suh_l@(vhuCJQ@klb*twhbkb7=a`|8_$&PjShgTs(>&s^N^s8`=*g zbPs&h!d15q3S7cJ`7pkONy$!L`tz&o${dXzeZ<{mmyx}ATtqN;hxk+gj#(=`4b53)Vj(@1EK?k!aOCbgFJ^Ct^!JUoZbsmCfN!gMP&6fH;6SAB96v$ z2iBhD0!k!pfZAE3LU0>-i;UwoOkuuHZl$QoAb8YKb$2~@39-GjSzh+!nV_(dn&z1E zcP08J*G2H7%hVT#Xn9#npN#HApxqoNPp@&LA%k|RL?v(4bt{HxZ(SO`-z?Hf<|Mf2 zcIs}+NWao`Y-%oBCoJ^0<<7C)#)c2(rj6B@^AS-3uW^TP2adsov3jv<>A*|83A_(J zc_tbpbT#SJ(`{lXvV`5iw6%70|4!vZe-LMb(s~7axWTw!hCMIV()HUuz){_TR}@u| zX43CDoSh3Bpdq9sbx^6&L;<_-PY!0FmzOKWo5CP5$vn9HxOADhb>vrXj6>BZ);^M?elf4edQ2`fUr z@+|_rAQAN9_03zt$Zim=fMT?7sYXy`?O0A6WtiSuvAx3tjjlTR8JDY@_4e4ssPVKx zC&9j(dZZ}x``RvKrM-W4c{@Tqs|MB`@fp8U@^Cj~gagO)pO13HNF9<*VzerGQM#3i zbDRGO5goyESwOq*O7{=P7d(4Pj_uADK2y>u$_?A5m8T_ZX*L38df&_twZWTn(`9*! zc(};=_*x6jB3L^KWOP<~YTIekGT{f*lsAYEX=v#y&6R?UcOYwO!?U`H zjme@zYYlk;6UT+<-8^P3q{n9tmp7opYxma@E_G$ae({UF&#FPODmr!!N_x$r#ZdTo ztzxJG5zTrJ-O%1OC9}UbRT_V!r<0lc_-PcX^~-S%%=1DT_d-RV-m*sPrBO_1C;w-l zkJ_-?S;|=orkwdbe>-{M-|vyr6~;lqKZPo9AFSs9qTq6bk2_(+ou1y#y^YNXh+U>F zqoOjpH-|;9Joo3w-_=oN#>0NKyLVj?hlhCE8;&8ta9M2M$F1AET0UpIa$U*u{2(M( z|J_e7FU$D2cGcJvUC8iG?q$?`UytD~{67x~3C@O^*`jueJU&{oP*;FB{VB#4>yMOps$6etV;-{sSl$cGP_ z$zYELwP5#sIn;(zupA#X&&x)d301%wjPDSN9-kxFUYTE^Yz6TuXL+ZxYSvlu z-eES8i{LTkcFfo+z8GSDWl3>BvwP&73$8_m3Alz0{QT-o>dFzOo2BdLGF zNwqv~-f2^Q1DTBBXJV~&fadpC$(1ENN$d7@cRP5ueDQ1Q%R5h9L>Gus-jwN(lU;gK;p zNZ%OQ2M~=!q#vW78KPSTz5fZanqREa#X`dV>UJTn89EnUvj^U15{zj5-K+T#jo=dp z>v9>nnKzeXpPmOi(^r0YfM~nMLVVAYiBwAAONsv$`aMpU!q|@46WUbALkEmP(yH3S z*;fg4YqRDoEbM#!!J4hnU9t&8H;73NwtQ>G`oDkQ5+_gwUl`NjCZ}4Rd+ijoT%}E% zP`Pb7I4aAi?f#KQVA99h)427#)p(>*lb$CE0T@TkD4K44YCd+fsNIDJEj|p0AKT`z zbwaaB7aG(FLqbn-`~rOkjlyRf@*4Ktg-MT)ojIb&2Qiy-9fZFHV1avuu!O&zVyIsC z-4F;*dH><-ls7-uJd2P$ikcc4kw9`3{-yKXPyc-D>W}m_Ck5AB);|C8wbEf|UYhLL z>3(qqg2jwYwJyFNT9(!bj}vYpI*wyC7IcBjalg=&OR4H~4%D_(%Q@Z z$S8Oj*X!qngCV)!e^emBK)O4UN?RYN=Nw5u-Hr*sF2;_Gh=5{VC%PSIl zrJ%7We8>cN8?GE#vE5bIxBA36gG)X2G#venSp`04jW~?)b{}(E?fREX*%xZ*Wiw}O zfEt3rsI=&@zD?hf<9!WsI%>vpisXYCPG;p3LXqd{KGmw3*{>(RXIq(&WNSG^o2&bz zNw+2ZV*9pjChqW_!^14d_>`QV%PE+bS;2qv51JjDow?o4zm;Of8LJR7#akbI08rKt z3Q|7OQJdZ%PI&u(lGJ+i{(ZbIG1Nj2W<sKQ{pPswuTgL+%}m`c&EG$|H2Q4`5PJ>U6`8 zS+`O8YUy>=o8b_nQV>4XCqwC#$2dwnPdfvCGe464)pWZR->+kCpeHP9Aw@9~aPG*A z5qg*%N)+}4`1#|%enx|XPjjBCP~Aa@?$mCg^??Pl4)u~!xy1_WhZ2%cZUmjxS9Dpf3Z#lSq*WQY&Qa}e(S*8!lq;#U1X)a zTrU>ptP+MhXZEd^s1@&-i5tRiqr+z$-Xh0RCwri6$4$G_eq}`S}uI8lnbD zk7S#RY&QH$hxi5&`%7I&?IHq3oug@-dx&!)4Lig8&BwM@gIQR7Eh|q|jXAU0`NyYcQ?4l)p1*pc z0`^8wLfyRTOEIfiUkFiHbQcAW>>V<^W)3Rre(hRo9FH8oYUXoVgRa(yzKLHLmF~_I zv;<2|ObjTbbUA`e6qh*+vXck%pyS8NMedCZ2F^ML@zjFORY8;*A`vAxvDeQ-Vs>k0 z6E*_IdE_3HY&?GHPQZds92_1BUF&M@U)#;w1Acfz(d-hxfp~Bq4==AiAq!z)a$CZL z4RySusw?%AdPu)FP#wByKM4r4cgI0Km@5M5OF3myxsJ8m)Gj!+7ZmgN{p0SRNuaD? z@B96385As3pf5b6;h--cO$*NA%o5S1b;^YA)O@u3s_*}xbc@xZAP8J)2@*9#fl(%#cz zQJ=xJC(KXXgEeT$*!5S{XlHdur}DKo?%mULg(!|x$i}^f|0ao#iJ8_}8(Ng5J8TEx_Wk`y=E!s3KLX$8K!ph^Ylb$*_Ga#(i%*N zr+?@bD$m+DD+vOWe6&C{u+6vO6kfMGF57nd_pkWp?;fiA$oEFZi@|m_bmjFcc+Oea zjo%@|dC)w7%i+kMd#rlR{+J8v|IHGYz+W4?^9RVuONiJdkR`;^VY^zS29w=M5f`84 zcs#$#U3DLul@V4D#JU;YvLKG0JL@0^A07H1Y#z6=!H&8q;iJU-8ndXAm92R**F1!| z7$AJTGS7F8i1y5GvUrTKIX9f@=xn@4+PU{FjokOS5`6Q653ih^?iBTq{J)AI^OeI- zakinVl8b`i*Vnf!F(eU#jWqCr_75M?9rDl|S7F`sJ4qtQ(VE!PwLcy;Tge_9Rc1EV zmH5t+4!6+worM821$u*{)ZJbNN4vfyz%+ZyilY)q0Ei`|`mxGX`L)z+j%xV-lmKW@ z0`M!F#gK$QbBGr-b1mE^#}`*P*TV=$(>w^Ol=U4*Yotm!KCH|G6@91RISXb=Uf0y^ z*8)l#ps=a?>SPR2;9q2qI3mf7QCz+JZf0AAEW;TWg)=$}4S}npus0 zn`T|^Vj(7R+0DFF@&F1T6ArgG6_M8HK&=MNfk-U2-dB#m>S4TQ&pqEor`1)M*iSRr zB-jS^whzpxfExaq7;1I;ab=c*W5?QN&Y!HLa4sW1Y_$t4Pv6^6<`GYnTbNPUWvc9s zX|CQCqkFlAhUP7e>n0yf{gUkmG(e|(^KBIa-7)G89HMjdH`#`n<4dGFExVhd&PIq@ zGz_zNvW0G4a?ZZ9BP_XIzY{jPDlk?bn$Lz&h$D**ab8q&u7v09@D`#ZGM3ANxgOb> z&t9e9T9zTD6Z4aGt2y-kc(7I(!WF{UREt=%{wp!N;>t2L~Yb6+ret2Fd!g6;3mnjUXiM^DM^kNy}`F&kzpL)zHzjec%CRy z78U-~a7IDaZ@(dB9a<@*4=ARf*@B?_h7~L@12~u~0+~Q0bIG*f;(WaN$Pa1+S-go5 zkCRs{=scI>fN=${`K!JOJGWjrTKM@HG+5Bb@v)jLa$|H@H<4x=#+opCGu@UJg+tp# z)T^vJPg9_k(QEf&Bbi04`%mkiDQZ`TH2(#%(8c$FpB7?n!1gRvWyj(@NTH&a zQH=tM`kX_QC3WsDsfo`G({~mkltFsJd2#--cIrk8Kv@EE;6@R>z6>Z!DD}wbDpoWZ zYiBrFRK`c0TN9oQ#VBO}MSiwb)brO~-Om`Ac5zR zM?M%sSCe@lq{wy`n6|uZdjI?tEkED~^M`A=VklBoOWrV0nh2J1O9*m25jLP=x=82> z%4Z3^y)RyO zBqUJcn4i<2qGLlPdS`gbiGciu^e6h-`5MLZ+M!1Jw_~%WTKdsiBjHCM$woH+MF(GR z+-t+pa5mKB4~(D5v)d>sj}T41hB8s>c5R9hL7}G#SlR+;vqC-AV3mc1F0f+UFIewlGg63vi;4ly8DWXG&UKy>&i z7GN>JF?)C|e=sx;JF?M4LDxJ-IrtQY9o`Wd$=rB&$@I&`6KjAs%KDE3P{hJmy}q!G zeS5HoP2yEB{8}UslsN;9xw;Q;j_m)D&1K7QYz#6(KjDY9P5Ul*T$%)MfOnzG3hoM9 z0Hw&*j4}){w=NzL|8*TVdGfqCQG!6Dz<*zw)c{v`v>ki@1~D%6ql|L@g*`hm^6MsV z(f^ag0kxe&vSTMEktY?<_IgLRw;m)uLXT33)95Q5CR54y#qu1STS&E%v$&Z|ms( z?g&otC-6Nk1x2~gD1qXdJp;v2yotduJI?;bW>*))HlJ;6!aAWUqp<+3LH8G0+v=G4 z%dY55s%tefnCb(o|9ikrE|CByP^|3MU3p{UOf>N0^D$b-TvyYpu#5p-!$nn9&tZ1$ zJYdmj26p&h;qMQ^0q{T5!N|#DWZ}oa&(tp2v*?68;QFctEV*s__cxPH^TAf+MPSG5 zKe(fRvT+Ytu}121Y0J{qh=Rp%EV(V0Cjx5zZ=8yH_K+P%Zp zbsxe<1*B>xHM_t#g;O+0>>I}JoSrr|<&~RAi@fmlY0QWPXE|g`iJps$Zn5Pz2Ac51 zW)uBuamf36#lVEZm|TI%9VaUsZt`{xrRA~OO0>XIKFdHg*zjELe(2DiCMe2x2o<8GVnoyWj+OD+oL5ToaeA;mh}BKAhG<^#%~d?-BG@Q5qfKr31G zIA@Kv`wvO_$!9qkc7u&4u6DK&eA7@yiQh5LwCR`nH9a2%OSe4QApn&T{|nzMxVcs7 z5&+&sOR#=TG=8(!n8`M9Ov4#6pvn6p#66>Kqx0lo^O8Hpp=auLvW=O;dxPTKP6abF zvs&G#xVXICaaToL%6Fnnued8#o#zs=pjOpQH;HyZvud&rURrv1_+3Vc+m6851;XA5 zT+?$^F{XMR`$lu^s6srG%6c&Wg0%@cs~nO~#3U$ipWeSft(XD)1u~#RVl~9{3 zo}v_+Gt6KrNSehrzBrZ6hDrd0(f>&3GJ_~s75xXV#(rHLR#wWl&`T-`_8cZE5q!k+ zBKX+h1H+a@oA>QxWpju3Q@|Q#@~Wd=(ZGYozu0Z$Fvl?rk|%C|b1tvASPASc9>G+A zu>b_x`+aKQ=jSFsIpqedR?>YCD=v8kNQC#YiG>-#r;ry8P(02b16TpkVtfZ|#G zVaioyCpULM@g*VhDb&Xl-hPw0wjOVs3K9-EhGJfoKZwc7eLMYg(fTe;QFzEBP~)pI zzGW%#6k#Y4^)7SzL4f583kE|ezzVWm4HrY4UBK(WWexZ~>R)0^pS+!3HgU_~fC3jZH~eVCGkksL;?mbCiFaumc!EU;x91 zxKXi?XQHKk&%OGdVyML&*dL^5NvnVQXokWm{-}P35XpzzH)WSKF{j!!Mc*37EAOnD zmHYa{t!1fT#{q!C%tqfmWMiJZXgOSd65p&Sft{1N!Jou|WBrGR)p1r+p4zn{a1@nqp{(O|-4WO=0jK*eK)*EkEt0gWsK`N5xq|zNvSTs85W` z$MuTo4V-Q3pnR0wz~$+e5;|x_kQV=T5wR&jGYZVW7}V4olQL<{0IOby@709DdtYzf zg$qht6G;zORZ{vBk2{cK4n{q`A^uyk2J0ic5kD%mBkVea24ZY#+&)fSyQiB>#;(Hz z>`&z}BE{~emS8UTGK# z`~0J^UDbF-y>cqju3RF#dmQ#GM4OrNnkk4LEms83RE-0Bo*1Q&&MK2Ig|v4E@gPYv zDi*$9vs|!$U;~?p+8KwdZlkO}=UE?)(U{ytcn{p*{%n{k8PI&sYUh0_)qP+K*&oUN zzVYEu2Sc4YKT{Rk;FKk-;+F;PP2~5*6Y%S;1e4o3~i+Q@f9eM^H4=3ImQgQnISD|Jt zeNtA=a!0?OLQwBfXK%3Y-hJG(_7nAXmMd_rZ}w zWk%geqhp*~a8+J70F2g=;G@rCMbS(l?8E%7ON5B02k6h3Rn`Aa2fvR=&3lvb29(_< zQnTSt(=Z%-)wG?_PGC6apsB;)nbF@o7iW5?Mz=E22n*r=Bdw<`QZTqbz zMxVedY8Vy)O+R%tD$G2ha376U_xyEsA_38)S zwoPEJm*KuU#z%J>zyPk>U^-(SEQjd9Rts4jqhcZ!aup?H1;N7eik=5yiLR^sFtENv zr`k5-IzIV~@Jo#M`;Cd<6G+CFQ zvX|Mjp%}V3u3v43mCIxG-Akoc3@35HOr%tBg0L98hb1w91Si(dn1qS?-PcR#y^p70 zE;YeiGPrqKjba?!q{99C@kT>iU>kdmKpjY@_7m>AIoa92%-|=Wen9-9{VZWQ;IaTp zFFQs-te0;Be0QNoI#}eSiiA4Sq|cY^nT}-I$1q;2)Q>S>r1Nu+7*MRhl99!eZx?7)P{ws)`9Yk1WUR8~1ropu(Z z?n>e4Qlqjv(gBD9qNfewhvXBSom&6z7&+)k#-6EQ5$0s!b97{z*3lp76pH*SWY)w7 zM9hoZkQH@MXmggYK+|eBw6RE8D?2{1eYFR0VLjjor?O%AN283T&&$azdn!opmbgbBPj&Y`$M@Du+YU4zI?B0zvSuJ5mcw3J{kFK1CNm z6z}J%N^=?Vd(EChSlM!rei?s&An9j~WPb!LJlxWZ9!q75N&3JP7u_V z1QT7yfw~;@_!P6C=VvWDUfxiGU$gwhaW;;=+i2zQ^aLoNyTVL@u=D87UvRiB&RT2H ze7HV4y9+0v_7k<+TRC!?Jph^URK*{y+`$V)+8UWk8C#g`+#}P_{}>&T(tDGaY)T?y zl}`_dEtF4GL^q$f50PO}KR8(KtmOfQ#SfNpTyui$8D||MRWKRN YjTqND>%Z)8c1$nfzs`o)#o__C*VH1RLn=_ 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

r~9 zgU7<0St8T)?}zp&398e}Bl7a{ydy*(;I8v8LiRAb{K!e$rnxM3ZZ|aSnGwE0NEk>f%9pG1000y>5g{8-r;XcUVYRIoJ{u!u(LG%1{e^zeL`Dlrv1Kb1CfhJ~E^y zzV0-hsgS_%Vir`CoLe70PpNEB=UUF)+aV4b=*PkM4H&3sPM7htRm+QCXBzWbi%b5g zpaDv$);BL4z&rM$#q}-Bz89hjr#q=J@FO*@Zvg^1tiF}dSg+UKy((}Js0<3S5G}*& zVzioUt=00QV=<(-(6B~|l2RzVPzbYi&1!(CK62|&CLK_QH|QD8VK=Ggy1U#}WC*^w zzFy*in}-Jbo38lI?${}n3jar$haou_0sfexJe}jLtNY=Ka{@aOxiL~sRicD>FLk;& z3HS28OOh(z=s39xm6=6|4EWl2H{ybc9r`X*=AixosU^KHytxqd8H&gmJW$({L5V3s zR#x(lQ>UGOToZI^f71ouJ;7l-sRF(_Wom5XXfu*1VEm~5(4Ci`zb-YzSAK($J~7ny z&IUbc4x{nD+eW0&M}(SgVqLxUGZ!E6XKegQrUZHf3sP;&9@iuSGldFGbv!G*_3LW| z=halGv02NSH@=4a+eJ_$3qbp6=jC=9-7k7ELVT!iqgz2Wa52g1=H2H%bui=p&n2o#%HxHyB?nbh__(&Sd1sYl^Wf zR`I?eKQb!}1KQbmrtFvu{Hvt>t7dL{Am+kdCAmCm^+WVgihZ2A@1wZH>wCf8o=nhY zV)^rSES4yx1?vEKvqWa**^tH?aj3;&W~ie1H?KYnwwd^Vv@LqA>+D!a1-KLmI2Z;! zkr3*cNzuc*hj89s9@ldZ#+517-`uB)xRYK~A3%KCj9+gjmbf;!QoZ%_uY%1-?20`~ z=i@Lc+!L#!o5d^s^HEapQQ?;-Rdlg)ii$CO;_@qBURK3u;8mW*^W9Ni0rt7-{dg4z z9&KCdsy@Ar)FH*fIRo@RQFV5k9T=9F=f|+|mu#RcE zOdTkgB3&T|o8p>1O-hQqj}2dLUz?X_-jLVa630*$&GWG{jFletb%vExo{{q{39{ck74UhOMHm$drBAm?}>5OF6_mq?f4yu3nGm%qUv3lGFc8bGT zQK{;x`j@?H?cy&IW;E`+sMVw`+pefxd+Oj#TjH_2IwvOP;26yu`3_k}g}s%aODc3- zap64}XV?|ZdkKP8hHlr|U59FRYxSm+P5`!d0cB8ID_4WJtE00m=>KP7#F9@Ez2;H$XS8BT8C8A1F zgH7(g6e-tS2 z27_+@F0;GFncBJ^wHXfNKlEz%Rd zN^-2SaDKMk*AbDtFT6?KnhTw-Ho-G9mHLOwgxB%D-<@w$soUyK<67$ee136&32c+` z7{c4o#&%V$xO4BSN^I4z|4>rXbXsaSCSsx1g2LJW6kWoHi*-$MUYnb6L~Oo6k#?y= z9QA(QWJFAUkYX(oxqb6g9j~6xE#&dF>#+i(t@BC=oyZ+t)Bv^JAgcZT3q*K$cwBsZ z4oG}I?%ZCJt@;eHD*#69+dlDhc(?xHV%?Gib~{FewI4Q+RV%?K7U2T0yuC6|cFB>p zT6%u9Ta+hrVka&);JUk`W&;C*izg45` z{sH8!dxJ`zsn#l7;y8_N9xnUTSa;A^$Ij_20aOx|EiUoi^yQ0M4`htt7&K91B1|GK zRl5N2F$9rrMFBp6K*y2rD}$wz0dJ(@W(q(|Y&Y?wcBbe$9e9%|j_6eXjmBgA#&vQ4JH~t+vM#-lmaezv4fw*nz7L;4yQaGu z8F)LIro#V9h)X+v7gwDlD~Z_@?_4gOkn!|0Ny#CYE{X46sg>3LvuOwPiFvu-uef!s zSZ#Fc+aCIOkKf(?`445J&2@x)RdiR@Ns&X5EPhH}IPab_&;o&b*PS(QTr#KU9b+`l z|BB1$D7<9Vi?)6Aq}>qyk9MJLQP9JpzM;utw_8IV3WD}&T?l=f9HY3|O?WlG$UU|5 zgMP|Eb@gY0%S?W2F(5)}K79tZGok)> z8UKVBPsQm(xIBqBUFbdu9u)DnRG$Rfoai>#R}$U#l@xDdYIfj0)8?ycb&Mj3ZQ5QW zhY$|KJ46iLauoGis$pZ$XVAF~u3DFox38m2>m0H#}VwjvVbch5BB4 z*mTnYSO1tNr53w+m8vi3FTIdy!_kdJzIosHP#-+sygSWqveDX5Qk7vJpnKhH6)9gU zw!&S@;S$7&f*ql%aVFgQa_N*8S5{XQuhujq6SL@>p6t4vhMrludiAMBoi;1ixDx7% zdeP$gzM{eVF3vxszzZ~Nzj>M$sPo&s6tg!4?`m%qCLKBxbLKnn z-aq=fOHKxTj(1`Jhl<|Pf=A@mW2EKNsdu&&#f#-8zu{^rR`bKd6t8REExV|oy2?Qko;dNWvFP4-;arIqg`(6DI>pyDx| zS^YX#GLeyA`tk1lxcp*Ufx^X}qNb1c7zTadWVsq>b8;xq&u)gG_YY=c@R3Sd@424c zNqZT;m+f!^CK-JJzj3qyvd3z;<_w=^iN{hQuE4Ao^OLIjVV;)ej7Dac77SDC4>x*5 z*rcn?)RGI-x>t+5_mY~rvuUX873^B*+2Eqz4ty6|J1W>~Wv*Aszx8M&72K|+o@(3J zwUNcS8!Eqgj*V4t>jxt0?`_QzzIb9(min_=Nta%CnBmw*2pmMP>~RGgQ^JKilbUwgvN16Hn2JUdtOvWJG41w!I~_M-^g< zM~*k;|8C0fmm3a~t2DXC;P1Ch|5`=$&o1(B*%v6iFMK?L^+A3}&RXjHk9NpLeT~8U zcZ@t(WHpCt#T&-lR>d6i^f(_7r!Rxscq0uscr-yZ5yr?zpUm=&_7!cIC+yp0s^Igb z#dq5&R}dM6TT)Y$#H(?H7n=35YE{Qi@S_&SK`w`s9cWi$xjFArx2y2q1!TPZ^_ZyUJG67-aVq#}L*286@~9kot)C%dFFS|qxc^TAxTD#B zF8V8BKyU)F3F2%?lcIe7^YVLwm2A*8j&OiIUtFeulq#c|+fAt0)#6nRsjO2-UJ;Oa zynp;~gn(%BzjP*mQpH+lj^z&x*O^DRJ9C@(e%#c1+8o5s)wbakAD8sops)a4e(33x z`4P1xB_&2(5!;%DE-yF|x!hF6th#ni7|y`JCi5j59KAnHKPorU6+heYk5ZrMV~K?? zpA1tKpMq(A?_@aymQO|59nuqfI!crb`0;zQ`75=7JViy>@b*@&#BKo)gC^drmF1!Lfx?$@gf-`CZ8m%TE}!BM@nk4HOeJ-8z0 z`IDhQE5aT|6Sd2r)}nUQ?uE)Rm=RFS87~-84P;rR&0IaIuHN%abzPg3aJAp<*>jvWWufDPo&W{K z08n)izQ7f|jP#S0`G+@Qd}THN=>2tsl(D&im~?N*2##EOS5g@81W4JHknV z#Vca|d4*p6xi4z7-Ab*(FFAK>QER8U?`dp(c8Z(ava}8B+xkxVn34`W1n^n}(r!!x z_NjjoJOTz9l%fV2>J*+Dq=Uok(`_^~sDB+%-$;W)D4Ot)kTBYXya#^@daYzp+FB}s z_xoaAk9<^-^$d@rpy1+s_T-VKgw0Fs+?an|T`9JKs}N08NGKrtz^*JuBn@Vz@7Jv`|jN#Fg!evB~SgMt!;RBB_qxGzYF~PR-Bm<`M%pd zM)^m+@zC1i3b*K$&O`wZtU%@Opo2;Je=k+|H~3N2p?`xcr@maB9>y`1Q#tv|WStM6 zhzPp<3xVO|@hm&Jr`WW4(Z@rzTa4|y;9o|!zLU=FvHT^YAGFH!n`A}QvB(N}-^Swl zLBeCDU_w5`jL!6Y^FATH=79cx5xa*h^2xiLvGmQM(^~|09GT5 z0#J3}(+inlY{)g4($dn`gK+I{PE+-Yii$2Pgzu+m2jX}%kP{8Sl5)jGmXeZku{S$R zMP~nH7eYMNs{WGZ4ohxM4zY9v*o))>$J^&%pfcUH4z-(3KFn<*Vm}MDi8DNnV)+Ib zJ(9VQ|3*7kx~8+UvnHuku=mwCxSs#AY$159j+R+PI8UPdDpPe?y#A+&59Ec*tc9QL?Y$6p1$cCb7hQ3{ zRSZI=A;azsQ^rK1SGToMI^!`=Z5L06>6cqi`_{8ayv_q+^VqzV)iFt4@CDpY`KC;nOMn;0~IdP!EzYT6-Xy(CFcmls}mQc5p2H*gx1CQqTn3$}<)8`k% z`3iduwwG=Vp$YRLj7B|90VI7w%@-7|&c_27zBr2m4XTQZ;+-ANK@pMT5cS5 zjh`+F4D-K+cv1*!|ICb6nzZ!0~3fH?Y(daTpUO0%`;L;7F|sSe~W^9PeN0 zT;Ahe1vcleqc})^7Y`fx*c@yv#5-;Vo@eU;gs4I~6|qMF2mR@Y2eZ#&ITvOk1l-d) z!5r|2*Qcm+ZBLGBrbC(IK7E=#)6z(5Qewh^_IrmhZ)|GWAUD9I%Ksi)9Hq9B#fz49ZcKx9Qg^p*OP%YbKbTa096(V?J|@|r z9VUg6CkY|4$LrAts{!QvSQUw9R;g|Yn|ME9ZG+tnA1j^hIu-OnX1~SDiI-hvjJ>fC z8XvYI-NKw5*)ek2n+}s)<#N|=X$8D1#P78hAdv-vNh-zgWD&6@HADzpiw0?j_;`v0 zT;}Zw`z5L+z`zLW02^R_;D~^HiwM`hp}^R@uE&I1;-*vs@Vr(rxe=F?G|zInF{523 zY~@6byp8vCw?$iiS4W*~$BBgQ^wrgolI#W$I*y&{_c_ggndL!;E*Tg&k6TDWW=XEl&cx^)$-F~> z07jB#izXKZ9NFcpF2qkKSu=fok-j38c;fQ2(bOatP-Ikh2+TVQ+?i{wgrmEuyQMZi zxE4r}4>!^E4Pd8Fr6(sdRo4RQ6B)#zqq~WnWWXxaCP~n3fxRI%48;ZXB;%7+upwR9 zfF5syY5O-t&J2BN_ zC$%Xm`qfUdMUf%i0cfJIv$Ll#N)V0n)6ZKxYQ!ml19jS@x`=xiGV8avmW~fai5bD>#XY>a+-n;2NTQ2&pMHF+M zX~}cyT<>``vS~%XpupnX;;6m%>bbDd&S$|xvgJp=(6XpRYgvW2v(niMen!Ri-MnuK zVtSE%L8%vNG`wEIEwuJu5=*p{oroWLXX;*dQ@LNW$5p_}e<2x(We?@2WbOCADyJYc zlt*^8mwX{7F2pWZeq7WJ>5E@6=DIx;ihH zv`G*h8`rV+{2!9Jxw&7piWT<*pB_X>S%G0|M_(|z*kygE+V#-QJv~w$nssE>A&0Q- zTnm3|o@G-~5@T;L@Ym^cV&*xTBK0wTRTt{nbd+LP^8qU>L+DQj#JN@2WiBB%ILMHe zg>t(_^>mg!iv<$nOK4LYXB%64%XhN@*RYq8r@-*ic4z26y0xAqn?D>pz%z9eeJu}J zY-PSM3OI5DoQDqayM+zM-heZTyD?S3>Dg^vZN3B+`LBIPQ&>B2Cv$F9EjK3sqGZ8N z^f*0QZS1m)d%>u))$CU|U_}4+X$Pj%2#UTTOoD=4@RQ}UvYj}qv&{J$LDY9&C7cfv z{1!EV4Pud$v2{t`8U0=#q4&nZVQ5I*`15Z;)5q>Qo))v)qheEyem_?7l`T!k7?dFp z@O7F%WjgTJ%0PxN90|*=;SOa;*^lR<&yya9p!IQf!F~cZSKA)@CH|AOP`oh>>bw2f znVCbtagD0Pj-3H)UtcmvSnRp@J&=N4>CvG=GJI2(D7g^7<7hB;!&n<3&*>1xLlB=D zQe8~-9c2}8lj^25EH1UeaYB!Hz(PmUzfvx>yFA+OMN=|NX{UsIUW~8G>h~uR3C0cnei!}emf!Ej zbd0!;g3>4eC>jQQfAiO|aljF}&n+0dS?W1jwq@gT>nkrTrS3GK^zZy?~n7Ob(MhY}EDt z{@3~CzHpr@b^+z0Pe_F(&3V4Z`viEQ@u<%;z}QS(mCR!nWl`Llbx1!?B$)}z?EOAX z5Cz^??wU*I_0xQISBQx7Q;A54P+kd6`@Ksz2D4nz&yAlH*cN;R&R+4PX zu8Y)zEFL?_@ZR;0adC6xHreB8C#s~lvx4R*iXp9+LhHI{)%_)2Cb3aVqq4w%P)*!o z%`rLKt-Rv}hA`d=WlC{Kgk?)Szvkt`7DE%^hroYMB`mqC#bI?<#5C4QhZzlT zfVWAkPXfN;yJ5DJN<1Lpd(=0K5!9CJlP%8;WjPj|9^!Q9#;+95Hl`7b>b&7Kg>ElK zpTJs;q6_Rc0Ff?Q=vlP#Q){{^VcYFg>nxkfg|8`y@(JW+yBR=icXiwaW&Ya)R@YyG z*!#?J4YgB8D;`)kP;wQx)WG3F1qM}p>7ewO0&Rm`c~M?!R@Tj2+n>BqW@?$%r@7BZ z2Ln2lt?0B@rJ!=f= z8f-Tmmr6l7Z#D9nuH~7=}Qs}z3HA3X>1fbur-x|KnV4)E|Mc!S#J#2~gf{f%PD1ZaiX~W)^6k-_{XdgIu_Jjm%!uCY~A1I25f&rWtUE=N4go(8;T8k1&o3J5bZnnb*8? zj!U<+@Ra0el0s|iEV>hiafs*{H_OsQtV$nrX)c*On^;%l*>mLU- z!SLoWu}*!AqZ_AXNy#<4rdB5wP^AiKrNe(@I_f@%b4%5=u$EsInE@T>YZ*G7vrC|F zxAkQgoveub;beGO)EU9bE@F``4hyRwnsgsGU=~$LlTNVl7~#pr{tG+7$1^oZSgIj275jr#C-Pb)XV1c zlbF9Mo6qBE84WCB{gyA;1&E3qmA+3d6F9X~JNViqq@$^YkmjQTOujTC&zlupYI`#K z(rIp}<0XuLXBw;b!S*Wex%6EV+!-c<&oeQ*_=;)z<>pkspZN<*wXA@&z1=J`qTe|K zt|Y_%=paO8CuDNu?t65V<7Ha)8p&}u@GRZxdN3ts8h>;J$GQBC zGV1*Z@|mScfN$v zrej4-eNmO6z8t00bs_f$b8Px2;>g5qOmeZJ0;##V+@>E9{>ECiVD$WB()adt zRatxYr=%dQ<7)*HC2vOV>TjzmJ3kjz2|iEjjwOo7AmHD|_TG!`I4H}~ZKU;X>HI)O zCR&&A<0?a@musFXTT)!|_$AmTW@wxRHqh$8}ZdLwVu!xjmmfX`GjQHYE*VHUC=C>^K)QVsbMdH znnboCzaU!WzbpC%Fpnp1!-qKN92z4d3Dyu6()!_CP2w_PK3jh(RbAk~k{$&-FtcDsF4?x6F9m1ybvupSU($qOt(jk8yL5~O!TpXqxw zCTRJfislcj!N-bymTYewu~b;20=n-Ws20-X7^T?V$>}wETo7ON6%?G_>5K(eM>%!M zKDNoYjuk8Jh!60l5ox2Qe^85jz3y=C)NdwteZ?p6R%-q zj0e6}-oDPOhtFnp8j`nQz5i%OTIjGQTzSL1?c>p>O+eXp)iW$1*~Z+^+>u^?&z1Jd z$lRS!_5-5W53@<8Ez>gYB$ok%AgmD6g#5jJ84>s6u7GjR8HeFUKI4v<2E!WnV_-(vO9p-Z zdW*=t8X+Dfc`;5V&>`>txM4EIIbPiTQS^eprKM#&-7TnH+xImpCLDl5X$|9m8~Q9| z{`-62F;Ld|xo>}&cmx-H)C?H_`_`j(!vUZy*2z0o^n2YV*7NTQBfo7p!EJ(5p@h)H zY0q@eFzrDV5w-(pRr)E=BZn3=`R4OBrYw>*!R(pp6>%xNz41!nE%+W2}$MU zRKyj10E7&A`2XWK-%$B(^(ur%MD)-605;qJY9s%|yDR_)QOAVn z(Z9~KWTZ*^3?1x1IL$yqKma`>W83QnFjDxhaKk+< zpb*W5rs{SCq7+Bdv;nH1)m$_wVkXZLcS&f+2?;K#T2NPQ16_v&05e;)R70vlAk39@ ziuU#QXIB>iJaU3E6s#wF5>fUGKp_?}4M(VznpK&j{q6vF-iKgdb+%bj4B+grNEUH* z0L5vwl!9cuKt5h2Z-LHHoS2%I7E%J7dld1=^d~)Sd;3TX?m4Ho6 z-F*A@48a#@QeeA>B=kQ)!b*-9eLn5N*T}0ViQcWnLB4^ncCemDpvqLi<)K$NIXRJF z->BdxH}IXeD)d1l7K~TV@@9-de_X8xh%wApl&PXlK9+Zt~XV`gTNVM+od|te|v-EmrA@&9Tj9c z18_C8?I17L2j=@P-whQRuWI%aLBnwXu<*wYLkyNjpko+X_1~3*WHqo!Zx{|B-3c|a zKLeXyr6tLtF&<6U<8ua7MaR1Bp&oCL=7s>EGI!`$;h1>W5W?x^fx<>VC|XYHF#31X zm!!8;bC0$`@#Zea#Y|W7mH(eZP+}v}gQMX+*i^~K-O817b1%7mA;XD9qo94x8jJqD zX+|>Zj)1G{eYBcAGd6n!B4&sl3T9Hi*bYgE0XXF~FMlo|fdO;f;-)p!P0&tZ9INmQ ztN_Ntih{6A_fI_#5CKz}7o~?{Ih9?a9+UjKC0C`m-c}Gc!LoIZ8kF%n5L=Q42%l~L z*GLHSAc&U~_v-!J#W~4#f%BVh)hI>f^Z=Z(odT^47R-cR*#HYU<7xfDB42~w2jsl4 z=b8yQOFrV}5P2^41!CzK038ba0RS06-~m=@Ydv}b`|6jN{kXg91I*s{V`E|t0bm`W zQxBxv0=&JeAp>DQVBj@`I#OWsnsYqz2MS%sgZbKF35*O32W`NRIXWT&$j<|)jQr-W z(}$Ao%kM_8K=cJ~PXK)vHLT39+yX$rmXW&z(9P~b&}D;7KPMUZ+W(dXT@L~eM6qa4 zcDwLVSMyx3<0{8UHTVR5gd0(&gW7Rwhi5*N*)eZz-wy)z@KAAYJqp$*k-v-}WAJJp zEDdAgapZNuCRyvA4Bp}PuC8q;8%+UYN-{_w?p2dZ+oAs0_V!WyK?pVD0o~QBhm3}= z)mmI|4FG|D!k^#1$^IHNi4wyAJk9Bt0uNF6`AJY1h=ITM+ZnaOE`X{Hs@zsJf9U2f z11Di7wMZ-2FHoV_w-AY?@K9YJn`;4QhQQ^|mq+NGO`3SI_LANj+}R*#-I(+mEIJdg zFYjo**U}&QIsr8DdMxZL(9RsFv0i^;^Vn`3yX6~Jh-uBXkk#S0lynF`>ZziP{K9Hv zE6E)GX=ug)o-SIE2{+N(CV((k)>*C9$mr|X^diy7+XlUBP8{L9b?X-Ls5D$1>|wSh zU33}@vlP7STvlOXCs|0GHSH#X6S&lh(7S;{^K)*y~3>C7x26eeLFjV$vl4d5XL9KoQE-7%x z#g^Cu7ES-8&nof5zLh!s*qOVH>kRqSRRxAaO*g20c(1Zu9lh=&`ZYB&Wu(T#DK}?G z?V`)7aUOipm&L^ z@dTMyGPdVT^c_2=2e+Pn$aD7@N^?LF+@%tnYAXJ&}ap zCsgZ^mVbd9vwrs}#(c%{5=vAxR*s&UDf`Mr6aL#}#ibIWy(gQE66S+`0C>at z>0hvrRiHB)df8BLb>-cysJvIH;Ba-d^cQFN=mZ6(@XTp_X1+d7K^trPn@r4v9^~Z) zuu};y&7CKKO_9o=S$TXsXw}P++9@MHRejt)<<@ z76B?pv2GvF_$))C>en{&CHF=5qm(Djghax$dGwZwl*i~`DJ`v>29zqt=5(7QPox-_ zaLXNyRI2&!q(NQFI}wF8*SEH&tJa~n6U%>x)=ke>#}TI3PLpJ>*!!J4b#uspy5(bJ zzm-FF_S48Qe6{S+!V91)mm(xo6d9+`in zt9Pg4&c-+H3~vDS+K_a+p#n<7yS%(EmgyC1KgVh!9r{mIf=wtf09KY9+IqDpv$(=d z2xw;I4Pkc7?VbeyGxnPaWJqNyA>DK4eWnEiFYed4sJVM3C}p`9kMgZ|Y*Tc{&am52 zUvc=e)ByA(u}5$%UF&X(J^Y#<=0;||Mhamn>P5;YsXZ}>%@ali1_R#cm6og<0q<~v zRsKKa&s2{=g~KZ&Gif6WTZPVzqS>SoIGtB}xT$0JL^u0Gd2@#@hQB%Q+z}6qOoc`P zzU(~ksoK+;YU^BKXyAWY|?amc%y8yg7Ta?GT+639YD$7^A- z%e}Mq9dSIo+}wF<5=EQ88-8&sdRfpbVd1B3%hERA`lBpSH9cl8|+v~2JJUv#uUA7n{QO%GYIzJGf<2-8_Yc8%1$0=s z2RbYkGC)wWkB=a2FETigU0lUsippptp&Q_>?dpixyt(roj>ptP@;kU}l$}wW?!D2qPdI~7ohu|=NR2V2h$}<|y zt@hIeQWE@KPWu2p^whyzaZD@= zGzhwWtCs-9;!Z0xS2Oasz;BD4ycY(JorX-BpKuFTWS}K+I$`w6DrJ%zo0}fGmVc#) zgW-jgEe(?fD`;+~SDtZjw-9W&iSO5;`6#zvtpbOj)<_+VcbEy^pmWJEm6&;V3!(T! zM-to|qD0u?CVdKVA0+FZFVA9y{SQ5@f)c+jgOd+u6;MDqpA7TlnTt|}C^wnHP+(F= zDI~TeW54)DX*xKshl*AebQXNs&AhDekzNBTD!oIH z7Nmv{5`+*+Xm`cu{k?PEIcM&ix&PfgG6_1)~eeV=*SQfNN&c7N&S{nGLIZ68}tFGn|5 zVSxwt1s?I;cJTIg_mU74bouXh2)KFL3w||+41iCea#u0+qM)EZCjU8gK0!Q`;uHmi zs-nDsU&i_@RYpJYxN~#xWuJ*%pUn-PxQmdwp*L3&D@N?PmAF;Sbl%xGKS)w}$DUwN zTQY=jRA@Sie`p?MU~tv$=Oy9yj5V1jiv+~(uGc`S@M2#|sxUfZg0OjGaaX#XAUQ{n zZm&V0TS6b*q74V9LOxzGJVs1X{rhi<3s=FZkdK55(*OCV-v_zN|NijR#DBm3|EnMV zUg-LGM=$>g4HXsD$0)(J#$U+&^_s!HAl!7r?xz`Jmf%AVeb%E7Up}U%^JWKbMM!NA zDR|DmWk@5`JB@!DDbc;dc>n3Emve0hgHG7~a&rH^CpyzNX^muT;qi8?!rWL$SU4&$ zn&aNR9wi3LyTil7dI%^)99v$qR6p$+pB+RhRcuI1PUa+_2gL^K^tHs5*xA|d%E(v^ zNNz}BrW@c*eFzpL;p@@y(Pk%W(ae!D)(=yd+@r58%`rJSsW<%a<*(bjr~tTyXE%o) z+)A2o!#Q)C=r~fKs#Nb~%EiSME7-R8m<6`2J4*TB!2`WQwQJ(I+R>%#lf&Xb;0j+4D8zd=xCYZF@xBbMb>%+QX>#??onD zrfN&YPh^hw7M~B|7_0+zo4qmYUB7A+~H{h81IX)mnbNfpI+_*qwvqOZ}CA#MC1KV*<-fF&Y0wcgsb}YG#Vne z1CEFjwxdOwR&&Vtj_~CkUUo{xSpA z+1VD~hCyl?W1>Ztlz+8<))6>|w>uNNv^4diGZUSE#`Lul(_NdprR+O8I&8b+I7XVh z>@kxy#hpGA1U$ZFBdN}LqDLH^aYq`ueZPT-Ynbc#GvCp_-{w!S+hk~UJ&>jODtdp6 zf`#Jt6|FlI6d9(h3D^m^V8AY3bXr^XNaRDP8mEZJSmr)W%3vyg!1BqHFz@wWx;`5yeqp=5`-q8c8I$e(B1Cno=(BHU_qTcl z3;hWzTN}YA=1d|EzdiS@gO6+<-^5)u(!*P)5M!u~tzmUk*F_c6glr=XuHu@+9fod; zA8n6X_SD&DghfpSXq+*lVeU-}JI_Rt+3LFE*)KYg;?nCiD9ssio-XM;Yv54r2TF^9 zS}izYCygq3F6h8z)0ZUkdxo&qFc&23vW3nL?&+YDeRVF!JC#okydp4OPOl?y?aA` zCr7)y1u{@c(yfs!M+v@(+3ykbntMXtt2*>=B*G)q&M@ri{82V}%RPzrW@tntG)}rXvqesVHxRoPC{B^HNOYDA z1Ilml!{cXp<1$Q-We(PB1eSN_g4?O+>u}qR1JCkCP`OiQOv5vr-Ar*x)CQDHch|6q zZLSn@_iyW*rTA4V7EhZvW+f}Zr`i4oH`i`0bNHu2$dLoxbPd8Hjw9w0;UgvL}HNk&!}PzliwR>9bOW%xwlUho)xA zH0Gi@C6+DqrTJkj6PCW2+`F~GsvGf~OtjLQ-|1IQNYnmS!n@+^kP@u)?#zqI{Dxx0 zc5P?Oj-BN2k!6kD2l4Z@m1gy}z1I(RAm-u0(C6bnGI#7otn8S!9G_O?z6!#OpwuM_ zs>&Uiw=HzC!d~#uycTF#7b-QXNOMfT>Drj9s1QAi34Gh5|HWhd*MrefwZ!pODDwWC z1Y}J`$zeF}?S4gW2?sB)`buBwixsi4tW*i*tT1JXb+Z7WBr#@*GO2To$QKV@{<<%@ zx21UEmj^!w6MpJYq=R;G$oaY>B7wmK$GSoaoZ2dzOed)MkzIy7K3NS1FTCcPRv zO@h?WLAjT5(hlT6(TjlD7jc;q5iYly!`5m9K+RrP%E%G}k^4`G4~9BR8f8DN22{xy zLu3(jQ0whhBui;l7Tv%``gFaE@Ww2OREjH+Hmd6^A$X~u+{ne1!}X`|Od z(yU<9wOy->83tu?`OE7w9LG|*`ZBA_NRb;^4!__Bs|R}#t3f12RpQ3n-13838HEf7 zS|wQY>eyw8Yp);!tE}Iz^PAbobR?`uGg1UbunkgBD9HAiu_jggVDfG(*>NAC>-_=a z66B^~^DapXsv4b>5KI!iYuNq{bKfZQKr7s7?a+aA%1l-Y%OHwlCW5Nf8R{`0@@SN9 zc}n5;r?N^RYn9rDLaTN@tm|6^rslQQr_g|@_@7Mdm52=QXEc`obm&bTEJY05DYE9P zcb#=wxlwbPX8ADKvTI?=87|s!W>DtfrM@*yIFY(WAT-C?DUzxFlXRpA#qc8bFeqSW zoqH_3^6s{J@c^ROnlvE2YoRYFJ-6M+#NwbWe8g^s+&{CF`jUE(QKPC1y z1YJgU>b3JFB~bE^8dv@8-}2!V!XWP|cbLWm)0y6^?&nx15NC$H4BGvYLwD51=4T|f zjXL_`{ol9dqT{^$ich_wTqW5WZ#2mKWa4qy5Q5RJ!p7#?mX*-ZIw+S_@DY(^claM` zYdR74VN!Fr7}FN*tw%#+<^h4%8J;F?-_nOps|8G5V{jtzVl&)j1h?CGjuw?vi|_1=7c2Z%$XC3^41gHcr~0O7WD+$E~+tI^&(t6 zoJeN9l#rMlQ9AB2G~C3rnDJh0y2^? zUO%N9$2;XtC`y8th6yS$xx4b{{PCyyXx{M`&QDiyXet-4qZe;vXeIhXi>+oz$|{9k z{aNpVSVo$h>NM*{vFOZwoZmOV{caXYXGFWkCo_lSgcrSV~?*-+@rbqP$c=}_+W!Y zu%U8e9l%BrTY#bXYumGo=U}^;`Q@;!ZqAj5WkwZizgm3Zy|&N*s1?>0ijtINQ3$84 z+X%^GMUnOvWBMUr*IU}$VzBc2Y7sPPn=H-}_(%TWVMZ|Jr5nGy`umBbhsE02uGS5@ z`A>@Q>d69-!$ZQLRi-R{SDRH|J0^P>Y3>FQHqg3gD`rgg*PVMR2Y;0cvh^9U8Jd)CF@p18LYV&!N zE^HqSV>tp>@6&`V)y|e#sa6+6)PB$A{29&cEHE*bWyP@VZ`vLNgIoJ*Z>N5RW^BVo zOzrH77T*gG+)tJ!^a%^Z3<8|BOfFDO>pvK*`8ETDDE6+rW~cbl2nJI+=nwu^RX+Cw z-JvZb7l56~Z=-#Ge>tUWV^eVF;X~x%TxQUP_TO))`-qt#9c7ixJqgmpG5xod@d*h_ z?;<04YUDglj*spsUZA7%U7u+hT_pA_$Xr7!T5BZpnLZbA8!3qBWnkFFT6^`2vTVSE zKJuwKp8kQYY#B&!LA6fmUfzx>q+C>jeO#YwZ*N*}JHYdLrv|+q7fj)xxmv85ZdaNA zESFQiNaH~=wkhBGIjjHDW%?)1?{e94vRI+}jUJ1wZJI}?WdX$W3Tg_EC)rwsywpZp zsGe4m4zA5&dSsG}*k4Issct|)%YGeLAZ7M`hdkb`F@{^Mi2JjHz1ig1+jYW9zi>=Q zSX?0$y=ZO2<5z94gX=AB=?`6`!t{=BaXCFI$j!J`BGJABu=-d+f3|G~C1bL8gJpW`czMA$bF@^*0+O}_ZKu6sf z&Fs~r(IJnmg~LXDIqCbdZm!CCWQf>nz8lLJD&UH=6|u za=llL!0wW2KQyW%&b*Lc7R=*(>RhInTKFyx`q|Hcjs0gJUku~Xo1f_*YHtGd^gAZdBnVCG~&Oe_ISD(5DdF_>9ljB zxs`Y%+}e6+Kd%Gl?FV&43-dX>E2eEQgyL6Y*8o>i%YX8rZ^+lO@i9ZHPBT*_ZRd6v zt>)PNukE(Ai=EJ0nO+*0&&`<8;`I3hiDWxfQ?C%rX)$OP_M0Fnn3*RCThWjP^LEHh za-4;9)s0gwD}|FB+X@H$GjAHAe~msXkdQJmZV`y4r5R^?D=}C)z)-Ak>&5fueSd;8 zcR@9;8gpdxZqu}UB_E!_&?&*$(*o;B&w?ZUb8#i3_g44I2c0dKCmG89(XEz`%K5CK zym@F4mN3|+h;de%n1eZnU{Wl>rH)Ks!Ivw^ZP(9+b7H;ELTT4tEK4!u(w;Mt5cxIQ z+8{v_s+IgPEzRk=m?s(o8~1+@w;(VvKY88qvx;?oElMI|IumJKyzU-^+gTxmj&R@e zZfwx%$RTh@Xq)E|B-gOXv|<8oM&=AeR35xgf;o~l3c34vD+tuE>TkCqDJX>9J`ODB z6FM;r7wk#$R%oFS!6y>RaY6pFrV_!ioXFEWOs-JUo5eme3c2>%nB+4@LJN)@x`x-w zX3Rudb&cG;*bAGqIeX1+KW-npPUKLZR&Q@yO;*}fl8%H1syTyFV<#h>xvOs6J3gd^ zrXGtmWTl<+R ztt2XKRXoR~&}ESykp)V9h?W>EYqiyzN#nY*wQT0#NBZHN?b-`Uj;pM^QkiarxiO_#)TETPH&>WM zurrBFpCm@b2k?cTys0tU8kYe~0CN+$B?5p6s!H)*;f&B}{wy|WagPi8TT&k^+j zdC6F3M4NGQyBH0l(D%cu%B<>{yu+!*)75JpdA*s~XLTP3JXSGn+}If3tSN%xhB2AQ z0;yx-a9E*3zmQP4=A~inJ8OJdkj}^)>pT##y0~OjT>ba1J_hQ@=K$8VwOAuJaeE`K zoCC~R45zwr(f0Q>{^I!M?A55Y$~Y5Lxs~mJ8dI!6{eibojJD&HI_6?FlLKafLZZ8U zM`#$8GF4;15H=jKsa>D^uD)jH(bx}0Z=$}X%5Oz^ZPO7e5qy-v)oXg!8En=Vd~ue3 zLfgG10*~^oQ4rnJGzjncH*r#xs2vrgyJpBeOL2>UK*tS!8eyU`L&MPTqQ=+_8&kyh z+VhE&k;ooYmcw4@v%ETXTp7I0>DzW(Ymwux;;*4Qs1ejhrE`x4$_-sAyp|MEfVn3p z)@mD>o{OB)LWSa(RhLmZeTP*vjpd;N=J_>L$-9ZXE$_UykJPGl!ilJY zXP*eH7p1sA`NB-cmu)guA({c+YX|UXfuRX1nh!+rb=-44+pkX8n{KVce24nCw0V)q zJAiQX+yoWzthi;BPWz#0@R4Ap^4p-{(cHA!AI@8T@E>HB`(5!9L>%7iC^6=8av8osQ$G?3b!b zK5$oX?#kVX9y8=+g|4zON_dxGOiiXJbi!F_Z`}W~T{~{&z_e|GD2Q}o1ry3eim1iC z7RVh<+oBJ2B^E(nt16>_9EaP>TD`LY`x%#<>&%XX%6K)BCzADWqJ_DM*DPQ_sI&WF zL~{djZCO5qQq_M1U@8&U0fZ5)~m~GkeiV zZNbJWN^6_67HF!p9mLCzMW`054NYiUS52t|oM4?3i>)F#r?W`mbVtLtb&Gk2Ff!Zw zWo7!t2Ig3`DQJ*?P2?krJ?a&mv#)O3zqM$X@rDfgskB>hpMxb32Aw?PN%I~-sYmT6?z|?z5A&2 z1SnH(Q`#NZ-NK@;i*ly1SSu*f&{wb&{20#Sfu>IdXen?+$)K8t6dhNjNB5P9y+yR+ zd_1c+h3($&S9G{SwqR(%KGL#L06M`&OVIM&)A?_2S;9@RgfGxQVhWyGG~t|!oAku& zpg9d?`9E_ zC=NRWV2?@2L2fxhpg9knN*j-qy<{?9B_@(F((L@sKQA}>^-|r0l`yU_7a>qP-+Ccj z$(mYp)g!xIJDeGdEvHpLx(^>UL));}nlSCDqAB6Y>8B+CTx?5?PIyXh0NKteS@tR> zARH3xjn|{$MZjh&9iXft@5jB&&Oo%`cbHPvUYMfFlGWmQL5#eFsznmBi5P3>(Eoxx99wLj~ zscc^3QQklyn1L-L)-dt;S%*-Qw$fySTXw!#ozseh%XB?t#vh#-ed-M5Bclp4+YLhS z$!>7;>Z(JHcKkg}jibsol9Mt3(cCwsq29TRYl{n*V+nOtRgbYU

`wbJ6WgF;-v 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 DD^}2O diff --git a/src/kernbench/common/ipcq_types.py b/src/kernbench/common/ipcq_types.py index fa499fc..200e138 100644 --- a/src/kernbench/common/ipcq_types.py +++ b/src/kernbench/common/ipcq_types.py @@ -135,6 +135,13 @@ class IpcqRecvCmd: "return_slot" — return slot address as-is (default, zero-copy). Kernel uses the slot memory directly. "copy_to_dst" — copy slot data to dst_addr, then return. + + ``consume`` (DIAGNOSTIC ONLY): when False, recv still blocks until the + payload lands in the slot, but skips the slot-read latency charge + (slot-IO + PE↔bank fabric drain for SRAM/HBM tiers). This exists + solely so the pe2pe overview plot can compare apples-to-apples + against tl.store (a one-sided write that pays no read on DST). Real + kernels always need the data they receive — leave this True. """ direction: str | None # None → round-robin (weak fairness, D4) @@ -146,6 +153,7 @@ class IpcqRecvCmd: dst_space: str = "" # used only when recv_mode == "copy_to_dst" blocking: bool = True data_op: bool = True + consume: bool = True # DIAGNOSTIC: see docstring # ── D12: IpcqDmaToken (PE_IPCQ → PE_DMA, vc_comm) ─────────────────── diff --git a/src/kernbench/components/builtin/pe_dma.py b/src/kernbench/components/builtin/pe_dma.py index 35fca81..7e11b8f 100644 --- a/src/kernbench/components/builtin/pe_dma.py +++ b/src/kernbench/components/builtin/pe_dma.py @@ -222,10 +222,24 @@ class PeDmaComponent(PeEngineBase): # ADR-0023 D9.7: charge IPCQ slot-WRITE latency against the # backing-memory tier (tcm/sram/hbm) before the atomic block. # Must come BEFORE the atomic write→IpcqMetaArrival pair (I6). + # SRAM/HBM also pay a PE_DMA→bank fabric drain (slot lives on + # the cube NoC); TCM is per-PE local and skips this hop. from kernbench.common.ipcq_types import slot_io_latency_ns - slot_write_ns = slot_io_latency_ns( - token.dst_endpoint.buffer_kind, token.nbytes, - ) + buffer_kind = token.dst_endpoint.buffer_kind + if buffer_kind in ("sram", "hbm") and self.ctx is not None: + cube_prefix = self._pe_prefix.rsplit(".", 1)[0] + bank_node = ( + f"{cube_prefix}.sram" if buffer_kind == "sram" + else f"{cube_prefix}.hbm_ctrl" + ) + try: + path = self.ctx.router.find_path(self._pe_prefix, bank_node) + bank_drain_ns = self.ctx.compute_drain_ns(path, token.nbytes) + if bank_drain_ns > 0: + yield env.timeout(bank_drain_ns) + except Exception: + pass + slot_write_ns = slot_io_latency_ns(buffer_kind, token.nbytes) if slot_write_ns > 0: yield env.timeout(slot_write_ns) diff --git a/src/kernbench/components/builtin/pe_ipcq.py b/src/kernbench/components/builtin/pe_ipcq.py index 43a456c..d2c96a5 100644 --- a/src/kernbench/components/builtin/pe_ipcq.py +++ b/src/kernbench/components/builtin/pe_ipcq.py @@ -332,12 +332,37 @@ class PeIpcqComponent(ComponentBase): # ADR-0023 D9.7: charge IPCQ slot-READ latency against the # backing-memory tier (tcm/sram/hbm). Recv blocks for the # kernel-side slot consume; pe_exec_ns reflects this cost. + # SRAM/HBM live on the cube NoC behind a router-attached link, + # so reading a slot also pays a PE→bank fabric drain. TCM is + # per-PE local and skips this hop. + # + # cmd.consume is a DIAGNOSTIC flag (default True). When False, + # the read charges below are skipped — used only by the pe2pe + # overview plot for an apples-to-apples comparison against + # tl.store (one-sided write, no read on DST). Real kernels + # always consume; this branch must not be exercised in + # production code paths. from kernbench.common.ipcq_types import slot_io_latency_ns - slot_read_ns = slot_io_latency_ns( - self._buffer_kind, req.result_data.get("nbytes", 0), - ) - if slot_read_ns > 0: - yield env.timeout(slot_read_ns) + nbytes = req.result_data.get("nbytes", 0) + if cmd.consume: + if self._buffer_kind in ("sram", "hbm") and self.ctx is not None: + cube_prefix = self._pe_prefix.rsplit(".", 1)[0] + bank_node = ( + f"{cube_prefix}.sram" if self._buffer_kind == "sram" + else f"{cube_prefix}.hbm_ctrl" + ) + try: + path = self.ctx.router.find_path( + self._pe_prefix, bank_node, + ) + bank_drain_ns = self.ctx.compute_drain_ns(path, nbytes) + if bank_drain_ns > 0: + yield env.timeout(bank_drain_ns) + except Exception: + pass + slot_read_ns = slot_io_latency_ns(self._buffer_kind, nbytes) + if slot_read_ns > 0: + yield env.timeout(slot_read_ns) # Diagnostics trace (D14) from kernbench.ccl import diagnostics diff --git a/tests/test_ipcq_buffer_kind_latency.py b/tests/test_ipcq_buffer_kind_latency.py index 027a107..20e26d7 100644 --- a/tests/test_ipcq_buffer_kind_latency.py +++ b/tests/test_ipcq_buffer_kind_latency.py @@ -43,20 +43,30 @@ from tests.test_allreduce_multidevice import ( ) -# Expected per-tier BW + overhead (Phase 2 will encode this in -# pe_ipcq.py). Mirrors topology.yaml component values. -_EXPECTED_BW = { - "tcm": (512.0, 0.0), - "sram": (512.0, 2.0), - "hbm": (256.0, 6.0), +# Expected per-tier (slot intrinsic BW, fixed overhead, PE↔bank hop BW). +# Slot intrinsic mirrors _BUFFER_KIND_BW in src/kernbench/common/ipcq_types.py. +# PE↔bank hop reflects topology.yaml link BWs: +# - TCM is per-PE local → no hop, encoded as inf. +# - SRAM bank sits on cube NoC behind sram_to_router_bw_gbs = 128 GB/s. +# - HBM ctrl sits on cube NoC behind hbm_to_router_bw_gbs = 256 GB/s. +_EXPECTED_TIER = { + "tcm": {"slot_bw_gbs": 512.0, "overhead_ns": 0.0, "bank_hop_bw_gbs": float("inf")}, + "sram": {"slot_bw_gbs": 512.0, "overhead_ns": 2.0, "bank_hop_bw_gbs": 128.0}, + "hbm": {"slot_bw_gbs": 256.0, "overhead_ns": 6.0, "bank_hop_bw_gbs": 256.0}, } def _expected_slot_io_ns(buffer_kind: str, nbytes: int) -> float: - """Per-access latency the model is expected to add (write OR read).""" - bw_gbs, overhead_ns = _EXPECTED_BW[buffer_kind] - # 1 GB/s = 1 byte/ns - return nbytes / bw_gbs + overhead_ns + """Per-access latency the model is expected to add (write OR read). + + Includes the PE↔bank fabric hop for non-TCM tiers — SRAM and HBM + live on the cube NoC behind a router-attached link, so each slot + access pays a fabric drain in addition to the intrinsic slot-IO. + """ + tier = _EXPECTED_TIER[buffer_kind] + bank_hop_ns = nbytes / tier["bank_hop_bw_gbs"] + slot_io_ns = nbytes / tier["slot_bw_gbs"] + tier["overhead_ns"] + return bank_hop_ns + slot_io_ns def _run_torus_allreduce( @@ -114,12 +124,19 @@ def _run_torus_allreduce( # ── Phase 1 assertions ─────────────────────────────────────────────── -def test_slot_write_latency_orders_tcm_sram_hbm(tmp_path): - """tcm < sram < hbm at 8192 B per send. +def test_slot_write_latency_orders_tcm_hbm_sram(tmp_path): + """tcm < hbm < sram at 8192 B per send. - Pre-Phase-2: all three return the same pe_exec_ns and this - assertion fails. Post-Phase-2: the per-tier BW + overhead make - hbm visibly slower than sram, which is slower than tcm. + The ordering is set by the topology link BWs, NOT the intrinsic slot + cell rates: SRAM and HBM both live on the cube NoC behind a router + link, and SRAM's link (128 GB/s) is the narrowest in the system — + narrower than HBM's (256 GB/s). So once the PE↔bank hop is charged, + SRAM ends up the slowest tier even though its slot cell array has + the same intrinsic BW as TCM. + + Pre-fix model misses the PE↔bank hop entirely → assertion FAILS + (today's ordering is tcm < sram < hbm). Post-fix model includes the + hop → assertion PASSES. """ n_elem = 4096 # 8192 B per slot lat_tcm = _run_torus_allreduce(tmp_path, buffer_kind="tcm", n_elem=n_elem) @@ -130,21 +147,22 @@ def test_slot_write_latency_orders_tcm_sram_hbm(tmp_path): exp_tcm = 2 * _expected_slot_io_ns("tcm", n_elem * 2) exp_sram = 2 * _expected_slot_io_ns("sram", n_elem * 2) exp_hbm = 2 * _expected_slot_io_ns("hbm", n_elem * 2) - # Floor margin: 50% of the raw expected per-access delta — lets Phase 2 - # implementation choose to charge only one side without breaking the test, - # but still requires a clearly observable gap. - margin_sram_tcm = 0.5 * (exp_sram - exp_tcm) - margin_hbm_sram = 0.5 * (exp_hbm - exp_sram) + # Floor margin: 50% of the raw expected per-access delta — lets the + # implementation choose to charge only one side without breaking the + # test, but still requires a clearly observable gap. + margin_hbm_tcm = 0.5 * (exp_hbm - exp_tcm) + margin_sram_hbm = 0.5 * (exp_sram - exp_hbm) - assert lat_sram > lat_tcm + margin_sram_tcm, ( - f"sram should be slower than tcm by ≥ {margin_sram_tcm:.1f} ns " - f"per allreduce, got sram={lat_sram:.1f} tcm={lat_tcm:.1f} " - f"(delta={lat_sram - lat_tcm:.1f})" + assert lat_hbm > lat_tcm + margin_hbm_tcm, ( + f"hbm should be slower than tcm by ≥ {margin_hbm_tcm:.1f} ns " + f"per allreduce, got hbm={lat_hbm:.1f} tcm={lat_tcm:.1f} " + f"(delta={lat_hbm - lat_tcm:.1f})" ) - assert lat_hbm > lat_sram + margin_hbm_sram, ( - f"hbm should be slower than sram by ≥ {margin_hbm_sram:.1f} ns " - f"per allreduce, got hbm={lat_hbm:.1f} sram={lat_sram:.1f} " - f"(delta={lat_hbm - lat_sram:.1f})" + assert lat_sram > lat_hbm + margin_sram_hbm, ( + f"sram should be slower than hbm by ≥ {margin_sram_hbm:.1f} ns " + f"per allreduce (sram bank link 128 GB/s is narrower than hbm " + f"link 256 GB/s), got sram={lat_sram:.1f} hbm={lat_hbm:.1f} " + f"(delta={lat_sram - lat_hbm:.1f})" ) diff --git a/tests/test_ipcq_buffer_kind_locations.py b/tests/test_ipcq_buffer_kind_locations.py new file mode 100644 index 0000000..e273b7a --- /dev/null +++ b/tests/test_ipcq_buffer_kind_locations.py @@ -0,0 +1,208 @@ +"""Phase 1 micro-tests for IPCQ slot-memory PHYSICAL placement. + +The current model in ``_BUFFER_KIND_BW`` (src/kernbench/common/ipcq_types.py) +charges only an intrinsic-memory term for IPCQ slot read/write:: + + TCM: nbytes/512 + 0 + SRAM: nbytes/512 + 2 + HBM: nbytes/256 + 6 + +This treats SRAM and HBM as if they were per-PE local. The topology +declares the opposite — both live on the cube NoC, behind their own +router-attached link:: + + topology.yaml:130 sram_to_router_bw_gbs: 128.0 + topology.yaml:129 hbm_to_router_bw_gbs: 256.0 + +So a correct model must charge a PE→bank fabric drain for SRAM and HBM +on both ``tl.send`` (writer landing bytes into the cube SRAM/HBM bank +via PE_DMA → router → bank) and ``tl.recv`` (reader pulling bytes back +across the same link). TCM stays free of that hop because it is +genuinely per-PE local. + +The three tests below run the existing torus_2d 6-SIP allreduce harness +with ``buffer_kind`` flipped between tcm/sram/hbm and assert invariants +that the post-fix model must satisfy. They EXPECT TO FAIL today because +the simulator under-charges SRAM and HBM by skipping the PE↔bank hop. + +Phase 2 will edit: + - src/kernbench/components/builtin/pe_ipcq.py (_handle_recv: add + compute_drain_ns(pe→bank, nbytes) for sram/hbm) + - src/kernbench/components/builtin/pe_dma.py (_handle_ipcq_inbound: + add second-leg drain for sram/hbm-destined slots) + +Tests must NEVER be weakened to make Phase 2 pass — invariants below +follow from physics (link BW × payload), so any model reflecting the +topology will satisfy them by construction. +""" +from __future__ import annotations + +from pathlib import Path + +import pytest +import yaml + +from kernbench.runtime_api.context import RuntimeContext +from kernbench.runtime_api.types import DeviceSelector +from kernbench.sim_engine.engine import GraphEngine +from kernbench.topology.builder import resolve_topology + +from tests.test_allreduce_multidevice import ( + _write_temp_configs, + run_allreduce, +) + + +def _run_allreduce_with_buffer_kind( + tmp_path: Path, *, buffer_kind: str, n_elem: int, +) -> float: + """Run one torus_2d 6-SIP allreduce with the given buffer_kind and + return critical-path pe_exec_ns (max across all PEs). + + Mirrors the sweep harness in test_allreduce_buffer_kind_sweep.py + so the assertions below compare apples-to-apples against that PNG. + """ + sub = tmp_path / f"{buffer_kind}_{n_elem}" + sub.mkdir() + topo_path, ccl_path = _write_temp_configs( + sub, + sip_topology="torus_2d", + n_sips=6, + algorithm="intercube_allreduce", + sip_w=3, sip_h=2, + n_elem_override=n_elem, + ) + + with open(ccl_path) as f: + ccl_cfg = yaml.safe_load(f) + ccl_cfg.setdefault("defaults", {})["buffer_kind"] = buffer_kind + ccl_cfg.setdefault("algorithms", {}).setdefault( + "intercube_allreduce", {}, + )["buffer_kind"] = buffer_kind + with open(ccl_path, "w") as f: + yaml.dump(ccl_cfg, f, default_flow_style=False) + + topo = resolve_topology(topo_path) + engine = GraphEngine(topo.topology_obj, enable_data=True) + spec = topo.topology_obj.spec + + with RuntimeContext( + engine=engine, + target_device=DeviceSelector("all"), + correlation_id=f"loc_{buffer_kind}_{n_elem}", + spec=spec, + ) as ctx: + result = run_allreduce( + ctx, engine, spec, + algorithm="intercube_allreduce", ccl_yaml=ccl_path, + ) + assert result["ok_cubes"] > 0, "allreduce did not validate" + + pe_exec_vals = [ + float(tr.get("pe_exec_ns", 0.0) or 0.0) + for _, (_, tr) in engine._results.items() + if isinstance(tr, dict) + ] + return max(pe_exec_vals) if pe_exec_vals else 0.0 + + +# ── Phase 1 assertions ─────────────────────────────────────────────── + + +def test_sram_meaningfully_slower_than_tcm_at_large_payload(tmp_path): + """At 32 KB / PE the SRAM-backed allreduce must take meaningfully + longer than the TCM-backed one because every IPCQ slot access goes + through the 128 GB/s SRAM↔router link, while TCM stays per-PE local. + + Floor justification (physics, not implementation): + Per-IPCQ-roundtrip the SRAM tier adds 2 × nbytes/128 ns over TCM + (one PE→SRAM hop on send-inbound, one SRAM→PE hop on recv). + At 32 KB: 2 × 32768/128 = 512 ns added per slot exchange. + With ≥ 10 critical-path exchanges in a 6-SIP torus_2d allreduce + this is ≥ 5_120 ns. The threshold below is half that to leave + room for differing critical-path counting. + + Pre-Phase-2: gap is constant 48 ns (just the SRAM overhead × 24 + slot accesses); test FAILS. + Post-Phase-2: gap scales with payload; test PASSES. + """ + n_elem = 16384 # 32 KB / PE + lat_tcm = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="tcm", n_elem=n_elem, + ) + lat_sram = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="sram", n_elem=n_elem, + ) + delta = lat_sram - lat_tcm + THRESHOLD_NS = 2_500.0 + assert delta > THRESHOLD_NS, ( + f"SRAM should be ≥ {THRESHOLD_NS:.0f} ns slower than TCM at 32 KB " + f"because each IPCQ access pays a 128 GB/s PE↔SRAM hop. " + f"got tcm={lat_tcm:.1f} sram={lat_sram:.1f} delta={delta:.1f} ns" + ) + + +def test_sram_tcm_gap_scales_with_payload(tmp_path): + """The SRAM-vs-TCM gap must grow roughly linearly with payload size. + + Pre-Phase-2: the only difference between TCM and SRAM is the SRAM + per-access ``overhead_ns = 2``, which does NOT scale with payload — + so the gap is the same constant 48 ns at 8 KB and at 32 KB. Ratio = 1. + + Post-Phase-2: the dominant term is 2 × nbytes/128 (PE↔SRAM hop on + write+read) which IS linear in payload. Going 8 KB → 32 KB (4×) + should produce a gap roughly 4× larger. + + Threshold below is 3× to keep slack for fixed-overhead effects. + """ + lat_tcm_small = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="tcm", n_elem=4096, # 8 KB + ) + lat_sram_small = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="sram", n_elem=4096, + ) + lat_tcm_large = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="tcm", n_elem=16384, # 32 KB + ) + lat_sram_large = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="sram", n_elem=16384, + ) + + gap_small = lat_sram_small - lat_tcm_small + gap_large = lat_sram_large - lat_tcm_large + + assert gap_small > 0, ( + f"sanity: SRAM should never be FASTER than TCM, " + f"got gap_small={gap_small:.1f} ns" + ) + assert gap_large > 3.0 * gap_small, ( + f"4× payload should produce ≥3× SRAM/TCM gap (linear in nbytes " + f"because of the 128 GB/s PE↔SRAM hop). " + f"got gap_small={gap_small:.1f} (8KB), gap_large={gap_large:.1f} " + f"(32KB), ratio={gap_large / max(gap_small, 1e-9):.2f}" + ) + + +def test_hbm_pe_hop_charged_at_large_payload(tmp_path): + """At 32 KB / PE the HBM-vs-TCM gap must exceed the gap that comes + purely from HBM's 256 GB/s intrinsic slot-IO disadvantage. + + Pre-Phase-2 the entire HBM/TCM gap is just the slot-IO term + (24 × (nbytes/512 + 6) ≈ 1_700 ns at 32 KB). Post-fix adds another + 24 × (nbytes/256) × 2 ≈ 6_144 ns from the PE↔HBM hop on send and + recv, so the total HBM/TCM gap should clearly clear 4 µs. + """ + n_elem = 16384 # 32 KB / PE + lat_tcm = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="tcm", n_elem=n_elem, + ) + lat_hbm = _run_allreduce_with_buffer_kind( + tmp_path, buffer_kind="hbm", n_elem=n_elem, + ) + delta = lat_hbm - lat_tcm + THRESHOLD_NS = 4_000.0 + assert delta > THRESHOLD_NS, ( + f"HBM should be ≥ {THRESHOLD_NS:.0f} ns slower than TCM at 32 KB " + f"once the 256 GB/s PE↔HBM hop is charged on each IPCQ access. " + f"got tcm={lat_tcm:.1f} hbm={lat_hbm:.1f} delta={delta:.1f} ns" + )