From ff29079e9ad52f6c3829bf992ded904ce0dc31a3 Mon Sep 17 00:00:00 2001 From: David Zmick Date: Sat, 2 Apr 2016 16:24:50 -0500 Subject: [PATCH] added java fib code + cleaning up --- auto_parallel.Rproj | 13 ++++ paper/paper.pdf | Bin 129290 -> 129393 bytes paper/paper.tex | 3 +- project.clj | 4 + build_machine.sh => scripts/build_machine.sh | 0 scripts/run_java_suite.sh | 48 ++++++++++++ run_remote.sh => scripts/run_remote.sh | 2 + run_suite.sh => scripts/run_suite.sh | 0 scripts/run_while_away.sh | 18 +++++ .../com/dpzmick/auto_parallel_java/App.java | 72 ++++++++++++++++++ 10 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 auto_parallel.Rproj rename build_machine.sh => scripts/build_machine.sh (100%) create mode 100755 scripts/run_java_suite.sh rename run_remote.sh => scripts/run_remote.sh (97%) rename run_suite.sh => scripts/run_suite.sh (100%) create mode 100755 scripts/run_while_away.sh create mode 100644 src_java/com/dpzmick/auto_parallel_java/App.java diff --git a/auto_parallel.Rproj b/auto_parallel.Rproj new file mode 100644 index 0000000..8e3c2eb --- /dev/null +++ b/auto_parallel.Rproj @@ -0,0 +1,13 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX diff --git a/paper/paper.pdf b/paper/paper.pdf index 88df1a164092c26d341a00a98007622a998bcb09..cc552b8c879f338a787af15bd86b6308ee9d5605 100644 GIT binary patch delta 13191 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 delta 13110 zcmai)Q*b2=u&ra;wr$(CZQI^4C$>3BCeDNt+qRP(+vfeN&aLx$s`_y~^~<-q*Sfoh zj=hIYq6BASCrJg8Qv;UqC*2N4?s|;-bN|G~3?o?GHZaGmdf6GaTu@}BR*ea%U{J8i z$Fhmk)*PNJ&Sryxy0yqowD2ZD9Ip#*FFGGLs$Icnm*Hgz2hJe-vO~Kys%mm|iKwz7}?$-71J6Bop`u2yQ zbw=)7ucqs^t%jb1UG3a$VWN)b%aey25HN0bD*LWBn2^CeS``4Pi2P7dZq2A2a_<-9t zBq4s^YhY?Wpdw-xGl0lta9$J)LNj)7VBn1xo<&2^Y9hy!WgWLK?c`zAdG^Om>+s>G z_xo=7?c!#a4J|@8sgIfm+}u=ga?#ikrY?f{0g-ciaJ3hs z*4w%@dop}lEvbt%d@6u;c41dg=Eu;DguCl8!RX8t0Kl&Zkgi_y`~IFrqi^uH<95PUyo%O7aoac@0v-UwzR4TKp&s^wUcc&j{+TKT6 z>lnS3=Oxkol*8IwWafOjm#g@z=FrhfZQv#v)~M1R{AH*%=W0T{-QJHR&@8Fn{kV$ze;D^!ZBFshPenbXa>Pb%x9SNNlAUP?ev-r*4Ol;k@V^__~ zaQ`^PRD!!}4`D4w|Kk>LoErHn9v50&SI*4pAcDXjGyUPxH>JoDu;T^d3VaAYC+xjG z(uCFY2^w8Kvf9@<-JBVyi?d&pEmT*v0x1^u6Q(rqzT$ zLJP8&5o$9;2E?CxPyNO8R*X7l=Tjws%b}*iq!tQ=j1q|So}OFUY7N+G1kP|~xg)Fq z0(K4}fjX|hSyv?XJ0(ezHA}{Oc@yl(3Ttoc4Ohz3jeifLNRYAfRF0J%*#8CJah=B#OJjwi16AhoiVCMQxHxC=AVdU|Phew<8&;?Q1z@ z>xlZ!(A}$lDBZx(Ovt->spv2u5j^{WWT4@QRn9JnmtxwJe}n;bi|6G|Yai%j+P zmS6MON#S=ZdTm5LP-oBAM<3}nyDNz%M0L_gr+7`Z@eX?ZFIkU!Q8OPIFl?+?aBky7 zlY$9U^9_bXAvs%gpdo4ZKvmE+vw%+_ZwY!!60L4EF0dj4W6GNCSNJd>^`Y9nXN;ioPg7q{r}F;@#y!wH0Gk+AZSrN8&oxh!O5*rH)I3Rr2_yqtvx zmE6R1z>0=uj9e9m?pdyG^0F^E(&TyxQ=j6%4Oq|i)_hZ;iYr!tjP?}P_#<~ePspN= znMzuRi;61D7-q23y#X0u*mB`XeBk3_Y46Hcq`5QuT2brR%SV7NWaSb$dSCpV%O!%3 z6iR2mA5v#QR$2W-9>bogWLX66eAMi$8i~F(eIO7Y^zBzaqMV@Yc!u*`}s(~*^`KjUx6q774tuA z*HZjOdAhfroPlclddlq2RZ*{7A|Q=}To z1A~oV%ZB3Z!6YP*Z!_daXoFJgrVg&so(Jec&>qCLBw*(E!4Igjioxo&2Nc zVF7(j-!M<*^YD3vlzB~ckp8ML#3d*_2`RTTg-6UQ?i~Q%FgACQ*>=QfgL8Y3a{;vv zAT;&AT=@&QQ4I^OF=vtaD84$!jr^^1I8!);jyUPr%zbnpS*;w2%|vU1MlS%7dC?av z*uJs$rtTDA^2-4(y|;KYR=^+&)SP=`O?nm)oJW$VNVkdy*$v8nRggPB$z+XjD~jEQ z@Tj)M0d3mx?kBlwQsW-W%qZn%>2IGP&`!rc2W4CKFh0mg}8=opU^3- zQlm<5tRzwiwJ32yy=`ksPK>GCC+R;ra~Hq(b##Qhzyn~Q;iS_tC9|C%#3e5F)0TKL zKt$wM)PdpzsD*{NhQr0p-WW{YWITGy{mSYby5)Rtvg_g;!+k#zj0-Kjl@aUntx92l z$98~xl4B?Bl^cn^i4tDKmFDm8yg}|0<{)3wJ=VhPZ05gJf2>;@bYX{d9E}Y=^JeRc zkmn{uglC9s5524uQcW|+3LUM4yI$E(f}w(fy|W`gS2A>+y8Xb+<901akT1XVySG04 z|EU;vh1X{e*qGHv$Gg$SV5TE%X5OAvM1MkSIi29j!`F=69#)!F~b zv}U@gwq4!{L|I%PB)^IkWk=Ge+rZd_-gaDtLXhCx?c1fTC%ydSJv{d!dNYPKi#r24 z{Qpcz#==WXXc)QWRn%P8Kp4d8xzM_E>vL!x$I6uoFctRtg&Bzo0lo&co!|caIgbD} z=4ZxQ!FVc>eeyVfoUHE!d_fjQGFxF@rs5~mSowMGcTew+F& z^YsN;mD%uPuKOl4Q9VQXy*Y;zeM|+CAF}OqVRD2doQ`JzGc2!(mtyrr!{Fc zF>@FaYL*0ht0Q!m!Ji-nDGvFSQ2+e&frl9u=FDc1Cni?!q3thKkC#cp)>u6`gvr5D zMQ1A)TVG6tD@b!SIzi?Eg}pRQ5KW*+#zYdU&TQ~vzj1HzN+cVo5@V23FJ%CymQlYi zQb8iwJz0{c_M%;v8()S7xoWfMZyC;L5v+n~Y0C&oYhgZ>QK-S-J;zOy|3W!DSNIyl zgRB=rS_I0xIO!Lxwrz6!ZC#yGmw^i>q)K783n3ya_^4r%LKTjvan;>{*b%WuI>jWX zKIG7AU_0+3U>_hdAL8W;M56<23zR+U&2ERBylE~f-pY(HN17N60&`mM+-=`QGep@5 zM+sx39%(8Y?YLL^#JPW2+Mg=7?_JTO}Zh!~uywf==KD}n>SnrWp%p6Ex= z-N$I5{XNLcGJ^HRdT_&-a$Gj=4oRN42F7Xc(+P*=HeL8bQ^V0y|*urzF<`+C7pg z3qVzSWj7s-E*iVflIj6KTl>_;&m%27&+(xq5(3j)EwR|FBJN46?dL}heHLmMpot-u z9)A^d}Y$Lf^^ zQ~?d};|Ed4Y{eAPBFYbqK*e?2k&o$3V zqA%gw`LHKYqjh3MXyi-ugT!b2+P7=CV52P^LY*WxP#pwtHul@Uas5#nM616^@v{=R zdDx3I`GH8EsDT+Vp9Qg}Ne#|&AvVzR|1kjh#;7Ex?5_anAv2-hz_Ko??5MT$dh09x(uw7~QX)q!e! z3W+k4?xc-seqOvik!Giag7_v@A>YEK(FC(i+Yt*nFH@7cU*7h=T+%gFG4nL=NN~?d zc$g9yFdvom1g;vcv*iLYk^50o+b)vIW1mQQ!jxQ_4)3X4I3&fAGu5@x(d5?E?^7F# zjN_33wB-pig7J#wu88oK!bj2L+{=5(zuM*ZW#^WdX*Z^sWx4$JA@EHGM}*|5v`Emw zb)g7G-S7egtRq!J!{Hq@mCD@cnE-mmwr7Dcyy9WYWsYiyu~)PQt7ETNYXS5_MX1Fa zrnqs&je#ng#tCZfYg}DV9c$ab&lr{dJDVZE$(=G3A@+7z@T=SeblC8`yKQ2$GT|;- zrp&TZrAT+IrHJ?Enmt*_JHWTkPqy}aI0(UiQT*?z#kHV>a`}V?i;2o{aVWIt>6>;* zyYeR%#V{Ap!8paV4I#Oh0-K=)Jc2lusgIX2>KsawIFB+?lQ|nUVM&4j-9)2k$;$$; zIRAt+Zsjd7h5>g24N7mlSecN46IJG{7KV$42%F>_^G*u5N{JqovVZ2#;i&0Gb)_s; z4^TcYR?`_d@|$~+zn>-4{YB@_MI3vf^XU!_={Yg*#U+}r%v^rpQWG?PDJt*5IJZ50 z_7E~QA`MM}l=UUAa{)k2mti95shR`G+O3VShJYiDCrZ%?t4E|EWY<5 ze-R{tgfPRz5ypUcvW}Qjf<3lkej_BXd+anlA^;1-1_i&yeGqx-*UpJ38!ktlv%ylC(#A=XTBm3;?He?YQ#RUCqtcxxy{aU%V0OJB; zieFZ}3ZHGP&&WT5XtDX5-)R$>VtpkHC5y2DFQ<=JX47)CuVg(Ky^f(_Wf$gKGq_)s%lZmRg(~)sa#Tq%&8?r-g{{i++ck-nz}LU3Czkb=>t64( z5*&QA#XYicgwVW4suTA`FYRyi;D;8YWDIyxwvbPiScka}*gsHIc9*uP$Y?a+tUUko z*g4`~ciLJ>xp|8n=`!FNDfvg>1bU6&FzR;cy5FbfLYyKnho*nrj*YnPsOudRWG4up zTT3J5f@(rUkz!q|u37P{gvA|aad)08Q83Hg>+4rg5y$5=vB1Ej9mf_|{Z~grm(bd` zslChS6RmrVarQ4=hf%p|o4{l$hu+KWH^4S~d7~lfCh>MP@w3}DQx|>vVHAtcOP)ZY zkg*GiMMZ0}gg<-Bad6n;s=D;bGc&P$9CU+Q-bf3p9XPyj>hQLClsk+|RIiu!Th?JB zZFULqD#iQU1xU@(SXGLA>xUv!O>us7rld~$dh2}IP6|RSb%W`3+F4Tiu_sQh2sqY; zw*^6Fd@%i6!LLjv4NSevAR2+fab|PH+9E}`;0)Rm<@4>I z$A3HRX%1c2C)kYN`X#Q_B_rZ-s<%mwzzWJ2_98E;q-xR3Wa_@nI@350osW0xFUUr8 z=Pv*w(-yqSwt?s`Mg5GL;tabR4$ze1JGegI!53FCf^Gj&iX5U|KN{8pp(*_t`GV#N z9S3DGLfA>QX~E}0fD1B&72f{{$vNBNv86xR@!&Hc`Qns~4_-ihnho^fB~py|sB3c^I((CF&-OQh~OTnnrNT8&f5fV{3L3@PnX z*pFOW3{;Fa#(_<*l%6$h7<}uRmFJm8=f;FW*sUTXlqG{*E z(I6T^5+(S&-zXRH~y*fuvJB1=jl zQ#O{A88S#KBXsyxbQ3!9n3hD{Sdb9l*Gpg_sAXkKP?d5NAcFkVc@Qic!?K(?+l?!r z@gK?fLOv-sdc(yCfNRgp2~rJi9dCO!YAc8aF?+Pq4bu4Uk??`mjN==WXnrTv1>lD` z+d4%A8GKX_MUhGNtk>v(b-M_^ljQbu*)NdM->mZy4X7;9;|%cAd1o>a){2g`jr1Bo zU3JM4fe2n9);S(EUT2l^f5nkS^#`-)5RLM%sxF<~+|vVO0IY~Qh9p$DnPa69uc`93 zcN~wjn0HL!>;SW({e6e`K z-N>41{woymjN6;v-KqfhEToiqzs0s6>T`tBmgw zxTM#e_oEz|gtz0bq;4J!Oip(jtbtIrXVtc0wVuKS`0_qQCvo;ww(hGB6JNU~ZRYEr zMZ%-&Ni7Sl{TaoDVm)IF53v#Ax5Z55=XXM(I~?eSA$`3yB={uqKdNup16!JFY=blr z(nc;_{-7%T(g!JYFMw>FWqY_A?rA-xfUdOxbH;CGDvsm)mxK&Gom|f}j@TM7L@vFY zamY9T2&FI|Yh})h9a$CKCRks`Bl=5hdLl*pmsb)s#W9RVMAOdqP$Amr8v5)m!9Nfx z%6IV~*87*S}1&Tme6K^$ijbsP=2u;GztTe zFHd!}1y!FZu8EQ%IrwHZGzzTw)s6qQs}E@j(3#UO#`Z)_kuS5)@$N=1#vmOB#Z2lI zD5exrJ=PWW67SFn);6Dgu;%|)lAl{TPJ!A*7n2SX%pSRFIh8qT4&og`a*DE5eyg8D6 zz!0E-tW#%}JTAP-ta<|3sNq@kpNWFw{Muhva7U%jW;4oxhSjao+SSkXd-LvxSG1lp zIj5ug7e1{G)|il~LUB>ayCh5)u>vjz%9@fkB0z@DACP)FP+7k|Z|3_DDN9bs*?0PR z2wy8OqA<}~121PwO#1AGP_%EQbl$f^AI||#SUfR$F#m9W@kk^ih(w#fHGhJcu4g? z{>eO*6hZ zNvd9b-V#1>Y)iCTiOM8JWWJ?3H56W*j&!t*e&SZgOL=7mrTS2lP{V9$kdw{DzwW;sUNP-CQQ$J0M9nCR2R=R zp&7hK-gJ!JiIj)Etn26~|0BIw&5#FYubIBl8=<+cK6Ug-oXkEEsDylm^vM}f532wc zNcIq81{{`N`wHCkoZrzp;#{h36HjX%;NJS!rP-W!w-P@Zqb0!hZ9S%E3%|)egl&V2 z>xp}Hd;N(FmjZ7IWz#rvtaFa<*c~pi*OB=R<`FU+vBK2#}D3Szx4@S6F8>D!R(WQLP zI)=!!keGJxU+GhZ6p6d(Sj?156MDk76*cc}AIywmDX- zb|@*A;hl3j9((AM+o1(hrn#7$e_F8rACQQ$fW7_D&$@{%5wtY!@7Tcr$4r{jHYAPO z!Dfr-S6Fdn-u*bWu$?g{sORlR|2eB%vV3qOQ|_rQP93JoJ&CymwqWjTexbsPDR6*e zd$d-=9(pzeV34XMSU1b{K;0yrX*NVz=|x6br0vg$k$2eUvSGx`E&0^~0>Q)lOE%{BT4y)}D`a+zdm zO^#(sI(AbwS{;77YZqd@E})_sx|Oo3g|lyRa)Hd05R@gZem2~dN{cXB5#C~$pS*o4 z;p9>;3g--9Ea6xmCzx(W{brzt`@wni{)#0Qmjrzf>PVgd!%XCPR>GwBQfe;0tr|a~ zK}H_|1ZxP6^2{L-?kPKa<$T#1B*-w&>6Ixsd9o$)32~q_fMVV+>`?MjIZ!qCYr~J6 znk2K7XmEbc_NzO)gRY?SOsXSWqcM)F_c9nj`M~AjbLV&rCw3!}nJu8j=Qs299JV(& zU+yXN+TeU}vdHCcXa0jxl$2BTBcn${+!7TtFEM^DP2si)w%0;;q6YFgRE_m{(?H%Js{Tq#th zGHGhx&GHWbj+c6ImDR& z@)r=^SwT&n9Ix-eNGx@JyY!)FTWC3*6uyd;L;-@F?&Vjmo~Xv~6jwi0Jp!IAscMpk z>aYIPbyI(m+%iVvFSAF{RD!B-pJ-!Ar1X?ynL zdQz)?Kll45ZSp8&nb__JaD*@W+lkD8o$r9V_wB@{1G%=Hx5*cf-O0EpG>&M+;J+8lj8dg2rGttQcl;6tR!Blbo*UbL+cwohyKwP?HxS%U5e}OJ9yoA&aFGZ6Ljsy z@chuY+!cqNTXPOLfdjrOei4oFPjQ_;Atwa?;Pf?G7d+VX&U}#qd zUNWz)ku##A5??FTkjF`^s*7d7JtsYlUAr`Ntx|5Y;m=Sc#}V#muPn3W>U+(4Do zhFki%3$$2`78GD+r+y#j>5<%+Em-VdFbqY&m;F2hy0KGmp08f$=4p2rq(A+<2C@Et-JuPp-<+ffsBj_ z2AWc=B1fUoH7i#p@MrxjbtTx%uqH2lNQIJwt2iR+0cyWU9Pva%xzM2%$m4wjI}fvD z5CIW;8x%qViy**djLnRC>Qk-!Fwy_&%oG( z-Um9w-##l;V`|rIon*j+6wJpzOO9T$UBw{p)|O>4b&m>HxA1F*S~K4T)1d|JcVyIw>1ndbWZJnybQQ_dLpA)`nZ{_rEi@1F6wL2l`J z|7O0{{l@->nDhw!R-4z?dXy~Wa56dZHDTqy4FwbsT(Og?G`^Imy1d~jhyIwzVQ%B* z(pJdAE?{j~^o#j}s;Vi=v$=ediL5F(5{(sTsNKfB= zljm>HYJJ~9S*zHVbA_6|C4cS^dkptzBm27Sn`pAFKDzFb%7Vh*-k@G6nb;IY>7Jz? zhjf`xlhV5<$ap8U6j-ZltSMG=U5gzyS{)VzJ1R>HG)ByFJVnFFVq+T@hI;}Vjt!+~(g!|k27+6j z9&8dUtvkq)yQIoSpWQ5CjXB55-w=*cDoREkso#g1GzON#hO)$NNfL%ALO|A(Oq&=r z0>bsm4~9raot>eIkO$^>8>O?cHzLYK?-B;jB8mr(fwqK%<`Y#N1t$wo`HlPdTTmi4 zawr}=2~QL)`80{n%#0Bb;Rd_756m1861%h8dWT~ zAl#~q2KifbFLs=)4s;0g0Nh2?1ihal)ES~~uSg~uqlg6cktE5CRk*xag&SUlWNDfV z1JZMlxkwbAQ--vdZc7#bnopCZE_S8_X{U3HP(vLdJ{T2(QQ-Th5*m*^_Eki>pesf| zkw+jDD-_HL)*C)!iWUeWq(&}+QYkaASQ6SuvBl&EJ~M$rwV$m`-1}jj0fdpmJYY)VBO<> zeC$FC6DnbQdiE#;&bFdeD||ZfR8_w*T1+w%T2A_K)leVpLpN8IGWJfN6Qf)x1Q;0w zf1CM2Z$-NG<|WkCMLn(FJ>DzrbU=O;8!%XJzU3%*8q8#-4hQh(PkTTwdvNH^%)3L^ z+WQ)%ao%Qd%L)U?D`C8*UaRl+e?=R2;oPR)G^O0V3{JZBvCfv{F&(>Tk`cIo)MRk_ z%%3X?-b_5)x%9q|2*G>s_|R?LJAgoCd4%LDv~uTb?LB0J;V8yXCNT*ai}g^L!5N>C zJxCtON7^a&STJ$9H)h988#o-BvHhN$GO#*kYijDxX@CW61p{<~bjv>44$f9Vck9m| z{wkS`vwuet--B-j&*Gk$Hk%Z7Gh(d3l&G3ALS}`UMYlw#5=r|Ivh!`orIG?nns4;@&O1KYFBV@U^1W=WM$X|TqKlm zQSG5~MkD~TZMdUpNliu;{q>p*>H$T!f z%oa2?K_FZP7gnemIV4P)F`qt2GFQnQmqXNFZb3kO)X9-LnQP-5JpqgxXv_$52!Zy= zlNQRRRr+?#3N{pP@<3HfnrH<{3CE?`lP=>hlarP>UPsDUrA``dIqg^;6qYFX-~6#JXAZVz;Q9`BnW0c8 z(F_qXr;iUvQLK(k8L|pT(JuNqoUNE{8!w8UjO?V}w@+4q8P?x38hCnGF9?S>8fKiC zx}Mbl)tM8^FPC7ZvaCqWUv3d8&jY1Y5!Hb6Q?Dp#B(nG;HQSHNKVZF*LS!n+qzxD; z=X4O5Cx2Xqzpn0{%>rb#(v-1xYeYAorfm!u7j*2C+hD8k4NaRjiGVv9;$?FCXV0SX zIL@lya)027|GY{khq+be~^|Ip1ias=ornEu?CU$tq7aXTt|a<+hm_10ITR*9uae11)8|0+z| z#mbEsm%_xlvckk7)`=Kq5D&26ZN3J~z`a@cbsy4pHz}x2pb&0>ys+&Y%_wIbNg2-3 zW6J@-o^3V+lcrT1GtgpcQKm*>V~-NmS7c z=9ks(@{`8GtnNgtyn}qZa_gnF0ij*^H>jevVzi2IVEw4|&{6(OJN?C#5cdN}|3hbd zp0M#+43m@0?&UVdG>Ptqw*+_99Vr4h9?7(5^iQu>XyrcGC8`6UU&?X*jhg6dPygFZwSE8k zYW!zxs=vfQlCuV-XH1G{T}wj7%N!`1gtDtADtPt>UWRUtYF<&oQ_@Oo0gmWJz#O-B zW=%`8RL(wie}VU<$YkiVA0^gAHeI#dfva|FOqA-cAFt92uCe(j0g`q#Mif}iiUQ{4nsAxYybj1|$=E#0!^*V$A%`y0 z)akjkUExe+}#wMIX*k zI<1Rs7v~q|b(%wvFb)yh3Kw&x>ErlnESl5! znbQw$S|2+LKyX*%8y@S&!k@p4Ac;sF%2?00ymgoQX zlxV;|4Av?rP?;J$r|x3Ecxr4CqdwxA0qpkZ&w z#ClT=wDMP!HEQ*eXDsxN+F2|>1`(;gp6l0BJwBmHcF~DdTG!Z4We{=VZl+Hx_Vk{` zOw$5Ix)?qe0W1MZ^g*wxWU685hd+{#^aLg39W#X>a~0%Y7!8|p-UBEC4X@Z0<#(eH zD8`VorgtqCQ=IC*zMT{nkrX=vcj7@+w*50iVDEY{(|+(pdmE*(Gw|_0Pft(J$OHZ7 zMqS=Hb`pWyT}j_%^FIFQ)v4$nMluI@9Zm*|RL+jR>Hq+IDAIduQZVOE=b1(zP~*Kc zdg24ME+73lVa2x7b^Pr*t#UiW#@eq);$m{5hSb@6@L7&y>Ds0%1n#mrA_&DPnbH`tE zhqHXFfCPj)`w2I26VFegV2k>)`{ zr*&F}!4c9fv-c^NcMjDLl=)YV+;Q~?3NTn5b+^@vZ(mc7&IpW1B9np4{DfPuUY9-h z^%b0f)4M(D=z15rFZd4l3@SVn^lHmBj+yyYJu&w^+#s{-2HT z_%j?oXLIPUQrnzz`C0*8^EBaC;z_pxp~KI{8myzYOxY3#XExW4$>}FbUgn>nsfW9^ zl@5H;b7nZT&)v2)zMavPUV@&tr&n}`K)3ekwN}HfN9KVj{7&rZ|1O<><7@T&0Q1y8 z<8v1Ks_0Yh4EE%{*u(rs0lj~4JnKom?;o#5OUc!y#<7Om2?ml|#nFMqqyd?nBImFF z)CXK#+p4KwzRh{_l5)=7V1D#??^oluZl>XXl2_416kaDJ5*~LuS4Iq z10xH+f(92eKI=WtZd!il1qlf92%gCU42+oCWSvRmihB9r$IZT-7G#)Le`j7STsU@C zT*20R{I~PZHY(?dkQ9RBoS%P8=iOYX%F@KbSA-lTMB1y;ngJhqJxPwqfE7~BC8^^o zwvHAT@|6|L?Yc5d*Xr7j`4Pu$1EY$oqf94%TkcHLTp=(1n{WZr`hqT%bBu~r?eR9x z{B3%go9=+XfX9o-nd@7Wg>1OmnR`GhUjAD{IeRBoT-j#7_%F=1KbH-vi&0kg)A;9d zvWi3Fo0iO)vYQ)(e`0$m0dha)d{r}}i}EJK#?62t%ffiu&*p4;<$eVj1NZMJ+ItIF zjnK^JB?xkJC6rW@xmm@`zJj)UI4q3|90s^={I~*S-Cx}M!*nwsox0&Le#x@s}GRtF}Nz-gk0Qf&rqMMqIYlmb_L%UfNK05 z&X0IIEBBx#-d@Ap!cZ6P-mag|i{;_t!)qmA?e(-HG0BJCc`vVbJ8Rn}SDW3*H!?n0 zd`f2F9cT^%I~yAtI|mO32O|q7H46(hEgZ9=vxS7Ihb0M(1Rom2j!h0;UhRmL}B=W++16p+Xs>hz?RB2jM)-9_>Pp=YHJUItn-I9laJtG!kR=hu zB~d{R5poVub_i04+BvAJxq338Ts>%R6P^ShPp%$y43NkFD96HFZUFOffb#KfshkT@ zy#Z{p0V1veq=^OAodq161?B-o>(2jbixj80o6!Sv#e~qz1r)yl)^#n^QKm0Jjz!Pz z%S#i@Rou(E4Qhfm`TQJ+r@v4VlHno2xFN#kahA-_sUiXs0`(3UQr z_E!)Y?>FhF7NNeU!*Zj_s2CxqI2K? diff --git a/paper/paper.tex b/paper/paper.tex index cbac691..d7045b7 100644 --- a/paper/paper.tex +++ b/paper/paper.tex @@ -45,7 +45,8 @@ \section{Introduction} % even if it is expressed in control flow, it is still data parallelism probably Using Clojure's macro system, we have implemented a set of macros which allow developers to take advantage of Clojure's parallelism potential when their existing code is written such that parallelism is exposed through control flow. -We have shown that it is possible to attain noticeable degrees of parallelism with minimal code changes (with respect to serial code), without the need for sophisticated dependency analysis often required in other parallelism systems. +We have shown that it is possible to attain reasonable degrees of parallelism with minimal code changes (with respect to serial code). +These transformation can be applied to idiomatic Clojure code without the need for sophisticated dependency analysis often required in other parallelism systems. % indicate that we cooperate with STM and other clojure constructs % the other existing libraries are also a testament to this statement diff --git a/project.clj b/project.clj index 0671477..c8ce8ab 100644 --- a/project.clj +++ b/project.clj @@ -2,6 +2,7 @@ :dependencies [[org.clojure/tools.trace "0.7.9"] [org.clojure/clojure "1.8.0"] + [com.google.caliper/caliper "0.5-rc1"] [criterium "0.4.3"]] :main ^:skip-aot com.dpzmick.parallel-macros @@ -13,8 +14,11 @@ :jvm-opts ["-server"]}} :aliases {"benchmark" ["with-profile" "benchmark" "run" "-m" "benchmark.core"] + "jbenchmark" ["with-profile" "benchmark" "run" "-m" "com.dpzmick.auto_parallel_java.App"] "slamhound" ["run" "-m" "slam.hound"]} :jvm-opts ["-server"] + :java-source-paths ["src_java/"] + :plugins [[lein-cloverage "1.0.2"]]) diff --git a/build_machine.sh b/scripts/build_machine.sh similarity index 100% rename from build_machine.sh rename to scripts/build_machine.sh diff --git a/scripts/run_java_suite.sh b/scripts/run_java_suite.sh new file mode 100755 index 0000000..0dbc172 --- /dev/null +++ b/scripts/run_java_suite.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# TODO log cpu usage +# TODO log git commit hash + +display_usage() { + echo -e "usage $0 output_dir" + echo -e "where" + echo -e "\toutput_dir - directory to dump results to" +} + +if [ $# -lt 1 ] +then + display_usage + exit 1 +fi + +# first, load the environment needed for benchmarks +# the set -a thing is to force them to export +set -a +source ./env +set +a + +output_dir=$1 +output_dir=$output_dir/$(date +"%s")-$(hostname) +log_file=$output_dir/log + +echo "Running -- writing into $output_dir" + +# make a new directory for this run +mkdir -p $output_dir +cp env $output_dir/env +touch $output_dir/is_java + +echo "run starting" | tee $log_file +date +"%m-%d-%y %H:%m:%S" | tee -a $log_file +date +"%s" | tee -a $log_file + +echo | tee -a $log_file + +lein javac | tee -a $log_file + +cat /proc/cpuinfo | tee -a $log_file + +# run the spec and do the output +lein jbenchmark | tee $log_file.bench + +echo "finished test" >> $log_file diff --git a/run_remote.sh b/scripts/run_remote.sh similarity index 97% rename from run_remote.sh rename to scripts/run_remote.sh index 45b724a..5bf116a 100755 --- a/run_remote.sh +++ b/scripts/run_remote.sh @@ -1,5 +1,7 @@ #!/bin/bash +# should never be run from the scripts directory + display_usage() { echo -e "usage $0 num_cpus num_boxes local_out specs" echo -e "where" diff --git a/run_suite.sh b/scripts/run_suite.sh similarity index 100% rename from run_suite.sh rename to scripts/run_suite.sh diff --git a/scripts/run_while_away.sh b/scripts/run_while_away.sh new file mode 100755 index 0000000..5319203 --- /dev/null +++ b/scripts/run_while_away.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +./run_remote.sh 1 23 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 2 12 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 4 6 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 6 4 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 1 23 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 2 12 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 4 6 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 6 4 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 1 23 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 2 12 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 4 6 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 6 4 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 1 23 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 2 12 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 4 6 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} +./run_remote.sh 6 4 out-tmp benchmark_specs/fib/big/{serial.csv,parfun.csv} diff --git a/src_java/com/dpzmick/auto_parallel_java/App.java b/src_java/com/dpzmick/auto_parallel_java/App.java new file mode 100644 index 0000000..4e0d8f9 --- /dev/null +++ b/src_java/com/dpzmick/auto_parallel_java/App.java @@ -0,0 +1,72 @@ +package com.dpzmick.auto_parallel_java; + +import java.util.concurrent.RecursiveTask; +import java.util.concurrent.ForkJoinPool; + +import com.google.caliper.Runner; +import com.google.caliper.SimpleBenchmark; + +class FibTask extends RecursiveTask { + private int grain_; + private int n_; + + public FibTask(int n, int grain) { + grain_ = grain; + n_ = n; + } + + static Integer serialCompute(int n) { + if (n == 0 || n == 1) + return 1; + + return serialCompute(n - 1) + serialCompute(n - 2); + } + + @Override + public Integer compute() { + if (n_ == 0 || n_ == 1) { + return 1; + } + + if (n_ <= grain_) { + return serialCompute(n_); + } + + FibTask f1 = new FibTask(n_ - 1, grain_); + FibTask f2 = new FibTask(n_ - 2, grain_); + f1.fork(); + return f1.join() + f2.compute(); + } +} + + +public class App { + public static class Benchmark extends SimpleBenchmark { + private int n; + + @Override + protected void setUp() throws Exception { + n = Integer.parseInt(System.getenv("BIG_FIB")); + } + + public void timeFibFJ(int reps) { + for (int i = 0; i < reps; i++) { + ForkJoinPool pool = new ForkJoinPool(); + FibTask f = new FibTask(n, 31); + Integer res = pool.invoke(f); + System.out.println(res); + } + } + + public void timeFibSerial(int reps) { + for (int i = 0; i < reps; i++) { + System.out.println(FibTask.serialCompute(n)); + } + } + + } + + public static void main(String[] args) { + Runner.main(Benchmark.class, new String[0]); + } +}