From fdb1301100e8d6076736e83b287c8430b218925e Mon Sep 17 00:00:00 2001 From: EtienneCmb Date: Thu, 31 Oct 2024 22:03:08 +0100 Subject: [PATCH] Fix timing computations on C/GPU for entropy --- docs/_static/jax_cgpu_entropy.png | Bin 35420 -> 26706 bytes docs/jax.rst | 59 +++++++++++++++++------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/docs/_static/jax_cgpu_entropy.png b/docs/_static/jax_cgpu_entropy.png index 5c8081143e4eb7d448b1b201b45f0e01f67b2018..1e5ea9fdad738e1b0b4ebded649f01a3dfda4d4c 100644 GIT binary patch literal 26706 zcmZ_02UJwc)-~GXoK$jdMS{>|5F`nWC?Y{YM3P9793+F1p(P^-D!C;I3JOY=AWBq_ zAc!CtNlFrs%v&4p`@TE=_rEj78J^?r-MeKh4-eP7@}iFB++H>j$vK2J`-OZ-&UrNq| z?8(2vo-Ck8SW;5rdiSo{P?>d4v7zV-(^@7vE(NjJ!-+`lr}b452Y=Srv5$ld#O(V8 z(iQz>`pS9(=P7uF2d?F7vG%PJS|VCq zx7yu${nya(&J>a6m&TQ!@{Mae>{9lZmX_kyW;!h!g9y(0tlY}CrezUpblf{*SYpM- z&%b=-`oZ$y0o`)_E=D^`DKEoXTQRaFmc1E1JXmVp8pnCgb!nv9aaQv72lC`I zhP0P1UHVq(!hL`Dw=7CUQ z!5RHhGeu?dhnIFl&hGDQH2W{VOI_~N($ow|N;X<^JZ7ZJF6S zzuw_tV|h8bcD#CYM-=0kjuO+_4!gemnLFF@Ne>^Q&*&H4y53ynHf3dRU-WTRCqteu zRn**hpaRyrd_Gm!=(fyWhWDsA`@zBPa$3a3^4OT;4cIFA)<37;`Ho1j9^PANBFlG6 zN=lj;slIFd=jUhZ*SA0BY8NEc*VnHN*=9W|xB2`Kmf^|IEH|@S@8uMcn{N_EM@Nn7 zX)mKso}7WH;$IwidFEa~K(1M7YH)CHneU&UYiTa^?NSF1j`L4{$x*Wor)11cOH1?c z^n5ha@hB;jl;$CGa<7nzxvjbMvye>F63fAdDFe7?6~ zkX2b3!k=j{r}bU@{I0yE>Cij#NILEm&U0SLN=iz-U%wg*yfijESnCvJ8hb{?jA=78 z^HpaOxv5`MTidy_vDhi?FwmB9&f8}9-k-B+vMwp6wO)_TpFiI_G-SjicomD>-St>p zZL}d!xo>N}A#msKvZ$y@6_5YM0^k1LUT%4L`HP!xi%gKcUOL>{u)eJ3JTQ;Lk#D!K zyR;P<6l>Da(arz*B@8=81ZEZkv6A$BGiHn-6=V7knf9+m21ytUrnkFW2U3H|Xq8*D z)MuB5eH)qByp41F{-f|ECL0aUZo9r#dv+mK!q~|6)8oV`J8otZo9;{}nY}(8Woequ z((y7#3w=`B+S+Tdd2E`;{1!#}R*vy$UJPyG$xAMS4IaPW`#OR)WG> zirnYELiH`F9r0r1KLKiN6E* zuROK7?%%SEgEhX9UZVf}>Kd$a{{15T=MU|^wI!bX{L^=;h32_Hl%3Cw8#m&1#(LZg z6FI-v->aQ}O-~3hTlT#UHn_v4f|%GB`#)VBXG-fr#4THRFc?}pJG&dz?tCqAoKz@X z14c;UQnBY;$5qbC$xZwkD*smFS^WGRtaIVD0@|e?wULX1rIv>W`;bH*8Z2CH;6Sk` z1ymXQOv_~2KbZ50T%Br7`wo*G4nanQVw1KfM$HXZipFus-DWGek|uNKOEv+L`pg6O z8BwmkzKO3d{a`n)aC}|$Vt@B<^N$~#@BB7YArHDuet6L8e6`{JzP!Bml4FJc()MhY z2EFMdO0=C_;>gr9m#BQz6^%P!z z$@Wyr?zUSsq^c&^)D!db4~EKZPfANO!rRXcykv)a#9+Tx)zsXE^%i5HhMDLq&}oGv zZ|in{wmVA$YN43TCzh(Js$1J@Gx?#FkfA~#n?AE_jT_oj_u~4iL>N?B>QeI4cf65+ zn1m$9dwI0V>o?o|tqC&JtF4=4)GR@;Ri0*6It?>H2sLm19$x*^tvov~eeYm<_QtDQ z!SlYgUcbM*vQUG7wS=eOqNAH34}B@n$r2u{URiNHA#(EsJnv&D8QrT}O@z65c?2k> z-CvUH%VXRqG0PTe*s&Cl2qmxV-eHzU`S|-Arw3kN^uS_?p;9`_3%-Z>B_gE`s;rcK z|Ngz}_L?=SF9*eUm`bnW~eT-s!EN)4vprC+4LB*2URq$9E*%ntcSGkjsE+Fac?R_oe{=)MD zcWI{<^VE|UViF{6J|$!YtUU;TV)rSc8nRVe+r_>&+iyRrYYM{R*gY+Q2j|1gRHl6o zr(XkzaaB_=o=ef*{_on_!}j*}CqI2B-iLFDDxYKBomrpnvuQTJzil1e5Yu~D^J&YW z$p7z>drJ(f`$GToGWc(shNu(j;=|Kv=Ef#mmy}I+eyCm5WaZ*=mZ^i~v1#7jShSVd zg8*WhU7VgibqJ-#o!J zxa?_N`SD|ObF*VA7OJdB{Q!jW<12&ZwmN;U-n@CEwV#kAf`O=n%qiOWlDy$yr+7#K znE|$xgIx`BiwdRs)fRS}zK^Y~X%RCXsn@j!=4HnM`W)*tYFYD=*B~Tqj0=hkOP$$L zR?pr3l6~IhUT>Z6-SWZBJDnb?sv+yEtKu}q5N&ofq%>@gze6?KeVi$J)<@ohK-Ohc zA%3bKU4s>F+lZskKMelb12bm3nU5&!N?#r#&N>@2d* zCi!k$`$Ane9GW9&Rsk@lWf~UhHaSvVzV1n=0=Vf)ykur?*1@0~6mPBgJ{Pw(fm5f5 zA^AwBE%gitqqcUJ8_LtKpUIH-RDE!aPpkWkL6MbT`oUW+d5<>7n)Ss{ynvj1n)tK3 zvt7LM^55430NL3T2sNy{r?Q!{HPPU<`}T@gRZUH#J|d>{q-fdAg1*7yCr*T=h!{W3 z+}+v1Un|hgpPiVPVCtqMx%C}Q%(7eNGFG2IdsVaVx-Qht^5yRBKeI%r60>(vu*9AH znfKE};+j6vl8}%*;nGl7=RJM8Md*(w0DC~9VgXyO05pXAPHWlP+Lq7Gm(p227n#}` zdTvmhGL-u1?^s~`^t9C;OhtZ0j#}hXuG*@q@q(=Ts=x{eP_U{WL>u-(O6zwhnTbi;Cm+d|?D6_iMHx+X)>ma^b`|nt$ zhoE)JpYjt2eU;V*ms@;K^YhzQQ#*9Bd^0gIfrS}lWM_AfF>5hRPZ^DDZU6n(XeS}b z%&U|jXueg|%=)eNtc@aZ+5JPw5?R))f~+L~N#THMQI_;d?$hLuDXiH>AzMN{{5a`O ziRPNR9eK0D(N2Emy5@tt%c+x}Wye1C)p;$AJefLkN9p_f)r(kc*ihue=sSNKb2Mvf zU^<}v$D3adR+{O^X=v04H(uYK>&=TE+Jbob_%WK9fr~2+f_4gs134XCE5NwK zl#~eILboB$_#E#4y=$Ox;pNS@?;+kD{OWyHZLB7G6{|6u}J1 z1j?Avi!+wSKzPd2b-bEH@7-vB9>aX{)3={fQ_o|s#7G$$L7o+0KrgkH=L*aKjaxl#jX(&OExXQh~)mEE^ma-kyc1?(#iJw178-1J-p@Kb)*!Vp>_-oJwc#w9c0tGLz zeScx_{r#PZXYoq!YdjY}$?z2%uKe6scno_|V)*wPx2X#O>pdDed(k2V5}Q*%l$^bE z7t-bKY6ZR$i9I~UChP3D8PNWa&!(GM)GYn?md+#~erd%xAjhfZ_n+9M16qyl1cci# zl=2!d@?)p>l{Oji#~BzbHd*UjCkQu}$6Wl(DxFRHrq%;v@XwxIA$!cv&u{tj(~}_# z|Gu~C?c0+{DH$iBR7?72-XAO}D!Ku9xMbGo`BlCXqGluO3a3w#y40 zP8P@n?0)-G1l$)1#Vct7hA(ae15wCU4X3Q~+Yo{TW6x$-I%xR;$58#W0qQ;kg#AvC zlKc*r*w__fmUxHf*Iz!J_X%!nRPpgeiYt{(>%#P=Bjx3FKgIgprE_oY^t@jW-vs7< z8!EmJlx})@`XDH-)~sAv`Va|v^#Q&nbv_KJSC*}`#AIa8G#?37c`jbhry6|+g#Nm* z7tA4&arzvLU*9Hi9;=Uq$}_&)aM%JgQfsOL9^mLbmgKj;F(?idsLx1!swK7=uE)XW zc;w_*5!?oRM$7z*%exJxfl_liLB8JJ-Y;+LuB|T)(naBqFj;~~*sJ+R4+ye>@v}(X zp-<1q_-s!QWYHY)gv)lM>`RrKrIf<}HNscl9U4(kQc5`af}9};$!Prd?^s~Ev-3BS z(hH3%G4_Kcv5+c>P=L6@=H~8%MMT_&Hyz@-oXn`MCw70&r;jcbnPxz`0OyH--$p!s z%n}wEX$f`8XJtHi=rxb;BRB7r>GmWyK)GknojWNd1^Dev+iIQJy$yp;8RrH)c4GiJ zSO8~OSzA-RapUn2CUf03#QF^+5!m-RUcbKs2rC#8H-|@kdeiwF=yRb#F%tr&y%yuR z6#W|e`XpO7n909$GHb<`yH31sH9Lc1?Nag?@igJGg%KN>u}}0U1Iygr|2qay^Y`ex zbA5YkGLDb!>gML=TI-zwrulBISoBHh_=&#&FwzE~OWCU$g^)l6kGTZ9@2#e-Gj4I* z$`~RdqH@!Gynt`boY{`=4S9AxAt6oBBP55d4U4aT{zd&J{gW)eyFX{D+})p#GZd3o zvw)rNjU67?%3Nvb4wH_^Q%=i==m1hz#Q2f)c!XlwaYSxF(x^MciimIfVwRGQVDgU!D@Y2EU z092qZJ?=b6Y4YXe$|Cz|Viu|u8`c30-1}#Y%5wK0iwI+6_oZKR?eD^#;~JYFq4s7R zdfgOCHns4z__2%=8`O^nK|v^3uI7&)NqBjA=X#!z!7EyR{Tv31*ZBNe!AjS;aX%{JZu&lr1?PZ zzVb}`rJ24zSvk(SqCm9>kB_Gt85z+n(B=d|La6VridQRB9)DP42np3Ir(qdLx7Ht)Q^xxERDCsT{r=XW2jsJ@?QO+Pm6g`{k!nfp^s~W0eY4$X zI$#wdVW=S?Azxk^%l;avKHisqrPGV+aChub3=$DYYn&ir2$`8MqRSP>0ZV|= zc|BwHnQ=ZlHR%fW#a{FM3YyJwr&n1{q5F>KHopvx7=RFXB$~q{{-0_)$=dkHFBWRj zQ>Rb=wEGU4FApEz#}39JSwTLCXJD&uFfhG^t|ZK%O+mYVm!DlsMC&GxxH$GMZd_M3 zZf6*22;>H;>FVazQ*#217MiB~T7v)Z;e$eC%KJ}1pyArh)bm)ZepLt+Dk4R}$756p z6#aoMLjWEBpW#qrXwgDKl!z7%X&0A}K#z#I2;v6KiU3t;-k_wJBK+VX-(`d;-RaAx zk#Qcm^Yj1~sxkX~sKjUQvHE)gMrEfaCnp^@Z^9GSqMAMunACdF03UA#EV~NgHBy}b zxsm{t3Tsc|PitY9b>@Hy5e1C{&`j7^+xsh)t9o)WYe?Jm zoXF3=!3Igib=IB=D<0JVq+pPiI6Ch#wpu_`QVM3Cj==qFu zj8(@;&ep21uE+<-dp3ur$;K)lNb6RGMiaGtjuN--IH8rLgskPt%1UGIrKB%q)|~+_ z;&3=hA83Hp%I}^}SJ30N`aZO_Hp5dUodsah0&<&B)qV`qT~}Hn>^-xo zeUHEYac%fLmr#F`I(g!hsSJu|-H-gEAorP$7f6O4t&>Z^m_|W?vZZ8kb92j|GJzDz zaO~J^HzlBP%>W0}=WQPFYp1I`znYglxcFyTot`04Ey2w@rz?%rM1clH&*`U9_l@X% zoO7zB@*~|8rTz75g+)6_m#~5S(C_-GW+t zqso;xf{r`0yEF)g`;}4W!L-0{8JqL*^N%Wr!fT?nlp-p;W0R8tA)%qGz^$hO4|lnh z4z?^24Q_Cd8IW%)1pQqpIu{ogq(cSt_+w)*5d$}OJT#!jL+O-M05<*EW`wc7dw5lK zX^6Ud&6wviiZ~@iVu2GE#PjlU`NfMbX{ow2dU|@8;?*C-$3sRn%$#+2YiYvqC27-C zn}U~~g$0+!#`W5at|B$3V{p75e3#r9%+f^sP;msnLum337n%*E~HWq&*C^ISSSDMjG2aK~FNiiTQUC7gI;OktV1z?Ws}_Iw!}`Q4T4-)BdPQNlEVe zOSCY$p71D3}`Ed|GA|TtM zPz!^l@klzeYJVtTUa#=|ja_IgyX@1Spj)}z0zvA@&v!0kO3A`T#~`9*{1svUD_*@4 zT65q(m6DQ6rt+~!cXSuu7|s-AY{Ky#f~TkYt}SpA3s8g$O{ygT*Sl^0G712~17HIS zEgS+A5C%2ioNmjbil4HSxskS=iV6x~Vex7)4;sJ6v&^qzx+UkjCWcaZG2bUVw`C$=PG(|CR%hWz|QuFB--S+CGRQPS4=o ziHqnRmxFaN441FED43X@@~74~|Gaw9`FoQyHD@1in6L8#Sp@mF1v+j{OgDQw?act! z`Mu*36cqF=c?7#E$cSqqR`n*ni)9dwT`kVOVuHgN@`KF1=zVKJC zT5xAFDKV)g6yyUf!FJ%_lVmqSkx*i{8c|xA3PX-QK(c>!XT@)A`2e)|CLeyBA@L`Y ztiM|)7!R-UPBIE!C58rS_nR0PFf4<0 z^_eIf?hSvbNszp^5dB?tSGQ1!6;IsvSP0Lbl%B2(s?$EHG@wmVraK0ZR+pBFX5QO0 z5;iI$hDL{exQ`b9NsuuhjaB8=vd@7Kpx2$gIEvR?t_FJiiJ}sR^KouI?Q}r{7~t zYgEXC2h9UHLFj|B+z24;mFt8mHMf#NmN^Ln!%T`)uBxdxv-|vEOitbfMS&z6rte<} zPppYx;_v`=zt#Cl0#*#~R@$WoNROaqq3bW8l3d6RJUozl8V?8@Y03lVxD7ZS7ay~=c+Xi5bL)3v zM=7s2LE$dPLZxI-m``Ild9uZE9-+Z6HNv$Ykz|@nAjmhJvXP)HLX=BMoEj;y=7hU_ za5L3rkkZsu&wx>rSNV}}C1r=+4i>wqdYb<{CXK{*jt;`LpAi3-oZL3GRqIl?P*qiJ z?GzvbyYJ?-N7KTvW zq89b7PPlo#t`T7JP=vlgo4KKy^9_oN6v_VIS#AbI*_l3V7W6>8BW)>GllKav8;Ik$ ziBa%$o*KH~FRLvTzDEd5;{x&O8j75sKlaR-v;Quu9NcAHNEd9(5NI4?#g94YF39%PydaE3hCD~{Jn(nO zp0iBCL&7Z*71j+}tS)ZAn(^XMo$)NnWxf4N=D%tRYyW4k3!TP;~NA=#W9&o z;sDdX-530)0ELjG$zK>2nqsF*$Zyd|$H`yJEkIgQ90 zB~vYAeoienVyJM<_uKm~Z^F@N>tWhkQ|T35nr0%WGW z$5_-Z-ywpHDDmdoV^e3hYM)hfh4YUna5nt=U`#cQ=cuj92VWI(oc253@1Ehhzc&8{ z23vb8W+o?x8I{{uY^_WHWc*UYfl!0#?Ic}gRtIX4rA*zHI=Z}jvJp(N-+nNqhEp-4 zLGVGK4`h*YPFZL+0+&l4`=zGvG;{`FRI`;P4Y*wBUh8|BHz+;=Y&Dq~1{ zdxNqiT-g*^--|XDb-JC}e5E~X;5t<6EeiZh4CpyWYy-#~FO14t))k<+0Vy0fzWMz} zxS*i-weP>&z^hiol{j~@&IiwRB zZm(go>UNiEU6HP}lxdB}dGNhxb#wDILJ|QwRXo5SrUEq;oD;lxZx-t2mH(H-z4*~B zA%D#7Za(24hA4_~=F$0!&O;29OD%-Bdz0Je%Jyy+c*>i`$;yAb;#v)e6R3q`96>0jIcTEH}$YHoh)s^)!yA=H1p$$Ghh=ZS@oCyo35Dhw`D zrWt1pBtK`xyfG>GeYy%!SHK!1<&bvH8>5*l5DeOyHKhnZ*a382*xo*Wo97tORgw<< zAjlfzV|(Y;gVtJ{L!#5t*fmozP6Izdm_VyXS=sZW(Pd0elF2>W4}(tbqEPrtXK-fC zyz6r39D^M@okIZgCBAHLW7nP4B5*b%O81~wj6AO}9AO(WBwkC4;l96>Gr&jBphv(L z&lyy+b$R?edVGq?`ol2&Oy)q1upc#i2pQFB14j2Lp*HjDtn3|z!4kL8VcvR9RL?k& zG>BJKJAE1u3yJHb3o6K`L=jtgo?gDww(#Npzsu)GtL$N;ES%2vj+m3A)ORCBE6IMkEB*_T5PJg|uJF88ygeAa~=#s_+7xrNn z%i1WBG*PIc_xE?u-hJAHr-WN%s;tr!c&k?f)`^e)J(q{(xo$I)>eAlVZ@TX=$xW8L zBZ_ZDVqP41<~Yo5esapacYtx7kU}AR1+PX&KAK(GcvKT2Pm5-#Pw&~Od~$01%-Jzs z$z$LDwMMvuA4xIO2}mspj5K+Rx+sa_(>%{A%{uw~*v-@n+c;!8IO4Rf1e=J{xi8D0 zf{dq_F3!twxVn9Q?8jKpzY4G zHbPPOr-111Bq|=Q8xb3N^(|8vJv>3?sGxc2Xi`)=5luhk3o0Va>ttJ&)!!3*dHEze zBCeooPbVeuq;^LrRFR>0*c8ZmyibIcN4GpmWI`sb&AGiWt>yAx^9I7Ra_8$LSSGhO zN2K*}NCHeWeaKIzW-504VjZ2&whF5f1OB$b%T9Fczl(`Ql-t8>ZCQq>tAy5P&I9_# z_S}X+c?BV_{VO6Mf!uS|u<>;Rq}HJddc_FUxsC5k7rel02$w_Zd^sVd{|Em|6KeJi z+)P#Xia;((@y8#Kc&?_Z^b%#?aT7Q>7D4{J(9_5&5*hJDNhl?I+hlF#fl@O10i+!( z6!d0FPY2XDqmS<8T^ZS0h+%SufL{K<4*$aKHxC+}mNba|U)WqvnRos! zyb#$@MwiLs`bJY7zyx*VL|}){{6ViZ#54yn5|=|^T9-pj%1^itceg|clzdGtvt*z z$q{W-6bC5NbtM5nke!`M`>m-};RC)mm{>{{WTW|^CHPp^cI6Uwy$Mm+ANfZR3JF>v z+|j7Jr!xc!A>SUF5QY)6d{BUESNI8_x}$6DP(So#X0Ol{tcE@qF>zAvJSU<4ylSkc(P!=?i!+ z`O$Mza*I?Cj*(Wo<-N`s>1+8iIaTarp?~KnnAIg#mHI!L6SmU9>;7Q|*c0((9E5?r8h($HK$Z>) zyK-vGU-p_K35lA8D9`yC#AzAw$U^#Shuo+}e}-TILWI6Nk%fy(p1V|-5#6*TvSbMj**eH7l!8XJ$GG<{s#W!s#t zU20q`fys|-YA!0h^56k$h8ZLl^>}lZwmIErDubH-OBR90GQteu3AI6OE=i}`Ze_Am zdl{iiT2DK%P~v2P^+mRpeo*`4;TBUhhFJn$o|^UWJG&A`=_~mtfs!OEcpqEXvuk{J zw(&=w593Ht4n*lX7Flmf7KqZ#*aUzi`i$h1;#}R6h_r##i9u!pmDt{%F!nh@;T1cI zXF)b}ZdWKQ8d4jB5g9UK0$xPg$e=WdMx7v;d~}{(#B6$1SU($C97fbyzaFw>j~x#} zkLpI~gcYvGz`Gi8!kvjkNmo@5DoEY;{{|(iTvQi0IU2Dd0!C=;_WP0$prgjGtUH;& zB}Ifn#CxPy60s)WgT}{LT}AivnGA#q^3$wCI2i)%>61W5!z|39VwOA?6|7#lKh1r8QB^e0o%|290m3fjjo${w|~ zZv+Td=Q>4*s3aiHEZHGZLQzYJnSWjs1tRZBpyrHcuD>~}ZEr7h_1d*7-Qo0L*OpYQ z$k+HY)w8`F{SW`W@>0HR5MDC@S@nGk4P()JyAN3MW&HIg4bLWbjx=voO+jhn8j{1k zKXj*cGGqGt^%1ukbe*6hnDWsLUMv=DpN}&m!@_QXhd zYtV=Sea&|2rqlE5z@F&oZ`BEVLhIWN`WkyXi=`|wjyLk%HvAOVjW`su%+Hi2Kjfxn z{|^n#%+30$7N~;R=T3M?ec}%gJx<)Xd%&3RILyY)&9^^DQe*TDq=$ z?|y*&oXg<5O5N|<7gWX4_?f63@NkfatC3jF&1mI|!Nvf$GuH8A)baV9DxJDaEf zr7<&f44bd%C|ZBL{Q$=S6)|}4K4!Z9HwvX!EB+x!oW5kQM9*iRX@g zbjI*z-VHQbgRh%I)=VG6%e5j*Xg%kH6Ox8{-Zn8UPzAf?q@nQ@aC_>O+g#~?VRT&9 zd8F;G8x|XazZL|I%B(UA_|WcF5^@yc zef(-a%1HpsDUm@jIs$VHa+u-_T9LdDkSG$s!4KxEr?$)tdO4?`Ijd$!GCq(kL1}B# z{~%RU7|d)fr&r8TAW4N0PlD5C3j}Z!i&`gtRzL`Z7$GW(Su_sm!V(Y=3=}8h+RnEf zkIccOQ=A%&oV-ST`A^J5ByB6q5W`i3!e>QM`gBi><51>DJ3zSk&^pp>_ zo_&ovg?1;tYLIhKM!E1JKKR3~%8;hd!s0TI(Dko1Qh36XI>siqZ{Pk@k&pCT!6gpv zCn{7n7^@NMucr{)jzWqvpE*G*EeeG#uh8|Q4lSutcKwrI@sWX%$CnZVu4wSgqGDJOS6%)t)w(eP5EK3Xv@UP=xj7GRE8Tc96lX&;@@Fjj-U; zSDubT!x~P1aKQpwvvF~9(m?bUGhV`4l};z#(`62%Ii-w>Vv@~V;JAv^c*++rg%GT_ zA=|M)3mc3x1z9bU-3pd$_ov$!$}Mj}`C@yXf4;<=0C2LUTAn??#>kbmo;MhL2u7zV z4_wzs&;NaM^8}n{0U7&A1mCGsNN2dvIMw?sA3o&LXakvNlh$~@9)e{l@QWy1tBFB6 zF4H8lbn4iN6IQG5Ju)*hSwMVE>Iapja{4Vfz%o>&3qe;G{k~b~)rKdq7i2l>T>(s%xrj;tvGt5%P3r zg+QwP4@#Gy#ou&--G!$H{8Ok4KxF9~@%9v&M}$Uz)v-<~IxriOW+DmTZ2dd!$yRO4 zKUEIi9tZrRNY%4!K+bF!d*&qm1z;S#oKr4iAs}L}bX%+F@zl_U0Uc5$2V#hKJi2^R zhdZ?97HNVjoxr41UGbkjC@s-Acb@L18EDTT9aoSr!a){CJh=u%`sbm`iLC8xravt& zZykpW!w?vurhmRoaA^3C9=gCuZmx_xfurM^Yc+W1M*|P<9W_gRu@^3=8W^C0z=!}Q z;Yd)$V>sk`i#{G>n0ch-hpJu=Oo;po=zA)K{+))(T!wT>49@+ePSXr@^ddp7M;eEy zMlgGPj)(+16r2IjG2>)NWNb4&RNeo14Nz0#C9)n%0mu*vnc-~&GlEs%dm#nqsYG2} zohx)_w3?$Kvps(Nm>&~|o4eFL6`76M;qXZy_t{lt-Il>t7a;GyCZN-#ZeRdTdn-8w z(5>Y;<9GSczb_hu?^!cWw-~fUtUb!1&LW>c=mT~gyXL{U2yrusxVR&sCRjkfyzs{B z$>WR{u*rrJ;sgt_Sx;4?eU?ZBT<*R9qNyO2yGp81les zJAc+V`1zopm1IE0hwh;8o#HOciX(bYMZ&0osA%8%5?DoWr)J>ZVD(#U=Tu% zs5uT-(4fQ|z+D^!g3^U}u2><1q8p`}Xgo(k;30+Q{9(}asm8%>pQ5|2z7SsMGaY|| z1wi^2Mrt6mTKnd|K)x^3dqxU|mlsAS8T2atr^7BSqhR{ON3R+^3QPif{V!JIOHEA; z9u8Rz6oumi2B+WoOc}U#bC98M1ExG?3uF`1xj-tCxibZ-K)M6(0&-d+;i?Ur8630Y zf1(Iq4nj`LF3pbzgz2U{pyOPvd=809PYDSdIA@0#|G>`44Qbsdj+u!mW%fN-Ql2dh z6KwBu{D=7XNnqP=Av+}?rC@vw%(mkz6U}!C}|Md`p+<}j#^wMvv?;V~2q8L4jn zru&jMnb+kX%3&D7W`(R zG3eb-ysG+R|6D(7QcMots}sqWBw26bD4#1hxy^rndxn~nXw-L>Q_AW439z+<-nO{r zw7;`=n-~9oYa6ds$>ZM(=``^{Cy!qz^8-|GS7uMp}Xm^&`$wP}Er{`bb!ToUyY({{B%aHFRZ=btZm=z0hwR-TJ z_=($JZbUGlJ5B)@0G5)|H;)|n$N}pln4hXXmPg5Z%&mMNIi}ZiT8As5X8bOXIDx<< zjr9jCE~@*EDHFrcb125(ap_w3f%7LuaR{9?g1JA~IXT^Z1|=Ar5T$#ej%LExWU&|5 z76-WjtZ2jEJ?Zs$(cGt0P1hJ**F~YmerLnax{|*$10vqG1fK%umQgJjXiiOkUPSa( zbSaTMCp5BkGo7A!8eyk-ATXeBqsp~UwJ<3foJ$s@BaY}*0>+mBBD4hq=!@Y}WQ)R& zcZxQIX%{rZcIEcp(BvhC&YSfk^no~v+w?whA(bs5e>~uzXl7o>=wIAIMHyzy;wr1smF}^@Sx#_rzK3W0 zsl}j$P}3U-8X)XR3@Vqzj`irWDHI@sZgdYIsEJqFA&0WOZA1kaYN1IHJZ@qUDYp-F zPix!W;l=Z}IK9PM8AyoGtQF)X7ze`OD8ePyMaXqTLBhZjHUYVTLhQOSejbclL|t87 zkn_+x>+_*-I1Yp$hMAx`W?LvK)yJXvzhsT;y2o<@IyxuuAqa(@?<+VuKnw>}|8oFL zX?yxOV%P(Z*Vh^abVo#;JHf)pb3}6eNYl|c$ZId#3tLR+mOG;f%-y4@Yw6+iH{jq< zNz@Ys-?E`UJfV_87OiZl7zWtQA zI0IsPwkx+jrq^{zO~~q-YMW^TE4zJvsKg!Nu-Ztd<$A%7ipP7wY$^rq`UZRPXGKDY zH3q>s9(J7#BM`Q5bk^Pv69x%5ZT_{i;#2NY^P~o#s}`~MQ(k*#cV&>8$PC^cugp!vK&nB3}96Y^NI>VT=54PQC3Xnimul6p$vn z9|^SG_xJ2{U#qKs2X=gklblZH1p6Vy$inxZ8nGw;^R+!?rN1Srgm1nfM;y!uw+2_J zwVWCB#G#Io_5IPH5R;c@BMogTk_P(<*s9??)J4IU@-91c(DqpS-hEXQCPLK|r0vT@ znxtx=slV2Fr1I-?+V+jtmj8K5dujc^yocQA+%3ZrwoJ#EdwMaMe8!H<010 zMZhqWZtCO)be{?}4t`822X1Nm6L6Z{c{c<{zV^xONcx#1=mt6cN>HJR8tm4>gtFrC zGQSP`mzR0)ks#_D52ziyp-vE@H{t4NtK^NcZlFrV2`Gac!;9YKK~(k6AqwkcC>1Gt zf*yb3e?&~r0?9o#R{af-FG!qCNYc|mO$@&?8V9s1(G)>^$9*SV3aOOIjx7_7svntZ zGAoC9(7Q;FH33BRMf*0IGX#Rc?mFyh(K-WzdT4Yn2tIne{KuEoO!xR)_jur$E@VCT z$iuqUq#uG^0a&>{u08NDc<1wp@c|l@0!Y8dG^bJk`9ifKWyY%txh;D^gM&9=549pf zYyIIIJuf37VhR`ok_?a0@5?SR4?fqRSa;s;zlaJNpAI7y!dj_+8 z1TRuGYS2{>K zC8o618@85euD*!wzC{L-4nra-a`kacT-eTU>hTVee~pp61A4!AAeJ)NA>XXs-n^R) zb_Inhx+;HF*0ZE|8zKY{^qvT%O3X+^Y;2f_k!=u*M*4Ik;z9*}mID06BF&z*xHjlU zHe}F((2BxUh^l!k(Bw>MJi?Jf?3A%D1pfe$mf#^bD$`7tG(OxXzXG5h=ujXW$F_qx z&0tLRpc=YztE>WQV<9Vo`A1(2TK7e@wH9U2jSmkXZT8fk!$vOAYil1VXQ}W;QaoUM ztKDeHA;{qVQK7BDi@@ z5W_Ai;JrwiEzlwv@x7ipM*#WeX?pl(M-}L(?aH>jQV-%~6u3F!afJD_%NY6+< z@!@vgc5G|*kEQv#sLHw}4|XPm@5%8%SOuIqiDBtxtGP$z>Mk*ATWG-l4~ez$LgdU4 zA%Zqdf

{9clJs<>ZOuJgP$WNMNZ!yRJ;a_mB%wkXz~4*zKjmdJm<^y>+1CLN$kR zy|`$mK!Zf=Pnqn#^B(MkJ$0NAu?$8O@J5V4QAX;R5Yf5_QT(X6>GW#Sfh;mG3P4=x zTx@AoMY6{Ncr5xINPE0bg%#H#>(8iwTvo|EN8s5st71Yu{)@WDk_DS|eMB01IXdv% zHI*W}goYOpdwfVbywTw^pbO9&B39@NTy?+HG8$a7LN$J5%o;g{pB4K@L(xK8$mR2y z3bz$9XUsUpCn3(4E$bL=V-H#v|bO+>iMokGh zR`;2Jws*rZG>?kTv#y;E(-B8TjCT~T(#<*PvPa~3AceFB$PsEH?-8n-jszr*3pOt$ z4FuJw6XHe@6b$m#6Hprs@u{gnmR^q*xt%BJ7;i%smG7;}*EyO3NbkEYK>8Uz~8 z4--lf0hW_t(zdLl?XYzXsmA2bkq!^miqDJD1UV2w!!84zTS7Q6{Skhy0}*f_FOePf z&$ijfm8~2Le~@c782)SLgG;cZM7#K+w)O=utBJvn!+^1d3@w@&v9rqF@&(_gw$4Rh zy@ds~fhTM$si=aZRbZ6SUzBJ&k5GKDX+T4}h;l162=OS*mmxU;yZxagIS^*Wd9z5n+Rf<|Y(*BtUgGRz)xUz*nUdbmseW0ApJCJzRRiYP6bc3*w_ z0?QU{L4f?hLb}~4q@tOP6%=UZpEPT~H4+`uUwFIq!~cvfV{gGBLpyaUmX?;&1dg(- z`@Q>UvHf;UQ*gWKRdCF{u;ucR8)S(XkcS-!q=)gz_kX7-{?AdVhKDNn5+hUyDShnN zEGT_a2sK9c2APti=H{Nl<_}MEGctz54?V!?vEzUi2VY6_h5$_uG$YvF)oF>yriWl8 z;DhcfH~}mTn`Youx8|P3Yjwj9w9umN47^|kedDEpQ7!>uX-gxKtcECEJg=_CEyIocw3Vh7YOS(G^r2qOQ42hhtipN#M)1Ywf+p#*k z4Bv7TxJJz0%8H=HrIn!+S&8N!XW!$$k*|#F# z_5TGuTRYVYX0l6cHTOZ$2fr7z@zK##l*bqt2;g>tjna&Sv2K!wNl2HHG!}|y3Q{~1 ziJ-KmCAMFJJ+HR(!`ZP=p9b-^1q2+uK5`~yD6DRk4zf{D+8{^*h^1x!4ESY{q>xBt z;hGb`2d<>MXQqo>f|E})4l{RrspJtd=tHWfy9zZX*#&x;)82Q%HxAs7MjEQ;%riSv z@Viv8mT8CP;}shZD;9wcQ5iNSmeS$*)GD#BWaq@;8 z6?GvM7L&OLhS)&DCk4DyU9B2W@XDNM@T zaol%83ZP_gZ6!el7k-x>XX8}ufE;OI45gZh0w_5a7_#R}l3mnzjSnmn!ZLUyJ9W!KcNuNB9N_+BQPCe(~Tgh5H}*wuVC~vwbF1 zNQcUsc|yGc!LYbu62Nx+2jN1ea+4dMKhv#zLDa=@=%O;iru)5)SpRu@bUQrbho!6F zcrGvF+Bi4xECSgQHg?93Rn~b|Y!Un}k^sernZ<-sV4H`*z1ybEi5*OsEf<(&r_`r! zdW8x6EN}`2MGM>oR~y@Ey}{lYG*Zs$lW@mz9YfhOsgAQ9R`v0*H|Akr=sAANRgh;o zwz!4JnQn=om%62;@hbhxb87uAv^j$g$VUw%8rKxW>=8FrbZlHWIR(#h^k+`XgI~UO^}VNTs2b#d?PTK zXLk?Ys^b0l?N+O4&o+@o-oMMl)X!V~pUTcWp6ab_<2zGDnaS)>ohC_>%9xo%Ok<)?C;ddN4&oNRgv|G-L6b%Qp1c9m5T--@boWA#;TI+-daH_IJ52InjOr zmBA+5Ky5Vu!&LJeYl;~09EgOr%d#$cnY;9w{wk8d$vu9^E>nJ7FMEyJc(<)WpX`St z)JzCmKJB6JG-EjT$1@`E4E5fN7hZqe1i2728r00nbwna#QF7ta#=OM~o(iq4Z?J!< z|L~?V-iakEOF;PItXjzjdxe{wSR&;9jSA2%UV0chfkB9zW7ckaWp+nIJxLmKPHp$+ zz{9wEjkYe2w2V!I&}%$p&X%nF^-bWh6T;6p^A4<3T{gzL24P8Nh4d^cFjcWv%oRr! zT_zHXT6C5geKe=@$Hmkpwre3cUZxguQ++wl0EA>H^+*NOq3MKzN}@tm%AK7 z^@rU`{JJ$zOpdudY(9Bu(!zHAs zfvp=D!X(pphI5)k?mwX&ddHcqTb4YTu4hC^xvtpb_M+|Keob{|KANsHEG3EAlAURi zv;LAXaelOyp%=BMSXDo;DMnjd;<<7wRxhq$m_{jGJwe67B}=WWlQp0d4}@S$iHQR=T5#GiH8643OhuN;v_Y?E86Q$o~aoFam^9QXPsfqKJ zV+$JVFG$azQub>{Z7>6OjNR!*HhD)ed7B< z27P|dZ=DosZClOsyj+#i#ZqbZRsL_bG+p-f4BAg`$!lu!`6RHcI)|#mLPo&$MoG*+@yRyShPjuPgWSRW&1X*SAsobXK`ZIq_|05e>q5WB*i2cN9mN zwvNC8)mKVFT+zS$gRr=8s)Eqe8>*v{Uz~GfcC=vj!pGb8djg8(#1u;p3-KNi&s0*3_vHekXRE}~2qsPAj|b|--q$%UdRe9j9w{F5kK+Hf>5P77+w7ak zxOYdr=R4b$&#lVc+?FuAbD@lVepdk7$Wd7jRZ8B8*&mO$I4BEc4J-4%^;}!Zw|`QJ zb2Ov#i=d_3PbI-i?~Pfq8}?MvW&|(y`F@mk_cyE^zQiGc#3voex`(=+aq^+}%+6Dt zUmEn+w&YbOKD6|AR#|f{+cDK+=mo!{lWI)IW2C-prhs@>pWW2O| zw7ZO>DSnGqM}gH=Y;XYNpu@KWxXt2G1Xpy!sC4-p*n#kuGGF~=d=FSc_Sphg@M7#MC0(kJ>g`-w)uM(+4Xr0 zzhD-XbC*#Jh^1s^X4=XK+_)np!Nh=<48Hbl_=h)qwyi@hMY>T~6mmZ}233rBaax^t zyRo6cp^KG~vUn2SJ5crItUS{WQB$5^o z8BUl9688>cW!C@$1=mvp>J|-sXX4tP`Py+LIysr}J;@Oz2J^}IIbHa!IpJ`HMq;(B zEI-_EwXhjWjidP|nQ^~<9Om&7px~UlOPePq<*erK-k3}Nqp|RpvEuBFo{oxy)F_1* z%$!h>U|ihEXJQIofv~a-z!Yo|Z=6=N=!*Z-LlU7lxs#^LuCoExP-`;wMeyI|iK*hT zS87MLLwfml_-u?C?g>B(&0qH2wHN*CgNZGl%Hh{s3@aXxwJyXW`=1Q{pBmVQ=KxN7 zRqndlj!NYc5eZkJv83a+m`79xEcge9gaD!?gy#19p2}TB+*21OYI5qEH!SM}I6(Af z6rxk{nHo(P`>v{4VU;RQoGye-LA>%jKkMC6xfZdx?1%5dyx$GW3U1g;)gdM$Y>MiD z0Dn&f%~RjKVSyo1FhCZFaEOo#KoUF$ipk3Svr+`B0YoXjd=QkMgmsV$#bjw~vYZDi z7E2=#cl&RcZLPw>fa%)%Ui+iX(j3r6{)d%R|M?jt6ou9ELU3R!z&cNS@dOApgH-Qi zSwVf|telF5AbhV4OT~Qy4V7k@&|$745-)IKgb$6ILCGEoe{_H4$9rmMBRe0sPHl2l z2JwJU?i|#)gy^=6ICnJ~3K*5AylW4#o>?wPOOxh^XJX z%H0}cFbiR+wgIGLkB~Bqx~YCsf_VpThN0n?2`RK=&<+#w*?ay+zce+}zxRpri0(vh~yS zv=&e$`@tga<{!7gJpmMtAkUs>>G0rH1YJNB1=7}4$I06sKfWGpg3qsRN<{)8!wi_p z`;J0!q5&>-KD^`ja|&#`k2~Z9Ep6ub+@UjsC#d;l_Ig%WGtUDPa5(uL^mYz(#=W4a zfR+>Dd$TQi@LKBjeFg^SYi$B^a*p|58UBR6+sXDDK@iFi$lc*sJo4fh2&|gm$=y2M zBDq3Tj&~76RA9wsYU*rSTK7m-`B2`0OX25RSY`_EH2CVVLviO65_0Hr<#Fi~Tl3NgV`bI{QhU-)p z@Cm7kzwpbS9j$?E*?GThZB)GfJ&zH7kgHm7v#KVZ$^#|#0Q@GxCj$|-p2bxDYSrW! zICx1IB7#Cn6#fNnTK~0p>&GA6*sk1|X9u#E0u%D=Sp_Z{+n(^RBOO#obx8NnJ1~V0 zEF%gqE%%}9=pP)s=COx4F_zof+8WT$-N*^(?{V?)&~QR1Q*PD*?c*(&(ufR=Z{vZz z$ZTUPiG`+1<=+5BGJ!=`VR(5&HnFj2JCZQ`9ifKajNYuUVqhaksV zCh??8;NXoypu6}N*d3<*PObD^C;kC=DT4b#knRUjjG!1|E??Fk$^ z1_mR0iNNqMXF|imu;<^6rZJF>&Mdz9q=)LFH zEmcdF9JL|5mKd+y2KPbfYzLk2daFAne_k9spsawrfW~*;9nvVDVtA&@I&!h9`sm!Z)G zI(EXS%N{}kSxO;jF#xC#F5$4gV=+AGkPGoG*`7o) z>r>YxQdRuFNb#%ER%fUVlAii^Wv;;|m}W&F1*2vpa#7GRMIfw*rw{*W2(Ull>FQeR z`Nl7vK8tQ}v<6Xd5{}+8DDM>%70FoR2!5bq=qfEK>G0Kee&etAh$#DuV5Fe>yKsBo z&l$e4e`J+D5O^Dbo}6N zkyO1p-cH^c8G!{%nlf(}@97>-=Q|1+=ZH@>Jw4r=-B4e@o)F(bfQKbJ1Nw1NF(7-f zQlLr+$6jhN{PxtBly3(Ibm$@cDu zSsy?o7?66`2%oMB0*`zE`iS4Q9c3lUw5Fy;kN)vh5hM8Dpi8(F#MK$fa1C}rNKC_< z2;u`D!1n<>j4q`HwcKYU%|6_O@?WNGXoGI%9H6c)!;H^djmZWZ23Ik zZR@5+J84)W5|FqUDt_g~{E2tuDPCJtR5Syk9w*?E(06+I_>eLZGGa1sme?yb90l15 zML_B9Y7V8Dn#q$}Av()Hc=J9)Hm)dwn3$N-z)SN2IQYz)Aa&*^7%lzEct1bCB?6u+ zMKOFx;_8Lgcb_yE>gd!$U>%(!9KH>j)T;{LM~eyY8EQxU+O-M_B1T3=gfrvo>kD9w z2hlMSo;?KYtP)HF<$?V!S>5m7R9A0!j-q-A1scM0AQPrTo$BJ|cE7*wLJ_zJfXV<6 zLY{NYJ*O>@IQS0mi~EZ!>CRsNPv91aFAU zLKyd`qc5PwBOpKTkJ=dweTcL{d3jy{1U7fAWMRa--F_(m(kDciba=8Wtoh-`8Poy) z9Soxgg4OOK*b$&;Tb!y``8M`}XVU=Wvk_S9*buFTV;TTM4TQ4o%wbSsJ#^|YLAd-3 z1-TvOYbQ%Qz)*Bx<=?mFaLAn6!cnBK}UGxi-zs&?Aqx9L)Sk;;QicJ%h)_?6fL0IQ2KmQ+&eoh*cM3-9w_uql3`1WS)# zC{T?c`z~9yOy+z1)?`wW;`QFW&5t)rtH&M#o)4fqSw%x_?Ha80Pz;HLwDeP_*Q2Uh zK8S?%?A2(o*SpTI$F>5zJ8n3^U3}(fd~A&@Q5<+rh_X0Xwixkt4DP&CLak!X(sODZuj?` zKp{o|Uwq?8wHU$R00Z@V%2{B;NkqujOR(dQ$cm)|;$;pM%1T>uf_e5NB7YLp={Ch9 z_|XbV8m25kXd}CYVB=vo3)J_ozmj@$%3$|IetyK%l>D?rqX#G74wyme zkyVOC3ZPO(J?}o!zPZVjSECjyBsG^^jIOF)arVnw9YP=`OCBXBrDk$uxP?DV3tNO( zM;{OR`hmeF zJ`EKxv;Z+&0<52M!ud11xT2k1u^Bx&f&v@OXqE$}8YI;~CQtC_TdYN}S(Fjg8$lF6 zCZU3Pi)=&#BZdrGZf>sLgcNp~6dUZg$i9L&fl#Zw%rzpIMXY=^*!xfz1tXr;H8ruJ z=iOZT6cKQM9;vK}cjMyaWdbD@$V5&on&Wt3T&o|#5&?MH*rYjbda)Wg;sUURFqedY zb7c#w898ae9wjO&DiEat9YbdZQ1YqDD~k>M(BHovZ@p!Zv%M#uL`VLQrju~TQ89c3 z5R(;~YkgOaRG0{}NtX_Rwd(${R}>MTzKGiR)3pa+^c!WUFRz+?m$ZzHtqz%fskpd! z$*CS81k=c#Doa!z1Tjb?%gAGWZ{G$3&SW?Gst724mAF>aD;$(hP;c7{O#v-a1K$qz zB_ul%s{z6XsmcIK2_24kr*1E=>hQWi7sZBsj#v2qaVUUN;~(b?0CxN*ULUkC|MS;z bW&#{r+8ag$JFnvReJDB_2I>W>Hs}5Ygd^8b literal 35420 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 D$Qo9d diff --git a/docs/jax.rst b/docs/jax.rst index db79b081..9a7b42ae 100644 --- a/docs/jax.rst +++ b/docs/jax.rst @@ -22,6 +22,7 @@ In the first cell, install hoi and import some modules: import numpy as np import jax import jax.numpy as jnp + import timeit from time import time from hoi.metrics import Oinfo @@ -35,36 +36,44 @@ In a new cell, past the following code. This code compute the Gaussian Copula en .. code-block:: shell - def compute_timings(n=15): - n_samples = np.linspace(10, 10e2, n).astype(int) - n_features = np.linspace(1, 10, n).astype(int) - n_variables = np.linspace(1, 10e2, n).astype(int) + # number of repetition + n_repeat= 5 - entropy = jax.vmap(get_entropy(method="gc"), in_axes=(0,)) + # get the entropy function + entropy = jax.jit(jax.vmap(get_entropy(method="gc"), in_axes=(0,))) - # dry run - entropy(np.random.rand(2, 2, 10)) + # dry run + entropy(np.random.rand(2, 2, 10)) - timings_cpu = [] - data_size = [] - for n_s, n_f, n_v in zip(n_samples, n_features, n_variables): - # generate random data - x = np.random.rand(n_v, n_f, n_s) - x = jnp.asarray(x) + # define the number of samples, features and variables + n_samples = np.linspace(10, 10e2, 5).astype(int) + n_features = np.linspace(1, 10, 5).astype(int) + n_variables = np.linspace(1, 10e2, 5).astype(int) - # compute entropy - start = time() - entropy(x) - timings_cpu.append(time() - start) - data_size.append(n_s * n_f * n_v) + data_size, timings_gpu, timings_cpu = [], [], [] + for n_s, n_f, n_v in zip(n_samples, n_features, n_variables): + x = np.random.rand(n_v, n_f, n_s) + x = jnp.asarray(x) - return data_size, timings_cpu + # compute the entropy on cpu + with jax.default_device(jax.devices("cpu")[0]): + result_cpu = timeit.timeit( + 'entropy(x).block_until_ready()', + number=n_repeat, + globals=globals() + ) + timings_cpu.append(result_cpu / n_repeat) - with jax.default_device(jax.devices("gpu")[0]): - data_size, timings_gpu = compute_timings() + # compute the entropy on gpu + with jax.default_device(jax.devices("gpu")[0]): + result_gpu = timeit.timeit( + 'entropy(x).block_until_ready()', + number=n_repeat, + globals=globals() + ) + timings_gpu.append(result_gpu / n_repeat) - with jax.default_device(jax.devices("cpu")[0]): - data_size, timings_cpu = compute_timings() + data_size.append(n_s * n_f * n_v) Finally, plot the timing comparison : @@ -81,7 +90,7 @@ Finally, plot the timing comparison : .. image:: _static/jax_cgpu_entropy.png -On CPU, the computing time increase linearly as the array gets larger. However, on GPU, it doesn't scale as fast. +As the data size increases, computations on CPU (in red) increase linearly while they remain relatively stable on GPU (in blue). Computing Higher-Order Interactions on large multiplets ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -105,7 +114,7 @@ In the next example, we are going to compute Higher-Order Interactions on a larg start = time() model.fit(minsize=3, maxsize=o) timings.append(time() - start) - + return order, timings with jax.default_device(jax.devices("gpu")[0]):