From 04eec8827ab102aed4d5ac84b36fb84707c50adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Cuevas?= Date: Fri, 30 Aug 2013 18:51:32 +0200 Subject: [PATCH] Improved multicore and division --- .Makefile.swp | Bin 12288 -> 0 bytes .mandel_classic.c.swp | Bin 45056 -> 32768 bytes .mandelbrot_kernel.cl.swp | Bin 12288 -> 0 bytes Makefile | 4 ++-- main.c | 1 - mandel_classic.c | 15 +++++++++++---- mandelclassic | Bin 11941 -> 12095 bytes test | Bin 10172 -> 10180 bytes 8 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 .Makefile.swp delete mode 100644 .mandelbrot_kernel.cl.swp diff --git a/.Makefile.swp b/.Makefile.swp deleted file mode 100644 index ca472e6402486ce6ee8b815076d0cf5e2dd036af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2O=}ZD7{@1~hk&)BC+)%M3(^RiwCO2hE$7Avn=8-G#QP^F#`(ny8^=mTo5%neAOmE843GgbKnBPF8912+ z>{gCFN9m`s@~>uNZfML7X&?h+fDDiUGC&5%02v?yWPl8i0Wv@aPM`q~FYWK0W$ZVI z-~aDF|Nj_e>^t}dzJmAQ9WY=W6u=p98vHuP*cb2_d;%ZA9(V&@ftO$hY=cd38C(KC zM;Lnx_P}ef4W0oXl))^R1QTEkBsHEu$5b*IAOmE843GgbKnBPF86X4yfq{HJe>3Xv zYemh|Z;^%aj0ps{(pV;x^uh{b#kISuD-SC?Ic6+BHC?L}IQ|#i`8(_JtiDonHx_Qk zQ@4H#OY#1q;Eqmbnk5UmlAY*F(%YIw^fF{yla1Ln-M8%@*G@Zml(mvpF|?-HK)Xd0 zHWVTHuGK4XC`R`eJ1B54|AFl2#8Ya2c|bbLu2yyGrLKueK`2zWDNE}ME*=JXJv}tz zjK!v_j_PnnZP|7ty(a2GSaJvOkebe_Q`4p`mExwU9HGNj;B&`OLBkY~&c%pSlRWiV zb#Tu%Q5tuAzu8FhrFZ$TnAI|O7M3>L`usrTfn117D*KyBcRDh(+_nS5RS-&!FX4GN z6uouHL%D+h&3$S4Qdb2YZ$+N4o-#>qNv^}26D{TWNqdX&1pU=&RbL3Su$+8xUvn|Z HzPJAa8N(Zv diff --git a/.mandel_classic.c.swp b/.mandel_classic.c.swp index a715f0d7eadd6fb71f09df2f070c30b2b19c8d06..59426f6f67eaa5f869f836d332a078a4f582f632 100644 GIT binary patch delta 3481 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 diff --git a/.mandelbrot_kernel.cl.swp b/.mandelbrot_kernel.cl.swp deleted file mode 100644 index 8db853b701d05d226472f991fdb69a1678f14ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2zi-n(6vwX}V1Q6m*jOI0*e!9~mcq~<6A}UmR6wvGWSrz0n>u#nT!~EuhzZ2M zzycEj!NSCUfS3?WjEDjL2PVE}UmF)%l@1J*o~2Lh+`aew?&IrF#ZC9dg-dkSnGrY+ z3vskIesy&0_Q?B8h*b8a(&IZE{bW@IgD`II5ci-c*jP%FJF=zvjjkWJWz>!>-?vUUrKXC{!}_RhYzcMf6(nDWkspmt?n^ z6fTpsQH>TCsOx9m#(*t07u3;KMiZ3TG)Y#DtK8OE)@jGJZEB{{UzsbDh=y%WPL}t? zScdj9CA+<0SdO7-$JJ$ZK~(M~eJ>xT=y07@MAQ*6jLNEu83bV@tLvHHayiRU;;Z#0 z&=Q5Q+8n4Gnw>36>&Xovn1DW^lgcW(ch@mWP2s-W6eDj#Hiitqxrm)qrS z%3K|&4e7wl1ZHJmW&(?TimjmUt#?MH&vJ`kyd#y@iIS!td12dfO>Uz>=cOVQNUXUn zGfI|=FRj%yl~|{YWEW?#COq@vINeRcHriQ#wcP6^Xu$GJacU)TAAXRl7lT%}nZate zn9NKUF#+oR78sVsm n26TB7zFpyLSa=Y&RiNw6IJ3I$w1W*%t&8V_f>^RXmC@oir3qDQ diff --git a/Makefile b/Makefile index 954d8c4..4245252 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ CC=gcc SDLFLAGS=$(shell sdl-config --cflags) # Comment this line and uncomment the next to get Julia fractals -CFLAGS=-c -Wall -O2 $(SDLFLAGS) -# CFLAGS=-c -Wall -O2 -DJULIA $(SDLFLAGS) +# CFLAGS=-c -Wall -O2 $(SDLFLAGS) +CFLAGS=-c -Wall -O2 -DJULIA $(SDLFLAGS) # CFLAGS=-c -Wall -ggdb $(SDLFLAGS) # Libs! diff --git a/main.c b/main.c index 213c099..a99d0b6 100644 --- a/main.c +++ b/main.c @@ -42,7 +42,6 @@ int main(int argn, char **argv) { blue_scale[i] = 255 - i; } - // Load the kernel source code into the array source_str FILE *fp; char *source_str; diff --git a/mandel_classic.c b/mandel_classic.c index beabd01..4f9b0c0 100644 --- a/mandel_classic.c +++ b/mandel_classic.c @@ -243,6 +243,8 @@ int julia_point(int res_x, int res_y, int image_x, int image_y, float zoom, int } } + +// Splits the image in pieces and calls the corresponding algorithm void *thread_launcher(void *arguments) { piece_args *args; @@ -251,9 +253,13 @@ void *thread_launcher(void *arguments) int x,y, small_res_x, small_res_y, init_x, init_y, limit_x, limit_y; int iteration, split, piece_x, piece_y; - if(args->total_threads != 1) + if(args->total_threads > 2) { - split = args->total_threads / 2; + split = sqrt(args->total_threads); + } + else if (args->total_threads == 2) + { + split = 2; } else { @@ -311,9 +317,10 @@ int main(int argn, char **argv) int res_x = 800; int res_y = 600; - int number_threads = get_cpus(); + int number_cores = get_cpus(); + int number_threads = number_cores * number_cores; - printf("Number of threads autodetect: %d\n", number_threads); + printf("Number of CPUs/cores autodetected: %d\n", number_cores); #ifdef CACHE // Init our cached points diff --git a/mandelclassic b/mandelclassic index 389c684aa6d8d91a2c7df6db185483e996e6276a..3cebd922ee21317274cbe794bb8927361dc4d45b 100755 GIT binary patch delta 4625 zcmZ8l4RBLc7QQb(ZPKQFNt^JJl+v`M(AJU=R{ktVA}M{HDO!-O1zXx~e+)Yc62XsUs za3U*zN%tx%xZRBTl-^J}xffaa9LsO9{1oOipfYm~R_AHN{$_AN4}CUT8=>F3shaU- zB2M8SlkBJRvw=52J2J14ntBUl7D*?KTKCMb#AhY( z<|IBliMJ*3#w5Nd!TSkzEbR%Vo|{x*T2ciu__an1t4(?v5xXND>S!4##o&9Ivk9a4 z{4`L-3w4n5d2T2n_MtL18i!PkVw|p6Bg1D9!;&PiYKGt8ZGPgz8H>3Y@fI4S zBc99f>xgxTZ44hqoPk)+@Jom@5fg^@A?6W}{Rl+iuMy*{#zq7djJqzyAP` z{PAH|Bvf-Ox(SsR{{qdr->rrC_S+z+(aXTX%vFZYb>>8uB-;NWGtvI)MEf}_ume(+ zOQKJrbx3_34Vuf3^|#Y`=`Oz&*unDs4KRxnyk7k%1d}&LJny~^eevst#(Bfao^f8E zQ2>fI-m$W0tDbkL=K?y_0w!L*Vk}&Ktlag582)V+^wk~VpMMz?;m%`~&F@X{hUFTu z*XZ_!nvH`>^m=f)3P<1xzQ={O=;w&xKVda*Xp0VvyK!2@;90ZStNTa{*92U*#NH)m z-sv+ygob~hU#AykfAj;3Xf*VhE7HFmL#Lv%b(JY?e4dvO+OEs>9Q{5X_k>a_gM+H7 z#kV`$u*$14Y@~`CeJFhYqTUtp;N%W|_g?gW@vX}6c8%v$9KbK%ah-Qvblr+RK|j#t z*QlW*7 z;5zsaTso`)gN~d#?Hg+PyXdo-4Kt6xE*|ICjzD-II#4ZH`P4MflVYLZ3BA|)kalSUf8?W>0t^;D482uw(%nj1d_%iM!wdz;U zQNw-HIA&k_2~3hn&B}GTY8B1TnwxtYmK^`=K^QuC<^sp`ONW30Ie$n=H)a(mPAloY ztc`xpW0j$}=ck?;&zhP?;b>eGuFwZ375odCiLH_G6R5@}o8MIrRC#!tvAp{h|2)3n zCOmw}`>=j>b{N7y)IAxG!*0^q`J!P|r6LRJHFkZ}F6+FZ@d+Q%Pbi>ktNZlv1C;%LZgFWphU$6E&E zjw)zQU!e)t*^8hYf9?sTbpA7Vjw^f8UfTH@ycQNcUN5iYv*UaTgmTpooCxQiX&&cGFH7N= z;7k6&zwlq!8p-3<*hZ+44+LMad zerPV*09I{$(a=}>?u-auVEt>LQgk0p&o0pXM+tkpw{V!w&vtMJX-oDSy49^4TUs}7 z*!YCQ;h?KWp7=+tg-TUR|@r*}Q3U>lRy6XUC?N){fTZj@Fh3Y=tdp zbiL86_4UZYTMepTQ1%(gcv4QtTscD*B)vn|@x@20;Dy(7$ z(*O*J-C?|$`iH@RQs9>WKLoB%hkZpnnfl!dF(YN=3(DtJz3S&uf~m@jiZorSM#Q(b z9iAt_zLpM5o2`yOYYIBTWor**x`$2)mB!ReN}LBwR8l^9rT9aH1tUKKQ<9yJ49XPJi~!hH>-!&6-++bWOn9j zBo-!a6S6p1Ok)zhKu?%AaRHid5ooog%d#5|c}%~N?o5*%(4j>(z3t&g zBfV;04^=&df<-TFCD{lLH==-3%}t*!6ejGZ>#;(orBQIpY9{{;IR~dq7j?~Yay_(ZmSCCMP8#bd3xd0MmXISa0lAr3ptTV* zfdSJpW#I$mfU{r>c#py)Z`c}%m;b9^O33OYevh6O%-(95IzPuH^)Nj#yMb$@hN1?A z%}6&FITWy@4i`DJcu&Q2lwK}c#*I=-v9nTMW=sLu*WiUgVJ2=VbTa=f@aQbw_ArH5 zPKXwc4CD{dy~ToMYHPD3Z8aSz78H%Jc#BuyQZ6WA;^!p}L#@=2Mr!ai%9RL<-{K1 KY}mM=gZv*0{+TZT delta 4399 zcmZu!4RBP|6@G6wKf58x+s)s;1;TFPCL|HEtRo4O0=u%2T?8kgL;({L%uh)x5aI?h z?MPzRP#=++30f3&`<=V*!NT;; zynF8VopaB<_ndp*yKiXQZ|nPI^I(Qspc1dqI8^#O&o_BQ34$gC!OpRWI)z#m4j~)k z4OLF+;&7UoMT=Qhtz=azv*lt#)<90&W+2DS8v{A)sQB#CU)*~~$=^HW%1<6^c)oSt z;Hra*{dekNKr_*XeQ?+=3Q6uc#L0N(vHNwEVi|MkEo`tLiJj4T#XOE=y)3$zt3+lK zI*Yi5IB|*{(ytZo=ge95x!x)EQ=3iOsArD&IoBNLTu+iLmQt_oZ5Z4nScPe8BSySh zZsWWxOkT%tRPC?l3&ES=N8=5ut3N_!33G%Jqx-6Jv{GQ7C1mP_7qZ#9r5 zr`*^rA{wHg<8{1E^AiL+p3b>#MnOmtn$VXD>GwchtJhznPlqk(sl@y1uIOcTZIp7# z1xf|4wM8TYSveE0mZ=?50o6Hhg_}K}YO(qfw5mI@6W$&GF9&Q>3GAj(>U4ya0X!$ z$9EIXBrI^em9Rv3`a2Ls8wu0Cj81X9jxZ%AdYZkKHn+P4Mu_RW$N(C?(8|To`;=2B zN3-36D;)VV*r9W1NB)ZLAeLe=L(A~WQQlChj(~W8_;+50NB7Ci2<4C+@r(Q$EOO;n zUhkY2sfoLOCo}GPChqz!ay?&IpD%b$9!2-aPpOZR{3@9>RUH{}usw5J-KAh>BvZy$ z7bqyRx%|QBZxDSc|(7w>PVIAyf5@r7yR{xrH7w{FOa^_i^R-I<~0Vd(v&l% zr-_ZNNuo(AYfS#8QLl1uy00(C4Vzv{k0&@P`hp{}uP^-{zEEwC>q}o>+V@Yr(rCi^ zb>Feu(@U}qm=59Xy*W%ldAO1uyNF4m`o;XIRBwvxA|B)-Z&$ zb(}9Uu!Taf8&>gHwMyk1`lSOkn2c1OO#F#vEZZxsosNDVWUFL*KwtwIbGuXGbBY#X zeTdUvX!HB}?i-A(grYaxY3qHj^ApMDMg0E&#@E*}=?dTFsq@r(ws{)rM|$oXO!r9M z_dk8hb-}MpZ1XASe8Kb6)tmfd;Xx$QH#ThNVyq_(!8m(47Q2Yi;qSzUIMhpPeTyd{ zeZfnaKIP+my84k5m;pb>7wd;e6`PW5J;a?L#O>L-%u+Acol|u^E0sBRyjab(@DkaN z#niu%ycd)>J3>d@7hHMR0E581EAGv;Lnii8X2T78ab6MF2_DZdTBi`qTsp-wQr!dv zwwW!LR%gslVC<|{a+QC8laEBeYrA(Hd+zirG0z>ITF<81AK)cc5?X5tUJ|7TzQbyjk*d(XoZ(Mx;>g71s@^YW zrLqxhM6V-9dYJUH9;xgNj0z&s^cC`4GEP)#oPuS#BXS$~S+BHciZpAJ;wrB)<5i}I zzqWP%_p(Pic1GFckRyd;DVfq8v(ln4o~U#zB1XLWW{12!wD^65Zh1uUI_B@+OwshN z0KeZ0ucozzP@O}LPpsb)TI~t#OH$sg3aw3tJIqaqDwm{VuZxqx5z%*eLtmg*h~#1i zdYAvJ+oPm(z8!pBTyc+Me&+yQ*d=$>Ydedto(^(8PG#IZ--TI_L@mAB)1#GIVThZ7rwmFR(sSd0q`pJ970Na+q7o+jaT1IyPZil7AbZ z^z$ds7dyj+ESpx!+`_a}*0BZVLS4F!-D2J~hrT~Un_w3?#eSS!XgI6Kq3$ahXOCr< zi^FU*d*Jq}j*i_O_O@O2qGo$wM@P%{<}_hr%dX~@j<#JtEH5vo8B)2ubLZVH9roR= zs@1*r?VW+$%`JhJroi{mnLY)W`NxF5b#CF^N>kj$70_=Iv{hP4?r%09EJ2kzJL>32YEAI zMFWtVki1dI0A#vONEMP0)0=hdKyIPf&VHZkOrDyJ#g?#t=HAe4z!>yx(hA*3>j;3i zk@RJnHf92(@T5C1t9uNigcwV8tQ5R#c z<;^SPo#+zQg9XWuS|Mi+;0M`9d6wj9KKXC+U)J0O**YW~!kUeulHd|ud%%;R7 zQD(!AY-(kr`amZVKsVT_0ISitFbxL5`KIR+A56p+_)z@d(&2F zyz)oIjP^>S!O}>B2nOZ{GO5VK6rihrRc{hf6Cg8VLFJWn*wwrpVKoKLv~ksD+{z9X zRHV^|ipr#wy;ZPE2a#5|N_Wx9))lTY_7rj*?$?J3D~;1-ar7daD16DPg+I>4YduaJ zWz-@@Q0MB6NcIF!7wTL+es7rQu!z;DbM+axm%AJmmlmyS{YZiqwrhElFu=B>w^^{W zL+~YF$K>j>5u0Hk6Gyp%%svN_SwT^*-U7>lA`1=%A^dugWUWQ(VEufN#XP0{`fB5> zX2V7J9V{~VtJOoKX?CC?;t))!A=8fOKF(tfYGyS1U!kGHYYu-W#Wd3`#ZK#`Jh!Ii z@+@i*r{Bb$DRzo>Hc@P`UhgN350r&BtGLiISIfBOrWjf~euRfypE9#Y7w)xQpM_(p`e{~B(tx?&U(%opXR~u9x1**?53$soZPOA~q_^-gz;B@(-qVQS}jQE@q-_FD`i}iYM#j4iM zTxAyBG`48jt+Zhujf;27%KZ^_AY8Y3c~0$eT1}<){ywVm+5uhyOywBou~Cn=-FRGY W-nqTKp-b4gy=|A!(6*~BAp8&evuaxa diff --git a/test b/test index 4db960e12f3d425da2abc5e65821cb75d751c009..3c981834ff3dc6596fa3675c6fdbad741cca9f44 100755 GIT binary patch delta 1511 zcmZ9Me`s4(6vyw)kLD#!oA=tpmzUP&^_NX2qpf51RUJu&(C65!Zi|~@X)06thr$XS zMxFLa721NBa*$=9kTJoCY&HZWe+Z3CT>la5e?y!^L0Lf2s?gM`&vV{hT=2p>=YGED z+SFBTiWCBW@)gwb()I zCsr-~(}zrFRTGhur#4jVC!a{Bk|$FqbVzuEyb3ArVg4TEy!#z99Ikt(9bqTj<4Xlx z153{j`1x;vr`fYBF}*<{vl@sR zq?L&%A68oTJ#2-(w?oFEmjsoub5aT?x%C>BH~oeCIh6SC*XTC%r9%ZbCMEDrH9JTA)0I?fx#d6?cV9&Z;|5W5Tbl;L%ZRxx^zqIT;>|2{qf6vZf?gDp|! z38;xvcqJ3k5Z7T=y1)(Cm7;tZl#WH7hl?F1&%s(xCsetswBEVw#-%5e5$~Oke_k2) zR_$Lw6^hC@#3G{*j)*Xa{xtdmKAFg<_s(ym7{RPA5$dSs?Qbm)V_oCk7~UVX7|bKl z1yaMWy(`W&*hYI2#=7HJ@;ur?so4E7=NXvokx`oM2{}8Mf%VF`gEgce%fe?!w1<%M zE|!CBq&(V?GmMM$MrE9~HyVORqeplaE=FgRguN&pywzSn%ULH|21y;k^GTx3z`QDB zKAp_FYPZtZggu1)Vs$!j%$6!EjlXIm+KE$h7Q$+Hugqg5rS}5oF(~#;N{t;iQcu8k bpA2fhhGjn4KZ2LE(m#p)EwUwL;Ii{y>bs6} delta 1499 zcmZ9Me`s4(6vyw)ujZvm^Ip>K^(A$A=?^*ei{Kyrp^!qw z7Su+|pc92x4r2bA3H!tOhnV^PX+UXYV(||l3POYlRS+6b=%%pNsn2un5*xg5@ArPr zIrrXk?|tunIrrI|b%f8aKk(s+MTLpdQ^s_`99tjOrLKQTDGK`%a6YYAU8~i#T5yVA zR7znH!b)LNbV~3MzdC&SQhszHx!Q<)dhJl)%9W7)*2%B!qHB+9=5X=efNq<_MP)Y1 z3|R1}n(;p`L$AU#X4o~)9j;l?dxI%SSKl-ST=%J=de=LE9uA-TRQS~w3^n_#9{3Hd zV*|lZtIz6#`vz2)MeBB-)en!O^)Y9a*PLyfQUT2FkZn5&9}i)!Io5TRa|g?ARqQ# z!>z2oG#TW#!}Fd=cssC_N#kkebI0lH$gS=T_6Kf7`$#Z-MvdXlV@^Qhp zJPKu{%<&C~BzPH;kriHnTEyX&U5kF;<#otvDe2(%U)Iu6yZaclp@DSpjO=S^*wqXu z#$+&J22^9Rbnu)sVri-Ohg+~8!&r|;9%r^e3U zSGA07)ozS^!g&eaJUrr7SQ}Nv{I4TLSs7J@`r$+F5oWz+jSS(`byJgV6~YI^iot(Vt{ugc1 Bhywrs