From c8a787d22c11a340953142d15fcab194d7f49593 Mon Sep 17 00:00:00 2001 From: Sy Date: Fri, 3 Jul 2020 14:21:00 +0200 Subject: [PATCH] optimized 5G NR LDPC decoder --- .../generator_bnProc/bnProcPc_gen_BG1_avx2.c | 4 +- .../generator_bnProc/bnProcPc_gen_BG1_avx2.o | Bin 0 -> 67136 bytes .../generator_bnProc/bnProcPc_gen_BG2_avx2.o | Bin 0 -> 68416 bytes .../generator_bnProc/bnProc_gen_BG1_avx2.o | Bin 0 -> 43488 bytes .../generator_bnProc/bnProc_gen_BG2_avx2.o | Bin 0 -> 43688 bytes .../generator_bnProc/bnProc_gen_avx2 | Bin 119536 -> 119560 bytes .../nrLDPC_tools/generator_bnProc/main.o | Bin 0 -> 3704 bytes .../generator_bnProc/sauvegarde.tar.gz | Bin 0 -> 9262 bytes .../bnProcPc_gen_BG1_avx512.c | 1768 ++++++++++++++++ .../bnProcPc_gen_BG2_avx512.c | 1770 +++++++++++++++++ .../generator_bnProc_avx512/bnProc_gen_avx512 | Bin 57368 -> 119632 bytes .../generator_bnProc_avx512/main.c | 8 +- .../bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c | 440 ++++ .../bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c | 799 ++++++++ .../bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c | 153 ++ .../bnProcPc/nrLDPC_bnProcPc_BG1_R13_AVX2.h | 14 - .../bnProcPc/nrLDPC_bnProcPc_BG1_R23_AVX2.h | 14 - .../bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h | 14 - .../nrLDPC_bnProcPc_BG1_R13_AVX512.h | 743 +++++++ .../nrLDPC_bnProcPc_BG1_R23_AVX512.h | 293 +++ .../nrLDPC_bnProcPc_BG1_R89_AVX512.h | 147 ++ .../nrLDPC_bnProcPc_BG2_R13_AVX512.h | 441 ++++ .../nrLDPC_bnProcPc_BG2_R15_AVX512.h | 751 +++++++ .../nrLDPC_bnProcPc_BG2_R23_AVX512.h | 181 ++ 24 files changed, 7492 insertions(+), 48 deletions(-) create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG2_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/sauvegarde.tar.gz create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG2_avx512.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R13_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R15_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProc/nrLDPC_bnProc_BG2_R23_AVX2.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R23_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R89_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R13_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R15_AVX512.h create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R23_AVX512.h diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c index feb0fa7089..fd01558049 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.c @@ -71,7 +71,7 @@ fprintf(fd, "// Process group with 1 CNs \n"); // Process group with 2 CNs - +/* if (lut_numBnInBnGroups[0] > 0) { // If elements in group move to next address @@ -123,7 +123,7 @@ fprintf(fd, "// Process group with 1 CNs \n"); } // ===================================================================== // Process group with 2 CNs - +*/ fprintf(fd, "// Process group with 2 CNs \n"); diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProcPc_gen_BG1_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..8caf4b85a31f5704239e0d6aa2071be5529f93a2 GIT binary patch literal 67136 zcmeI5349b~^7nf(IVL0|Kmb8NM>z~vG6{!4u1E|7#3)HJv}`g=G?;RljB@2ix!tP!D?%f6#=_|Uv=#mqjZ7I5J zMF7YrO>fbv&26aYu(vE)Rk*!q`LgX+W4i5F^La_(_Hc(7WaGgQ{WtdRHW%*3SKHC9 zS_g4OL5{@{MnN)_u@^y9Fv7N&pDX;pa*R(sHWUJR(#%cUxTx#U{p#wgZ`D)p>i1K- zzA0M1$(8=Fb-||e3rgZFEB)cZ55Tgr@B;{+I@2HCVg?gFC85l!Ev`+jEl=%8dg`0_ zRfSuPtD?)guYizDnsyhtwp`LBvL8eZ_7Py|8?E$>$}WEbYW7vM>Z!+u>q$9E?;0Q8 zwYl&^GsU}_E-Cyl{l3DjtNs*uIJD!ua2NZ(<#O2h@?{^o7N1Yb3cR@jEs)$^vrsCqFm80p5RgTE~Qp<6$o|GtA9v8mVPc6rh;V$;E97lz3 ziRBpAR*q4EkFaN|xhO>(Wvd7Qk;DA(SgC8j%F!LI98G7eazv)19P#vlW+TG%?qfMd z*b>Xp-R{dVK3X}N&RFG$Oh-8$fO3p)_vM%ntsG5fta3!AqZ|)FIVQCGa!ia?j;1qK zIU>_hjt8I|6We_`CPgbp(;2HAk?APM15l1h?Yy8mF zEAQilo(Nmwg`Q4r((cPK zHCj2E&RFG$%rCVZ+ts%+scq%>fBIV){pi>^S~;4|SmlUJM>&e4V}$Qk_VMT#VM~0o z?%eLnF)dm-n$B3|h)hR09)NO8Yxm`t9<3ZrXRLBWrlTAWKslzj`*Q3OtsG5fta3!A zqZ|)FId*CH<=8b^IhxK`<%mp2IUay=?Aq?jv0JoqG@Y@^5t)v1JOJg`t=*SnMznG? zow3RhnT~Qi0Ogp`?#r=zv~o0^vC0vdUurqFt8Znxx0Pc%{Z^(&v~o0^vC0vdj&c-7 z$NwMS%JgU_5Ns5$ox{vv0Z&D)3dD{+v&G52SqDK(;2HAk?AN$ zadeFE-OB&`t;|8~z8rf+D@W5As~nN(D8~a(j=kD_IrffLj;1qKIU>_hjt8I|d$;>? zJUCi8n$B3|h)hR09)NN@xZRgypJ?T1I%Ab1G9Bf30LrmXyD!JS(aO#ra3DUU(Y*v@6!q9B*08hr{D8cV^Jo|M#t#6;6;S*a=U2?^jV!JP;TJSQZA=R~*L3>21x zcz2{FE-ubQ;OUguJsEatd6LYt%L04PgE}Q7q$PDu^dxslPEG3)7ayOP=mF=Q6Os}W z;@s|d`#*@;_#a~arM9?uw+pOdRLDs3)fMATK-dwO$Et55U5<{WDT?8#*%HV?F8q3z72-XeG$2fg#) zQ2~$h;jsoDzXAJ3c)Sdc58;upANetQG55(saX}3B9N1%Rgmp6)H$xv=nvEVIXVw6C zjD`oyU6f^vHLiKQ1zBn?unLx-3vyT;Z=RF0ZQgH)JoYon2p7I=eKxwto6CvkQu;T|8+@PVt<94aG;FG&eV^ z(mK;BD5aD7+uB!EW7uQvld87Hstf~#>6$giSoxMzI zEFVUe>gxJA{s!+bFF11;u$a&c*~FxAiP!MeZv-w_l>O@H)Cwo(4oT?4IQ6r&vM)R zm~G62LU6@3W`2uH7YF@;s=Q)&${C%>$3Ab-{K59%*!<%5Is35vyhV`O9CSgk{)GL* zSiu3tAhtI}*cL)bSy=RJfCH+RwgdgwHS5QCmFw zCX?2@h80J&?OBOYyk@Zbu=5a&M2$aePMw1|X@u>U6@nTx?zb&)w*9`=k}V3h-A~qn z81H^*f$e`^wJ&zWu(Gx7WOP@x#7yHjzW86Iy@k!AKcr>(nd#G>4jh znnkUj=27dXnbi7Q=Q479xiRK3w{;$s?PKI`TrMS0**-@8a%1E#H%9()W8^P4M*ebR zNB7`4U6C%|c-<@VSu2lEx% zn0-mZvE-a#EOAL@3&%2Ixv|9C7PrTFLC20OcRYM#McTdfVnch{Eb*7lpw9Tq%qsdw z@FaTRBes?3`2e1i%&NV=1mAyP)sAR;;#Wbi!RP_|da`+O)_>Rrs~%_lzh=FQv;L!5 z@8zuTHS5l)RifoGjZFL4oanL}KBp09H}af@+iv7LjRd<<Yv)8kJ6?v&%#ra2j3hM$lkVjJ?=*aNW3AK3u^StlMy}mxaT+6BcfdA}IE_(uY@3|M zk*-%@KhIbx&~GK)XwO5h#C2wnPF~lWRb2m#87|Jloo2LMU^)_wT3%+kdb|RyxHUyiU*FxZzqmD(POINeyS2b+ z9rC^1n%nhs%av!Mi(7Mo({q&5I>u>@HQ~msIo?Wr7go&9>`})#<2Adp+c}Vhj{rzD z8-GYv4`dFOq($F?B^e&hlC%|8Z88l6WpAH=WOaYAF!D!3nh^4cB%gs9p=2gBoxRmp zXg$I6w4TK`hWFU}Z2`L-VQ=)l`6r4MO6m%kd`V|)J)?6&uQ=;P{d zL&>esbi7}ikr*=Gww~*UYdtql(Rywz(R$V`4ezlla5dONV!h+`P_h}CHu)HlNf`Tv zS3}9WiTsercqH%sHk90I$a1LaGvQ?fw2U zL&-UYG&;SM$etMIL+e7xvx$6|$Ydlpz7$H{0ZnH{AKe++V=LH<^*i!Gd;3E=9ERCg z{{?_Of&pN+vqF1&a!e@M9hx>dlSn##Y$^>UCm3=#?7fM|Lov>$FAF6rq3Mj^**mqK z%}<5**xug+yB+aF^zq`ZQ1UrwI^JJSfHxdA>b9O&4h`?=2BBM?{*&Q3!(JV5KfJVU zZn?U;2Bu}CxYPQib#--1>T(bqt$SMTw4+kSrc8xR+yktXlnKxeXG*vVp(Lb(72dhb zi=mPRS?0x);c};?q?m18&`j>!>L?HBPS{MCnqitLv>V8<%QZE_Y|;5J@RJRlX<4p` zy`3nI=xqYa?{)2@-UdlefVV~`y0~7Dl##9bFwL&eWWC+mdMEZC*Bg?+4Q2yt7(C#u z3>Fv{Tj-6Hne5et@KzgVeF5t(*Y|0i%{NxkH_?8b)r?5f(*>c%p^WjCs;7G_tJ zmS#8QjV>NNa(KPJtg<9H94=QkHf4{@%F7xRisQD~3#)<+=4yFXmh%iN=Km9B&6<9^ zWwl-;H`mc8!G-dY#Z9?cr6#(DU>Tgu!Ub~(2iD8{<**K;3oZ%x8()c0qZt<-5Fk*!W|J-O-a-A>2pTq;1gx(4$V zy*-lRnv(j{{q+r2X`r#VyxxCC@sy&o)JRNv^*Ej6n|nb_$|6q?+_ZvYfytBk)<)?} z6}ShWyt=L=Xzjza8fSI26<+(vOiAQ`A`FR5OipMjSWhnZ$LugbNKtWVV|{UHU3Ftk zEpcMXfrI;hB2IbhaKVv1Tdj2$10Q7-2kKz@q3)fUu&2GTwxOz`)?el=tt^2OX@Giw za;z?+lFY8GtMO+yEXl45_-jk5>LFMD`tp)e|EP)_vgKsYE;>28VAe5HXHKD8k?^w+ zHG_3^)eYJ3iOXMK60EDo8+9U&(2*C+P+hIRtrl^D!V?8~;6rGe*4Ck!`89=SZsV~^ zYiHSFo9YP63ZYDLoSKJJ7`d8sIPz{4MdU!7N-^8REmmc=-Vx*nA*;Btwz0uqmTQ&Q zmee>0A)7b)L_VbMokB2fjZn=|B!bu0gxPaQw_7;{ZpIEN_cxdWK&`(CR9_q@Da&zQ za-A0_Nn;%8yo`!GEl_y0a~YzU0{h?=lFUdqleJZVxi!rRF=V4iNpKDwrYGz;?Hm9> zD{W=Xk`!JnP*wK5bG3D#!pf4WS{O1M4xuiz%K~=p;r^0FxJ}6%C#TFj(OclPuReHl zeL16iqu~p~%sHT-qLQFvA3kEtVDIo6b6o*mf{nHQ@%FgkW;?LfmsXC43mU^mkMs_& z@D7Iy3gb)1zyR!{GfYSgTtl#jV;6?KPfUs!PRz8JL(Sq~3B22pnvJ4bj~8`;092Ie zF0=P%zftl1@ycyYG^;;$V2ct<>su)v(d41sIp~`-n|GjS?+q{>Yf3@EQQl0Lgu$`r zz+7;FrMvTDxz2*GbDFxi`lKd#R>Kt@^IOa2VHW#x)zN8PE{rSaoajDvIv`F*glBWT zD&E?&H$oR&Au_$;i`!f~imo|_AzK*E$kH4~H#y;0SD<|Xyqd*p zKf`VKXm3V4>Eb1{uSL80&0({Ag7zI~@8X!P&QQu`T;}Udv(T5PS!kzHKh^2BrlWlU zyqYD`d9fCueKp#tZdamx6WX(ozYFcV(N6Kdh<4|O0k|BF{4TV6QDR=Se}ndXVNZm% z8P@_~?}7GawCAIr!_mG;*nMaRSN1}@X}B$_R=cb9$t^CQQ-`}%ZDes?-Og9(p+;!A zt}h-7HYWsZylrp#uqP2ktiIMb!nac*3Go;bqv>h&Cwtnwg`du}Z57@ZZM)En z&@}_+G#sulV1|XykSN3ZaDU1fE=H>KM&A~r4coT$#7uME3TXaY0c{r{DG3Vzd!4CM zdZX{UttP@YcVcTxx(>iDLOyARUIP)I{zA^6LqC6u%RnL5O!nckko{*dRztvi#4fkW z&F5_^&+W+)sERdA22TFqMs#bH~dlXAbthfX}?z@e;MP) zGM@gVjrgmPU(a}R?n3_WWOg2>Id3%!`PqPeUUbZsiE}(W$j{qor#yGTx4I96eFxfi z2|Jxv(fK6#@gbjxuVi0f0)Qn=*y%j%FkzpK?ZLv{jDB*2ozC0x(N1~r;;G3rw42TO zyr0DE6QGasGmqJMo*RY#JoJASFGAjY{xFO5 zUm^IF$OjqEgC-@!c|Mv?2g5bS) zY2X!wH}}n&h4MKU`HvNTui#0K&L4Gz>-}In-jjdQw%|#RBN@-@ZJOYHSpTyW-Y@t7 z@{1IHh2UF|zmoAhpBn^E^?WbmdHjDAJn8Xe#&iGg3%&*G;h&7>{*&f?RZ6cgg?`c=>JCHpY-VbDN}enPYRy&_%!p+ z>y7efy3Jde5B2h%!ha$B2ax|(;k#o$`ESAYVfZTZd8FW}p2sns$3Ii>q{n%T=XyLt z@TAAZjOYHZ6+FE^-l*{R3!dVCSm9q5Jn8W@h5x7ENspf>d>kG>DF39#B(%%pNk74p z9uHUeJi${vjaT^N1#kYyz$|kW{!+n{9&cbgpWm&5Cq4dM;r9xj^q7jr30a>*&`$Xz zJszp>GXzh1oWpotZRN-G0JjK6N;r}Ig(&J|epU~BLKcW1S9y_63=HDxL z(&IpdA1ip$W4^+lBzV%}JcU0)@DovoixvKE!IK_0GM>-x=Yl6a?p64H_Fof*pRW!< zyVQG;;7N}sD*Wk!Cp`uj&+F|%!TV4zmni%?!3U7PL*btid<*igFrMf0L%~x$f6RCu z|M!9?J$f>nx|R7n1npGMq{se@=l%->PkJm;_|pVW@s}$662X%m&r$fR1y6dsLE-Nc zJn8X4g?~}-q{mkkey89`kN;A5x)G1^KOgm&fH(5U%|BS-_P4F$q zf5Ld4Py6rfSw5+rlkmn#S)aYpPWdN24q`m_KThzZ$DG9tR@9u4ve{21d9zAH6^L2>e*P51?{pv2MM0;2NG5oZzf$m| z$LkdSUcndPb&3ZR{vU!TJ^qLBe15a~I{BddlOD&SUFzjz!IK`#75)OjlOES7{GEa) zJ>J83UT=RAJn3<>!oMqc(&PII|6jqA9y|4O@+R}+MLXq_>UkjJdHhETp7eMOD`*1W$S_W<2+QuHZ?J7byI%1yAwcs_+j9p7i*b!fz2g>G2JP-z9j`<8Fmd#6O6k z{F5G2&@PWBhY6naI7s2g3BD5bc(lSd3ZC?MKI6x;`F%q0q{kN({v*MY9=}xhj6*~9 zPI~mBUDoqx!PEKbSjJCe@gFC6AD&O1r0~^(43sDsjOYG87JMas|MV&2Co=zOUTDBV^-1Te8D85Qc7NJnv=dM9XDR$Kf~WJ< zsR~~#csgG#Q~0w4Pv@)WD*QEqCq4dJ;adbxdVEOXUlROE)Z-R~k3Y<^7s@B;u`AkT z{ZAJ>>G5QRKU46e#|spGz2HfY_bL3df+sz`$ar3FI|T1Tz3f!@?*$(~-a6dLn>>E@ zK|AHM1^G?;7O1FQTXKkq4i99OhbDdbo22J5IpH|u)p7i(^h5uOa&!ZkcRrtdP zh0Yi0F&phtFN*|EdOTC%uMs@yalOKC52a9CPZB)oaf-sv7d+{4p~5!_{v*`m zGKIfi@TA8l8PDhUTfvha69>1|Gv^1Oo$8tNn4|Es1W$TARpILePkKC)@x0zH6TA=g za;3s=5PSgndlmk9!M7m)2IF~tb_t&9c{k&E{Bc7<>yz}Dj&^zc94L6w;}FJk|I-9d zdYq;3e!)}xixj?D@TA8T3V);ENsnt4{$atB9v@fu*91>`d{f~+5j^Q}kHRMn4V^C! z-iMTmc6mI>7d+{42IG1CtQ0)y@fwByz2HfYn-u;%!IK_$DZFb~=y*wwiD;MO?JIa+ zinIM;3V)>F1IUk4_+JUW1^F_@^L(Bqc&g`f8PD~yM)0J^TNuy%KPY(8G3^<|3dH-|F;UCK0I{3NRQpoF6V2A;7O0!3STIA(&IFRUm$qWqhH~d3ZC@Xtnk+g zJ`?qLqr$%`c+%rLjOX)vP*!L@Nsj~2E|1TX1W$ULrSLU^Cq15}@T&z+dc215yxx8* zcpvJeMd6>qwvcGPw}r*_*(=|di;&TKPq_A1W$TQ&T;Y}^?oSYJ3)7X zL9qS@FrL@jQG)j&KT+XN6np^rQxv{Y@GZ!n&v>5C>jh8sd^6*D{Pzi-^!NwHbN{ak zp7gkl@!bE{f+s!xpzz&toq3`BQ~U>^UDoGt!IK_y6~0LDq{kTwUn+RgW2M5MBY4u| za)rM^@TA9E6#hZMJ3s7YS&u6GzXeZv{EqQ_en*W6%|GdJ656F+76_j7SflWl2%hwK zy~6)a@Y|D|_*@iQwsefO5uj{}&3L?gzL;;nxYC;=e=T{~&m}AK)p4-zNB8M)#elGG~D}3isjz2n{kRH3CT^>&|1y6b$uJ8qdU)jakUy;I}EqK!7D#r8qeMa!4 z$JZ48Gr^M{e^B^?M~CKz^mqi?Wj&7p6dB=#`F09EO^r6Um4H+?-o4i@k_>Y|2>Wj%|Ge!V6@Bn^a-BgAEofe3ZC>h zTj9$EPkKCE;m;F1>G48^ze(_<$8`$7QShY4KPdd`g5Q98+@|m;d7=3yJ@!JotpDQ$ zPkLOS@aG7g^mvKF-z9j`{a#ZMi(fMi*w9EM#DtOYPPvIvEp7eOE!j}mCdDLUM!v9+E zq{llM&*%4j!IK_8Q~1tfL-Rv=JQ(d#?|FhJJr*kbJi(J57cidJ+hW1{P%ldrevRM* z$X~1Q_Y1xS`6n6A^SM>q zQ~bv(e3jrykF^Saf#6Axs}%lL!IK_uQ~1XOPkQ{L!oMMS(&Jwhez)L1LOp(|@Pp0d z!9wTHq{q={mwGuv@TA9c6#gc`lOFF<_|1YRJ#JO_e+i!S_!;AQJts^E9j_1d(h2Rd zKD~kuAU{yy^9A36{0zpM(CB{eQo&O_S2CW*f0p1$j~6kX`@dQ6q{sD)=l=gBc+%r$ zg@0G@6#x4Q|Bc{DkN;Kp3=irb3l#nl!IK`JWjvo>E8p=)`5`@aM!VGSP{ETP^A!Fh!IK_K6@H1}Nss3+-VBB6 z|7yYeP%k$q{C$ECApfAkzbg0^7Cgm&hQePYc+%sg3cp_Pq{llI{t3a89{;59+XYX0d{^QBBY4u| zHwvFNNz51OF$3*pzIgtp2%hwK0^@o8Tp@VU<4p?xnBYl|n-zYi;7O04E4-&5biAa; z&S;Ml>E9(OAI_kySRtz(>dk@@e5b~>Jr9{VVKj^Ig;qZNL-;7O0iDSUyHw906{DAR%eh(=Ot$)(vP_&!;bAGDeNslKfd{FSD$MY2a zI>D13Z(=;Jw+968L%nQN_&*Cifc)zU|8K#!ApafXd49S~4$UXka}Tu3dOkw%q{oqr z=l-V&p7c12@jO3uf+sx&75-wuQ~Xyb{Oy7#J>ISGn*>jKd{*J#7Ch;3hr)j)c+%td z3g2}~=zNhLd!k*=*D%3Xq8@V;-Yf{N5{g(&J+azg_U8$DIoAE(#ql>9Gsi zrQQb#p7c1B@x0!S7Q7GjGFjnI6?_2s5`{lo@GZ!%Vm#01t%9d|zK!ub{)YumdVHGk z-2YpGCq2H$c<%p4!IK`{Q=NH{_0}8h^nOS2AENLh1y6b$qwuo?PkKB-;TH*>^jN3x zD+Et^yjbDa3ZC?MyTU&%_?4)~O$z^o;7O0JX>IxE^E(dhlz-CWRE4h)Jn1p0@K*|+ z^mwbnKO}h4<715H^|nRuKGe$_3cpM60pxcpe9Ez*$CDQ1d!bz(PqGA0^*n;{JpMw# zlOE?Vp3hgM;7N})jOYF@6FlkhN`>Dbc#8jCg@0P`q{rtK{yo8y9zRg{Zv{_!{88b% zPY<0h(qnJ5%i~YB;7N}o6@Hq+&r_S31FK4jJJUZ~tudUx9sinZMQk8Ty}u{l<@p=NfF! z7WRY$$8e&s-(UiRWuf!Z>VF9Or~Q-vAL1P_DENBxzeL!(A%CH;4@LWB!cM=>b+xd6 zjr@(mJ^+)tUf93Eaos8Gw_^K2VegCWM}>VT&hInA-WUD9ChT`$`(t7M5&18Ky+5`s z?58~Uz;>#zZ@@hC680vv4-odJFn*t~_rducC+tbso+|90E4N)g?%OF=Q?4Zg6-RceE|BoU)cMi{Yhb`-&3LA1*36I!2E0%{4H2- zJB2+N$Mw0e7hoRt3i}9br=maF?|nGl-ooA&^FK(~`=fn?un$3dzOd(@eTJ~-q5TwL ze;o5xA?!EcxEh810nEeM!k&lxN@4Gb`@LG&^DzHwg`Ivs?C-+|?g zo5iFZH?`aJ`(nhWA)hb&tjG9I74{WqUnJ~%Z10xUB|CPet2mP!S_GRd2r?Ah& zLF_@h85g>?w@62SG_FeIX+OmK(Ek|0pO1VY+KI=H71r^B{|m-ZEcoNle~sYjr;(Qk z{uJad68zm5&sBmiMgD%l)9+C}A@~6DFA4s7tlMpZUyb}u!9RrUJ%VpRJ{>26@;?v# z_dz@5^F`zb3;tEq-6+9tLB2rnr(ztl1pg-T^98>V?Nx$*2kjRL{xNJ{CHVJ|Unlq( zXuntRyV1^nU(B4hJYf<7%Vxp<=$NgY!v7PP&pm?gf`0Z2ejVCVFt3zGw}B6Z}%l!wrImA5XWJje?(#JpEo6#lHag*95--?e7ZztI__w;J?IiC3&3v zlmAV~4@5iV^Eu>m1iu@3`du*Mw_*JA1W&&cxkUO$KlHm`6pt6{@G8NNLI1Z3|M|$% z?}AZ0GtmC1;1{5MoA6K9Pd*TQGxB=`|4+=%e+9n@`IKZQ&lFFs)3gpkJB^p#R0j%v zAkLpp*y;E%j`_h`lI=a9TEu%sqfvJhT_ z_0DT0t=0RhOR|Fgrl6HoRuU|+vKBTpSXuRTPQ&gk^Dk_yD6Xn4uLH(jFIl*--oF?y zvoV_LOKL0pX45uXbycmOHi7+FS*3L~HU3)IRc&3+pEYIXiNoPXxl2#Sjr^6x<@F^s zejLUAzj$F&lN-t_dCJF?68zjxc1$NVtv;}3N+Q42;;dv|=)BH7-FfW>FJ@aTC##oZ zwg#ac<$_krS||2P9diHXxM+Ot@Al@}f$rhOdy!c90)2JMHEC_z;ks~ z@B-Hh-Sxik#A{vLbroH8QD9{~c4621;$PKWm8q#rO_cS|$AA85otb|1zFl3fUj2G{ zdOFOx6Q>*<=kqzd_?*#BxW!g@O$=Mdy5_M?N2h~xLf*>VdFOq+9!x7AE8V|;f8N%K zo3S5WAEehU_`1yPbr!eqR^ra-zG^x0E1!D;yIpnH7I&m+(x{f|7_YhwU zgsN9)yeMa5w+{f)cc(a zwxnM0JOl_)VKepqZ5Us}EQkA7Zu4#NZF_P@(vx4tublW=>irXU=B@6q9QJ@t_U8Gv zt!fk92cd}V0W9?aC-nhicRvEfedVou^5H>I$LMwqKcKGB_Ex!e*HLy?jID;*TaC55 z;_NPC#`BhK@zJaoz}A>%u&jV7g!!k=m^Bb)npPc*YM9Ec6L+C%&phN9MI2+RC;_pCSQ(8vC0uU8!Ja*n#=JZlw(qpFULTv za>UNY%8{7nay$s-7-%Bpcxcqm<9KPYMXYkf&c@1-nC5ak2<6zK$(LixSmlVFjg=!Y zKi6`M@pVXyi*Qjcr~TOLj!`Z~|G*19QMRNDJuSoK7$f*7+w;|@pUGu#`{$bHpKCcbsc&Ukh0F2(^tUqh(Xn-`a>UNY z%8{7na#TmhDBrF8z@uZ7E$Pj=b(1g0lvw46osE?vG0o+85Xv#7$(Lhlta8N8#>$bH z=5jm;<(S&!%dt(Ya>UNY%8{7nay$s-*rv&sW7}Beh@FjUNY%8{7nay$s-*uBY@V~<$nh@FjIH!xfV?CTz1*TU!c;}a5-0xep$ z_a(FoB*ew};&D4aub>Cmi{l*HJt?_Ge4tezsa4BX$t{ywwrrggNN$yon25cO(<(VW zApx8v_!D7)=Y&M?oap!Ch+s*G_eWde;^HuZK+D7qEnufkAPJv+4%j<&ZkdpflGHje z(4tL?Rw-@b;^Pw&1K_-MLQ-NvoZlbs{s%Fm|Nf5S^ToycePC51_u)Ux*TR?JPYNI@ z{?R^c(&F=XjNU>0ec=`Uy+2`(^WbqD^v;3De0ZD>kG1f)3G5HR<7Ig4f=9vuek6YGw4^6Dl-u3)Z>rCVM1 zx}MHqb!krjx&h9hx^&oEywd_^sH4+GZv#adbJ4tRpWDb1)A;GE%%FDNgss0kKUg$imyL2pFWH3c;#g~5{Y(vtE} za8X4`Q81RDw370g-29sUL2obPYKsT5rL?qaW~e$iFbK{(1}qpFLcv-vW)01+37!({ z7d)$_Q!uZhs-~oT{=i^K!~lcAV19mC_K=|^!6jv7nFH}T%Y6ptUK3WbMg)T>Y{voK zU0|cE?A((6!AeR1>~#b%)QwKLKOEMGh<@BDZto35ZtO;%lMT^N4Z=1V89^LZsJc2h zzpA3PGI&Nw&4OT7aQw7t+~d^Xs9;*3qW-4@2LyAn`i&kvg!UssbHf6R!|E68Tc1(v zo71Q0RM^TJpBoZo5<4Te3lAsib~q=rc-y(dg#CHLq^^klF<)F!6~qY-mW;|AxNubF zh?0?0N0ba0FmU03QQ7V+hVzfx;DkYN`DHkN`Gt#WLX{=C`S6rAG)<0u&cajsxq}n) zN84xF+lR*)WBW|>(|8DT77obrVnCi3h#!kAynR7YQ8mR+eQqUY)<@r9{8{MB+`k+` za6nctoCb$uz*lcyA{7nd@D!0{#~}t$Sx|Udv{9gp!VcvASpsuPP7RNxGE`MoTN4_* zc<5kE$*u9G zGR(BX_9CSm?}5x|%=jB<$9ofD4U7FAP%VhY_Q*Y&ALS(w)>HDkE0Fi2=aA6 z#~iW$9~!s&hAXxcMbg+YCVIUNZdk7k$|q(Tqq`kKZlm`OjoEu-%--CXy~C*2ouBAC z&&p)R=;xCNhx3fDUQ$H5V`++xQ4O~jwHa%Bp-CKw5oi5D-RQ4B6dC>XQ*ZS199sM5 zS+x3j9<6?!NvpqpE~Cen-N-y<*UzJ|eIxlBnav3_wr?bV*^T5cyOI25Ho-oo{rubDLvZdiS5EGedm$yRH{KWM_qo?~{Ba4`6Ca-dr>TxV;I=$0 zGvCGBODdiv>vXilCE*sHC1)90;$4eB;JuJz&y_zOJ~9*Sf9+zV17S=2B~!UGel@O= zkAy&C06yY7iGiK)oP?|H{t`0(1FLRC+Y>*p0UL}SurH3r7jOOBH()j3t$&B>ZM^mG zalMPTz8}}UQ;9^!hmAD%*qrEd8<}1s&TZs+4ZqtM>opSGMxNJ5bQ?3gMv~i@?KN8X z?tl>IdW~e?z0g?THCp>H;!3a4)@{^yjrP6=p=Ytz= z*ErJm3hd_@CmH&k#B1Go=#sbr2kGVYMqH)!n{c=^4;yi`ZD2aj0$XALC$SYyDu&(q z6<9$lPN!>qm#yu&9ufl|fh}pV%YBZkv)ommA6AQDH3c4y&y5S$xaNJoxeJKYnb3t1 z_}9LD4qokYe67*$U%UQXui4>ox4Gk-w#7w`uhT2gid&oK_4U{b`-@wJpi=A zjd!s%0GWd&Y2jC3X#o#!NqP-dT`~m(!IoG_pHBJJxjl8*yDOnfrD1W_|NMF7CHWU z@5@G6JVUN4t3&HO0w>8Cn@wJiUB4~P}y5v5q=h8nm>~X#C0=w(I2l=@C zt4Q)SXnNkSY@Zl0-f+*=gRGwGCRsf<6j(hQ&T81>R^S@2N5p#TEs2t>;)D%|4imG$$P(hY9yHkP1ol@>XbiGy2f($R1b0IM%P(2k-6CR5%Qa zv3>}EJA&R|ceBEKdwf_V*#Vj^IgLp^erzd>Bu67T2=>01$(|JF)2k!N1<>?H@a#sb zXX}#+9IZP!{*>X#Ba$b>CjQ<|a`I^ChchKwg-{Yw!3ytO z_<~eYUk6_T?S1}~mB6+-IAIKliOo6nRf#j_W35a$1PeP27WT2GbPAC4cB5~R_V_r#3HD0YxPxqc-1^=HlefpH+ z9jE>xJzmGh3-twy7H6jyVszCtMQ}0;7wjP%ST70{!#a$vW=UnJ8dl-m5RnRxfarMD zyKY|;Dy%39RprBWNW*(aO-WfOzbsUMO*rVnoO-!}HGi@%&_1xpiHna*Tm#R(HHm?H z-m7=Lw`Tzcz^2oMSoHB@n4Pir>wvK3-SHbZ!kY=Iz56!c{*R)H+IgiR zCx7zv{G%sNndl%3w`)|@992|Q#q^ZYD%c<^edlhrBIdT;pL}<0HleceF(H<_*H?b>lmus-z~AUs+S->~n+sgpn z--0QoIZzV{^Fu>}r0Dsv2JKBPxCfxPw4$KK`2l5s&MM012i+%}!sr1-8IqW%tjJV| zo^0t)*u4VGFRZP~FRUo7Eh}eERRD0g!y>&$Rby}zjCcLr&o0kl~E04099C8#Fdz_prS04QN1LiqB2xoP*Mds2~`yr6o!V( z&th9v#*Dm^GsaJ!FnQV}zKx1LM{%>JqN21q13s;VstRf?lKyAq(gr~25XgH5pV0a6XQ&>LT)!1ZDS55?l$?>uUsX!THIy~9eYax0dUgB|k zxIL`MJq|=E9VfrGytX=2lf%JN>ay_X#CWw7@$B>J>~o_OavM4STmpcj!$cP1h&-r+i8 zb4;AENAI8p1s|?ik%5Ml043wz)K^~N*1@Ttslgc4yb!r(HKOhYz{UUsO{7Z)Ge=ltsO`D=I6Y zEU>%C-Jkm|B=^_wP)bJ-dfyaBp%_z9|2`SsIARvPBQ(wvzI#B%qum7=mOtK8$;H$# zKp3(!Y5e%%!8DksevMBPT#4y`7iM7boe5v}ENw_#lzkuBH!FKGqzw5N$qv`#-34xOckSDheLUIWPZ`{W`Fyg!t?Xx!{e7~#UkSqc z6=dJ5?01v>du4xt>}}u`7rZ?jm)&H~RCXU+3&e5FQ1%{VuT=J7WM8A~Cy;%!vY$@& z9b{kZh2#8+>~rB2m!SI$erY(V zuYln-o$Ordzi@jUXA0Tp!YeLm-ix!4>}$x*b-RM>TgaYH{B304OLmU`MY4N06u{+j z;y)sLkR%o)`?;iW8pD2-VK=`?z<2BVPmAI`@<7k+qrdxm=ly0M zej4#knHrw#*l)z}_DNesd5boB!rt)hSd2G(P7w9;D4n`R@2ihPMGrp1Ba4VJVs8z4 z>iy}Su(zlu6Exq>YHSAx+Sds~XO!M641 zZ4{ObSpMrhSi6WwNdy1X>m|kLjlJt|O*Giti!GdV8-QIze432ByrDkfMVw$qewJ33 zfFiDc{D4zl_s@2m>Pq|=UF;O&XKJUi7QX2$W>aBl1$;g!c0ZxR!L}nEaN+x4_pN3u zz2Edu_VHxzqwGhMeFE9>eH=}b$v%zj_%@#lk8k&T3w+1wE@;O;!()4?XLipA(8X-> zvxMx(4~GZy%gN6BT}S+C!H*C;|H&QmmlJ=Z;PKpr{cjX@87H2%;=+D5k)Ibmvx9Mt zf(QHgE7>{EeBQQG+2KvrT|QFwEoA5ON%q6%d5QGa$@aO#rzkt0_Z+6|d|ud3+4;OG zOWFB6X)M_}4?#LLIfm?*2RZL23j1j2I%#D&MZhj`YF z<~xxNm`|e<&TeGae3s(zmLpt-8a#e3!G-;ABK|mopRf2m#FrZU`HIh^56%}E{B?@2 zB>qN&e^Bw8iGR%C|E&0Z#BVqFe=7b{;{RjtN5FZs%qQ3LV6x+U$@;|40g~r>KHK20 zQ9Rf4MuW#YNu__T=RXsG#e~L< zil0sVv4WTREKoexbFtuM{EHRu-3;zH%LOm}<2|gn@OXDnJnIE7{cllx5Z~ZndDh_n zs(6lnhrxfYc-G@L2H%#BuN*(?u@l*K{s$_a^_XSwc;758?4R{G#o*^Dp7l82;Fl`? zmz2-*4gP+`vmT!oyqw?f70-H1rsK5MZ$Gm0cv+7_4Sts5S&szGWa_cznA!X4gL>`&!h`YZwX%JbFbnniT_OSQZIbTne(}cc)T5#$1DB! zCp+_dh|dtb^gmtkLAq2l%itF(p5w1D_~nY9Oa3o5`1OikPy8(g|A^wZ6Tija@vdQ9 zI6th%zZ(2L#j_qiH~3cce#rh)=)!Vavg`VssCd@nOu@_fU9EW5<245VpyFAN&l>zr z#j_sw8hj!SROFNOm`rv(-oq5ndhBcPBNfkjJj&pIp?KC~iQr{E&s99v^96#Jdbv{Z ztjC)KFa1BH_)MyY#|1C_zpHrG<4%MBO7R^3_XgjAj%V17Z;7nOu4LEqg*TSt!aVD7 zu)!arc-G@|gAXa5^|;XBxxP3a*5h)6zgGDVQU2E({A-G5J-#P+IltZM_{#CH9{Z6U z^C|gBif28}GWaURvmVbi_$xF|abF{NS#O&a&w9Mi;9pWa>v5aGf28vyROeZif27$3tsxqQ#|W&s^DdQ$`sFftTOl&is$%O8~ja*XFYB*_{SB` zdVJd8-&8#7@m+)eRPn6GuM9qw^u+VUdh9@UJzxD5zl_=$24ARn)?=mM<^0~Rc-G^C z2LHO^S&usn-bY`V@pxH}DP-4r@2z>#V?V*mdK;s7*5d?&KSlAZ$9#i7Q}L|Fiv%z8 zd7a|9o^KSqjQ{tFXFWbCcRgaKKfEo*IQ?@^L%mq-3>ll@vO%q z4SuTPS&uUf-uuJg@cSw2vCQC?DgUg;6$XF3;#rS38T>{>4&#j_r(41SH`S&!El{O>eRdVEmuvff@%JnQk#2LBJmvmXCx@GacG zHVoGT>#-Brb$$jap6fYF@G}1Kif28}5WJkPV#Tu_PZPZKze@3}$2A6jtKvES+YSCn z#j_rtGx)a^&w6~%;J;8j>+xHIZ`VGuo>`Bb$*zw-gA~tt%r^Ku#XmuMoNDmrDW3Is zso>@OzMy#4o!M~yScSw(K8+@Bi zk;eztV-K=xz06iT>oH{T%M{OgTx0NeDW3KCh{3v6xqccdFIdA?YWhmc**SEk}wk3$UpSjDp*XBd33;`tWF z(+vIw#j_so5WJk<4;0UO{M6vvb&afN)?-hyYrT(BJnQiogP*H;(ql;Qvfj>8JnON} z;IC9X>+xEHzhCjJ$EO7^^ZBOYxt`w@yo`UZ;#rU1310edPdAuzeX<_AkX_ejuHspb zqYVCd#dG|#4Zd9QtjB7DU#WQ3CQ3gpp2A`w&O5$@3ewyN0 zkH;H)iQ-w0+xj4%lf%o@vO%U2LFWOS&uIp z{D+EXJ$_;E@UM}%3)d%qU)zrCdc0|h=kwJ;20vc$e7>4z@P&%!^VLeh%Y0s_cs}1- zCHOHgLOvc|r+7YJ{jK1o|1FB&L*IiwD|qRDx8nJH^+SVq4v)+~$DcrUo&Ro%=kwK| z!4FkDpRbNE_~R7M=c^|ge5vADkEa{_MT%!VUSjY!Dn3BpTWmD=zbc;fxJU4EetY$b z%s=Zflk9QOE%|ARXFbj__$7*GJzi+=ztKFMUu_V)thWag&w6~+;Qyp}*5exn|8K>! z9`_4g=BH!t$b51=A3}D_r;LA~;#rTw1TXzhS3G}yoF#bazee$_$0Y{;E5&pCmmBkwN2iZBFFOC7$j--q)?+t=&r*CE>2avRFH}71 z@eIMs`Mp>1tj8w|{vE}$9zQhrK;OvvWIc8yyVm;v&66H81uyIEXvMQ0k2UxL#j_rZ z4gNgEvmP%Myv*m#isyR1P4F`QM-#@e*FIGJ3@mB_ai{e?2zcu(Riq9iGK5Ot_DW3J1 zm=-=h$oV~r?0kG+Jx(+DQpK|#ml*t2if29EZ14|jp7i*H;AOr2Me(f1w+w!-;#rTM z8GM_5k@d`a>_K*YJjqc!*K@AmW&Fn|p7nT=;N^UkDW3IMC3xw7o#I)KR~h`Bis$(6 zHTdTh&wBiW!S7T&>v504f3JAfqrZQ+p5=JElAY_B^?0bk4^}+uahSnRSNsCf<1B+; zp?KEg6@r)ZyG`+|$9D|=8^yC80|UbOk^cLVy(M%fz=QReWAKwTpX~XaCU}|uBE_>F zOAP*8#j_qSF!&o3&w9K=@N&FQDW2F^XPb;4F_`JcttN0b9 z$DIb>d5||RoPXA1Z?fy-dA{OVkEI5GvEo^eR~h_$if27OW$@cIpX`n29l^_b`;X#T zk6#*mN_u2|SdZ<=uFv1#pLcf`&L`_}gy5xKj#E6>^NE6&@h?z3>#iX(e+u_d@0uBzPu62!vTMChP(17LID?NLw^L()$#|d86&r-#+9xpcdO^Rnd-e>TCRy^x*hrxfY zdD7!If|uiMo8#qy$IE)`M0S0=9jJKLBmDDB?xOiAif28ZEO?pE3dM6h*9cz5f1%=8 zkCzEv`oB%_{Qh{C;HCdp6wiA6v%&vE@f`m@4L*KwWd2!?Ey%9(*;DbX$KD1%T=A^O zF$RBv;#rTU7<{GTS&y{_ze@3YNRMj_{u#xy9$yu_oZnVMBJ;_5>`Hchd_Gd~tj7rk zKTq+j#|ndAu6Vv5;9|kcdRwn}z8~NggMUQvd_TYzga51I`F?;sf|vRHUh({Wx_@YN zy>}!#A5ZvxfWrkZ{pTv4?*|wqc$uG570>qr%rp4Kis$&38vJF7=lcP!Hu$>~pV`98 z%kK>S1;tkq|BAuyQatPN9|pf)@vO)ABcspPA!O(I3bggOo(6xs;#rS#1uy6KTE(*- zHyQkMif29k+2Hpnp7r>>!FR~@#>eAjJ$5C#KHg?1p7l7`;Ez!}>v6ilFH}71@eIMs ze6ChJ*Yi5TOTFBzc-G@Rf|vfcDxUTDvf!ovj}^~)+-LAf!y@y~@wXzo&i~RbNtsD z{5^{2^VRze{$<7U`Rc0%|AFH9eD!04j~f|T&#cEJvg_kX55=<{4>$N+#pjV8M;ZL- zif28ZBX~K#4=JAY_?*G-QatN%pTVc%&S2sCWIc8#yRPSK&66IF6uhjrsfuSk&NTQ1 zif28R8T<;xvmUPyJg)NnZ?`L+>v^-_W&BSmp7r=g!Q(3X->rE5{P>~ZrT>9@jZk8Lh-D}Zw`B*$GYYQ`5aDm&L`LN7{TMNIR4`l&wBi&;H4gG z6wi8GB6#Wl*NSI7UT^TfS3Jl6kiq{^@vO(!4E{sKvmXCt@Cipb?!x(GJ+>sfKAr>> z&wA`*@FNt@dK_!;Cn|mg>2Z$1|4Q+!$KMEE&hHzFXFcvR__%SA`C&b#l3nY4km6a7 z!wr6h=1Gqy2wv9PX^Lk(RvP?;if28pGWc5+&wBiw;AK8vP(0W3D}tBt?@&DJ@e{#I z|Nilj`DZ-_$Q}pX(tn!bS&xGZe!Sv2{yc;KrQ%tSg$BPw@vO&l4E}P(vmSqK@OLYo z_4s>(e^K$Q$3GhUZpCjRJ$`8Lhfau`FV^D#vg3To`7KsF>#^G4*D9X%c)h_ts(9Ap z3kLr;&66H?30~IQ*NSI7?l<_36C?A(dOU>ex}Jw9p7l6R@G_sX70>m2s^De(6^ds) zo-KIkf1To4k5>s^`hP(2tj9+U{!fbM_}?)2PZZC3{I|gej*iSf>#;T2b^d!Pp7oe! z@S_#adK_=?Co7)y_)CMYQT+3y$0Y`Tr{YJVvdR%MpcPpOt_^83Z zrFhok2L}J0=1Grn$As%s)>{{{bA7TNdl-C<;#rTm27kQbS&wrCFY~!b@m$Ym30}s( zTJfyMYXmR-Z&p0(@jk&z|9??D>+vmv->Z0z|1*P6J~pyGS&wbVuIsa};#rRa4E`v^ zvmTE&_+KcV^;lr=XDFWac(%c>Q+%MEH~y;({w2k;9=8i#&TsoEk@;jj2Fb49A4e;m z^?0nomnfd~xX9oy(R{KO-&(=TdfTXY*5e%p|CHick6R7?eZ{jL|0Q^t&xEOw`Q&?e5Xe~jW;j}rth^HZdF)?v6BaCr*o;FVyJNlnbZTecNe!ofaUdK4a zUqS5|%HAWvGn}C8_&dC~%=2FA{g0#gdH)zE#?yiP)F}R9vM*8g{uJkh%08a#tCjsa z@^iVer;`0zWuHY!y;0fI$i7k8Z=m+?mAyN)A5wPy9k*wceH7*GRb}5w?SCkHI>qy; zviG7k|Kuy@c_{gBMXzk<-^cBu?D%`Exb#-`>#4vql|6^%ccikXQG2qoe?a-?->u_# zCJ|Std5Wh}*;A6dIF~AW8pV0Bvaj%P=PG6IL-F6N>|M#vJ<86%SM<2DuOXg)w~ohk zBKhC0_*ZBi@pr0mVgB#r=ikachw`vr*=JF^75QU7+dQ{US7jee`R}XjBgmek?BmEj zR@wRYD5om>4B}5w_N!@J^7r!aIB*Y*t5)&9qWL{r*=G>HLfO-4zn3ff49fp{Wyjye z#^pU_Z%_V{sGswB4aI}MvyBU;oi=sb@^|iVTzxrj%Fn~({};-B9oZKudpnxn#masX z`Cq5(Ipk-(vM+U`gx^J1_H$?u`^b*FBiHU0spOCIa5eGW$j*Ew`5&hEdx@W@c>1{N z9Itr%eQ;dz6@Q#(cFGk083nsU@uv`fk>cN?crH_XA@N*~Jl;z3|Cr({iGNA?ucbP9 zL-A{f->vvRPH9{@psx5Bup8@Bq%|=QOS?vNO-WYdl@?NyN`lJpX?262-qu@$>J{ zvHu{|;bn?Hh4OQQ@;{dNI~5-y`$LMKOZGPu{~6WUPQ}*|FMn?i-^V*s{NE{l3-QS< zBJ){J`R`129xuPC_ECHs&0nUn*HIou3O_^1H@?s?-1A2MtcUhC_yh}XPE+Nz$)C0d z-CmECypvwNq^zc39=z66d9Mq2ttwPnkX{p7T;rq{71R_s>GP_qo%E^-ui^F2p8ZDV^MOy1^Qj#MpX^x3Xe| z_xfd-_u39#a9b)Tr;BHH`jVZ>jjWEdSnZcP^#1XLT~#_@1_1(Z$BG)qQ$>A-XnQ?j2|Vf<3Am2+9#Nt9;e~6<6MjfY_Vvz z6#Am=KbYW=TxYm{yacQFkDm{a6kI zj$hZ(_6l?E;twvWgSTVzt+c(a-_5jrE`#*S<7e{*Sc#Uu+$j0OV=QmadBu42zR~v{ wj-L)J?ZJk}alJj(gw`&YoIT6%*>SGN;KZWG-xm6!Z9jwJ-z>JpRlWWH08aH=ssI20 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG1_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..d40fd0a3af91fdbdb82afdac3ac2f5500eec1dc6 GIT binary patch literal 43488 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 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/bnProc_gen_BG2_avx2.o new file mode 100644 index 0000000000000000000000000000000000000000..248c7244cf105f023b1896cd4308aee4e0e8ce83 GIT binary patch literal 43688 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 XXCyiQK~R>i{^K0p%x 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 F{{dpV-Z%gN literal 119536 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%0A}ZfjvmZg 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 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c9ea8704ae2d57a0c36127605f696ab9b1febb99 GIT binary patch literal 3704 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 literal 0 HcmV?d00001 diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c new file mode 100644 index 0000000000..09bd995216 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/generator_bnProc_avx512/bnProcPc_gen_BG1_avx512.c @@ -0,0 +1,1768 @@ + + + + +#include +#include +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG1_generator_AVX512(int R) +{ + const char *ratestr[3]={"13","23","89"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + + + char fname[50]; + sprintf(fname,"../ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R%s_AVX512.h",ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) {printf("Cannot create \n");abort();} + + + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R13; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R23; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG1_R89; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG1_R89; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG1_R89; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + // Number of BNs in Groups +// uint32_t M; + //uint32_t M32rem; + //uint32_t i,j; + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m512i zmm0, zmm1, zmmRes0, zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>6 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>6 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i +#include +#include "../../nrLDPCdecoder_defs.h" +#include "../../nrLDPC_types.h" + + +void nrLDPC_bnProcPc_BG2_generator_AVX512(int R) +{ + const char *ratestr[3]={"15","13","23"}; + + if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();} + + + // system("mkdir -p ../ldpc_gen_files"); + + char fname[50]; + sprintf(fname,"../ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG2_R%s_AVX512.h",ratestr[R]); + FILE *fd=fopen(fname,"w"); + if (fd == NULL) {printf("Cannot create \n");abort();} + +// fprintf(fd,"#include \n"); + //fprintf(fd,"#include \n"); + + fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); + const uint8_t* lut_numBnInBnGroups; + const uint32_t* lut_startAddrBnGroups; + const uint16_t* lut_startAddrBnGroupsLlr; + if (R==0) { + + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R15; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R15; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R15; + + } + else if (R==1){ + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R13; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R13; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R13; + } + else if (R==2) { + + lut_numBnInBnGroups = lut_numBnInBnGroups_BG2_R23; + lut_startAddrBnGroups = lut_startAddrBnGroups_BG2_R23; + lut_startAddrBnGroupsLlr = lut_startAddrBnGroupsLlr_BG2_R23; + } + else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();} + + + uint32_t k; + // Offset to each bit within a group in terms of 32 Byte + uint32_t cnOffsetInGroup; + uint8_t idxBnGroup = 0; + + fprintf(fd," __m512i zmm0,zmm1,zmmRes0,zmmRes1; \n"); + + + fprintf(fd," __m256i* p_bnProcBuf; \n"); + fprintf(fd," __m256i* p_llrProcBuf;\n"); + fprintf(fd," __m512i* p_llrRes; \n"); + fprintf(fd," uint32_t M ;\n"); + + +fprintf(fd, "// Process group with 1 CNs \n"); + + + // Process group with 2 CNs + + if (lut_numBnInBnGroups[0] > 0) + { + // If elements in group move to next address + // idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[0] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[1] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[2] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[2]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[3] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[3]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[4] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[4]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[5] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[5]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[6] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[6]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 8 CNs + +fprintf(fd, "// Process group with 8 CNs \n"); + + // Process group with 8 CNs + + if (lut_numBnInBnGroups[7] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[7] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[7]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>5 ); + + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + // ===================================================================== + // Process group with 9 CNs + +fprintf(fd, "// Process group with 9 CNs \n"); + + // Process group with 9 CNs + + if (lut_numBnInBnGroups[8] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[8] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[8]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i>5 ); + fprintf(fd," p_llrRes[i] = _mm512_permutex_epi64(zmm0, 0xD8);\n"); + + fprintf(fd,"}\n"); + } + + + // ===================================================================== + // Process group with 10 CNs + +fprintf(fd, "// Process group with 10 CNs \n"); + + // Process group with 10 CNs + + if (lut_numBnInBnGroups[9] > 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[9] ); + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[9]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[10] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[10]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[11] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[11]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[12] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[12]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[13] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[13]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[14] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[14]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[15] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[15]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[16] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[16]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[17] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[17]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[18] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[18]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[19] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[19]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[20] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[20]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[21] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[21]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[22] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[22]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[23] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[23]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[24] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[24]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[25] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[25]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[26] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[26]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[27] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[27]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[28] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[28]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i 0) + { + // If elements in group move to next address + idxBnGroup++; + + // Number of groups of 32 BNs for parallel processing + fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numBnInBnGroups[29] );; + + // Set the offset to each CN within a group in terms of 16 Byte + cnOffsetInGroup = (lut_numBnInBnGroups[29]*NR_LDPC_ZMAX)>>5; + + // Set pointers to start of group 2 + fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); + fprintf(fd," p_llrProcBuf = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + fprintf(fd," p_llrRes = (__m512i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); + // Loop over BNs + fprintf(fd," for (int i=0,j=0;i9j_ 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 literal 57368 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 +#include +void nrLDPC_bnProc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs + M = (1*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [6912]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [6912]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [6912]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [7680]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [7680]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [7296]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [10752]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [10752]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [8064]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [12672]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [12672]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [8448]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [24192]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [10368]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [26880]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [10752]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [29952]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [29952]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11136]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [34944]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11520]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [40320]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [40320]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [11904]; + for (i=0;i +#include +void nrLDPC_bnProc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs +// Process group with 3 CNs +// Process group with 4 CNs +// Process group with 5 CNs + M = (2*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [14592]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [14592]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [18432]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [18432]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [15360]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [20736]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [20736]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [15744]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [23424]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [23424]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [16128]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [26496]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [26496]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [16512]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [33408]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [33408]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [17280]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [37248]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [37248]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [17664]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [41856]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [41856]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18048]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [46848]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [46848]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18432]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [52224]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [52224]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [18816]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [58368]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [58368]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [19200]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [66816]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [66816]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [19584]; + for (i=0;i +#include +void nrLDPC_bnProc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) { + __m256i* p_bnProcBuf; + __m256i* p_bnProcBufRes; + __m256i* p_llrRes; + __m256i* p_res; + uint32_t M, i; +// Process group with 2 CNs + M = (3*Z + 31)>>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [1152]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [1152]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [1152]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [3456]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [2304]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [9216]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [9216]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [4224]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [13824]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [13824]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [5376]; + for (i=0;i>5; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_bnProcBufRes = (__m256i*) &bnProcBufRes [17664]; + p_res = &p_bnProcBufRes[0]; + p_llrRes = (__m256i*) &llrRes [6144]; + for (i=0;i>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i>5; p_bnProcBuf = (__m128i*) &bnProcBuf [3456]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h index 8c7fa43f5d..aee271db84 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bnProcPc/nrLDPC_bnProcPc_BG1_R89_AVX2.h @@ -5,20 +5,6 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* llrRes __m256i* p_llrRes; uint32_t M ; // Process group with 1 CNs - M = (1*Z + 31)>>5; - p_bnProcBuf = (__m128i*) &bnProcBuf [0]; - p_llrProcBuf = (__m128i*) &llrProcBuf [0]; - p_llrRes = (__m256i*) &llrRes [0]; - for (int i=0,j=0;i>5; p_bnProcBuf = (__m128i*) &bnProcBuf [384]; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h new file mode 100644 index 0000000000..1db81b7a06 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/ldpc_gen_files/bn_avx512/nrLDPC_bnProcPc_BG1_R13_AVX512.h @@ -0,0 +1,743 @@ +static inline void nrLDPC_bnProcPc_BG1_R13_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { + __m512i zmm0, zmm1, zmmRes0, zmmRes1; + __m256i* p_bnProcBuf; + __m256i* p_llrProcBuf; + __m512i* p_llrRes; + uint32_t M ; +// Process group with 1 CNs + M = (42*Z + 63)>>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [16128]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16128]; + p_llrRes = (__m512i*) &llrRes [16128]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16512]; + p_llrRes = (__m512i*) &llrRes [16512]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [19584]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16896]; + p_llrRes = (__m512i*) &llrRes [16896]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17664]; + p_llrRes = (__m512i*) &llrRes [17664]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19200]; + p_llrRes = (__m512i*) &llrRes [19200]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [44160]; + p_llrProcBuf = (__m256i*) &llrProcBuf [20352]; + p_llrRes = (__m512i*) &llrRes [20352]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [47616]; + p_llrProcBuf = (__m256i*) &llrProcBuf [20736]; + p_llrRes = (__m512i*) &llrRes [20736]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [62976]; + p_llrProcBuf = (__m256i*) &llrProcBuf [22272]; + p_llrRes = (__m512i*) &llrRes [22272]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [75648]; + p_llrProcBuf = (__m256i*) &llrProcBuf [23424]; + p_llrRes = (__m512i*) &llrRes [23424]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [94080]; + p_llrProcBuf = (__m256i*) &llrProcBuf [24960]; + p_llrRes = (__m512i*) &llrRes [24960]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [99072]; + p_llrProcBuf = (__m256i*) &llrProcBuf [25344]; + p_llrRes = (__m512i*) &llrRes [25344]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [109824]; + p_llrProcBuf = (__m256i*) &llrProcBuf [25728]; + p_llrRes = (__m512i*) &llrRes [25728]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_llrProcBuf = (__m256i*) &llrProcBuf [3456]; + p_llrRes = (__m512i*) &llrRes [3456]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [4224]; + p_llrProcBuf = (__m256i*) &llrProcBuf [3840]; + p_llrRes = (__m512i*) &llrRes [3840]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [9984]; + p_llrProcBuf = (__m256i*) &llrProcBuf [5760]; + p_llrRes = (__m512i*) &llrRes [5760]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6912]; + p_llrRes = (__m512i*) &llrRes [6912]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [28032]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9600]; + p_llrRes = (__m512i*) &llrRes [9600]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [46464]; + p_llrProcBuf = (__m256i*) &llrProcBuf [12672]; + p_llrRes = (__m512i*) &llrRes [12672]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [50688]; + p_llrProcBuf = (__m256i*) &llrProcBuf [13056]; + p_llrRes = (__m512i*) &llrRes [13056]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [384]; + p_llrProcBuf = (__m256i*) &llrProcBuf [384]; + p_llrRes = (__m512i*) &llrRes [384]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [2688]; + p_llrProcBuf = (__m256i*) &llrProcBuf [1536]; + p_llrRes = (__m512i*) &llrRes [1536]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9600]; + p_llrRes = (__m512i*) &llrRes [9600]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [28416]; + p_llrProcBuf = (__m256i*) &llrProcBuf [9984]; + p_llrRes = (__m512i*) &llrRes [9984]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [6912]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6912]; + p_llrRes = (__m512i*) &llrRes [6912]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [7680]; + p_llrProcBuf = (__m256i*) &llrProcBuf [7296]; + p_llrRes = (__m512i*) &llrRes [7296]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [10752]; + p_llrProcBuf = (__m256i*) &llrProcBuf [8064]; + p_llrRes = (__m512i*) &llrRes [8064]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [12672]; + p_llrProcBuf = (__m256i*) &llrProcBuf [8448]; + p_llrRes = (__m512i*) &llrRes [8448]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [24192]; + p_llrProcBuf = (__m256i*) &llrProcBuf [10368]; + p_llrRes = (__m512i*) &llrRes [10368]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26880]; + p_llrProcBuf = (__m256i*) &llrProcBuf [10752]; + p_llrRes = (__m512i*) &llrRes [10752]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [29952]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11136]; + p_llrRes = (__m512i*) &llrRes [11136]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [34944]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11520]; + p_llrRes = (__m512i*) &llrRes [11520]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [40320]; + p_llrProcBuf = (__m256i*) &llrProcBuf [11904]; + p_llrRes = (__m512i*) &llrRes [11904]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [14592]; + p_llrProcBuf = (__m256i*) &llrProcBuf [14592]; + p_llrRes = (__m512i*) &llrRes [14592]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [18432]; + p_llrProcBuf = (__m256i*) &llrProcBuf [15360]; + p_llrRes = (__m512i*) &llrRes [15360]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [20736]; + p_llrProcBuf = (__m256i*) &llrProcBuf [15744]; + p_llrRes = (__m512i*) &llrRes [15744]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [23424]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16128]; + p_llrRes = (__m512i*) &llrRes [16128]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [26496]; + p_llrProcBuf = (__m256i*) &llrProcBuf [16512]; + p_llrRes = (__m512i*) &llrRes [16512]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [33408]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17280]; + p_llrRes = (__m512i*) &llrRes [17280]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [37248]; + p_llrProcBuf = (__m256i*) &llrProcBuf [17664]; + p_llrRes = (__m512i*) &llrRes [17664]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [41856]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18048]; + p_llrRes = (__m512i*) &llrRes [18048]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [46848]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18432]; + p_llrRes = (__m512i*) &llrRes [18432]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [52224]; + p_llrProcBuf = (__m256i*) &llrProcBuf [18816]; + p_llrRes = (__m512i*) &llrRes [18816]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [58368]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19200]; + p_llrRes = (__m512i*) &llrRes [19200]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [66816]; + p_llrProcBuf = (__m256i*) &llrProcBuf [19584]; + p_llrRes = (__m512i*) &llrRes [19584]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [0]; + p_llrProcBuf = (__m256i*) &llrProcBuf [0]; + p_llrRes = (__m512i*) &llrRes [0]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [1152]; + p_llrProcBuf = (__m256i*) &llrProcBuf [1152]; + p_llrRes = (__m512i*) &llrRes [1152]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [3456]; + p_llrProcBuf = (__m256i*) &llrProcBuf [2304]; + p_llrRes = (__m512i*) &llrRes [2304]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [9216]; + p_llrProcBuf = (__m256i*) &llrProcBuf [4224]; + p_llrRes = (__m512i*) &llrRes [4224]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [13824]; + p_llrProcBuf = (__m256i*) &llrProcBuf [5376]; + p_llrRes = (__m512i*) &llrRes [5376]; + for (int i=0,j=0;i>6; + p_bnProcBuf = (__m256i*) &bnProcBuf [17664]; + p_llrProcBuf = (__m256i*) &llrProcBuf [6144]; + p_llrRes = (__m512i*) &llrRes [6144]; + for (int i=0,j=0;i