From fa9f5739403cb7842fddd781d70c207071a0c39c Mon Sep 17 00:00:00 2001 From: Pedro Gonnet <pedro.gonnet@durham.ac.uk> Date: Thu, 20 Nov 2014 21:54:40 +0000 Subject: [PATCH] yet another iteration, fixed the BH_times figure, formatted the code correctly. --- paper/figures/BH_scaling.eps | 335 +++++++++++++++++++-------------- paper/figures/BH_scaling.pdf | Bin 8427 -> 9660 bytes paper/figures/BH_times.eps | 351 +++++++++++++++++------------------ paper/figures/BH_times.pdf | Bin 8940 -> 8723 bytes paper/paper.tex | 201 ++++++++++---------- 5 files changed, 473 insertions(+), 414 deletions(-) diff --git a/paper/figures/BH_scaling.eps b/paper/figures/BH_scaling.eps index f1d5062..171d0dc 100644 --- a/paper/figures/BH_scaling.eps +++ b/paper/figures/BH_scaling.eps @@ -1,12 +1,12 @@ %!PS-Adobe-3.0 EPSF-3.0 -%%Creator: MATLAB, The MathWorks, Inc. Version 8.0.0.783 (R2012b). Operating System: Linux 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64. +%%Creator: MATLAB, The MathWorks, Inc. Version 8.3.0.532 (R2014a). Operating System: Linux 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64. %%Title: figures/BH_scaling.eps -%%CreationDate: 11/05/2013 22:51:51 +%%CreationDate: 10/27/2014 10:44:42 %%DocumentNeededFonts: Helvetica %%DocumentProcessColors: Cyan Magenta Yellow Black %%LanguageLevel: 2 %%Pages: 1 -%%BoundingBox: 25 16 788 297 +%%BoundingBox: 29 20 872 325 %%EndComments %%BeginProlog @@ -161,7 +161,7 @@ end %%Page: 1 1 %%BeginPageSetup -%%PageBoundingBox: 25 16 788 297 +%%PageBoundingBox: 29 20 872 325 MathWorks begin bpage %%EndPageSetup @@ -170,9 +170,9 @@ bpage bplot /dpi2point 12 def -portraitMode 0192 3636 csm +portraitMode 0216 4008 csm - 114 65 9156 3375 rc + 143 101 10108 3660 rc 85 dict begin %Colortable dictionary /c0 { 0.000000 0.000000 0.000000 sr} bdef /c1 { 1.000000 1.000000 1.000000 sr} bdef @@ -185,213 +185,278 @@ portraitMode 0192 3636 csm c0 1 j 1 sg - 0 0 9404 3445 rf + 0 0 10369 3802 rf 6 w -0 2756 2821 0 0 -2756 282 3100 4 MP +0 3041 3111 0 0 -3041 310 3421 4 MP PP --2821 0 0 2756 2821 0 0 -2756 282 3100 5 MP stroke +-3111 0 0 3041 3111 0 0 -3041 310 3421 5 MP stroke 4 w DO SO 6 w 0 sg - 282 3100 mt 3103 3100 L - 282 344 mt 3103 344 L - 282 3100 mt 282 344 L -3103 3100 mt 3103 344 L - 282 3100 mt 3103 3100 L - 282 3100 mt 282 344 L - 685 3100 mt 685 3071 L - 685 344 mt 685 372 L + 310 3421 mt 3421 3421 L + 310 380 mt 3421 380 L + 310 3421 mt 310 380 L +3421 3421 mt 3421 380 L + 310 3421 mt 3421 3421 L + 310 3421 mt 310 380 L + 755 3421 mt 755 3389 L + 755 380 mt 755 411 L %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 120 FMSR - 619 3245 mt + 689 3566 mt (10) s -1132 3100 mt 1132 3071 L -1132 344 mt 1132 372 L -1066 3245 mt +1248 3421 mt 1248 3389 L +1248 380 mt 1248 411 L +1182 3566 mt (20) s -1580 3100 mt 1580 3071 L -1580 344 mt 1580 372 L -1514 3245 mt +1742 3421 mt 1742 3389 L +1742 380 mt 1742 411 L +1676 3566 mt (30) s -2028 3100 mt 2028 3071 L -2028 344 mt 2028 372 L -1962 3245 mt +2236 3421 mt 2236 3389 L +2236 380 mt 2236 411 L +2170 3566 mt (40) s -2476 3100 mt 2476 3071 L -2476 344 mt 2476 372 L -2410 3245 mt +2729 3421 mt 2729 3389 L +2729 380 mt 2729 411 L +2663 3566 mt (50) s -2923 3100 mt 2923 3071 L -2923 344 mt 2923 372 L -2857 3245 mt +3223 3421 mt 3223 3389 L +3223 380 mt 3223 411 L +3157 3566 mt (60) s - 282 2706 mt 310 2706 L -3103 2706 mt 3074 2706 L - 114 2750 mt + 310 2986 mt 342 2986 L +3421 2986 mt 3389 2986 L + 143 3030 mt (10) s - 282 2268 mt 310 2268 L -3103 2268 mt 3074 2268 L - 114 2312 mt + 310 2503 mt 342 2503 L +3421 2503 mt 3389 2503 L + 143 2547 mt (20) s - 282 1831 mt 310 1831 L -3103 1831 mt 3074 1831 L - 114 1875 mt + 310 2021 mt 342 2021 L +3421 2021 mt 3389 2021 L + 143 2065 mt (30) s - 282 1393 mt 310 1393 L -3103 1393 mt 3074 1393 L - 114 1437 mt + 310 1538 mt 342 1538 L +3421 1538 mt 3389 1538 L + 143 1582 mt (40) s - 282 956 mt 310 956 L -3103 956 mt 3074 956 L - 114 1000 mt + 310 1055 mt 342 1055 L +3421 1055 mt 3389 1055 L + 143 1099 mt (50) s - 282 518 mt 310 518 L -3103 518 mt 3074 518 L - 114 562 mt + 310 573 mt 342 573 L +3421 573 mt 3389 573 L + 143 617 mt (60) s - 282 3100 mt 3103 3100 L - 282 344 mt 3103 344 L - 282 3100 mt 282 344 L -3103 3100 mt 3103 344 L -gs 282 344 2822 2757 rc + 310 3421 mt 3421 3421 L + 310 380 mt 3421 380 L + 310 3421 mt 310 380 L +3421 3421 mt 3421 380 L +gs 311 380 3111 3042 rc 24 w -45 37 45 -8 45 7 45 -11 44 -5 45 -11 45 5 45 -41 -44 -12 45 14 45 -14 45 -8 45 0 44 -14 45 -31 45 -4 -45 8 44 -33 45 -14 45 -8 45 -18 45 -22 44 2 45 -19 -45 -49 45 3 44 -26 45 -16 45 -22 45 -38 45 -11 44 -48 -45 -15 45 -42 45 -19 44 -48 45 -26 45 -34 45 -47 45 -36 -44 -36 45 -36 45 -41 45 -41 44 -39 45 -42 45 -43 45 -41 -45 -39 44 -40 45 -42 45 -43 45 -42 44 -43 45 -41 45 -42 -45 -42 45 -43 44 -42 45 -44 45 -42 45 -43 44 -44 282 3100 64 MP stroke +50 -10 49 -5 50 -34 49 -54 49 -6 50 -3 49 -43 49 -21 +50 -25 49 -27 50 -38 49 -2 49 -38 50 -31 49 -20 49 -29 +50 -27 49 -17 49 -56 50 1 49 -51 50 -26 49 -22 49 -21 +50 -32 49 -27 49 -23 50 -25 49 -45 49 -16 50 -24 49 -38 +50 -41 49 -48 49 -48 50 -44 49 -43 49 -51 50 -47 49 -38 +49 -58 50 -46 49 -44 50 -44 49 -45 49 -45 50 -41 49 -48 +49 -44 50 -47 49 -48 49 -48 50 -47 49 -48 50 -47 49 -47 +49 -48 50 -48 49 -49 49 -47 50 -48 49 -48 49 -49 311 3421 64 MP stroke +DD +50 75 49 -23 50 -20 49 9 49 299 50 -13 49 -223 49 183 +50 13 49 -77 50 7 49 15 49 -32 50 -2 49 -4 49 -11 +50 -13 49 -11 49 -18 50 -20 49 -5 50 -23 49 -6 49 -16 +50 -23 49 -4 49 -16 50 -21 49 -2 49 -11 50 5 49 -28 +50 29 49 -50 49 40 50 -20 49 -24 49 -47 50 -4 49 -36 +49 -8 50 -18 49 -19 50 -9 49 -23 49 -22 50 -15 49 -10 +49 -40 50 -4 49 -15 49 -18 50 -22 49 -13 50 -28 49 -5 +49 -33 50 -21 49 -20 49 -18 50 -25 49 -22 4 -3 356 3422 64 MP stroke gr 24 w +DD %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 144 FMSR -2568 1397 mt -(3299ms) s +2964 1101 mt +(323ms) s +2964 2501 mt +(811ms) s %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 120 FMSR -1464 3388 mt +1638 3709 mt (nr. cores) s -gs 282 344 2822 2757 rc +gs 311 380 3111 3042 rc DO 16.8 w -2821 -2756 282 3100 2 MP stroke +3110 -3041 311 3421 2 MP stroke gr 16.8 w DO -1115 249 mt +1288 285 mt (Speedup Barnes-Hut) s SO 6 w 1 sg -0 2757 5642 0 0 -2757 3573 3100 4 MP +0 3041 6221 0 0 -3041 3940 3421 4 MP PP --5642 0 0 2757 5642 0 0 -2757 3573 3100 5 MP stroke +-6221 0 0 3041 6221 0 0 -3041 3940 3421 5 MP stroke 4 w DO SO 6 w 0 sg -3573 3100 mt 9215 3100 L -3573 343 mt 9215 343 L -3573 3100 mt 3573 343 L -9215 3100 mt 9215 343 L -3573 3100 mt 9215 3100 L -3573 3100 mt 3573 343 L -4379 3100 mt 4379 3043 L -4379 344 mt 4379 400 L -4313 3245 mt +3940 3421 mt 10161 3421 L +3940 380 mt 10161 380 L +3940 3421 mt 3940 380 L +10161 3421 mt 10161 380 L +3940 3421 mt 10161 3421 L +3940 3421 mt 3940 380 L +4828 3421 mt 4828 3358 L +4828 380 mt 4828 442 L +4762 3566 mt (10) s -5274 3100 mt 5274 3043 L -5274 344 mt 5274 400 L -5208 3245 mt +5816 3421 mt 5816 3358 L +5816 380 mt 5816 442 L +5750 3566 mt (20) s -6170 3100 mt 6170 3043 L -6170 344 mt 6170 400 L -6104 3245 mt +6803 3421 mt 6803 3358 L +6803 380 mt 6803 442 L +6737 3566 mt (30) s -7065 3100 mt 7065 3043 L -7065 344 mt 7065 400 L -6999 3245 mt +7791 3421 mt 7791 3358 L +7791 380 mt 7791 442 L +7725 3566 mt (40) s -7961 3100 mt 7961 3043 L -7961 344 mt 7961 400 L -7895 3245 mt +8778 3421 mt 8778 3358 L +8778 380 mt 8778 442 L +8712 3566 mt (50) s -8856 3100 mt 8856 3043 L -8856 344 mt 8856 400 L -8790 3245 mt +9766 3421 mt 9766 3358 L +9766 380 mt 9766 442 L +9700 3566 mt (60) s -3573 3100 mt 3629 3100 L -9215 3100 mt 9158 3100 L -3472 3144 mt +3940 3421 mt 4002 3421 L +10161 3421 mt 10098 3421 L +3839 3465 mt (0) s -3573 2598 mt 3629 2598 L -9215 2598 mt 9158 2598 L -3372 2642 mt +3940 2868 mt 4002 2868 L +10161 2868 mt 10098 2868 L +3739 2912 mt (0.2) s -3573 2097 mt 3629 2097 L -9215 2097 mt 9158 2097 L -3372 2141 mt +3940 2315 mt 4002 2315 L +10161 2315 mt 10098 2315 L +3739 2359 mt (0.4) s -3573 1596 mt 3629 1596 L -9215 1596 mt 9158 1596 L -3372 1640 mt +3940 1762 mt 4002 1762 L +10161 1762 mt 10098 1762 L +3739 1806 mt (0.6) s -3573 1095 mt 3629 1095 L -9215 1095 mt 9158 1095 L -3372 1139 mt +3940 1209 mt 4002 1209 L +10161 1209 mt 10098 1209 L +3739 1253 mt (0.8) s -3573 594 mt 3629 594 L -9215 594 mt 9158 594 L -3472 638 mt +3940 656 mt 4002 656 L +10161 656 mt 10098 656 L +3839 700 mt (1) s -3573 3100 mt 9215 3100 L -3573 343 mt 9215 343 L -3573 3100 mt 3573 343 L -9215 3100 mt 9215 343 L -gs 3573 344 5643 2757 rc +3940 3421 mt 10161 3421 L +3940 380 mt 10161 380 L +3940 3421 mt 3940 380 L +10161 3421 mt 10161 380 L +gs 3940 380 6222 3042 rc 24 w -90 58 90 18 89 32 90 16 89 22 90 17 89 35 90 -12 -89 18 90 46 90 18 89 25 90 35 89 21 90 1 89 34 -90 49 89 1 90 25 90 34 89 22 90 17 89 53 90 24 -89 -18 90 60 89 18 90 34 90 27 89 2 90 47 89 -14 -90 45 89 -3 90 41 89 -15 90 32 90 15 89 -11 90 12 -89 13 90 15 89 3 90 2 89 10 90 0 90 -4 89 3 -90 13 89 12 90 2 89 -2 90 1 89 1 90 10 90 5 -89 11 90 -5 89 11 90 -4 89 12 90 9 89 14 3573 594 64 MP stroke +99 23 99 30 99 4 98 -16 99 29 99 34 99 -5 98 18 +99 14 99 12 99 2 98 40 99 1 99 10 99 24 98 13 +99 17 99 29 99 -19 98 54 99 -11 99 21 99 29 98 30 +99 17 99 23 99 32 98 31 99 1 99 48 99 37 98 15 +99 11 99 -2 99 -3 98 7 99 6 99 -7 99 -2 98 21 +99 -26 99 1 99 6 98 10 99 7 99 6 99 20 98 -3 +99 14 99 6 99 -3 98 1 99 1 99 4 99 3 98 7 +99 -2 99 1 99 -2 98 8 99 -2 99 5 98 2 3940 656 64 MP stroke +DD +99 147 99 -22 99 -17 98 35 99 572 99 5 99 -397 98 379 +99 57 99 -123 99 46 98 64 99 -36 99 32 99 26 98 12 +99 7 99 12 99 -3 98 -10 99 30 99 -17 99 29 98 1 +99 -17 99 35 99 2 98 -10 99 46 99 19 99 73 98 -31 +99 163 99 -110 99 217 98 3 99 -14 99 -112 99 65 98 -74 +99 53 99 5 99 5 98 60 99 -18 99 -9 99 26 98 72 +99 -138 99 117 99 48 98 31 99 -2 99 90 99 -74 98 220 +99 -145 99 22 99 53 98 132 99 -17 99 78 98 74 3940 656 64 MP stroke gr 24 w +DD %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 144 FMSR -8909 1450 mt -(60%) s +9853 1168 mt +(75%) s +9853 2253 mt +(36%) s %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 120 FMSR -6166 3388 mt +6822 3709 mt (nr. cores) s -gs 3573 344 5643 2757 rc +6243 285 mt +(Parallel Efficiency Barnes-Hut) s +3923 3464 mt +( ) s +10145 422 mt +( ) s +gs 3940 380 6222 3042 rc DO 16.8 w -5642 0 3573 594 2 MP stroke +6221 0 3940 656 2 MP stroke +SO +6 w gr -16.8 w +6 w +SO +1 sg +0 334 1151 0 0 -334 3999 3362 4 MP +PP +-1151 0 0 334 1151 0 0 -334 3999 3362 5 MP stroke +4 w DO -5586 249 mt -(Parallel Efficiency Barnes-Hut) s SO +6 w +0 sg +3999 3362 mt 5150 3362 L +3999 3028 mt 5150 3028 L +3999 3362 mt 3999 3028 L +5150 3362 mt 5150 3028 L +3999 3362 mt 5150 3362 L +3999 3362 mt 3999 3028 L +3999 3362 mt 5150 3362 L +3999 3028 mt 5150 3028 L +3999 3362 mt 3999 3028 L +5150 3362 mt 5150 3028 L +4454 3162 mt +(QuickSched) s +gs 3999 3028 1152 335 rc +24 w +350 0 4068 3119 2 MP stroke +gr + +24 w +4454 3313 mt +(Gadget2) s +gs 3999 3028 1152 335 rc +DD +350 0 4068 3270 2 MP stroke +SO +6 w +gr + 6 w end %%Color Dict diff --git a/paper/figures/BH_scaling.pdf b/paper/figures/BH_scaling.pdf index e8db7689dbd3347050cd6a938d03c7e1e05909e7..5f8cef4cbe14e358e5e579f3eba2fa96c68240bf 100644 GIT binary patch delta 7011 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 Xv8be?C^e1C(#XJ^OI6j?-;E0ZB_)@d delta 5739 zcmdnv{n~MYdwt~nei>7qy8HW+;wEqfO~29k`SI2u*8T(Yjxax3xGT<k_1(pL7d!p= zZn1Ih$usxl%vUT}l~w-8;^Xuq8~-kqSKr=#@~Zu>>e^eizk_GpyZ7GiUB;*C_ZNR^ zx-Q||-2HpTvfZ;^K7U!pe)+b$$-OrUA&lFT=Ute5JKbJ!npQ&V-P!f|6<_AtoUZ=& z`>xY(72Q*%pI+`b9I&F-Zu*Ok$4P$*%Wv%5Y<d2;j98f;{|!r<uGa--&x4=s=y<$n z>V((N9xg}};{UY!!mHOaRWH6=w&!VbYuUZY|6=AZ6A!O>wv%h!j~h#hxppkKl34U7 zZf@E61GTkZ>%M==`u<oi*!m~qWKXwxpV-yOvsAlYuB-@p7#UtsaE!U*?ANx~kdqzD zvrBC@rzp!cY+;wPc=VBZ-itdN%gn?*qW<$Z&x$q-xN(`uQ9@wK6*YN>6)BB}x1?#r zZW8rvta9PDF?sALf34hARe9bz)BC6NZg#XcpS|}~b)Ll={`;Fau9(@I&tJ3lW0<#o zTRqEF=QZC~K9iN_RV}=A_36rG-et`%Z%O%jub;W?p6)X52c7ae)N`b2II2CGD<}5| zr0F&rX5}_A-FquM_wIx)m7SZM7ENNEwC?Ieo~YRqj%;za+O27NZ`YOeixdn`DxE9W zbvDY%bv$G_Io~lVeiEDNk3CI`Cb3RgcXc68)a(T;_1BedGJk*UePW*dwWDivbr=08 zoR)IQLuuODueaBQ>AcwTz(Su-!TI+mjhCIvS-x%1Qv8|9*}3ic>ZL+|x$ZH|xV~QC z?3U}sD(t%o4|>X1-aaL8L~H4~#Vf6?X1811FF3%p%<;(D6yt!0CAO+7{>znL+^yNF zazC&n$gJli=PRCV_1BhcPLrKHX^mz2<r4~<MNX()bcs9h?5yiPuXV*DSGeCgtk1e= z%P1bgbT0J3gCKF1Z(ap^XKE=lEa>B9*gEr8;&rvH9|NlD^PCyqYDLtstMtY;7<TxX z8Q;sSnS5Vs;zyZ}yHqkmrg&|uinwh*E#+qEw-wh|50*~Vxy)kl_{hV0_9pev1vkV5 z_E;6IW>!!M?%$W|ps{YNOWx&8Dvb*2>Cux?if>L(^p7lSxZsvLrBY){X0gZ}k*7Z@ zg;~v9qdf$V=oqF%sWO;mys%hjP_eahUF9W>6Khv;Oz2<wHCg(MY`5ReGXe)yVwg=1 zOiWoVXv**Mndi$RlQl}+8#XZ})tm6d9b(O2tjEo4bv4tODK&J1;<U!33yMPhGrkvG zSi#8hiYaJs!Q<`k4WG+<<;95TtV=x-wbo<Pks!bCrV8g9e^(xSX{lcnuizKHzWjXN z`)`-OzArcbZd*{lui@uu7vbF}*7v+K)sE?zH~rAJ^xMl^&m~DObyI(GV%f<*A09rd zfA)1b|K;xR^6lo|&+q^L<@lUq6=`R7TD3CrdES}CeMHMneX;i6VDW&k@BS(WA2WLT zPgot<Gj*PCo!zGmW))Qj9z5hU;7^}yU%2eJfo<A3;k9RG9;rS(t2ylZg~&&y6LOPR zn`*IpOuwO}{z9-KyRTtMz1q1;a~9gnHMy+X<keT7;2Gd+#Pl*s_O#AV@dB?**JrGK zUMqF@Ls+>TRvAAwJXmIN<R!QMr>h=^^wKQUBtMp{<;$3s;~sL^J#y#SfL?VS<<9)G zf<0f#Rc_tkQ!c#fIlbc5&#l^aYu-O|zHX!QCs(-mS=7bt>J4nqc)W{D9;{d^*!*Qy z?d#f2Z;yoL*U!n^eEab&8;`FB$^i#C7QL3}b4=$Jd9dopC&Ts`#u{5&q#8V2O%F`? z$9L$Lxub$5Z==9@g(+blc@(;)IWY5Fe(8`l*Ee8B+KzqFKhL=D^pKO?VkUl1^Y2~L zwe_3hi+0W_b${^5^(T{1_S&Xr2gTGgIHcWkzg=1_UEi{2-FNHyS9NZ4FIjUsou~|b z6~?ci{~<~&+*56;2LGoMr55I~%A59`%jdV#xgz}K%B)EL8`-gUgm+xeJ{Ivr@}jih zM^CMqX*U*JS#jA$ZL-d4ZISib%u@}vUz%!peb&u?$&P<48D6gHX<_}6r<(avwp)VN zZuhNC=M-E7FM5P2Oj(+EX>C3C#gn%-d~6e#ti!X?G&ota<JeTEW7~98?s6_GUexHj zpJRUNH0A6Un(}k!sT<Z#O|@!u&{*wQshlNL#@6yJ#3P3P<MxSSTuwg(_Q;uDy|lp7 zVYBGO3EpX0W(y~+{@K|rbZVDuS!W3IxgTavuS|Q^vpbOU(6g?Iw_XG!2UK6^t@pDG zGh8R@$RQ;XU@SQG%+n-&nHu>Wsme7E9cJ{-Ixe94Cbd*&wO~Yo@|2iQb&_i$TI80A zO-;(mk(jhs`iP8Fy6?93jSU$y;*SPRnVM$1^vR;2n@K{pA{~L|c8VIuLyB&n;z;}F zrc)!bY>hC>`k6~ho-xj<c_W#6&hB6Rg0<eA`n#^&E39z;lXW!ur(K~E@6<g^`k#$T z|JpqKWK<e^?3`=Xul&mF1rcx0t@+v>UcSEX`0U4DKAoLie*Jx3-unMl9S5)3*E1U( zxI20BUM@)%Lkm;0$+x()+0D(26^twlH}h~OF|vhwM*6z?PA=h@$Z4QpYH9|;llge% z84V^I@QO1UO!ne6=Q2<*P%ttwQZP`MJdyVnOiv+SKeLB^z+`rQS)ok*9Q|DV+|0bv zV*Nb*yv)4R$>#jBlcV_a>y0eTEbQ!xONvqxbGa(!gobg32uF&o6<9GvdRwO|$E>d1 z98C&(9?cyJ3C#)$asn<b944F!)*9Qk-O`d@@^!~nrPUn0cNb|i>2N)|r;xB)C4r&& z;tC6^S7)@J9iO@K#g{K<EG_?ES^wwz{omj3R@Z;zaAs~g{<!zclv9_MXl|^ZDEMop zX!f~eb;%8re{vk>-!FU4WR_2bxQ%?X+vkfJhc9_9KF;~@rG<tBw`9Cvjhw#n`yZcL zj+|L?<HZb-lW$D_W$WtbuKib&{QAKIg_|>e9=8`V&n(I**^{F7eS+FlRh3gqKWg?( zdU_{orjA*VknU-p9?xkmF0P)7za%;e8r5gcNpW4HV`gZm=xbEHv-L>cJ)7G*?`%j2 zT~m{swMj)m$u9Dd?#JnF%TFmy`uASdQ6Ttntgz7C$&-R@f|ZSw7cZIpCy6<wD0=tL zZ`@*DV%BG7WZU*D)O2RH$ZwoA!;?jz@rcx+CJv>TPJu(c1?ph}axJ<WCv8x#=?HC^ zARt)(m~++)hZzDkNlJ-s6OLpi=@|CSIF@+Q_fE%e8{s&m^-bT;9Jrpa-*NB3`#;!! za2<ZxwwpIz@~okk!725#p3z4AYs5HMe>RzU`8*9~cjs__Bk}S4#K-REBxbUPp13e0 zSJN-q+*Y7Wd(Q8~`uUw6x6g`QR%%_hLq3bOKL2&yt@=Rem%7LPze-kR`g&^H%%q9e zI9X30j#=s0_;CYokmEkCZL3;rqh4HGcWG9K-8UZw(VMO7M6O*4o3FpCYu)05C&XT7 zc^xSWnVVai(H3<{ddYsT^KA1A+(q(~w*HXgjXoG$AR7A4YHHxTf0Jcg7p=&-`RvP* zo*%K<J6-4f(B%C&p<Zu=yM4aC=Q0<0@1VY8uCo`;c>gFUIB4?I+t-!5ti8LMwg!Dz zb@jrcXNNVn%{sRE&9Wr(H)a;1ItkOBDeq{Q{+B)H<P)pQ`nTtNWU(pRI=Of2ekK=% zJ?pL*{qmjiMrP@TQ2rC5TRS~2c0GPsr=kA(nu%(;64#mejQlbOa~UNP>e~b}?@p+X znZkedu}*_d{;#8JRV!rVwq~8Qaa%HD|1R-khi*vkZ9XHu=G$t8Xw@qjYj4`b%0;Ir zB|VguSa4HQ>#oR&wC5{5E*i()Q@4yhV!P2Q{F21HBHk!#jW>^884B{2yxe_x>HBk< zj8!2wN)~R~^WjRP^v){{3fB4I@5)^2JK3%+=q-FbXGJ(ua@l)v7pW^B_Rc!LE~WS7 zobPhxA0+sKAFtp0+~SJc!SEutnT5)`O?W-k+gfT~?~1EhqvE^g?T>el?dL3hHu-0T z&-1JqXXf7Cvj6W~qd%9n1otE_Jl^?3s3b4x@zPc2s;_=*tV~K?;Z=Fy+)I&vEW0-d zA75NvUob(tl+h=?XZh~RJJ&r=EXb;?4h+24FZw9&;J3ZEi?%6fRULm=%=2Km%w#js z<p&$MtS(p9MwLyOcHXRL#{<T<8}3MzzjAY2{#E^_w}ik8=`Rhv{^HxdJJ!uVt=zXU z=N8LF>unW=d14++ci!$*(z_$Nx#{Sxn@qpIHS8~H30+XX?6Pm{l-JK6<b7v<W7E1J zjQ98sqt`c$eZPGF{cVA~faw0G6_(7~S)=;XeDuHi^>zuWtG}D@KHB^1WcGUN_?0eK z7T;<~Pz!BHy0oq8?GfeeY4193Z`1M=>$1@ZYzu9Ff8Q#~D>}c+^{XTMsmal2xi4(o zbD3S!M%X4}$_8U?&HC18weGt+RFBjw-LmTGt({%z$7dW|to~WMukg#=?#H2rA9q)* z(QKEQw{Y{Jv^7&F%5uKjb!o@Z+h(aL#}{<oU-)LvnVM6s0Uv4)&J!w;3YF8c42-MT z^Tb6rg<pF1zwOUMV-7!lAiMYZsc-R@v=`6bqaC|*o&UyzZ8t=%GgS;kkJW#*Y5Lec z(>3MWB3{9~j!m33Eb)z=t3Oqi-*vlwIR1!0#F;AXgF8JU*0rs!JuNq@W7Cbfhl`@F zY>}8g(NLFBv`W%{(_x!89e1zJU=NlEy!L*@&yrf}t&bKmq;C|wlXSM!-A_C@%=+B+ z$geCt2Y-B<{CvK!#(~YkZ$uAquZdBwu0N&OWXp3q<I3*ch1tGuf{(8jyYtTYc~R)@ zgz3+N6U2Jny=K`oW3^SPYsMCJE~nS0g<f5%zxTEHT&ULi$#xbcpY!Y&g_PThy>b3s z^vzJlG|=$%Mb2mZE$WtKR^MNymbV<f5$8Hj*Q)a0gSsif8t;Tsp5&iD>olb}Vh4Bf z^LH2P*K)s2cD_14cAbRYss|IgzQ=H%Z~O6pw>;y7%KF8>nr3Y-73Y$^V9TYZANb&9 z(w$$P>r^9)oh?`#o6>b(%g8ogyIJU}QfQ^;*M6lW&fQ-AS;0&3*ImC)B<_5;Xysp( z=_;;A_XTrFv+v#VA?-qQaS-e3)c#AB24@%X*PmUOU|)ZmarP}!mOXw+2eRi*d~vh; z$t~Z1X&PF(LDQt>%Wb>MU)y_4<k%Ipc|YIf<k_m<i#ebCaO%Xfa(^!#aL+2)zhdF8 zmCIJi-gTYT(06nBM|0n0b3CUW4c#)+HYdM|Iiz|*sNV9YDj_y+!j8Ot!nO5L)ZQ19 zW8xnk{=ZX8=&QZ(#S8V%Z$Ik1*B{b!{CZybJxlGcB9Hy+ee%QID_<^ulXCF1X}Ink z<x78@j%?c2VZ?uKMcbXg8_&MpyW+f8?_z-ge;?nchZ?ipUw>k2Zw}{9nK6BzsQ;-& zd+gT-Y~IQx_j<v@&A+d1$z!Q}acpMsEA9Mf-~X4Yo-&s2nSJuQ(mD4z@zwR0gl{UH z-=T3|<>j{zwWn7)7S%s)Jhgb~(&>8Bw=1mrKJEXdhWzW5?#5=>AK$o2+mt`56pobq zIrDA6FOF?mEjo)M7d~9WYSui-&S~ChQ>iSz_zZE0lw`?UKkCd6|6KI{p)YIURk^!{ z&U4Jq)vRPQ_VxLE$jj}^y2XE{Kl`1Qu&4eBquKGx)2tFt?|tNG^gXEV=EO;hX6@RP z-4SHgvXdqK)Z%RhC#_SeYl^;17k4-6mb<pQgMF_I&)x?<$<G}N{@pO1dUr!mgZ#@s zy=zztwzePhR8ct?yI7xf_0)vL&o=hS=yV=FxaC{}&m~`jDyO)dUt1eae|dH7)Jo$& zH9B*hv+Jua@7UG9&TdY?o}Y(i-A~;cbNBMSx&}*yjdi{1tnPV}^Ha1Gj&Ml*Z$6rv z8vij^b^SZZm`7#*8?#Hr0=#z{G|ri@+vJdSjq5JkLnen7`{}LyYWKe0ec6@!{m%J~ zjKR^mVmsN@)=f3qxna%Quhu2(v0cATHb06<V6?sPC_VLg{qCa9X8-4(4@PglS~aom zWaTqO746pNCfcSG4)e+!jVLZ-`MY4<nkapveS3wtKkoSHH{*S%*x%n(8(;jLw8Fz) z-Pq<~udau~CpYFT5hg8FO8Hh-0%kNRe_4F&gJ_)M!_(7RuiSl|v#R>UgEZ%hzYj(; zc8mXHyP@}C@4f5gt8+ipci(Q@FZ52M;<@QB<?RQYb}<C^hch%zdGYUOclqnxT~|0V zSQZ<}yWi>E^)C475zfms=XA~_1oxWu?7tpT_SR@}^K{mTb1rrn&c0>ptdDQzXI_=% zm;N1U$1TQow`S?itN&UI{~e#vlgIH|?_Jy1yQwetoYLcX-*ofWME=)p(=XOvJ9n=5 zxz?QcEYU7;XT5%1$@0UmzrOy<eE1qWTTAS|Yh^qCNga;bzohhx`p!W1lSYS&7AIQ? z*Us5$_pUYQ<D;+h3$yKxU)>&i`MBg}e}x^h%Nx%=-7LPa<J!|*n|Cg`r)mG;iu@0O z4~_H8-ZKAux+zqva=J-@-{E$yzJ$0F=5^u09y9#AL=UNn+`HNBn!s8daz{MGtRpzS z<)7NUD{sOdc50{}4(FYAL%zNB?A8r@waktJS3bNFO`a2UN=&@be`2}jN*PN7ub+=! zTx4!{>sRckXXc;Hoj18##+lJ#^LZINM&;xr19OWMV_ox93qxH)!_-t=0|NsC-IOF# zbAz;0BSS+o!^sA6-Yf>@>iUxn6jX@Pa7@llz*yJNP}jgT#K_3X)X2)faI%QJHm0Dz zyg$Ezo`IgZg|UK0kdc9*QPSi*Wmzi=Jp)~11Ksr0ywsx1WCdjt6W!3H(!7#Vg<#(R zg^-L=1;^5K1tTK`BLk4}MkWfOA<ha$28PCySrz<=a%8!Jhbj@iC*IqewH3E9x)_*i za_Ku4r6!hS=I6O2mZWO9Sb^MSXlP(+WMpb&V5n_isBU1OuF0kEo1cPJ#bi}w3jtWL z#K6KOS6Pmda5<(NW^ZV2r~ryz1BE;VE-=Hu+|1MxUChYP&<I`3(9+Csa<qy{y`iNE zh9O2q#%AamjEs%VF~lqkG1VEFW2!SYzz{Pw1ly}>V1VR$BXc7R*P9twnoL$!wTX4M zv@mcrG;*|bax-;yvUD?da&|K^H8pc}wQw^xF*UHWA*dpj%g&CgxFoTtq@pM_jmzB9 N+=NS2)z#mP3jmdmJ^=s# diff --git a/paper/figures/BH_times.eps b/paper/figures/BH_times.eps index f4a80a2..3fa76a5 100644 --- a/paper/figures/BH_times.eps +++ b/paper/figures/BH_times.eps @@ -1,12 +1,12 @@ %!PS-Adobe-3.0 EPSF-3.0 -%%Creator: MATLAB, The MathWorks, Inc. Version 8.0.0.783 (R2012b). Operating System: Linux 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64. +%%Creator: MATLAB, The MathWorks, Inc. Version 8.3.0.532 (R2014a). Operating System: Linux 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64. %%Title: figures/BH_times.eps -%%CreationDate: 11/06/2013 09:10:44 +%%CreationDate: 11/19/2014 09:30:06 %%DocumentNeededFonts: Helvetica %%DocumentProcessColors: Cyan Magenta Yellow Black %%LanguageLevel: 2 %%Pages: 1 -%%BoundingBox: 30 16 493 297 +%%BoundingBox: 43 20 543 325 %%EndComments %%BeginProlog @@ -161,7 +161,7 @@ end %%Page: 1 1 %%BeginPageSetup -%%PageBoundingBox: 30 16 493 297 +%%PageBoundingBox: 43 20 543 325 MathWorks begin bpage %%EndPageSetup @@ -170,10 +170,10 @@ bpage bplot /dpi2point 12 def -portraitMode 0192 3636 csm +portraitMode 0216 4008 csm - 174 65 5557 3375 rc -95 dict begin %Colortable dictionary + 305 101 6006 3660 rc +93 dict begin %Colortable dictionary /c0 { 0.000000 0.000000 0.000000 sr} bdef /c1 { 1.000000 1.000000 1.000000 sr} bdef /c2 { 0.900000 0.000000 0.000000 sr} bdef @@ -185,263 +185,246 @@ portraitMode 0192 3636 csm c0 1 j 1 sg - 0 0 6269 3445 rf + 0 0 6913 3802 rf 6 w -0 2756 5014 0 0 -2756 627 3100 4 MP +0 3041 5530 0 0 -3041 691 3421 4 MP PP --5014 0 0 2756 5014 0 0 -2756 627 3100 5 MP stroke +-5530 0 0 3041 5530 0 0 -3041 691 3421 5 MP stroke 4 w DO SO 6 w 0 sg - 627 3100 mt 5641 3100 L - 627 3100 mt 627 344 L -1343 3100 mt 1343 3049 L + 691 3421 mt 6221 3421 L + 691 3421 mt 691 380 L +1481 3421 mt 1481 3365 L %%IncludeResource: font Helvetica /Helvetica /ISOLatin1Encoding 120 FMSR -1277 3245 mt +1415 3566 mt (10) s -2139 3100 mt 2139 3049 L -2073 3245 mt +2358 3421 mt 2358 3365 L +2292 3566 mt (20) s -2935 3100 mt 2935 3049 L -2869 3245 mt +3236 3421 mt 3236 3365 L +3170 3566 mt (30) s -3730 3100 mt 3730 3049 L -3664 3245 mt +4114 3421 mt 4114 3365 L +4048 3566 mt (40) s -4526 3100 mt 4526 3049 L -4460 3245 mt +4992 3421 mt 4992 3365 L +4926 3566 mt (50) s -5322 3100 mt 5322 3049 L -5256 3245 mt +5869 3421 mt 5869 3365 L +5803 3566 mt (60) s - 627 3100 mt 677 3100 L - 526 3144 mt + 691 3421 mt 746 3421 L + 590 3465 mt (0) s - 627 2488 mt 677 2488 L - 459 2532 mt -(50) s - 627 1877 mt 677 1877 L - 392 1921 mt -(100) s - 627 1266 mt 677 1266 L - 392 1310 mt -(150) s - 627 655 mt 677 655 L - 392 699 mt -(200) s -gs 627 344 5015 2757 rc + 691 3133 mt 746 3133 L + 590 3177 mt +(2) s + 691 2846 mt 746 2846 L + 590 2890 mt +(4) s + 691 2558 mt 746 2558 L + 590 2602 mt +(6) s + 691 2271 mt 746 2271 L + 590 2315 mt +(8) s + 691 1984 mt 746 1984 L + 523 2028 mt +(10) s + 691 1696 mt 746 1696 L + 523 1740 mt +(12) s + 691 1409 mt 746 1409 L + 523 1453 mt +(14) s + 691 1121 mt 746 1121 L + 523 1165 mt +(16) s + 691 834 mt 746 834 L + 523 878 mt +(18) s + 691 547 mt 746 547 L + 523 591 mt +(20) s +gs 691 380 5531 3042 rc /c8 { 1.000000 0.133333 0.000000 sr} bdef c8 -0 2503 80 3 80 -42 79 -65 80 -40 79 -28 80 -27 80 -20 -79 -60 80 43 79 -40 80 -54 80 -21 79 -54 80 16 79 -41 -80 -20 79 -49 80 -12 80 -47 79 2 80 -39 79 -10 80 -33 -80 -7 79 -10 80 -45 79 -7 80 -22 80 -39 79 -7 80 -11 -79 22 80 -60 79 1 80 -21 80 2 79 -14 80 -3 79 23 -80 -17 80 -6 79 -11 80 -1 79 -11 80 -1 80 -4 79 4 -80 4 79 -10 80 -9 79 1 80 -2 80 5 79 -5 80 -3 -79 -6 80 -2 80 3 79 -6 80 -1 79 -6 80 -2 79 -9 -0 -1572 627 3100 66 MP +0 2765 88 -9 88 -60 88 23 88 14 87 -19 88 -44 88 7 +88 -20 87 -12 88 -15 88 9 88 -39 88 -12 87 -5 88 -20 +88 -9 88 -15 87 -23 88 18 88 -53 88 11 88 -26 87 -19 +88 -24 88 -13 88 -20 87 -25 88 -28 88 2 88 -38 88 -31 +87 -9 88 -8 88 3 88 7 87 -4 88 -5 88 9 88 5 +88 -16 87 23 88 2 88 -3 88 -7 87 -3 88 -5 88 -15 +88 4 88 -8 87 -4 88 4 88 0 88 1 87 -2 88 -1 +88 -5 88 3 88 1 87 1 88 -5 88 3 88 -3 87 1 +0 -2234 691 3421 66 MP PP /c9 { 0.800000 0.106667 0.000000 sr} bdef c9 --5014 0 0 2503 80 3 80 -42 79 -65 80 -40 79 -28 80 -27 -80 -20 79 -60 80 43 79 -40 80 -54 80 -21 79 -54 80 16 -79 -41 80 -20 79 -49 80 -12 80 -47 79 2 80 -39 79 -10 -80 -33 80 -7 79 -10 80 -45 79 -7 80 -22 80 -39 79 -7 -80 -11 79 22 80 -60 79 1 80 -21 80 2 79 -14 80 -3 -79 23 80 -17 80 -6 79 -11 80 -1 79 -11 80 -1 80 -4 -79 4 80 4 79 -10 80 -9 79 1 80 -2 80 5 79 -5 -80 -3 79 -6 80 -2 80 3 79 -6 80 -1 79 -6 80 -2 -79 -9 0 -1572 627 3100 67 MP stroke +-5530 0 0 2765 88 -9 88 -60 88 23 88 14 87 -19 88 -44 +88 7 88 -20 87 -12 88 -15 88 9 88 -39 88 -12 87 -5 +88 -20 88 -9 88 -15 87 -23 88 18 88 -53 88 11 88 -26 +87 -19 88 -24 88 -13 88 -20 87 -25 88 -28 88 2 88 -38 +88 -31 87 -9 88 -8 88 3 88 7 87 -4 88 -5 88 9 +88 5 88 -16 87 23 88 2 88 -3 88 -7 87 -3 88 -5 +88 -15 88 4 88 -8 87 -4 88 4 88 0 88 1 87 -2 +88 -1 88 -5 88 3 88 1 87 1 88 -5 88 3 88 -3 +87 1 0 -2234 691 3421 67 MP stroke /c10 { 0.509804 1.000000 0.000000 sr} bdef c10 -0 2499 80 2 80 -41 79 -65 80 -40 79 -27 80 -26 80 -21 -79 -61 80 43 79 -40 80 -52 80 -21 79 -54 80 15 79 -40 -80 -21 79 -48 80 -11 80 -48 79 1 80 -37 79 -10 80 -34 -80 -6 79 -10 80 -45 79 -8 80 -21 80 -39 79 -8 80 -10 -79 21 80 -59 79 0 80 -20 80 2 79 -14 80 -3 79 23 -80 -17 80 -6 79 -10 80 -2 79 -11 80 -1 80 -4 79 4 -80 4 79 -9 80 -9 79 0 80 -2 80 6 79 -6 80 -2 -79 -6 80 -3 80 3 79 -6 80 0 79 -6 80 -3 79 -9 -0 -1571 627 3100 66 MP +0 1942 88 4 88 -54 88 19 88 13 87 -14 88 -31 88 9 +88 -14 87 -9 88 -9 88 9 88 -24 88 -10 87 -3 88 -11 +88 -6 88 -7 87 -11 88 11 88 -35 88 9 88 -10 87 -15 +88 -13 88 -8 88 -10 87 -15 88 -12 88 1 88 -21 88 -17 +87 1 88 -8 88 2 88 2 87 -1 88 -2 88 2 88 4 +88 -6 87 13 88 -3 88 1 88 -7 87 2 88 -7 88 -4 +88 0 88 -3 87 -2 88 2 88 1 88 0 87 -1 88 -1 +88 -3 88 2 88 0 87 2 88 -4 88 2 88 -1 87 2 +0 -1643 691 3421 66 MP PP /c11 { 0.407843 0.800000 0.000000 sr} bdef c11 --5014 0 0 2499 80 2 80 -41 79 -65 80 -40 79 -27 80 -26 -80 -21 79 -61 80 43 79 -40 80 -52 80 -21 79 -54 80 15 -79 -40 80 -21 79 -48 80 -11 80 -48 79 1 80 -37 79 -10 -80 -34 80 -6 79 -10 80 -45 79 -8 80 -21 80 -39 79 -8 -80 -10 79 21 80 -59 79 0 80 -20 80 2 79 -14 80 -3 -79 23 80 -17 80 -6 79 -10 80 -2 79 -11 80 -1 80 -4 -79 4 80 4 79 -9 80 -9 79 0 80 -2 80 6 79 -6 -80 -2 79 -6 80 -3 80 3 79 -6 80 0 79 -6 80 -3 -79 -9 0 -1571 627 3100 67 MP stroke +-5530 0 0 1942 88 4 88 -54 88 19 88 13 87 -14 88 -31 +88 9 88 -14 87 -9 88 -9 88 9 88 -24 88 -10 87 -3 +88 -11 88 -6 88 -7 87 -11 88 11 88 -35 88 9 88 -10 +87 -15 88 -13 88 -8 88 -10 87 -15 88 -12 88 1 88 -21 +88 -17 87 1 88 -8 88 2 88 2 87 -1 88 -2 88 2 +88 4 88 -6 87 13 88 -3 88 1 88 -7 87 2 88 -7 +88 -4 88 0 88 -3 87 -2 88 2 88 1 88 0 87 -1 +88 -1 88 -3 88 2 88 0 87 2 88 -4 88 2 88 -1 +87 2 0 -1643 691 3421 67 MP stroke /c12 { 0.000000 0.721569 1.000000 sr} bdef c12 -0 2206 80 -4 80 -44 79 -49 80 -30 79 -6 80 -26 80 -21 -79 -39 80 19 79 -27 80 -49 80 -7 79 -41 80 2 79 -28 -80 -17 79 -26 80 -18 80 -27 79 -8 80 -24 79 -8 80 -19 -80 -22 79 -8 80 -23 79 -13 80 -21 80 -18 79 -17 80 -8 -79 -6 80 -19 79 -6 80 -6 80 -2 79 -5 80 1 79 1 -80 -6 80 -4 79 -2 80 -2 79 -2 80 -2 80 -2 79 0 -80 5 79 -8 80 -1 79 0 80 -2 80 2 79 -2 80 -1 -79 -1 80 1 80 0 79 -3 80 0 79 0 80 -2 79 -1 -0 -1504 627 3100 66 MP +0 1421 88 20 88 -48 88 10 88 16 87 -17 88 -14 88 1 +88 -6 87 2 88 -9 88 9 88 -21 88 -2 87 0 88 -6 +88 -6 88 -2 87 -6 88 13 88 -26 88 8 88 -2 87 -10 +88 -8 88 -5 88 -5 87 -8 88 -8 88 4 88 -12 88 -7 +87 4 88 -8 88 2 88 1 87 -1 88 -1 88 1 88 2 +88 -8 87 13 88 -5 88 3 88 -8 87 5 88 -6 88 0 +88 -1 88 -2 87 -2 88 1 88 2 88 0 87 -1 88 0 +88 -4 88 3 88 0 87 1 88 -3 88 2 88 -1 87 1 +0 -1266 691 3421 66 MP PP /c13 { 0.000000 0.577255 0.800000 sr} bdef c13 --5014 0 0 2206 80 -4 80 -44 79 -49 80 -30 79 -6 80 -26 -80 -21 79 -39 80 19 79 -27 80 -49 80 -7 79 -41 80 2 -79 -28 80 -17 79 -26 80 -18 80 -27 79 -8 80 -24 79 -8 -80 -19 80 -22 79 -8 80 -23 79 -13 80 -21 80 -18 79 -17 -80 -8 79 -6 80 -19 79 -6 80 -6 80 -2 79 -5 80 1 -79 1 80 -6 80 -4 79 -2 80 -2 79 -2 80 -2 80 -2 -79 0 80 5 79 -8 80 -1 79 0 80 -2 80 2 79 -2 -80 -1 79 -1 80 1 80 0 79 -3 80 0 79 0 80 -2 -79 -1 0 -1504 627 3100 67 MP stroke +-5530 0 0 1421 88 20 88 -48 88 10 88 16 87 -17 88 -14 +88 1 88 -6 87 2 88 -9 88 9 88 -21 88 -2 87 0 +88 -6 88 -6 88 -2 87 -6 88 13 88 -26 88 8 88 -2 +87 -10 88 -8 88 -5 88 -5 87 -8 88 -8 88 4 88 -12 +88 -7 87 4 88 -8 88 2 88 1 87 -1 88 -1 88 1 +88 2 88 -8 87 13 88 -5 88 3 88 -8 87 5 88 -6 +88 0 88 -1 88 -2 87 -2 88 1 88 2 88 0 87 -1 +88 0 88 -4 88 3 88 0 87 1 88 -3 88 2 88 -1 +87 1 0 -1266 691 3421 67 MP stroke /c14 { 1.000000 0.929412 0.000000 sr} bdef c14 -0 564 80 -25 80 -6 79 -1 80 -12 79 -5 80 -5 80 5 -79 -12 80 0 79 9 80 -22 80 -6 79 -9 80 3 79 -1 -80 -5 79 -6 80 -5 80 -4 79 -7 80 -3 79 -2 80 2 -80 -8 79 -1 80 -6 79 -3 80 -4 80 -3 79 -6 80 2 -79 -5 80 -4 79 -1 80 -3 80 0 79 -3 80 1 79 0 -80 -3 80 -1 79 0 80 -1 79 -1 80 0 80 -1 79 1 -80 0 79 -1 80 -1 79 0 80 -1 80 0 79 0 80 0 -79 -1 80 0 80 0 79 0 80 0 79 0 80 0 79 -1 -0 -392 627 3100 66 MP +0 28 88 40 88 -46 88 5 88 8 87 -13 88 1 88 3 +88 -2 87 6 88 -8 88 13 88 -16 88 1 87 -1 88 1 +88 -1 88 1 87 -4 88 8 88 -6 88 0 88 1 87 0 +88 -2 88 -1 88 0 87 -2 88 0 88 -1 88 0 88 -1 +87 1 88 -1 88 0 88 -1 87 0 88 -1 88 1 88 0 +88 -1 87 0 88 -1 88 1 88 -1 87 1 88 -1 88 0 +88 0 88 -1 87 0 88 0 88 0 88 0 87 0 88 0 +88 -1 88 1 88 -1 87 0 88 0 88 1 88 -1 87 2 +0 -9 691 3421 66 MP PP /c15 { 0.800000 0.743529 0.000000 sr} bdef c15 --5014 0 0 564 80 -25 80 -6 79 -1 80 -12 79 -5 80 -5 -80 5 79 -12 80 0 79 9 80 -22 80 -6 79 -9 80 3 -79 -1 80 -5 79 -6 80 -5 80 -4 79 -7 80 -3 79 -2 -80 2 80 -8 79 -1 80 -6 79 -3 80 -4 80 -3 79 -6 -80 2 79 -5 80 -4 79 -1 80 -3 80 0 79 -3 80 1 -79 0 80 -3 80 -1 79 0 80 -1 79 -1 80 0 80 -1 -79 1 80 0 79 -1 80 -1 79 0 80 -1 80 0 79 0 -80 0 79 -1 80 0 80 0 79 0 80 0 79 0 80 0 -79 -1 0 -392 627 3100 67 MP stroke -/c16 { 0.984314 0.000000 1.000000 sr} bdef -c16 -0 118 80 -16 80 -4 79 -2 80 -8 79 -1 80 -4 80 7 -79 -12 80 0 79 9 80 -21 80 -3 79 -7 80 3 79 -1 -80 -3 79 -5 80 -2 80 -4 79 -6 80 -2 79 -1 80 4 -80 -6 79 0 80 -2 79 -4 80 -1 80 -1 79 -4 80 4 -79 -5 80 -1 79 -1 80 -3 80 0 79 -3 80 1 79 -1 -80 -1 80 -1 79 -1 80 -1 79 -1 80 0 80 0 79 0 -80 -1 79 0 80 -1 79 0 80 0 80 -1 79 0 80 0 -79 0 80 0 80 0 79 0 80 0 79 0 80 0 79 0 -0 -4 627 3100 66 MP -PP -/c17 { 0.787451 0.000000 0.800000 sr} bdef -c17 --5014 0 0 118 80 -16 80 -4 79 -2 80 -8 79 -1 80 -4 -80 7 79 -12 80 0 79 9 80 -21 80 -3 79 -7 80 3 -79 -1 80 -3 79 -5 80 -2 80 -4 79 -6 80 -2 79 -1 -80 4 80 -6 79 0 80 -2 79 -4 80 -1 80 -1 79 -4 -80 4 79 -5 80 -1 79 -1 80 -3 80 0 79 -3 80 1 -79 -1 80 -1 80 -1 79 -1 80 -1 79 -1 80 0 80 0 -79 0 80 -1 79 0 80 -1 79 0 80 0 80 -1 79 0 -80 0 79 0 80 0 80 0 79 0 80 0 79 0 80 0 -79 0 0 -4 627 3100 67 MP stroke +-5530 0 0 28 88 40 88 -46 88 5 88 8 87 -13 88 1 +88 3 88 -2 87 6 88 -8 88 13 88 -16 88 1 87 -1 +88 1 88 -1 88 1 87 -4 88 8 88 -6 88 0 88 1 +87 0 88 -2 88 -1 88 0 87 -2 88 0 88 -1 88 0 +88 -1 87 1 88 -1 88 0 88 -1 87 0 88 -1 88 1 +88 0 88 -1 87 0 88 -1 88 1 88 -1 87 1 88 -1 +88 0 88 0 88 -1 87 0 88 0 88 0 88 0 87 0 +88 0 88 -1 88 1 88 -1 87 0 88 0 88 1 88 -1 +87 2 0 -9 691 3421 67 MP stroke gr -c17 +c15 0 sg -2906 3388 mt +3228 3709 mt (nr. cores) s - 310 1753 mt -90 rotate + 441 1931 mt -90 rotate (s) s 90 rotate -2720 249 mt +3042 285 mt (Total task times) s - 610 3143 mt + 674 3464 mt ( ) s -5625 386 mt +6205 422 mt ( ) s 1 sg -0 772 1341 0 0 -772 686 1176 4 MP +0 626 1341 0 0 -626 750 3362 4 MP PP --1341 0 0 772 1341 0 0 -772 686 1176 5 MP stroke +-1341 0 0 626 1341 0 0 -626 750 3362 5 MP stroke 4 w DO SO 6 w 0 sg - 686 1176 mt 2027 1176 L - 686 404 mt 2027 404 L - 686 1176 mt 686 404 L -2027 1176 mt 2027 404 L - 686 1176 mt 2027 1176 L - 686 1176 mt 686 404 L - 686 1176 mt 2027 1176 L - 686 404 mt 2027 404 L - 686 1176 mt 686 404 L -2027 1176 mt 2027 404 L -1148 536 mt -(tCOM) s -gs 686 404 1342 773 rc + 750 3362 mt 2091 3362 L + 750 2736 mt 2091 2736 L + 750 3362 mt 750 2736 L +2091 3362 mt 2091 2736 L + 750 3362 mt 2091 3362 L + 750 3362 mt 750 2736 L + 750 3362 mt 2091 3362 L + 750 2736 mt 2091 2736 L + 750 3362 mt 750 2736 L +2091 3362 mt 2091 2736 L +1212 2868 mt +(tSELF) s +gs 750 2736 1342 627 rc c8 -0 110 355 0 0 -110 757 548 4 MP +0 111 355 0 0 -111 821 2881 4 MP PP c9 --355 0 0 110 355 0 0 -110 757 548 5 MP stroke +-355 0 0 111 355 0 0 -111 821 2881 5 MP stroke gr c9 0 sg -1148 684 mt -(tPAIR_PC) s -gs 686 404 1342 773 rc +1212 3017 mt +(tPAIR_PP) s +gs 750 2736 1342 627 rc c10 -0 111 355 0 0 -111 757 697 4 MP +0 111 355 0 0 -111 821 3030 4 MP PP c11 --355 0 0 111 355 0 0 -111 757 697 5 MP stroke +-355 0 0 111 355 0 0 -111 821 3030 5 MP stroke gr c11 0 sg -1148 833 mt -(tPAIR_PP) s -gs 686 404 1342 773 rc +1212 3166 mt +(tPAIR_PC) s +gs 750 2736 1342 627 rc c12 -0 111 355 0 0 -111 757 845 4 MP +0 111 355 0 0 -111 821 3178 4 MP PP c13 --355 0 0 111 355 0 0 -111 757 845 5 MP stroke +-355 0 0 111 355 0 0 -111 821 3178 5 MP stroke gr c13 0 sg -1148 981 mt -(tSELF) s -gs 686 404 1342 773 rc +1212 3315 mt +(qsched_gettask) s +gs 750 2736 1342 627 rc c14 -0 111 355 0 0 -111 757 993 4 MP +0 111 355 0 0 -111 821 3327 4 MP PP c15 --355 0 0 111 355 0 0 -111 757 993 5 MP stroke +-355 0 0 111 355 0 0 -111 821 3327 5 MP stroke gr c15 -0 sg -1148 1129 mt -(qsched_gettask) s -gs 686 404 1342 773 rc -c16 -0 110 355 0 0 -110 757 1141 4 MP -PP -c17 --355 0 0 110 355 0 0 -110 757 1141 5 MP stroke -gr - -c17 end %%Color Dict diff --git a/paper/figures/BH_times.pdf b/paper/figures/BH_times.pdf index 1eaf65e17544c0109275e5e9c13cf0d73d4d3b60..f3c6c67c1b14bbbeb6c716afe86db4cda50b7aa0 100644 GIT binary patch delta 6070 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 FTmT5X=kEXj delta 6276 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 KRn^tsjSBz`bxc73 diff --git a/paper/paper.tex b/paper/paper.tex index ce53b3f..3abb632 100644 --- a/paper/paper.tex +++ b/paper/paper.tex @@ -1053,10 +1053,11 @@ it is in the same cell. This operation is performed for each particle, starting with the root-level cell containing all the particles. -The particle data is sorted hierarchically, following the -octree structure. +In our implementation, the particle data is sorted hierarchically, +following the octree structure. Unlike in many codes, where the leaves store an array of -pointers to the underlying particles, the cells, at all +pointers to the underlying particles, which are not necessarily +contiguous in memory, the cells, at all levels, store only a pointer to the first of their own particles, and the total number of particles. The current approach, illustrated in \fig{CellParts} is not @@ -1075,16 +1076,16 @@ is in \oh{N\log N}. \label{fig:CellParts} \end{figure} -The task-based implementation will consist of three +The task-based implementation consists of three types of tasks: \begin{itemize} - \item {\em Self}-interactions in which all particles + \item {\em Self}-interactions, in which all particles in a single cell interact with all other particles in the same cell, - \item {\em Particle-particle} pair interactions in which + \item {\em Particle-particle} pair interactions, in which all particles in a cell interact with all particles in another cell, - \item {\em Particle-cell} pair interactions in which + \item {\em Particle-cell} pair interactions, in which all particles in one cell are interacted with the center of mass of all other cells in the tree. \end{itemize} @@ -1093,54 +1094,59 @@ These tasks can be created recursively over the cell hierarchy as shown in the function {\tt make\_tasks} in \fig{MakeTasks}. The function is called on the root cell with the root cell and {\tt NULL} as its two cell parameters. -The function recurses as follows: +The function recurses as follows (line numbers refer to \fig{MakeTasks}: \begin{itemize} - \item If called with a single (line~6), split (line~7) cell, - recurse over all the cell's sub-cells (line~9), and all - pairs of the cell's sub-cells (line~11), + \item If called with a single, split cell (lines~6--7), + recurse over all the cell's sub-cells, and all + pairs of the cell's sub-cells (lines~8--11), \item If called with a single unsplit cell (line~13), - create a self-interaction task as well as a particle-cell - task on that cell (line~14), - \item If called with two non-neighbouring cells (line~21), - do nothing, as these interactions - will be computed by the particle-cell task, + create a self-interaction task (line~14) as well as a particle-cell + task on that cell (line~18), \item If called with two neighbouring cells and both cells - are split (line~33), + are split (line~22), recurse over all pairs of sub-cells spanning - both cells (line~37), and + both cells (lines~24--26), and \item If called with two neighbouring cells and one of the cells are not split, create - a particle-particle pair task over both cells. + a particle-particle pair task over both cells (line~29), + \item If called with two non-neighbouring cells, + do nothing, as these interactions + will be computed by the particle-cell task. \end{itemize} \noindent where every interaction task additionally locks -the cells on which it operates (lines~16, 25, 30, and 42--43). +the cells on which it operates (lines~17, 20, and 32--33). In order to prevent generating a large number of very small tasks, the task generation only recurses if the cells contain more than a minimum number $n_\mathsf{task}$ -of threads each (lines~7 and~34). +of threads each (lines~7 and~23). -The particle-particle pair interaction tasks are implemented +As shown in \fig{BHTasks}, the particle-self and particle-particle pair +interaction tasks are implemented by computing the interactions between all particle pairs spanning -both cells in a double for-loop. +both cells in a double for-loop (lines~9--11 and~22-24 therein). +Some extra logic (lines~2--7 and~15--20) is added to deal with +split cells that did not contain enough particles to warrant the +generation of finer tasks. The particle-cell interactions for each leaf node are computed by -traversing the tree recursively starting from the root node: +traversing the tree recursively starting from the root node and: \begin{itemize} \item If called with a node that is a hierarchical parent of the leaf node, or with a node that is a direct neighbour of a hierarchical parent of the leaf node, recurse over the - node's sub-cells, + node's sub-cells (lines~29--32), \item Otherwise, compute the interaction between the leaf node's - center of mass and all the particles in the leaf node. + center of mass and all the particles in the leaf node (lines~33--35). \end{itemize} This task decomposition differs from the traditional tree-walk in the Barnes-Hut algorithm in that the particle-cell interactions -are grouped per leaf, with each leaf doing its own tree walk. +are grouped per leaf, with each leaf doing its own tree walk, +as opposed to doing a tree walk for each individual particle. This approach was chosen to maximize the memory locality of the particle-cell calculation, as the particles in the leaf, which are traversed for each particle-cell interaction, are contiguous in memory, and are thus more likely to remain in the -lowest-level cache. +lowest-level cache during the entire tree-walk. This Barnes-Hut tree-code was used to approximate the gravitational N-Body problem for 1\,000\,000 particles with uniformly random coordinates @@ -1148,10 +1154,9 @@ in $[0,1]^3$. The parameters $n_\mathsf{max}=100$ and $n_\mathsf{task}=5000$ were used to generate the tasks. Using the above scheme generated 97\,553 tasks, of which -512 self-interaction tasks, ??? particle-particle interaction -task, and ??? particle-cell interaction tasks. -A total of 141\,840 dependencies were generated, along with -104\,392 locks on 37\,449 resources. +512 self-interaction tasks, 5\,068 particle-particle interaction +task, and 32\,768 particle-cell interaction tasks. +A total of 43\,416 locks on 37\,449 resources were generated. For these tests, {\tt pthread}s parallelism was used and resource re-owning was switched off. @@ -1171,39 +1176,47 @@ cases, an average of 51.3\,ms. \centerline{\epsfig{file=figures/BH_scaling.pdf,width=0.9\textwidth}} \caption{Strong scaling and parallel efficiency of the Barnes-Hut tree-code computed over 1\,000\,000 particles. - Solving the N-Body problem takes 3.3\,s, achieving 60\% parallel + Solving the N-Body problem takes 323\,ms, achieving 75\% parallel efficiency, over all 64 cores. } \label{fig:BHResults} \end{figure} +\begin{figure} + \centerline{\epsfig{file=figures/tasks_bh_dynamic_64.pdf,width=0.9\textwidth}} + \caption{Task scheduling of the Barnes-Hut tree-code on 64 cores. + The red tasks correspond to particle self-interactions, the green + tasks to the particle-particle pair interactions, and the blue + tasks to the particle-cell interactions.} + \label{fig:BHTasksPlot} +\end{figure} + Unlike the QR decomposition, the results scale well only to 32 cores, achieving 90\% parallel efficiency, and then level off for increasing numbers of cores. This, however, is not a problem of the task-based parallel algorithm, or of QuickSched, but of the memory bandwidth of the underlying hardware. -\fig{BHTasks} shows the accumulated cost of each task type and of +\fig{BHTimes} shows the accumulated cost of each task type and of QuickSched over the number of cores. -At 64 cores, the scheduler overheads account for only 4.7\% of +At 64 cores, the scheduler overheads account for only $\sim 1$\% of the total computational cost, whereas, -as of 30 cores, the cost of both pair types grow by up to -50\%. +as of 32 cores, the cost of both pair types grow by up to +40\%. This is most probably due to memory bandwidth restrictions, as -the cost of the self interaction tasks, which do twice as much -computation per memory access, only grow by up to 15\%. +the cost of the particle-cell interaction tasks, which do significantly more +computation per memory access, only grow by up to 10\%. \begin{figure} \centerline{\epsfig{file=figures/BH_times.pdf,width=0.8\textwidth}} \caption{Accumulated cost of each task type and of the overheads - associated with {\tt qsched\_gettask}. - As of $\sim 30$ cores, the cost of both pair interaction task - types grow by up to 50\%. - The cost of the self interactions, which entail twice as much - computation per memory access, grow only by at most 15\%. - The scheduler overheads make up less than 5\% of the total - time. - } + associated with {\tt qsched\_gettask}, summed over all cores. + As of 32 cores, the cost of both pair interaction task + types grow by up to 40\%. + The cost of the particle-cell interactions, which entail significantly more + computation per memory access, grow only by at most 10\%. + The scheduler overheads, i.e.~{\tt qsched\_gettask}, + make up less than 1\% of the total time.} \label{fig:BHTimes} \end{figure} @@ -1248,6 +1261,10 @@ The QuickSched library itself is remarkably simple, consisting of less than 3\,000 lines of code, including comments. Both examples, which are distributed with QuickSched, require less than 1\,000 lines of code each. +For a more complex, large-scale example of a task-based computation +based on the same algorithms, we refer to \cite{ref:Gonnet2014}, +for which the scheduler was originally designed, and from +which QuickSched was back-ported. In both examples, QuickSched performs extremely well, even on a large number of shared-memory cores. @@ -1265,7 +1282,11 @@ The most obvious of which are the following: \begin{itemize} \item {\em Priorities}: The current implementation of QuickSched does not take the resource locks into - account when selecting tasks in the queues, + account when selecting tasks in the queues, e.g.~it + may be advantageous, in some settings, to avoid tasks + which are involved in too many potential conflicts + and would therefore restrict the maximum degree of + parallelism when scheduled. \item {\em Work-stealing}: During work-stealing, the queues are probed in a random order although the total relative cost of the tasks in the queue, @@ -1284,10 +1305,7 @@ v\,3.0 and is available for download via % Acknowledgments \section*{Acknowledgments} -The author would like to thank Sam Townsend for implementing the -kernels in the task-based QR decomposition as part of his MSc Thesis -at Durham University. -The author also thanks Lydia Heck of the Institute for +The authors would like to thank Lydia Heck of the Institute for Computational Cosmology at Durham University for providing access to, and expertise on, the COSMA cluster used in the performance evaluation. @@ -1303,12 +1321,8 @@ This work was supported by a Durham University Seedcorn Grant. \appendix \section{User Interface} -The algorithms, as described in the previous section, have -all been implemented as part of the Open-Source C-language -QuickSched library.\footnote{\url{http://sourceforge.net/projects/quicksched/}} -This section describes the interface functions and how they -are called, and the following section contains -examples of how QuickSched can be used. +This section describes the QuickSched interface functions and how they +are called. As mentioned previously, the {\tt qsched} object is the main interface to the task scheduler. @@ -1321,7 +1335,7 @@ and {\tt qsched\_res\_t} are used instead. The main functions for setting up the scheduler are: \begin{itemize} - \item {\tt void qsched\_init( struct qsched *s , int nr\_queues , int flags )} \\ + \item {\tt void qsched\_init(struct qsched *s, int nr\_queues, int flags)} \\ Initializes a {\tt qsched} object with the given number of queues. The {\tt flags} parameter can be set to any bitwise or combination of {\tt qsched\_flag\_none}, @@ -1330,18 +1344,18 @@ The main functions for setting up the scheduler are: This function must be called before any of the other functions are used. \vspace{1mm} - \item {\tt void qsched\_free( struct qsched *s )} \\ + \item {\tt void qsched\_free(struct qsched *s)} \\ Releases all the memory and other resources allocated by the given {\tt qsched} object. After this function has been called, the {\tt qsched} will need to be re-initialized for reuse. \vspace{1mm} - \item {\tt void qsched\_reset( struct qsched *s )} \\ + \item {\tt void qsched\_reset(struct qsched *s)} \\ Clears the tasks and resources in the given {\tt qsched}, but does not release the allocated memory or change the number of queues. \vspace{1mm} - \item {\tt qsched\_task\_t qsched\_addtask( struct qsched *s , int type , unsigned int flags , void *data , int data\_size , int cost )} \\ + \item {\tt qsched\_task\_t qsched\_addtask(struct qsched *s, int type, unsigned int flags, void *data, int data\_size, int cost)} \\ Creates a new task within the given {\tt qsched} and returns its handle. The {\tt type} and {\tt data} field are copied into the {\tt qsched} @@ -1352,7 +1366,7 @@ The main functions for setting up the scheduler are: e.g. they are used only to group or otherwise dependencies, and are not passed to the execution function in {\tt qsched\_run}. \vspace{1mm} - \item {\tt qsched\_res\_t qsched\_addres( struct qsched *s , int owner , qsched\_res\_t parent )} \\ + \item {\tt qsched\_res\_t qsched\_addres(struct qsched *s, int owner, qsched\_res\_t parent)} \\ Creates a new resource within the given {\tt qsched} and returns its handle. The owner field is the initial queue ID to which this resource @@ -1361,24 +1375,24 @@ The main functions for setting up the scheduler are: the new resource or {\tt qsched\_res\_none} if the resource has no hierarchical parent. \vspace{1mm} - \item {\tt void qsched\_addlock( struct qsched *s , qsched\_task\_t t , qsched\_res\_t res )} \\ + \item {\tt void qsched\_addlock(struct qsched *s, qsched\_task\_t t, qsched\_res\_t res)} \\ Append the resource {\tt res} to the task {\tt t}'s list of locks. The task {\tt t} will then conflict with any other task that also locks the resource {\tt res}, its hierarchical parents, or any resource hierarchically below it. \vspace{1mm} - \item {\tt void qsched\_adduse( struct qsched *s , qsched\_task\_t t , qsched\_res\_t res )} \\ + \item {\tt void qsched\_adduse(struct qsched *s, qsched\_task\_t t, qsched\_res\_t res)} \\ Similar to {\tt qsched\_addlock}, yet the resource is only used and is not part of a conflict. This information is used when assigning tasks to specific queues. \vspace{1mm} - \item {\tt void qsched\_addunlock( struct qsched *s , qsched\_task\_t ta , qsched\_task\_t tb )} \\ + \item {\tt void qsched\_addunlock(struct qsched *s, qsched\_task\_t ta, qsched\_task\_t tb)} \\ Appends the task {\tt tb} to the list of tasks that the task {\tt ta} unlocks. The task {\tt tb} then depends on the task {\tt ta}. \vspace{1mm} - \item {\tt void qsched\_run( struct qsched *s , int nr\_threads , qsched\_funtype fun )} \\ + \item {\tt void qsched\_run(struct qsched *s, int nr\_threads, qsched\_funtype fun)} \\ Executes the tasks in the given {\tt qsched} using {\tt nr\_threads} threads via the execution function {\tt fun}, as described in the previous section. @@ -1404,7 +1418,7 @@ any mechanism for yielding a thread if no tasks are available, i.e. the main loop in {\tt qsched\_gettask}, described in the previous section, will spin until a task becomes available. This may be a problem if other parts of the user application -are running concurrently in the background. +are running concurrently in the background outside of QuickSched. Calling {\tt qsched\_init} with the {\tt qsched\_flag\_yield} forces the use of {\tt pthreads} and uses conditional variables to wait for a new task to be enqueued if obtaining a task @@ -1505,26 +1519,26 @@ The execution function for these tasks simply calls the appropriate kernels on the matrix tiles given by the task data: \begin{center}\begin{minipage}{0.9\textwidth} \begin{lstlisting} -void exec_fun ( int type , void *data ) { +void exec_fun(int type, void *data) { int *idata = (int *)data; int i = idata[0], j = idata[1], k = idata[2]; - switch ( type ) { + switch (type) { case tDGEQRF: - DGEQRF( A[i,j] , ... ); + DGEQRF(A[i, j], ...); break; case tDLARFT: - DLARFT( A[i,j] , A[i,i] , ... ); + DLARFT(A[i, j], A[i, i], ...); break; case tDTSQRF: - DTSQRF( A[i,j] , A[j,j]... ); + DTSQRF(A[i, j], A[j, j], ...); break; case tDSSRFT: - DSSRFT( A[i,j] , A[i,k] , A[k,j] , ... ); + DSSRFT(A[i, j], A[i, k], A[k, j], ...); break; default: - error( "Unknown task type." ); - } + error("Unknown task type."); } +} \end{lstlisting} \end{minipage}\end{center} \noindent where {\tt A} is the matrix over which the QR @@ -1576,16 +1590,17 @@ and ID, respectively. \begin{center}\begin{minipage}{0.9\textwidth} \begin{lstlisting}[basicstyle=\scriptsize\tt] void comp_self(struct cell *c) { - if (c->split) + if (c->split) { for (int j = 0; j < 8; j++) { comp_self(c->progeny[j]); for (int k = j + 1; k < 8; k++) comp_pair(c->progeny[j], c->progeny[k]); } - else + } else { for (int j = 0; j < c->count; j++) for (int k = j + 1; k < c->count; k++) interact c->parts[j] and c->parts[k]. + } } void comp_pair(struct cell *ci, struct cell *cj) { @@ -1621,19 +1636,19 @@ void comp_pair_cp(struct cell *leaf, struct cell *c) { \begin{figure} \begin{center}\begin{minipage}{0.9\textwidth} \begin{lstlisting}[basicstyle=\scriptsize\tt] -enum { tSELF , tPAIR_PP , tPAIR_PC }; +enum { tSELF, tPAIR_PP, tPAIR_PC }; void make_tasks(struct qsched *s, struct cell *ci, struct cell *cj) { int j, k; qsched_task_t tid; struct cell *data[2]; if (cj == NULL) { - if (ci->split && ci->count > n_task) + if (ci->split && ci->count > n_task) { for (j = 0; j < 8; j++) { make_tasks(s, ci->progeny[j], NULL); for (k = j + 1; k < 8; k++) make_tasks(s, ci->progeny[j], ci->progeny[k]); } - else { + } else { tid = qsched_addtask(s, tSELF, qsched_flags_none, &ci, sizeof(struct cell *), ci->count * ci->count); @@ -1643,21 +1658,17 @@ void make_tasks(struct qsched *s, struct cell *ci, struct cell *cj) { qsched_addlock(s, tid, ci->res); } } else if (ci->split && cj->split && - ci->count * cj->count > n_task * n_task) + ci->count * cj->count > n_task * n_task) { for (j = 0; j < 8; j++) for (k = 0; k < 8; k++) make_tasks(s, ci->progeny[j], cj->progeny[k]); - else { + } else { data[0] = ci; data[1] = cj; tid = qsched_addtask(s, tPAIR_PP, qsched_flags_none, data, sizeof(struct cell *) * 2, ci->count * cj->count); qsched_addlock(s, tid, ci->res); qsched_addlock(s, tid, cj->res); - if (ci->split && cj->split) { - qsched_addunlock(s, ci->com, tid); - qsched_addunlock(s, cj->com, tid); - } } } \end{lstlisting} @@ -1672,25 +1683,25 @@ straight-forward and shown in \fig{BHTasks}, and the execution function can be written as: \begin{center}\begin{minipage}{0.9\textwidth} \begin{lstlisting} -void exec_fun ( int type , void *data ) { +void exec_fun(int type, void *data) { struct cell **cells = (struct cell **)data; - switch ( type ) { + switch (type) { case tSELF: - comp_self( cells[0] ); + comp_self(cells[0]); break; case tPAIR_PP: - comp_pair( cells[0] , cells[1] ); + comp_pair(cells[0], cells[1]); break; case tPAIR_PC: - comp_pair_pc( cells[0] , root ); + comp_pair_pc(cells[0], root); break; case tCOM: - comp_com( cells[0] ); + comp_com(cells[0]); break; default: - error( "Unknown task type." ); - } + error("Unknown task type."); } +} \end{lstlisting} \end{minipage}\end{center} -- GitLab