From 5e37b0355e20558c8c591e83b74acfc66b84209f Mon Sep 17 00:00:00 2001 From: ashjeong Date: Wed, 16 Oct 2024 19:08:30 +0900 Subject: [PATCH] docs(benchmark): update FFT benchmarks with new flags --- benchmark/fft/README.md | 115 +++++++++--------- benchmark/fft/fft_benchmark_mac_m3.png | Bin 18813 -> 18421 bytes benchmark/fft/fft_benchmark_ubuntu_i9.png | Bin 20465 -> 20128 bytes .../fft/fft_benchmark_ubuntu_rtx_4090.png | Bin 19222 -> 18800 bytes benchmark/fft/ifft_benchmark_mac_m3.png | Bin 19008 -> 18492 bytes benchmark/fft/ifft_benchmark_ubuntu_i9.png | Bin 20605 -> 20184 bytes .../fft/ifft_benchmark_ubuntu_rtx_4090.png | Bin 21262 -> 19611 bytes 7 files changed, 59 insertions(+), 56 deletions(-) diff --git a/benchmark/fft/README.md b/benchmark/fft/README.md index f0529b826..7481706e8 100644 --- a/benchmark/fft/README.md +++ b/benchmark/fft/README.md @@ -4,6 +4,7 @@ ``` Run on 13th Gen Intel(R) Core(TM) i9-13900K (32 X 5500 MHz CPU s) +Compiler: clang-15 CPU Caches: L1 Data 48 KiB (x16) L1 Instruction 32 KiB (x16) @@ -17,60 +18,62 @@ CPU Caches: L2 Unified 4096 KiB (x12) ``` +Note: Run with `build --@rules_rust//:extra_rustc_flags="-Ctarget-cpu=native"` in your .bazelrc.user + ### FFT ```shell -bazel run --config opt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --vendor arkworks --vendor bellman --vendor halo2 --check_results +GOMP_SPINCOUNT=0 bazel run --config maxopt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --vendor arkworks --vendor bellman --vendor halo2 --check_results ``` #### On Intel i9-13900K | Exponent | Tachyon | Arkworks | Bellman | Halo2 | | :------: | ------------ | ------------ | -------- | -------- | -| 16 | **0.000958** | 0.004086 | 0.007342 | 0.003784 | -| 17 | 0.032529 | **0.003283** | 0.012624 | 0.005433 | -| 18 | 0.014067 | **0.005768** | 0.025811 | 0.009372 | -| 19 | **0.008459** | 0.011465 | 0.05208 | 0.019333 | -| 20 | **0.016166** | 0.024533 | 0.106217 | 0.042381 | -| 21 | **0.039447** | 0.069444 | 0.212414 | 0.087621 | -| 22 | **0.125954** | 0.177245 | 0.431237 | 0.188843 | -| 23 | **0.297259** | 0.391987 | 0.835686 | 0.427426 | +| 16 | **0.002058** | 0.005143 | 0.006314 | 0.002249 | +| 17 | **0.002246** | 0.00334 | 0.015646 | 0.006193 | +| 18 | **0.010154** | 0.018807 | 0.046443 | 0.007574 | +| 19 | 0.022984 | **0.014652** | 0.076281 | 0.014506 | +| 20 | **0.02** | 0.02497 | 0.100082 | 0.042877 | +| 21 | **0.044831** | 0.075563 | 0.20222 | 0.067161 | +| 22 | **0.130201** | 0.179075 | 0.402452 | 0.169194 | +| 23 | **0.281398** | 0.394068 | 0.792004 | 0.372566 | ![image](/benchmark/fft/fft_benchmark_ubuntu_i9.png) #### On Mac M3 Pro -| Exponent | Tachyon | Arkworks | Bellman | Halo2 | -| :------: | ------------ | ------------ | -------- | -------- | -| 16 | **0.002735** | 0.003468 | 0.007731 | 0.006372 | -| 17 | **0.005237** | 0.006043 | 0.015891 | 0.012804 | -| 18 | **0.009494** | 0.010686 | 0.027312 | 0.02485 | -| 19 | 0.020251 | **0.020156** | 0.055652 | 0.045714 | -| 20 | **0.038186** | 0.040006 | 0.110531 | 0.096778 | -| 21 | **0.085204** | 0.087181 | 0.228044 | 0.191695 | -| 22 | **0.166863** | 0.179635 | 0.472941 | 0.386844 | -| 23 | **0.347128** | 0.378249 | 0.970552 | 0.814043 | +| Exponent | Tachyon | Arkworks | Bellman | Halo2 | +| :------: | ------------ | -------- | -------- | -------- | +| 16 | **0.002526** | 0.003804 | 0.00784 | 0.005689 | +| 17 | **0.004694** | 0.005769 | 0.015577 | 0.01121 | +| 18 | **0.009246** | 0.010243 | 0.027834 | 0.022379 | +| 19 | **0.018328** | 0.020404 | 0.055661 | 0.041394 | +| 20 | **0.039683** | 0.041085 | 0.110702 | 0.086299 | +| 21 | **0.079138** | 0.087336 | 0.230857 | 0.175599 | +| 22 | **0.166646** | 0.177959 | 0.474296 | 0.352872 | +| 23 | **0.33996** | 0.363612 | 0.971581 | 0.748284 | ![image](/benchmark/fft/fft_benchmark_mac_m3.png) ### IFFT ```shell -bazel run --config opt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --vendor arkworks --vendor bellman --vendor halo2 --run_ifft --check_results +GOMP_SPINCOUNT=0 bazel run --config maxopt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --vendor arkworks --vendor bellman --vendor halo2 --run_ifft --check_results ``` #### On Intel i9-13900K -| Exponent | Tachyon | Arkworks | Bellman | Halo2 | -| :------: | ------------ | ------------ | -------- | ----------- | -| 16 | 0.003078 | 0.004531 | 0.007794 | **0.00297** | -| 17 | 0.011666 | **0.005005** | 0.012804 | 0.005309 | -| 18 | **0.005614** | 0.009204 | 0.025717 | 0.009741 | -| 19 | **0.007625** | 0.015332 | 0.050253 | 0.018729 | -| 20 | **0.016751** | 0.030142 | 0.111549 | 0.041873 | -| 21 | **0.039565** | 0.0715 | 0.222403 | 0.098125 | -| 22 | **0.140152** | 0.181124 | 0.415709 | 0.188011 | -| 23 | **0.317353** | 0.400472 | 0.845031 | 0.407396 | +| Exponent | Tachyon | Arkworks | Bellman | Halo2 | +| :------: | ------------ | -------- | -------- | ------------ | +| 16 | **0.001392** | 0.012028 | 0.009913 | 0.002413 | +| 17 | **0.002511** | 0.00427 | 0.01418 | 0.005731 | +| 18 | 0.01762 | 0.021167 | 0.034676 | **0.010811** | +| 19 | **0.009646** | 0.01447 | 0.058714 | 0.016038 | +| 20 | **0.030303** | 0.034815 | 0.104936 | 0.05337 | +| 21 | **0.047463** | 0.072579 | 0.199788 | 0.093146 | +| 22 | **0.146697** | 0.181389 | 0.391296 | 0.19874 | +| 23 | **0.285937** | 0.403596 | 0.82276 | 0.347876 | ![image](/benchmark/fft/ifft_benchmark_ubuntu_i9.png) @@ -78,14 +81,14 @@ bazel run --config opt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 1 | Exponent | Tachyon | Arkworks | Bellman | Halo2 | | :------: | ------------ | -------- | -------- | -------- | -| 16 | **0.002766** | 0.004274 | 0.007948 | 0.006638 | -| 17 | **0.005883** | 0.006978 | 0.016308 | 0.013121 | -| 18 | **0.010532** | 0.012815 | 0.029066 | 0.028791 | -| 19 | **0.020781** | 0.024054 | 0.059351 | 0.048824 | -| 20 | **0.041061** | 0.048806 | 0.11825 | 0.099004 | -| 21 | **0.090855** | 0.101232 | 0.236775 | 0.210805 | -| 22 | **0.170776** | 0.203109 | 0.488306 | 0.423618 | -| 23 | **0.383255** | 0.454968 | 1.03129 | 0.881795 | +| 16 | **0.002798** | 0.003867 | 0.008102 | 0.005665 | +| 17 | **0.004882** | 0.005737 | 0.015998 | 0.011672 | +| 18 | **0.010308** | 0.010962 | 0.028118 | 0.022723 | +| 19 | **0.018724** | 0.021338 | 0.056855 | 0.042554 | +| 20 | **0.037687** | 0.043237 | 0.113848 | 0.089899 | +| 21 | **0.078429** | 0.092134 | 0.234585 | 0.174939 | +| 22 | **0.162542** | 0.189442 | 0.484644 | 0.361127 | +| 23 | **0.338646** | 0.392674 | 0.989173 | 0.765592 | ![image](/benchmark/fft/ifft_benchmark_mac_m3.png) @@ -94,41 +97,41 @@ bazel run --config opt --//:has_matplotlib //benchmark/fft:fft_benchmark -- -k 1 ### FFT ```shell -bazel run --config opt --config cuda --//:has_matplotlib //benchmark/fft:fft_benchmark_gpu -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --check_results +GOMP_SPINCOUNT=0 bazel run --config maxopt --config cuda --//:has_matplotlib //benchmark/fft:fft_benchmark_gpu -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --check_results ``` #### On RTX-4090 | Exponent | Tachyon CPU | Tachyon GPU | | :------: | ----------- | ------------ | -| 16 | **0.00097** | 0.001231 | -| 17 | 0.002156 | **0.000667** | -| 18 | 0.003524 | **0.001297** | -| 19 | 0.007366 | **0.002654** | -| 20 | 0.015787 | **0.005877** | -| 21 | 0.03753 | **0.012573** | -| 22 | 0.122167 | **0.027632** | -| 23 | 0.268875 | **0.055971** | +| 16 | 0.002348 | **0.001** | +| 17 | 0.00204 | **0.001182** | +| 18 | 0.00393 | **0.002211** | +| 19 | 0.009317 | **0.004079** | +| 20 | 0.049204 | **0.008114** | +| 21 | 0.044158 | **0.01616** | +| 22 | 0.134064 | **0.032785** | +| 23 | 0.274101 | **0.066068** | ![image](/benchmark/fft/fft_benchmark_ubuntu_rtx_4090.png) ### IFFT ```shell -bazel run --config opt --config cuda --//:has_matplotlib //benchmark/fft:fft_benchmark_gpu -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --run_ifft --check_results +GOMP_SPINCOUNT=0 bazel run --config maxopt --config cuda --//:has_matplotlib //benchmark/fft:fft_benchmark_gpu -- -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 --run_ifft --check_results ``` #### On RTX-4090 | Exponent | Tachyon | Tachyon GPU | | :------: | -------- | ------------ | -| 16 | 0.000993 | **0.000833** | -| 17 | 0.001673 | **0.000643** | -| 18 | 0.003533 | **0.001305** | -| 19 | 0.007446 | **0.002701** | -| 20 | 0.016039 | **0.005882** | -| 21 | 0.03786 | **0.012817** | -| 22 | 0.126032 | **0.027767** | -| 23 | 0.32731 | **0.056064** | +| 16 | 0.002138 | **0.001341** | +| 17 | 0.00488 | **0.000933** | +| 18 | 0.003887 | **0.002502** | +| 19 | 0.00896 | **0.003806** | +| 20 | 0.017953 | **0.007745** | +| 21 | 0.043787 | **0.016268** | +| 22 | 0.132048 | **0.033012** | +| 23 | 0.291132 | **0.066022** | ![image](/benchmark/fft/ifft_benchmark_ubuntu_rtx_4090.png) diff --git a/benchmark/fft/fft_benchmark_mac_m3.png b/benchmark/fft/fft_benchmark_mac_m3.png index a77f76f74b5fffc9d3fb02b65e7603d5bf8c802f..25235269a8c67836ad7a3a21a95ee1b457e8e601 100644 GIT binary patch literal 18421 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 PN0iJ7h2zOb&tCa|dts~$ literal 18813 zcmeIa2T)eox-GhZR@CBVgH_V+h%np+xj@%$#1fe%@3A*Nb3AEHQ-MDj(;BfO%(sQv74gJzxYv)J4PqZrC#gI>r-dWeA46Y?N7=p z8{k&m9^XidBm9 z5uWMUyKmpV`ilY-V`FFW5G}Q(Fnc&Rj$8lJ*EFR#<#uB0sY z&@xilS10QYm0n$L=9ztZK<)%r-kfD@<3hdgg?GQvbEuDBn`a1@4iezII5XZGHZ#%R z@6MIWNJUmPXWMxP1_n0kQ$>u@G;{|ApA<83adCAPKN)TPATmGxWE-z>_}uhZNonc1 z1dUg$%aX_Y7c+Um~hL9MW4~2yqQ_kN%EH4e@SHPC`)g}a-%e%F5bF58& zE!h)h>A>jqd(ZT=y}jWu(;H>eSIrWTD=sd+V$~|e$9qom7*#Uy8daXc&DKVRxENO@ zo%PtY?cjMgCnqPKE8kD8-pYL{F)?vwqE5$b#;hSt+<9ia0(%iX)#|GA%DlC9CD)r! zk;S>g1yj9ES*c!6p73G^Ym#(yE*3tjsg6;od2xEBH#T^~erd(&(N5k=Ul`54zI-dd z$;l~g)m^4k6?u*q*Lk>0NZprHOaA=%(8;0ZfbT~yT)5zW=;CdMsiB18C;Q_pzP)3a zX?krVY1WugwX^M%=T3IYv*6vkckEvB^V8Xt5t302hSkw>F+;D6 zYhrzv&-sUEKf(hFzkIYfKkVw$(V=J3+FzHXv0@YZrQVu2-%?>+U0rsA)cVLAjaQd9 ziTl{KI@d*-4>qK8EG#V4mYdWiri-P#8Tq)K#dvl$d7oNfP!LDqqn)W4^OKF{c>mVJ z2C9u`9&Xcrtk>I|{VIKMs5#rmYoDaL6!R1PcQ=>UPR6MusgHJ*n)H(WX}x*#w*Y}e z?HuEg(b1GQGktL^U8T*<&6XqIPX{dY*CwQjrLb#ce72mQv5|bje2)FJ`=<1P`qcde zcEA1j*|trTvOR3oC8ZRvdZ<)*O6BE3qG^4KpZeM1mYka8i)Y2Bl;74SYQ?Fg8Wa~4 zoMv$O`JBn9)SvgY?V$f_>t5Yd`QDzMXe3qC(Q~ZgNja1LrQNvs`lig$(j%=!dfY}> zJeH3OV?&*8Zj?8hO4&>nUbnQftGl;hzx;#2`qZd%&WNuX2G_agyM!E68&_^(kCyOe zt$$!=ZT&PXEG*nHDl$ncI}%G>lc1rJZ8t1^C2+I0{c+?SOGAWXTsDVBMm0WdH5v;5`%o$)m|*$z}z!dF5-KG z&i5Ie$6*x5o|cQ}n0h}x-0r0(G~d_T>u1E~)%nT03X5ZdKdlpJ4bqeH7S#1id}>~` zx|mq45J*?3UR#CYmTp=v|Mu-$ODn6Yc(qjSR7J|~f$Iwzw{TQKZ7;=CgLC2}$(ov* zd0po00~Erhv=9@IJx1QGJr|Qt{%nS2%KtZO@()txjVPxAB=qBTXe<+dXW> zeT;u%ONvH4cNi(y-1+U>^PZkdXd@CbLK9EXal+0DTuwD8C2zWfdN1HG9<82k9D(35 zYs!>EEbzEOX5IRX1-JULK5IyRP?cvCpmWqyVQCFT8{wZ8SH zwJ$Hc=gu;w{76Vy z#!XRMR?)1ZsQmM&@D#Q5B=s9b9o&KlpxoXf>L_XzbDi+-0{r}H-DN>f0s;a`k8$Fw z4?gH7_aK2;wclh;T$sw@qk@mwNec@L*J}a%gLk`l)={cOWUzl|NSa*t_SBT*_W{cdMYmUPug);jpy$%oWPT#f zrW|kI^Q@>ytR_a`EUGrEPVSqo@{o{D8(Q4{H7(jUM6(j&3LWUM*1SxxU<~4g6rYA{ zyQHP7wuA-?IT|Bl)HGRe`5{AJh5T~i+4x}R$$IOl5Fy8mPfuCGP~#=NVijXvoD1OV zeZN*j@%;Jok+nWgpN6B^>GcUeoke&(Ln$3a3+(VZ1UlEb0khNzh3lkbKlJM zsjBKp)mw@Zyk5vnIXF7@zq_@P&ulZNre}7xV{DwO7ux@x&6|C#2NxH3UC}3J?QZSS zXkHx4w(4Gk2yr|6Lp670=J6X#@87-q(nurK;343PXH4O@H1o2LAq*6?^`b9j-~Ms+ zU~{&L2?HsUNeIA`%KUsBGrcnATCmyo~MaRj3 z;&-v~-N*F2wLI*MPxPPdYfUp!0Kk$21}gQxj_637Qq`sdxOIy^Nqs(k{l<-Smw5+- z#5n{a{x9@kQ1RF$q!=l+wX-xp#hX>BGR>$;{z1?Y^I#w}*3FwY)3Yf{&Cg7v*1JrP z>I*H-jeYXv3Sm`@4n-f6cs=zwXSB1#q%vHbZ+>d1ne9n&IB<%%*Nd>Q8Xz}<43Q{( z)iF;>gPH*K@SN#s7T-=x&&+%>utatD>Dk7SLp^sGT)v=6pt{|R4>*Xti7g!EcM}V$H}y$PO~pd& zH#avonQd)#lgEmhA)iPz;69kdw;i*MZ*dwsH!R-YVL1r%v6(!}-=LETO2%{1xXp4+7v!&(0EbO`to$ra5sl zXz2oWLxI6pyZm^jR``mRT4hCvM?OK_mlG!YRs`-*ZnX<~~Gyy8z&pDzG4dOv-tH;?->;5Gd!3n-nOu~WpQX{Pn^<;$ZJ6G~VG ze_j)xZ|%ZUO;(>mMDmbd5g0oNVt$u+}_#_Uw{n%S-^bVr8FSFEyE_rKMHOaj>x&Y)}G-tDPKdq~EwP9FRI1 z<=1aChlUdE+D&yGys>n(7jWO)+*}9Rdw#yCP0yF(SPy07;zW0dYeW1}33)Q@Vc2w@ z8!3!cPmgUtM@Nnck0v{g_dNgb;S_pqb7V7yS4^A=&rjT{&b)GQ$#1_!1Kp}4^73X9 zDT>kL8M{%=i@nP*ls&08RW>z^2bM9*XwG%k*e?^T=*O+!(bwmHj=oE9`;p7l1hpMD zEGsH0VaqQ0R=%F{?6qv?b&Jv8lSuR7GIwIL6D36PO(5zcazhg%{N<4-G$$b(}i-s&w3i3|<*T#MO|1qTh>h)h3 z(K?e5fd+P4kvGaf2dUYs(B>Z=xi(jIDK*Grvq@_^F7)UNb zeGH^6d;ISG`-$-?nYiNi;(n<6@S8PX=77^Y*83!#{&Yi zBnG=KT*dQ}ee>rr^0INnwL3dH!m&zXUJF0l*P__$JZ3B9Wj)cSv}DPW7}@71NbN+Q zR@*7$P%W^qz|xI^^{KpE2L1K^qes$mn1POw{YLeX@N$_QJc6Deg;>U@;G371XFJs7 zclF6Kiu&D+zXB+M{*OOi;F(x~5!b9)j>WL{|>#|$Uwh2ba` z6Pqy}32omOM9H50`=g{nP6BN`P{`;1fz1Ug<_dSB>dm zc{Ra;eG1)PR zW8AJGcl@`S;FV@SqC5Tb=cR)C^nG8G$siRB4&`D^yxQT@JCV~Wva+7!Ny>tbX*43^ zc;@__xaUtwjm14=) zOajnJjH{y`zj%bnJO<5FJ=5a(xt~wMJw4Y=4Ad(Cq4^)YaDAeh54b?^xBMN^c;9Qw z&ih@T{lf59BMcZ`;Yfay5YRSJTe`u6VCtOz@qVp<<79kk29hNfWe^LNb~^_>!lXP{ zNWik=E*{WWi$*F5)ilzf{VXUH#VkvGL>X7XYF3mLLj5EH)R`btF(g!>-7)lLqJWs; zCb}?1RDXMaXQJ%baF3s1upFQS;=acEp^b&b7l5ARa3paet^K$7FS|Yf?#h`S5d_jU4KVAPz8)7a|^_ zHtv3@TX28dQHxNQg=s@l9l>z)&bZ))oRJ<<*geH?vGva2Xi$otk@?-z)6?1m19dg> zm;h{E^A=6a9JOZHv>G4|@BK2n`g!fizwiz-fZSqKlC(*7kc7;c8!aITLSi~m zKu}01-F8rYr+~E>roIZ)eLNNi_EZMRCEz@h#%JCVk0L;3`Q8QGTiZ9>+k+c7Zjd=u zE88{(a~XLC;h$|c&NiG47Q8y%>8le9n#H)~O%}n%y)8Cwpw##-Bq3}hBqUO_7wvRZ zRiDkx&(}nr+YbImbd&pOgmnAf=H&jt!34ldpbJ@h{ za4hVgq5KkNuJ>)-_A0M&K`N1HEZpawD$Rcxu>NhG{x>t(`88EQtE;yhWPINa%t4B{ zx(L81R-|U8&W46^3*0MXyZJ|EaSz*h?!GH7HmK`GL4RHG{2J@2AuY1h-~qws)ZAUa zS1(zWNgQ+^f$|bh4?IT##9@v_s7p=dV$lg%`H(?G8~?GYz6@<~p3-X0aZ~}SRQ~qv zmQsqI_^n&F>K{1H4!%-K);-->;wwWK0emuHGx{fIqx>;q9MI9x!D8k7{O<3ePBkN_B2( z0mw8CydB8}e{TKzC>#-dW)0D376f=`W5Sr9%3CDN(1o4tU0so&Jo~{t5{i{%{92K@ zF9v!40i=HR+lc;q8TnaMSa_E3R;0?H1^0n|tOJ^j25*2zHmXn2Cp8CkGYa6lw>K(8 zI$77(2YG7({s3d7m$vhSl2WXqIBGvZ-y}0ora#r!tD!8XJi6K)WLN$2!b#xzSQH_$ z0R*52%ro!bZ?Z5qjbXx{Fv%*~S5L2Bzuu3Ji{xqMa;9Ytqs9C6x&7ipw)0#H#nfto z*hQGjqh6cM>_>kUd%UN&#TC7)v+YM+-s(4R-Y6!h^Y$A8TG6w}pW4i&otD9&^;)qi zN~R8EkPT)wvZ;i_nw^-K@CGEFuu9e~Fr5Sp7`Q<_b4Q&y3HFGj@Q$53%`z~hFgDL# zv9wH?Hs$t{H_F*C$h6Js7cIe{9En5zx*2fbl3y`hv76 zfmlF8GU0i7d0B&XM7u4zJb_+u8t|d^$G7(hW>GRB8I2<}RDRgEZTUM62neX}-o0DE z>E}yAr<6WBbaH-nN(E0{lWw8{xX=qus0Qmn#(-P5Z=)h8sVU2VkK4F&X98}e=jTW} z!J9r@I>GvdbO2LpXbvu0v0_CfdXi$2w$Q|2qYC**keK_#Q5(ri0p__eC`B926ea;}MntMIleE-#i zQgJ{%9T+0A-3rescCy+EX?vfPvlVIyBdw1lO^EA)T17<#z=SM-*hGutaIq<$q1{!) z8Qt%0VpUmI-PS`*{O6z$xVX5G+Dvi_=t)`!a*C}lKA+nSxI`9V(Bja~LC>kF3Nn&F zS)0bEED8j*cVaXGDb!aL<#D+w^KsV#87C||KNTYl$n1=KNoXYOt9kD98KeQxA*$b8 zwF1JDCi4>-T7Z(ydJGr4|0);wM8XKp4(BC-Bv--c`Iw3S=utx3&CE}=rlX`J09t`z zsHK}qcbc{&zz!cDxn{@F(8YzRyuOy4Y;@(R{6opf$v`G5!Gi3Jbd=|Y^^{d8QtlGS zH!^$RKgCyoh+&lVvc~{zDiaO)_I6y3Q?2K%7B890; z0n-=aO9_}1Sun{nD-$H3gmsn&XzXln54%RUtPcZ}ZS3R-fcIZxq#D|sJc^Pcrdj8) z(jz3z4ax#p#3iJp=2QybxXiysi`j=sltU+1@H8kq#_pFIl;&&e7;sKJ#?=P~TXHl2 zyg`|T+I04XJ18Zs!B0`8OrI?z`%HO4!`7uF@*c-6!S8TT}GigB|)gqqy_nE`Y#<4e(u3XlGMnHs-MLxZ^;X``pZ37(VppzQxsTLlf=*Xd zQE{jwZ!?;#rmY%{l#~>-x9pAU*8QlvwsQym3`Jpy6o>>9OO|wkX9QEqc)N#49|)Gz zv&H=KAeMR2^Uehxl_R4DFckf^ZT?-)utz4qPh?6WvY(9b^eNOMg8Z0_KpK%gN5~t5 zNE`yGHU#tK*KZnFna>6(s_Z`T!bM14#TTcRo1vbr-p2DXBX6QsLp{%Bo=#`?6)rNFBzB{8K;Bk9c=0fvQ@g@q-% z)c`Q>KTkwaVCq;D4$CW7URXJ(GY^Z;3+8q`R_ANwSF#(S&CbdV!K za@u=f6BQ-p_d+|zAqMonS2#QmCa7-yV93E~c)eJ}yiAB=QkxJ=zsj?t_e%6fllsn$ z7P`7GFhNE@dd*ui&=!hG9Ke#d<`A1oq9QoH>R0AESFc|EH3otO26~hq4Ds{~Me_`R z2tkGGL4`o)C7e}BNl9dLNr@yz)|f~9SH9oOU6?V!3%!L5uGIi+JXc5c9_~EGSF-@c z15^F-#&>uCo<4ha0A(y-0R)$a zCR&Tz`iR%G_V7&PK0qt6#W3=R;prI4My0(ZfNVA7>uzy1P& z<;tjnWVYyg78UFuK^z18A5oaBl->M6vs2h%Yk4BT^E< ztg{FTY9fFuHpmE$e4ztGP=h_A5_dtrVM7=I30`kNyVSP?Dkn z;-XL8`=hTlFRuj@gzK0yF1M;2!!CQh)+uEoKmMJ!P0ikc$fHx#krg`Gp1UGvw&-H) zj{Bd!B=1r(_B&9T?MCE8kU5c;L?8--;q=~j8nPp!NyJtP19CdX-Hn521_~Ay7Rog! zXm0FJ4X7s2Sim1K8wb(5!-=0ni5K_4xDww5B`HxSFZhKJAK&D)Bs~lw`RyE~)K^f= z7+V@{=78J9U;41-WuxD*MV`}@P8*7_N;P;387ZL$dodAV8dyX<+crUK1+FXFC1JJX z3#d_md8k=IWT?{0bJ03}{J4O1k0(I3LDDwdgXg_nGn{RJ8YXi;M<%18c2KsST`NMZ zho26^(h?8twGU1YuW(p+-~u|Qri}%nxOMz#eqb1q1H^-iBo3ICZTIful{wjNYV^2z zkzeI1H)6QKxAGd6?cj&J(ij2+255M!#2pVQ+9i3I+J!1Yuzkg4z5p=#>G83k0w}cu zrBn}y7<_-kB`9)FKKXD2=$|GF)*rr=a-8UkfQn;+Rp$1SBI?T~F70?Sc9XEnF(wbs zEHQTI;K|#o_TQEe5`~CJkVppq{!w2*M}Rr4AsqIuU5Uil;05~*E4(Dx8;M-` z*}F?CAFdHu&?AHx_U6=52QLQ|w%P);;-DNUj@)XvcbO1jQrC&#h{C~tv`OP2tUl~@ z6mF3-S(KvatKeaikv z+i}bp62zM&BQhT@>C371iVQOd#wt`>5>>GvZD0yXHF=9~`e`R0NV_mMRz88Ly%)BY zN=dF9G6C@m2z-KN2&{=$I8bvO1TM%FU6;?}8Fw((m{7o~G5l6tJx^qW2{&XtGj4=3 zD2bK?Z7*Fh?UI~h9fHbD%B$-fBS?M(z7Mzn{V2#JlxIz)(>fmf#gc)R5pVjN#o=!l zqIZQGDkSl^B&@xgp~|kN{^#={^ug9Dii)~{X^rji9EomlN+cTP^>49|Nil!)BHpoafdzJ!7mR&agyZzSGkELH4IljL!?X%{o|{o z|B-8&m;pfa5GBk_lc|*Y>AE=OO2~Hw7Tnj%J3KNpuHzMFi8jG^xhWdERf5iEFuUFS z&EtpyQZ&YpRe9iu<`G|H9M;nd2l%$Z4ej|AWr-QBUHQcwds;I?B= zsiH6Jl2A4_EZ|y}k9nSGA>s)la;!mmP{+i^Hd@Hbd$qVOIwxr7s1uRs%7!A$qA6*A z+he*m)G8$yQ^hMWZkuMz&))`@OLgqPMZtB~$F0G?zAm@3!yj9u?$hUE^uGkck1!D! zYASck4ZdnMP`iMai?*@QhSr;AXtx^j1q^DFk4aI!Pi=t?PpA)|A$e6*Rom)6yG|dk z+r^I$Do|brw1B3l0md5YQnKoR7Kj>ZpyQey%~&8=)27~Qjt81Z7K)+piiK8_z+wZ3-|E{hZ8j zXlD`_Jd`mF({I@l4YNul{}2=lf?Lqa^`a!Osg_5wm*lf3L`FkeAPf%p0W$TIVu`8W zvF#bUCeeto1acr}2bEay9Ek?L)H7@-f}Dksu`P-2*wF)wjG`!{&TW}w34u8JD#8j+ zdOZH$fsplRO@z!S^*g*@tMK>LtG%%~3qODUoa=v0ZZWKIl(P*Mw0`&r2s%PBs<3{z z72X`(ix(3_0A`B6vywMPF3VlPc^D=@MX;)`ExuhpH;ZoDF*q3XVv#VifP3j?jkOK7 zi}g2APbv_sP}ukb4gnRSr4?WABcHN4JDw6acB}-@6bx}~1{fWXRncgSEHg-Ywb`lR zx|STr1f*!WYc=FMICFffvayGY*R_X7hU zZ@bd%7q<@)f~&?1ijUEwAQ4xWuFZ(x^P=ooc&fkbXaf!_w%|&a&jc_yOZmzB=@eeP zOD~FhCwB9HyzO^4eCgl0*8cNYXiq}iK7M+Qn)mZ7QJROdJT-6rfAh)zgPZw3?^~E5 zF(J`&lzt)RNxR07VsEPc#(%eh*-P_bPX7b~75W ~tJY3;DTLU7rEHfko%zZ^fl*OJBR~mwO1LEWQdkcjl!bgDmF|j?4yNOmCJK-;Ix-?x;=^Gx zIiTj~jY{sxR?k66`*EMnahQ-tJa@u$gE5p%C)WwXg?8*bJ|te)c_tb|NvviTagW9Q znLS_Q^zd++#hf$;4;_+&#YtXNG+$?#t%WSQf5zoz|3qgP-uuxZSkb4Hz0tzX|89GA zLlFuQtTp5$K!7cN0}FgWYu29VVsGrP1gx93gUSYT=S!DI?(QY_ZxOXws*f^P+QXZz zo}zaTq6EzUb&9h$Z{LQ`OT!gzp#jZ(Sc$UpzLY9Z4S-P}@$3x}&)%z7cK#Rl!&Xk5 zyAUjuQA2lqHHT{kgIoFnY7eu5G1jrjY~T+nC@2VGvbhyq;rw<16xAR3SHNxNg76o* zb>~hTxG$q!?}5390E7lXi4}9!Q4;cEVs~HL^he@XEM|Fs0h?G%crl<1CA|nW4t5b! zii8)j_XAAy!IJL@jUN*ulQ{fRve#&r3@AZzSC;dR6C8cUdgnz-=pSvZ|83=%OK0Ra zsb$~C%-pxQFuZ6wc^CvU%=r!4`e-m60{^9k@P&Zo_MTWmiia$g6lH_*yYr{_#a3tu z!Xf3$C997gy;;1oY}%3wS1@9S{}uTCCW`O5@r@acY1hfzlgdJ)&lD2XWPi8Zr%d5v zSN-Q=^8aW4KG~m*zOI+^PqwZ^Lk%QW@nr5Bo?OiUPZ+Or!b^{W=jC&wB(@}l1R!w#}wPiES zy8L$YH2#b2_LDoQ@cY!=9b9|sa;}tar}B$_cRLvVKy!@wO7nJ#(e9-Qg;a}#7l95& z-(Ox-oEQNjoyuQ8J*px)IC{BKwCr)5KB=}U7cwlof6esi8_l$BFh>zr z63P=%-btF#($U%c{Bhx`gF|Fbo_@(DqFsQXB1dwFvXXAzs!iY$Smptx$&2?Cg83ys zwodsM--54r@m~wyK5=4}#|Xq@-XaJ|hUxSobfg&Af3^wQzhvr#K2?Rf3OLPR1io*Q z^;q4@ZWfvB+%|39nw2p9f=&AyfHFdHspSLn3_si@)ZCay^{;K>AOM**;D*y-Es1C6 zea}69X(cUqrJ|*_%iVBTNEu)mJh*8?&YL&Z_yonm4<9~+H;6DZGuJHqy(B(-=*-{Mfe&C|4$gpWS7(x3{8DY->Q?gU`1O5kH-wKz0Npl2YQGc9nom~ zd+|=Xd-r#;@0B@jo7S&?jzEbJhy>7s7yAngVDV;{isi^WFgX0n#=SX!xRwmgO#8iS zZVu8ZTlC0!S>W_lS9sx_=HGwcRW|2Qb0#~8cFpqTau{=n+DZJgAU6olkYKlD8BBN} z(r{|Tn~BJ%(1I&Eil5ZHwlU#QOF2cnZp0S*mxi$>6uL)bD`Fd`H1F!u!6wN&7U1T14q5>%7l{V1mZ0e`+4aM&OQm1>v$rz70l+^01# zjuZP5dm^g|#$lq&vPjEpUvG86eHza*cZ)pLpTFw`7LQIjUPra|?B^GJLk1wr4Jc#( zRI{Ef=QI5pnqk%$Yd`WGOj1m4(ot4c34)FxV0i(YqIT+m(vIFmIa&` zTvo4OvB~kP6LCR6Syd?Z+UE@vK~7vCXX+J9@uDV~T5;-yoQJ^Z9|d61+fxxnUR;SY zH=u}iLqA1I$3mAS9)@!vFuf2mlsG8CJ%!?I((VGfQ7iZH&xKgj*vNAMuoh{-a}GwQ zBv^N_?ZVg<&;mINGyTM0LRdKY2#MZ@M_OLyF6BKUUOxO0e3%YKI_axpUEZLd!Jka! ztCW7( z)C}VP{_$?5ZDO_XEp87>#Ky18qwLS5h@$ z0|eX44~N?B?QvxSy?!2$UWxw)!Bg^4Vz3;@2`G)U20!(3XA~(83Z;z7(B;K#qX6-3BRw$wb=vI5Lw9A50W=a(6f6VwC+1=#^)i*K(O z>_^_>I35NZ4J2|Wc3=~RFv19lwP2?Wz3PH&t{F+#bW{yM6!Y%zL zXnV?BOY@^-S7sKHsO3%UdRw>Kf9pv;h!!c(sCzTC43woUJi5?A|!cGc`IY4{4rH(MTkw^v+}4IoPRq_%dW5CudmM zOnTR9I>8T4j;fM83~`weC#I6rR4YEEnV%)ii&FNhnD*mv5H>Rk!6xB_aX12k3sK07 zagf8-$9E6}TNK3qu7>{IRiGfYlH;oBmYouWh9&3q5cIzWftrw}GKi?eSKt84IRJf0 zMTH#39tRvo)-UcXj~i}$l>{E~{9W&|@$*$9DqdtuQxZ5@@W3cZP#Gx0t3X(}=D1wR(sGp@9sAu1lY+0r5Tlu~fa zJf>d{!qY*{Ech_hM9ZCoU{?e4$|`y)!f~_ZFi!G7pV;2P9sZ~%zQnR0$f?3|#oMm-(&6*5X`kk)5H&^-we@}4i=;$( ziNdr-T)8AxOKn|UT_IPn?Ai0K!4|md^x3m;W);Bk z=PoWdqUajvRH*e_7~9=E%aDlLWCWvJy;5W|iZ5&*FJSLxGjDlA1V3Vj2K}rF6GHLF z*wl~jyL3Tt5!+Ubd_wvijdq~}1$*wEv2Lem{j>NTCa(BH(S65Su%yO+GMX0SC+2PS%W9~Bd`)jCjb zMdqNWkTaI>z9?vF1~L`nSPaOkdNr3whp(D}IMao=QbPGAiw<+`$qmd>valUZG+CAF zTTOT*4`kEuPh~EOU3Xou?yoIv=uRycPJPOy)AGHq&o~C^qduhQdKHUJlI2cL2nHX> z#OjE0ALm;Q#qYb?k>);aZRaI%Sds%2f)A{CYRodhrZ6OwwY*Es$FjgO^XtqrG*x!2 zeaf4$vSU6sZ{8f>5O5FYTkFM+@>DAfq>}=Pwoo3?CJ845J2}tUNvep7^(KjOrw7}3 z`<^>ny5A`+ys^M3o)Rc{m0QE4+;nY#JHWI$IgQ{R6%|#0Dl88JYzc%5J$~yR*~v`{ z&kn1xXU+8)1AKfXhot`pY?b}zc^LSKx(>_s!bC3Q10)W|$vl&76vh_Lbvt&j<0lT_ zfAke1grf)$P9yPmf%cCN6~I_@^!Kxg&wxa(j*#38BmV)!5iy4YQ1~P|lOhb&T^+2% zCgoLaSI$zud9tP9i;y(xa7kzaBG?TBBA#MB!!T(W^d@iEup!m76{5@x?9kO=XV;oE zVrx2jd&%W{aXh7t2x?daXN(fH!k}kwS*3 z=^U52k+Xo9J#eI@WsoCp#4k)T5v{uq4s&HZ!~_;qebyQ*GeVWnrV}5xn-fjA){Gd* zfF^99sg6r?xoLtiV5}ozHZYgbh6gAOgxBr^u&czv!C1aiXzcT0V#N%1WHZFhRiT}c z`y(nEP9jSr4+HX(a*bY80nc(M!1e*qUr5V_%qwBUCQrL$1^G!4we;_x#+Z;(en&0` z0%Y*uSoOm#hfd%~ynUM;bmcG@0vKkr{w6dAWMBnj0D)gSOvIjZL=oxe?2JH<7Pii# zETaU;kND7wfV0^IP0K4BBBBvM9dRpaYHBj!V9&Wqa=Z@>F3xVa<=2l$KxO&G3!Qni zBZk;YA*sHsH;1UfYd53`_nxE|4yJ^IVI%HtAX=}DkTB5pS-H98$uazBxiI3zAfUjD z9If0bXfGS$GaRbK44{Jebw9}VzkA0f&FGRX(WCGtfMn(g+p(IFWB=0gt+=E zAP!A@i}WxLZIM3s8B1RG0^QYmdGnJ2@Sr}&MD}$&3m-gT-2)s~6D7kCFbGAi3hmvj z0WPr1t6it2oCm%hLIJHG&vu^8c!Z<;5a#-TnxPilahT}SZ+3x~-mkQ4S*Gw@Jp8F{lq*|m$>s1f(C0Ff&>InB{ctz@*@OVJk9V4uj7idSOc;l?D_Jn*pLBeY=i)aHtck!yu4>S>qmD`ZZQ zr79O3dq93ng&q85kNffvR6wM=j8?fd-5_B|ECR$X_zSxL$%Z|9wgs;H!Wl7dS29W1 z4t#wc8p>$Wh_h6?9O7~M@=|YQ1WM3T91Xrdh|>ayFY<#Isu7^pu4Jqroq(mmb#dN~ z90@@tQ~{z@=7{trDHY>ok;`$4}B3 zD1_CJ0Dtu!FCK%>TZji7;wtf;kf(q7^58i??#^qot5>b6#;9>Qb%lLfJ`Fi9hTT#G z+lh&l+$#E5gh`^y{DcbX0Z~(W`_?i}f#oWqC&d_hMLhdRJp2rRAY!H*&YdlDxL<=) zgMg!o$mNZ(_y{@0PRUOB)5(!9?DVI?!fu_xesr*zpY0yYUESU$)BaAmS|L*)YbnD&RRO%B6eGVc2OYZB uaEeCsvM3<{4sN+jiwXW;fBrz%B8?K~h|B2u8cg#PC4O4^RN{&A*Z&v$U$!a$ diff --git a/benchmark/fft/fft_benchmark_ubuntu_i9.png b/benchmark/fft/fft_benchmark_ubuntu_i9.png index dca5a1e3e004c1c924e1b88b66ab5054faf59e74..fbb9936d9e133de48071f950d2134edcbfbc6cc3 100644 GIT binary patch literal 20128 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