diff options
55 files changed, 6299 insertions, 4613 deletions
diff --git a/openmp/CREDITS.txt b/openmp/CREDITS.txt index 67b3e9e3c05..c054358b472 100644 --- a/openmp/CREDITS.txt +++ b/openmp/CREDITS.txt @@ -12,3 +12,6 @@ N: Intel Corporation OpenMP runtime team W: http://openmprtl.org D: Created the runtime. +N: Steven Noonan +E: steven@uplinklabs.net +D: Patches for the ARM architecture and several inconsistency removal. diff --git a/openmp/runtime/README.txt b/openmp/runtime/README.txt index 3880bf036a3..6ecca7f64e8 100644 --- a/openmp/runtime/README.txt +++ b/openmp/runtime/README.txt @@ -74,13 +74,13 @@ Supported RTL Build Configurations Supported Architectures: IA-32 architecture, Intel(R) 64, and Intel(R) Many Integrated Core Architecture - ----------------------------------------------------------- - | icc/icl | gcc | ---------------|------------------------------|--------------------------| -| Linux* OS | Yes(1,5) | Yes(2,4) | -| OS X* | Yes(1,3,4) | No | -| Windows* OS | Yes(1,4) | No | -------------------------------------------------------------------------- + -------------------------------------------- + | icc/icl | gcc | clang | +--------------|---------------|--------------------------| +| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) | +| OS X* | Yes(1,3,4) | No | Yes(4,6,7) | +| Windows* OS | Yes(1,4) | No | No | +---------------------------------------------------------- (1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are supported (12.1 is recommended). @@ -89,6 +89,14 @@ Intel(R) Many Integrated Core Architecture (4) Intel(R) Many Integrated Core Architecture not supported. (5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0 or later are required. +(6) clang version 3.3 is supported. +(7) clang currently does not offer a software-implemented 128 bit extended + precision type. Thus, all entry points reliant on this type are removed + from the library and cannot be called in the user program. The following + functions are not available: + __kmpc_atomic_cmplx16_* + __kmpc_atomic_float16_* + __kmpc_atomic_*_fp Front-end Compilers that work with this RTL =========================================== diff --git a/openmp/runtime/doc/Reference.pdf b/openmp/runtime/doc/Reference.pdf index 60ce4008d6d..680f98c0faa 100644 --- a/openmp/runtime/doc/Reference.pdf +++ b/openmp/runtime/doc/Reference.pdf @@ -778,11 +778,11 @@ endobj << /S /GoTo /D [521 0 R /Fit ] >> endobj 523 0 obj << -/Length 252 +/Length 257 /Filter /FlateDecode >> stream -xڅMKAwIGQ(voұt-eSO!XY]^,-ԯ d95h^cyմ]=C:bCؠ!B>'ĺCp2(zNF1c$K|6#J|(oVb*_6T~BoCeuȠLSdٚ+}:kLMn0? Xd--YBm~^rbgu
<l: +xڅMK1aǙI&=("{SƲw?j]ia&AVSOx"D$zV'%ւ$M_Cu1D48d%=',XvDssus@T=:DHM[fSr^n~ܘҢA28TlȠ,rǛm^p/:7A#Oax endstream endobj 521 0 obj << @@ -800,16 +800,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 529 0 obj << -/Length 1187 +/Length 1184 /Filter /FlateDecode >> stream -xڕVY6~ЇRZK]d
4Hh$*:u}gxȶVh'fs|s{{z]]nR/6ve4Mۖ'_WooNQ/<ȣ+է/+AޣAɽgY{Ii]yWYPv{㯣,'w k7j75B`h ;Cu45&~iQ觔:6Pu++ߚ1%Gf+5AaJ~R!%;7Y;YtT!^.{<aޡG۸mL1|w !_'l - F,9&4eSJINJ%zl@ -2S$vZ -7|IwABcif`;SKt܋<MJ+ɨi{ޅ4m[ɂV`! (G"!A@pߍA)Ԫes@YI'+e7G!dca>nFBTغcȦא.*dtq09Mqqm68/Eͻ5쮹2nE6 Zgc̢n5|_mKfvnVCR66k<"ص/9; -56vR:}8
]I@ini4H[
n~ѓeЦRT\n~(Dv9}6;;w?ܟBE:,Ujfq .~}`[[`E
PƮ%TXM;wjm+!M|/-!+s;<fT;itKDK#2Il+{+a4ģh
F(XN*^a $i| -kqD339 +xڕVYo6~_! +L]ĉI@ZwHFG,4퓆399(m=ݬlVeaIim^^!M}f}-EVQEzUx5{$L{֚fI Ѝ}E~F!q7W:v?VQq:'v2cW9 #~+E;{lY`[`J5X "2Πwg=k-Um}Zf݉SNU:ɿw>ـfz$Qe9:J㽽7 +|j1uJHhͪaxm$p&V[xf}]=5Iz1|[t +iNhN惁Jiئ++-S/aγvJn$RL,5k4P!y%Wx6|IuN\cif`;SKOt܋<2ɨi{߅4}#*ۀG"?'YgpYqýE#S(hUg
y@YIǷܚ+z +0uT7J!*Ml݅?mdrvpkH>
Z~z8~I8{f6Aռeݷ_z\7p%-ijOĆ ٘[
77+ezr̥)͚h8v닶qSFik'x?!ӧ!Mȥ&_,ua"g=-]n٧Xm*UDgHݮ8#c>wVugǻcH%Fmլ0.XEï6rmksQs endstream endobj 528 0 obj << @@ -1058,15 +1057,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 609 0 obj << -/Length 1208 +/Length 1206 /Filter /FlateDecode >> stream -x]6++&LYb7ðXk0Wav= -2ƫvommZ$64&zk(*HH -gx;LL+cicw -ŰK/RYK+5=76ĸF, -ϱfc̶1 =8|j>rΕ078LjOY!#s@k1КƏ Xh4qՑVж7 +xOs8:z6lg6Ca&^O7+@άk^=J@͵ˁ]!(= +āBlO1s+IeETJׂsQgywۦJjaWsjSΠTA2 +WV"zagܞX$Ȣ443FǶ(0C@t1ӃԃP;D
CGq5MVWhFxH4*54.mJG
C-xk*'/K"+-E0}meim|ō!+ۮ`7[[<FR$F>&ָXF>QRpgfXlX3SEdOUg&ه*n\B9L@ub!V8K%CY7Q>ņ,06of$2#3M:
3Yϫp>tȎr$wd(Xt~W:z@ЦSvۄZ8[r7qAZ±i|(8fr0k0_K˂8H{xZP\m7^O2f㯱z\7AZKVPbsՖ\:55LE_ZeX|v,>Y=41'LY>ĸ,{핑hYMʼLq<F2Ŭ?k)O5~ + ^ao~`Rlda|G(~^_z:Ź2!:f +w{HumEK]Iݯ[U'y7+'</¤_: endstream endobj 608 0 obj << @@ -1362,15 +1361,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 652 0 obj << -/Length 1113 +/Length 1107 /Filter /FlateDecode >> stream -x]sF+.\&M2ʹIsggS 5u} Kk1bŬ=E ~:NsH@j\{o>}~/^$)go3l[>0g_X> --c;ؓ3瘩&381LF\3""2]`H>#1e4br=ljb-V&]qf^'qrA1%>5C1h̅GMtm¥' 4w&;vIz2]jtҜO&wyds^xI3x -#@&X-z, -鎠iol%ԤvrImSs6'j:Ǒⶹ/'GsnjjXBxWi6iM%*0?x]<JO=BƬ<1Q9devms?uY}T+֛x6i ҉Cbvӵ[m"ZeAZ-zfYUgӍo۾"k9KMXMk}7s#wIٲ~ZA>Ow&1j
Bt[vog`#VQ>:|F݇LJNEQk,3o[ϰIJMպ$Nvvc/ceNλ0'8{|L5swO/0MG^f87R1u*20
m&CXhTMzJ%QϛD=J -MJTr=T*X8\BE9H;'ޤ&}lőbgٝO.ܬn駭IC; m%U i=HG}UsJ|ާy-m54b|ᾼ. +x[sF+.!mL39f*!$rY"O\ÍѢ~bt9PPAH@j%~ax.b۳z"Dg +āΨ+R(9fZyAzx
>8}1WsE9uOz-U]XBezra{rf3dg6A"ȟkF:S}#䨁S:HQF#&'XI\mqSF-6+beev(Y+S_S3hCawI]xD D&],]zIs56R\x6,l`6$8 +턴T$V|՜6}ȡϧ}Bo0mYɧp(8&qRI endstream endobj 651 0 obj << @@ -1666,15 +1663,17 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 674 0 obj << -/Length 927 +/Length 925 /Filter /FlateDecode >> stream -xIsH}zz_|TRYflnN¨-S(}^xHThZ~+Mf"JdUiRH[EٷK "0c~gWG[`JW/-;D0]73WHH -NVNt -uGQJ ^+IpN9gM:L:ݬ\^'͐_
R)lhubqhN5VZU9 nƥ&vc<
.
<Ox
Q֗K#!
\&[j`sJ̪ڕOUtY@K5丑Q%ARF6UTX/AzDY&kÖ%S*x$qW-R9%Ng}5قevAy*bN|1D+1aS3WM ]IV -)kֱVЂ:z#9uC>e5-H~0̲߾(FjJ9݇|vNzpA=aفBX$$T -~/Ipӎ{5n7.o +xIs68ؗędus2eN,%:y⚤TGn3S;$=<x+A +QfbˉS@Kd(Z#8-gEpwˏ?,»W;%J׳-;Dp43H*ApfhV+\uO;E(o4#WUGD4gBp|:ќ_mu +I4WJ=?`C01p$93D~,/"M oUpR1diNJxQWO#>N/Hs59JʪڗO=<UtY@+I丑15x1NqR}U*mQl3ю=4EΉcrlɌ<cƯ|d<bW*gTB" +5ӿ"f +x1;.(oE\C̉o*hE5&,zՐ@H7xz.@}FM!bCDY2T 뤪t`)2$ۻ낢¶aQMOk?8MS^<4c} ݧiٙ裂~tʚw -N>0a;bPuwOdUM"<.fw%j-Qet;0cF% '2f\#@dr/a~$V{ # 7=4@F9=(%%TvGoqϠ;Cu.SHn +rMf
ܗI72+δar1{8śzzW}X_h䌰iJn}m^gk +-(PS|ێ\5n-4._oW endstream endobj 673 0 obj << @@ -1885,24 +1884,24 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 687 0 obj << -/Length 2637 +/Length 2634 /Filter /FlateDecode >> stream -xڭZܸ
(ïW 6MhPx#{ΏKEnjMˎ-QEH~z"
Q$[/XE^ -q:b0/NDaoz/?K1.@ZNLѼk)NWM55;l_~4 pD(ozK00&'CT(YP{w`MDKCҋ#V"uuբB]@4~*)k4MVuG#m8B~sMVk(Y+z4_l6i"M,띶 -Xs0n(Ѣowu_o4UeepVn~;
n -MnĊ44*/-Xw7r'HQc,*o0.<Dl!,D8#:²YasMpaJH'2H7eGse~Ĉf&wĹY﷏YBogHDTCL- -kY8tFZ'>!pcP:vyN|0x19(ڋY#]Se{,,C`80!㯖Ɯ7+%Yg"22#Qc_>gFN[C=|B譫XdxݎPD0L玁ޭ -}wG!thؼsFMf^C:PeFz{:z1urmtO{{h<^h'wX -꾲Vu$}rPdr̉dQ9rs){1!nFI!.:{c^m[qb5hF{7u5
jИ&eZ8R[w<x.K&ᗼI~f!h-%hhTήÊh[mVrrˡ)!ξY`^ͮ, Z܈+6p-fЦLq`k]Aa08k4.F/`zQJvt F!]8a00m{sˠ\Hn rZ
'(tuD9g6 -;,:ꗰ)xiݡl'Jlk)a"D4Aq-pA+Ks&^ -ҳ*{x -Z4I/ -e\BFs/b(y'(Aq} I"ȋ,_YT9R8bBʋKƢiv9aB8,ͤKKIJ8Vβ425Х&4J*S -2^0u!{5tMFo=˹Ql6$1"%CmM~. -
(P?OOt&G/Tr[㈩οx -(;yR@ʼn+ SM. +xڭZmܸ
HQdKk+KCI&[Er(c=g{.Y%E/3n6/;DQ"
/~ɋ,Rű.$i{ID,{Zt俬{S}PQZGQٛV\<2/*FZ'BTD˝U^yZܹ7\ KOHUmv ~d)w^i(V彻E0UBOD"$Kb)V*MەMݡB[h8~4%SF~0{Sж[`bi?fT&͆8M$ݴ܌_n
ϚlP*b-ȢλivG6 +eh>*y]q60sLU\hb[E, +l@oꢬoJEey*#)GiI u* +CpaJi'"#&(5j!?T=Ylw gtpjpȞ[-|ƘD\I L4@2"\bg@ҫi MB+wʱ+ +ҍ!XA\^"P:?u3")R=?}aP:jiy$B}-|ԘϹUfoѬ́^>!A^7d,|i=~KO7P,T(掁m +BgS}_WVҊ_QG.*5h9^xEpY:4l_o9'ռYr;(1Tّ^^@2w3ZsmyLJ{AM~rSبj~ĭD}Tݓ+WfNؑk/kTV=Y+c"8X?܌o^]|c^t5@雦[yCfiHLwGjcT=%"^f˒i%G9 4Y4G*upAxk'Ų"&bq̊ͷL7۲fy[n#[!LIoakSCA
QQیb0(%P:ӄD\tM}kƐ0n̠ZHX7a9Hu[ +)$3- +<%H BsPqhw=:J)!exFqb!KʀI$/H +8\BX$a]Ґgivh7 1_ +Z9dt8l! +o~( +(<)PM- +^|cj3[fgp661v@BNeTe9tËwnrb@wV4"6D7*PÅq=Ğ/~6Ld SW=4Y
).+Ll1nrYanPNFd_(|Ɠ0CNzd˪2Ւ
q=Po&=K]϶XjTc=ÖU_]?߶&/:- +ã;?כi7ZC^!oH[Somi0,
C܆}w6ԨXkp3DHtB;ɉ4NE¹fK=TP4K隝`@WX<dbԲ,2*TŦH1?aDE5hKzٸ~UzdO#jNW]FIli.EY}OV~G:?ݛg endstream endobj 686 0 obj << @@ -1938,22 +1937,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 699 0 obj << -/Length 2939 +/Length 2937 /Filter /FlateDecode >> stream -xڝZYܶ~_<Rx$őʮ8VʃRqIKrCM*=}r<
Fu9:7I}I|/c'k/VM|pu+o۬]+߽瑟,70L(J5-p7W٧W~v|/اQ0 -(]9qE
cV͛z}NGCMse7ꚳOe}nznUMi┛K?dUu/'m"~ߝL;NHFH]b{5yYUCäf}Sİ5YEvk}-C%zVh^ܺ5+Az46ؼC;ˇn\ֹiUv -PDP,<4j.?Ȗa
mM>
d/_oznPa30ZIuNё#G^c "p)]UKܢ5]x!NYK/_Y[f@V1.(bO
[ -SC;{`Ir= -% -7P
Nf^jn9Lalv2GƃI ->N1ox ORX@32 -B1`p%LܝzK -G/Q0 v}df(dK,rvtr?ĔX2, 9T`f,:[J("+P4ڻp^a<).Yf&hFX/Zah -Scu+Cf4[/*tppeXgĦms=qKW+& -.N:'c'Δ"W?v~zʍ}&ΡzEĢ;>g -Z/* D`e!vAifi~?cdž2D`굉KI +xڝZYs
~ׯ`hy>qV6U"{fXcVT{p5/Qts\`J4|zoŮDʉ<뺰>۞.U+oڬ]z}#^,럭 H0L5-q_/<s-od$N+?]|õ +r?M;<YA;aC>]D"GLB;oro;D\ϕupkN?1U5)~Ȫ^&["nu;NHNZHl,"kI aZaWpNdzuޗ`ay{qF*lcX**.qZ[Vu酶8`$Ü:!Zrp^Z~g+x*a/9@: + +{RZvquNс#vcs8L#o?p px˛bEJA0nb\Y'QDf
[= +g]CI*sSGC])zNo>~ie4'OQ +;A +a+ +|VAo1)0ziBO2]B6TY}Ӱ;>`MuhdQx}4 +O&MfnWshP2$Co9|!k- +s*-%w$E89л,Tsi)ƾ"}9J[q9TdӐ+.7 #b`A;PqltP1!;.4`lƼ3Uff)ln +|,F!%zSt6 endstream endobj 698 0 obj << @@ -2017,15 +2015,22 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 722 0 obj << -/Length 2187 +/Length 2188 /Filter /FlateDecode >> stream -xZ]6`fg2X -w`QRQd?܄V}MZwS&FJ -VERDըt)-~./@kHG6HM!Fæ`F3r1hȀ(JzǏ|taHn4l_#(5)6%dU/ԲVwnfé1_g1=H$>'q-1Weўu_ڠM,.faس&vE.&9;H^<vn -f]HB,jE9ɚB=KhSRR4ޗmSu.Y+tjf)C|E EO.}(,7~O<A}OmtXb;CgUӕ-uma-9;gkՋ-¯?~MUU l -LqTk=U0f +xZ[6~_!`ތRE),LM&.,Ӷvdɕ"J{d'HC?'/l <ǚ,y l!k>Lf?ɫG{^<ɰ=.qp8(Q:K\=>-e?.YQ1!8#\sb\ί~Bl)Pmvx{gh-oX8o̭b`Z~*ka"PGmcaEQ=o_^YD|L]8a~074t#p5u$ݓIFQG*a2YJdK閲ek_V:v7yNvQ!iy>Ӌg6s}o +-udqvET+*$e&j:2&RZdpKIJ-Qlm%qU`yۮ_1mbz'.[I*NH~v*6NTdU#|tQe\BЎg>gȳ#%]b{+9`܀IQj +A8,H {?=o rQ" +gۢ|44)?QKrޖ|؎U2&|ːI,**jDk$MF.TTiT +3YVou(2qZ@J+8ڒu [ +o^j|qPM
KuN]`A1jZ),R6-e>k4^)0?uVS +X7VwY/AlH d=(ͣ;)筑B͓I o#y0If4sqWhWê(Ԗ +=w8ߧjłꝁuZ>Z&?(cR[Ŏ+QHblC-}I&O-Z +F@gJt:f&1Da]OkIPc\(P?ZSc ͖cJPJcV"3<m`PVkm!a,U/>"5cWӳsll>J(M-0:Cti3E-/84ΐInte`FrXqٚ6}&|us<jW_ooo~VU榒VcX&D5J2y*ϠU=d
sMPypeڠC@ +~LL]Tśb;f%@l WQڅ*;Xw:t>Co{v$GGbcAعx8>|$(%Cm?j +;ZraC}DC\O Ќ4(z`, +NQg(#Τ!-sgdљSf@Lx&pnMi(7skcƇOiLo6\ރ_vL1ԗM'/DP9jC}0xn^">Qo+4gaAk^v>il=#7C%ZLY? endstream endobj 721 0 obj << @@ -2147,15 +2152,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 741 0 obj << -/Length 535 +/Length 534 /Filter /FlateDecode >> stream -xڝMs0{t,Jt2N'8NiῳL\"g%o\M|hp#!e4.bv0Ƿjez -J9ڑMk1:No'm:`..w -e{%j%iKZ<2iQҭZtnLt5;]"lO?-}ۻxGa'`h?X~ա٨qkށ
`:鷁/$4&-fx- g给1ӬjNmr7bRMW-jP7NmQUk"pqQ*\vXUT,?7.M잿 -c8zhkS#iK}/mnn=/E]MpFl>RbUX2,_6ai㋏ - (鷬UhmT[bs+iQN⻠Lkvv=,j|qxſ +xڝKo@st +Q[SENi-'8B|w^)jKvgv?508L&K0`$ːE6]oWn7C[TʒLjgp2 |o)kъAFgP&7kDKگs)`- PTd魋k#mιFH0#K4p*9yDT~U5\980(3 +J~$nɳH3Ӽq6+]_2ڸA֮*I*jt7lLX(z -f1zjJ$..8X5Wy5TܷJk?a_\l{ʯ}>OOѿQ7`c&+\V.3)zZ~s~å_v\Y2V nJo-* +a + (HLm[Qb.E~˔rryϼhǛdu'I1 endstream endobj 740 0 obj << @@ -2173,11 +2178,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 745 0 obj << -/Length 322 +/Length 319 /Filter /FlateDecode >> stream -xڕQn0+poc܀C +xڕQn1+|H=XQPQns,!ЎZdˡ=N60"%z
yc$kȜ1``C 5EOoMcMZzbV#9IRZ&#)lQ_&1eUy|}7E=Gz/ir/C!W%y!<"O1',d2CXſ1 [܃Ғid<lF0v4LXҒ JE$3uPϏaw;T9mNa.se\u[POԚotI 5[G9$B"}?m@G> endstream endobj 744 0 obj << @@ -2295,13 +2300,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << -/Length 301 +/Length 299 /Filter /FlateDecode >> stream -xڕQn0+6Ǫ-**܀4"ATvgv0%w}t -,uZv`Z8N5,ebu64Vg}s^§7}Tr!#_YK-Q!w3@*YT*).`AGS 1hمACRQ`S_f<fXSX921tDK9&u3Ŋ+/G__qG.8rF3v -Q߾傏Saχm 2L.lN&˾'8ష"y +xڕQn0+6NJ 7 endstream endobj 763 0 obj << @@ -2362,11 +2365,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 774 0 obj << -/Length 302 +/Length 300 /Filter /FlateDecode >> stream -xڕQn0+ǾPQ>
8P<h*}8AzixfaSrD
Vk0 A"bHJ";+nlX.f*:u<r/<
]䬥K(b YT*)<.`NGS/1hم^CRQ\SW&k]U1x:l"DpGԺbɕǗ_qyGwa;GHjeKD1~V>rޏU+]~ڭ0:κ1:۞~_~ +xڕQn0+6ǖZp +gg J+x#/T&HG1Ք-\#u!TT>7]|X'>DDb|n64\x|zs7G9bQ.XQ߾UylNG]?fYw6<>e|+
8dy` endstream endobj 773 0 obj << @@ -2428,24 +2432,26 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 785 0 obj << -/Length 2709 +/Length 2710 /Filter /FlateDecode >> stream -x[mOWlʚ;媤UU*e_X 8KͯObArayg{{vs緡 -d0RRzAH$zq=c:l
]<ⴌ$Kuo~"{R{է_g?xPy!OWٕd5dU
ɀB8..prno0@YT2̐"3JWw]rDZxD F/S[`ؑ&<)Gl=Zen.QH&75LP{ -Y]TYF5 v*^T!u54/-cAP_ҥkJ{" -QH[MҚme -l(QgcJ -8Uܗ q\VA8T/4ŁG(Y,[ -fׇ%XlѼ͗])v_ھ$GG/8(eVr?ʣ]\'~^O< -DRMs$\P&`ϵξLi:鳩%QNmT! ?wShg?6ǰLUiw+W=I@!E_/;}=M?OrjsrHi#?Ɨ&Ay3uOC1a,7=qjcH@!EۃSr;Vxi5Ƀ6mFWh r
[/W|BnVDUmGQ~ohb.lBȜzt{XQiWD,#b(
6O9/a&^N XFOOvON-5E7noyO-'C)2m&nTMB{`W -K8ej]:6}E9uSIv=ߡR"΅j;z -D"I26,| -:/`<wwS43ެS@lc'pe -osF,κ\DULso*O'/&(z%8r"pUZ{,RGS8@aZ]D?Kzxn,gz.8{J1Di0pJKײWszÆN&4B}i&=s5lձcVsU{'*hZoNMO -wT7$n<sH?rM_ =G?ðp>tohqOAPꃝzTR5O%C9~ŐT 8hU7̓U(5?FWgPE fF*H3I=/hq업}^)+]Kl8-leCToFFw$LY
<,h$H$hFp+[+OS`p%.[%Gͳz -L{ V?v_FE\]MQ܀ȋ?ъsZ\$&F?-t^>"@t bXfϊ qpN=2vfs7?{{CRLk!rw+?VL?O2CvT1&ULv.+{rG:䮱|tSpQ +x[mOWlʚ;媤]l*/[V%_bArl0t<3{{vs緡 +d0RRzAH$zq=S:l
]<ⴌ$Kuo~"{R{է_g?xPy!+K_j K" +p"\\6 +$2ta$Sd!ED[gj划v;NÛ@ +B;_оLc?
Y>D`<1A&D!.\ +h +^*{{ͰQ~ezMw;}fJčK2T%yvk&`Vo,mj]jhˍǺUߖzOk}ҎȵG[F ++ bcU/4ŁG(Y,[ +ILYj>-$~yk}
#ʧ}qoݻzVdmV@ aȤD;{dxK\M˾1ݗ +f%XjѼ͗])v_ھ$GG/8(eVn5~G!N*Nm +>CM!bBїHa1BEݲ70$Doy\AM&9\ +y6x +HZ$Yb
hWtcD<s<^U!HOPE\e6t2H,pTO6q+XԮYf6ߵS>QACzEeuJՇoz>֬ЎAPL[7fe. +{ \ +,h$H$hFp+WPJ]J7#gfP`OK%O2*>$BǾn!]8uJml"IoGHџ.AKOa0 +!uqwz3*c~I}hBR\-n:x{HTH$ʏ+3B2rD0q|<esUُ]]#|Lto:)ƿIpP endstream endobj 784 0 obj << @@ -2500,13 +2506,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 797 0 obj << -/Length 1151 +/Length 1149 /Filter /FlateDecode >> stream -xX]&}ѮmUUwF]mn^U$qY'3'ʹܗ@.~A`~\yo04-HL)IF `U?8X$*t#㹨ڦރ( -aR0J[y_=,IsD8x_({`4 H)g7F[!=!JB|y7N>ziI~H[=7Ѳv
+p\ `]bTkA'ֆZYIu`Lkto#fqwD[vS)W5~*U+e0ܱƬ^k6A-l$$<8o0E, SGɈ0?!p,xˑ}|D12U| OxU -
jN;_d|Q-CktOvx~
+xX[6~Wk0*ΨV楚YE@֘LfZ/9||A`~\yo04-HL)IF `U?8X$*t#㹨ڦ>ރ( +aR0J[y_<,IsD8x(e{`4 H)GF[!=!JB|y7N>iI~tO[=7Ѳv
+p `]bTkA'ֆZIu`Lkto#fqWD4MhVoW0'U ĨZ))5fZd?hdqk}$1S(̒0U~Hû`IbNk^G#]ߙ@tQkqA`B3 Ul㡤4XDIx'rkTf0&!l궘Ul/ գ&νv2.뾛75u>Uyz7A-n>xh}w @hy
G &qF/"&`R1}~]uBmS՟E*FX_*Qe,>͋MPg;Й[;uSi!)GCt:+-CU\C+w3fx +dj1ޝx>SY oLmNfoZ7i
z37sʰә7U`E_t*&/S{[=Dw8 +hnʍԅFSPed.ۺE2 +jxA:
V_v5& + endstream endobj 796 0 obj << @@ -2545,12 +2554,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 804 0 obj << -/Length 665 +/Length 663 /Filter /FlateDecode >> stream xڕMs0 -CTI,_9vfidlp!}~vyѲ+ q>ΧoB}dqfO-s= ]7ܽ3S+/TҮu;_cőLC*`yx,2(dx.Fߎ8)}|nx,ԗ\&ߪY&iWW2Y<SIeɲw*&Uu :+Q9Rg?<IIS:BJ@CZy:*S[dbK*45%{[ONu%$m3$.$A>m>9u'I[?XAORt4imzl
ۚ@BCG7oCCoC=D+3^O^fhfޙ }׃3 'hكb +CT 9vdi-0pCP +0q?Z^j{b];WΧg!jCX\IBqu<8Hώ֙)/uj\I[Ժ+őLCʹ,0(d{F_J0ţBbTm'm]i)yIAF7[,5Y9EK$-nGMN)
)%!dzr.;UG$aBIJ\SIZ\Zd nxēM_K<IpOs'I?X7@5h҄!`[qw4k8_
m14[
lRm}3111ΓIr89kfٛA 7>o {=z=8QrƋ=)V^H^^H^^Ny=9M0{͠ z= y=@{= y=8z25{05{Sy?yf~l6( += endstream endobj 803 0 obj << @@ -2568,12 +2579,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 808 0 obj << -/Length 640 +/Length 638 /Filter /FlateDecode >> stream xڝAs0 -CTI!rkmv&ܒ
N bW zۓdoy$\yb( FJ$ސQ #A'qFcWW6yvEm^5ҧA[qUK={.2ZS-$YW#}0GlG"2br+ɭcnbD(]);M?UNm)vy&2Y7]毣aF.B >wق0ޯ$ƸqNM[Z]BbQIV"P2&n(F/M5\uotf[w4-l0Y@g7Gq¨ؔuĭýq*UE1
ݾ8]\
bxDR;nIām '-&,80zz*Y(-8?4*itӘluP-gao<i\QYOOf=>ǃ/
.mz":a:6SkӹkEEI*0:Kkwۼq.(+R@W`/./EkPtAPҐC~ϘNmT+ /Vmj?ś[Y
6gfAD> +CTIL;mSnILA8 +ο@0d7'dyoy",ω&>I$bTIIXPIY@BDjv6urdmcrKa[aޗ{?*+EȪ{Q?Vd;5 B+bة[.4|ujWr~oY6]"җ?Uڴ)^Ì\DV >wق0-$ƸqN#P-@bQx4/_(RG#ÝǦCfy'
,uD:(B(NtZٰAp/3DTvr[#\j8*85{ +Ҙ +N"t
&,80zj,I܀
ʸAgABe=z +X֛*,Me=z +hS<濬1*~/96]1aTD28XJ{. +E&F)wW+..Y|_:ۢz<ZC#Nc:ZFNe]8od39;~}}6۽=
@G +nI= endstream endobj 807 0 obj << @@ -2591,14 +2609,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 812 0 obj << -/Length 857 +/Length 854 /Filter /FlateDecode >> stream -xڕXMo0+|umcjV[G9VQH6,_@d#9ن71,A2 fOYpv1I!b-QJEYnC* - ǜ>nUD,zUjgmY+d߀j,AͧX2Up{OP]iBDEV'1NcncmR+(&ߋN-&dh֍[ךzpu]2Brv2S\gEΆSĒh6nǘbb6ݽm*$쪹v\KbS;~bF~r7ѩ<b$|i1)To,EQ{zo6Ew2=_x$.@ӵ>DՆ-sVJx/) 'i,:}~?z1uU.˕&ͧ<p9][ -BXAIIi|Kfha,b
p m[$H$D*I*I*IHHo "#z_c8?ƍ -nP}p݃,TZ!ֶVn;7)nBqsvpZ^RW;.sDhӔF4=jwY̯Neշy3{R֛'C.u˃0 +xڕXo0~_GZg>N[U+*JЂIQߓmЙQp5afw4KIʨ,'~vM$1D>nS<zUjmY+|M~O@cRRc&ݵ&e<YdE$Ilؐvڲ+S+CdqCHq;ƢZTnKZCH.ۀs4vg?F9b,Xǐ'A#f6m*tRq.{+̌"r7ѩ2,;cL@oYEQz/vEw2=_ +0O endstream endobj 811 0 obj << @@ -2619,14 +2635,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 817 0 obj << -/Length 1078 +/Length 1072 /Filter /FlateDecode >> stream -xڭX](}ϯё&0`\Vj;ڏ[ęXM.N쌕O|8\=B#"ni:zw -p*e+DIʰhD"x}lmΚ*/$֤v -MՃ#RX1ѷ-/8U"M
ݏT$qĪkf?,V*kmbXk $^"y -6>63aaw&$GLD +xڭXَ6}WQwQA[h--%Wgח6`@ޣm, FP +@rF2:uUy[~ +jfDt,6e-+E&.WfS&J12]a(Ya*1-bSVao(79~{i7UUOzA&ؙEQ` 57jRC&RQ̄e<$ze#8R}ME@d*VpU2`MIaw1g3G?2lG
4.#L<<@yPo_HF___z_YzL24Pu uJouJ_ubX3WUxo!p_Zh[jof]
!Tnu{jUA}****iӪ8*
1XEXEXwz81$٨}&ӿ1.)s!Kߝ7ۺr- jkG{Z[}7oG{EXV*dpE1V7^54+i1ʦcͣ^m}PpW:` endstream endobj 816 0 obj << @@ -2647,14 +2662,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 830 0 obj << -/Length 1374 +/Length 1376 /Filter /FlateDecode >> stream -xڽ[oHFZs}˅Vi&KjB&Vf6sI}H0bcmĽEB0oœBx2Hoxw> G=י<YNUGe_Lee\y;Q[gdֹ~{aĢXμ3c}N'FCT,=BQD_- -Ġ7nE>C -G!~\V<e>3WS膖!W_su6I|O"/!`K%0kՔ[Dfcg?irN/e_O3;c(tvz<]L`מFT{#롎E -r<WWV4P'qPUazb:tgazP{~n%XcL~O]UN'E^Ƌg+?<@aŴFT/=IoQ>O1z,1pww;f۠[K$]x'^cܭ-b&oxP%]%$ra^Uf4O +xڽYoF)!Pm̛%p5@ōCD"Uj~Dd0yIӳ3]vf8xpw9=@XL>#%D c &i!$q:`<Ba0>z*Ux]WI1
'{lq@J!E`}:*Z.3#cN(7U,BQL-µ`d@+UqWVg_j*X
Q[cEXTr+Jf!"c;Jf)ێʙN׀0XKmcoRzdz'rו_1i?5Ў51n?Gx?yw{1>C~ɻt<~5<*b<ÿnC11G^N+0[P}ƑYgD|NUuʵ^l$# N#IP첑W}N*w>W6gY>ۛTWB2??:[Yikܓ|8QGgoc6y6JB"\p[Wܔ`le(FxB9=A%Q'Qeb^b(*".aW{/cpV տ@0|9&UsR[x
:j?Sn,58A҈"FI݅ +Uρ%:ƽgq-ӕv >K@:nOs?W/3O[.NdL3(qILw3 +{階CF*E`JLۖ$ CGpY$/#wyv]>sҬԐS=[i|VJ$,UEt')NK]D~; +r~?g_RV7y_`:a{WsԜLzgygzGbYlj>ƦOglVUz2<%p~OLm}c>Mm
V|ýoR?AN?K9poQ aW7]{=e?1k$])}n6
lLnsǥ=U)b
m{u6/m-j^05~p endstream endobj 829 0 obj << @@ -2777,13 +2792,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 841 0 obj << -/Length 453 +/Length 450 /Filter /FlateDecode >> stream -xڕMo0:ڇԷcѵXa-V92ɖE/;"E_ 3Ar]ōĀUrC4Qh@QR6!&mͲPܱx*@>'zk&H4!vG5|rOTlG&V&'sZ9EM(V-\/V0t6}=]+quHHVLfh~k?~7gÀRvX1!l,Qn]TK8V)ڸc:9؏Cv}= }$A0BB!AeحPyD T|1
)Cʓ^ -v)Em -y?λ#*n\{ 8 jbK`,ϱ>MKiDzHu_p<\~ +xڕMO0>&5o#.**-"&4ulg KO3<7 endstream endobj 840 0 obj << @@ -2810,17 +2823,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 848 0 obj << -/Length 1057 +/Length 1055 /Filter /FlateDecode >> stream -xڭWMHWM&Jf'i&h cb[
6{w"hCQUzL"b6H)+ 6J!1(Z>`$XP5w>iܔ~c:pƳO3 -ާ10A)<A/ ɱ.F~'L)ш2Q*V.qy8n+ĵM!af}\wMQ|AМ,ko:*FGZw\J7eVԜcyט9ЗK0LzY4(eu/<Iκ -_ވPTβB3}*eai2sj -I+{.?e`M |EW5@z2ŗ,MfУ@1H:F# -7a=pJBaxw=R@jU*c\O,Ƭˉ`@J])uXqDb';SL@f Xt@#E!e
C4OC&⍭mRLӴ) \"pɉ'PXa.XSI9 -LQ̀d\0b='IÒC=|jcettFTH)XW4n,L8+CwgK -EX".[B8ќ6`}fD 1l[eYQ?+#;`v"v؉T?'NiN2 o -ow6?*vwivE\y}jl1_ +xڭWMHWM&Jfgb=AX[
6{w"hCQUzL"b>H)+ 6J!1(Z1`$XP5w>iܕ~c:pƳO3 +ާ10A)<A ɱ.F1#>OtGwYSe8T(&]pN !V6kB"qdk)9'Xz_u+UX 8l<1&ǹ*Xoˬ9Ջ1s/`,iP.W!'AY`=^x"\td)\>#eOpg>T1ux +n|͛ÞzXquą$&z"oԢDU50j56Z$!X*=Y1y +!.L +J5nEvK]on$q99l-r+43Ep$XBxL?V~nVz_e~"^N} ɻw/Em'&U-}ji_s-"Em<eU +8tE\94c/W| endstream endobj 847 0 obj << @@ -2877,15 +2889,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 860 0 obj << -/Length 1542 +/Length 1540 /Filter /FlateDecode >> stream -xڽX[6~ĊB[gL&nx2N=B},Ĺ} -f4o(\N.~X(WuPN`|@Q,nƶ# 939E*Vܽ}k+;.╩Laoe>{(K荫Ȱ\ -I,=&N@˩,1 -@NFJ-
WU' -&}e)~*%ad)-v T!) D`.KE2|aFR
h:<N[<4gvw6զMv7E4mxYb8';a.c?^EQRG]CG,X1cС,&ih<~yۉ¼&[qe:Lʽ-V +xڽX[6~ĊB[gMM-[e8IlmB98ZD8z3vZ(AZJG +DHi$nї#>Pğ봂?zrLD}qΐP42(F6qDZUIʣr+]I9 +ˣϣ?F؛vi/UD(҄; `CDzhpn"ޡ:B*фa1u7Ŭbݗ/ĞH~p(w/!d}LE\fsƳZ~jNٴL.W7Ȋ])#
VcB1TLa8 grfK八0q5cofb
B8y +cr7yGYywڨugx]trYB{Ni8FAU.VWoQY$@cc
FngZGad LE(}؊ĥx<ADV7ځ +o|g4#3ODumP0d^C}CavrA\BBV7 endstream endobj 859 0 obj << @@ -2965,18 +2977,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 883 0 obj << -/Length 2380 +/Length 2382 /Filter /FlateDecode >> stream -x[IF 0\c`Ifb9DH%y*R-lޫzq
pwOhddK0RP$I >,(]CG0]O漋+1y<=ZJHSD``Č(V.>}bD}i]B!D- 9/~^ROn`T/>b_D,ӧwI|@ -1RH+zZr|7K{eD"U -q˟}>Ni{;vRV;Z'ўmՑd}rd4)lws[w1Z!J-aSHG]=1LiCd#vGqGpz]x^ׇ%~/lcxP"@ꂄTlr;widӫ툯ձܙ:2H1
/hח%Prŧu5kR5ID4<mO<>5bu&[L4n VaƮ::iX6 -
VE])"H.hD'BCs,S(/6%Y쬞f}?8q(M -͓10=>ORT2;kӰ@1Az*^X ʶ}i=F@ީ4C G [8}(b4'Eo-#u)BR;u>-\&R\35\89 q}år& -{~,S^5;}o;!F O0EA
}>6d.^2ǰ,nfÀoe+jty/Q]K7ETA -O.'QB!Mo͐ނ;0tX }|Oa^OgXN_ [N|^h'{p{c| -Éc}7-e|ȓ%?&ϧ"j;cZ ~ +x[[o~ ЇJ@4;KAMSM2Trx(Ŗ93}gh=OFx))2I=/+J=1'xw=
UzcxJ4Ov_@`-H)Sk)߰~0bF{d+ nu>}bD}i]<B!D- 9
~YS/`T>a_Dd[bV!6#iy9܅IS˚DJ+Ow!*}Ma.π\mKD* c$ZG\#vW9cw`-eêmtJXIGK)GFbmO:&_+D "%vtPq'o&aHz]vem5y۞m&KAh_lSq$wWǗ_gocg䦷! 4 +]_CU!VԌI&eY.fRwr<R?LL"F:mui9@.
`uguҰ:lȝϛ'mF!R
]yCX5\ЈwO4EPfY2phB,0zsٚb$G1%Ύ2[0BMț&|wij4 +(#Mt<BK>7
4HYO狿?덄s\ m 1HҺ6hҙLW&d5l;caЌ1i]|%1=ءN!kKlJȝ-#)YIjW +1"Zm
XV4twAo%vA)2.d)@dr9Taq0hV#zZ/s3ѰC +-R~?tRB8tUSk9aOyg y|j\ +/~ZOgF?S\"{lxV4
}88sxÉi-ZO+`ط5%zJ%?E/,j;c ~g endstream endobj 882 0 obj << @@ -3155,17 +3165,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 899 0 obj << -/Length 2518 +/Length 2514 /Filter /FlateDecode >> stream -x[MCl`oR{v3"A&;}Y4nu[[r&_G%Kؒ^Zj*V2^#wUdI^"C:21'E/3I;0t*]OTї9wd9ׇ")QF@K)zow4b*k2Z~FxSDm칎0鄭wM1_3B+xceoEqH^ܘ6=Sqoɫl>tt:sAotTy?nRzF
oxO<+MP,1mUxy}\ۭ,JEwp.DFMË0Cp8R @l=wXL,a.ElHPnP&B{+b#?=vKE$;Vi S3GDJ3fHTuw VM9͋"v#RrLN40{,ޅN'L!c0VN-Q,/3imsq{v#7ǰxt,}$Jn~Bs~/u+m9ZuZ -16wk+r$UϼD+GK2ЛXVL?
!nH*jK١j[CyZn9,HkA1i -a|B<JF(sMEQSՔazcT[.CXvX8 -I,,R؞uVXaEIDi&I;8AUyrŔӬ+`%@7Hx-l -挓!nOC`e -;Lk/m)l_768;NFt4f*kav91NF2GN_%er -2ɟ+KVŮk.}w0pu3ٻ3]9Zʉv Z~.!*[[i%k6Xy˛#Pp9 +x[Kϯ C$`Es3b"ezSnD+>2/#
٬j +42R%Pi)e($xx~p$T͇-Û0$JܕX-ś,Ϳ8dÏ @K)2{\Ui4p˯8x{?1CVX|;6%A[#%)˷Dl>^<zwyV'?4N/QYR +w59TQ|ڂnTz
D! pG1i\ęWzIzTPHo~:whg@RFTX'ڏDUˋ`HQ' +'Hꖪ5bS#2x,8GLT ǘDT0l)Q_(LF5BFuCCR\6n$n#Hv4pHH}P[ImАJZWar@ء5Z݇*D4,gPݡ2.5C2.1b`ݯ"S10 #D'ko'?&AU<T; y65/`AqZo^ܝ 0ٲ/C,4v0T"!PՒ<1n-$P,;8 +A9k}4}O +qҿ1\DNSu0O紈ޑ%iY[Y endstream endobj 898 0 obj << @@ -3219,18 +3228,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 917 0 obj << -/Length 2000 +/Length 1998 /Filter /FlateDecode >> stream -xZKs6WHUޏSIMjSɎuIhXH/EdvDJŲGwF
Q4yLhՏ˫9X!1X8,Y)ߗ?'BI"uf576iݦ+'_my+si2%$\}&+9D8|37T(:W4I Wďh5&a8n
D/4]"[ܦSinNJ(1iTBkA<sˈ߿z -/? TN(J+?V+jBbD -`` 2I,9buIޟ>p$VS\Ym\tZTH8[k✚8Cs^%
̀%(D pBP*F>:N(/T;;6z< -!*n Xx\q; -8ϢK՞G~Ϫ) fQ -+>h^&[ެ!1ZzrgӇsPEա2릾
SIhUߋKOQݶe -O<t\3VAtp#t+|,cX
bcU@xAz;zbePqew}B -e]on=.и-ONY$A~o4O\I* +xZrF+p,-ǔSI9u]*$T@@tB$L,Y{^!Hۄ&?py⥕!V)\$T-'%]ʳŇ˟!31\rSsMzUy_
N>3si¶2!gI:{&K9DX|t3WI&ꨓg`'%\b?ՌqbC#48g+%MY0jg-B%49d{/7M"cL
eh0X-ݹ*cuU5aAno4 +&Wu{`i^_nW͂tڗKSI(4ī~&Zbc! +S*pf3b
s +FPƍowAZ:@K\ Ŧ8#<; x +-? TNR(J="~6C6'JD 5"pnhUcYNYZ3=V,td^LpY˙ Lޘ]dW +p2=ء.;9w=UӔ=:zQeʆUtSΥ`x/3p5&ljP<%uNcqIc%X7DM{R||;C]`wrGQRj}?Nsh
>rCm ZX[e{c* ++ڗhV*_g-ѻܚkk-]`oLmΣ~ +: !eѯH +?[*xSqo|W4\I* endstream endobj 916 0 obj << @@ -3365,14 +3375,13 @@ endobj /Filter /FlateDecode >> stream -xڽXKF+t*3h|L9qٕr 1˪"FX8ίO sAbnl_rd.SRfJS$IXeٜ|oM -inju9CB1ߣN~YLL,9)'#쫗d\2| -Ȓ 001<&Ms:>s\mO;T"pP%@!X`ٜQ#Cٜ`s -aK $qB12"Z118S
I&oK=re}2GJu,zĮHAYgV) naS}v
0: -<t2E9i18IR!NQ(A< -Mel@&ABp1=v7ogOؘδ3Bq]:OG+vWrII ~*7^8,zsy]LLB4,9"^&P&}}[Zc!a䁿btPPŐ>Y| -qY:I9R&/{g}k>t8F/c9_ٕqQv齢쪿fsXR`1DUH -ʩ ڸg!^nm$YTt-Epe=}to`}U['U֑;ҚvoAmm4f?Gsa08a>]hA'[ȚH6giq1mYzL68q6CX}bYXƔfybv8dUIH#I$In:2?9DaCagP\a6)26<|pk_yθ"\7I<xr()!)i;GK$Ѳ'~Ya1kn'BQ_Lг0$^Gvr<ýڍm}xsb}3dd⚑+7[dNaWMdz>wNq_na4d}gTĤI(~,b)rX$ď`CDa,C`Oj#E{`@~C\\1=XԳz*Ou<p,ܘ맍E4N
]j8))N;5kK%4 k_JcNe@(7}3ZumS^k|y6}އfҸ1LX"vvݙ#cT,G+`,hy?jOV/Ook/`]8 +xڽXK6Wh,s$Nķ$#\2-YqN/LAGgg&.&"ˑeLaK)M$b}r$gs5*ܿ3M)ϋ7 @ +:m12!3W(<+7qgo2γ^rqʸSVg&N1d.G Kp|c.\ʚpG +7mWM7lC% +]^8b:D <@ZL/ιB~'#)*ePَ#=d*D*GpK QW*s[]ͲGjY
~ub f)ш1շkgj +]EPQ&aT#CbRe?լaȑc7JO5[2b@P +y's'pS*(OT*3Ə1NʑԖ4!}yp{Z;Ns9p4zq]ˡʮ?KeW=w}9$BG6lyvYěIum(5;#b- +4غ`{
o5`T) ٮژ؆&)vrKclXhZqEO_sƓƇG<R۶ل캎\14mUuDa;;#{cx7R9HP!CЯBqzI1MA5A@Xa8ZGFVU]uͮ^jXn#jhN#o&Ztfq{dsVtu`ض)dsƹ6P_6h#m3.=G6E`Li)aÌM&OX$TI8m9DD;{\Xg !l(k6,^b&EƆnk2RV_v&/u߿Tߛ4v=5%6'3
yX}h$Z:1,fm
D(]6 zqqdH ]]CwV۱ϕߔxڟMr撙L6L\2q}̩"좉VO'k15ƁJTЖQ3 7E4E.%c9cz<EXOcw(I-t|ȯ3qPƢGzV6=i|@i1~EsɰKMX#1它>ib?\f
|v&|uK)y{CpF+wbrc+cM/6ne[_xYNw>'E3'*8XJz6&soqo]6u endstream endobj 929 0 obj << @@ -3408,18 +3417,17 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1012 0 obj << -/Length 1804 +/Length 1802 /Filter /FlateDecode >> stream -x[[F~HfDK$jԨmΑY>صQYn1Mϓ/|3 -xq'`ky(1)>?FBЃz!)Hh/" +1f jP.0=ȶkwM/[kڄmf'Un{F9D")VHND)O0 ąIH蝤tE!H -.FpKB.ׅKB -Ճ=RmfC?Fa<g1<&KA@z-H{ympyr?Tj]l?m-"7{ j^,˹E -Cw~& rF̚Q0X'ԥ -kgx6J@|DQ"|Dj?HDj0iDN)ZձWI֙JDz^Sv4=i;x5{w"~贎aHJ헃߲ -i o~v˹Pgu^4yL Za -*KGҝt[v.ASm8غMQE(=ՇDNngZKp7D6E&4n*Q}=,¹l'py(**#S=ĢXd+'VkX{!TjQno!Vw{)͵E?Ֆ>kR[jNԖ펞jmvRܒ˩Ymש-Y[sXE6@mrYcJpe^+^8*S +x[[F~HfDK՜QɑpNdصQYn1Mϓ/|3 +#-<$qn}nLG08/O;JXϓUų8\G#bZ#M3_cLJFȕC9λѯ#ۉȭ&X9"o$s s\>ζaH
ϐc'
<v&~1!\5KަW"o#Hr&#Lr{JE\n"K0c"'mza}7qbѿNֈPgBDnƧf +`%blmef4|l_37Nx$KV [v% M@9lF|e<-L6Fqh[\w=r)iOGNfQ@~g8|0rLw;zYULZˁDI9Iu +Χ.vIMTckQƠ(ViUx`7M$cf?:`Gznb[?b~-qij2 kC0$OdpCGA<@@<q8S ÂY}<CxXpFC#!{YAD@SMu$WjɌf{˘FUQDC_EKJ\OXad[NڵB5mr
3Rҽ"W+I$]'ߔ` B^$Y$NR"^o$Bp%!]%!]A)w30Os |tN|p9Z*pGJjgw^rx.
e5 +HC/ ܢx!KH
;t?I9#fM~(]m +O)R +^e ÀbQ,eRMbzcm+5,ǽn*(V7+TڢjKE~-}\'jKvGO6^hx)nI
-₀9]["[m,Vb{zo//JDYRUW?ge700_ ,F6c{*8~ћ_J!*p"ڶ+v"Y陷Imȟ87vw%]Ez@rgx endstream endobj 1011 0 obj << @@ -3975,17 +3983,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1065 0 obj << -/Length 2535 +/Length 2534 /Filter /FlateDecode >> stream -xڵZY~_PU+7I?:{$]x]Cb$J,L~}@Qhf`
>p{D1I}QkD 'y9$Z,y/4
Wir@JAT$Gͻۛ?o 1?h؏%"on. -IKl|
Epeo3H%z^3BG [,4|kؚcxCotp;>߽z$,$ZŞefczmX/][3eR 0= 2!]Rj7@};'Dk}fϘ]\1{k&KG$J%c$QϬA[3SDԑ`ZBuҺ1UQB:7,6k\ʹ"1i^7)A7 -r,ߕH;sHqP.dBZ[GדcWƳ)aRxCKe_>ՙ fs?Ltq>f>awC-b}>3:#WHnIIDr|;ztjPZrl!O
z]m}2sҍ ^+:襁R[V;s:ݶ:y@s c>] -j<#_Op_N"*ٵɛWIޞ#g8==&е$kR:gOqD.?#ˑS.+"s9U>mYP>w:~֦͢Wj+:oF"E(wIW2\a;CͩSЖ"?>1(@K]`yH;J:Vd3"R)c`YBi'<f٬n`?w1Y5䰬Şb`M}O^^C0\IB(
q:mu-\Zϴ ?n:ZJSRSDZ[)1oN||_C&|iͱArFS{=3 ř-:nQ`? -̭T%%gILlbr,tQy0bd?LTpp1ϺjY혥C-ʡjPc|GDk~=#ŀŗE$r&/T.@6PLxMWlF?Y>n[dwg{5# - -*n?ֿM0v
LLj +xڵZK6 b/TĔ7Go̮zÌu1po +{B )3C8X8xwbdCaKD"I,r-4{Iy^qc9C"b@Πzq@zqbʃt{dcSqhGn.7ĊͿo#*L<G(J,c&houwM^VwhKʑwѵmٵ{M{[[f4>]l@|H(:%mOd yݹPsG2 +Iɻyڵ˙2 D!!+8,YHKBҍAb@`RfJumUacNa
MzO&Rd $}K+U[QU;;b0 P
)i&C^tn}Q
FGvT[?3:ꖡn}ye3kvb@ZJ?nr'/(ZPj2V>|Ř.ň>n'sT";K糊p$;HyiDQY6(Z$orރ_zü~_8DRuu3>9S&wh_œke&lZ'-loxkkFgnd6OKyŻqYd7;fݥ+/r[e88qݏ^`~̼/y_JH/P&E1:әqu04#ng|(70k*f)kҶtuaIi/CCl&r"eG8bUU8@Ùʹvk(a=H'
/:%^%Y^&C +R_ +/&zECAxqϗUښj-s\i_j֥Q
E/}TF%"+OK?1UՆ13{'aȗ:"ǁ +2vF`y(x/Qi*tvVC$bNrorzLTG7Ebuɕ +.d8{#Wqk@RGݔEZI-8lG&8G:xRTO>@ +!P υ-97>O
P=n1쐱W\)f[]*\b:u +w{gVm!~v^wbz56ADǺ`eDM#P3O^w9OwNac7$6<ěWaz]߷$ߴ<[.]V6{-c`^,]|B_vS_#1adZ0?--()ۣ~xY[ً˧5 endstream endobj 1064 0 obj << @@ -4109,25 +4119,23 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1075 0 obj << -/Length 2438 +/Length 2433 /Filter /FlateDecode >> stream -x[r6}WQ/yJ26{fR.E۬IDe۸CJ[ŒHOph8zpo7_oDEHK)C$&zzq՟qoҫoe\fEn7mj4QrWmF{%!-6
ne \9]^{URlRm/4)ӍW^غDȀa*a)RTLY%?r,C DIַ}<手Cv^l~|:kǼ̶kJcɱ>7qVMЗ&DdRr`i,`cǧCr8vDC@a&X5~0 -,sG -1DAokWE9m -r4
d --N2UwނT7R*>X8J5BRYSD!JjP Z<(UR-땪«BRZ1yc -V}2Å - .TrRH}B0惄jJÄjJׄj TMTWNIRRFJ%)SAo䂺-\R*eMAKTEPvzUዀRIt:"Vd$ɨ4tJ:jFX"$6JѣS_4Tw=V74͡;_:Kz8$kW|ݥ] v۳0Y8 L-N.02TN -cw0)RF7nEc6ӛh/4D B'` :yk'![(K<4WCފp1?L2Rѻ\DZ].ha沋9Ey65 mrQ}p5z7vn@{\wF{qƀ@<E/I-;c*XٚMdvxgιp ,O k9Igm!7UN˜N }WA{VC -tN -g$0Yh4:yp({8aLwUI"Й>g{Pz'WۧΔ9o`By'=H,X(&՚ӀoW[!Uj-o^>gs}>x -b -=ͤY=ɪ>m/GpN</4*CCz/EvWצgǬW= -~XoƖql"<.'w`F[ !i}zQBz8We`ʝ8w_d?#U6;ߦZ>u;fE]]ÚbS)0BG[謨Kp*ꊋEPAnUJEd/ag
~06;K%łRPWD^/3|W$,H=䔆;z:-FȠzVB+_3˒p/(}~4Lx*L -=(x%ZҔ[00=N-bP -G5@,QY?ۗǰ\}y+Kc3-)QƼY *q¥!y4OtlwZЪm$"N[2~BإO?Ίi{YlFj-`{/U2l
}ܻUMxmӽmފ|}ri7& +x[K4WT1BG +v +]jxf\!qX_O˒v8~1@qI[-}j8x +pv7F)Yp(2IܭwKW}0'W>[7**8<Rx8 L<w`
Ͼ
0bFۀvEOI.:=hD2ֱ<xmÊ{ZU?C$ +&"LhIn\ӆ + h0K9<F9Z0@{NFu +BMٯw]ϱWbxcO}}OC/3.{CЧ.<+\dpB9T4L!I4ڃ}o +1DC+ʗY>m_0FdpKj$P0#%BRԉD=@\YPFD&:9<ZsPf nDn:۠:"e5ѓ5Lܷ35F`q&vyC7oTR"%T +E2YLB5EӦM4g0m(uC7=QWߍPT ++ujTS5P{Ts~%T
T~"*͐|P
tNTp
-gFU*ƱgqoHn(XSLa0g:ʊ"a9P=S5P{1WjXT
T`rװ+W듞?NTĨW"*џ 䤘M! +Da{%QQ%QR`2jRJL%1LSƁo脺%\b*eEAOTYP.]*Sg7@xJYP-Q&ͧ3QiJV=xJ)ՈJi1IlDŕ8uDO}PS] +V#=#1Bm`>={:]Y(.ɟe63^n}Lg6 4qPhcl7f"˪ހqؗ۾N<͓me!}۾(l^2Z0융ڣুfh={Q=nz-|V* +hu#!j){?>@2QEŹ%qmOJlwh&g'-=uzF]]ϨÚl)0BKhͨK(D1LeӪꕌ:8\xrF}Lf6MȢJ uw'PgzB]!.ID$z Cɩ.︖W0!Z
˧9<pwԮ8bN.lKNyhO`
Ӱ) endstream endobj 1074 0 obj << @@ -4219,17 +4227,25 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1086 0 obj << -/Length 2767 +/Length 2765 /Filter /FlateDecode >> stream -x\KoW̑~TlE8@c0E*S=3b=_LwW]U"3OZbLSbʴDz}fKz{?@,}z_1f&l1ǫlQ"ɾ+3HMWK {3#+FD3_0J?szu)c \l' "j0.<]DjD2)©O\"5> oÈ^oׇS+,S+1ZB&\Ա>c*|{9u6%u0ZRQ.b:VBmvwoPHE*Kpm62E<wA_?Wq
P:Qo1r`պ9|usKF0돛mYTa
N`MX.ۚ۸-9Vo
Q"Ŧ-̡a-?+eؠ$V=ljq%Nө)I1z81|hr*(`iwYu|[ -^epsN<ܸ~#g4Qh_r̗wf,fwQS}._3-93RùEP ^S`qxC4&H L!nBG -EGRALs&r -px<Hk>(h<
$ -NuJEA!H~gR&b!ʿCY -ehtnj8q2~7tSk֝_/?pͮ0?W1~<WTWdPL;gr+9o $!2j2\S$\/h9fUL6GH:eQ/sG՚qs繠u``FBȇ^A=4p/Hpj'4>pR SGC`lbslq|펜^zHi3-,gIR ri;F)y>]Wce~F+iSֵ -fT$,V\;-$]y{]`RpFF 9`k`<)ѫ"QGq
(QOpu%Ua[0};Fbvg)b-a%0,L dYLeZɩu#VuGYin!a$IcX?}Hiآ{љFALAM;Rh>&k4DuQ}.)j,PQ}][kۥ9vS$!
!3zù4 7C)8RRI9ek&k?xsʻ{&c?wsc7 RݜM$PiPՆnƉ9=MV37gVF_m&U'nROiFnNe7o#{p č#nqGn?
÷GO}7'T]_J"H9ޣ"\{US0ywE0g_8"(UE00w&P6qG+ * [UюMgkڊ`Vв+)+)
{VAWs?"Ȋ3HS'W"Պ SUS@AMb=M|5WB?'OUMl(#뇣M|*jԁ3%TC*eH!|RS:B;M B2@l{6=%/8~'ˮpbA=7 +x\Yo~ׯG0{>1pl"A[@@#0E*<U~}gzFlri 9z꯫J}BW僅HMQ*іŒeu"θ6Mlw}yV'R +Z
nݷW/iJexMJ5ɏlc"IGl|R=/:Bv=b3F)gdZ^ǘ%d2WMal) .5/ +55Zb0p +!j4?,zP[LmQTWաi' ru϶2n~M,Cp`D]F1+Z;(RcX1pi-"XNs7RjYJ'J=
¸C@b~1et.oOi{`DsNVT"aٚm#XS%k*nm-9V5o
Q"Ʀ沣3a-?f/?1ݨM-si@c6tjrReuP ".Ku|K7߫4#FQ2Rz7˓%kU5C77ԺÍK72`̘& +->|qjaW4i{wȲHOOSùEP ^)nS<e$@ M9(܄Z+L) 02d^hf4G?cd'젙jcMdaÎ0 GXo9;wC=vFbZN~Tisʗ(攘o1ͅ<&~ V0G:<.q( +(9)([*#i\#D
F/B
:Z@8#{) + /`@5ܪT"قQx˳!s&V" :Cم
:CAv>h+[ ۅan$^8,X~]J6FF,DxJvJRCe8 *gu'L4%Ë;0~;r5:]%f7doЖ8V4y2;Ҭ@-L0+ 'U
^IҶW5Fǝx#$m7-풯j-erabwӑJ3U6,@F/>|7LjR$ZuטNX +
WD* +ZFF~gEȹא NG[ +rll@}"g ضG#61hr%ո"[k 9e0CU>_9Vzkzg$5XOM$ +>nS}+;w#f_)m
("ݥ!/]::w"kHD@3(1C7 +Do?9U&uY2js)9?S%Si2
JAv^bf>n<7g tz.{;MAihܤO!vrmtI7{Y$NU Mga}`lhE&Pf$1Y4Q>!F< +sh<dhqQaBMk`uZ0i*:k}\t`6#\28upD +5VQl>lʳnm0"VLd(ڱβʴu#x:أYo!j7IǰFgӰYo6*gz.
Rk +jT endstream endobj 1085 0 obj << @@ -4322,21 +4338,24 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1091 0 obj << -/Length 2311 +/Length 2310 /Filter /FlateDecode >> stream -x͛[o+h
x-zټu"+P[Jml;)Ŵ(n
%ezf83~C18zpw7>F,{FZHI7o!b#NS;-UzLχ*/3滻niej4Qz"XCCͯ7ىyqVfKpc7G -1D`7R)]>B1M}5RBd 4Fl1SPD9fEOR -:8s_gz̫<MSTo>bQU~20V& dݧʍƁefA>b A2
ڗ7nЕH pt=CA -8L^T'1㾼ucD 3SLjF\U.5Q^cTq0APiO>u+k(VPU)CHIJkH3 -*Izm [/*&Gʎ[B6oU1̅Dq,uEdhH#!_: -AvCMhF>C3r酛!_<Sv?ÖMybsA],ZRv"bH1Bc02v~QZ?UA|hB=O{8]61Kv}%xs>gGy(ȓmD`/"6Rsxx*@tŁkXd1C-؊< -6%|2&&nPk
Pb${éC#3>9\C=J]{)=$.a-+
)"XX~n嗛Ca봇Z_!Sqa=л@=P-2Y&â0uz FF03ӺZ3n|@e2\G"&0=DuWfm -̆46w:<o9@x?x{#+`S㧑Dk(ui5:Be: _! -DZ;T)hKO(hP!!ti4aTz62 }uhs -H`?uPSj6,G' 6F=Hi@0\sJ$f幹r}'gW2}707؊\Vɰ9 -^#IQk(ui}0[w1q5CU TyOH|h#hPP+_A8X[i*G5FS1KYaYK훷2kC[%fW8^FbdX#:MY֞6`!ft a%ajY pIMaj"~<S=L2dc\eQ. -ro^\a"ҧOڮK-s'Fۃ`7|i:ד*́. 7:?ϊ옴Ll|ȞRLXs[N~z0_Qe9sVKKn+c(]d6O#ۧ*oDh
xWֽc= +OZ +x͛Ks6<JU1G[Lm*n|ˤdYIGv~H"k]s$ +nt7_0N|~4"HɒDaLHnaxO qw_moқez~ΊjWeapw
8!L<Io~'{#ftpV!_7ۉ}V"fKpc7G +1D`7R)}>Bֿ҆r>pi45Hp>AB5t +(gҬI +_CgLy՛OXywղI|YLb`XfY;
"*H!C~](G3T+Eh~b=c#)3ϸ@#qV"D
zAS}AӞ|*V-PS잳HJRޒmTFV7ISleh&ntMH*ܯUqw%dsˊʼ6ZCj\HdUdz +/!o + +cʄjEi\E <PwVOlw-}vt<ٶn@&fYpA#T1װb\[ +yE>CܫMjH~NOPo*䚘XuC=5[C%
+o$p
;vk(ayw1ւސ"~͡2*ps(B/d憭j}6L10TB0BeLC!a +O+9?P3:k((ýώu0(AA2wRЖ;cPѠBB49iZme2)@@eS GLQDF-DpxcUlar3?ZwbO積R)P!nX7, +,e2 3Q1:iWXĨI(3V.5AdokOZʡ9<=*I> +h[yn\IUM?@Ly>"e2Z0מO5M൙jkyu
^dYpFuG
Dߺ=Aht:"X1;CF/QX)l1<m+|߲cHv=.aziS +e$LC1"9^D5`jh-ڽ5n$$L-"> :LM@ЏgTcƴQlL7" k,e4UANR+ GSI7wIeh{qO!M7\zQe>&'1+㮥f?szY'+;B{?=Xn'*ϗז +VIA.2vۇ*oNDh
Pֽc= +"O;OQ endstream endobj 1090 0 obj << @@ -4402,30 +4421,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1103 0 obj << -/Length 2929 +/Length 2928 /Filter /FlateDecode >> stream -x\I$JL@@PKnڢe=V")rsiQT-UzF#o(^_7F8id(ZDba,sch:?o_fy/#)QF -[`v8Ύ:e$Fakr^ne)#VUV'l!ȹ'Fl3-8=qn`H#R>R* fJPZmo -25w9!*@36+WE(xsEhݮ0?'_.A4UUʶ*#9'NHQҚ+sӚۭfUWHXU] -;_P5R'Ũ37rik´v#BP
ʪ[={827oaPn%Z -XBFu/mYfތHIM-~Zxz|h`?gӄvs`k)L
]~NФ16>ӪYEh\sB
#@H5hoYIp"нd6˽:֦^O`#N-ps'>xo -ds9rך !I\t
v):R8{y -˚1ɷ"۷l<_/)my(jDH! hc{om @hJy?浐xGާ<bpv - a N99N.%8h«y3X׃yDxf4XP㖎Skr_"$$D#{{s&u8+R5K%P}Lo=nO6#UKȀF`D#.%qWӊD)\kƻz% B^$5ÐD# -̻&"(α* -S-x_wu[ˡ,%L@B j
0/!WX~|!.u݅SHdg).AAd@G
{IpɂK4R
c\`C -_tLc2
+^pM/*>Jރ6W4
4! C+_gɯ?h9砐p:ざFx~9w} -D>LՁqy:IH0/IS䁵%.DŽluJ~T:#Hb/4n/͢yS__@TQ& kS0[*isGD6Dh5CBxX$ؑt`YBvPWa;$Dk|b0U?RZ7BD¸8l
25|/`r/s'X6-T7_/?sk"pG;I(5|2+3ET& -&M/n-!cm K@H!SIjݳMz1^(IlT_ƺ<%MZe:'ZAcsjLzZ)pYAaGϽ]%1'PpiרmM\\74KO!JTw/9,V!%>IC9hCNMC3n,=*3UR|@kW --H -}_cp
%_c
%`c
%O'n1%kF7?~lu.&.fmU}`DHΘmHʀݪ7ml{߮
6YlCGͮl:ΒoN<ĀsG-ig
Y,}ҹj9אr.q5$\yf"Og6Gl.j -d -D4&K47h]֨f$/yZ'#he;h21
撶0ߖjnknR5rȒ}zf]$|Y -?'0
+i;=C}
:2cEȝeHH;4-O}װ~`g -ĽKޢU'8)¤JnYOMڗi+]no5-i>?a , &,C21FxYo0^ -́-8o4
nv"v ۆv2mR('y(k.}htNS?M֝Ƴ]<H ɺeMvӲZ@@v&ώٴ=FK0,L;G\'~7d+sl[q.0`S`&/] -<%xw +x\KFϯr +U$`q;уqGeE>=o5RKnb0U(2Ӈ St
_͉V+*NY+Qf\e徆sxrʈU [HG(rAƉ.LEOa98Tq)~3A<Zm +25w>!*@36+WEa/xΏ +<z
Ѻ]!9hA!a*zO?%mi\mUFrN\-x>5WV5]v>IUWHXU] +;_P5R'Ũ3Wram´v#BP
ʪk=ۧ`0kjG-Uu,O!T6r=oF
vC$$&}?-a=?n4p +ךǹ"ˀ{ɮ( C0H."JS +Tb]dVPw& !I\z + gwh)'Giz0j`9!|J0ldU<Ug*88a>trv +ttWEA|=쳿1Oogpf7eGο{W44. CdopJZwEH4AR98A!)?t-ύ>A~q|qZ";hfUf<?ä>Y$y$p8S䁵%.焫luHv~T6#GD4pyU7'zѼR_'Uqsd9̖ +fsGD6Dh5CBxX$ؑt`YBvPWa;$DK|b0U?RZ7BD¸8l
25|/`r/sX6-]U7_.?Sk"pG;I(5|23ET& +&M/-!cm K@H!3IjݳUr1V(IlT_ƺ%MVe:'ZAcshLzZ)pYAaGϽ/]%1'PpiרmM\_]74KO!JTw+9,V!%>IKtf!aStۦ!zf^T}]*)\ڕBK+B\Ck|}llClokl[`cLI聭R=4M}AI6ylU_-6X3&F,2A*M`#(^knۤ"",q:ۯ:/:1 ܑ@K)iqE9Kt.rs5l/e#p
"|py$$0Xyy3õ
|yf>5*FIGǼkG434VچTsIwK5GP757j>j|d.J,j9.MН)xSF &˂7f\
@%M3Y3.Mޤ@yRt3- XsX3Ř<3e
d<
3d'^&Yko?ݿnZH|3[
Fw21q>naNi֏[{-q>n=~:\ǿ,}<FJvh6Ua>nX endstream endobj 1102 0 obj << @@ -4498,14 +4508,18 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1110 0 obj << -/Length 1356 +/Length 1354 /Filter /FlateDecode >> stream -xXnF}Wy -#-eE$y9ete.a#N랾N*olJg<e6:!`5Ҕ'rNw F乳\&\0$Hn&Lpؒ qsCO 8kJyZ!>B҆v<b6(D^?
B
Ҥ?|37HvBX?hUOH綶sP@i,b5p30lΌ DŘy#z$"hQWW"%TsC3yPMQ6H'Qckmʅ 6>Z# - Ddʼna/hBCqvwE0ek*e4D(HIO@8\0E,c39t3BƼ|Zq{a}6O{8=ِp9}3|I
=Q&28m|b/GzY[Es`~Z~hu= -A$PFvۃ/\`|$%.UU\+=FwJL] 1TIPdOs +xXnF}Wy +̨OЗ628m}b_D}*Sf"n{ +FpA>= +jDTTqՏ*' (ź3uP%A]=u/ +<';^@FO1;^IH&uqj3]h_F l;1Dzj?7 ǹEy> +Rv&X Fh8L߭{P{a胲m?GBr&z"a`I@ ßmno8砯4L ?FUǜaWDfu_]odSi +pjb6%@1XhBwcҶlL50 @|ֻZr +nѽ-!w{Jz$;rWvsY# endstream endobj 1109 0 obj << @@ -4538,23 +4552,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1134 0 obj << -/Length 2152 +/Length 2153 /Filter /FlateDecode >> stream -x[nF}WQN/y\L&`L p$MDO٤%m`_[TjF~ݏ,qZkd(ZGqY>-${nldt/9]ϸH_#)QF!ۻsKƴrww~~5D8}+G"Dcݿ-51kFh?V0?Sa\x4ڧѽDR^~h?-XsרgUpm^)C(LjyL8vpgEtdŒ-VEp-, 9sf*xZ;fvF @,I|Cb3"%sȵZI~XpISj\Y!xqoWE\N:N'7Xv -˛½PP@56}|]R6@§:OϚ(SItm)9$Կ6}cX -ՇtMv4{ihEL `IܯoX|ƮlwЙbËHjFt8ѮiKpH`c
4V+bxe _Xn=Qch5S +M)(eBZ -FISA0Njf֭Z -cհL= -9+J3 -7-w@ƅՁ
i}Xٴˈ߰; m"DP1HIzjql']+dIs"c@)vD[Ot6arB1_{bOىbw @ai>!p;R|
b -Ek)Ġ$h,[OzJyty'
LP R99ޖ@ u_Y*ZpᲺ][Są45՛ץ|$% B)1@JJw3kRNKٍ -@S -:0;mۂ ZY3tU[ԷZ;;vűf,tO%j6oxdC$$u,Ŕ(.^ͦ^lBͳ -jY&9>`ٙ0,7<U~jNOT! -4YN3Qö{bx7EDIx1Z` -dܤnQ)<Fa1gH^{]\~|||*xp<>Ӝ{Yj8|?h
q%ɒ<ntg]1OGs-WN߰$I 3W$oΩl$y l;Η?/9*zF[ }?V_f_ +x[MFϯQ2q8`f-3D$jTMMQ%5_u~i藻=ީFud'EB.>~KFO>Kt-5ReX-?wkL[K,zwwm_#Jѷr. +I4>p) +/Q1Ncf3Ji53OQN}J$l&
Rek{U̹ +>+]r0 Y=W)SLhcnXŪ%"qrΌBSpxgv8ی3@2)6#_<\Ep!p 1 UW/vU^u]įt2<({j>YF$1VVm%_11Fdpu*c8-^@ֽ
葛يT0^':y05 +#OLp'pwPFwXbC'~J rh})2qdD`=tUJ`;s5|6qww\ + \bh>1t苿Ƕ2D
*vmcY/5,,%=쨩Q}S +mCUP,|~ ڎc Zl\)E+v<AЉɐ8_"Gix@8FHS*T]:d+e,1lƟƊbYMcQzvRt3՜1DS*ZR2WxyVJj/PM߂0߹xqM69E'" +T]{xJI5Mߢt#.y!=od,o%A!Ӥ~4A'XwR#֟9k9h0-ts"`+)NkR-'XM$^Yb+[OX ZTJS2t)6J{)TiauX5,'SdGplD:ӈn8m&PMOtM.PqatEu`jZ{g//&>V6-27,8g~[6A%qERҩZ+g+9+IWlJ`Ym"PJ-Q݆fXܱaמ!.2|v"|؝x7PqXpO<=NdçBZ{c)01h+ ֭i3v^<ItCrti +i)QPXh +S]xfGm[D=KRx_NZCYj6Zksǎ`8v얅U
lzdS$.ٜ%V9p%ԅ۫KMHxxS85mfV7m +"iF^4 mXg4D;y\m||gAxzSol +؈y$<(=@OګN;O0FޖlT ƃe?m߃% endstream endobj 1133 0 obj << @@ -4741,22 +4753,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1149 0 obj << -/Length 2650 +/Length 2652 /Filter /FlateDecode >> stream -x[Ks6WpsT#xq7Ԧ6lƷLjh5c_iR5ȸ*"ݍk -(tQ
=g#f)ύ=x!d#P߁9#js8u <FDP L=v!0"\V'oC's>|=>S}4QL6tA)"۾ D'BJ
,TsH -Q֏T|1äpz'*?f؋`jEp7ȯvH d5 Ye{IDi-F&Ex[ 7(sPl"&G#Uc3W^ۇ#&}e^M
L{Lm^wx R+q|ŗ]<Gp1H@b)G1Lǚwj46N»2ۡ3
Bx+Z"J:pܧIk4ܜ5Yp\y_R=ֵM!W -b -Jhj}+=MPl4_Vۙ:i 6u]ψKz性O~%E )Miԟ>mZkhXn-t&eZ\H`_z-.Fŕr8-+%{ vK
'HwK5 -Wm[L5/2lak -h8k3t l<#<{Zm_HS+.JG9'86ed{ݿ]R%M.Ez&`AH9pWNn]fVMތmp_r_z;;hO`풌y#K4RQ]j!dt+&xUU%*](-ږM@\n#3sm^iyvk+ejײ!dA
qyi~N^\1W1Lag9ɋSʺ̳U"CQ^-!U
PzJ|5i{.,'/rR}q?%LcS {Y`;E@{ruO9$/1ZZTg -I
o%0E[FKU$XpU$̽y<<eR{UhJH'u*rC\<Gp1Vګb@ȦU])}C],}y<[˔TkԜ^byQv]9ZTYapWH* -`ZC}A=PPZUyʠ[BhQ`o1HX52<>Em -<^Ko:2f_Rԟ0d>pWO_]xhC>+ILRG `doBu;&e p].m䕞Нr+zeA 1*L3IG[_ڳMס5E= c&?5p/'>X-O
^uc=wl6uPlp̞$ݸn+!k{>8;3o"д1砻Ǽ~x4~t()P4ZX`EI nFM d\offj --(.cQiOomh~!]m -7w.n披Gx +x[Kϯ`|Tcb+s(Z #ɯOA)rLU.")4
+ZƤ/%BxuR&/R +Q6ԌN.9c,IZ
2N#C~,CQ<Ն3 dLIJn'_픑1Af:AN<m!8%ZLL: oPd#>0<EL(F.f_+vG +W(8v</xb̑R +tdc|]pMڧ! {kBx("E}+=]P,MV/ZcL +t~BJKIn`DHN%i_lIѯ`d~ +?_Rp$WWJXxEl1_KennBJ5b_qU=X@j ~qn^F=:in9)3a0cr@%+xZwrt^rWj~fj{6'2qE7@Q_ &.T1J$OEХBvNr[7MU]2bׅʢm. M6b<7'=O̪m\FPƠvzRM4Pvڭ(ťp*vh;e<[խ 2u}a Mh(JR5@ +T2WTP*V|v[DA VolM̿O`p$J[$& +M O
܋.ESkcbsOj`fS
&9{(I2ݍ~9xVcv1M.M!s{(f=f~p; +>_3.@ѼeR[~:*=<ڪaZ{L^1ddb/ {_9{fK"$P#9P3~8Cޕy+KùP-P߉toVb + endstream endobj 1148 0 obj << @@ -4816,20 +4827,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1157 0 obj << -/Length 2484 +/Length 2478 /Filter /FlateDecode >> stream -x[K6
%n.6eVwcˎ%wק(QhѲ% -؋-TUckw^ww_ӈD##%K_2Q"IUۂ#}@^XxSʷ?&3$=Lox/qBFdw.ft^$\0n_~ÞՒ 1Qk:/>nv}Q(^GE
s4'` -~MtSl9,J8->8gH\yk+Y')2dPCY)ؕl3x3m}^12x2
e9Can":-5fi#º+f߽*8 -rO+aW])2ؾȢ -<5ZȭF*Yd]F
F7;xm.(6CMFBja{V__k=9OyrϠG{:@A,i:~x@q=Q2K%!qayBuQ=&>KW͵ua^xz"T1эy]EF#=tx45
OP5ȅ@q:lS6JB,yl7uV;@mCS1zB%u>d8|({a4dIDՓO -wn&+{
@qm@')zsZ --Q}=;.;jnaG9lvT9Q+ -(BcVbDv_G1 -y1ۛ@7!&T&Mc<e]#0q/{Zo f(V^z*\;.&fB.%üY&yӖKsde| -%DV_Qwj]6gCB&:{^y55ݿ6YQLbN01B!MyDTIeK?dEO֗ٮ a
F/1TwYjq7;X/7ΑΟuOsnZdkK.& +x[[o6~ϯУ4,b孧[Icˮ$7=J%YlؗX?#*ۏﰽoΈH##%_"2R"IMۊ#}@^)[z)^L?D3$3L;9iʣq{?] +F|{WF<VKplDc;-"D!xc7b$%[f%#!T])#0KUkR"JJ%\W':qA1DZ$+J7DƁ]vA}ՃA}ݯp(aQ^QŐzP%S'1yvo1p&Y,©[WD ^oLp +ژ0 \\2aG vIB +~tSl9J8-LQTCٳlAllp.<͵ˬYH(HcY)ؕlx3}yZk12x2
e9Ca"jӶY=w;戰 +4^
'0ȫɮ8/*2z>@h{ +#v
ם +W%*qdiQ6]nsJ/ +Ji7*iRH|lݏӺ8iJFu{9( + N2&tVv&+/R7jU6'y!X$C2wap}og^i.>+&09LAPH)?m~+Uw~-kY#IqwyZ_|6igFW|%XFߐcIߟNjq7Ays{fs:嘕9?s^TP;whg"O5/PW endstream endobj 1156 0 obj << @@ -4859,23 +4869,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1183 0 obj << -/Length 1841 +/Length 1840 /Filter /FlateDecode >> stream -xZMF+tUf<%YW\qűy]+iAVN6>=H+ !Ȯx[{z{ގ~^iddSi)=e(ěg; 8a\v:ܯ*߬c4^'/_#b6Fr/x}{aČ|`Hpc}1.No틋`!$sd1m4!X6:&Q~!n٬ls0:ބa1fbW^_rYI8Hi`;JEYDS}gs]$Lٟ`7c]aaQwVO - xB$NX.쉦=u`wdKI8iơfk _٬^1RMQ3@v ))Y4)k8\< -l8'aψgvjyO.tH?.FX - -9Z y斸7)2 -br - -'' -36Pq,T]i#5WX0ɺ\$Ӟ\ E혣0֦(Q*JQ K6Q=B#\_ -qU?Z"zHR#AmL#DŽ+$'i>!ajW -Н#kIwqQ[j'ڏZeY<L4hat'8|RU1<'6LCP=YgiHfwa.cx_<Qp*v)rD4CJKIӁIW剽yuNݩS϶@1c.o-%PU뀇qC.+d_ n%':C -K
]rJ"chS@'F@PSl~ - ){jKw:f}MMĠ|Yg!%|@yM)_SC<9$p'FIb!PM0]!o8}#۴1v;+dnuG?J$99R}Ə.۹OE6WVyZd7DI35V +xZKF+tUf<oImW\qln^JZPͯOhEB +p(w#!duHELcv=AVQU4!:$Խlna +
A! a{' +eVO,gtlilp³IyGn6#rMBYC_@2{ĉHg$*rlʐd<xk{pqu8vNE;D{2:<Y77O4ⵂLc{$bZ)0z8V|datxO[۳]ւ$=HMD 0݈Wr4']L +I-AkDHD#D!2 j+x[uͽp +x0,r;l!b1{[tsS;𑃂kMpTOz|6hD\&ɧ"dU5<0qöCRBxlq 4;+gjizY\|!CЭE]{r9:0MfdžtTqw5P}Ѓ@ꪺ=ϝT$ٟ5e&xA
jIs5S90j h;w(2 Mtx)nr,FK{qh[ efvrV`{Y_DU qlzt)3g=s-MFJ endstream endobj 1182 0 obj << @@ -5082,24 +5085,30 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1200 0 obj << -/Length 3610 +/Length 3608 /Filter /FlateDecode >> stream -xڵr_GsIi'i$)TU$W%6ɽ -8d! jZA b-݊@ے|
*J(,wݷ)ƈ*a
0%àMS~H:PfE"atN$n8b$т[S[+@cai#-& ChSk@/VP $HJȁ ,VIrJb.Ӽ1˖4'ucl^-l3Y퉐VL(^xC$!R/\^LiJ#vR"I -E kpcxT/HwiXI9I$<YYhE1'B ->sZ܀@ڠ5x|"༭Ls -^-WBkS=:࣪3{:ă=KW=`hY_LTp|& /|p+{CpGIB-sO*iػx3K ͮg})SQ<qςō:[pf8b(p:i蟫.ϺD.vۧHMN@guavH}?
-/F8)mڴ.eT1(;d_o-9/i*R![SaLY`QMua<_1&.f9Ok;]W wSp7ouY`z;UmR -"Dr -~ὣV܃nGS/^h>$G=ˢŦ]4és ^j:K_&D1EOrb. Xŧ40ѥa@={<<rLSs)3[zFT@}茜qO;tc* Ť[A)egaxloB .#h_ա:XX[PPfY/S3]-Nl@Ky,8?]~ሪ(]>1$~L<xcqo0?x6b`w"H8MNô՜3>RRmK{Z陇;/KRp3v*^zYDl4-`d'mK1eW@,Q,~{g?YB~GmC -,Zn -5y1U~ozۻxI2 Js?ԆÁe>!u>Rf vi -?TֱXXaƵ9{~]Jsy__4d壔D|/0Hw2}r}l}ʦ1B5 -AIU\!cDI(k%1׀LWfy!=%"( -R=[G0)NM"i3òS.E28]qE!HV(~rj&F_,x{Y - RQ7SΩIbR^Y^&suwӅ_!0 |ȒtWɾ5
^Kκj0t0 0uqᘔ`Y֍cՍ̓.!(S6E4 +xڵ]sݿBRuzi3$Mdnh9EUz lÝH].kx\7cɵ$zarN4[ܭ.%Wd˻}Un_^q,
pOn.w?,D-<ap/w7a0HCe$rQ>;]JD-ؙ +~U(v'M*Eи4sM$Izޕӝ3#sͻm'6Ȍ!-b %1d]`cBADYwN6lYM7'7WpƆkq[kPo>Je$B--i(0aVp,̗m0>UnWNJWm]ZXlfKVJp"zZX\m@}h*bM#Ap
2 iqPf]_ٮ=h}X<XpsFrɁq>jS! +AR +k|[oϤ{j/p>W?'Aq(1*L2%ގ|Br)-C +;N +Cou(QjtV( +E kpcxTHwiXI㯩<I̞yf(*jrEr~V0)@dy`}KT' eGB9zh҇@AQתs
T
Z+Agx/mmfCa +u O뀏H: + =CWc`Y_LTp|& /|p+{CpGC&!Pc]M +%}ЄfWW3̩ +/FHDlZֲoXrK}ѽoNQ4YSaLY`QM'} +eꘌ4 w6yZ=uEYo\
7~7ź,Um? +ὣV܃_ngc/^>$.kޞeщP.D!p~x蓗.[Wg)2ht#~|Q|T>?|4ͺ2te;=^U{{/C_&)9D-E=#*SpTtFRѸ__;tc*Ť[|@WDˮ;د +F314X|XWζ`^coAu8@I- +kU<N~ +lyw +x4KA{"be:iG)bb |m,ۋ8rÓ;:gWl6)AtkhuȬ[=Ŷ +rC|,yMC/]xtU"RfF$6=Ç +7~ULqʩ6CArF*ceE +lihՎ4IDxD Q4{A<`
vc'|p+[AO\\]1R4
!FC?&$p>&$HAdZhOʝ/ܿ_= :I ?ݏb\\F$^
ujC@2_Qex)N;ش``>1A #U6<jთnNjBu,V88qcĞߗ\^/
Y$/F+p<_y(?ymXy!A$*zi"ԤuhT<kP&3RC#TX_o2& +(۴a9
- endstream endobj 1199 0 obj << @@ -5156,24 +5165,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1207 0 obj << -/Length 1856 +/Length 1851 /Filter /FlateDecode >> stream -xZnF}WQ/y)Z 4h- Ebl2JT\;{!EKY$Ť3=3Mד_&_hddDaLHj|2=|&a#Nsݬt6JO_n4/EɯW'TZ#My|<{`ČNȻ6ɇɟ -{k/{U}iVI̽bwέc篸&qΓ9\1e~&ˋt_=O46b(2vFtqx:H[z<
~:cx)ݦU|jQ,3yI*L?aL1. -]gy,7juwaAKA1;đA1@OO7٪? -8 ,27+s\#"MjI0A<m@D`Ҝ4]ئ7oOX`QNa đ S\aIҍ#]L9ADPd9ҳ0DTYG&angQ-Q6"vG8r#4 q/iBva -,luvՁ:gy - AFkˮj -ͺ$Y"C|g)[lw
.BG<~+FD;] 8`"aH4S0گ}}k*^_wȪL*p]^XJ+Pj ŚҴP2\Mu -jtmz))FL%b -hð=$gn69_ݗ4oM-S}n3Xi@sB,t^t>l(M+<{oVk<dK;ߢBP2nӏk01~3!
zeaP -6t}:
-<U)aC^&)j&T5Bj,Sj%r ˔ZI4-KuI)Vd,)E(AG6-jrMz"ii)vy"dg**҅<gL"i3=@l+'|״j**&vpiR,T -$CrQMqS -Kbg
{Tbl7ml -#Ў "26(SYTaGaxHIseHͮ3 -g?w۱&<yѩ2(@%@h ĉ͞ki//`+ UXhe8Ntn齿!- n~DqoU0YQV"{eZaʏx 5 +xZێ6}WbK^i-Vv֖MËdɢ/+5<3ΐ]דn&_hddDaLHf2=x&a#Ns]lN.4/Eͭ8!HS,7qgoɣ$\0$N1!ꊨ'Xi(ɑ.-|:{h<S?lHwE>DL/3*"LþfOw9Qx~\j@32]XG9ع44CtQ:`ɨ~W;mg-A@LB.G1 +,m`)=6X%R*U:q F\*.ĞEޒD,lF.:qx4!0E~yĺ@3Ł<ń #5k6DnH$sAP%Z&E4^㈧OcHRb$L\\ PBvחyʤ[ڈ$XBuЬ!Ma-5dc WJIئ.n:1`̑b$T"6+Lc!:0qn"f]tskT:Czی(Gaxl9ci,t_t>m(m/<߬q7-|:AɸE?#Я1H944l락;9'@oG<Xz~t*m*0B:H- +v\L
tg{(SoS12tgZ#%u)f7wE 0q4~2UZTZ!)S0B:( R\GbVejx6~em +h`;7 l:&BCu'㞼#OzSt{u`۟fpHaLxSmwh+Ejҝ5hb]s:ix2"Y]{ⳟ;\yѩ2h@%@h ̉͞ki//` +<ښGi @~zvYEpCR\Ս/P (CeE endstream endobj 1206 0 obj << @@ -5209,28 +5208,25 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1217 0 obj << -/Length 2974 +/Length 2971 /Filter /FlateDecode >> stream -xڽ\Ys7~ׯGj -(`9cŢa
!1ɏ7?Lo{kebU'ӇDSbJX2O>at<mFӱKz_^|MGӟ!8pUnݻ7o70|&`1 ͧ?hrPI^ω(L8a74hM Hk`T'eLWe0J)C:u -8hiáɄS"(o.[Uwo*4SD >Z -N -.%9tq0N%aLWs/{!G - cTx/Y%mcKD_9D8Ma1zD-8)QTcz(5 -p -Ѱn++& -,tD ?| Iɽa``V2"pJ1˰D^# - :/+'%YxDs}#yFHVT^&ay!SbaMΉb
k4@k]L*+#ѭ-^c\9{8j%8z
ʤ?TXvqK:63T)AS
kE0 &IFȦGUZ?
NLJ1<Ο]36D2ǒb,XxX9
"%sCق -EgNI#oVG -ֻi>!@/x`Q -kU=xysw *~vY ru -P*c2vG -:b9Hb0lQa. 8V/>g'R˭]vE'6WgxzYp
p~b&!)U;7_ǫY&npv́鎙AK괄#S\Wƾ|`
ݑY;[2j\EޝָVQ ci$e
9>QTrbfbc7.q[@wP.4!\]8ؔ)Xݔ)w*zMæE[u)W+A`+Mb<Z:Kv -Ǧ.Xˆk֊`Y0&P9!߶d -vgyW>O Xc^bOX.@_}@n? -w1QEmI՟n}]Q}Vv骾': +xڽ\Ys7~ׯGj +(`8xaX9쯁@7d<&4۫ZbC)1J%Q,O>Maz +Ln
̷_cvk:]qs"'Rsʭ{՟Wߤ ; Cd|g?'pkWs"$ +N2p
ZSҽt? bU(Fh}RP\`*_CV9L9%BvZj[~~VN3E e.@־|J&__fj!|q65lOpyl4O_M;*Qq>]f@/p#.L}G)wO7V)5xf^65]O㕅Nz+Er5h&4Q`kd髗YzNpL#Vki5Y]dr_ŷ=+%(bgl 5e6/bBlrV' +eDm:rQ\@-TWEP+:cU7H"qCdFpeځ +$9ts50N%aLs/{!G +(cXxh.Yʒ6Oӱ%X"O/rBeVGKG`0Jp=bMHS)1wFwXxB -7-jNlYz_ԠBc4Ǡ`4lBF+)Q/O'_0HQr/=c!a\k*8WB@: +p+wֲhz$4o+X|$,O;pJ,9Qe +D초,$#sKX +tQ +<j*@sMRU\*5?u6lAq/YGO 21։>cw4 pYBtfaZr*K92vx2FURQsw.LjQ@10*,$V&cR^99orD\dcL5uưx\VW|WNM3xXckk GΌ};#EM-wteXt;6q AHr|Z#&n\je])Tf\hcAp)S\)WSTlk
Ma +WŎyt`l+M]ֱ%N?7D.`L{s)(wC~㱩m +Zt"&#`8/uT\:%B
6!Bx
4pviI4 gB+6a7MaŔ3:AU
m0tBgDC\cm.M+ly>/"sӏbrd;OsnS?\2'a|#=9uUsPO +vrӅ3MW馼U&_ܤE(+S`OX.@_}@n? +(2?Ԗ̡GY9/Շikj7k?_?[uH' endstream endobj 1216 0 obj << @@ -5310,13 +5306,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1227 0 obj << -/Length 307 +/Length 303 /Filter /FlateDecode >> stream -xڕQN0+0k{H@<[C۸R*q!qggv0e7948 ߁EIn,t@i$Tw=JZ۶UnuՁ]>Xw`[ -o3@2=Ҋkfa^:S@ѱA+incon+^7>mL!c(Mڥǥ&'_=t -(u%n^"[RV͡xa;Ne<V0{
p| +xڕQN0+0#VT ^=[EjRA''NxvfrSS`Z@q +\P䌰"f傥Mń[OsWtjmL%vvK:V.0GJwIS|{ endstream endobj 1226 0 obj << @@ -5334,14 +5329,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1236 0 obj << -/Length 1026 +/Length 1035 /Filter /FlateDecode >> stream -xVێ6}W,9I)- -4hi@%zM,$~}y-ۛn³̙
^.K\|Z|2`)`jHJR!R"$*oh <zȡ -h7DkK$IlS4_zb(UϜp(Ljy0KBP[\A/qj$Fh]wQ<_Gxo u$۔=gϬ:Z MIf%~F[7MG|MՋ>:V3N4l@;LT:7'nE#os/sT#E7=* -8Z7Sc_2j?a,K1'ʗx.$;SlI(z{')nS;uGa<_\K,@z4OFKZQ+cLJcҜXtyp:o8AX}ۻϚ8N/˶vDp50Z"ו֙3tCلgi<xmƦH{I/BwՂhF2]x4ԟK{wz)Fo Kw6[N( +xڽVێ6}W,9H)- +qE4n &V\KN/Zn/³̙w
^K 1y9q9'FeRdu )IDJ,&|)vGs4L_&@pA<IH + q@oQlp'+L3nz%
X7xk@^u7"HBUE,bYL$->&hbf2,:mYv{F29_)rB/Ib*~Ez)xLz\/T_Fu^e2;OFAq"fMV&}Ws +zvݖV)$,mu֍`)sFC_"_"dC"|gJmW/*ڟ9Iq
ԋa8iBor;yO +_Gh]Qf=^e'rx u[*۔=gϬPpNbByY9ߺgzxz?<<Dtis֡9cS?JSxsb"\*<2WM[i2kQOs*ߡ0U}Kk_fS ~#rAX*Ny8PwEOҹMHB;y~Y3O26~96d{'nH11HvFDIGճ恣!sB<V˶vp5V?ZVוƙ# ucG
g9?zM90*awޟVnz}$T|0՝|Kx=W&/}um]
ev endstream endobj 1235 0 obj << @@ -5383,9 +5379,9 @@ endobj 1233 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.182 409.103 156.068 419.371] +/Rect [146.104 409.103 179.989 419.371] /Subtype /Link -/A << /S /GoTo /D (structident_ad1e271d732662abda25b1320f66e9935) >> +/A << /S /GoTo /D (structident_a8c2ccc106967f36d7191d59d4d5a65dc) >> >> endobj 1237 0 obj << /D [1235 0 R /XYZ 70.866 789.024 null] @@ -5428,16 +5424,18 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1246 0 obj << -/Length 727 +/Length 723 /Filter /FlateDecode >> stream xڵKS0:C# -)N8$2uR}ז1dڤ')꿻?{MtEDJq4Z MQ -aEhƱ` -qEz6y9Փ:+]cE?" -ǐ`9]!yj}kY !9"G3l%DP
I'[bɀBKejj1'ePQ+\8C}ʮmLwI!} -3#rh{cW<I,hL`%w)MZn eί 'q i UBI<qoɴL&Lƶʼn+h{ӹ!EȻ̅ p)~m\p4O2r*(L)?+HBWr=v8,$%t5ǢC("E@y w(:m=p妚ٱ;5oѼ#,:?xR/2ωlr{HW0Nא +)N_y(~Pǁ$!&%=Iv hލӋT"S8-&(tʰh4GXfth~߳|^'M|^6-IUekE?# +) 4+
AsBԠβ@Br,EDG_#edm/C5H$A3̓%?ۗ(8բcO 飬(#X)W
g"flku20BP#IfFnŐ<I,hL`%s)qEZn ek/N +$nꄒxRuCk&*2Km%5VPns{M+!γOB
sj%m +0{<, #Qc)L*V|j;Cp/[FcQv!I܋"J`y`*
g(:@Ѷ~8EjSX7nh^?`u8;9'DV6ܾ$_kVN + +k +c}͘[R`{{?oH endstream endobj 1245 0 obj << @@ -5837,13 +5835,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1373 0 obj << -/Length 1158 +/Length 1157 /Filter /FlateDecode >> stream -x͚]s8+tif6T w&ͤi;3I!l`h@ncLqe,{ -6nFfoܤx[},-<ES.ps0xBA7fNQBw0R5K+mf<J1-OD,PG^ꞹRv NjvJ -C% +x͚]s8+tif* лN3n4qgw&0
,m__ 0Ǝ?xϣ#!@p18~
`6!?!JnʷGc"]F?[jax7|~#f[GQstCSB//XeIA*\@9,& 2~A}'v4,ȑ +PP7<LW^]mM^x;hǃyN\C|@JT}xLtY%Q+k`1cM͔ےgI=˥ZCo(WYk<j֍t0|,Z![ݶW?M,wo[Űjݍjv372&VV*KlCo3WNy\Zp0g~g])Nrـ'ߞ:;g4X8'ƭS6z|ʰ$ںk}h|1yňʽo)$lq;h3GJ)Kd
AӲkTNds",ALb
->QVuMβ`&'Ip8/Kjy=DO +|}D?b endstream endobj 1372 0 obj << @@ -6338,16 +6336,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1452 0 obj << -/Length 998 +/Length 997 /Filter /FlateDecode >> stream -xڵ[6)RCmcnXv^w# -9IЀ`:o_l`y ؆ -/?7TO4E "GQq|_TIumogeS˨7pAhoF~l6ȫXҖ
f%] 욥mf:{F -6G#J
vzQsEN=;ah>{i@5i!:0xeQB2qSV53U%KwǚѴG~gRUP|&^ٗfn#hE,:L<|GF|zhO<gLdTCז1B[S*)<*)+֧,:'49tM5;d:ЀkauHDYW9txdUQ.W1h#҆)Nf#ٔfMEErTYLN5.ľ-6\jXleA`!4\9)4LM4p-R5Ҭ鮼օPW) -m^#tΌ?n,!A+WBEKzd3UHgzE)*T,rڶu589^M`9?yV˺gC,] {/b$6B!vMîA\/vȚ"MWk|vjdag.u61S*Βt1xI40NJ-/x9g;9@ΙqVSݱ _1DЂ#;sNo+X{~_P=")( -P BqDƳ-u~0u*s{>\dŰKK-h=-v\-]? +xڵ[8~iմVniWVO|LCK ~{ +O,R=媞S~9!z~*my?<Kd6RMiT'9,)j2zBmb_C,6cb\ChsRh4ʨp?p-RΓ5ҬօPW)'ʼFj
bҟIe
R^<RZ#J(HE*S-JH>%^lN:;N-e8s~Av9"uVĤjx hf)M~ĞǽAE]R맰Kb%ËvԲ%I[S%13IJiI˛S詒q%RWb]<'jbCENwɷq s&׳}PzM f\:oh b8!Fo߭n4=wEOBP$EJA(@Ƴ-y~0u,-Y1n}I7We0xw/Pvj~p endstream endobj 1451 0 obj << @@ -8662,12 +8656,12 @@ endobj /Limits [(section.4.2) (section.4.7)] >> endobj 1519 0 obj << -/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R] -/Limits [(section.4.8) (structident_a91db2d18476e0a527ba20e04ca2c3e74)] +/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1240 0 R] +/Limits [(section.4.8) (structident_a8c2ccc106967f36d7191d59d4d5a65dc)] >> endobj 1520 0 obj << -/Names [(structident_ad1e271d732662abda25b1320f66e9935) 1240 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R] -/Limits [(structident_ad1e271d732662abda25b1320f66e9935) (subsection.4.1.1)] +/Names [(structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R] +/Limits [(structident_a91db2d18476e0a527ba20e04ca2c3e74) (subsection.4.1.1)] >> endobj 1521 0 obj << /Names [(subsection.4.10.1) 466 0 R (subsection.4.10.2) 470 0 R (subsection.4.2.1) 86 0 R (subsection.4.2.2) 90 0 R (subsection.4.2.3) 118 0 R (subsection.4.3.1) 130 0 R] @@ -8834,8 +8828,8 @@ endobj >> endobj 1561 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20130912114258-05'00') -/ModDate (D:20130912114258-05'00') +/CreationDate (D:20131213120956-06'00') +/ModDate (D:20131213120956-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj @@ -8847,567 +8841,567 @@ xref 0000000004 00000 f 0000000000 00000 f 0000000015 00000 n -0000056114 00000 n -0000341492 00000 n +0000056106 00000 n +0000341420 00000 n 0000000060 00000 n 0000000304 00000 n -0000056295 00000 n -0000341420 00000 n +0000056287 00000 n +0000341348 00000 n 0000000351 00000 n 0000000438 00000 n -0000056417 00000 n -0000341334 00000 n +0000056409 00000 n +0000341262 00000 n 0000000486 00000 n 0000000619 00000 n -0000059563 00000 n -0000341248 00000 n +0000059552 00000 n +0000341176 00000 n 0000000667 00000 n 0000000873 00000 n -0000059685 00000 n -0000341162 00000 n +0000059674 00000 n +0000341090 00000 n 0000000921 00000 n 0000001181 00000 n -0000059807 00000 n -0000341039 00000 n +0000059796 00000 n +0000340967 00000 n 0000001229 00000 n 0000001301 00000 n -0000063785 00000 n -0000340941 00000 n +0000063772 00000 n +0000340869 00000 n 0000001354 00000 n 0000001522 00000 n -0000063907 00000 n -0000340867 00000 n +0000063894 00000 n +0000340795 00000 n 0000001580 00000 n 0000001695 00000 n -0000064029 00000 n -0000340793 00000 n +0000064016 00000 n +0000340721 00000 n 0000001753 00000 n 0000001863 00000 n -0000064150 00000 n -0000340707 00000 n +0000064137 00000 n +0000340635 00000 n 0000001911 00000 n 0000002031 00000 n -0000069273 00000 n -0000340597 00000 n +0000069261 00000 n +0000340525 00000 n 0000002079 00000 n 0000002146 00000 n -0000069394 00000 n -0000340536 00000 n +0000069382 00000 n +0000340464 00000 n 0000002199 00000 n 0000002332 00000 n -0000073594 00000 n -0000340411 00000 n +0000073578 00000 n +0000340339 00000 n 0000002378 00000 n 0000002468 00000 n -0000073654 00000 n -0000340350 00000 n +0000073638 00000 n +0000340278 00000 n 0000002516 00000 n 0000002578 00000 n -0000075353 00000 n -0000340224 00000 n +0000075335 00000 n +0000340152 00000 n 0000002624 00000 n 0000002709 00000 n -0000075413 00000 n -0000340163 00000 n +0000075395 00000 n +0000340091 00000 n 0000002757 00000 n 0000002837 00000 n -0000078386 00000 n -0000340034 00000 n +0000078366 00000 n +0000339962 00000 n 0000002883 00000 n 0000003013 00000 n -0000078507 00000 n -0000339923 00000 n +0000078487 00000 n +0000339851 00000 n 0000003061 00000 n 0000003176 00000 n -0000078567 00000 n -0000339862 00000 n +0000078547 00000 n +0000339790 00000 n 0000003229 00000 n 0000003359 00000 n -0000092863 00000 n -0000339736 00000 n +0000092831 00000 n +0000339664 00000 n 0000003407 00000 n 0000003492 00000 n -0000092923 00000 n -0000339662 00000 n +0000092891 00000 n +0000339590 00000 n 0000003545 00000 n 0000003675 00000 n -0000092983 00000 n -0000339536 00000 n +0000092951 00000 n +0000339464 00000 n 0000003728 00000 n 0000003911 00000 n -0000093104 00000 n -0000339462 00000 n +0000093072 00000 n +0000339390 00000 n 0000003969 00000 n 0000004120 00000 n -0000093225 00000 n -0000339373 00000 n +0000093193 00000 n +0000339301 00000 n 0000004178 00000 n 0000004297 00000 n -0000093346 00000 n -0000339282 00000 n +0000093314 00000 n +0000339210 00000 n 0000004356 00000 n 0000004503 00000 n -0000093468 00000 n -0000339190 00000 n +0000093436 00000 n +0000339118 00000 n 0000004562 00000 n 0000004709 00000 n -0000093590 00000 n -0000339098 00000 n +0000093558 00000 n +0000339026 00000 n 0000004768 00000 n 0000004867 00000 n -0000093711 00000 n -0000339020 00000 n +0000093679 00000 n +0000338948 00000 n 0000004926 00000 n 0000005030 00000 n -0000094598 00000 n -0000338904 00000 n +0000094563 00000 n +0000338832 00000 n 0000005084 00000 n 0000005220 00000 n -0000094720 00000 n -0000338839 00000 n +0000094685 00000 n +0000338767 00000 n 0000005279 00000 n 0000005345 00000 n -0000096691 00000 n -0000338709 00000 n +0000096654 00000 n +0000338637 00000 n 0000005394 00000 n 0000005525 00000 n -0000096813 00000 n -0000338630 00000 n +0000096776 00000 n +0000338558 00000 n 0000005579 00000 n 0000005710 00000 n -0000096874 00000 n -0000338512 00000 n +0000096837 00000 n +0000338440 00000 n 0000005764 00000 n 0000005905 00000 n -0000096996 00000 n -0000338447 00000 n +0000096959 00000 n +0000338375 00000 n 0000005964 00000 n 0000006092 00000 n -0000099964 00000 n -0000338316 00000 n +0000099925 00000 n +0000338244 00000 n 0000006141 00000 n 0000006275 00000 n -0000100086 00000 n -0000338237 00000 n +0000100047 00000 n +0000338165 00000 n 0000006329 00000 n 0000006460 00000 n -0000100147 00000 n -0000338119 00000 n +0000100108 00000 n +0000338047 00000 n 0000006514 00000 n 0000006655 00000 n -0000100269 00000 n -0000338040 00000 n +0000100230 00000 n +0000337968 00000 n 0000006714 00000 n 0000006811 00000 n -0000100452 00000 n -0000337961 00000 n +0000100413 00000 n +0000337889 00000 n 0000006870 00000 n 0000006957 00000 n -0000106674 00000 n -0000337830 00000 n +0000106637 00000 n +0000337758 00000 n 0000007006 00000 n 0000007143 00000 n -0000106856 00000 n -0000337751 00000 n +0000106819 00000 n +0000337679 00000 n 0000007197 00000 n 0000007328 00000 n -0000106917 00000 n -0000337619 00000 n +0000106880 00000 n +0000337547 00000 n 0000007382 00000 n 0000007518 00000 n -0000107039 00000 n -0000337554 00000 n +0000107002 00000 n +0000337482 00000 n 0000007577 00000 n 0000007658 00000 n -0000107161 00000 n -0000337436 00000 n +0000107124 00000 n +0000337364 00000 n 0000007712 00000 n 0000007853 00000 n -0000107281 00000 n -0000337357 00000 n +0000107244 00000 n +0000337285 00000 n 0000007912 00000 n 0000008105 00000 n -0000107462 00000 n -0000337264 00000 n +0000107425 00000 n +0000337192 00000 n 0000008164 00000 n 0000008284 00000 n -0000110578 00000 n -0000337171 00000 n +0000110537 00000 n +0000337099 00000 n 0000008343 00000 n 0000008468 00000 n -0000110761 00000 n -0000337078 00000 n +0000110720 00000 n +0000337006 00000 n 0000008527 00000 n 0000008675 00000 n -0000110944 00000 n -0000336985 00000 n +0000110903 00000 n +0000336913 00000 n 0000008734 00000 n 0000008892 00000 n -0000111127 00000 n -0000336906 00000 n +0000111086 00000 n +0000336834 00000 n 0000008951 00000 n 0000009121 00000 n -0000115787 00000 n -0000336775 00000 n +0000115744 00000 n +0000336703 00000 n 0000009170 00000 n 0000009291 00000 n -0000115909 00000 n -0000336696 00000 n +0000115866 00000 n +0000336624 00000 n 0000009345 00000 n 0000009476 00000 n -0000115970 00000 n -0000336578 00000 n +0000115927 00000 n +0000336506 00000 n 0000009530 00000 n 0000009671 00000 n -0000116092 00000 n -0000336499 00000 n +0000116049 00000 n +0000336427 00000 n 0000009730 00000 n 0000009893 00000 n -0000116274 00000 n -0000336406 00000 n +0000116231 00000 n +0000336334 00000 n 0000009952 00000 n 0000010110 00000 n -0000116455 00000 n -0000336313 00000 n +0000116412 00000 n +0000336241 00000 n 0000010169 00000 n 0000010337 00000 n -0000118576 00000 n -0000336220 00000 n +0000118533 00000 n +0000336148 00000 n 0000010396 00000 n 0000010559 00000 n -0000118759 00000 n -0000336141 00000 n +0000118716 00000 n +0000336069 00000 n 0000010618 00000 n 0000010748 00000 n -0000137235 00000 n -0000336010 00000 n +0000137190 00000 n +0000335938 00000 n 0000010797 00000 n 0000010888 00000 n -0000140969 00000 n -0000335931 00000 n +0000140923 00000 n +0000335859 00000 n 0000010942 00000 n 0000011073 00000 n -0000141031 00000 n -0000335799 00000 n +0000140985 00000 n +0000335727 00000 n 0000011127 00000 n 0000011311 00000 n -0000141156 00000 n -0000335734 00000 n +0000141110 00000 n +0000335662 00000 n 0000011370 00000 n 0000011451 00000 n -0000142478 00000 n -0000335615 00000 n +0000142432 00000 n +0000335543 00000 n 0000011505 00000 n 0000011646 00000 n -0000142602 00000 n -0000335536 00000 n +0000142556 00000 n +0000335464 00000 n 0000011705 00000 n 0000011817 00000 n -0000146501 00000 n -0000335443 00000 n +0000146450 00000 n +0000335371 00000 n 0000011876 00000 n 0000012029 00000 n -0000146689 00000 n -0000335350 00000 n +0000146638 00000 n +0000335278 00000 n 0000012088 00000 n 0000012246 00000 n -0000146814 00000 n -0000335257 00000 n +0000146763 00000 n +0000335185 00000 n 0000012305 00000 n 0000012458 00000 n -0000146939 00000 n -0000335164 00000 n +0000146888 00000 n +0000335092 00000 n 0000012517 00000 n 0000012675 00000 n -0000147063 00000 n -0000335071 00000 n +0000147012 00000 n +0000334999 00000 n 0000012734 00000 n 0000012887 00000 n -0000147251 00000 n -0000334978 00000 n +0000147200 00000 n +0000334906 00000 n 0000012946 00000 n 0000013104 00000 n -0000151608 00000 n -0000334885 00000 n +0000151555 00000 n +0000334813 00000 n 0000013163 00000 n 0000013316 00000 n -0000151733 00000 n -0000334792 00000 n +0000151680 00000 n +0000334720 00000 n 0000013375 00000 n 0000013533 00000 n -0000151857 00000 n -0000334699 00000 n +0000151804 00000 n +0000334627 00000 n 0000013593 00000 n 0000013746 00000 n -0000152045 00000 n -0000334606 00000 n +0000151992 00000 n +0000334534 00000 n 0000013806 00000 n 0000013964 00000 n -0000152170 00000 n -0000334513 00000 n +0000152117 00000 n +0000334441 00000 n 0000014024 00000 n 0000014177 00000 n -0000152294 00000 n -0000334420 00000 n +0000152241 00000 n +0000334348 00000 n 0000014237 00000 n 0000014395 00000 n -0000155137 00000 n -0000334327 00000 n +0000155083 00000 n +0000334255 00000 n 0000014455 00000 n 0000014590 00000 n -0000155324 00000 n -0000334234 00000 n +0000155270 00000 n +0000334162 00000 n 0000014650 00000 n 0000014775 00000 n -0000155512 00000 n -0000334141 00000 n +0000155458 00000 n +0000334069 00000 n 0000014835 00000 n 0000014965 00000 n -0000155700 00000 n -0000334048 00000 n +0000155646 00000 n +0000333976 00000 n 0000015025 00000 n 0000015150 00000 n -0000155888 00000 n -0000333955 00000 n +0000155834 00000 n +0000333883 00000 n 0000015210 00000 n 0000015363 00000 n -0000156075 00000 n -0000333862 00000 n +0000156021 00000 n +0000333790 00000 n 0000015423 00000 n 0000015589 00000 n -0000160247 00000 n -0000333769 00000 n +0000160192 00000 n +0000333697 00000 n 0000015649 00000 n 0000015820 00000 n -0000160372 00000 n -0000333676 00000 n +0000160317 00000 n +0000333604 00000 n 0000015880 00000 n 0000016046 00000 n -0000160496 00000 n -0000333583 00000 n +0000160441 00000 n +0000333511 00000 n 0000016106 00000 n 0000016277 00000 n -0000160621 00000 n -0000333490 00000 n +0000160566 00000 n +0000333418 00000 n 0000016337 00000 n 0000016439 00000 n -0000162587 00000 n -0000333397 00000 n +0000162530 00000 n +0000333325 00000 n 0000016499 00000 n 0000016606 00000 n -0000162774 00000 n -0000333318 00000 n +0000162717 00000 n +0000333246 00000 n 0000016666 00000 n 0000016768 00000 n -0000169289 00000 n -0000333187 00000 n +0000169233 00000 n +0000333115 00000 n 0000016817 00000 n 0000016920 00000 n -0000169414 00000 n -0000333108 00000 n +0000169358 00000 n +0000333036 00000 n 0000016974 00000 n 0000017105 00000 n -0000169476 00000 n -0000332990 00000 n +0000169420 00000 n +0000332918 00000 n 0000017159 00000 n 0000017300 00000 n -0000169601 00000 n -0000332911 00000 n +0000169545 00000 n +0000332839 00000 n 0000017359 00000 n 0000017466 00000 n -0000169788 00000 n -0000332818 00000 n +0000169732 00000 n +0000332746 00000 n 0000017525 00000 n 0000017670 00000 n -0000169974 00000 n -0000332725 00000 n +0000169918 00000 n +0000332653 00000 n 0000017729 00000 n 0000017912 00000 n -0000173219 00000 n -0000332632 00000 n +0000173165 00000 n +0000332560 00000 n 0000017971 00000 n 0000018139 00000 n -0000173407 00000 n -0000332539 00000 n +0000173353 00000 n +0000332467 00000 n 0000018198 00000 n 0000018323 00000 n -0000173594 00000 n -0000332446 00000 n +0000173540 00000 n +0000332374 00000 n 0000018382 00000 n 0000018545 00000 n -0000173781 00000 n -0000332353 00000 n +0000173727 00000 n +0000332281 00000 n 0000018604 00000 n 0000018701 00000 n -0000173968 00000 n -0000332260 00000 n +0000173914 00000 n +0000332188 00000 n 0000018760 00000 n 0000018862 00000 n -0000177061 00000 n -0000332181 00000 n +0000177001 00000 n +0000332109 00000 n 0000018921 00000 n 0000019061 00000 n -0000183663 00000 n -0000332050 00000 n +0000183602 00000 n +0000331978 00000 n 0000019110 00000 n 0000019282 00000 n -0000183788 00000 n -0000331971 00000 n +0000183727 00000 n +0000331899 00000 n 0000019336 00000 n 0000019467 00000 n -0000183850 00000 n -0000331839 00000 n +0000183789 00000 n +0000331767 00000 n 0000019521 00000 n 0000019657 00000 n -0000183974 00000 n -0000331760 00000 n +0000183913 00000 n +0000331688 00000 n 0000019716 00000 n 0000019797 00000 n -0000184099 00000 n -0000331667 00000 n +0000184038 00000 n +0000331595 00000 n 0000019856 00000 n 0000019960 00000 n -0000184224 00000 n -0000331574 00000 n +0000184163 00000 n +0000331502 00000 n 0000020019 00000 n 0000020095 00000 n -0000184348 00000 n -0000331481 00000 n +0000184287 00000 n +0000331409 00000 n 0000020154 00000 n 0000020253 00000 n -0000184472 00000 n -0000331388 00000 n +0000184411 00000 n +0000331316 00000 n 0000020312 00000 n 0000020388 00000 n -0000189027 00000 n -0000331309 00000 n +0000188964 00000 n +0000331237 00000 n 0000020447 00000 n 0000020546 00000 n -0000189089 00000 n -0000331191 00000 n +0000189026 00000 n +0000331119 00000 n 0000020600 00000 n 0000020741 00000 n -0000189214 00000 n -0000331112 00000 n +0000189151 00000 n +0000331040 00000 n 0000020800 00000 n 0000020927 00000 n -0000189401 00000 n -0000331019 00000 n +0000189338 00000 n +0000330947 00000 n 0000020986 00000 n 0000021161 00000 n -0000191868 00000 n -0000330926 00000 n +0000191800 00000 n +0000330854 00000 n 0000021220 00000 n 0000021405 00000 n -0000192056 00000 n -0000330847 00000 n +0000191988 00000 n +0000330775 00000 n 0000021464 00000 n 0000021672 00000 n -0000196454 00000 n -0000330730 00000 n +0000196383 00000 n +0000330658 00000 n 0000021722 00000 n 0000021828 00000 n -0000196579 00000 n -0000330651 00000 n +0000196508 00000 n +0000330579 00000 n 0000021883 00000 n 0000022014 00000 n -0000196640 00000 n -0000330533 00000 n +0000196569 00000 n +0000330461 00000 n 0000022069 00000 n 0000022210 00000 n -0000196765 00000 n -0000330454 00000 n +0000196694 00000 n +0000330382 00000 n 0000022270 00000 n 0000022441 00000 n -0000196953 00000 n -0000330375 00000 n +0000196882 00000 n +0000330303 00000 n 0000022501 00000 n 0000022644 00000 n -0000200172 00000 n -0000330243 00000 n +0000200106 00000 n +0000330171 00000 n 0000022691 00000 n 0000022817 00000 n -0000200296 00000 n -0000330139 00000 n +0000200230 00000 n +0000330067 00000 n 0000022866 00000 n 0000023010 00000 n -0000200420 00000 n -0000330060 00000 n +0000200354 00000 n +0000329988 00000 n 0000023064 00000 n 0000023195 00000 n -0000200482 00000 n -0000329942 00000 n +0000200416 00000 n +0000329870 00000 n 0000023249 00000 n 0000023408 00000 n -0000200607 00000 n -0000329863 00000 n +0000200541 00000 n +0000329791 00000 n 0000023467 00000 n 0000023520 00000 n -0000200732 00000 n -0000329770 00000 n +0000200666 00000 n +0000329698 00000 n 0000023579 00000 n 0000023642 00000 n -0000201978 00000 n -0000329677 00000 n +0000201908 00000 n +0000329605 00000 n 0000023701 00000 n 0000023782 00000 n -0000202103 00000 n -0000329584 00000 n +0000202033 00000 n +0000329512 00000 n 0000023841 00000 n 0000023922 00000 n -0000202227 00000 n -0000329505 00000 n +0000202157 00000 n +0000329433 00000 n 0000023981 00000 n 0000024062 00000 n -0000329425 00000 n +0000329353 00000 n 0000024121 00000 n 0000024174 00000 n -0000024559 00000 n -0000024739 00000 n +0000024564 00000 n +0000024744 00000 n 0000024226 00000 n -0000024678 00000 n -0000327646 00000 n -0000327996 00000 n -0000026198 00000 n -0000026079 00000 n -0000024811 00000 n -0000326935 00000 n -0000326616 00000 n -0000027818 00000 n -0000027968 00000 n -0000028121 00000 n -0000028274 00000 n -0000028427 00000 n -0000028580 00000 n -0000028733 00000 n -0000028891 00000 n -0000029055 00000 n -0000029218 00000 n -0000029371 00000 n -0000029524 00000 n -0000029681 00000 n -0000029831 00000 n -0000029984 00000 n -0000030134 00000 n -0000030286 00000 n -0000030436 00000 n -0000030589 00000 n -0000030748 00000 n -0000030901 00000 n -0000031060 00000 n -0000031219 00000 n -0000031383 00000 n -0000031546 00000 n -0000031710 00000 n -0000031874 00000 n -0000032038 00000 n -0000032198 00000 n +0000024683 00000 n +0000327574 00000 n +0000327924 00000 n +0000026200 00000 n +0000026081 00000 n +0000024816 00000 n +0000326863 00000 n +0000326544 00000 n +0000027820 00000 n +0000027970 00000 n +0000028123 00000 n +0000028276 00000 n +0000028429 00000 n +0000028582 00000 n +0000028735 00000 n +0000028893 00000 n +0000029057 00000 n +0000029220 00000 n +0000029373 00000 n +0000029526 00000 n +0000029683 00000 n +0000029833 00000 n +0000029986 00000 n +0000030136 00000 n +0000030288 00000 n +0000030438 00000 n +0000030591 00000 n +0000030750 00000 n +0000030903 00000 n +0000031062 00000 n +0000031221 00000 n +0000031385 00000 n +0000031548 00000 n +0000031712 00000 n +0000031876 00000 n +0000032040 00000 n +0000032200 00000 n 0000034267 00000 n -0000032415 00000 n -0000027455 00000 n -0000026296 00000 n -0000327109 00000 n -0000032354 00000 n +0000032417 00000 n +0000027457 00000 n +0000026298 00000 n +0000327037 00000 n +0000032356 00000 n 0000034431 00000 n 0000034583 00000 n 0000034742 00000 n @@ -9447,967 +9441,967 @@ xref 0000040207 00000 n 0000040371 00000 n 0000040532 00000 n -0000042437 00000 n +0000042431 00000 n 0000040694 00000 n 0000033816 00000 n -0000032527 00000 n -0000042601 00000 n -0000042764 00000 n -0000042928 00000 n -0000043093 00000 n -0000043258 00000 n -0000043423 00000 n -0000043588 00000 n -0000043753 00000 n -0000043918 00000 n -0000044082 00000 n -0000044247 00000 n -0000044412 00000 n -0000044576 00000 n -0000044740 00000 n -0000044904 00000 n -0000045068 00000 n -0000045233 00000 n -0000045398 00000 n -0000045563 00000 n -0000045716 00000 n -0000045873 00000 n -0000046032 00000 n -0000046196 00000 n -0000046360 00000 n -0000046523 00000 n -0000046687 00000 n -0000046851 00000 n -0000047014 00000 n -0000047178 00000 n -0000047342 00000 n -0000047506 00000 n -0000047658 00000 n -0000047817 00000 n -0000047975 00000 n -0000048139 00000 n -0000048302 00000 n -0000048464 00000 n -0000048628 00000 n -0000048789 00000 n -0000050348 00000 n -0000048951 00000 n -0000041986 00000 n +0000032529 00000 n +0000042595 00000 n +0000042758 00000 n +0000042922 00000 n +0000043087 00000 n +0000043252 00000 n +0000043417 00000 n +0000043582 00000 n +0000043747 00000 n +0000043912 00000 n +0000044076 00000 n +0000044241 00000 n +0000044406 00000 n +0000044570 00000 n +0000044734 00000 n +0000044898 00000 n +0000045062 00000 n +0000045227 00000 n +0000045392 00000 n +0000045557 00000 n +0000045710 00000 n +0000045867 00000 n +0000046026 00000 n +0000046190 00000 n +0000046354 00000 n +0000046517 00000 n +0000046681 00000 n +0000046845 00000 n +0000047008 00000 n +0000047172 00000 n +0000047336 00000 n +0000047500 00000 n +0000047652 00000 n +0000047811 00000 n +0000047969 00000 n +0000048133 00000 n +0000048296 00000 n +0000048458 00000 n +0000048622 00000 n +0000048783 00000 n +0000050340 00000 n +0000048945 00000 n +0000041980 00000 n 0000040792 00000 n -0000050507 00000 n -0000050670 00000 n -0000050834 00000 n -0000050998 00000 n -0000051162 00000 n -0000051316 00000 n -0000051476 00000 n -0000051635 00000 n -0000051800 00000 n -0000051964 00000 n -0000052114 00000 n -0000052266 00000 n -0000052425 00000 n -0000052582 00000 n -0000052746 00000 n -0000052910 00000 n -0000053074 00000 n -0000053238 00000 n -0000053402 00000 n -0000053563 00000 n -0000050057 00000 n -0000049049 00000 n -0000055889 00000 n -0000056477 00000 n -0000055750 00000 n -0000053661 00000 n -0000056053 00000 n -0000056173 00000 n -0000056234 00000 n -0000326761 00000 n -0000056355 00000 n -0000328114 00000 n -0000059867 00000 n -0000059321 00000 n -0000056603 00000 n -0000059440 00000 n -0000326471 00000 n -0000059501 00000 n -0000059623 00000 n -0000059745 00000 n -0000063181 00000 n -0000063342 00000 n -0000063499 00000 n -0000066839 00000 n -0000064210 00000 n -0000063026 00000 n -0000060006 00000 n -0000063663 00000 n -0000063724 00000 n -0000063845 00000 n -0000063967 00000 n -0000064089 00000 n -0000092802 00000 n -0000096630 00000 n -0000099903 00000 n -0000066995 00000 n -0000067158 00000 n -0000067319 00000 n -0000067481 00000 n -0000067645 00000 n -0000067805 00000 n -0000068005 00000 n -0000068206 00000 n -0000068358 00000 n -0000068555 00000 n -0000068753 00000 n -0000068952 00000 n -0000069454 00000 n -0000066604 00000 n -0000064336 00000 n -0000069151 00000 n -0000069212 00000 n -0000069333 00000 n -0000106613 00000 n -0000115726 00000 n -0000137173 00000 n -0000183601 00000 n -0000169227 00000 n -0000078446 00000 n -0000100208 00000 n -0000100391 00000 n -0000200234 00000 n -0000147001 00000 n -0000151795 00000 n -0000176999 00000 n -0000173532 00000 n -0000070376 00000 n -0000070196 00000 n -0000069580 00000 n -0000070315 00000 n -0000071058 00000 n -0000070878 00000 n -0000070475 00000 n -0000070997 00000 n -0000071992 00000 n -0000072146 00000 n -0000072300 00000 n -0000072454 00000 n -0000072608 00000 n -0000072762 00000 n -0000072916 00000 n -0000073070 00000 n -0000073224 00000 n -0000073378 00000 n -0000073714 00000 n -0000071781 00000 n -0000071143 00000 n -0000073533 00000 n -0000328232 00000 n -0000074362 00000 n -0000074182 00000 n -0000073800 00000 n -0000074301 00000 n -0000074985 00000 n -0000075138 00000 n -0000075473 00000 n -0000074838 00000 n -0000074447 00000 n -0000075292 00000 n -0000076122 00000 n -0000075942 00000 n -0000075559 00000 n -0000076061 00000 n -0000078627 00000 n -0000078206 00000 n -0000076207 00000 n -0000078325 00000 n -0000081711 00000 n -0000081864 00000 n -0000082018 00000 n -0000082537 00000 n -0000081556 00000 n -0000078766 00000 n -0000082172 00000 n -0000082233 00000 n -0000082294 00000 n -0000327819 00000 n -0000082355 00000 n -0000082416 00000 n -0000082477 00000 n -0000084069 00000 n -0000084222 00000 n -0000084558 00000 n -0000083922 00000 n -0000082690 00000 n -0000084375 00000 n -0000084436 00000 n -0000084497 00000 n -0000328350 00000 n -0000085610 00000 n -0000085430 00000 n -0000084684 00000 n -0000085549 00000 n -0000086610 00000 n -0000086430 00000 n -0000085709 00000 n -0000086549 00000 n -0000087884 00000 n -0000087647 00000 n -0000086709 00000 n -0000087766 00000 n -0000087827 00000 n -0000089410 00000 n -0000089169 00000 n -0000088010 00000 n -0000089288 00000 n -0000089349 00000 n -0000091213 00000 n -0000091366 00000 n -0000091562 00000 n -0000091759 00000 n -0000091955 00000 n -0000092152 00000 n -0000092348 00000 n -0000092544 00000 n -0000093772 00000 n -0000091018 00000 n -0000089563 00000 n -0000092741 00000 n -0000093043 00000 n -0000093164 00000 n -0000093285 00000 n -0000093407 00000 n -0000093529 00000 n -0000093650 00000 n -0000094659 00000 n -0000094781 00000 n -0000094418 00000 n -0000093884 00000 n -0000094537 00000 n -0000328468 00000 n -0000096178 00000 n -0000096372 00000 n -0000097118 00000 n -0000096031 00000 n -0000094893 00000 n -0000096569 00000 n -0000096752 00000 n -0000096935 00000 n -0000327465 00000 n -0000097057 00000 n -0000099044 00000 n -0000099246 00000 n -0000099443 00000 n -0000099645 00000 n -0000100574 00000 n -0000098881 00000 n -0000097258 00000 n -0000099842 00000 n -0000100025 00000 n -0000100330 00000 n -0000100513 00000 n -0000103448 00000 n -0000103641 00000 n -0000103834 00000 n -0000104031 00000 n -0000104223 00000 n -0000104418 00000 n -0000104610 00000 n -0000104802 00000 n -0000104998 00000 n -0000105190 00000 n -0000105387 00000 n -0000105580 00000 n -0000105773 00000 n -0000105969 00000 n -0000106162 00000 n -0000106359 00000 n -0000107584 00000 n -0000103189 00000 n -0000100728 00000 n -0000106552 00000 n -0000106735 00000 n -0000106795 00000 n -0000106978 00000 n -0000107100 00000 n -0000107222 00000 n -0000107340 00000 n -0000107401 00000 n -0000107523 00000 n -0000110883 00000 n -0000110700 00000 n -0000110517 00000 n -0000111066 00000 n -0000111248 00000 n -0000110337 00000 n -0000107738 00000 n -0000110456 00000 n -0000110639 00000 n -0000110822 00000 n -0000111005 00000 n -0000111187 00000 n -0000113694 00000 n -0000113891 00000 n -0000114088 00000 n -0000114286 00000 n -0000114483 00000 n -0000114681 00000 n -0000114877 00000 n -0000115075 00000 n -0000115272 00000 n -0000115469 00000 n -0000116577 00000 n -0000113483 00000 n -0000111402 00000 n -0000115665 00000 n -0000115848 00000 n -0000116031 00000 n -0000116153 00000 n -0000116214 00000 n -0000116334 00000 n -0000116394 00000 n -0000116516 00000 n -0000118515 00000 n -0000118698 00000 n -0000118881 00000 n -0000118335 00000 n -0000116717 00000 n -0000118454 00000 n -0000118637 00000 n -0000118820 00000 n -0000328586 00000 n -0000121651 00000 n -0000121848 00000 n -0000122079 00000 n -0000122310 00000 n -0000122542 00000 n -0000122774 00000 n -0000123005 00000 n -0000123236 00000 n -0000123468 00000 n -0000123700 00000 n -0000123930 00000 n -0000124161 00000 n -0000124392 00000 n -0000124623 00000 n -0000124854 00000 n -0000125086 00000 n -0000125318 00000 n -0000125550 00000 n -0000125781 00000 n -0000126013 00000 n -0000126245 00000 n -0000126477 00000 n -0000126672 00000 n -0000126869 00000 n -0000127067 00000 n -0000127264 00000 n -0000127462 00000 n -0000127658 00000 n -0000127856 00000 n -0000128053 00000 n -0000128251 00000 n -0000128448 00000 n -0000128646 00000 n -0000128842 00000 n -0000129039 00000 n -0000129236 00000 n -0000129434 00000 n -0000129631 00000 n -0000129829 00000 n -0000130026 00000 n -0000130224 00000 n -0000130421 00000 n -0000130619 00000 n -0000130811 00000 n -0000131006 00000 n -0000131202 00000 n -0000131400 00000 n -0000131597 00000 n -0000131795 00000 n -0000131989 00000 n -0000132186 00000 n -0000132384 00000 n -0000132581 00000 n -0000132778 00000 n -0000132976 00000 n -0000133173 00000 n -0000133370 00000 n -0000133567 00000 n -0000133764 00000 n -0000133960 00000 n -0000134158 00000 n -0000134355 00000 n -0000134553 00000 n -0000134750 00000 n -0000134948 00000 n -0000135145 00000 n -0000135344 00000 n -0000135542 00000 n -0000135741 00000 n -0000135939 00000 n -0000136133 00000 n -0000136329 00000 n -0000136528 00000 n -0000136726 00000 n -0000136917 00000 n -0000137422 00000 n -0000120907 00000 n -0000119021 00000 n -0000137110 00000 n -0000137297 00000 n -0000137359 00000 n -0000141093 00000 n -0000141218 00000 n -0000141281 00000 n -0000141344 00000 n -0000141407 00000 n -0000141470 00000 n -0000141533 00000 n -0000141596 00000 n -0000141659 00000 n -0000141722 00000 n -0000141785 00000 n -0000141848 00000 n -0000141911 00000 n -0000141974 00000 n -0000142037 00000 n -0000142100 00000 n -0000142163 00000 n -0000142226 00000 n -0000142289 00000 n -0000142352 00000 n -0000142415 00000 n -0000160558 00000 n -0000155261 00000 n -0000160746 00000 n -0000155449 00000 n -0000142540 00000 n -0000152356 00000 n -0000162711 00000 n -0000155637 00000 n -0000155825 00000 n -0000147188 00000 n -0000147313 00000 n -0000151670 00000 n -0000151982 00000 n -0000152107 00000 n -0000152232 00000 n -0000146438 00000 n -0000146751 00000 n -0000146626 00000 n -0000146876 00000 n -0000156013 00000 n -0000160184 00000 n -0000160309 00000 n -0000160433 00000 n -0000140313 00000 n -0000140512 00000 n -0000140709 00000 n -0000142725 00000 n -0000140152 00000 n -0000137535 00000 n -0000140906 00000 n -0000327286 00000 n -0000142663 00000 n -0000145585 00000 n -0000145783 00000 n -0000145981 00000 n -0000146179 00000 n -0000147375 00000 n -0000145415 00000 n -0000142895 00000 n -0000146375 00000 n -0000146563 00000 n -0000147125 00000 n -0000150558 00000 n -0000150756 00000 n -0000150954 00000 n -0000151151 00000 n -0000151349 00000 n -0000152418 00000 n -0000150379 00000 n -0000147530 00000 n -0000151545 00000 n -0000151919 00000 n -0000156136 00000 n -0000154952 00000 n -0000152559 00000 n -0000155074 00000 n -0000155199 00000 n -0000155386 00000 n -0000155574 00000 n -0000155762 00000 n -0000155950 00000 n -0000159464 00000 n -0000159662 00000 n -0000159860 00000 n -0000160808 00000 n -0000159302 00000 n -0000156291 00000 n -0000160058 00000 n -0000160121 00000 n -0000160683 00000 n -0000328709 00000 n -0000162898 00000 n -0000162401 00000 n -0000160963 00000 n -0000162524 00000 n -0000162649 00000 n -0000162835 00000 n -0000165584 00000 n -0000165785 00000 n -0000165982 00000 n -0000166183 00000 n -0000166380 00000 n -0000166579 00000 n -0000166776 00000 n -0000166977 00000 n -0000167175 00000 n -0000167374 00000 n -0000167571 00000 n -0000167771 00000 n -0000167969 00000 n -0000168170 00000 n -0000168368 00000 n -0000168568 00000 n -0000168765 00000 n -0000168966 00000 n -0000170097 00000 n -0000165287 00000 n -0000163053 00000 n -0000169164 00000 n -0000169351 00000 n -0000169538 00000 n -0000169663 00000 n -0000169725 00000 n -0000169849 00000 n -0000169912 00000 n -0000170034 00000 n -0000173718 00000 n -0000173156 00000 n -0000173906 00000 n -0000173344 00000 n -0000174029 00000 n -0000172970 00000 n -0000170238 00000 n -0000173093 00000 n -0000173281 00000 n -0000173469 00000 n -0000173656 00000 n -0000173843 00000 n -0000177186 00000 n -0000176750 00000 n -0000174184 00000 n -0000176873 00000 n -0000176936 00000 n -0000177123 00000 n -0000179565 00000 n -0000179763 00000 n -0000179961 00000 n -0000180160 00000 n -0000180358 00000 n -0000180556 00000 n -0000180755 00000 n -0000180954 00000 n -0000181153 00000 n -0000181351 00000 n -0000181550 00000 n -0000181747 00000 n -0000181946 00000 n -0000182145 00000 n -0000182344 00000 n -0000182543 00000 n -0000182742 00000 n -0000182941 00000 n -0000183140 00000 n -0000183339 00000 n -0000184596 00000 n -0000179250 00000 n -0000177327 00000 n -0000183538 00000 n -0000183725 00000 n -0000183911 00000 n -0000184036 00000 n -0000184161 00000 n -0000184286 00000 n -0000184410 00000 n -0000184534 00000 n -0000189151 00000 n -0000191805 00000 n -0000189338 00000 n -0000191993 00000 n -0000188568 00000 n -0000188767 00000 n -0000189526 00000 n -0000188415 00000 n -0000184723 00000 n -0000188964 00000 n -0000189276 00000 n +0000050499 00000 n +0000050662 00000 n +0000050826 00000 n +0000050990 00000 n +0000051154 00000 n +0000051308 00000 n +0000051468 00000 n +0000051627 00000 n +0000051792 00000 n +0000051956 00000 n +0000052106 00000 n +0000052258 00000 n +0000052417 00000 n +0000052574 00000 n +0000052738 00000 n +0000052902 00000 n +0000053066 00000 n +0000053230 00000 n +0000053394 00000 n +0000053555 00000 n +0000050049 00000 n +0000049043 00000 n +0000055881 00000 n +0000056469 00000 n +0000055742 00000 n +0000053653 00000 n +0000056045 00000 n +0000056165 00000 n +0000056226 00000 n +0000326689 00000 n +0000056347 00000 n +0000328042 00000 n +0000059856 00000 n +0000059310 00000 n +0000056595 00000 n +0000059429 00000 n +0000326399 00000 n +0000059490 00000 n +0000059612 00000 n +0000059734 00000 n +0000063168 00000 n +0000063329 00000 n +0000063486 00000 n +0000066827 00000 n +0000064197 00000 n +0000063013 00000 n +0000059995 00000 n +0000063650 00000 n +0000063711 00000 n +0000063832 00000 n +0000063954 00000 n +0000064076 00000 n +0000092770 00000 n +0000096593 00000 n +0000099864 00000 n +0000066983 00000 n +0000067146 00000 n +0000067307 00000 n +0000067469 00000 n +0000067633 00000 n +0000067793 00000 n +0000067993 00000 n +0000068194 00000 n +0000068346 00000 n +0000068543 00000 n +0000068741 00000 n +0000068940 00000 n +0000069442 00000 n +0000066592 00000 n +0000064323 00000 n +0000069139 00000 n +0000069200 00000 n +0000069321 00000 n +0000106576 00000 n +0000115683 00000 n +0000137128 00000 n +0000183540 00000 n +0000169171 00000 n +0000078426 00000 n +0000100169 00000 n +0000100352 00000 n +0000200168 00000 n +0000146950 00000 n +0000151742 00000 n +0000176939 00000 n +0000173478 00000 n +0000070363 00000 n +0000070183 00000 n +0000069568 00000 n +0000070302 00000 n +0000071042 00000 n +0000070862 00000 n +0000070462 00000 n +0000070981 00000 n +0000071976 00000 n +0000072130 00000 n +0000072284 00000 n +0000072438 00000 n +0000072592 00000 n +0000072746 00000 n +0000072900 00000 n +0000073054 00000 n +0000073208 00000 n +0000073362 00000 n +0000073698 00000 n +0000071765 00000 n +0000071127 00000 n +0000073517 00000 n +0000328160 00000 n +0000074344 00000 n +0000074164 00000 n +0000073784 00000 n +0000074283 00000 n +0000074967 00000 n +0000075120 00000 n +0000075455 00000 n +0000074820 00000 n +0000074429 00000 n +0000075274 00000 n +0000076102 00000 n +0000075922 00000 n +0000075541 00000 n +0000076041 00000 n +0000078607 00000 n +0000078186 00000 n +0000076187 00000 n +0000078305 00000 n +0000081692 00000 n +0000081845 00000 n +0000081999 00000 n +0000082518 00000 n +0000081537 00000 n +0000078746 00000 n +0000082153 00000 n +0000082214 00000 n +0000082275 00000 n +0000327747 00000 n +0000082336 00000 n +0000082397 00000 n +0000082458 00000 n +0000084048 00000 n +0000084201 00000 n +0000084537 00000 n +0000083901 00000 n +0000082671 00000 n +0000084354 00000 n +0000084415 00000 n +0000084476 00000 n +0000328278 00000 n +0000085587 00000 n +0000085407 00000 n +0000084663 00000 n +0000085526 00000 n +0000086585 00000 n +0000086405 00000 n +0000085686 00000 n +0000086524 00000 n +0000087856 00000 n +0000087619 00000 n +0000086684 00000 n +0000087738 00000 n +0000087799 00000 n +0000089376 00000 n +0000089135 00000 n +0000087982 00000 n +0000089254 00000 n +0000089315 00000 n +0000091181 00000 n +0000091334 00000 n +0000091530 00000 n +0000091727 00000 n +0000091923 00000 n +0000092120 00000 n +0000092316 00000 n +0000092512 00000 n +0000093740 00000 n +0000090986 00000 n +0000089529 00000 n +0000092709 00000 n +0000093011 00000 n +0000093132 00000 n +0000093253 00000 n +0000093375 00000 n +0000093497 00000 n +0000093618 00000 n +0000094624 00000 n +0000094746 00000 n +0000094383 00000 n +0000093852 00000 n +0000094502 00000 n +0000328396 00000 n +0000096141 00000 n +0000096335 00000 n +0000097081 00000 n +0000095994 00000 n +0000094858 00000 n +0000096532 00000 n +0000096715 00000 n +0000096898 00000 n +0000327393 00000 n +0000097020 00000 n +0000099005 00000 n +0000099207 00000 n +0000099404 00000 n +0000099606 00000 n +0000100535 00000 n +0000098842 00000 n +0000097221 00000 n +0000099803 00000 n +0000099986 00000 n +0000100291 00000 n +0000100474 00000 n +0000103411 00000 n +0000103604 00000 n +0000103797 00000 n +0000103994 00000 n +0000104186 00000 n +0000104381 00000 n +0000104573 00000 n +0000104765 00000 n +0000104961 00000 n +0000105153 00000 n +0000105350 00000 n +0000105543 00000 n +0000105736 00000 n +0000105932 00000 n +0000106125 00000 n +0000106322 00000 n +0000107547 00000 n +0000103152 00000 n +0000100689 00000 n +0000106515 00000 n +0000106698 00000 n +0000106758 00000 n +0000106941 00000 n +0000107063 00000 n +0000107185 00000 n +0000107303 00000 n +0000107364 00000 n +0000107486 00000 n +0000110842 00000 n +0000110659 00000 n +0000110476 00000 n +0000111025 00000 n +0000111207 00000 n +0000110296 00000 n +0000107701 00000 n +0000110415 00000 n +0000110598 00000 n +0000110781 00000 n +0000110964 00000 n +0000111146 00000 n +0000113651 00000 n +0000113848 00000 n +0000114045 00000 n +0000114243 00000 n +0000114440 00000 n +0000114638 00000 n +0000114834 00000 n +0000115032 00000 n +0000115229 00000 n +0000115426 00000 n +0000116534 00000 n +0000113440 00000 n +0000111361 00000 n +0000115622 00000 n +0000115805 00000 n +0000115988 00000 n +0000116110 00000 n +0000116171 00000 n +0000116291 00000 n +0000116351 00000 n +0000116473 00000 n +0000118472 00000 n +0000118655 00000 n +0000118838 00000 n +0000118292 00000 n +0000116674 00000 n +0000118411 00000 n +0000118594 00000 n +0000118777 00000 n +0000328514 00000 n +0000121606 00000 n +0000121803 00000 n +0000122034 00000 n +0000122265 00000 n +0000122497 00000 n +0000122729 00000 n +0000122960 00000 n +0000123191 00000 n +0000123423 00000 n +0000123655 00000 n +0000123885 00000 n +0000124116 00000 n +0000124347 00000 n +0000124578 00000 n +0000124809 00000 n +0000125041 00000 n +0000125273 00000 n +0000125505 00000 n +0000125736 00000 n +0000125968 00000 n +0000126200 00000 n +0000126432 00000 n +0000126627 00000 n +0000126824 00000 n +0000127022 00000 n +0000127219 00000 n +0000127417 00000 n +0000127613 00000 n +0000127811 00000 n +0000128008 00000 n +0000128206 00000 n +0000128403 00000 n +0000128601 00000 n +0000128797 00000 n +0000128994 00000 n +0000129191 00000 n +0000129389 00000 n +0000129586 00000 n +0000129784 00000 n +0000129981 00000 n +0000130179 00000 n +0000130376 00000 n +0000130574 00000 n +0000130766 00000 n +0000130961 00000 n +0000131157 00000 n +0000131355 00000 n +0000131552 00000 n +0000131750 00000 n +0000131944 00000 n +0000132141 00000 n +0000132339 00000 n +0000132536 00000 n +0000132733 00000 n +0000132931 00000 n +0000133128 00000 n +0000133325 00000 n +0000133522 00000 n +0000133719 00000 n +0000133915 00000 n +0000134113 00000 n +0000134310 00000 n +0000134508 00000 n +0000134705 00000 n +0000134903 00000 n +0000135100 00000 n +0000135299 00000 n +0000135497 00000 n +0000135696 00000 n +0000135894 00000 n +0000136088 00000 n +0000136284 00000 n +0000136483 00000 n +0000136681 00000 n +0000136872 00000 n +0000137377 00000 n +0000120862 00000 n +0000118978 00000 n +0000137065 00000 n +0000137252 00000 n +0000137314 00000 n +0000141047 00000 n +0000141172 00000 n +0000141235 00000 n +0000141298 00000 n +0000141361 00000 n +0000141424 00000 n +0000141487 00000 n +0000141550 00000 n +0000141613 00000 n +0000141676 00000 n +0000141739 00000 n +0000141802 00000 n +0000141865 00000 n +0000141928 00000 n +0000141991 00000 n +0000142054 00000 n +0000142117 00000 n +0000142180 00000 n +0000142243 00000 n +0000142306 00000 n +0000142369 00000 n +0000160503 00000 n +0000155207 00000 n +0000160691 00000 n +0000155395 00000 n +0000142494 00000 n +0000152303 00000 n +0000162654 00000 n +0000155583 00000 n +0000155771 00000 n +0000147137 00000 n +0000147262 00000 n +0000151617 00000 n +0000151929 00000 n +0000152054 00000 n +0000152179 00000 n +0000146387 00000 n +0000146700 00000 n +0000146575 00000 n +0000146825 00000 n +0000155959 00000 n +0000160129 00000 n +0000160254 00000 n +0000160378 00000 n +0000140267 00000 n +0000140466 00000 n +0000140663 00000 n +0000142679 00000 n +0000140106 00000 n +0000137490 00000 n +0000140860 00000 n +0000327214 00000 n +0000142617 00000 n +0000145534 00000 n +0000145732 00000 n +0000145930 00000 n +0000146128 00000 n +0000147324 00000 n +0000145364 00000 n +0000142849 00000 n +0000146324 00000 n +0000146512 00000 n +0000147074 00000 n +0000150505 00000 n +0000150703 00000 n +0000150901 00000 n +0000151098 00000 n +0000151296 00000 n +0000152365 00000 n +0000150326 00000 n +0000147479 00000 n +0000151492 00000 n +0000151866 00000 n +0000156082 00000 n +0000154898 00000 n +0000152506 00000 n +0000155020 00000 n +0000155145 00000 n +0000155332 00000 n +0000155520 00000 n +0000155708 00000 n +0000155896 00000 n +0000159409 00000 n +0000159607 00000 n +0000159805 00000 n +0000160753 00000 n +0000159247 00000 n +0000156237 00000 n +0000160003 00000 n +0000160066 00000 n +0000160628 00000 n +0000328637 00000 n +0000162841 00000 n +0000162344 00000 n +0000160908 00000 n +0000162467 00000 n +0000162592 00000 n +0000162778 00000 n +0000165528 00000 n +0000165729 00000 n +0000165926 00000 n +0000166127 00000 n +0000166324 00000 n +0000166523 00000 n +0000166720 00000 n +0000166921 00000 n +0000167119 00000 n +0000167318 00000 n +0000167515 00000 n +0000167715 00000 n +0000167913 00000 n +0000168114 00000 n +0000168312 00000 n +0000168512 00000 n +0000168709 00000 n +0000168910 00000 n +0000170041 00000 n +0000165231 00000 n +0000162996 00000 n +0000169108 00000 n +0000169295 00000 n +0000169482 00000 n +0000169607 00000 n +0000169669 00000 n +0000169793 00000 n +0000169856 00000 n +0000169978 00000 n +0000173664 00000 n +0000173102 00000 n +0000173852 00000 n +0000173290 00000 n +0000173975 00000 n +0000172916 00000 n +0000170182 00000 n +0000173039 00000 n +0000173227 00000 n +0000173415 00000 n +0000173602 00000 n +0000173789 00000 n +0000177126 00000 n +0000176690 00000 n +0000174130 00000 n +0000176813 00000 n +0000176876 00000 n +0000177063 00000 n +0000179504 00000 n +0000179702 00000 n +0000179900 00000 n +0000180099 00000 n +0000180297 00000 n +0000180495 00000 n +0000180694 00000 n +0000180893 00000 n +0000181092 00000 n +0000181290 00000 n +0000181489 00000 n +0000181686 00000 n +0000181885 00000 n +0000182084 00000 n +0000182283 00000 n +0000182482 00000 n +0000182681 00000 n +0000182880 00000 n +0000183079 00000 n +0000183278 00000 n +0000184535 00000 n +0000179189 00000 n +0000177267 00000 n +0000183477 00000 n +0000183664 00000 n +0000183850 00000 n +0000183975 00000 n +0000184100 00000 n +0000184225 00000 n +0000184349 00000 n +0000184473 00000 n +0000189088 00000 n +0000191737 00000 n +0000189275 00000 n +0000191925 00000 n +0000188505 00000 n +0000188704 00000 n 0000189463 00000 n -0000328834 00000 n -0000192181 00000 n -0000191619 00000 n -0000189681 00000 n -0000191742 00000 n -0000191930 00000 n -0000192118 00000 n -0000195549 00000 n -0000195741 00000 n -0000195939 00000 n -0000196131 00000 n -0000197078 00000 n -0000195378 00000 n -0000192322 00000 n -0000196328 00000 n -0000196391 00000 n -0000196516 00000 n -0000196702 00000 n -0000196827 00000 n -0000196890 00000 n -0000197015 00000 n -0000197794 00000 n -0000197608 00000 n -0000197219 00000 n -0000197731 00000 n -0000199168 00000 n -0000199356 00000 n -0000199544 00000 n -0000199732 00000 n -0000199920 00000 n -0000200856 00000 n -0000198988 00000 n -0000197880 00000 n -0000200109 00000 n -0000200358 00000 n -0000200544 00000 n -0000200669 00000 n -0000200794 00000 n -0000202040 00000 n -0000202164 00000 n -0000202289 00000 n -0000201792 00000 n -0000200983 00000 n -0000201915 00000 n -0000203848 00000 n -0000203999 00000 n -0000204150 00000 n -0000204300 00000 n -0000204451 00000 n -0000204601 00000 n -0000204752 00000 n -0000204902 00000 n -0000205053 00000 n -0000205204 00000 n -0000205355 00000 n -0000205506 00000 n -0000205657 00000 n -0000205808 00000 n -0000205959 00000 n -0000206110 00000 n -0000206261 00000 n -0000206411 00000 n -0000206562 00000 n -0000206713 00000 n -0000206863 00000 n -0000207014 00000 n -0000207165 00000 n -0000207316 00000 n -0000207465 00000 n -0000207615 00000 n -0000207766 00000 n -0000207917 00000 n -0000208068 00000 n -0000208219 00000 n -0000208370 00000 n -0000208521 00000 n -0000208672 00000 n -0000208823 00000 n -0000208974 00000 n -0000209124 00000 n -0000209275 00000 n -0000209425 00000 n -0000209576 00000 n -0000209726 00000 n -0000209877 00000 n -0000210028 00000 n -0000210179 00000 n -0000210330 00000 n -0000210481 00000 n -0000210632 00000 n -0000210783 00000 n -0000210934 00000 n -0000211083 00000 n -0000211295 00000 n -0000203272 00000 n -0000202402 00000 n -0000211232 00000 n -0000328959 00000 n -0000213369 00000 n -0000213520 00000 n -0000213671 00000 n -0000213820 00000 n -0000213969 00000 n -0000214119 00000 n -0000214270 00000 n -0000214421 00000 n -0000214571 00000 n -0000214722 00000 n -0000214873 00000 n -0000215024 00000 n -0000215175 00000 n -0000215326 00000 n -0000215477 00000 n -0000215625 00000 n -0000215775 00000 n -0000215925 00000 n -0000216076 00000 n -0000216227 00000 n -0000216378 00000 n -0000216529 00000 n -0000216680 00000 n -0000216831 00000 n -0000216982 00000 n -0000217132 00000 n -0000217282 00000 n -0000217433 00000 n -0000217584 00000 n -0000217735 00000 n -0000217886 00000 n -0000218037 00000 n -0000218188 00000 n -0000218338 00000 n -0000218487 00000 n -0000218637 00000 n -0000218788 00000 n -0000218939 00000 n -0000219090 00000 n -0000219241 00000 n -0000219392 00000 n -0000219543 00000 n -0000219694 00000 n -0000219845 00000 n -0000219995 00000 n -0000220146 00000 n -0000220297 00000 n -0000220448 00000 n -0000220599 00000 n -0000220749 00000 n -0000220900 00000 n -0000221050 00000 n -0000221201 00000 n -0000221351 00000 n -0000221502 00000 n -0000221653 00000 n -0000221804 00000 n -0000221954 00000 n -0000222103 00000 n -0000222253 00000 n -0000222404 00000 n -0000222555 00000 n -0000222706 00000 n -0000222857 00000 n -0000223008 00000 n -0000223159 00000 n -0000223309 00000 n -0000223458 00000 n -0000225668 00000 n -0000223670 00000 n -0000212622 00000 n -0000211382 00000 n -0000223607 00000 n -0000225819 00000 n -0000225969 00000 n -0000226119 00000 n -0000226270 00000 n -0000226419 00000 n -0000226570 00000 n -0000226721 00000 n -0000226871 00000 n -0000227022 00000 n -0000227173 00000 n -0000227323 00000 n -0000227474 00000 n -0000227625 00000 n -0000227776 00000 n -0000227927 00000 n -0000228076 00000 n -0000228226 00000 n -0000228377 00000 n -0000228528 00000 n -0000228679 00000 n -0000228830 00000 n -0000228980 00000 n -0000229131 00000 n -0000229282 00000 n -0000229433 00000 n -0000229583 00000 n -0000229734 00000 n -0000229885 00000 n -0000230034 00000 n -0000230183 00000 n -0000230334 00000 n -0000230484 00000 n -0000230635 00000 n -0000230786 00000 n -0000230937 00000 n -0000231088 00000 n -0000231239 00000 n -0000231390 00000 n -0000231541 00000 n -0000231692 00000 n -0000231843 00000 n -0000231994 00000 n -0000232145 00000 n -0000232296 00000 n -0000232447 00000 n -0000232598 00000 n -0000232747 00000 n -0000232897 00000 n -0000233047 00000 n -0000233197 00000 n -0000233347 00000 n -0000233498 00000 n -0000233648 00000 n -0000233799 00000 n -0000233949 00000 n -0000234098 00000 n -0000234247 00000 n -0000234398 00000 n -0000234548 00000 n -0000234699 00000 n -0000234849 00000 n -0000235000 00000 n -0000235150 00000 n -0000235301 00000 n -0000235451 00000 n -0000235602 00000 n -0000235753 00000 n -0000235904 00000 n -0000236055 00000 n -0000236204 00000 n -0000236354 00000 n -0000236505 00000 n -0000236654 00000 n -0000236805 00000 n -0000236955 00000 n -0000237169 00000 n -0000224849 00000 n -0000223769 00000 n -0000237106 00000 n -0000325937 00000 n -0000237268 00000 n -0000237388 00000 n -0000237860 00000 n -0000238333 00000 n -0000238369 00000 n -0000238761 00000 n -0000239421 00000 n -0000240022 00000 n -0000240563 00000 n -0000241229 00000 n -0000243038 00000 n -0000243273 00000 n -0000244846 00000 n -0000245096 00000 n -0000263088 00000 n -0000263618 00000 n -0000275575 00000 n -0000276011 00000 n -0000289174 00000 n -0000289629 00000 n -0000297760 00000 n -0000298048 00000 n -0000306311 00000 n -0000306612 00000 n -0000318991 00000 n -0000319626 00000 n -0000325634 00000 n -0000329057 00000 n -0000329177 00000 n -0000329276 00000 n -0000329349 00000 n -0000341602 00000 n -0000341785 00000 n -0000342171 00000 n -0000342677 00000 n -0000343122 00000 n -0000343573 00000 n -0000344149 00000 n -0000344658 00000 n -0000345148 00000 n -0000345640 00000 n -0000346131 00000 n -0000346691 00000 n -0000347252 00000 n -0000347813 00000 n -0000348373 00000 n -0000349104 00000 n -0000349937 00000 n -0000350770 00000 n -0000351375 00000 n -0000351647 00000 n -0000351871 00000 n -0000352042 00000 n -0000352212 00000 n -0000352385 00000 n -0000352560 00000 n -0000352737 00000 n -0000352912 00000 n -0000353080 00000 n -0000353274 00000 n -0000353480 00000 n -0000353675 00000 n -0000353871 00000 n -0000354071 00000 n -0000354273 00000 n -0000354580 00000 n -0000354939 00000 n -0000355183 00000 n -0000355426 00000 n -0000355669 00000 n -0000355912 00000 n -0000356193 00000 n -0000356476 00000 n -0000356759 00000 n -0000357042 00000 n -0000357328 00000 n -0000357619 00000 n -0000357909 00000 n -0000358196 00000 n -0000358479 00000 n -0000358762 00000 n -0000359045 00000 n -0000359328 00000 n -0000359577 00000 n -0000359772 00000 n -0000359970 00000 n -0000360171 00000 n -0000360370 00000 n -0000360571 00000 n -0000360770 00000 n -0000360962 00000 n -0000361049 00000 n -0000361217 00000 n -0000361431 00000 n -0000361606 00000 n -0000361735 00000 n -0000361854 00000 n -0000361982 00000 n -0000362121 00000 n -0000362265 00000 n -0000362398 00000 n -0000362519 00000 n -0000362646 00000 n -0000362755 00000 n -0000362839 00000 n -0000362879 00000 n -0000363079 00000 n +0000188352 00000 n +0000184662 00000 n +0000188901 00000 n +0000189213 00000 n +0000189400 00000 n +0000328762 00000 n +0000192113 00000 n +0000191551 00000 n +0000189618 00000 n +0000191674 00000 n +0000191862 00000 n +0000192050 00000 n +0000195478 00000 n +0000195670 00000 n +0000195868 00000 n +0000196060 00000 n +0000197007 00000 n +0000195307 00000 n +0000192254 00000 n +0000196257 00000 n +0000196320 00000 n +0000196445 00000 n +0000196631 00000 n +0000196756 00000 n +0000196819 00000 n +0000196944 00000 n +0000197719 00000 n +0000197533 00000 n +0000197148 00000 n +0000197656 00000 n +0000199102 00000 n +0000199290 00000 n +0000199478 00000 n +0000199666 00000 n +0000199854 00000 n +0000200790 00000 n +0000198922 00000 n +0000197805 00000 n +0000200043 00000 n +0000200292 00000 n +0000200478 00000 n +0000200603 00000 n +0000200728 00000 n +0000201970 00000 n +0000202094 00000 n +0000202219 00000 n +0000201722 00000 n +0000200917 00000 n +0000201845 00000 n +0000203778 00000 n +0000203929 00000 n +0000204080 00000 n +0000204230 00000 n +0000204381 00000 n +0000204531 00000 n +0000204682 00000 n +0000204832 00000 n +0000204983 00000 n +0000205134 00000 n +0000205285 00000 n +0000205436 00000 n +0000205587 00000 n +0000205738 00000 n +0000205889 00000 n +0000206040 00000 n +0000206191 00000 n +0000206341 00000 n +0000206492 00000 n +0000206643 00000 n +0000206793 00000 n +0000206944 00000 n +0000207095 00000 n +0000207246 00000 n +0000207395 00000 n +0000207545 00000 n +0000207696 00000 n +0000207847 00000 n +0000207998 00000 n +0000208149 00000 n +0000208300 00000 n +0000208451 00000 n +0000208602 00000 n +0000208753 00000 n +0000208904 00000 n +0000209054 00000 n +0000209205 00000 n +0000209355 00000 n +0000209506 00000 n +0000209656 00000 n +0000209807 00000 n +0000209958 00000 n +0000210109 00000 n +0000210260 00000 n +0000210411 00000 n +0000210562 00000 n +0000210713 00000 n +0000210864 00000 n +0000211013 00000 n +0000211225 00000 n +0000203202 00000 n +0000202332 00000 n +0000211162 00000 n +0000328887 00000 n +0000213298 00000 n +0000213449 00000 n +0000213600 00000 n +0000213749 00000 n +0000213898 00000 n +0000214048 00000 n +0000214199 00000 n +0000214350 00000 n +0000214500 00000 n +0000214651 00000 n +0000214802 00000 n +0000214953 00000 n +0000215104 00000 n +0000215255 00000 n +0000215406 00000 n +0000215554 00000 n +0000215704 00000 n +0000215854 00000 n +0000216005 00000 n +0000216156 00000 n +0000216307 00000 n +0000216458 00000 n +0000216609 00000 n +0000216760 00000 n +0000216911 00000 n +0000217061 00000 n +0000217211 00000 n +0000217362 00000 n +0000217513 00000 n +0000217664 00000 n +0000217815 00000 n +0000217966 00000 n +0000218117 00000 n +0000218267 00000 n +0000218416 00000 n +0000218566 00000 n +0000218717 00000 n +0000218868 00000 n +0000219019 00000 n +0000219170 00000 n +0000219321 00000 n +0000219472 00000 n +0000219623 00000 n +0000219774 00000 n +0000219924 00000 n +0000220075 00000 n +0000220226 00000 n +0000220377 00000 n +0000220528 00000 n +0000220678 00000 n +0000220829 00000 n +0000220979 00000 n +0000221130 00000 n +0000221280 00000 n +0000221431 00000 n +0000221582 00000 n +0000221733 00000 n +0000221883 00000 n +0000222032 00000 n +0000222182 00000 n +0000222333 00000 n +0000222484 00000 n +0000222635 00000 n +0000222786 00000 n +0000222937 00000 n +0000223088 00000 n +0000223238 00000 n +0000223387 00000 n +0000225596 00000 n +0000223599 00000 n +0000212551 00000 n +0000211312 00000 n +0000223536 00000 n +0000225747 00000 n +0000225897 00000 n +0000226047 00000 n +0000226198 00000 n +0000226347 00000 n +0000226498 00000 n +0000226649 00000 n +0000226799 00000 n +0000226950 00000 n +0000227101 00000 n +0000227251 00000 n +0000227402 00000 n +0000227553 00000 n +0000227704 00000 n +0000227855 00000 n +0000228004 00000 n +0000228154 00000 n +0000228305 00000 n +0000228456 00000 n +0000228607 00000 n +0000228758 00000 n +0000228908 00000 n +0000229059 00000 n +0000229210 00000 n +0000229361 00000 n +0000229511 00000 n +0000229662 00000 n +0000229813 00000 n +0000229962 00000 n +0000230111 00000 n +0000230262 00000 n +0000230412 00000 n +0000230563 00000 n +0000230714 00000 n +0000230865 00000 n +0000231016 00000 n +0000231167 00000 n +0000231318 00000 n +0000231469 00000 n +0000231620 00000 n +0000231771 00000 n +0000231922 00000 n +0000232073 00000 n +0000232224 00000 n +0000232375 00000 n +0000232526 00000 n +0000232675 00000 n +0000232825 00000 n +0000232975 00000 n +0000233125 00000 n +0000233275 00000 n +0000233426 00000 n +0000233576 00000 n +0000233727 00000 n +0000233877 00000 n +0000234026 00000 n +0000234175 00000 n +0000234326 00000 n +0000234476 00000 n +0000234627 00000 n +0000234777 00000 n +0000234928 00000 n +0000235078 00000 n +0000235229 00000 n +0000235379 00000 n +0000235530 00000 n +0000235681 00000 n +0000235832 00000 n +0000235983 00000 n +0000236132 00000 n +0000236282 00000 n +0000236433 00000 n +0000236582 00000 n +0000236733 00000 n +0000236883 00000 n +0000237097 00000 n +0000224777 00000 n +0000223698 00000 n +0000237034 00000 n +0000325865 00000 n +0000237196 00000 n +0000237316 00000 n +0000237788 00000 n +0000238261 00000 n +0000238297 00000 n +0000238689 00000 n +0000239349 00000 n +0000239950 00000 n +0000240491 00000 n +0000241157 00000 n +0000242966 00000 n +0000243201 00000 n +0000244774 00000 n +0000245024 00000 n +0000263016 00000 n +0000263546 00000 n +0000275503 00000 n +0000275939 00000 n +0000289102 00000 n +0000289557 00000 n +0000297688 00000 n +0000297976 00000 n +0000306239 00000 n +0000306540 00000 n +0000318919 00000 n +0000319554 00000 n +0000325562 00000 n +0000328985 00000 n +0000329105 00000 n +0000329204 00000 n +0000329277 00000 n +0000341530 00000 n +0000341713 00000 n +0000342099 00000 n +0000342605 00000 n +0000343050 00000 n +0000343501 00000 n +0000344077 00000 n +0000344586 00000 n +0000345076 00000 n +0000345568 00000 n +0000346059 00000 n +0000346619 00000 n +0000347180 00000 n +0000347741 00000 n +0000348301 00000 n +0000349032 00000 n +0000349865 00000 n +0000350698 00000 n +0000351303 00000 n +0000351575 00000 n +0000351799 00000 n +0000351970 00000 n +0000352140 00000 n +0000352313 00000 n +0000352488 00000 n +0000352665 00000 n +0000352840 00000 n +0000353008 00000 n +0000353202 00000 n +0000353408 00000 n +0000353603 00000 n +0000353799 00000 n +0000353999 00000 n +0000354201 00000 n +0000354508 00000 n +0000354867 00000 n +0000355111 00000 n +0000355354 00000 n +0000355597 00000 n +0000355840 00000 n +0000356121 00000 n +0000356404 00000 n +0000356687 00000 n +0000356970 00000 n +0000357256 00000 n +0000357547 00000 n +0000357837 00000 n +0000358124 00000 n +0000358407 00000 n +0000358690 00000 n +0000358973 00000 n +0000359256 00000 n +0000359505 00000 n +0000359700 00000 n +0000359898 00000 n +0000360099 00000 n +0000360298 00000 n +0000360499 00000 n +0000360698 00000 n +0000360890 00000 n +0000360977 00000 n +0000361145 00000 n +0000361359 00000 n +0000361534 00000 n +0000361663 00000 n +0000361782 00000 n +0000361910 00000 n +0000362049 00000 n +0000362193 00000 n +0000362326 00000 n +0000362447 00000 n +0000362574 00000 n +0000362683 00000 n +0000362767 00000 n +0000362807 00000 n +0000363007 00000 n trailer << /Size 1562 /Root 1560 0 R /Info 1561 0 R -/ID [<0CF6A151112D8671651F0CC4C7122EBE> <0CF6A151112D8671651F0CC4C7122EBE>] >> +/ID [<66BFFE03FB2447F25C17B2469142EE98> <66BFFE03FB2447F25C17B2469142EE98>] >> startxref -363411 +363339 %%EOF diff --git a/openmp/runtime/src/dllexports b/openmp/runtime/src/dllexports index cfcbdeb92f5..779f1d43cd2 100644 --- a/openmp/runtime/src/dllexports +++ b/openmp/runtime/src/dllexports @@ -357,6 +357,9 @@ kmpc_set_defaults 224 __kmpc_fork_teams 241 __kmpc_omp_task_with_deps 242 __kmpc_omp_wait_deps 243 + __kmpc_cancel 244 + __kmpc_cancellationpoint 245 + __kmpc_cancel_barrier 246 %endif # OMP_40 %endif @@ -455,6 +458,8 @@ kmp_set_warnings_off 780 #omp_curr_proc_bind 864 omp_get_num_teams 865 omp_get_team_num 866 + omp_get_cancellation 867 + kmp_get_cancellation_status 868 %endif # OMP_40 %ifndef stub diff --git a/openmp/runtime/src/exports_so.txt b/openmp/runtime/src/exports_so.txt index 4ddf575d1ac..9ace78fd549 100644 --- a/openmp/runtime/src/exports_so.txt +++ b/openmp/runtime/src/exports_so.txt @@ -80,4 +80,26 @@ VERSION { }; # VERSION +# sets up GCC OMP_ version dependency chain +OMP_1.0 { +}; +OMP_2.0 { +} OMP_1.0; +OMP_3.0 { +} OMP_2.0; +OMP_3.1 { +} OMP_3.0; +OMP_4.0 { +} OMP_3.1; + +# sets up GCC GOMP_ version dependency chain +GOMP_1.0 { +}; +GOMP_2.0 { +} GOMP_1.0; +GOMP_3.0 { +} GOMP_2.0; +GOMP_4.0 { +} GOMP_3.0; + # end of file # diff --git a/openmp/runtime/src/include/40/iomp.h.var b/openmp/runtime/src/include/40/iomp.h.var index 88b74f35b79..8aeb38c3bc2 100644 --- a/openmp/runtime/src/include/40/iomp.h.var +++ b/openmp/runtime/src/include/40/iomp.h.var @@ -82,6 +82,16 @@ extern void __KAI_KMPC_CONVENTION kmp_set_warnings_on(void); extern void __KAI_KMPC_CONVENTION kmp_set_warnings_off(void); + /* schedule kind constants */ + typedef enum kmp_cancel_kind_t { + kmp_cancel_parallel = 1, + kmp_cancel_loop = 2, + kmp_cancel_sections = 3, + kmp_cancel_taskgroup = 4 + } kmp_cancel_kind_t; + + extern int __KAI_KMPC_CONVENTION kmp_get_cancellation_status(kmp_cancel_kind_t); + # undef __KAI_KMPC_CONVENTION /* Warning: diff --git a/openmp/runtime/src/include/40/omp.h.var b/openmp/runtime/src/include/40/omp.h.var index 38400d418b1..c6dd4cd4ee1 100644 --- a/openmp/runtime/src/include/40/omp.h.var +++ b/openmp/runtime/src/include/40/omp.h.var @@ -27,30 +27,6 @@ extern "C" { # endif -# define omp_set_num_threads ompc_set_num_threads -# define omp_set_dynamic ompc_set_dynamic -# define omp_set_nested ompc_set_nested -# define omp_set_max_active_levels ompc_set_max_active_levels -# define omp_set_schedule ompc_set_schedule -# define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num -# define omp_get_team_size ompc_get_team_size - - -# define kmp_set_stacksize kmpc_set_stacksize -# define kmp_set_stacksize_s kmpc_set_stacksize_s -# define kmp_set_blocktime kmpc_set_blocktime -# define kmp_set_library kmpc_set_library -# define kmp_set_defaults kmpc_set_defaults -# define kmp_set_affinity_mask_proc kmpc_set_affinity_mask_proc -# define kmp_unset_affinity_mask_proc kmpc_unset_affinity_mask_proc -# define kmp_get_affinity_mask_proc kmpc_get_affinity_mask_proc - -# define kmp_malloc kmpc_malloc -# define kmp_calloc kmpc_calloc -# define kmp_realloc kmpc_realloc -# define kmp_free kmpc_free - - # if defined(_WIN32) # define __KAI_KMPC_CONVENTION __cdecl # else @@ -120,6 +96,7 @@ extern int __KAI_KMPC_CONVENTION omp_get_num_devices (void); extern int __KAI_KMPC_CONVENTION omp_get_num_teams (void); extern int __KAI_KMPC_CONVENTION omp_get_team_num (void); + extern int __KAI_KMPC_CONVENTION omp_get_cancellation (void); # include <stdlib.h> /* kmp API functions */ diff --git a/openmp/runtime/src/include/40/omp_lib.f.var b/openmp/runtime/src/include/40/omp_lib.f.var index 0adadb10260..fb9b2f28da4 100644 --- a/openmp/runtime/src/include/40/omp_lib.f.var +++ b/openmp/runtime/src/include/40/omp_lib.f.var @@ -32,6 +32,7 @@ integer, parameter :: kmp_pointer_kind = int_ptr_kind() integer, parameter :: kmp_size_t_kind = int_ptr_kind() integer, parameter :: kmp_affinity_mask_kind = int_ptr_kind() + integer, parameter :: kmp_cancel_kind = omp_integer_kind end module omp_lib_kinds @@ -56,6 +57,11 @@ integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3 integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4 + interface ! *** @@ -199,6 +205,11 @@ integer (kind=omp_integer_kind) omp_get_team_num end function omp_get_team_num + function omp_get_cancellation() + use omp_lib_kinds + integer (kind=omp_integer_kind) omp_get_cancellation + end function omp_get_cancellation + subroutine omp_init_lock(lockvar) !DIR$ IF(__INTEL_COMPILER.GE.1400) !DIR$ attributes known_intrinsic :: omp_init_lock @@ -417,6 +428,11 @@ subroutine kmp_set_warnings_off() end subroutine kmp_set_warnings_off + function kmp_get_cancellation_status(cancelkind) + use omp_lib_kinds + integer (kind=kmp_cancel_kind) cancelkind + logical (kind=omp_logical_kind) kmp_get_cancellation_status + end function kmp_get_cancellation_status end interface !dec$ if defined(_WIN32) @@ -459,6 +475,7 @@ !dec$ attributes alias:'OMP_GET_NUM_DEVICES' :: omp_get_num_devices !dec$ attributes alias:'OMP_GET_NUM_TEAMS' :: omp_get_num_teams !dec$ attributes alias:'OMP_GET_TEAM_NUM' :: omp_get_team_num +!dec$ attributes alias:'OMP_GET_CANCELLATION' :: omp_get_cancellation !dec$ attributes alias:'omp_init_lock' :: omp_init_lock !dec$ attributes alias:'omp_destroy_lock' :: omp_destroy_lock @@ -498,6 +515,8 @@ !dec$ attributes alias:'KMP_SET_WARNINGS_ON'::kmp_set_warnings_on !dec$ attributes alias:'KMP_SET_WARNINGS_OFF'::kmp_set_warnings_off +!dec$ attributes alias:'KMP_GET_CANCELLATION_STATUS' :: kmp_get_cancellation_status + !dec$ else !*** @@ -531,6 +550,7 @@ !dec$ attributes alias:'_OMP_GET_NUM_DEVICES' :: omp_get_num_devices !dec$ attributes alias:'_OMP_GET_NUM_TEAMS' :: omp_get_num_teams !dec$ attributes alias:'_OMP_GET_TEAM_NUM' :: omp_get_team_num +!dec$ attributes alias:'_OMP_GET_CANCELLATION' :: omp_get_cancellation !dec$ attributes alias:'_omp_init_lock' :: omp_init_lock !dec$ attributes alias:'_omp_destroy_lock' :: omp_destroy_lock @@ -570,6 +590,8 @@ !dec$ attributes alias:'_KMP_SET_WARNINGS_ON'::kmp_set_warnings_on !dec$ attributes alias:'_KMP_SET_WARNINGS_OFF'::kmp_set_warnings_off +!dec$ attributes alias:'_KMP_GET_CANCELLATION_STATUS' :: kmp_get_cancellation_status + !dec$ endif !dec$ endif @@ -606,6 +628,7 @@ !dec$ attributes alias:'omp_get_num_devices_'::omp_get_num_devices !dec$ attributes alias:'omp_get_num_teams_'::omp_get_num_teams !dec$ attributes alias:'omp_get_team_num_'::omp_get_team_num +!dec$ attributes alias:'omp_get_cancellation_'::omp_get_cancellation !dec$ attributes alias:'omp_init_lock_'::omp_init_lock !dec$ attributes alias:'omp_destroy_lock_'::omp_destroy_lock @@ -644,6 +667,7 @@ !dec$ attributes alias:'kmp_set_warnings_on_'::kmp_set_warnings_on !dec$ attributes alias:'kmp_set_warnings_off_'::kmp_set_warnings_off +!dec$ attributes alias:'kmp_get_cancellation_status_'::kmp_get_cancellation_status !dec$ endif @@ -678,6 +702,7 @@ !dec$ attributes alias:'_omp_get_wtick_'::omp_get_wtick !dec$ attributes alias:'_omp_get_num_teams_'::omp_get_num_teams !dec$ attributes alias:'_omp_get_team_num_'::omp_get_team_num +!dec$ attributes alias:'_omp_get_cancellation_'::omp_get_cancellation !dec$ attributes alias:'_omp_init_lock_'::omp_init_lock !dec$ attributes alias:'_omp_destroy_lock_'::omp_destroy_lock @@ -717,6 +742,8 @@ !dec$ attributes alias:'_kmp_set_warnings_on_'::kmp_set_warnings_on !dec$ attributes alias:'_kmp_set_warnings_off_'::kmp_set_warnings_off +!dec$ attributes alias:'_kmp_get_cancellation_status_'::kmp_get_cancellation_status + !dec$ endif end module omp_lib diff --git a/openmp/runtime/src/include/40/omp_lib.f90.var b/openmp/runtime/src/include/40/omp_lib.f90.var index 5cac259b49e..f78535212ca 100644 --- a/openmp/runtime/src/include/40/omp_lib.f90.var +++ b/openmp/runtime/src/include/40/omp_lib.f90.var @@ -28,6 +28,7 @@ integer, parameter :: kmp_pointer_kind = c_intptr_t integer, parameter :: kmp_size_t_kind = c_size_t integer, parameter :: kmp_affinity_mask_kind = c_intptr_t + integer, parameter :: kmp_cancel_kind = omp_integer_kind end module omp_lib_kinds @@ -47,12 +48,18 @@ integer(kind=omp_sched_kind), parameter :: omp_sched_guided = 3 integer(kind=omp_sched_kind), parameter :: omp_sched_auto = 4 + integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_false = 0 integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_true = 1 integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_master = 2 integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_close = 3 integer (kind=omp_proc_bind_kind), parameter :: omp_proc_bind_spread = 4 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_parallel = 1 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_loop = 2 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_sections = 3 + integer (kind=kmp_cancel_kind), parameter :: kmp_cancel_taskgroup = 4 + interface ! *** @@ -198,6 +205,11 @@ integer (kind=omp_integer_kind) omp_get_team_num end function omp_get_team_num + function omp_get_cancellation() bind(c) + use omp_lib_kinds + integer (kind=omp_integer_kind) omp_get_cancellation + end function omp_get_cancellation + subroutine omp_init_lock(lockvar) bind(c) !DIR$ IF(__INTEL_COMPILER.GE.1400) !DIR$ attributes known_intrinsic :: omp_init_lock @@ -417,6 +429,12 @@ subroutine kmp_set_warnings_off() bind(c) end subroutine kmp_set_warnings_off + function kmp_get_cancellation_status(cancelkind) bind(c) + use omp_lib_kinds + integer (kind=kmp_cancel_kind), value :: cancelkind + logical (kind=omp_logical_kind) kmp_get_cancellation_status + end function kmp_get_cancellation_status + end interface end module omp_lib diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h index 7117571e76d..37c7f41bdc4 100644 --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -1,8 +1,8 @@ /*! \file */ /* * kmp.h -- KPTS runtime header file. - * $Revision: 42642 $ - * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $ + * $Revision: 42816 $ + * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $ */ @@ -26,10 +26,6 @@ */ //#define FIX_SGI_CLOCK -#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) -typedef __float128 _Quad; -#endif - /* Defines for OpenMP 3.0 tasking and auto scheduling */ #if OMP_30_ENABLED @@ -81,9 +77,12 @@ typedef __float128 _Quad; #include <errno.h> +#include "kmp_os.h" + +#if KMP_ARCH_X86 || KMP_ARCH_X86_64 #include <xmmintrin.h> +#endif -#include "kmp_os.h" #include "kmp_version.h" #include "kmp_debug.h" #include "kmp_lock.h" @@ -188,7 +187,7 @@ typedef struct ident { /* contextual information. */ #endif /* USE_ITT_BUILD */ kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */ - char *psource; /**< String describing the source location. + char const *psource; /**< String describing the source location. The string is composed of semi-colon separated fields which describe the source file, the function and a pair of line numbers that delimit the construct. */ @@ -231,6 +230,13 @@ extern "C" { /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ +#define KMP_MAX( x, y ) ( (x) > (y) ? (x) : (y) ) +#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) ) + +/* ------------------------------------------------------------------------ */ +/* ------------------------------------------------------------------------ */ + + /* Enumeration types */ enum kmp_state_timer { @@ -752,6 +758,16 @@ extern int __kmp_affinity_num_places; #endif /* OMP_40_ENABLED */ +#if OMP_40_ENABLED +typedef enum kmp_cancel_kind_t { + cancel_noreq = 0, + cancel_parallel = 1, + cancel_loop = 2, + cancel_sections = 3, + cancel_taskgroup = 4 +} kmp_cancel_kind_t; +#endif // OMP_40_ENABLED + #if KMP_MIC extern unsigned int __kmp_place_num_cores; extern unsigned int __kmp_place_num_threads_per_core; @@ -777,7 +793,7 @@ extern unsigned int __kmp_place_core_offset; #define __kmp_entry_gtid() __kmp_get_global_thread_id_reg() #define __kmp_tid_from_gtid(gtid) ( KMP_DEBUG_ASSERT( (gtid) >= 0 ), \ - /*(__kmp_threads[ (gtid) ]->th.th_team_serialized) ? 0 : /* TODO remove this check, it is redundant */ \ + /*(__kmp_threads[ (gtid) ]->th.th_team_serialized) ? 0 : */ /* TODO remove this check, it is redundant */ \ __kmp_threads[ (gtid) ]->th.th_info.ds.ds_tid ) #define __kmp_get_tid() ( __kmp_tid_from_gtid( __kmp_get_gtid() ) ) @@ -1078,14 +1094,6 @@ extern kmp_key_t __kmp_tv_key; #endif /* BUILD_TV */ /* ------------------------------------------------------------------------ */ -// Some forward declarations. - -typedef union kmp_team kmp_team_t; -typedef struct kmp_taskdata kmp_taskdata_t; -typedef union kmp_task_team kmp_task_team_t; -typedef union kmp_team kmp_team_p; -typedef union kmp_info kmp_info_p; -typedef union kmp_root kmp_root_p; #if USE_ITT_BUILD // We cannot include "kmp_itt.h" due to circular dependency. Declare the only required type here. @@ -1883,8 +1891,12 @@ typedef struct kmp_task { /* GEH: Shouldn't this be aligned so void * shareds; /**< pointer to block of pointers to shared vars */ kmp_routine_entry_t routine; /**< pointer to routine to call for executing task */ kmp_int32 part_id; /**< part id for the task */ +#if OMP_40_ENABLED + kmp_routine_entry_t destructors; /* pointer to function to invoke deconstructors of firstprivate C++ objects */ +#endif // OMP_40_ENABLED /* private vars */ } kmp_task_t; + /*! @} */ @@ -1892,6 +1904,7 @@ typedef struct kmp_task { /* GEH: Shouldn't this be aligned so #if OMP_40_ENABLED typedef struct kmp_taskgroup { kmp_uint32 count; // number of allocated and not yet complete tasks + kmp_int32 cancel_request; // request for cancellation of this taskgroup struct kmp_taskgroup *parent; // parent taskgroup } kmp_taskgroup_t; @@ -1974,7 +1987,12 @@ typedef struct kmp_tasking_flags { /* Total struct must be exactly 32 b unsigned tiedness : 1; /* task is either tied (1) or untied (0) */ unsigned final : 1; /* task is final(1) so execute immediately */ unsigned merged_if0 : 1; /* no __kmpc_task_{begin/complete}_if0 calls in if0 code path */ - unsigned reserved13 : 13; /* reserved for compiler use */ +#if OMP_40_ENABLED + unsigned destructors_thunk : 1; /* set if the compiler creates a thunk to invoke destructors from the runtime */ + unsigned reserved : 12; /* reserved for compiler use */ +#else // OMP_40_ENABLED + unsigned reserved : 13; /* reserved for compiler use */ +#endif // OMP_40_ENABLED /* Library flags */ /* Total library flags must be 16 bits */ unsigned tasktype : 1; /* task is either explicit(1) or implicit (0) */ @@ -2014,7 +2032,11 @@ struct kmp_taskdata { /* aligned during dynamic kmp_dephash_t * td_dephash; // Dependencies for children tasks are tracked from here kmp_depnode_t * td_depnode; // Pointer to graph node if this task has dependencies #endif +#if KMP_HAVE_QUAD _Quad td_dummy; // Align structure 16-byte size since allocated just before kmp_task_t +#else + kmp_uint32 td_dummy[2]; +#endif }; // struct kmp_taskdata // Make sure padding above worked @@ -2121,6 +2143,8 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info { int th_team_bt_intervals; int th_team_bt_set; + kmp_internal_control_t th_fixed_icvs; /* Initial ICVs for the thread */ + #if KMP_OS_WINDOWS || KMP_OS_LINUX kmp_affin_mask_t *th_affin_mask; /* thread's current affinity mask */ @@ -2142,6 +2166,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info { # endif #endif #if USE_ITT_BUILD + kmp_uint64 th_bar_arrive_time; /* arrival to barrier timestamp */ kmp_uint64 th_frame_time; /* frame timestamp */ kmp_uint64 th_frame_time_serialized; /* frame timestamp in serialized parallel */ #endif /* USE_ITT_BUILD */ @@ -2328,15 +2353,6 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team { kmp_uint32 t_mxcsr; #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ -#if KMP_BARRIER_ICV_PULL - // - // Note: Putting ICV's before the fp control info causes a very slight - // ~1% improvement for EPCC parallel on fxe256lin01 / 256 threads, but - // causes a 17% regression on fxe64lin01 / 64 threads. - // - kmp_internal_control_t t_initial_icvs; -#endif // KMP_BARRIER_ICV_PULL - #if (KMP_PERF_V106 == KMP_ON) void *t_inline_argv[ KMP_INLINE_ARGV_ENTRIES ]; #endif @@ -2398,6 +2414,9 @@ typedef struct KMP_ALIGN_CACHE kmp_base_team { kmp_internal_control_t *t_control_stack_top; /* internal control stack for additional nested teams. for SERIALIZED teams nested 2 or more levels deep */ +#if OMP_40_ENABLED + kmp_int32 t_cancel_request; /* typed flag to store request state of cancellation */ +#endif int t_master_active;/* save on fork, restore on join */ kmp_taskq_t t_taskq; /* this team's task queue */ @@ -2479,8 +2498,6 @@ extern int __kmp_duplicate_library_ok; #if USE_ITT_BUILD extern int __kmp_forkjoin_frames; extern int __kmp_forkjoin_frames_mode; -extern FILE * __kmp_itt_csv_file; -extern kmp_str_buf_t __kmp_itt_frame_buffer; #endif extern PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method; extern int __kmp_determ_red; @@ -2526,9 +2543,6 @@ extern int __kmp_storage_map_verbose; /* True means storage map includes pl extern int __kmp_storage_map_verbose_specified; extern kmp_cpuinfo_t __kmp_cpuinfo; -extern kmp_uint64 __kmp_cpu_frequency; - // CPU frequency, in Hz. Set by __kmp_runtime_initialize(). 0 means "is not set yet", - // ~ 0 signals an errror. extern volatile int __kmp_init_serial; extern volatile int __kmp_init_gtid; @@ -2678,13 +2692,13 @@ extern double __kmp_load_balance_interval; /* Interval for the load balan # endif /* USE_LOAD_BALANCE */ // OpenMP 3.1 - Nested num threads array -struct kmp_nested_nthreads_t { +typedef struct kmp_nested_nthreads_t { int * nth; int size; int used; -}; +} kmp_nested_nthreads_t; -extern struct kmp_nested_nthreads_t __kmp_nested_nth; +extern kmp_nested_nthreads_t __kmp_nested_nth; #if KMP_USE_ADAPTIVE_LOCKS @@ -2707,6 +2721,7 @@ extern char * __kmp_speculative_statsfile; #if OMP_40_ENABLED extern int __kmp_display_env; /* TRUE or FALSE */ extern int __kmp_display_env_verbose; /* TRUE if OMP_DISPLAY_ENV=VERBOSE */ +extern int __kmp_omp_cancellation; /* TRUE or FALSE */ #endif /* ------------------------------------------------------------------------- */ @@ -2796,7 +2811,7 @@ extern void __kmp_warn( char const * format, ... ); extern void __kmp_set_num_threads( int new_nth, int gtid ); // Returns current thread (pointer to kmp_info_t). Current thread *must* be registered. -inline kmp_info_t * __kmp_entry_thread() +static inline kmp_info_t * __kmp_entry_thread() { int gtid = __kmp_entry_gtid(); @@ -2976,11 +2991,11 @@ extern void __kmp_balanced_affinity( int tid, int team_size ); #endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */ -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) extern int __kmp_futex_determine_capable( void ); -#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) extern void __kmp_gtid_set_specific( int gtid ); extern int __kmp_gtid_get_specific( void ); @@ -3067,7 +3082,7 @@ extern void __kmp_end_split_barrier ( enum barrier_type bt, int gtid ); extern int __kmp_fork_call( ident_t *loc, int gtid, int exec_master, kmp_int32 argc, microtask_t microtask, launch_t invoker, /* TODO: revert workaround for Intel(R) 64 tracker #96 */ -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_ARM || KMP_ARCH_X86_64) && KMP_OS_LINUX va_list *ap #else va_list ap @@ -3120,7 +3135,7 @@ extern int __kmp_execute_tasks( kmp_info_t *thread, kmp_int32 gtid, volatile km #if USE_ITT_BUILD void * itt_sync_obj, #endif /* USE_ITT_BUILD */ - int c = 0 ); + int c ); extern void __kmp_reap_task_teams( void ); extern void __kmp_unref_task_team( kmp_task_team_t *task_team, kmp_info_t *thread ); extern void __kmp_wait_to_unref_task_teams( void ); @@ -3138,6 +3153,9 @@ extern void __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gti extern int __kmp_is_address_mapped( void *addr ); extern kmp_uint64 __kmp_hardware_timestamp(void); +#if KMP_OS_UNIX +extern int __kmp_read_from_file( char const *path, char const *format, ... ); +#endif /* ------------------------------------------------------------------------ */ // @@ -3148,7 +3166,7 @@ extern kmp_uint64 __kmp_hardware_timestamp(void); extern void __kmp_query_cpuid( kmp_cpuinfo_t *p ); -static inline void __kmp_load_mxcsr ( kmp_uint32 *p ) { _mm_setcsr( *p ); } +#define __kmp_load_mxcsr(p) _mm_setcsr(*(p)) static inline void __kmp_store_mxcsr( kmp_uint32 *p ) { *p = _mm_getcsr(); } extern void __kmp_load_x87_fpu_control_word( kmp_int16 *p ); @@ -3258,8 +3276,8 @@ void __kmpc_omp_task_complete( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *tas #endif // OMP_30_ENABLED #if OMP_40_ENABLED -KMP_EXPORT void __kmpc_taskgroup( ident* loc, int gtid ); -KMP_EXPORT void __kmpc_end_taskgroup( ident* loc, int gtid ); +KMP_EXPORT void __kmpc_taskgroup( ident_t * loc, int gtid ); +KMP_EXPORT void __kmpc_end_taskgroup( ident_t * loc, int gtid ); KMP_EXPORT kmp_int32 __kmpc_omp_task_with_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task, kmp_int32 ndeps, kmp_depend_info_t *dep_list, @@ -3270,6 +3288,13 @@ extern void __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task ); #endif +#if OMP_40_ENABLED +KMP_EXPORT kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind); +KMP_EXPORT kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind); +KMP_EXPORT kmp_int32 __kmpc_cancel_barrier(ident_t* loc_ref, kmp_int32 gtid); +KMP_EXPORT int __kmp_get_cancellation_status(int cancel_kind); +#endif + /* * Lock interface routines (fast versions with gtid passed in) */ @@ -3355,6 +3380,42 @@ kmp_threadprivate_insert_private_data( int gtid, void *pc_addr, void *data_addr, struct private_common * kmp_threadprivate_insert( int gtid, void *pc_addr, void *data_addr, size_t pc_size ); +// +// ompc_, kmpc_ entries moved from omp.h. +// +#if KMP_OS_WINDOWS +# define KMPC_CONVENTION __cdecl +#else +# define KMPC_CONVENTION +#endif + +#if OMP_30_ENABLED + +#ifndef __OMP_H +typedef enum omp_sched_t { + omp_sched_static = 1, + omp_sched_dynamic = 2, + omp_sched_guided = 3, + omp_sched_auto = 4 +} omp_sched_t; +typedef void * kmp_affinity_mask_t; +#endif + +KMP_EXPORT void KMPC_CONVENTION ompc_set_max_active_levels(int); +KMP_EXPORT void KMPC_CONVENTION ompc_set_schedule(omp_sched_t, int); +KMP_EXPORT int KMPC_CONVENTION ompc_get_ancestor_thread_num(int); +KMP_EXPORT int KMPC_CONVENTION ompc_get_team_size(int); +KMP_EXPORT int KMPC_CONVENTION kmpc_set_affinity_mask_proc(int, kmp_affinity_mask_t *); +KMP_EXPORT int KMPC_CONVENTION kmpc_unset_affinity_mask_proc(int, kmp_affinity_mask_t *); +KMP_EXPORT int KMPC_CONVENTION kmpc_get_affinity_mask_proc(int, kmp_affinity_mask_t *); + +#endif // OMP_30_ENABLED + +KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize(int); +KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize_s(size_t); +KMP_EXPORT void KMPC_CONVENTION kmpc_set_library(int); +KMP_EXPORT void KMPC_CONVENTION kmpc_set_defaults(char const *); + #ifdef __cplusplus } #endif diff --git a/openmp/runtime/src/kmp_affinity.cpp b/openmp/runtime/src/kmp_affinity.cpp index 0840fa3fd8d..644251da4b5 100644 --- a/openmp/runtime/src/kmp_affinity.cpp +++ b/openmp/runtime/src/kmp_affinity.cpp @@ -1,7 +1,7 @@ /* * kmp_affinity.cpp -- affinity management - * $Revision: 42613 $ - * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -1885,7 +1885,19 @@ __kmp_affinity_create_cpuinfo_map(AddrUnsPair **address2os, int *line, if ((p == NULL) || (sscanf(p + 1, "%u\n", &val) != 1)) goto no_val; if (threadInfo[num_avail][osIdIndex] != UINT_MAX) goto dup_field; threadInfo[num_avail][osIdIndex] = val; +#if KMP_OS_LINUX && USE_SYSFS_INFO + char path[256]; + snprintf(path, sizeof(path), + "/sys/devices/system/cpu/cpu%u/topology/physical_package_id", + threadInfo[num_avail][osIdIndex]); + __kmp_read_from_file(path, "%u", &threadInfo[num_avail][pkgIdIndex]); + + snprintf(path, sizeof(path), + "/sys/devices/system/cpu/cpu%u/topology/core_id", + threadInfo[num_avail][osIdIndex]); + __kmp_read_from_file(path, "%u", &threadInfo[num_avail][coreIdIndex]); continue; +#else } char s2[] = "physical id"; if (strncmp(buf, s2, sizeof(s2) - 1) == 0) { @@ -1906,6 +1918,7 @@ __kmp_affinity_create_cpuinfo_map(AddrUnsPair **address2os, int *line, if (threadInfo[num_avail][coreIdIndex] != UINT_MAX) goto dup_field; threadInfo[num_avail][coreIdIndex] = val; continue; +#endif // KMP_OS_LINUX && USE_SYSFS_INFO } char s4[] = "thread id"; if (strncmp(buf, s4, sizeof(s4) - 1) == 0) { @@ -3058,8 +3071,6 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks, int setSize = 0; for (;;) { - int start, count, stride; - __kmp_process_place(&scan, osId2Mask, maxOsId, tempMask, &setSize); // @@ -3090,7 +3101,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks, "bad explicit places list"); next = scan; SKIP_DIGITS(next); - count = __kmp_str_to_int(scan, *next); + int count = __kmp_str_to_int(scan, *next); KMP_ASSERT(count >= 0); scan = next; @@ -3112,7 +3123,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks, // Use a temp var in case macro is changed to evaluate // args multiple times. // - if (KMP_CPU_ISSET(j - stride, tempMask)) { + if (KMP_CPU_ISSET(j - 1, tempMask)) { KMP_CPU_SET(j, tempMask); setSize++; } @@ -3159,7 +3170,7 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks, "bad explicit places list"); next = scan; SKIP_DIGITS(next); - stride = __kmp_str_to_int(scan, *next); + int stride = __kmp_str_to_int(scan, *next); KMP_DEBUG_ASSERT(stride >= 0); scan = next; stride *= sign; diff --git a/openmp/runtime/src/kmp_alloc.c b/openmp/runtime/src/kmp_alloc.c index 30ab4bd3724..885754fd006 100644 --- a/openmp/runtime/src/kmp_alloc.c +++ b/openmp/runtime/src/kmp_alloc.c @@ -1,7 +1,7 @@ /* * kmp_alloc.c -- private/shared dyanmic memory allocation and management - * $Revision: 42613 $ - * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -31,7 +31,7 @@ typedef void (*bget_release_t)(void *); /* NOTE: bufsize must be a signed datatype */ #if KMP_OS_WINDOWS -# if KMP_ARCH_X86 +# if KMP_ARCH_X86 || KMP_ARCH_ARM typedef kmp_int32 bufsize; # else typedef kmp_int64 bufsize; @@ -74,7 +74,7 @@ static int bpoolv( kmp_info_t *th, void *pool); malloc() does not ensure 16 byte alignmnent */ -#if KMP_ARCH_X86 +#if KMP_ARCH_X86 || !KMP_HAVE_QUAD #define SizeQuant 8 #define AlignType double diff --git a/openmp/runtime/src/kmp_atomic.c b/openmp/runtime/src/kmp_atomic.c index 547aad550a1..3e9c82f874f 100644 --- a/openmp/runtime/src/kmp_atomic.c +++ b/openmp/runtime/src/kmp_atomic.c @@ -1,7 +1,7 @@ /* * kmp_atomic.c -- ATOMIC implementation routines - * $Revision: 42582 $ - * $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -574,7 +574,7 @@ kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user coded ato */ #define KMP_ATOMIC_VOLATILE volatile -#if ( KMP_ARCH_X86 ) +#if ( KMP_ARCH_X86 ) && KMP_HAVE_QUAD static inline void operator +=( Quad_a4_t & lhs, Quad_a4_t & rhs ) { lhs.q += rhs.q; }; static inline void operator -=( Quad_a4_t & lhs, Quad_a4_t & rhs ) { lhs.q -= rhs.q; }; @@ -608,7 +608,7 @@ kmp_atomic_lock_t __kmp_atomic_lock_32c; /* Control access to all user coded ato /* ------------------------------------------------------------------------ */ // All routines declarations looks like -// void __kmpc_atomic_RTYPE_OP( ident_t*, int*, TYPE *lhs, TYPE rhs ); +// void __kmpc_atomic_RTYPE_OP( ident_t*, int, TYPE *lhs, TYPE rhs ); // ------------------------------------------------------------------------ #define KMP_CHECK_GTID \ @@ -721,6 +721,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh } \ } +#if USE_CMPXCHG_FIX // 2007-06-25: // workaround for C78287 (complex(kind=4) data type) // lin_32, lin_32e, win_32 and win_32e are affected (I verified the asm) @@ -751,6 +752,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh } \ } // end of the first part of the workaround for C78287 +#endif // USE_CMPXCHG_FIX #if KMP_ARCH_X86 || KMP_ARCH_X86_64 @@ -775,6 +777,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \ OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \ OP_CMPXCHG(TYPE,BITS,OP) \ } +#if USE_CMPXCHG_FIX // ------------------------------------------------------------------------- // workaround for C78287 (complex(kind=4) data type) #define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \ @@ -783,6 +786,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) OP_CMPXCHG_WORKAROUND(TYPE,BITS,OP) \ } // end of the second part of the workaround for C78287 +#endif #else // ------------------------------------------------------------------------- @@ -820,6 +824,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \ OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \ } \ } +#if USE_CMPXCHG_FIX // ------------------------------------------------------------------------- // workaround for C78287 (complex(kind=4) data type) #define ATOMIC_CMPXCHG_WORKAROUND(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \ @@ -833,6 +838,7 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) } \ } // end of the second part of the workaround for C78287 +#endif // USE_CMPXCHG_FIX #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ // Routines for ATOMIC 4-byte operands addition and subtraction @@ -1068,12 +1074,14 @@ MIN_MAX_COMPXCHG( float4, max, kmp_real32, 32, <, 4r, 3, KMP_ARCH_X86 ) // __km MIN_MAX_COMPXCHG( float4, min, kmp_real32, 32, >, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_min MIN_MAX_COMPXCHG( float8, max, kmp_real64, 64, <, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_max MIN_MAX_COMPXCHG( float8, min, kmp_real64, 64, >, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_min +#if KMP_HAVE_QUAD MIN_MAX_CRITICAL( float16, max, QUAD_LEGACY, <, 16r, 1 ) // __kmpc_atomic_float16_max MIN_MAX_CRITICAL( float16, min, QUAD_LEGACY, >, 16r, 1 ) // __kmpc_atomic_float16_min #if ( KMP_ARCH_X86 ) MIN_MAX_CRITICAL( float16, max_a16, Quad_a16_t, <, 16r, 1 ) // __kmpc_atomic_float16_max_a16 MIN_MAX_CRITICAL( float16, min_a16, Quad_a16_t, >, 16r, 1 ) // __kmpc_atomic_float16_min_a16 #endif +#endif // ------------------------------------------------------------------------ // Need separate macros for .EQV. because of the need of complement (~) // OP ignored for critical sections, ^=~ used instead @@ -1135,6 +1143,7 @@ ATOMIC_CRITICAL( float10, add, long double, +, 10r, 1 ) // __km ATOMIC_CRITICAL( float10, sub, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub ATOMIC_CRITICAL( float10, mul, long double, *, 10r, 1 ) // __kmpc_atomic_float10_mul ATOMIC_CRITICAL( float10, div, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div +#if KMP_HAVE_QUAD // routines for _Quad type ATOMIC_CRITICAL( float16, add, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_add ATOMIC_CRITICAL( float16, sub, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub @@ -1146,14 +1155,22 @@ ATOMIC_CRITICAL( float16, div, QUAD_LEGACY, /, 16r, 1 ) // __km ATOMIC_CRITICAL( float16, mul_a16, Quad_a16_t, *, 16r, 1 ) // __kmpc_atomic_float16_mul_a16 ATOMIC_CRITICAL( float16, div_a16, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16 #endif +#endif // routines for complex types +#if USE_CMPXCHG_FIX // workaround for C78287 (complex(kind=4) data type) ATOMIC_CMPXCHG_WORKAROUND( cmplx4, add, kmp_cmplx32, 64, +, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_add ATOMIC_CMPXCHG_WORKAROUND( cmplx4, sub, kmp_cmplx32, 64, -, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_sub ATOMIC_CMPXCHG_WORKAROUND( cmplx4, mul, kmp_cmplx32, 64, *, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_mul ATOMIC_CMPXCHG_WORKAROUND( cmplx4, div, kmp_cmplx32, 64, /, 8c, 7, 1 ) // __kmpc_atomic_cmplx4_div // end of the workaround for C78287 +#else +ATOMIC_CRITICAL( cmplx4, add, kmp_cmplx32, +, 8c, 1 ) // __kmpc_atomic_cmplx4_add +ATOMIC_CRITICAL( cmplx4, sub, kmp_cmplx32, -, 8c, 1 ) // __kmpc_atomic_cmplx4_sub +ATOMIC_CRITICAL( cmplx4, mul, kmp_cmplx32, *, 8c, 1 ) // __kmpc_atomic_cmplx4_mul +ATOMIC_CRITICAL( cmplx4, div, kmp_cmplx32, /, 8c, 1 ) // __kmpc_atomic_cmplx4_div +#endif // USE_CMPXCHG_FIX ATOMIC_CRITICAL( cmplx8, add, kmp_cmplx64, +, 16c, 1 ) // __kmpc_atomic_cmplx8_add ATOMIC_CRITICAL( cmplx8, sub, kmp_cmplx64, -, 16c, 1 ) // __kmpc_atomic_cmplx8_sub @@ -1163,6 +1180,7 @@ ATOMIC_CRITICAL( cmplx10, add, kmp_cmplx80, +, 20c, 1 ) // __km ATOMIC_CRITICAL( cmplx10, sub, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub ATOMIC_CRITICAL( cmplx10, mul, kmp_cmplx80, *, 20c, 1 ) // __kmpc_atomic_cmplx10_mul ATOMIC_CRITICAL( cmplx10, div, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div +#if KMP_HAVE_QUAD ATOMIC_CRITICAL( cmplx16, add, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_add ATOMIC_CRITICAL( cmplx16, sub, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub ATOMIC_CRITICAL( cmplx16, mul, CPLX128_LEG, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul @@ -1173,6 +1191,7 @@ ATOMIC_CRITICAL( cmplx16, div, CPLX128_LEG, /, 32c, 1 ) // __km ATOMIC_CRITICAL( cmplx16, mul_a16, kmp_cmplx128_a16_t, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_a16 ATOMIC_CRITICAL( cmplx16, div_a16, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16 #endif +#endif #if OMP_40_ENABLED @@ -1312,6 +1331,7 @@ ATOMIC_BEGIN_REV(TYPE_ID,OP_ID,TYPE,void) \ // routines for long double type ATOMIC_CRITICAL_REV( float10, sub, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_rev ATOMIC_CRITICAL_REV( float10, div, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_rev +#if KMP_HAVE_QUAD // routines for _Quad type ATOMIC_CRITICAL_REV( float16, sub, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_rev ATOMIC_CRITICAL_REV( float16, div, QUAD_LEGACY, /, 16r, 1 ) // __kmpc_atomic_float16_div_rev @@ -1319,6 +1339,7 @@ ATOMIC_CRITICAL_REV( float16, div, QUAD_LEGACY, /, 16r, 1 ) // ATOMIC_CRITICAL_REV( float16, sub_a16, Quad_a16_t, -, 16r, 1 ) // __kmpc_atomic_float16_sub_a16_rev ATOMIC_CRITICAL_REV( float16, div_a16, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_rev #endif +#endif // routines for complex types ATOMIC_CRITICAL_REV( cmplx4, sub, kmp_cmplx32, -, 8c, 1 ) // __kmpc_atomic_cmplx4_sub_rev @@ -1327,12 +1348,14 @@ ATOMIC_CRITICAL_REV( cmplx8, sub, kmp_cmplx64, -, 16c, 1 ) // ATOMIC_CRITICAL_REV( cmplx8, div, kmp_cmplx64, /, 16c, 1 ) // __kmpc_atomic_cmplx8_div_rev ATOMIC_CRITICAL_REV( cmplx10, sub, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_rev ATOMIC_CRITICAL_REV( cmplx10, div, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_rev +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_REV( cmplx16, sub, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_rev ATOMIC_CRITICAL_REV( cmplx16, div, CPLX128_LEG, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_rev #if ( KMP_ARCH_X86 ) ATOMIC_CRITICAL_REV( cmplx16, sub_a16, kmp_cmplx128_a16_t, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_a16_rev ATOMIC_CRITICAL_REV( cmplx16, div_a16, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_rev #endif +#endif #endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 @@ -1405,7 +1428,7 @@ ATOMIC_CMPXCHG_MIX( float4, kmp_real32, mul, 32, *, float8, kmp_real64, 4r, 3, K ATOMIC_CMPXCHG_MIX( float4, kmp_real32, div, 32, /, float8, kmp_real64, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_div_float8 // RHS=float16 (deprecated, to be removed when we are sure the compiler does not use them) - +#if KMP_HAVE_QUAD ATOMIC_CMPXCHG_MIX( fixed1, char, add, 8, +, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_add_fp ATOMIC_CMPXCHG_MIX( fixed1, char, sub, 8, -, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_sub_fp ATOMIC_CMPXCHG_MIX( fixed1, char, mul, 8, *, fp, _Quad, 1i, 0, KMP_ARCH_X86 ) // __kmpc_atomic_fixed1_mul_fp @@ -1444,10 +1467,12 @@ ATOMIC_CRITICAL_FP( float10, long double, add, +, fp, _Quad, 10r, 1 ) ATOMIC_CRITICAL_FP( float10, long double, sub, -, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_sub_fp ATOMIC_CRITICAL_FP( float10, long double, mul, *, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_mul_fp ATOMIC_CRITICAL_FP( float10, long double, div, /, fp, _Quad, 10r, 1 ) // __kmpc_atomic_float10_div_fp +#endif #if KMP_ARCH_X86 || KMP_ARCH_X86_64 // ------------------------------------------------------------------------ // X86 or X86_64: no alignment problems ==================================== +#if USE_CMPXCHG_FIX // workaround for C78287 (complex(kind=4) data type) #define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \ ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE) \ @@ -1456,6 +1481,13 @@ ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE) } // end of the second part of the workaround for C78287 #else +#define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \ +ATOMIC_BEGIN_MIX(TYPE_ID,TYPE,OP_ID,RTYPE_ID,RTYPE) \ + OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \ + OP_CMPXCHG(TYPE,BITS,OP) \ +} +#endif // USE_CMPXCHG_FIX +#else // ------------------------------------------------------------------------ // Code for other architectures that don't handle unaligned accesses. #define ATOMIC_CMPXCHG_CMPLX(TYPE_ID,TYPE,OP_ID,BITS,OP,RTYPE_ID,RTYPE,LCK_ID,MASK,GOMP_FLAG) \ @@ -1624,7 +1656,9 @@ ATOMIC_CMPXCHG_READ( fixed1, rd, kmp_int8, 8, +, KMP_ARCH_X86 ) // __kmpc_ ATOMIC_CMPXCHG_READ( fixed2, rd, kmp_int16, 16, +, KMP_ARCH_X86 ) // __kmpc_atomic_fixed2_rd ATOMIC_CRITICAL_READ( float10, rd, long double, +, 10r, 1 ) // __kmpc_atomic_float10_rd +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_READ( float16, rd, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_rd +#endif // KMP_HAVE_QUAD // Fix for CQ220361 on Windows* OS #if ( KMP_OS_WINDOWS ) @@ -1634,11 +1668,13 @@ ATOMIC_CRITICAL_READ( float16, rd, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_ #endif ATOMIC_CRITICAL_READ( cmplx8, rd, kmp_cmplx64, +, 16c, 1 ) // __kmpc_atomic_cmplx8_rd ATOMIC_CRITICAL_READ( cmplx10, rd, kmp_cmplx80, +, 20c, 1 ) // __kmpc_atomic_cmplx10_rd +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_READ( cmplx16, rd, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_rd #if ( KMP_ARCH_X86 ) ATOMIC_CRITICAL_READ( float16, a16_rd, Quad_a16_t, +, 16r, 1 ) // __kmpc_atomic_float16_a16_rd ATOMIC_CRITICAL_READ( cmplx16, a16_rd, kmp_cmplx128_a16_t, +, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_rd #endif +#endif // ------------------------------------------------------------------------ @@ -1720,15 +1756,19 @@ ATOMIC_XCHG_FLOAT_WR( float4, wr, kmp_real32, 32, =, KMP_ARCH_X86 ) // _ #endif ATOMIC_CRITICAL_WR( float10, wr, long double, =, 10r, 1 ) // __kmpc_atomic_float10_wr +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_WR( float16, wr, QUAD_LEGACY, =, 16r, 1 ) // __kmpc_atomic_float16_wr +#endif ATOMIC_CRITICAL_WR( cmplx4, wr, kmp_cmplx32, =, 8c, 1 ) // __kmpc_atomic_cmplx4_wr ATOMIC_CRITICAL_WR( cmplx8, wr, kmp_cmplx64, =, 16c, 1 ) // __kmpc_atomic_cmplx8_wr ATOMIC_CRITICAL_WR( cmplx10, wr, kmp_cmplx80, =, 20c, 1 ) // __kmpc_atomic_cmplx10_wr +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_WR( cmplx16, wr, CPLX128_LEG, =, 32c, 1 ) // __kmpc_atomic_cmplx16_wr #if ( KMP_ARCH_X86 ) ATOMIC_CRITICAL_WR( float16, a16_wr, Quad_a16_t, =, 16r, 1 ) // __kmpc_atomic_float16_a16_wr ATOMIC_CRITICAL_WR( cmplx16, a16_wr, kmp_cmplx128_a16_t, =, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_wr #endif +#endif // ------------------------------------------------------------------------ @@ -2058,12 +2098,14 @@ MIN_MAX_COMPXCHG_CPT( float4, max_cpt, kmp_real32, 32, <, KMP_ARCH_X86 ) // __k MIN_MAX_COMPXCHG_CPT( float4, min_cpt, kmp_real32, 32, >, KMP_ARCH_X86 ) // __kmpc_atomic_float4_min_cpt MIN_MAX_COMPXCHG_CPT( float8, max_cpt, kmp_real64, 64, <, KMP_ARCH_X86 ) // __kmpc_atomic_float8_max_cpt MIN_MAX_COMPXCHG_CPT( float8, min_cpt, kmp_real64, 64, >, KMP_ARCH_X86 ) // __kmpc_atomic_float8_min_cpt +#if KMP_HAVE_QUAD MIN_MAX_CRITICAL_CPT( float16, max_cpt, QUAD_LEGACY, <, 16r, 1 ) // __kmpc_atomic_float16_max_cpt MIN_MAX_CRITICAL_CPT( float16, min_cpt, QUAD_LEGACY, >, 16r, 1 ) // __kmpc_atomic_float16_min_cpt #if ( KMP_ARCH_X86 ) MIN_MAX_CRITICAL_CPT( float16, max_a16_cpt, Quad_a16_t, <, 16r, 1 ) // __kmpc_atomic_float16_max_a16_cpt MIN_MAX_CRITICAL_CPT( float16, min_a16_cpt, Quad_a16_t, >, 16r, 1 ) // __kmpc_atomic_float16_mix_a16_cpt #endif +#endif // ------------------------------------------------------------------------ #ifdef KMP_GOMP_COMPAT @@ -2156,6 +2198,7 @@ ATOMIC_CRITICAL_CPT( float10, add_cpt, long double, +, 10r, 1 ) ATOMIC_CRITICAL_CPT( float10, sub_cpt, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_cpt ATOMIC_CRITICAL_CPT( float10, mul_cpt, long double, *, 10r, 1 ) // __kmpc_atomic_float10_mul_cpt ATOMIC_CRITICAL_CPT( float10, div_cpt, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_cpt +#if KMP_HAVE_QUAD // routines for _Quad type ATOMIC_CRITICAL_CPT( float16, add_cpt, QUAD_LEGACY, +, 16r, 1 ) // __kmpc_atomic_float16_add_cpt ATOMIC_CRITICAL_CPT( float16, sub_cpt, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_cpt @@ -2167,6 +2210,7 @@ ATOMIC_CRITICAL_CPT( float16, div_cpt, QUAD_LEGACY, /, 16r, 1 ) ATOMIC_CRITICAL_CPT( float16, mul_a16_cpt, Quad_a16_t, *, 16r, 1 ) // __kmpc_atomic_float16_mul_a16_cpt ATOMIC_CRITICAL_CPT( float16, div_a16_cpt, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_cpt #endif +#endif // routines for complex types @@ -2184,6 +2228,7 @@ ATOMIC_CRITICAL_CPT( cmplx10, add_cpt, kmp_cmplx80, +, 20c, 1 ) // ATOMIC_CRITICAL_CPT( cmplx10, sub_cpt, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_cpt ATOMIC_CRITICAL_CPT( cmplx10, mul_cpt, kmp_cmplx80, *, 20c, 1 ) // __kmpc_atomic_cmplx10_mul_cpt ATOMIC_CRITICAL_CPT( cmplx10, div_cpt, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_cpt +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_CPT( cmplx16, add_cpt, CPLX128_LEG, +, 32c, 1 ) // __kmpc_atomic_cmplx16_add_cpt ATOMIC_CRITICAL_CPT( cmplx16, sub_cpt, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_cpt ATOMIC_CRITICAL_CPT( cmplx16, mul_cpt, CPLX128_LEG, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_cpt @@ -2194,6 +2239,7 @@ ATOMIC_CRITICAL_CPT( cmplx16, div_cpt, CPLX128_LEG, /, 32c, 1 ) // ATOMIC_CRITICAL_CPT( cmplx16, mul_a16_cpt, kmp_cmplx128_a16_t, *, 32c, 1 ) // __kmpc_atomic_cmplx16_mul_a16_cpt ATOMIC_CRITICAL_CPT( cmplx16, div_a16_cpt, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_cpt #endif +#endif #if OMP_40_ENABLED @@ -2321,6 +2367,7 @@ ATOMIC_BEGIN_CPT(TYPE_ID,OP_ID,TYPE,TYPE) \ // routines for long double type ATOMIC_CRITICAL_CPT_REV( float10, sub_cpt_rev, long double, -, 10r, 1 ) // __kmpc_atomic_float10_sub_cpt_rev ATOMIC_CRITICAL_CPT_REV( float10, div_cpt_rev, long double, /, 10r, 1 ) // __kmpc_atomic_float10_div_cpt_rev +#if KMP_HAVE_QUAD // routines for _Quad type ATOMIC_CRITICAL_CPT_REV( float16, sub_cpt_rev, QUAD_LEGACY, -, 16r, 1 ) // __kmpc_atomic_float16_sub_cpt_rev ATOMIC_CRITICAL_CPT_REV( float16, div_cpt_rev, QUAD_LEGACY, /, 16r, 1 ) // __kmpc_atomic_float16_div_cpt_rev @@ -2328,6 +2375,7 @@ ATOMIC_CRITICAL_CPT_REV( float16, div_cpt_rev, QUAD_LEGACY, /, 16r, 1 ) ATOMIC_CRITICAL_CPT_REV( float16, sub_a16_cpt_rev, Quad_a16_t, -, 16r, 1 ) // __kmpc_atomic_float16_sub_a16_cpt_rev ATOMIC_CRITICAL_CPT_REV( float16, div_a16_cpt_rev, Quad_a16_t, /, 16r, 1 ) // __kmpc_atomic_float16_div_a16_cpt_rev #endif +#endif // routines for complex types @@ -2378,12 +2426,14 @@ ATOMIC_CRITICAL_CPT_REV( cmplx8, sub_cpt_rev, kmp_cmplx64, -, 16c, 1 ) ATOMIC_CRITICAL_CPT_REV( cmplx8, div_cpt_rev, kmp_cmplx64, /, 16c, 1 ) // __kmpc_atomic_cmplx8_div_cpt_rev ATOMIC_CRITICAL_CPT_REV( cmplx10, sub_cpt_rev, kmp_cmplx80, -, 20c, 1 ) // __kmpc_atomic_cmplx10_sub_cpt_rev ATOMIC_CRITICAL_CPT_REV( cmplx10, div_cpt_rev, kmp_cmplx80, /, 20c, 1 ) // __kmpc_atomic_cmplx10_div_cpt_rev +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_CPT_REV( cmplx16, sub_cpt_rev, CPLX128_LEG, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_cpt_rev ATOMIC_CRITICAL_CPT_REV( cmplx16, div_cpt_rev, CPLX128_LEG, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_cpt_rev #if ( KMP_ARCH_X86 ) ATOMIC_CRITICAL_CPT_REV( cmplx16, sub_a16_cpt_rev, kmp_cmplx128_a16_t, -, 32c, 1 ) // __kmpc_atomic_cmplx16_sub_a16_cpt_rev ATOMIC_CRITICAL_CPT_REV( cmplx16, div_a16_cpt_rev, kmp_cmplx128_a16_t, /, 32c, 1 ) // __kmpc_atomic_cmplx16_div_a16_cpt_rev #endif +#endif // OpenMP 4.0 Capture-write (swap): {v = x; x = expr;} @@ -2527,7 +2577,9 @@ ATOMIC_BEGIN_SWP_WRK(TYPE_ID,TYPE) \ ATOMIC_CRITICAL_SWP( float10, long double, 10r, 1 ) // __kmpc_atomic_float10_swp +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_SWP( float16, QUAD_LEGACY, 16r, 1 ) // __kmpc_atomic_float16_swp +#endif // cmplx4 routine to return void ATOMIC_CRITICAL_SWP_WRK( cmplx4, kmp_cmplx32, 8c, 1 ) // __kmpc_atomic_cmplx4_swp @@ -2536,11 +2588,13 @@ ATOMIC_CRITICAL_SWP_WRK( cmplx4, kmp_cmplx32, 8c, 1 ) // __kmpc_ato ATOMIC_CRITICAL_SWP( cmplx8, kmp_cmplx64, 16c, 1 ) // __kmpc_atomic_cmplx8_swp ATOMIC_CRITICAL_SWP( cmplx10, kmp_cmplx80, 20c, 1 ) // __kmpc_atomic_cmplx10_swp +#if KMP_HAVE_QUAD ATOMIC_CRITICAL_SWP( cmplx16, CPLX128_LEG, 32c, 1 ) // __kmpc_atomic_cmplx16_swp #if ( KMP_ARCH_X86 ) ATOMIC_CRITICAL_SWP( float16_a16, Quad_a16_t, 16r, 1 ) // __kmpc_atomic_float16_a16_swp ATOMIC_CRITICAL_SWP( cmplx16_a16, kmp_cmplx128_a16_t, 32c, 1 ) // __kmpc_atomic_cmplx16_a16_swp #endif +#endif // End of OpenMP 4.0 Capture diff --git a/openmp/runtime/src/kmp_atomic.h b/openmp/runtime/src/kmp_atomic.h index 2243ba700aa..361dce9aa79 100644 --- a/openmp/runtime/src/kmp_atomic.h +++ b/openmp/runtime/src/kmp_atomic.h @@ -1,7 +1,7 @@ /* * kmp_atomic.h - ATOMIC header file - * $Revision: 42195 $ - * $Date: 2013-03-27 16:10:35 -0500 (Wed, 27 Mar 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -30,10 +30,6 @@ // to use typedef'ed types on win. // Condition for WIN64 was modified in anticipation of 10.1 build compiler. -#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) -typedef __float128 _Quad; -#endif - #if defined( __cplusplus ) && ( KMP_OS_WINDOWS ) // create shortcuts for c99 complex types @@ -173,6 +169,7 @@ typedef __float128 _Quad; typedef KMP_DO_ALIGN( 16 ) struct __kmp_cmplx80_t kmp_cmplx80; // complex16 + #if KMP_HAVE_QUAD struct __kmp_cmplx128_t : std::complex< _Quad > { __kmp_cmplx128_t() : std::complex< _Quad > () {} @@ -192,6 +189,7 @@ typedef __float128 _Quad; }; typedef struct __kmp_cmplx128_t kmp_cmplx128; + #endif /* KMP_HAVE_QUAD */ #ifdef _DEBUG_TEMPORARILY_UNSET_ #undef _DEBUG_TEMPORARILY_UNSET_ @@ -204,19 +202,22 @@ typedef __float128 _Quad; typedef float _Complex kmp_cmplx32; typedef double _Complex kmp_cmplx64; typedef long double _Complex kmp_cmplx80; + #if KMP_HAVE_QUAD typedef _Quad _Complex kmp_cmplx128; + #endif #endif // Compiler 12.0 changed alignment of 16 and 32-byte arguments (like _Quad // and kmp_cmplx128) on IA-32 architecture. The following aligned structures // are implemented to support the old alignment in 10.1, 11.0, 11.1 and // introduce the new alignment in 12.0. See CQ88405. -#if ( KMP_ARCH_X86 ) +#if KMP_ARCH_X86 && KMP_HAVE_QUAD // 4-byte aligned structures for backward compatibility. #pragma pack( push, 4 ) + struct KMP_DO_ALIGN( 4 ) Quad_a4_t { _Quad q; @@ -364,31 +365,31 @@ extern int __kmp_atomic_mode; typedef kmp_queuing_lock_t kmp_atomic_lock_t; -inline void +static inline void __kmp_acquire_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid ) { __kmp_acquire_queuing_lock( lck, gtid ); } -inline int +static inline int __kmp_test_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid ) { return __kmp_test_queuing_lock( lck, gtid ); } -inline void +static inline void __kmp_release_atomic_lock( kmp_atomic_lock_t *lck, kmp_int32 gtid ) { __kmp_release_queuing_lock( lck, gtid ); } -inline void +static inline void __kmp_init_atomic_lock( kmp_atomic_lock_t *lck ) { __kmp_init_queuing_lock( lck ); } -inline void +static inline void __kmp_destroy_atomic_lock( kmp_atomic_lock_t *lck ) { __kmp_destroy_queuing_lock( lck ); @@ -498,6 +499,7 @@ void __kmpc_atomic_float4_max( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp void __kmpc_atomic_float4_min( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs ); void __kmpc_atomic_float8_max( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs ); void __kmpc_atomic_float8_min( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_float16_max( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); void __kmpc_atomic_float16_min( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); #if ( KMP_ARCH_X86 ) @@ -505,6 +507,7 @@ void __kmpc_atomic_float16_min( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QU void __kmpc_atomic_float16_max_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); void __kmpc_atomic_float16_min_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); #endif +#endif // .NEQV. (same as xor) void __kmpc_atomic_fixed1_neqv( ident_t *id_ref, int gtid, char * lhs, char rhs ); void __kmpc_atomic_fixed2_neqv( ident_t *id_ref, int gtid, short * lhs, short rhs ); @@ -521,6 +524,7 @@ void __kmpc_atomic_float10_sub( ident_t *id_ref, int gtid, long double * lhs, lo void __kmpc_atomic_float10_mul( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); void __kmpc_atomic_float10_div( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); // _Quad type +#if KMP_HAVE_QUAD void __kmpc_atomic_float16_add( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); void __kmpc_atomic_float16_sub( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); void __kmpc_atomic_float16_mul( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); @@ -532,6 +536,7 @@ void __kmpc_atomic_float16_div( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QU void __kmpc_atomic_float16_mul_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); void __kmpc_atomic_float16_div_a16( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); #endif +#endif // routines for complex types void __kmpc_atomic_cmplx4_add( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); void __kmpc_atomic_cmplx4_sub( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); @@ -545,6 +550,7 @@ void __kmpc_atomic_cmplx10_add( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, km void __kmpc_atomic_cmplx10_sub( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); void __kmpc_atomic_cmplx10_mul( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); void __kmpc_atomic_cmplx10_div( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_cmplx16_add( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); void __kmpc_atomic_cmplx16_sub( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); void __kmpc_atomic_cmplx16_mul( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); @@ -556,6 +562,7 @@ void __kmpc_atomic_cmplx16_div( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CP void __kmpc_atomic_cmplx16_mul_a16( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); void __kmpc_atomic_cmplx16_div_a16( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); #endif +#endif #if OMP_40_ENABLED @@ -593,14 +600,17 @@ void __kmpc_atomic_float8_sub_rev( ident_t *id_ref, int gtid, double * lhs, dou void __kmpc_atomic_float8_div_rev( ident_t *id_ref, int gtid, double * lhs, double rhs ); void __kmpc_atomic_float10_sub_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); void __kmpc_atomic_float10_div_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_float16_sub_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); void __kmpc_atomic_float16_div_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); +#endif void __kmpc_atomic_cmplx4_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); void __kmpc_atomic_cmplx4_div_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); void __kmpc_atomic_cmplx8_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs ); void __kmpc_atomic_cmplx8_div_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs ); void __kmpc_atomic_cmplx10_sub_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); void __kmpc_atomic_cmplx10_div_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_cmplx16_sub_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); void __kmpc_atomic_cmplx16_div_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); #if ( KMP_ARCH_X86 ) @@ -610,6 +620,7 @@ void __kmpc_atomic_cmplx16_div_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs void __kmpc_atomic_cmplx16_sub_a16_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); void __kmpc_atomic_cmplx16_div_a16_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); #endif +#endif // KMP_HAVE_QUAD #endif //KMP_ARCH_X86 || KMP_ARCH_X86_64 @@ -632,6 +643,7 @@ void __kmpc_atomic_float4_mul_float8( ident_t *id_ref, int gtid, kmp_real32 * lh void __kmpc_atomic_float4_div_float8( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real64 rhs ); // RHS=float16 (deprecated, to be removed when we are sure the compiler does not use them) +#if KMP_HAVE_QUAD void __kmpc_atomic_fixed1_add_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs ); void __kmpc_atomic_fixed1_sub_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs ); void __kmpc_atomic_fixed1_mul_fp( ident_t *id_ref, int gtid, char * lhs, _Quad rhs ); @@ -670,6 +682,7 @@ void __kmpc_atomic_float10_add_fp( ident_t *id_ref, int gtid, long double * lhs, void __kmpc_atomic_float10_sub_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs ); void __kmpc_atomic_float10_mul_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs ); void __kmpc_atomic_float10_div_fp( ident_t *id_ref, int gtid, long double * lhs, _Quad rhs ); +#endif // KMP_HAVE_QUAD // RHS=cmplx8 void __kmpc_atomic_cmplx4_add_cmplx8( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx64 rhs ); @@ -701,7 +714,9 @@ kmp_int64 __kmpc_atomic_fixed8_rd( ident_t *id_ref, int gtid, kmp_int64 * kmp_real32 __kmpc_atomic_float4_rd( ident_t *id_ref, int gtid, kmp_real32 * loc ); kmp_real64 __kmpc_atomic_float8_rd( ident_t *id_ref, int gtid, kmp_real64 * loc ); long double __kmpc_atomic_float10_rd( ident_t *id_ref, int gtid, long double * loc ); +#if KMP_HAVE_QUAD QUAD_LEGACY __kmpc_atomic_float16_rd( ident_t *id_ref, int gtid, QUAD_LEGACY * loc ); +#endif // Fix for CQ220361: cmplx4 READ will return void on Windows* OS; read value will be // returned through an additional parameter #if ( KMP_OS_WINDOWS ) @@ -711,12 +726,14 @@ QUAD_LEGACY __kmpc_atomic_float16_rd( ident_t *id_ref, int gtid, QUAD_LEGACY * #endif kmp_cmplx64 __kmpc_atomic_cmplx8_rd( ident_t *id_ref, int gtid, kmp_cmplx64 * loc ); kmp_cmplx80 __kmpc_atomic_cmplx10_rd( ident_t *id_ref, int gtid, kmp_cmplx80 * loc ); +#if KMP_HAVE_QUAD CPLX128_LEG __kmpc_atomic_cmplx16_rd( ident_t *id_ref, int gtid, CPLX128_LEG * loc ); #if ( KMP_ARCH_X86 ) // Routines with 16-byte arguments aligned to 16-byte boundary Quad_a16_t __kmpc_atomic_float16_a16_rd( ident_t * id_ref, int gtid, Quad_a16_t * loc ); kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_rd( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * loc ); #endif +#endif // @@ -730,17 +747,20 @@ void __kmpc_atomic_fixed8_wr( ident_t *id_ref, int gtid, kmp_int64 * lhs, kmp void __kmpc_atomic_float4_wr( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs ); void __kmpc_atomic_float8_wr( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs ); void __kmpc_atomic_float10_wr( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_float16_wr( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); +#endif void __kmpc_atomic_cmplx4_wr( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); void __kmpc_atomic_cmplx8_wr( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs ); void __kmpc_atomic_cmplx10_wr( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); +#if KMP_HAVE_QUAD void __kmpc_atomic_cmplx16_wr( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); #if ( KMP_ARCH_X86 ) // Routines with 16-byte arguments aligned to 16-byte boundary void __kmpc_atomic_float16_a16_wr( ident_t * id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); void __kmpc_atomic_cmplx16_a16_wr( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); #endif - +#endif // // Below routines for atomic CAPTURE are listed @@ -830,8 +850,10 @@ kmp_real32 __kmpc_atomic_float4_max_cpt( ident_t *id_ref, int gtid, kmp_real32 kmp_real32 __kmpc_atomic_float4_min_cpt( ident_t *id_ref, int gtid, kmp_real32 * lhs, kmp_real32 rhs, int flag); kmp_real64 __kmpc_atomic_float8_max_cpt( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs, int flag); kmp_real64 __kmpc_atomic_float8_min_cpt( ident_t *id_ref, int gtid, kmp_real64 * lhs, kmp_real64 rhs, int flag); +#if KMP_HAVE_QUAD QUAD_LEGACY __kmpc_atomic_float16_max_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); QUAD_LEGACY __kmpc_atomic_float16_min_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); +#endif // .NEQV. (same as xor) char __kmpc_atomic_fixed1_neqv_cpt( ident_t *id_ref, int gtid, char * lhs, char rhs, int flag); short __kmpc_atomic_fixed2_neqv_cpt( ident_t *id_ref, int gtid, short * lhs, short rhs, int flag); @@ -847,11 +869,13 @@ long double __kmpc_atomic_float10_add_cpt( ident_t *id_ref, int gtid, long doubl long double __kmpc_atomic_float10_sub_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag); long double __kmpc_atomic_float10_mul_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag); long double __kmpc_atomic_float10_div_cpt( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag); +#if KMP_HAVE_QUAD // _Quad type QUAD_LEGACY __kmpc_atomic_float16_add_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); QUAD_LEGACY __kmpc_atomic_float16_sub_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); QUAD_LEGACY __kmpc_atomic_float16_mul_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); QUAD_LEGACY __kmpc_atomic_float16_div_cpt( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag); +#endif // routines for complex types // Workaround for cmplx4 routines - return void; captured value is returned via the argument void __kmpc_atomic_cmplx4_add_cpt( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag); @@ -867,6 +891,7 @@ kmp_cmplx80 __kmpc_atomic_cmplx10_add_cpt( ident_t *id_ref, int gtid, kmp_cmplx8 kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag); kmp_cmplx80 __kmpc_atomic_cmplx10_mul_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag); kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag); +#if KMP_HAVE_QUAD CPLX128_LEG __kmpc_atomic_cmplx16_add_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag); CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag); CPLX128_LEG __kmpc_atomic_cmplx16_mul_cpt( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag); @@ -884,6 +909,7 @@ CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt( ident_t *id_ref, int gtid, CPLX128_LE kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_mul_a16_cpt( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag); kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag); #endif +#endif void __kmpc_atomic_start(void); void __kmpc_atomic_end(void); @@ -922,8 +948,10 @@ double __kmpc_atomic_float8_sub_cpt_rev( ident_t *id_ref, int gtid, double * double __kmpc_atomic_float8_div_cpt_rev( ident_t *id_ref, int gtid, double * lhs, double rhs, int flag ); long double __kmpc_atomic_float10_sub_cpt_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag ); long double __kmpc_atomic_float10_div_cpt_rev( ident_t *id_ref, int gtid, long double * lhs, long double rhs, int flag ); +#if KMP_HAVE_QUAD QUAD_LEGACY __kmpc_atomic_float16_sub_cpt_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag ); QUAD_LEGACY __kmpc_atomic_float16_div_cpt_rev( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs, int flag ); +#endif // Workaround for cmplx4 routines - return void; captured value is returned via the argument void __kmpc_atomic_cmplx4_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag ); void __kmpc_atomic_cmplx4_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out, int flag ); @@ -931,6 +959,7 @@ kmp_cmplx64 __kmpc_atomic_cmplx8_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_c kmp_cmplx64 __kmpc_atomic_cmplx8_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs, int flag ); kmp_cmplx80 __kmpc_atomic_cmplx10_sub_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag ); kmp_cmplx80 __kmpc_atomic_cmplx10_div_cpt_rev( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs, int flag ); +#if KMP_HAVE_QUAD CPLX128_LEG __kmpc_atomic_cmplx16_sub_cpt_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag ); CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs, int flag ); #if ( KMP_ARCH_X86 ) @@ -939,6 +968,7 @@ CPLX128_LEG __kmpc_atomic_cmplx16_div_cpt_rev( ident_t *id_ref, int gtid, CPLX kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_sub_a16_cpt_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag ); kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_div_a16_cpt_rev( ident_t * id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs, int flag ); #endif +#endif // OpenMP 4.0 Capture-write (swap): {v = x; x = expr;} char __kmpc_atomic_fixed1_swp( ident_t *id_ref, int gtid, char * lhs, char rhs ); @@ -948,18 +978,22 @@ kmp_int64 __kmpc_atomic_fixed8_swp( ident_t *id_ref, int gtid, kmp_int64 * l float __kmpc_atomic_float4_swp( ident_t *id_ref, int gtid, float * lhs, float rhs ); double __kmpc_atomic_float8_swp( ident_t *id_ref, int gtid, double * lhs, double rhs ); long double __kmpc_atomic_float10_swp( ident_t *id_ref, int gtid, long double * lhs, long double rhs ); +#if KMP_HAVE_QUAD QUAD_LEGACY __kmpc_atomic_float16_swp( ident_t *id_ref, int gtid, QUAD_LEGACY * lhs, QUAD_LEGACY rhs ); +#endif // !!! TODO: check if we need a workaround here void __kmpc_atomic_cmplx4_swp( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs, kmp_cmplx32 * out ); //kmp_cmplx32 __kmpc_atomic_cmplx4_swp( ident_t *id_ref, int gtid, kmp_cmplx32 * lhs, kmp_cmplx32 rhs ); kmp_cmplx64 __kmpc_atomic_cmplx8_swp( ident_t *id_ref, int gtid, kmp_cmplx64 * lhs, kmp_cmplx64 rhs ); kmp_cmplx80 __kmpc_atomic_cmplx10_swp( ident_t *id_ref, int gtid, kmp_cmplx80 * lhs, kmp_cmplx80 rhs ); +#if KMP_HAVE_QUAD CPLX128_LEG __kmpc_atomic_cmplx16_swp( ident_t *id_ref, int gtid, CPLX128_LEG * lhs, CPLX128_LEG rhs ); #if ( KMP_ARCH_X86 ) Quad_a16_t __kmpc_atomic_float16_a16_swp( ident_t *id_ref, int gtid, Quad_a16_t * lhs, Quad_a16_t rhs ); kmp_cmplx128_a16_t __kmpc_atomic_cmplx16_a16_swp( ident_t *id_ref, int gtid, kmp_cmplx128_a16_t * lhs, kmp_cmplx128_a16_t rhs ); #endif +#endif // End of OpenMP 4.0 capture diff --git a/openmp/runtime/src/kmp_cancel.cpp b/openmp/runtime/src/kmp_cancel.cpp new file mode 100644 index 00000000000..e5a76d26951 --- /dev/null +++ b/openmp/runtime/src/kmp_cancel.cpp @@ -0,0 +1,282 @@ + +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.txt for details. +// +//===----------------------------------------------------------------------===// + + +#include "kmp.h" +#include "kmp_i18n.h" +#include "kmp_io.h" +#include "kmp_str.h" + +#if OMP_40_ENABLED + +/*! +@ingroup CANCELLATION +@param loc_ref location of the original task directive +@param gtid Global thread ID of encountering thread +@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup) + +@return returns true if the cancellation request has been activated and the execution thread +needs to proceed to the end of the canceled region. + +Request cancellation of the binding OpenMP region. +*/ +kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) { + kmp_info_t *this_thr = __kmp_threads [ gtid ]; + + KC_TRACE( 10, ("__kmpc_cancel: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) ); + + KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq); + KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop || + cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup); + KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid); + + if (__kmp_omp_cancellation) { + switch (cncl_kind) { + case cancel_parallel: + case cancel_loop: + case cancel_sections: + // cancellation requests for parallel and worksharing constructs + // are handled through the team structure + { + kmp_team_t *this_team = this_thr->th.th_team; + KMP_DEBUG_ASSERT(this_team); + kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(this_team->t.t_cancel_request), cancel_noreq, cncl_kind); + if (old == cancel_noreq || old == cncl_kind) { + //printf("__kmpc_cancel: this_team->t.t_cancel_request=%d @ %p\n", + // this_team->t.t_cancel_request, &(this_team->t.t_cancel_request)); + // we do not have a cancellation request in this team or we do have one + // that matches the current request -> cancel + return 1 /* true */; + } + break; + } + case cancel_taskgroup: + // cancellation requests for parallel and worksharing constructs + // are handled through the taskgroup structure + { + kmp_taskdata_t* task; + kmp_taskgroup_t* taskgroup; + + task = this_thr->th.th_current_task; + KMP_DEBUG_ASSERT( task ); + + taskgroup = task->td_taskgroup; + if (taskgroup) { + kmp_int32 old = KMP_COMPARE_AND_STORE_RET32(&(taskgroup->cancel_request), cancel_noreq, cncl_kind); + if (old == cancel_noreq || old == cncl_kind) { + // we do not have a cancellation request in this taskgroup or we do have one + // that matches the current request -> cancel + return 1 /* true */; + } + } + else { + // TODO: what needs to happen here? + // the specification disallows cancellation w/o taskgroups + // so we might do anything here, let's abort for now + KMP_ASSERT( 0 /* false */); + } + } + break; + default: + KMP_ASSERT (0 /* false */); + } + } + + // ICV OMP_CANCELLATION=false, so we ignored this cancel request + KMP_DEBUG_ASSERT(!__kmp_omp_cancellation); + return 0 /* false */; +} + +/*! +@ingroup CANCELLATION +@param loc_ref location of the original task directive +@param gtid Global thread ID of encountering thread +@param cncl_kind Cancellation kind (parallel, for, sections, taskgroup) + +@return returns true if a matching cancellation request has been flagged in the RTL and the +encountering thread has to cancel.. + +Cancellation point for the encountering thread. +*/ +kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind) { + kmp_info_t *this_thr = __kmp_threads [ gtid ]; + + KC_TRACE( 10, ("__kmpc_cancellationpoint: T#%d request %d OMP_CANCELLATION=%d\n", gtid, cncl_kind, __kmp_omp_cancellation) ); + + KMP_DEBUG_ASSERT(cncl_kind != cancel_noreq); + KMP_DEBUG_ASSERT(cncl_kind == cancel_parallel || cncl_kind == cancel_loop || + cncl_kind == cancel_sections || cncl_kind == cancel_taskgroup); + KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid); + + if (__kmp_omp_cancellation) { + switch (cncl_kind) { + case cancel_parallel: + case cancel_loop: + case cancel_sections: + // cancellation requests for parallel and worksharing constructs + // are handled through the team structure + { + kmp_team_t *this_team = this_thr->th.th_team; + KMP_DEBUG_ASSERT(this_team); + if (this_team->t.t_cancel_request) { + if (cncl_kind == this_team->t.t_cancel_request) { + // the request in the team structure matches the type of + // cancellation point so we can cancel + return 1 /* true */; + } + KMP_ASSERT( 0 /* false */); + } + else { + // we do not have a cancellation request pending, so we just + // ignore this cancellation point + return 0; + } + break; + } + case cancel_taskgroup: + // cancellation requests for parallel and worksharing constructs + // are handled through the taskgroup structure + { + kmp_taskdata_t* task; + kmp_taskgroup_t* taskgroup; + + task = this_thr->th.th_current_task; + KMP_DEBUG_ASSERT( task ); + + taskgroup = task->td_taskgroup; + if (taskgroup) { + // return the current status of cancellation for the + // taskgroup + return !!taskgroup->cancel_request; + } + else { + // if a cancellation point is encountered by a task + // that does not belong to a taskgroup, it is OK + // to ignore it + return 0 /* false */; + } + } + default: + KMP_ASSERT (0 /* false */); + } + } + + // ICV OMP_CANCELLATION=false, so we ignore the cancellation point + KMP_DEBUG_ASSERT(!__kmp_omp_cancellation); + return 0 /* false */; +} + +/*! +@ingroup CANCELLATION +@param loc_ref location of the original task directive +@param gtid Global thread ID of encountering thread + +@return returns true if a matching cancellation request has been flagged in the RTL and the +encountering thread has to cancel.. + +Barrier with cancellation point to send threads from the barrier to the +end of the parallel region. Needs a special code pattern as documented +in the design document for the cancellation feature. +*/ +kmp_int32 +__kmpc_cancel_barrier(ident_t *loc, kmp_int32 gtid) { + int ret = 0 /* false */; + kmp_info_t *this_thr = __kmp_threads [ gtid ]; + kmp_team_t *this_team = this_thr->th.th_team; + + KMP_DEBUG_ASSERT(__kmp_get_gtid() == gtid); + + // call into the standard barrier + __kmpc_barrier(loc, gtid); + + // if cancellation is active, check cancellation flag + if (__kmp_omp_cancellation) { + // depending on which construct to cancel, check the flag and + // reset the flag + switch (this_team->t.t_cancel_request) { + case cancel_parallel: + ret = 1; + // ensure that threads have checked the flag, when + // leaving the above barrier + __kmpc_barrier(loc, gtid); + this_team->t.t_cancel_request = cancel_noreq; + // the next barrier is the fork/join barrier, which + // synchronizes the threads leaving here + break; + case cancel_loop: + case cancel_sections: + ret = 1; + // ensure that threads have checked the flag, when + // leaving the above barrier + __kmpc_barrier(loc, gtid); + this_team->t.t_cancel_request = cancel_noreq; + // synchronize the threads again to make sure we + // do not have any run-away threads that cause a race + // on the cancellation flag + __kmpc_barrier(loc, gtid); + break; + case cancel_taskgroup: + // this case should not occur + KMP_ASSERT (0 /* false */ ); + break; + case cancel_noreq: + // do nothing + break; + default: + KMP_ASSERT ( 0 /* false */); + } + } + + return ret; +} + +/*! +@ingroup CANCELLATION +@param loc_ref location of the original task directive +@param gtid Global thread ID of encountering thread + +@return returns true if a matching cancellation request has been flagged in the RTL and the +encountering thread has to cancel.. + +Query function to query the current status of cancellation requests. +Can be used to implement the following pattern: + +if (kmp_get_cancellation_status(kmp_cancel_parallel)) { + perform_cleanup(); + #pragma omp cancellation point parallel +} +*/ +int __kmp_get_cancellation_status(int cancel_kind) { + if (__kmp_omp_cancellation) { + kmp_info_t *this_thr = __kmp_entry_thread(); + + switch (cancel_kind) { + case cancel_parallel: + case cancel_loop: + case cancel_sections: + { + kmp_team_t *this_team = this_thr->th.th_team; + return this_team->t.t_cancel_request == cancel_kind; + } + case cancel_taskgroup: + { + kmp_taskdata_t* task; + kmp_taskgroup_t* taskgroup; + task = this_thr->th.th_current_task; + taskgroup = task->td_taskgroup; + return taskgroup && taskgroup->cancel_request; + } + } + } + + return 0 /* false */; +} + +#endif diff --git a/openmp/runtime/src/kmp_csupport.c b/openmp/runtime/src/kmp_csupport.c index 8ca4612c473..17cc5347fa2 100644 --- a/openmp/runtime/src/kmp_csupport.c +++ b/openmp/runtime/src/kmp_csupport.c @@ -1,7 +1,7 @@ /* * kmp_csupport.c -- kfront linkage support for OpenMP. - * $Revision: 42642 $ - * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $ + * $Revision: 42826 $ + * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $ */ @@ -287,7 +287,7 @@ __kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...) VOLATILE_CAST(microtask_t) microtask, VOLATILE_CAST(launch_t) __kmp_invoke_task_func, /* TODO: revert workaround for Intel(R) 64 tracker #96 */ -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX &ap #else ap @@ -351,7 +351,7 @@ __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...) argc, VOLATILE_CAST(microtask_t) __kmp_teams_master, VOLATILE_CAST(launch_t) __kmp_invoke_teams_master, -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX &ap #else ap @@ -622,28 +622,20 @@ __kmpc_serialized_parallel(ident_t *loc, kmp_int32 global_tid) if ( __kmp_env_consistency_check ) __kmp_push_parallel( global_tid, NULL ); -#if USE_ITT_BUILD +// t_level is not available in 2.5 build, so check for OMP_30_ENABLED +#if USE_ITT_BUILD && OMP_30_ENABLED // Mark the start of the "parallel" region for VTune. Only use one of frame notification scheme at the moment. if ( ( __itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG ) { __kmp_itt_region_forking( global_tid, 1 ); } - // Collect information only if the file was opened succesfully. - if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file ) + if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr ) { +#if USE_ITT_NOTIFY if( this_thr->th.th_team->t.t_level == 1 ) { - kmp_uint64 fr_begin; -#if defined( __GNUC__ ) -# if !defined( __INTEL_COMPILER ) - fr_begin = __kmp_hardware_timestamp(); -# else - fr_begin = __rdtsc(); -# endif -#else - fr_begin = __rdtsc(); -#endif - this_thr->th.th_frame_time_serialized = fr_begin; + this_thr->th.th_frame_time_serialized = __itt_get_timestamp(); } +#endif } #endif /* USE_ITT_BUILD */ @@ -774,39 +766,17 @@ __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) } -#if USE_ITT_BUILD +// t_level is not available in 2.5 build, so check for OMP_30_ENABLED +#if USE_ITT_BUILD && OMP_30_ENABLED // Mark the end of the "parallel" region for VTune. Only use one of frame notification scheme at the moment. if ( ( __itt_frame_end_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG ) { + this_thr->th.th_ident = loc; __kmp_itt_region_joined( global_tid, 1 ); } - // Collect information only if the file was opened succesfully. - if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file ) - { + if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr ) { if( this_thr->th.th_team->t.t_level == 0 ) { - ident_t * loc = this_thr->th.th_ident; - if (loc) { - // Use compiler-generated location to mark the frame: - // "<func>$omp$frame@[file:]<line>[:<col>]" - kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 ); - - kmp_uint64 fr_end; -#if defined( __GNUC__ ) -# if !defined( __INTEL_COMPILER ) - fr_end = __kmp_hardware_timestamp(); -# else - fr_end = __rdtsc(); -# endif -#else - fr_end = __rdtsc(); -#endif - K_DIAG( 3, ( "__kmpc_end_serialized_parallel: T#%d frame_begin = %llu, frame_end = %llu\n", - global_tid, this_thr->th.th_frame_time, fr_end ) ); - - __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n", - str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time_serialized, fr_end ); - __kmp_str_loc_free( &str_loc ); - } + __kmp_itt_frame_submit( global_tid, this_thr->th.th_frame_time_serialized, __itt_timestamp_none, 0, loc ); } } #endif /* USE_ITT_BUILD */ @@ -858,13 +828,15 @@ __kmpc_flush(ident_t *loc, ...) if ( ! __kmp_cpuinfo.sse2 ) { // CPU cannot execute SSE2 instructions. } else { - #if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) - __sync_synchronize(); - #else + #if KMP_COMPILER_ICC _mm_mfence(); - #endif // __GNUC__ + #else + __sync_synchronize(); + #endif // KMP_COMPILER_ICC }; // if #endif // KMP_MIC + #elif KMP_ARCH_ARM + // Nothing yet #else #error Unknown or unsupported architecture #endif @@ -1110,7 +1082,7 @@ __kmpc_critical( ident_t * loc, kmp_int32 global_tid, kmp_critical_name * crit ) && ( sizeof( lck->tas.lk.poll ) <= OMP_CRITICAL_SIZE ) ) { lck = (kmp_user_lock_p)crit; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_CRITICAL_SIZE ) ) { lck = (kmp_user_lock_p)crit; @@ -1163,7 +1135,7 @@ __kmpc_end_critical(ident_t *loc, kmp_int32 global_tid, kmp_critical_name *crit) && ( sizeof( lck->tas.lk.poll ) <= OMP_CRITICAL_SIZE ) ) { lck = (kmp_user_lock_p)crit; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_CRITICAL_SIZE ) ) { lck = (kmp_user_lock_p)crit; @@ -1598,14 +1570,14 @@ __kmpc_init_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } #endif else { - lck = __kmp_user_lock_allocate( user_lock, gtid ); + lck = __kmp_user_lock_allocate( user_lock, gtid, 0 ); } INIT_LOCK( lck ); __kmp_set_user_lock_location( lck, loc ); @@ -1634,7 +1606,7 @@ __kmpc_init_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { @@ -1642,7 +1614,7 @@ __kmpc_init_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { } #endif else { - lck = __kmp_user_lock_allocate( user_lock, gtid ); + lck = __kmp_user_lock_allocate( user_lock, gtid, 0 ); } INIT_NESTED_LOCK( lck ); @@ -1662,7 +1634,7 @@ __kmpc_destroy_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; @@ -1681,7 +1653,7 @@ __kmpc_destroy_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { ; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { ; @@ -1702,7 +1674,7 @@ __kmpc_destroy_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { @@ -1723,7 +1695,7 @@ __kmpc_destroy_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { ; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { @@ -1743,7 +1715,7 @@ __kmpc_set_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; @@ -1773,7 +1745,7 @@ __kmpc_set_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) { + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { @@ -1805,7 +1777,7 @@ __kmpc_unset_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) if ( ( __kmp_user_lock_kind == lk_tas ) && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) // "fast" path implemented to fix customer performance issue #if USE_ITT_BUILD __kmp_itt_lock_releasing( (kmp_user_lock_p)user_lock ); @@ -1817,7 +1789,7 @@ __kmpc_unset_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) lck = (kmp_user_lock_p)user_lock; #endif } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; @@ -1844,7 +1816,7 @@ __kmpc_unset_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) if ( ( __kmp_user_lock_kind == lk_tas ) && ( sizeof( lck->tas.lk.poll ) + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) // "fast" path implemented to fix customer performance issue kmp_tas_lock_t *tl = (kmp_tas_lock_t*)user_lock; #if USE_ITT_BUILD @@ -1859,7 +1831,7 @@ __kmpc_unset_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) lck = (kmp_user_lock_p)user_lock; #endif } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { @@ -1888,7 +1860,7 @@ __kmpc_test_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) && ( sizeof( lck->tas.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) <= OMP_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; @@ -1926,7 +1898,7 @@ __kmpc_test_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock ) + sizeof( lck->tas.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { lck = (kmp_user_lock_p)user_lock; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( ( __kmp_user_lock_kind == lk_futex ) && ( sizeof( lck->futex.lk.poll ) + sizeof( lck->futex.lk.depth_locked ) <= OMP_NEST_LOCK_T_SIZE ) ) { diff --git a/openmp/runtime/src/kmp_dispatch.cpp b/openmp/runtime/src/kmp_dispatch.cpp index 1128b871d58..cb5bdac532a 100644 --- a/openmp/runtime/src/kmp_dispatch.cpp +++ b/openmp/runtime/src/kmp_dispatch.cpp @@ -1,7 +1,7 @@ /* * kmp_dispatch.cpp: dynamic scheduling - iteration initialization and dispatch. - * $Revision: 42624 $ - * $Date: 2013-08-27 10:53:11 -0500 (Tue, 27 Aug 2013) $ + * $Revision: 42674 $ + * $Date: 2013-09-18 11:12:49 -0500 (Wed, 18 Sep 2013) $ */ @@ -916,7 +916,8 @@ __kmp_dispatch_init( */ // save original FPCW and set precision to 64-bit, as // Windows* OS on IA-32 architecture defaults to 53-bit - unsigned int oldFpcw = _control87(0,0x30000); + unsigned int oldFpcw = _control87(0,0); + _control87(_PC_64,_MCW_PC); // 0,0x30000 #endif /* value used for comparison in solver for cross-over point */ long double target = ((long double)chunk * 2 + 1) * nproc / tc; @@ -995,7 +996,7 @@ __kmp_dispatch_init( pr->u.p.count = tc - __kmp_dispatch_guided_remaining(tc, GUIDED_ANALYTICAL_WORKAROUND, cross) - cross * chunk; #if KMP_OS_WINDOWS && KMP_ARCH_X86 // restore FPCW - _control87(oldFpcw,0x30000); + _control87(oldFpcw,_MCW_PC); #endif } // if } else { @@ -1836,7 +1837,7 @@ __kmp_dispatch_next( /* for storing original FPCW value for Windows* OS on IA-32 architecture 8-byte version */ unsigned int oldFpcw; - int fpcwSet = 0; + unsigned int fpcwSet = 0; #endif KD_TRACE(100, ("__kmp_dispatch_next: T#%d kmp_sch_guided_chunked analytical case\n", gtid ) ); @@ -1870,7 +1871,8 @@ __kmp_dispatch_next( FPCW and set precision to 64-bit, as Windows* OS on IA-32 architecture defaults to 53-bit */ if ( !fpcwSet ) { - oldFpcw = _control87(0,0x30000); + oldFpcw = _control87(0,0); + _control87(_PC_64,_MCW_PC); fpcwSet = 0x30000; } #endif @@ -1893,9 +1895,11 @@ __kmp_dispatch_next( } // if } // while (1) #if KMP_OS_WINDOWS && KMP_ARCH_X86 - /* restore FPCW if necessary */ - if ( oldFpcw & fpcwSet != 0 ) - _control87(oldFpcw,0x30000); + /* restore FPCW if necessary + AC: check fpcwSet flag first because oldFpcw can be uninitialized here + */ + if ( fpcwSet && ( oldFpcw & fpcwSet ) ) + _control87(oldFpcw,_MCW_PC); #endif if ( status != 0 ) { start = pr->u.p.lb; diff --git a/openmp/runtime/src/kmp_ftn_cdecl.c b/openmp/runtime/src/kmp_ftn_cdecl.c index 7079ee9b539..135a7cb7eb3 100644 --- a/openmp/runtime/src/kmp_ftn_cdecl.c +++ b/openmp/runtime/src/kmp_ftn_cdecl.c @@ -1,7 +1,7 @@ /* * kmp_ftn_cdecl.c -- Fortran __cdecl linkage support for OpenMP. - * $Revision: 42061 $ - * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $ + * $Revision: 42757 $ + * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $ */ @@ -17,21 +17,21 @@ #include "kmp.h" +#if KMP_OS_WINDOWS +# if defined KMP_WIN_CDECL || !defined GUIDEDLL_EXPORTS +# define KMP_FTN_ENTRIES KMP_FTN_UPPER +# endif +#elif KMP_OS_UNIX +# define KMP_FTN_ENTRIES KMP_FTN_PLAIN +#endif + // Note: This string is not printed when KMP_VERSION=1. char const __kmp_version_ftncdecl[] = KMP_VERSION_PREFIX "Fortran __cdecl OMP support: " -#ifdef USE_FTN_CDECL +#ifdef KMP_FTN_ENTRIES "yes"; +# define FTN_STDCALL /* no stdcall */ +# include "kmp_ftn_os.h" +# include "kmp_ftn_entry.h" #else "no"; -#endif - -#ifdef USE_FTN_CDECL - -#define FTN_STDCALL /* no stdcall */ -#define KMP_FTN_ENTRIES USE_FTN_CDECL - -#include "kmp_ftn_os.h" -#include "kmp_ftn_entry.h" - -#endif /* USE_FTN_CDECL */ - +#endif /* KMP_FTN_ENTRIES */ diff --git a/openmp/runtime/src/kmp_ftn_entry.h b/openmp/runtime/src/kmp_ftn_entry.h index f2c6440e988..dbbca19ac35 100644 --- a/openmp/runtime/src/kmp_ftn_entry.h +++ b/openmp/runtime/src/kmp_ftn_entry.h @@ -1,7 +1,7 @@ /* * kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP. - * $Revision: 42507 $ - * $Date: 2013-07-11 07:55:25 -0500 (Thu, 11 Jul 2013) $ + * $Revision: 42798 $ + * $Date: 2013-10-30 16:39:54 -0500 (Wed, 30 Oct 2013) $ */ @@ -356,7 +356,7 @@ FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask ) /* sets the requested number of threads for the next parallel region */ void FTN_STDCALL -FTN_SET_NUM_THREADS( int KMP_DEREF arg ) +xexpand(FTN_SET_NUM_THREADS)( int KMP_DEREF arg ) { #ifdef KMP_STUB // Nothing. @@ -368,7 +368,7 @@ FTN_SET_NUM_THREADS( int KMP_DEREF arg ) /* returns the number of threads in current team */ int FTN_STDCALL -FTN_GET_NUM_THREADS( void ) +xexpand(FTN_GET_NUM_THREADS)( void ) { #ifdef KMP_STUB return 1; @@ -379,7 +379,7 @@ FTN_GET_NUM_THREADS( void ) } int FTN_STDCALL -FTN_GET_MAX_THREADS( void ) +xexpand(FTN_GET_MAX_THREADS)( void ) { #ifdef KMP_STUB return 1; @@ -401,7 +401,7 @@ FTN_GET_MAX_THREADS( void ) } int FTN_STDCALL -FTN_GET_THREAD_NUM( void ) +xexpand(FTN_GET_THREAD_NUM)( void ) { #ifdef KMP_STUB return 0; @@ -458,7 +458,7 @@ FTN_GET_NUM_KNOWN_THREADS( void ) } int FTN_STDCALL -FTN_GET_NUM_PROCS( void ) +xexpand(FTN_GET_NUM_PROCS)( void ) { #ifdef KMP_STUB return 1; @@ -472,7 +472,7 @@ FTN_GET_NUM_PROCS( void ) } void FTN_STDCALL -FTN_SET_NESTED( int KMP_DEREF flag ) +xexpand(FTN_SET_NESTED)( int KMP_DEREF flag ) { #ifdef KMP_STUB __kmps_set_nested( KMP_DEREF flag ); @@ -487,7 +487,7 @@ FTN_SET_NESTED( int KMP_DEREF flag ) int FTN_STDCALL -FTN_GET_NESTED( void ) +xexpand(FTN_GET_NESTED)( void ) { #ifdef KMP_STUB return __kmps_get_nested(); @@ -499,7 +499,7 @@ FTN_GET_NESTED( void ) } void FTN_STDCALL -FTN_SET_DYNAMIC( int KMP_DEREF flag ) +xexpand(FTN_SET_DYNAMIC)( int KMP_DEREF flag ) { #ifdef KMP_STUB __kmps_set_dynamic( KMP_DEREF flag ? TRUE : FALSE ); @@ -515,7 +515,7 @@ FTN_SET_DYNAMIC( int KMP_DEREF flag ) int FTN_STDCALL -FTN_GET_DYNAMIC( void ) +xexpand(FTN_GET_DYNAMIC)( void ) { #ifdef KMP_STUB return __kmps_get_dynamic(); @@ -527,7 +527,7 @@ FTN_GET_DYNAMIC( void ) } int FTN_STDCALL -FTN_IN_PARALLEL( void ) +xexpand(FTN_IN_PARALLEL)( void ) { #ifdef KMP_STUB return 0; @@ -550,7 +550,7 @@ FTN_IN_PARALLEL( void ) #if OMP_30_ENABLED void FTN_STDCALL -FTN_SET_SCHEDULE( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier ) +xexpand(FTN_SET_SCHEDULE)( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier ) { #ifdef KMP_STUB __kmps_set_schedule( KMP_DEREF kind, KMP_DEREF modifier ); @@ -562,7 +562,7 @@ FTN_SET_SCHEDULE( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier ) } void FTN_STDCALL -FTN_GET_SCHEDULE( kmp_sched_t * kind, int * modifier ) +xexpand(FTN_GET_SCHEDULE)( kmp_sched_t * kind, int * modifier ) { #ifdef KMP_STUB __kmps_get_schedule( kind, modifier ); @@ -574,7 +574,7 @@ FTN_GET_SCHEDULE( kmp_sched_t * kind, int * modifier ) } void FTN_STDCALL -FTN_SET_MAX_ACTIVE_LEVELS( int KMP_DEREF arg ) +xexpand(FTN_SET_MAX_ACTIVE_LEVELS)( int KMP_DEREF arg ) { #ifdef KMP_STUB // Nothing. @@ -586,7 +586,7 @@ FTN_SET_MAX_ACTIVE_LEVELS( int KMP_DEREF arg ) } int FTN_STDCALL -FTN_GET_MAX_ACTIVE_LEVELS( void ) +xexpand(FTN_GET_MAX_ACTIVE_LEVELS)( void ) { #ifdef KMP_STUB return 0; @@ -598,7 +598,7 @@ FTN_GET_MAX_ACTIVE_LEVELS( void ) } int FTN_STDCALL -FTN_GET_ACTIVE_LEVEL( void ) +xexpand(FTN_GET_ACTIVE_LEVEL)( void ) { #ifdef KMP_STUB return 0; // returns 0 if it is called from the sequential part of the program @@ -610,7 +610,7 @@ FTN_GET_ACTIVE_LEVEL( void ) } int FTN_STDCALL -FTN_GET_LEVEL( void ) +xexpand(FTN_GET_LEVEL)( void ) { #ifdef KMP_STUB return 0; // returns 0 if it is called from the sequential part of the program @@ -622,7 +622,7 @@ FTN_GET_LEVEL( void ) } int FTN_STDCALL -FTN_GET_ANCESTOR_THREAD_NUM( int KMP_DEREF level ) +xexpand(FTN_GET_ANCESTOR_THREAD_NUM)( int KMP_DEREF level ) { #ifdef KMP_STUB return ( KMP_DEREF level ) ? ( -1 ) : ( 0 ); @@ -632,7 +632,7 @@ FTN_GET_ANCESTOR_THREAD_NUM( int KMP_DEREF level ) } int FTN_STDCALL -FTN_GET_TEAM_SIZE( int KMP_DEREF level ) +xexpand(FTN_GET_TEAM_SIZE)( int KMP_DEREF level ) { #ifdef KMP_STUB return ( KMP_DEREF level ) ? ( -1 ) : ( 1 ); @@ -642,7 +642,7 @@ FTN_GET_TEAM_SIZE( int KMP_DEREF level ) } int FTN_STDCALL -FTN_GET_THREAD_LIMIT( void ) +xexpand(FTN_GET_THREAD_LIMIT)( void ) { #ifdef KMP_STUB return 1; // TO DO: clarify whether it returns 1 or 0? @@ -656,7 +656,7 @@ FTN_GET_THREAD_LIMIT( void ) } int FTN_STDCALL -FTN_IN_FINAL( void ) +xexpand(FTN_IN_FINAL)( void ) { #ifdef KMP_STUB return 0; // TO DO: clarify whether it returns 1 or 0? @@ -674,7 +674,7 @@ FTN_IN_FINAL( void ) kmp_proc_bind_t FTN_STDCALL -FTN_GET_PROC_BIND( void ) +xexpand(FTN_GET_PROC_BIND)( void ) { #ifdef KMP_STUB return __kmps_get_proc_bind(); @@ -684,7 +684,7 @@ FTN_GET_PROC_BIND( void ) } int FTN_STDCALL -FTN_GET_NUM_TEAMS( void ) +xexpand(FTN_GET_NUM_TEAMS)( void ) { #ifdef KMP_STUB return 1; @@ -723,7 +723,7 @@ FTN_GET_NUM_TEAMS( void ) } int FTN_STDCALL -FTN_GET_TEAM_NUM( void ) +xexpand(FTN_GET_TEAM_NUM)( void ) { #ifdef KMP_STUB return 0; @@ -793,7 +793,7 @@ typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t; /* initialize the lock */ void FTN_STDCALL -FTN_INIT_LOCK( void **user_lock ) +xexpand(FTN_INIT_LOCK)( void **user_lock ) { #ifdef KMP_STUB *((kmp_stub_lock_t *)user_lock) = UNLOCKED; @@ -804,7 +804,7 @@ FTN_INIT_LOCK( void **user_lock ) /* initialize the lock */ void FTN_STDCALL -FTN_INIT_NEST_LOCK( void **user_lock ) +xexpand(FTN_INIT_NEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB *((kmp_stub_lock_t *)user_lock) = UNLOCKED; @@ -814,7 +814,7 @@ FTN_INIT_NEST_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_DESTROY_LOCK( void **user_lock ) +xexpand(FTN_DESTROY_LOCK)( void **user_lock ) { #ifdef KMP_STUB *((kmp_stub_lock_t *)user_lock) = UNINIT; @@ -824,7 +824,7 @@ FTN_DESTROY_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_DESTROY_NEST_LOCK( void **user_lock ) +xexpand(FTN_DESTROY_NEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB *((kmp_stub_lock_t *)user_lock) = UNINIT; @@ -834,7 +834,7 @@ FTN_DESTROY_NEST_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_SET_LOCK( void **user_lock ) +xexpand(FTN_SET_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -850,7 +850,7 @@ FTN_SET_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_SET_NEST_LOCK( void **user_lock ) +xexpand(FTN_SET_NEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -863,7 +863,7 @@ FTN_SET_NEST_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_UNSET_LOCK( void **user_lock ) +xexpand(FTN_UNSET_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -879,7 +879,7 @@ FTN_UNSET_LOCK( void **user_lock ) } void FTN_STDCALL -FTN_UNSET_NEST_LOCK( void **user_lock ) +xexpand(FTN_UNSET_NEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -895,7 +895,7 @@ FTN_UNSET_NEST_LOCK( void **user_lock ) } int FTN_STDCALL -FTN_TEST_LOCK( void **user_lock ) +xexpand(FTN_TEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -912,7 +912,7 @@ FTN_TEST_LOCK( void **user_lock ) } int FTN_STDCALL -FTN_TEST_NEST_LOCK( void **user_lock ) +xexpand(FTN_TEST_NEST_LOCK)( void **user_lock ) { #ifdef KMP_STUB if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) { @@ -925,7 +925,7 @@ FTN_TEST_NEST_LOCK( void **user_lock ) } double FTN_STDCALL -FTN_GET_WTIME( void ) +xexpand(FTN_GET_WTIME)( void ) { #ifdef KMP_STUB return __kmps_get_wtime(); @@ -944,7 +944,7 @@ FTN_GET_WTIME( void ) } double FTN_STDCALL -FTN_GET_WTICK( void ) +xexpand(FTN_GET_WTICK)( void ) { #ifdef KMP_STUB return __kmps_get_wtick(); @@ -1022,6 +1022,191 @@ FTN_SET_DEFAULTS( char const * str /* ------------------------------------------------------------------------ */ +#if OMP_40_ENABLED +/* returns the status of cancellation */ +int FTN_STDCALL +xexpand(FTN_GET_CANCELLATION)(void) { +#ifdef KMP_STUB + return 0 /* false */; +#else + // initialize the library if needed + if ( ! __kmp_init_serial ) { + __kmp_serial_initialize(); + } + return __kmp_omp_cancellation; +#endif +} + +int FTN_STDCALL +FTN_GET_CANCELLATION_STATUS(int cancel_kind) { +#ifdef KMP_STUB + return 0 /* false */; +#else + return __kmp_get_cancellation_status(cancel_kind); +#endif +} + +#endif // OMP_40_ENABLED + +// GCC compatibility (versioned symbols) +#if KMP_OS_LINUX + +/* + These following sections create function aliases (dummy symbols) for the omp_* routines. + These aliases will then be versioned according to how libgomp ``versions'' its + symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the + default version which libiomp5 uses: VERSION (defined in exports_so.txt) + If you want to see the versioned symbols for libgomp.so.1 then just type: + + objdump -T /path/to/libgomp.so.1 | grep omp_ + + Example: + Step 1) Create __kmp_api_omp_set_num_threads_10_alias + which is alias of __kmp_api_omp_set_num_threads + Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version: omp_set_num_threads@OMP_1.0 + Step 2B) Set __kmp_api_omp_set_num_threads to default version : omp_set_num_threads@@VERSION +*/ + +// OMP_1.0 aliases +xaliasify(FTN_SET_NUM_THREADS, 10); +xaliasify(FTN_GET_NUM_THREADS, 10); +xaliasify(FTN_GET_MAX_THREADS, 10); +xaliasify(FTN_GET_THREAD_NUM, 10); +xaliasify(FTN_GET_NUM_PROCS, 10); +xaliasify(FTN_IN_PARALLEL, 10); +xaliasify(FTN_SET_DYNAMIC, 10); +xaliasify(FTN_GET_DYNAMIC, 10); +xaliasify(FTN_SET_NESTED, 10); +xaliasify(FTN_GET_NESTED, 10); +xaliasify(FTN_INIT_LOCK, 10); +xaliasify(FTN_INIT_NEST_LOCK, 10); +xaliasify(FTN_DESTROY_LOCK, 10); +xaliasify(FTN_DESTROY_NEST_LOCK, 10); +xaliasify(FTN_SET_LOCK, 10); +xaliasify(FTN_SET_NEST_LOCK, 10); +xaliasify(FTN_UNSET_LOCK, 10); +xaliasify(FTN_UNSET_NEST_LOCK, 10); +xaliasify(FTN_TEST_LOCK, 10); +xaliasify(FTN_TEST_NEST_LOCK, 10); + +// OMP_2.0 aliases +xaliasify(FTN_GET_WTICK, 20); +xaliasify(FTN_GET_WTIME, 20); + +#if OMP_30_ENABLED +// OMP_3.0 aliases +xaliasify(FTN_SET_SCHEDULE, 30); +xaliasify(FTN_GET_SCHEDULE, 30); +xaliasify(FTN_GET_THREAD_LIMIT, 30); +xaliasify(FTN_SET_MAX_ACTIVE_LEVELS, 30); +xaliasify(FTN_GET_MAX_ACTIVE_LEVELS, 30); +xaliasify(FTN_GET_LEVEL, 30); +xaliasify(FTN_GET_ANCESTOR_THREAD_NUM, 30); +xaliasify(FTN_GET_TEAM_SIZE, 30); +xaliasify(FTN_GET_ACTIVE_LEVEL, 30); +xaliasify(FTN_INIT_LOCK, 30); +xaliasify(FTN_INIT_NEST_LOCK, 30); +xaliasify(FTN_DESTROY_LOCK, 30); +xaliasify(FTN_DESTROY_NEST_LOCK, 30); +xaliasify(FTN_SET_LOCK, 30); +xaliasify(FTN_SET_NEST_LOCK, 30); +xaliasify(FTN_UNSET_LOCK, 30); +xaliasify(FTN_UNSET_NEST_LOCK, 30); +xaliasify(FTN_TEST_LOCK, 30); +xaliasify(FTN_TEST_NEST_LOCK, 30); + +// OMP_3.1 aliases +xaliasify(FTN_IN_FINAL, 31); +#endif /* OMP_30_ENABLED */ + +#if OMP_40_ENABLED +// OMP_4.0 aliases +xaliasify(FTN_GET_PROC_BIND, 40); +xaliasify(FTN_GET_NUM_TEAMS, 40); +xaliasify(FTN_GET_TEAM_NUM, 40); +xaliasify(FTN_GET_CANCELLATION, 40); +#endif /* OMP_40_ENABLED */ + +#if OMP_41_ENABLED +// OMP_4.1 aliases +#endif + +#if OMP_50_ENABLED +// OMP_5.0 aliases +#endif + +// OMP_1.0 versioned symbols +xversionify(FTN_SET_NUM_THREADS, 10, "OMP_1.0"); +xversionify(FTN_GET_NUM_THREADS, 10, "OMP_1.0"); +xversionify(FTN_GET_MAX_THREADS, 10, "OMP_1.0"); +xversionify(FTN_GET_THREAD_NUM, 10, "OMP_1.0"); +xversionify(FTN_GET_NUM_PROCS, 10, "OMP_1.0"); +xversionify(FTN_IN_PARALLEL, 10, "OMP_1.0"); +xversionify(FTN_SET_DYNAMIC, 10, "OMP_1.0"); +xversionify(FTN_GET_DYNAMIC, 10, "OMP_1.0"); +xversionify(FTN_SET_NESTED, 10, "OMP_1.0"); +xversionify(FTN_GET_NESTED, 10, "OMP_1.0"); +xversionify(FTN_INIT_LOCK, 10, "OMP_1.0"); +xversionify(FTN_INIT_NEST_LOCK, 10, "OMP_1.0"); +xversionify(FTN_DESTROY_LOCK, 10, "OMP_1.0"); +xversionify(FTN_DESTROY_NEST_LOCK, 10, "OMP_1.0"); +xversionify(FTN_SET_LOCK, 10, "OMP_1.0"); +xversionify(FTN_SET_NEST_LOCK, 10, "OMP_1.0"); +xversionify(FTN_UNSET_LOCK, 10, "OMP_1.0"); +xversionify(FTN_UNSET_NEST_LOCK, 10, "OMP_1.0"); +xversionify(FTN_TEST_LOCK, 10, "OMP_1.0"); +xversionify(FTN_TEST_NEST_LOCK, 10, "OMP_1.0"); + +// OMP_2.0 versioned symbols +xversionify(FTN_GET_WTICK, 20, "OMP_2.0"); +xversionify(FTN_GET_WTIME, 20, "OMP_2.0"); + +#if OMP_30_ENABLED +// OMP_3.0 versioned symbols +xversionify(FTN_SET_SCHEDULE, 30, "OMP_3.0"); +xversionify(FTN_GET_SCHEDULE, 30, "OMP_3.0"); +xversionify(FTN_GET_THREAD_LIMIT, 30, "OMP_3.0"); +xversionify(FTN_SET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0"); +xversionify(FTN_GET_MAX_ACTIVE_LEVELS, 30, "OMP_3.0"); +xversionify(FTN_GET_ANCESTOR_THREAD_NUM, 30, "OMP_3.0"); +xversionify(FTN_GET_LEVEL, 30, "OMP_3.0"); +xversionify(FTN_GET_TEAM_SIZE, 30, "OMP_3.0"); +xversionify(FTN_GET_ACTIVE_LEVEL, 30, "OMP_3.0"); + +// the lock routines have a 1.0 and 3.0 version +xversionify(FTN_INIT_LOCK, 30, "OMP_3.0"); +xversionify(FTN_INIT_NEST_LOCK, 30, "OMP_3.0"); +xversionify(FTN_DESTROY_LOCK, 30, "OMP_3.0"); +xversionify(FTN_DESTROY_NEST_LOCK, 30, "OMP_3.0"); +xversionify(FTN_SET_LOCK, 30, "OMP_3.0"); +xversionify(FTN_SET_NEST_LOCK, 30, "OMP_3.0"); +xversionify(FTN_UNSET_LOCK, 30, "OMP_3.0"); +xversionify(FTN_UNSET_NEST_LOCK, 30, "OMP_3.0"); +xversionify(FTN_TEST_LOCK, 30, "OMP_3.0"); +xversionify(FTN_TEST_NEST_LOCK, 30, "OMP_3.0"); + +// OMP_3.1 versioned symbol +xversionify(FTN_IN_FINAL, 31, "OMP_3.1"); +#endif /* OMP_30_ENABLED */ + +#if OMP_40_ENABLED +// OMP_4.0 versioned symbols +xversionify(FTN_GET_PROC_BIND, 40, "OMP_4.0"); +xversionify(FTN_GET_NUM_TEAMS, 40, "OMP_4.0"); +xversionify(FTN_GET_TEAM_NUM, 40, "OMP_4.0"); +xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0"); +#endif /* OMP_40_ENABLED */ + +#if OMP_41_ENABLED +// OMP_4.1 versioned symbols +#endif + +#if OMP_50_ENABLED +// OMP_5.0 versioned symbols +#endif + +#endif /* KMP_OS_LINUX */ + #ifdef __cplusplus } //extern "C" #endif // __cplusplus diff --git a/openmp/runtime/src/kmp_ftn_extra.c b/openmp/runtime/src/kmp_ftn_extra.c index 6e1bb7eac03..6777e01ba98 100644 --- a/openmp/runtime/src/kmp_ftn_extra.c +++ b/openmp/runtime/src/kmp_ftn_extra.c @@ -1,7 +1,7 @@ /* * kmp_ftn_extra.c -- Fortran 'extra' linkage support for OpenMP. - * $Revision: 42061 $ - * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $ + * $Revision: 42757 $ + * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $ */ @@ -17,21 +17,19 @@ #include "kmp.h" +#if KMP_OS_WINDOWS +# define KMP_FTN_ENTRIES KMP_FTN_PLAIN +#elif KMP_OS_UNIX +# define KMP_FTN_ENTRIES KMP_FTN_APPEND +#endif + // Note: This string is not printed when KMP_VERSION=1. char const __kmp_version_ftnextra[] = KMP_VERSION_PREFIX "Fortran \"extra\" OMP support: " -#ifdef USE_FTN_EXTRA +#ifdef KMP_FTN_ENTRIES "yes"; +# define FTN_STDCALL /* nothing to do */ +# include "kmp_ftn_os.h" +# include "kmp_ftn_entry.h" #else "no"; -#endif - -#ifdef USE_FTN_EXTRA - -#define FTN_STDCALL /* nothing to do */ -#define KMP_FTN_ENTRIES USE_FTN_EXTRA - -#include "kmp_ftn_os.h" -#include "kmp_ftn_entry.h" - -#endif /* USE_FTN_EXTRA */ - +#endif /* KMP_FTN_ENTRIES */ diff --git a/openmp/runtime/src/kmp_ftn_os.h b/openmp/runtime/src/kmp_ftn_os.h index c52ca1e0a79..f241751c7e9 100644 --- a/openmp/runtime/src/kmp_ftn_os.h +++ b/openmp/runtime/src/kmp_ftn_os.h @@ -1,7 +1,7 @@ /* * kmp_ftn_os.h -- KPTS Fortran defines header file. - * $Revision: 42478 $ - * $Date: 2013-07-02 15:15:08 -0500 (Tue, 02 Jul 2013) $ + * $Revision: 42745 $ + * $Date: 2013-10-14 17:02:04 -0500 (Mon, 14 Oct 2013) $ */ @@ -105,6 +105,11 @@ #endif #endif +#if OMP_40_ENABLED + #define FTN_GET_CANCELLATION omp_get_cancellation + #define FTN_GET_CANCELLATION_STATUS kmp_get_cancellation_status +#endif + #endif /* KMP_FTN_PLAIN */ /* ------------------------------------------------------------------------ */ @@ -192,6 +197,11 @@ #endif +#if OMP_40_ENABLED + #define FTN_GET_CANCELLATION omp_get_cancellation_ + #define FTN_GET_CANCELLATION_STATUS kmp_get_cancellation_status_ +#endif + #endif /* KMP_FTN_APPEND */ /* ------------------------------------------------------------------------ */ @@ -279,6 +289,11 @@ #endif +#if OMP_40_ENABLED + #define FTN_GET_CANCELLATION OMP_GET_CANCELLATION + #define FTN_GET_CANCELLATION_STATUS KMP_GET_CANCELLATION_STATUS +#endif + #endif /* KMP_FTN_UPPER */ /* ------------------------------------------------------------------------ */ @@ -366,7 +381,134 @@ #endif +#if OMP_40_ENABLED + #define FTN_GET_CANCELLATION OMP_GET_CANCELLATION_ + #define FTN_GET_CANCELLATION_STATUS KMP_GET_CANCELLATION_STATUS_ +#endif + #endif /* KMP_FTN_UAPPEND */ +/* ------------------------------------------------------------------ */ +/* -------------------------- GOMP API NAMES ------------------------ */ +// All GOMP_1.0 symbols +#define KMP_API_NAME_GOMP_ATOMIC_END GOMP_atomic_end +#define KMP_API_NAME_GOMP_ATOMIC_START GOMP_atomic_start +#define KMP_API_NAME_GOMP_BARRIER GOMP_barrier +#define KMP_API_NAME_GOMP_CRITICAL_END GOMP_critical_end +#define KMP_API_NAME_GOMP_CRITICAL_NAME_END GOMP_critical_name_end +#define KMP_API_NAME_GOMP_CRITICAL_NAME_START GOMP_critical_name_start +#define KMP_API_NAME_GOMP_CRITICAL_START GOMP_critical_start +#define KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT GOMP_loop_dynamic_next +#define KMP_API_NAME_GOMP_LOOP_DYNAMIC_START GOMP_loop_dynamic_start +#define KMP_API_NAME_GOMP_LOOP_END GOMP_loop_end +#define KMP_API_NAME_GOMP_LOOP_END_NOWAIT GOMP_loop_end_nowait +#define KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT GOMP_loop_guided_next +#define KMP_API_NAME_GOMP_LOOP_GUIDED_START GOMP_loop_guided_start +#define KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT GOMP_loop_ordered_dynamic_next +#define KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START GOMP_loop_ordered_dynamic_start +#define KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT GOMP_loop_ordered_guided_next +#define KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START GOMP_loop_ordered_guided_start +#define KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT GOMP_loop_ordered_runtime_next +#define KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START GOMP_loop_ordered_runtime_start +#define KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT GOMP_loop_ordered_static_next +#define KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START GOMP_loop_ordered_static_start +#define KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT GOMP_loop_runtime_next +#define KMP_API_NAME_GOMP_LOOP_RUNTIME_START GOMP_loop_runtime_start +#define KMP_API_NAME_GOMP_LOOP_STATIC_NEXT GOMP_loop_static_next +#define KMP_API_NAME_GOMP_LOOP_STATIC_START GOMP_loop_static_start +#define KMP_API_NAME_GOMP_ORDERED_END GOMP_ordered_end +#define KMP_API_NAME_GOMP_ORDERED_START GOMP_ordered_start +#define KMP_API_NAME_GOMP_PARALLEL_END GOMP_parallel_end +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START GOMP_parallel_loop_dynamic_start +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START GOMP_parallel_loop_guided_start +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START GOMP_parallel_loop_runtime_start +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START GOMP_parallel_loop_static_start +#define KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START GOMP_parallel_sections_start +#define KMP_API_NAME_GOMP_PARALLEL_START GOMP_parallel_start +#define KMP_API_NAME_GOMP_SECTIONS_END GOMP_sections_end +#define KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT GOMP_sections_end_nowait +#define KMP_API_NAME_GOMP_SECTIONS_NEXT GOMP_sections_next +#define KMP_API_NAME_GOMP_SECTIONS_START GOMP_sections_start +#define KMP_API_NAME_GOMP_SINGLE_COPY_END GOMP_single_copy_end +#define KMP_API_NAME_GOMP_SINGLE_COPY_START GOMP_single_copy_start +#define KMP_API_NAME_GOMP_SINGLE_START GOMP_single_start + +// All GOMP_2.0 symbols +#define KMP_API_NAME_GOMP_TASK GOMP_task +#define KMP_API_NAME_GOMP_TASKWAIT GOMP_taskwait +#define KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT GOMP_loop_ull_dynamic_next +#define KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START GOMP_loop_ull_dynamic_start +#define KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT GOMP_loop_ull_guided_next +#define KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START GOMP_loop_ull_guided_start +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT GOMP_loop_ull_ordered_dynamic_next +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START GOMP_loop_ull_ordered_dynamic_start +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT GOMP_loop_ull_ordered_guided_next +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START GOMP_loop_ull_ordered_guided_start +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT GOMP_loop_ull_ordered_runtime_next +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START GOMP_loop_ull_ordered_runtime_start +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT GOMP_loop_ull_ordered_static_next +#define KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START GOMP_loop_ull_ordered_static_start +#define KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT GOMP_loop_ull_runtime_next +#define KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START GOMP_loop_ull_runtime_start +#define KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT GOMP_loop_ull_static_next +#define KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START GOMP_loop_ull_static_start + +// All GOMP_3.0 symbols +#define KMP_API_NAME_GOMP_TASKYIELD GOMP_taskyield + +// All GOMP_4.0 symbols +// TODO: As of 2013-10-14, none of the GOMP_4.0 functions are implemented in libiomp5 +#define KMP_API_NAME_GOMP_BARRIER_CANCEL GOMP_barrier_cancel +#define KMP_API_NAME_GOMP_CANCEL GOMP_cancel +#define KMP_API_NAME_GOMP_CANCELLATION_POINT GOMP_cancellation_point +#define KMP_API_NAME_GOMP_LOOP_END_CANCEL GOMP_loop_end_cancel +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC GOMP_parallel_loop_dynamic +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED GOMP_parallel_loop_guided +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME GOMP_parallel_loop_runtime +#define KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC GOMP_parallel_loop_static +#define KMP_API_NAME_GOMP_PARALLEL_SECTIONS GOMP_parallel_sections +#define KMP_API_NAME_GOMP_PARALLEL GOMP_parallel +#define KMP_API_NAME_GOMP_SECTIONS_END_CANCEL GOMP_sections_end_cancel +#define KMP_API_NAME_GOMP_TASKGROUP_START GOMP_taskgroup_start +#define KMP_API_NAME_GOMP_TASKGROUP_END GOMP_taskgroup_end +/* Target functions should be taken care of by liboffload */ +//#define KMP_API_NAME_GOMP_TARGET GOMP_target +//#define KMP_API_NAME_GOMP_TARGET_DATA GOMP_target_data +//#define KMP_API_NAME_GOMP_TARGET_END_DATA GOMP_target_end_data +//#define KMP_API_NAME_GOMP_TARGET_UPDATE GOMP_target_update +#define KMP_API_NAME_GOMP_TEAMS GOMP_teams + +#if KMP_OS_LINUX + #define xstr(x) str(x) + #define str(x) #x + + // If Linux, xexpand prepends __kmp_api_ to the real API name + #define xexpand(api_name) expand(api_name) + #define expand(api_name) __kmp_api_##api_name + + #define xaliasify(api_name,ver) aliasify(api_name,ver) + #define aliasify(api_name,ver) __typeof__(__kmp_api_##api_name) __kmp_api_##api_name##_##ver##_alias __attribute__((alias(xstr(__kmp_api_##api_name)))) + + #define xversionify(api_name, version_num, version_str) versionify(api_name, version_num, version_str, "VERSION") + #define versionify(api_name, version_num, version_str, default_ver) \ + __asm__(".symver " xstr(__kmp_api_##api_name##_##version_num##_alias) "," xstr(api_name) "@" version_str "\n\t"); \ + __asm__(".symver " xstr(__kmp_api_##api_name) "," xstr(api_name) "@@" default_ver "\n\t") + +#else /* KMP_OS_LINUX */ + #define xstr(x) /* Nothing */ + #define str(x) /* Nothing */ + + // if Windows or Mac, xexpand does no name transformation + #define xexpand(api_name) expand(api_name) + #define expand(api_name) api_name + + #define xaliasify(api_name,ver) /* Nothing */ + #define aliasify(api_name,ver) /* Nothing */ + + #define xversionify(api_name, version_num, version_str) /* Nothing */ + #define versionify(api_name, version_num, version_str, default_ver) /* Nothing */ + +#endif /* KMP_OS_LINUX */ + #endif /* KMP_FTN_OS_H */ diff --git a/openmp/runtime/src/kmp_global.c b/openmp/runtime/src/kmp_global.c index db817648c86..b27b17164c3 100644 --- a/openmp/runtime/src/kmp_global.c +++ b/openmp/runtime/src/kmp_global.c @@ -1,7 +1,7 @@ /* * kmp_global.c -- KPTS global variables for runtime support library - * $Revision: 42642 $ - * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $ + * $Revision: 42816 $ + * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $ */ @@ -24,7 +24,6 @@ char __kmp_setversion_string[] = VERSION_STRING; kmp_key_t __kmp_gtid_threadprivate_key; kmp_cpuinfo_t __kmp_cpuinfo = { 0 }; // Not initialized -kmp_uint64 __kmp_cpu_frequency = 0; /* ----------------------------------------------------- */ @@ -181,6 +180,7 @@ char * __kmp_speculative_statsfile = "-"; #if OMP_40_ENABLED int __kmp_display_env = FALSE; int __kmp_display_env_verbose = FALSE; +int __kmp_omp_cancellation = FALSE; #endif /* map OMP 3.0 schedule types with our internal schedule types */ @@ -266,9 +266,6 @@ int __kmp_duplicate_library_ok = 0; #if USE_ITT_BUILD int __kmp_forkjoin_frames = 1; int __kmp_forkjoin_frames_mode = 0; -FILE * __kmp_itt_csv_file; -kmp_str_buf_t __kmp_itt_frame_buffer; - #endif PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method = reduction_method_not_defined; int __kmp_determ_red = FALSE; diff --git a/openmp/runtime/src/kmp_gsupport.c b/openmp/runtime/src/kmp_gsupport.c index 33e8fba5d66..9d8e5530cd3 100644 --- a/openmp/runtime/src/kmp_gsupport.c +++ b/openmp/runtime/src/kmp_gsupport.c @@ -1,7 +1,7 @@ /* * kmp_gsupport.c - * $Revision: 42181 $ - * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -28,9 +28,10 @@ #define MKLOC(loc,routine) \ static ident_t (loc) = {0, KMP_IDENT_KMPC, 0, 0, ";unknown;unknown;0;0;;" }; +#include "kmp_ftn_os.h" void -GOMP_barrier(void) +xexpand(KMP_API_NAME_GOMP_BARRIER)(void) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_barrier"); @@ -58,7 +59,7 @@ extern kmp_critical_name *__kmp_unnamed_critical_addr; void -GOMP_critical_start(void) +xexpand(KMP_API_NAME_GOMP_CRITICAL_START)(void) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_critical_start"); @@ -68,7 +69,7 @@ GOMP_critical_start(void) void -GOMP_critical_end(void) +xexpand(KMP_API_NAME_GOMP_CRITICAL_END)(void) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_critical_end"); @@ -78,7 +79,7 @@ GOMP_critical_end(void) void -GOMP_critical_name_start(void **pptr) +xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_START)(void **pptr) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_critical_name_start"); @@ -88,7 +89,7 @@ GOMP_critical_name_start(void **pptr) void -GOMP_critical_name_end(void **pptr) +xexpand(KMP_API_NAME_GOMP_CRITICAL_NAME_END)(void **pptr) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_critical_name_end"); @@ -104,7 +105,7 @@ GOMP_critical_name_end(void **pptr) // void -GOMP_atomic_start(void) +xexpand(KMP_API_NAME_GOMP_ATOMIC_START)(void) { int gtid = __kmp_entry_gtid(); KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid)); @@ -113,7 +114,7 @@ GOMP_atomic_start(void) void -GOMP_atomic_end(void) +xexpand(KMP_API_NAME_GOMP_ATOMIC_END)(void) { int gtid = __kmp_get_gtid(); KA_TRACE(20, ("GOMP_atomic_start: T#%d\n", gtid)); @@ -122,7 +123,7 @@ GOMP_atomic_end(void) int -GOMP_single_start(void) +xexpand(KMP_API_NAME_GOMP_SINGLE_START)(void) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_single_start"); @@ -141,7 +142,7 @@ GOMP_single_start(void) void * -GOMP_single_copy_start(void) +xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_START)(void) { void *retval; int gtid = __kmp_entry_gtid(); @@ -176,7 +177,7 @@ GOMP_single_copy_start(void) void -GOMP_single_copy_end(void *data) +xexpand(KMP_API_NAME_GOMP_SINGLE_COPY_END)(void *data) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_single_copy_end"); @@ -196,7 +197,7 @@ GOMP_single_copy_end(void *data) void -GOMP_ordered_start(void) +xexpand(KMP_API_NAME_GOMP_ORDERED_START)(void) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_ordered_start"); @@ -206,7 +207,7 @@ GOMP_ordered_start(void) void -GOMP_ordered_end(void) +xexpand(KMP_API_NAME_GOMP_ORDERED_END)(void) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_ordered_end"); @@ -223,7 +224,7 @@ GOMP_ordered_end(void) // (IA-32 architecture) or 64-bit signed (Intel(R) 64). // -#if KMP_ARCH_X86 +#if KMP_ARCH_X86 || KMP_ARCH_ARM # define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4 # define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4 # define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4 @@ -287,7 +288,7 @@ __kmp_GOMP_fork_call(ident_t *loc, int gtid, microtask_t wrapper, int argc,...) va_start(ap, argc); rc = __kmp_fork_call(loc, gtid, FALSE, argc, wrapper, __kmp_invoke_task_func, -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX &ap #else ap @@ -305,7 +306,7 @@ __kmp_GOMP_fork_call(ident_t *loc, int gtid, microtask_t wrapper, int argc,...) void -GOMP_parallel_start(void (*task)(void *), void *data, unsigned num_threads) +xexpand(KMP_API_NAME_GOMP_PARALLEL_START)(void (*task)(void *), void *data, unsigned num_threads) { int gtid = __kmp_entry_gtid(); MKLOC(loc, "GOMP_parallel_start"); @@ -325,7 +326,7 @@ GOMP_parallel_start(void (*task)(void *), void *data, unsigned num_threads) void -GOMP_parallel_end(void) +xexpand(KMP_API_NAME_GOMP_PARALLEL_END)(void) { int gtid = __kmp_get_gtid(); MKLOC(loc, "GOMP_parallel_end"); @@ -457,31 +458,31 @@ GOMP_parallel_end(void) } -LOOP_START(GOMP_loop_static_start, kmp_sch_static) -LOOP_NEXT(GOMP_loop_static_next, {}) -LOOP_START(GOMP_loop_dynamic_start, kmp_sch_dynamic_chunked) -LOOP_NEXT(GOMP_loop_dynamic_next, {}) -LOOP_START(GOMP_loop_guided_start, kmp_sch_guided_chunked) -LOOP_NEXT(GOMP_loop_guided_next, {}) -LOOP_RUNTIME_START(GOMP_loop_runtime_start, kmp_sch_runtime) -LOOP_NEXT(GOMP_loop_runtime_next, {}) +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_START), kmp_sch_static) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT), {}) +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START), kmp_sch_dynamic_chunked) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT), {}) +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_START), kmp_sch_guided_chunked) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT), {}) +LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_START), kmp_sch_runtime) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT), {}) -LOOP_START(GOMP_loop_ordered_static_start, kmp_ord_static) -LOOP_NEXT(GOMP_loop_ordered_static_next, \ +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START), kmp_ord_static) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT), \ { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); }) -LOOP_START(GOMP_loop_ordered_dynamic_start, kmp_ord_dynamic_chunked) -LOOP_NEXT(GOMP_loop_ordered_dynamic_next, \ +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START), kmp_ord_dynamic_chunked) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT), \ { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); }) -LOOP_START(GOMP_loop_ordered_guided_start, kmp_ord_guided_chunked) -LOOP_NEXT(GOMP_loop_ordered_guided_next, \ +LOOP_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START), kmp_ord_guided_chunked) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT), \ { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); }) -LOOP_RUNTIME_START(GOMP_loop_ordered_runtime_start, kmp_ord_runtime) -LOOP_NEXT(GOMP_loop_ordered_runtime_next, \ +LOOP_RUNTIME_START(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START), kmp_ord_runtime) +LOOP_NEXT(xexpand(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT), \ { KMP_DISPATCH_FINI_CHUNK(&loc, gtid); }) void -GOMP_loop_end(void) +xexpand(KMP_API_NAME_GOMP_LOOP_END)(void) { int gtid = __kmp_get_gtid(); KA_TRACE(20, ("GOMP_loop_end: T#%d\n", gtid)) @@ -493,7 +494,7 @@ GOMP_loop_end(void) void -GOMP_loop_end_nowait(void) +xexpand(KMP_API_NAME_GOMP_LOOP_END_NOWAIT)(void) { KA_TRACE(20, ("GOMP_loop_end_nowait: T#%d\n", __kmp_get_gtid())) } @@ -598,26 +599,26 @@ GOMP_loop_end_nowait(void) } -LOOP_START_ULL(GOMP_loop_ull_static_start, kmp_sch_static) -LOOP_NEXT_ULL(GOMP_loop_ull_static_next, {}) -LOOP_START_ULL(GOMP_loop_ull_dynamic_start, kmp_sch_dynamic_chunked) -LOOP_NEXT_ULL(GOMP_loop_ull_dynamic_next, {}) -LOOP_START_ULL(GOMP_loop_ull_guided_start, kmp_sch_guided_chunked) -LOOP_NEXT_ULL(GOMP_loop_ull_guided_next, {}) -LOOP_RUNTIME_START_ULL(GOMP_loop_ull_runtime_start, kmp_sch_runtime) -LOOP_NEXT_ULL(GOMP_loop_ull_runtime_next, {}) +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START), kmp_sch_static) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT), {}) +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START), kmp_sch_dynamic_chunked) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT), {}) +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START), kmp_sch_guided_chunked) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT), {}) +LOOP_RUNTIME_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START), kmp_sch_runtime) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT), {}) -LOOP_START_ULL(GOMP_loop_ull_ordered_static_start, kmp_ord_static) -LOOP_NEXT_ULL(GOMP_loop_ull_ordered_static_next, \ +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START), kmp_ord_static) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT), \ { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); }) -LOOP_START_ULL(GOMP_loop_ull_ordered_dynamic_start, kmp_ord_dynamic_chunked) -LOOP_NEXT_ULL(GOMP_loop_ull_ordered_dynamic_next, \ +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START), kmp_ord_dynamic_chunked) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT), \ { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); }) -LOOP_START_ULL(GOMP_loop_ull_ordered_guided_start, kmp_ord_guided_chunked) -LOOP_NEXT_ULL(GOMP_loop_ull_ordered_guided_next, \ +LOOP_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START), kmp_ord_guided_chunked) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT), \ { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); }) -LOOP_RUNTIME_START_ULL(GOMP_loop_ull_ordered_runtime_start, kmp_ord_runtime) -LOOP_NEXT_ULL(GOMP_loop_ull_ordered_runtime_next, \ +LOOP_RUNTIME_START_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START), kmp_ord_runtime) +LOOP_NEXT_ULL(xexpand(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT), \ { KMP_DISPATCH_FINI_CHUNK_ULL(&loc, gtid); }) @@ -659,10 +660,10 @@ LOOP_NEXT_ULL(GOMP_loop_ull_ordered_runtime_next, \ } -PARALLEL_LOOP_START(GOMP_parallel_loop_static_start, kmp_sch_static) -PARALLEL_LOOP_START(GOMP_parallel_loop_dynamic_start, kmp_sch_dynamic_chunked) -PARALLEL_LOOP_START(GOMP_parallel_loop_guided_start, kmp_sch_guided_chunked) -PARALLEL_LOOP_START(GOMP_parallel_loop_runtime_start, kmp_sch_runtime) +PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START), kmp_sch_static) +PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START), kmp_sch_dynamic_chunked) +PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START), kmp_sch_guided_chunked) +PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START), kmp_sch_runtime) #if OMP_30_ENABLED @@ -674,7 +675,7 @@ PARALLEL_LOOP_START(GOMP_parallel_loop_runtime_start, kmp_sch_runtime) // void -GOMP_task(void (*func)(void *), void *data, void (*copy_func)(void *, void *), +xexpand(KMP_API_NAME_GOMP_TASK)(void (*func)(void *), void *data, void (*copy_func)(void *, void *), long arg_size, long arg_align, int if_cond, unsigned gomp_flags) { MKLOC(loc, "GOMP_task"); @@ -728,7 +729,7 @@ GOMP_task(void (*func)(void *), void *data, void (*copy_func)(void *, void *), void -GOMP_taskwait(void) +xexpand(KMP_API_NAME_GOMP_TASKWAIT)(void) { MKLOC(loc, "GOMP_taskwait"); int gtid = __kmp_entry_gtid(); @@ -759,7 +760,7 @@ GOMP_taskwait(void) // unsigned -GOMP_sections_start(unsigned count) +xexpand(KMP_API_NAME_GOMP_SECTIONS_START)(unsigned count) { int status; kmp_int lb, ub, stride; @@ -786,7 +787,7 @@ GOMP_sections_start(unsigned count) unsigned -GOMP_sections_next(void) +xexpand(KMP_API_NAME_GOMP_SECTIONS_NEXT)(void) { int status; kmp_int lb, ub, stride; @@ -811,7 +812,7 @@ GOMP_sections_next(void) void -GOMP_parallel_sections_start(void (*task) (void *), void *data, +xexpand(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START)(void (*task) (void *), void *data, unsigned num_threads, unsigned count) { int gtid = __kmp_entry_gtid(); @@ -839,7 +840,7 @@ GOMP_parallel_sections_start(void (*task) (void *), void *data, void -GOMP_sections_end(void) +xexpand(KMP_API_NAME_GOMP_SECTIONS_END)(void) { int gtid = __kmp_get_gtid(); KA_TRACE(20, ("GOMP_sections_end: T#%d\n", gtid)) @@ -851,11 +852,175 @@ GOMP_sections_end(void) void -GOMP_sections_end_nowait(void) +xexpand(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT)(void) { KA_TRACE(20, ("GOMP_sections_end_nowait: T#%d\n", __kmp_get_gtid())) } +// libgomp has an empty function for GOMP_taskyield as of 2013-10-10 +void +xexpand(KMP_API_NAME_GOMP_TASKYIELD)(void) +{ + +} + +/* + The following sections of code create aliases for the GOMP_* functions, + then create versioned symbols using the assembler directive .symver. + This is only pertinent for ELF .so library + xaliasify and xversionify are defined in kmp_ftn_os.h +*/ + +#if KMP_OS_LINUX + +// GOMP_1.0 aliases +xaliasify(KMP_API_NAME_GOMP_ATOMIC_END, 10); +xaliasify(KMP_API_NAME_GOMP_ATOMIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_BARRIER, 10); +xaliasify(KMP_API_NAME_GOMP_CRITICAL_END, 10); +xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10); +xaliasify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10); +xaliasify(KMP_API_NAME_GOMP_CRITICAL_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_END, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_ORDERED_END, 10); +xaliasify(KMP_API_NAME_GOMP_ORDERED_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_END, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10); +xaliasify(KMP_API_NAME_GOMP_PARALLEL_START, 10); +xaliasify(KMP_API_NAME_GOMP_SECTIONS_END, 10); +xaliasify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10); +xaliasify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10); +xaliasify(KMP_API_NAME_GOMP_SECTIONS_START, 10); +xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10); +xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10); +xaliasify(KMP_API_NAME_GOMP_SINGLE_START, 10); + +// GOMP_2.0 aliases +#if OMP_30_ENABLED +xaliasify(KMP_API_NAME_GOMP_TASK, 20); +xaliasify(KMP_API_NAME_GOMP_TASKWAIT, 20); +#endif +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20); +xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20); + +// GOMP_3.0 aliases +xaliasify(KMP_API_NAME_GOMP_TASKYIELD, 30); + +// GOMP_4.0 aliases +/* TODO: add GOMP_4.0 aliases when corresponding + GOMP_* functions are implemented +*/ + +// GOMP_1.0 versioned symbols +xversionify(KMP_API_NAME_GOMP_ATOMIC_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_ATOMIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_BARRIER, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_CRITICAL_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_CRITICAL_NAME_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_CRITICAL_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_DYNAMIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_END_NOWAIT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_GUIDED_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_DYNAMIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_GUIDED_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_RUNTIME_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ORDERED_STATIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_RUNTIME_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_STATIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_ORDERED_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_ORDERED_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_PARALLEL_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SECTIONS_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SECTIONS_NEXT, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SECTIONS_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_END, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10, "GOMP_1.0"); +xversionify(KMP_API_NAME_GOMP_SINGLE_START, 10, "GOMP_1.0"); + +// GOMP_2.0 versioned symbols +#if OMP_30_ENABLED +xversionify(KMP_API_NAME_GOMP_TASK, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_TASKWAIT, 20, "GOMP_2.0"); +#endif +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_GUIDED_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_RUNTIME_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_ORDERED_STATIC_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_RUNTIME_START, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_NEXT, 20, "GOMP_2.0"); +xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20, "GOMP_2.0"); + +// GOMP_3.0 versioned symbols +xversionify(KMP_API_NAME_GOMP_TASKYIELD, 30, "GOMP_3.0"); + +// GOMP_4.0 versioned symbols +/* TODO: add GOMP_4.0 versioned symbols when corresponding + GOMP_* functions are implemented +*/ + +#endif /* KMP_OS_LINUX */ + #ifdef __cplusplus } //extern "C" #endif // __cplusplus diff --git a/openmp/runtime/src/kmp_i18n.c b/openmp/runtime/src/kmp_i18n.c index e23e9f1af5d..5cca6e816d3 100644 --- a/openmp/runtime/src/kmp_i18n.c +++ b/openmp/runtime/src/kmp_i18n.c @@ -1,7 +1,7 @@ /* * kmp_i18n.c - * $Revision: 42181 $ - * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -668,7 +668,7 @@ __kmp_i18n_catgets( void __kmp_i18n_dump_catalog( - kmp_str_buf_t & buffer + kmp_str_buf_t * buffer ) { struct kmp_i18n_id_range_t { @@ -676,7 +676,7 @@ __kmp_i18n_dump_catalog( kmp_i18n_id_t last; }; // struct kmp_i18n_id_range_t - static kmp_i18n_id_range_t ranges[] = { + static struct kmp_i18n_id_range_t ranges[] = { { kmp_i18n_prp_first, kmp_i18n_prp_last }, { kmp_i18n_str_first, kmp_i18n_str_last }, { kmp_i18n_fmt_first, kmp_i18n_fmt_last }, @@ -684,18 +684,20 @@ __kmp_i18n_dump_catalog( { kmp_i18n_hnt_first, kmp_i18n_hnt_last } }; // ranges - int num_of_ranges = sizeof( ranges ) / sizeof( kmp_i18n_id_range_t ); + int num_of_ranges = sizeof( ranges ) / sizeof( struct kmp_i18n_id_range_t ); int range; kmp_i18n_id_t id; for ( range = 0; range < num_of_ranges; ++ range ) { - __kmp_str_buf_print( & buffer, "*** Set #%d ***\n", range + 1 ); - for ( id = kmp_i18n_id_t( ranges[ range ].first + 1 ); id < ranges[ range ].last; id = kmp_i18n_id_t( id + 1 ) ) { - __kmp_str_buf_print( & buffer, "%d: <<%s>>\n", id, __kmp_i18n_catgets( id ) ); + __kmp_str_buf_print( buffer, "*** Set #%d ***\n", range + 1 ); + for ( id = (kmp_i18n_id_t)( ranges[ range ].first + 1 ); + id < ranges[ range ].last; + id = (kmp_i18n_id_t)( id + 1 ) ) { + __kmp_str_buf_print( buffer, "%d: <<%s>>\n", id, __kmp_i18n_catgets( id ) ); }; // for id }; // for range - __kmp_printf( "%s", buffer.str ); + __kmp_printf( "%s", buffer->str ); } // __kmp_i18n_dump_catalog diff --git a/openmp/runtime/src/kmp_i18n.h b/openmp/runtime/src/kmp_i18n.h index 9392e62b3d8..fea8de42648 100644 --- a/openmp/runtime/src/kmp_i18n.h +++ b/openmp/runtime/src/kmp_i18n.h @@ -1,7 +1,7 @@ /* * kmp_i18n.h - * $Revision: 42061 $ - * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -183,7 +183,7 @@ void __kmp_msg( kmp_msg_severity_t severity, kmp_msg_t message, ... ); } #ifdef KMP_DEBUG - void __kmp_i18n_dump_catalog( kmp_str_buf_t & buffer ); + void __kmp_i18n_dump_catalog( kmp_str_buf_t * buffer ); #endif // KMP_DEBUG #ifdef __cplusplus diff --git a/openmp/runtime/src/kmp_itt.h b/openmp/runtime/src/kmp_itt.h index ced8fc8f871..0ee79b6fe5d 100644 --- a/openmp/runtime/src/kmp_itt.h +++ b/openmp/runtime/src/kmp_itt.h @@ -1,8 +1,8 @@ #if USE_ITT_BUILD /* * kmp_itt.h -- ITT Notify interface. - * $Revision: 42616 $ - * $Date: 2013-08-26 11:47:32 -0500 (Mon, 26 Aug 2013) $ + * $Revision: 42829 $ + * $Date: 2013-11-21 05:44:01 -0600 (Thu, 21 Nov 2013) $ */ @@ -59,6 +59,9 @@ __kmp_inline void __kmp_itt_region_forking( int gtid, int serialized = 0 ); // __kmp_inline void __kmp_itt_region_joined( int gtid, int serialized = 0 ); // Master only, after joining threads. // (*) Note: A thread may execute tasks after this point, though. +// --- Frame reporting --- +__kmp_inline void __kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t *loc ); + // --- Barrier reporting --- __kmp_inline void * __kmp_itt_barrier_object( int gtid, int bt, int set_name = 0, int delta = 0 ); __kmp_inline void __kmp_itt_barrier_starting( int gtid, void * object ); @@ -265,6 +268,6 @@ __kmp_inline void __kmp_itt_stack_callee_leave(__itt_caller); # define KMP_ITT_IGNORE(stmt ) do { stmt } while (0) -# define USE_ITT_BUILD_ARG(x) +# define USE_ITT_BUILD_ARG(x) #endif /* USE_ITT_BUILD */ diff --git a/openmp/runtime/src/kmp_itt.inl b/openmp/runtime/src/kmp_itt.inl index bedcca1001e..6976e7f637b 100644 --- a/openmp/runtime/src/kmp_itt.inl +++ b/openmp/runtime/src/kmp_itt.inl @@ -1,8 +1,8 @@ #if USE_ITT_BUILD /* * kmp_itt.inl -- Inline functions of ITT Notify. - * $Revision: 42616 $ - * $Date: 2013-08-26 11:47:32 -0500 (Mon, 26 Aug 2013) $ + * $Revision: 42866 $ + * $Date: 2013-12-10 15:15:58 -0600 (Tue, 10 Dec 2013) $ */ @@ -49,6 +49,20 @@ # define LINKAGE static inline #endif +// ZCA interface used by Intel(R) Inspector. Intel(R) Parallel Amplifier uses this +// API to support user-defined synchronization primitives, but does not use ZCA; +// it would be safe to turn this off until wider support becomes available. +#if USE_ITT_ZCA +#ifdef __INTEL_COMPILER +# if __INTEL_COMPILER >= 1200 +# undef __itt_sync_acquired +# undef __itt_sync_releasing +# define __itt_sync_acquired(addr) __notify_zc_intrinsic((char *)"sync_acquired", addr) +# define __itt_sync_releasing(addr) __notify_intrinsic((char *)"sync_releasing", addr) +# endif +#endif +#endif + /* ------------------------------------------------------------------------------------------------ Parallel region reporting. @@ -79,10 +93,6 @@ __kmp_itt_region_forking( int gtid, int serialized ) { #if USE_ITT_NOTIFY kmp_team_t * team = __kmp_team_from_gtid( gtid ); #if OMP_30_ENABLED - KMP_ITT_DEBUG_LOCK(); - KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%d, serialized:%d, empty:%d\n", gtid, - __kmp_threads[gtid]->th.th_ident->reserved_2 - 1, serialized, - (team->t.t_active_level + serialized > 1) ); if (team->t.t_active_level + serialized > 1) #endif { @@ -116,13 +126,19 @@ __kmp_itt_region_forking( int gtid, int serialized ) { str_loc.line, str_loc.col); __kmp_str_loc_free( &str_loc ); + __itt_suppress_push(__itt_suppress_memory_errors); __kmp_itt_domains[ frm ] = __itt_domain_create( buff ); + __itt_suppress_pop(); + __kmp_str_free( &buff ); __itt_frame_begin_v3(__kmp_itt_domains[ frm ], NULL); } } else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS __itt_frame_begin_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL); } + KMP_ITT_DEBUG_LOCK(); + KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%d, serialized:%d, loc:%p\n", + gtid, loc->reserved_2 - 1, serialized, loc ); } #endif } // __kmp_itt_region_forking @@ -130,6 +146,51 @@ __kmp_itt_region_forking( int gtid, int serialized ) { // ------------------------------------------------------------------------------------------------- LINKAGE void +__kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t * loc ) { +#if USE_ITT_NOTIFY + if (loc) { + if (loc->reserved_2 == 0) { + if (__kmp_frame_domain_count < KMP_MAX_FRAME_DOMAINS) { + int frm = KMP_TEST_THEN_INC32( & __kmp_frame_domain_count ); // get "old" value + if (frm >= KMP_MAX_FRAME_DOMAINS) { + KMP_TEST_THEN_DEC32( & __kmp_frame_domain_count ); // revert the count + return; // loc->reserved_2 is still 0 + } + // Should it be synchronized? See the comment in __kmp_itt_region_forking + loc->reserved_2 = frm + 1; // save "new" value + + // Transform compiler-generated region location into the format + // that the tools more or less standardized on: + // "<func>$omp$frame@[file:]<line>[:<col>]" + const char * buff = NULL; + kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 ); + if( imbalance ) { + buff = __kmp_str_format("%s$omp$barrier-imbalance@%s:%d", + str_loc.func, str_loc.file, str_loc.col); + } else { + buff = __kmp_str_format("%s$omp$barrier@%s:%d", + str_loc.func, str_loc.file, str_loc.col); + } + __kmp_str_loc_free( &str_loc ); + + __itt_suppress_push(__itt_suppress_memory_errors); + __kmp_itt_domains[ frm ] = __itt_domain_create( buff ); + __itt_suppress_pop(); + + __kmp_str_free( &buff ); + __itt_frame_submit_v3(__kmp_itt_domains[ frm ], NULL, begin, end ); + } + } else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS + __itt_frame_submit_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL, begin, end ); + } + } + +#endif +} // __kmp_itt_frame_submit + +// ------------------------------------------------------------------------------------------------- + +LINKAGE void __kmp_itt_region_starting( int gtid ) { #if USE_ITT_NOTIFY #endif @@ -150,10 +211,6 @@ __kmp_itt_region_joined( int gtid, int serialized ) { #if USE_ITT_NOTIFY kmp_team_t * team = __kmp_team_from_gtid( gtid ); #if OMP_30_ENABLED - KMP_ITT_DEBUG_LOCK(); - KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%d, serialized:%d, empty:%d\n", gtid, - __kmp_threads[gtid]->th.th_ident->reserved_2 - 1, serialized, - (team->t.t_active_level + serialized > 1) ); if (team->t.t_active_level + serialized > 1) #endif { @@ -162,7 +219,10 @@ __kmp_itt_region_joined( int gtid, int serialized ) { } ident_t * loc = __kmp_thread_from_gtid( gtid )->th.th_ident; if (loc && loc->reserved_2 && loc->reserved_2 <= KMP_MAX_FRAME_DOMAINS) { + KMP_ITT_DEBUG_LOCK(); __itt_frame_end_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL); + KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%d, serialized:%d, loc:%p\n", + gtid, loc->reserved_2 - 1, serialized, loc ); } #endif } // __kmp_itt_region_joined @@ -577,7 +637,7 @@ __kmp_itt_critical_destroyed( kmp_user_lock_p lock ) { void __kmp_itt_single_start( int gtid ) { #if USE_ITT_NOTIFY - if ( __itt_mark_create_ptr ) { + if ( __itt_mark_create_ptr || KMP_ITT_DEBUG ) { kmp_info_t * thr = __kmp_thread_from_gtid( (gtid) ); ident_t * loc = thr->th.th_ident; char const * src = ( loc == NULL ? NULL : loc->psource ); diff --git a/openmp/runtime/src/kmp_lock.cpp b/openmp/runtime/src/kmp_lock.cpp index d0420194688..766cf830fec 100644 --- a/openmp/runtime/src/kmp_lock.cpp +++ b/openmp/runtime/src/kmp_lock.cpp @@ -1,7 +1,7 @@ /* * kmp_lock.cpp -- lock-related functions - * $Revision: 42613 $ - * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -23,7 +23,7 @@ #include "kmp_lock.h" #include "kmp_io.h" -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) # include <unistd.h> # include <sys/syscall.h> // We should really include <futex.h>, but that causes compatibility problems on different @@ -398,7 +398,7 @@ __kmp_destroy_nested_tas_lock_with_checks( kmp_tas_lock_t *lck ) } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) /* ------------------------------------------------------------------------ */ /* futex locks */ @@ -755,7 +755,7 @@ __kmp_destroy_nested_futex_lock_with_checks( kmp_futex_lock_t *lck ) __kmp_destroy_nested_futex_lock( lck ); } -#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) /* ------------------------------------------------------------------------ */ @@ -2199,10 +2199,10 @@ __kmp_is_unlocked_queuing_lock( kmp_queuing_lock_t *lck ) // We need a fence here, since we must ensure that no memory operations // from later in this thread float above that read. -#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) - __sync_synchronize(); -#else +#if KMP_COMPILER_ICC _mm_mfence(); +#else + __sync_synchronize(); #endif return res; @@ -3167,7 +3167,7 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind ) } break; -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) case lk_futex: { __kmp_base_user_lock_size = sizeof( kmp_base_futex_lock_t ); @@ -3238,7 +3238,7 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind ) } break; -#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) case lk_ticket: { __kmp_base_user_lock_size = sizeof( kmp_base_ticket_lock_t ); diff --git a/openmp/runtime/src/kmp_lock.h b/openmp/runtime/src/kmp_lock.h index bb80b5a57a3..5191cea1264 100644 --- a/openmp/runtime/src/kmp_lock.h +++ b/openmp/runtime/src/kmp_lock.h @@ -1,7 +1,7 @@ /* * kmp_lock.h -- lock header file - * $Revision: 42590 $ - * $Date: 2013-08-13 20:55:19 -0500 (Tue, 13 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -174,7 +174,7 @@ extern void __kmp_init_nested_tas_lock( kmp_tas_lock_t *lck ); extern void __kmp_destroy_nested_tas_lock( kmp_tas_lock_t *lck ); -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) // ---------------------------------------------------------------------------- // futex locks. futex locks are only available on Linux* OS. @@ -224,7 +224,7 @@ extern void __kmp_release_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gt extern void __kmp_init_nested_futex_lock( kmp_futex_lock_t *lck ); extern void __kmp_destroy_nested_futex_lock( kmp_futex_lock_t *lck ); -#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) // ---------------------------------------------------------------------------- @@ -479,31 +479,31 @@ typedef kmp_ticket_lock_t kmp_bootstrap_lock_t; #define KMP_BOOTSTRAP_LOCK_INITIALIZER( lock ) KMP_TICKET_LOCK_INITIALIZER( (lock) ) -inline void +static inline void __kmp_acquire_bootstrap_lock( kmp_bootstrap_lock_t *lck ) { __kmp_acquire_ticket_lock( lck, KMP_GTID_DNE ); } -inline int +static inline int __kmp_test_bootstrap_lock( kmp_bootstrap_lock_t *lck ) { return __kmp_test_ticket_lock( lck, KMP_GTID_DNE ); } -inline void +static inline void __kmp_release_bootstrap_lock( kmp_bootstrap_lock_t *lck ) { __kmp_release_ticket_lock( lck, KMP_GTID_DNE ); } -inline void +static inline void __kmp_init_bootstrap_lock( kmp_bootstrap_lock_t *lck ) { __kmp_init_ticket_lock( lck ); } -inline void +static inline void __kmp_destroy_bootstrap_lock( kmp_bootstrap_lock_t *lck ) { __kmp_destroy_ticket_lock( lck ); @@ -524,31 +524,31 @@ __kmp_destroy_bootstrap_lock( kmp_bootstrap_lock_t *lck ) typedef kmp_ticket_lock_t kmp_lock_t; -inline void +static inline void __kmp_acquire_lock( kmp_lock_t *lck, kmp_int32 gtid ) { __kmp_acquire_ticket_lock( lck, gtid ); } -inline int +static inline int __kmp_test_lock( kmp_lock_t *lck, kmp_int32 gtid ) { return __kmp_test_ticket_lock( lck, gtid ); } -inline void +static inline void __kmp_release_lock( kmp_lock_t *lck, kmp_int32 gtid ) { __kmp_release_ticket_lock( lck, gtid ); } -inline void +static inline void __kmp_init_lock( kmp_lock_t *lck ) { __kmp_init_ticket_lock( lck ); } -inline void +static inline void __kmp_destroy_lock( kmp_lock_t *lck ) { __kmp_destroy_ticket_lock( lck ); @@ -570,7 +570,7 @@ __kmp_destroy_lock( kmp_lock_t *lck ) enum kmp_lock_kind { lk_default = 0, lk_tas, -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) lk_futex, #endif lk_ticket, @@ -587,7 +587,7 @@ extern kmp_lock_kind_t __kmp_user_lock_kind; union kmp_user_lock { kmp_tas_lock_t tas; -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) kmp_futex_lock_t futex; #endif kmp_ticket_lock_t ticket; @@ -606,7 +606,7 @@ extern size_t __kmp_user_lock_size; extern kmp_int32 ( *__kmp_get_user_lock_owner_ )( kmp_user_lock_p lck ); -inline kmp_int32 +static inline kmp_int32 __kmp_get_user_lock_owner( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_get_user_lock_owner_ != NULL ); @@ -615,7 +615,7 @@ __kmp_get_user_lock_owner( kmp_user_lock_p lck ) extern void ( *__kmp_acquire_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid ); -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) #define __kmp_acquire_user_lock_with_checks(lck,gtid) \ if (__kmp_user_lock_kind == lk_tas) { \ @@ -655,7 +655,7 @@ extern void ( *__kmp_acquire_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_ } #else -inline void +static inline void __kmp_acquire_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_acquire_user_lock_with_checks_ != NULL ); @@ -665,11 +665,11 @@ __kmp_acquire_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) extern int ( *__kmp_test_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid ); -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) #include "kmp_i18n.h" /* AC: KMP_FATAL definition */ extern int __kmp_env_consistency_check; /* AC: copy from kmp.h here */ -inline int +static inline int __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { if ( __kmp_user_lock_kind == lk_tas ) { @@ -688,7 +688,7 @@ __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) } } #else -inline int +static inline int __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_test_user_lock_with_checks_ != NULL ); @@ -698,7 +698,7 @@ __kmp_test_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) extern void ( *__kmp_release_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid ); -inline void +static inline void __kmp_release_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_release_user_lock_with_checks_ != NULL ); @@ -707,7 +707,7 @@ __kmp_release_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) extern void ( *__kmp_init_user_lock_with_checks_ )( kmp_user_lock_p lck ); -inline void +static inline void __kmp_init_user_lock_with_checks( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_init_user_lock_with_checks_ != NULL ); @@ -720,7 +720,7 @@ __kmp_init_user_lock_with_checks( kmp_user_lock_p lck ) // extern void ( *__kmp_destroy_user_lock_ )( kmp_user_lock_p lck ); -inline void +static inline void __kmp_destroy_user_lock( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_destroy_user_lock_ != NULL ); @@ -729,7 +729,7 @@ __kmp_destroy_user_lock( kmp_user_lock_p lck ) extern void ( *__kmp_destroy_user_lock_with_checks_ )( kmp_user_lock_p lck ); -inline void +static inline void __kmp_destroy_user_lock_with_checks( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_destroy_user_lock_with_checks_ != NULL ); @@ -780,7 +780,7 @@ extern void ( *__kmp_acquire_nested_user_lock_with_checks_ )( kmp_user_lock_p lc } #else -inline void +static inline void __kmp_acquire_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_acquire_nested_user_lock_with_checks_ != NULL ); @@ -791,7 +791,7 @@ __kmp_acquire_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid extern int ( *__kmp_test_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid ); #if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) -inline int +static inline int __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { if ( __kmp_user_lock_kind == lk_tas ) { @@ -820,7 +820,7 @@ __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) } } #else -inline int +static inline int __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_test_nested_user_lock_with_checks_ != NULL ); @@ -830,7 +830,7 @@ __kmp_test_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) extern void ( *__kmp_release_nested_user_lock_with_checks_ )( kmp_user_lock_p lck, kmp_int32 gtid ); -inline void +static inline void __kmp_release_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid ) { KMP_DEBUG_ASSERT( __kmp_release_nested_user_lock_with_checks_ != NULL ); @@ -839,7 +839,7 @@ __kmp_release_nested_user_lock_with_checks( kmp_user_lock_p lck, kmp_int32 gtid extern void ( *__kmp_init_nested_user_lock_with_checks_ )( kmp_user_lock_p lck ); -inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck ) +static inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_init_nested_user_lock_with_checks_ != NULL ); ( *__kmp_init_nested_user_lock_with_checks_ )( lck ); @@ -847,7 +847,7 @@ inline void __kmp_init_nested_user_lock_with_checks( kmp_user_lock_p lck ) extern void ( *__kmp_destroy_nested_user_lock_with_checks_ )( kmp_user_lock_p lck ); -inline void +static inline void __kmp_destroy_nested_user_lock_with_checks( kmp_user_lock_p lck ) { KMP_DEBUG_ASSERT( __kmp_destroy_nested_user_lock_with_checks_ != NULL ); @@ -875,7 +875,7 @@ extern int ( *__kmp_is_user_lock_initialized_ )( kmp_user_lock_p lck ); extern const ident_t * ( *__kmp_get_user_lock_location_ )( kmp_user_lock_p lck ); -inline const ident_t * +static inline const ident_t * __kmp_get_user_lock_location( kmp_user_lock_p lck ) { if ( __kmp_get_user_lock_location_ != NULL ) { @@ -888,7 +888,7 @@ __kmp_get_user_lock_location( kmp_user_lock_p lck ) extern void ( *__kmp_set_user_lock_location_ )( kmp_user_lock_p lck, const ident_t *loc ); -inline void +static inline void __kmp_set_user_lock_location( kmp_user_lock_p lck, const ident_t *loc ) { if ( __kmp_set_user_lock_location_ != NULL ) { @@ -900,7 +900,7 @@ extern kmp_lock_flags_t ( *__kmp_get_user_lock_flags_ )( kmp_user_lock_p lck ); extern void ( *__kmp_set_user_lock_flags_ )( kmp_user_lock_p lck, kmp_lock_flags_t flags ); -inline void +static inline void __kmp_set_user_lock_flags( kmp_user_lock_p lck, kmp_lock_flags_t flags ) { if ( __kmp_set_user_lock_flags_ != NULL ) { @@ -962,7 +962,7 @@ typedef struct kmp_block_of_locks kmp_block_of_locks_t; extern kmp_block_of_locks_t *__kmp_lock_blocks; extern int __kmp_num_locks_in_block; -extern kmp_user_lock_p __kmp_user_lock_allocate( void **user_lock, kmp_int32 gtid, kmp_lock_flags_t flags = 0 ); +extern kmp_user_lock_p __kmp_user_lock_allocate( void **user_lock, kmp_int32 gtid, kmp_lock_flags_t flags ); extern void __kmp_user_lock_free( void **user_lock, kmp_int32 gtid, kmp_user_lock_p lck ); extern kmp_user_lock_p __kmp_lookup_user_lock( void **user_lock, char const *func ); extern void __kmp_cleanup_user_locks(); diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h index 9a5d94800f4..f1676052340 100644 --- a/openmp/runtime/src/kmp_os.h +++ b/openmp/runtime/src/kmp_os.h @@ -1,7 +1,7 @@ /* * kmp_os.h -- KPTS runtime header file. - * $Revision: 42588 $ - * $Date: 2013-08-13 01:26:00 -0500 (Tue, 13 Aug 2013) $ + * $Revision: 42820 $ + * $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $ */ @@ -42,6 +42,24 @@ # define KMP_MEM_CONS_MODEL KMP_MEM_CONS_VOLATILE #endif +/* ------------------------- Compiler recognition ---------------------- */ +#define KMP_COMPILER_ICC 0 +#define KMP_COMPILER_GCC 0 +#define KMP_COMPILER_CLANG 0 + +#if defined( __INTEL_COMPILER ) +# undef KMP_COMPILER_ICC +# define KMP_COMPILER_ICC 1 +#elif defined( __clang__ ) +# undef KMP_COMPILER_CLANG +# define KMP_COMPILER_CLANG 1 +#elif defined( __GNUC__ ) +# undef KMP_COMPILER_GCC +# define KMP_COMPILER_GCC 1 +#else +# error Unknown compiler +#endif + /* ---------------------- Operating system recognition ------------------- */ #define KMP_OS_LINUX 0 @@ -90,28 +108,77 @@ # if defined __x86_64 # undef KMP_ARCH_X86_64 # define KMP_ARCH_X86_64 1 -# else +# elif defined __i386 # undef KMP_ARCH_X86 # define KMP_ARCH_X86 1 # endif #endif -#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64) +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7R__) || \ + defined(__ARM_ARCH_7A__) +# define KMP_ARCH_ARMV7 1 +#endif + +#if defined(KMP_ARCH_ARMV7) || defined(__ARM_ARCH_6__) || \ + defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || \ + defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6T2__) || \ + defined(__ARM_ARCH_6ZK__) +# define KMP_ARCH_ARMV6 1 +#endif + +#if defined(KMP_ARCH_ARMV6) || defined(__ARM_ARCH_5T__) || \ + defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ + defined(__ARM_ARCH_5TEJ__) +# define KMP_ARCH_ARMV5 1 +#endif + +#if defined(KMP_ARCH_ARMV5) || defined(__ARM_ARCH_4__) || \ + defined(__ARM_ARCH_4T__) +# define KMP_ARCH_ARMV4 1 +#endif + +#if defined(KMP_ARCH_ARMV4) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_ARCH_3M__) +# define KMP_ARCH_ARMV3 1 +#endif + +#if defined(KMP_ARCH_ARMV3) || defined(__ARM_ARCH_2__) +# define KMP_ARCH_ARMV2 1 +#endif + +#if defined(KMP_ARCH_ARMV2) +# define KMP_ARCH_ARM 1 +#endif + +#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM) # error Unknown or unsupported architecture #endif -#if KMP_OS_WINDOWS -# if defined KMP_WIN_CDECL || !defined GUIDEDLL_EXPORTS -# define USE_FTN_CDECL KMP_FTN_UPPER +/* Check for quad-precision extension. */ +#define KMP_HAVE_QUAD 0 +#if KMP_ARCH_X86 || KMP_ARCH_X86_64 +# if KMP_COMPILER_ICC + /* _Quad is already defined for icc */ +# undef KMP_HAVE_QUAD +# define KMP_HAVE_QUAD 1 +# elif KMP_COMPILER_CLANG + /* Clang doesn't support a software-implemented + 128-bit extended precision type yet */ + typedef long double _Quad; +# elif KMP_COMPILER_GCC + typedef __float128 _Quad; +# undef KMP_HAVE_QUAD +# define KMP_HAVE_QUAD 1 # endif - -# define KMP_FTN KMP_FTN_PLAIN -# define USE_FTN_EXTRA KMP_FTN_PLAIN -# if KMP_ARCH_X86 -# if defined KMP_WIN_STDCALL || !defined GUIDEDLL_EXPORTS -# define USE_FTN_STDCALL KMP_FTN_UPPER -# endif +#else +# if __LDBL_MAX_EXP__ >= 16384 && KMP_COMPILER_GCC + typedef long double _Quad; +# undef KMP_HAVE_QUAD +# define KMP_HAVE_QUAD 1 # endif +#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ + +#if KMP_OS_WINDOWS typedef char kmp_int8; typedef unsigned char kmp_uint8; typedef short kmp_int16; @@ -143,9 +210,6 @@ #endif /* KMP_OS_WINDOWS */ #if KMP_OS_UNIX -# define KMP_FTN KMP_FTN_PLAIN -# define USE_FTN_CDECL KMP_FTN_PLAIN -# define USE_FTN_EXTRA KMP_FTN_APPEND typedef char kmp_int8; typedef unsigned char kmp_uint8; typedef short kmp_int16; @@ -160,7 +224,7 @@ # define KMP_UINT64_SPEC "llu" #endif /* KMP_OS_UNIX */ -#if KMP_ARCH_X86 +#if KMP_ARCH_X86 || KMP_ARCH_ARM # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC #elif KMP_ARCH_X86_64 # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC @@ -199,7 +263,7 @@ typedef double kmp_real64; # define KMP_INT_SPEC KMP_INT32_SPEC # define KMP_UINT_SPEC KMP_UINT32_SPEC # define KMP_INT_MAX ((kmp_int32)0x7FFFFFFF) -# define KMP_INT_MIN ((kmp_int64)0x80000000) +# define KMP_INT_MIN ((kmp_int32)0x80000000) #endif /* KMP_I8 */ #ifdef __cplusplus @@ -248,14 +312,6 @@ typedef double kmp_real64; //------------------------------------------------------------------------- #endif // __cplusplus -#if KMP_OS_WINDOWS -# define KMP_STDCALL __stdcall -#endif - -#ifndef KMP_STDCALL -# define KMP_STDCALL /* nothing */ -#endif - #define KMP_EXPORT extern /* export declaration in guide libraries */ #if __GNUC__ == 4 @@ -336,7 +392,113 @@ enum kmp_mem_fence_type { // Synchronization primitives // -#if KMP_ASM_INTRINS +#if KMP_ASM_INTRINS && KMP_OS_WINDOWS + +#include <Windows.h> + +#pragma intrinsic(InterlockedExchangeAdd) +#pragma intrinsic(InterlockedCompareExchange) +#pragma intrinsic(InterlockedExchange) +#pragma intrinsic(InterlockedExchange64) + +// +// Using InterlockedIncrement / InterlockedDecrement causes a library loading +// ordering problem, so we use InterlockedExchangeAdd instead. +// +# define KMP_TEST_THEN_INC32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 ) +# define KMP_TEST_THEN_INC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 ) +# define KMP_TEST_THEN_ADD4_32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 ) +# define KMP_TEST_THEN_ADD4_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 ) +# define KMP_TEST_THEN_DEC32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 ) +# define KMP_TEST_THEN_DEC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 ) +# define KMP_TEST_THEN_ADD32(p, v) InterlockedExchangeAdd( (volatile long *)(p), (v) ) + +# define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) InterlockedCompareExchange( (volatile long *)(p),(long)(sv),(long)(cv) ) + +# define KMP_XCHG_FIXED32(p, v) InterlockedExchange( (volatile long *)(p), (long)(v) ) +# define KMP_XCHG_FIXED64(p, v) InterlockedExchange64( (volatile kmp_int64 *)(p), (kmp_int64)(v) ) + +inline kmp_real32 KMP_XCHG_REAL32( volatile kmp_real32 *p, kmp_real32 v) +{ + kmp_int32 tmp = InterlockedExchange( (volatile long *)p, *(long *)&v); + return *(kmp_real32*)&tmp; +} + +// +// Routines that we still need to implement in assembly. +// +extern kmp_int32 __kmp_test_then_add32( volatile kmp_int32 *p, kmp_int32 v ); +extern kmp_int32 __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 v ); +extern kmp_int32 __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 v ); +extern kmp_int64 __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 v ); +extern kmp_int64 __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 v ); +extern kmp_int64 __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 v ); + +extern kmp_int8 __kmp_compare_and_store8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv ); +extern kmp_int16 __kmp_compare_and_store16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv ); +extern kmp_int32 __kmp_compare_and_store32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv ); +extern kmp_int32 __kmp_compare_and_store64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv ); +extern kmp_int8 __kmp_compare_and_store_ret8( volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv ); +extern kmp_int16 __kmp_compare_and_store_ret16( volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv ); +extern kmp_int32 __kmp_compare_and_store_ret32( volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv ); +extern kmp_int64 __kmp_compare_and_store_ret64( volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv ); + +extern kmp_int8 __kmp_xchg_fixed8( volatile kmp_int8 *p, kmp_int8 v ); +extern kmp_int16 __kmp_xchg_fixed16( volatile kmp_int16 *p, kmp_int16 v ); +extern kmp_int32 __kmp_xchg_fixed32( volatile kmp_int32 *p, kmp_int32 v ); +extern kmp_int64 __kmp_xchg_fixed64( volatile kmp_int64 *p, kmp_int64 v ); +extern kmp_real32 __kmp_xchg_real32( volatile kmp_real32 *p, kmp_real32 v ); +extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v ); + +//# define KMP_TEST_THEN_INC32(p) __kmp_test_then_add32( (p), 1 ) +//# define KMP_TEST_THEN_INC_ACQ32(p) __kmp_test_then_add32( (p), 1 ) +# define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL ) +# define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL ) +//# define KMP_TEST_THEN_ADD4_32(p) __kmp_test_then_add32( (p), 4 ) +//# define KMP_TEST_THEN_ADD4_ACQ32(p) __kmp_test_then_add32( (p), 4 ) +# define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL ) +# define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL ) +//# define KMP_TEST_THEN_DEC32(p) __kmp_test_then_add32( (p), -1 ) +//# define KMP_TEST_THEN_DEC_ACQ32(p) __kmp_test_then_add32( (p), -1 ) +# define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL ) +# define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL ) +//# define KMP_TEST_THEN_ADD32(p, v) __kmp_test_then_add32( (p), (v) ) +# define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) ) + +# define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) ) +# define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) ) +# define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) ) +# define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) ) + +# define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) ) + +# if KMP_ARCH_X86 +# define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) ) +# else /* 64 bit pointers */ +# define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) ) +# endif /* KMP_ARCH_X86 */ + +# define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) ) +//# define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __kmp_compare_and_store_ret32( (p), (cv), (sv) ) +# define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) ) + +# define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) ); +# define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) ); +//# define KMP_XCHG_FIXED32(p, v) __kmp_xchg_fixed32( (p), (v) ); +//# define KMP_XCHG_FIXED64(p, v) __kmp_xchg_fixed64( (p), (v) ); +//# define KMP_XCHG_REAL32(p, v) __kmp_xchg_real32( (p), (v) ); +# define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) ); + + +#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64) /* cast p to correct type so that proper intrinsic will be used */ # define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 ) @@ -385,7 +547,7 @@ inline kmp_real32 KMP_XCHG_REAL32( volatile kmp_real32 *p, kmp_real32 v) return *(kmp_real32*)&tmp; } -static kmp_real64 KMP_XCHG_REAL64( volatile kmp_real64 *p, kmp_real64 v) +inline kmp_real64 KMP_XCHG_REAL64( volatile kmp_real64 *p, kmp_real64 v) { kmp_int64 tmp = __sync_lock_test_and_set( (kmp_int64*)p, *(kmp_int64*)&v); return *(kmp_real64*)&tmp; @@ -607,6 +769,14 @@ typedef void (*microtask_t)( int *gtid, int *npr, ... ); #endif +// Switches for OSS builds +#ifndef USE_SYSFS_INFO +# define USE_SYSFS_INFO 0 +#endif +#ifndef USE_CMPXCHG_FIX +# define USE_CMPXCHG_FIX 1 +#endif + // Warning levels enum kmp_warnings_level { kmp_warnings_off = 0, /* No warnings */ diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index 7d66b9bc304..37c372bd89e 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -1,7 +1,7 @@ /* * kmp_runtime.c -- KPTS runtime support library - * $Revision: 42642 $ - * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $ + * $Revision: 42839 $ + * $Date: 2013-11-24 13:01:00 -0600 (Sun, 24 Nov 2013) $ */ @@ -88,6 +88,8 @@ char const __kmp_version_perf_v106[] = KMP_VERSION_PREFIX "perf v106: " #endif /* KMP_DEBUG */ +#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) ) + /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ @@ -472,8 +474,7 @@ __kmp_wait_sleep( kmp_info_t *this_thr, __kmp_unref_task_team( task_team, this_thr ); } else if ( KMP_TASKING_ENABLED( task_team, this_thr->th.th_task_state ) ) { __kmp_execute_tasks( this_thr, th_gtid, spin, check, final_spin, &flag - USE_ITT_BUILD_ARG( itt_sync_obj ) - ); + USE_ITT_BUILD_ARG( itt_sync_obj ), 0); } }; // if }; // if @@ -994,7 +995,7 @@ DllMain( HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved ) { } # endif /* KMP_OS_WINDOWS */ -#endif /* GUIDEDLL_EXPORTS +#endif /* GUIDEDLL_EXPORTS */ /* ------------------------------------------------------------------------ */ @@ -1190,10 +1191,8 @@ __kmp_linear_barrier_gather( enum barrier_type bt, register kmp_balign_team_t *team_bar = & team -> t.t_bar[ bt ]; register int nproc = this_thr -> th.th_team_nproc; register int i; - register kmp_uint new_state; - /* Don't have to worry about sleep bit here or atomic since team setting */ - new_state = team_bar -> b_arrived + KMP_BARRIER_STATE_BUMP; + register kmp_uint new_state = team_bar -> b_arrived + KMP_BARRIER_STATE_BUMP; /* Collect all the worker team member threads. */ for (i = 1; i < nproc; i++) { @@ -1341,7 +1340,7 @@ __kmp_tree_barrier_gather( enum barrier_type bt, /* Need to update the team arrived pointer if we are the master thread */ if ( nproc > 1 ) - /* New value was already computed in above loop */ + /* New value was already computed above */ team -> t.t_bar[ bt ].b_arrived = new_state; else team -> t.t_bar[ bt ].b_arrived += KMP_BARRIER_STATE_BUMP; @@ -1380,6 +1379,12 @@ __kmp_hyper_barrier_gather( enum barrier_type bt, KMP_DEBUG_ASSERT( this_thr == other_threads[this_thr->th.th_info.ds.ds_tid] ); +#if USE_ITT_BUILD && USE_ITT_NOTIFY + // Barrier imbalance - save arrive time to the thread + if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) { + this_thr->th.th_bar_arrive_time = __itt_get_timestamp(); + } +#endif /* * We now perform a hypercube-embedded tree gather to wait until all * of the threads have arrived, and reduce any required data @@ -1417,6 +1422,9 @@ __kmp_hyper_barrier_gather( enum barrier_type bt, /* parent threads wait for children to arrive */ + if (new_state == KMP_BARRIER_UNUSED_STATE) + new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP; + for ( child = 1, child_tid = tid + (1 << level); child < branch_factor && child_tid < num_threads; child++, child_tid += (1 << level) ) @@ -1429,10 +1437,6 @@ __kmp_hyper_barrier_gather( enum barrier_type bt, if ( child+1 < branch_factor && next_child_tid < num_threads ) KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ] -> th.th_bar[ bt ].bb.b_arrived ); #endif /* KMP_CACHE_MANAGE */ - /* Only read this arrived flag once per thread that needs it */ - if (new_state == KMP_BARRIER_UNUSED_STATE) - new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP; - KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) " "arrived(%p) == %u\n", gtid, team->t.t_id, tid, @@ -1444,6 +1448,12 @@ __kmp_hyper_barrier_gather( enum barrier_type bt, USE_ITT_BUILD_ARG (itt_sync_obj) ); +#if USE_ITT_BUILD + // Barrier imbalance - write min of the thread time and a child time to the thread. + if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) { + this_thr->th.th_bar_arrive_time = KMP_MIN( this_thr->th.th_bar_arrive_time, child_thr->th.th_bar_arrive_time ); + } +#endif if (reduce) { KA_TRACE( 100, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n", @@ -1729,7 +1739,6 @@ __kmp_tree_barrier_release( enum barrier_type bt, /* The reverse versions seem to beat the forward versions overall */ #define KMP_REVERSE_HYPER_BAR -#ifdef KMP_REVERSE_HYPER_BAR static void __kmp_hyper_barrier_release( enum barrier_type bt, kmp_info_t *this_thr, @@ -1751,15 +1760,13 @@ __kmp_hyper_barrier_release( enum barrier_type bt, register kmp_uint32 offset; register kmp_uint32 level; - /* - * We now perform a hypercube-embedded tree release for all - * of the threads that have been gathered, but in the exact - * reverse order from the corresponding gather (for load balance. - */ + /* Perform a hypercube-embedded tree release for all of the threads + that have been gathered. If KMP_REVERSE_HYPER_BAR is defined (default) + the threads are released in the reverse order of the corresponding gather, + otherwise threads are released in the same order. */ if ( ! KMP_MASTER_TID( tid )) { /* worker threads */ - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n", gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) ); @@ -1807,7 +1814,7 @@ __kmp_hyper_barrier_release( enum barrier_type bt, TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE); KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n", - gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) ); + gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) ); KMP_MB(); /* Flush all pending memory write invalidates. */ @@ -1822,6 +1829,7 @@ __kmp_hyper_barrier_release( enum barrier_type bt, num_threads = this_thr -> th.th_team_nproc; other_threads = team -> t.t_threads; +#ifdef KMP_REVERSE_HYPER_BAR /* count up to correct level for parent */ for ( level = 0, offset = 1; offset < num_threads && (((tid >> level) & (branch_factor-1)) == 0); @@ -1831,7 +1839,14 @@ __kmp_hyper_barrier_release( enum barrier_type bt, for ( level -= branch_bits, offset >>= branch_bits; offset != 0; level -= branch_bits, offset >>= branch_bits ) +#else + /* Go down the tree, level by level */ + for ( level = 0, offset = 1; + offset < num_threads; + level += branch_bits, offset <<= branch_bits ) +#endif // KMP_REVERSE_HYPER_BAR { +#ifdef KMP_REVERSE_HYPER_BAR /* Now go in reverse order through the children, highest to lowest. Initial setting of child is conservative here. */ child = num_threads >> ((level==0)?level:level-1); @@ -1839,8 +1854,18 @@ __kmp_hyper_barrier_release( enum barrier_type bt, child_tid = tid + (child << level); child >= 1; child--, child_tid -= (1 << level) ) - { +#else + if (((tid >> level) & (branch_factor - 1)) != 0) + /* No need to go any lower than this, since this is the level + parent would be notified */ + break; + /* iterate through children on this level of the tree */ + for ( child = 1, child_tid = tid + (1 << level); + child < branch_factor && child_tid < num_threads; + child++, child_tid += (1 << level) ) +#endif // KMP_REVERSE_HYPER_BAR + { if ( child_tid >= num_threads ) continue; /* child doesn't exist so keep going */ else { register kmp_info_t *child_thr = other_threads[ child_tid ]; @@ -1848,7 +1873,11 @@ __kmp_hyper_barrier_release( enum barrier_type bt, #if KMP_CACHE_MANAGE register kmp_uint32 next_child_tid = child_tid - (1 << level); /* prefetch next thread's go count */ +#ifdef KMP_REVERSE_HYPER_BAR if ( child-1 >= 1 && next_child_tid < num_threads ) +#else + if ( child+1 < branch_factor && next_child_tid < num_threads ) +#endif // KMP_REVERSE_HYPER_BAR KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ]->th.th_bar[ bt ].bb.b_go ); #endif /* KMP_CACHE_MANAGE */ @@ -1880,154 +1909,6 @@ __kmp_hyper_barrier_release( enum barrier_type bt, gtid, team->t.t_id, tid, bt ) ); } -#else /* !KMP_REVERSE_HYPER_BAR */ - -static void -__kmp_hyper_barrier_release( enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid, int propagate_icvs ) -{ - /* handle fork barrier workers who aren't part of a team yet */ - register kmp_team_t *team; - register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb; - register kmp_info_t **other_threads; - register kmp_uint32 num_threads; - register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[ bt ]; - register kmp_uint32 branch_factor = 1 << branch_bits; - register kmp_uint32 child; - register kmp_uint32 child_tid; - register kmp_uint32 offset; - register kmp_uint32 level; - - /* - * We now perform a hypercube-embedded tree release for all - * of the threads that have been gathered, but in the same order - * as the gather. - */ - - if ( ! KMP_MASTER_TID( tid )) { - /* worker threads */ - - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n", - gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) ); - - /* wait for parent thread to release us */ - __kmp_wait_sleep( this_thr, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP, TRUE, NULL ); - -#if USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY - if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) { - // we are on a fork barrier where we could not get the object reliably - itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 0, -1 ); - // cancel wait on previous parallel region... - __kmp_itt_task_starting( itt_sync_obj ); - - if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) ) - return; - - itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier ); - if ( itt_sync_obj != NULL ) - __kmp_itt_task_finished( itt_sync_obj ); // call prepare as early as possible for "new" barrier - - } else -#endif /* USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY */ - // - // early exit for reaping threads releasing forkjoin barrier - // - if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) ) - return; - - // - // The worker thread may now assume that the team is valid. - // -#if USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY - // libguide only code (cannot use *itt_task* routines) - if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) { - // we are on a fork barrier where we could not get the object reliably - itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier ); - __kmp_itt_barrier_starting( gtid, itt_sync_obj ); // no need to call releasing, but we have paired calls... - } -#endif /* USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY */ - team = __kmp_threads[ gtid ]-> th.th_team; - KMP_DEBUG_ASSERT( team != NULL ); - tid = __kmp_tid_from_gtid( gtid ); - - TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE); - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n", - gtid, ( team != NULL ) ? team->t.t_id : -1, tid, - &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) ); - - KMP_MB(); /* Flush all pending memory write invalidates. */ - - } else { /* KMP_MASTER_TID(tid) */ - team = __kmp_threads[ gtid ]-> th.th_team; - KMP_DEBUG_ASSERT( team != NULL ); - - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) enter for barrier type %d\n", - gtid, team->t.t_id, tid, bt ) ); - } - - /* Now set up team parameters since workers have been released */ - if ( team == NULL ) { - /* handle fork barrier workers who are now part of a team */ - tid = __kmp_tid_from_gtid( gtid ); - team = __kmp_threads[ gtid ]-> th.th_team; - } - num_threads = this_thr -> th.th_team_nproc; - other_threads = team -> t.t_threads; - - /* Go down the tree, level by level */ - for ( level = 0, offset = 1; - offset < num_threads; - level += branch_bits, offset <<= branch_bits ) - { - if (((tid >> level) & (branch_factor - 1)) != 0) - /* No need to go any lower than this, since this is the level - parent would be notified */ - break; - - /* iterate through children on this level of the tree */ - for ( child = 1, child_tid = tid + (1 << level); - child < branch_factor && child_tid < num_threads; - child++, child_tid += (1 << level) ) - { - register kmp_info_t *child_thr = other_threads[ child_tid ]; - register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb; -#if KMP_CACHE_MANAGE - { - register kmp_uint32 next_child_tid = child_tid + (1 << level); - /* prefetch next thread's go count */ - if ( child+1 < branch_factor && next_child_tid < num_threads ) - KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ]->th.th_bar[ bt ].bb.b_go ); - } -#endif /* KMP_CACHE_MANAGE */ - -#if KMP_BARRIER_ICV_PUSH - if ( propagate_icvs ) { - KMP_DEBUG_ASSERT( team != NULL ); - __kmp_init_implicit_task( team->t.t_ident, - team->t.t_threads[child_tid], team, child_tid, FALSE ); - load_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs); - store_icvs(&team->t.t_implicit_task_taskdata[child_tid].td_icvs, &team->t.t_implicit_task_taskdata[0].td_icvs); - sync_icvs(); - } -#endif // KMP_BARRIER_ICV_PUSH - - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) releasing " - "T#%d(%d:%u) go(%p): %u => %u\n", - gtid, team->t.t_id, tid, - __kmp_gtid_from_tid( child_tid, team ), team->t.t_id, - child_tid, &child_bar -> b_go, child_bar -> b_go, - child_bar -> b_go + KMP_BARRIER_STATE_BUMP ) ); - - /* release child from barrier */ - __kmp_release( child_thr, &child_bar -> b_go, kmp_acquire_fence ); - } - } - - KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) exit for barrier type %d\n", - gtid, team->t.t_id, tid, bt ) ); -} -#endif /* KMP_REVERSE_HYPER_BAR */ - - /* * Internal function to do a barrier. * If is_split is true, do a split barrier, otherwise, do a plain barrier @@ -2043,6 +1924,8 @@ __kmp_barrier( enum barrier_type bt, int gtid, int is_split, register kmp_team_t *team = this_thr -> th.th_team; register int status = 0; + ident_t * tmp_loc = __kmp_threads[ gtid ]->th.th_ident; + KA_TRACE( 15, ( "__kmp_barrier: T#%d(%d:%d) has arrived\n", gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid) ) ); @@ -2126,34 +2009,23 @@ __kmp_barrier( enum barrier_type bt, int gtid, int is_split, #endif /* OMP_30_ENABLED */ +#if USE_ITT_BUILD && USE_ITT_NOTIFY // Barrier - report frame end -#if USE_ITT_BUILD - // Collect information only if the file was opened succesfully. - if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file ) - { - ident_t * loc = this_thr->th.th_ident; - if (loc) { - // Use compiler-generated location to mark the frame: - // "<func>$omp$frame@[file:]<line>[:<col>]" - kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 ); - - kmp_uint64 fr_end; -#if defined( __GNUC__ ) -# if !defined( __INTEL_COMPILER ) - fr_end = __kmp_hardware_timestamp(); -# else - fr_end = __rdtsc(); -# endif -#else - fr_end = __rdtsc(); -#endif - K_DIAG( 3, ( "__kmp_barrier: T#%d(%d:%d) frame_begin = %llu, frame_end = %llu\n", - gtid, ( team != NULL ) ? team->t.t_id : -1, tid, this_thr->th.th_frame_time, fr_end ) ); - - __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n", - str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time, fr_end ); - __kmp_str_loc_free( &str_loc ); - this_thr->th.th_frame_time = fr_end; + if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) { + kmp_uint64 tmp = __itt_get_timestamp(); + switch( __kmp_forkjoin_frames_mode ) { + case 1: + __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc ); + this_thr->th.th_frame_time = tmp; + break; + case 2: + __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc ); + break; + case 3: + __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc ); + __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc ); + this_thr->th.th_frame_time = tmp; + break; } } #endif /* USE_ITT_BUILD */ @@ -2465,7 +2337,7 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team, KMP_MB(); /* first, let's setup the master thread */ - master_th -> th.th_info .ds.ds_tid = 0; + master_th -> th.th_info.ds.ds_tid = 0; master_th -> th.th_team = team; master_th -> th.th_team_nproc = team -> t.t_nproc; master_th -> th.th_team_master = master_th; @@ -2514,6 +2386,17 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team, static void __kmp_alloc_argv_entries( int argc, kmp_team_t *team, int realloc ); // forward declaration +static void +__kmp_setup_icv_copy( kmp_team_t *team, int new_nproc, +#if OMP_30_ENABLED + kmp_internal_control_t * new_icvs, + ident_t * loc +#else + int new_set_nproc, int new_set_dynamic, int new_set_nested, + int new_set_blocktime, int new_bt_intervals, int new_bt_set +#endif // OMP_30_ENABLED + ); // forward declaration + /* most of the work for a fork */ /* return true if we really went parallel, false if serialized */ int @@ -2527,7 +2410,7 @@ __kmp_fork_call( microtask_t microtask, launch_t invoker, /* TODO: revert workaround for Intel(R) 64 tracker #96 */ -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX va_list * ap #else va_list ap @@ -2576,7 +2459,6 @@ __kmp_fork_call( #endif - master_th->th.th_ident = loc; #if OMP_40_ENABLED @@ -2590,7 +2472,7 @@ __kmp_fork_call( argv = (void**)parent_team->t.t_argv; for( i=argc-1; i >= 0; --i ) /* TODO: revert workaround for Intel(R) 64 tracker #96 */ -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX *argv++ = va_arg( *ap, void * ); #else *argv++ = va_arg( ap, void * ); @@ -2686,11 +2568,11 @@ __kmp_fork_call( /* create a serialized parallel region? */ if ( nthreads == 1 ) { /* josh todo: hypothetical question: what do we do for OS X*? */ -#if KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 ) +#if KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM ) void * args[ argc ]; #else void * * args = (void**) alloca( argc * sizeof( void * ) ); -#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 ) */ +#endif /* KMP_OS_LINUX && ( KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM ) */ __kmp_release_bootstrap_lock( &__kmp_forkjoin_lock ); KA_TRACE( 20, ("__kmp_fork_call: T#%d serializing parallel region\n", gtid )); @@ -2721,7 +2603,7 @@ __kmp_fork_call( if ( ap ) { for( i=argc-1; i >= 0; --i ) /* TODO: revert workaround for Intel(R) 64 tracker #96 */ - #if KMP_ARCH_X86_64 && KMP_OS_LINUX + #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX *argv++ = va_arg( *ap, void * ); #else *argv++ = va_arg( ap, void * ); @@ -2741,7 +2623,7 @@ __kmp_fork_call( argv = args; for( i=argc-1; i >= 0; --i ) /* TODO: revert workaround for Intel(R) 64 tracker #96 */ - #if KMP_ARCH_X86_64 && KMP_OS_LINUX + #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX *argv++ = va_arg( *ap, void * ); #else *argv++ = va_arg( ap, void * ); @@ -2957,7 +2839,7 @@ __kmp_fork_call( #endif /* OMP_40_ENABLED */ for( i=argc-1; i >= 0; --i ) /* TODO: revert workaround for Intel(R) 64 tracker #96 */ -#if KMP_ARCH_X86_64 && KMP_OS_LINUX +#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX *argv++ = va_arg( *ap, void * ); #else *argv++ = va_arg( ap, void * ); @@ -2977,6 +2859,18 @@ __kmp_fork_call( root -> r.r_active = TRUE; __kmp_fork_team_threads( root, team, master_th, gtid ); + __kmp_setup_icv_copy(team, nthreads +#if OMP_30_ENABLED + , &master_th->th.th_current_task->td_icvs, loc +#else + , parent_team->t.t_set_nproc[master_tid], + parent_team->t.t_set_dynamic[master_tid], + parent_team->t.t_set_nested[master_tid], + parent_team->t.t_set_blocktime[master_tid], + parent_team->t.t_set_bt_intervals[master_tid], + parent_team->t.t_set_bt_set[master_tid] +#endif /* OMP_30_ENABLED */ + ); __kmp_release_bootstrap_lock( &__kmp_forkjoin_lock ); @@ -2992,23 +2886,12 @@ __kmp_fork_call( __kmp_itt_region_forking( gtid ); #endif /* USE_ITT_BUILD */ +#if USE_ITT_BUILD && USE_ITT_NOTIFY && OMP_30_ENABLED // Internal fork - report frame begin -#if USE_ITT_BUILD - // Collect information only if the file was opened succesfully. - if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file ) + if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr ) { - kmp_uint64 fr_begin; -#if defined( __GNUC__ ) -# if !defined( __INTEL_COMPILER ) - fr_begin = __kmp_hardware_timestamp(); -# else - fr_begin = __rdtsc(); -# endif -#else - fr_begin = __rdtsc(); -#endif if( ! ( team->t.t_active_level > 1 ) ) { - master_th->th.th_frame_time = fr_begin; + master_th->th.th_frame_time = __itt_get_timestamp(); } } #endif /* USE_ITT_BUILD */ @@ -3134,7 +3017,10 @@ __kmp_join_call(ident_t *loc, int gtid // Either not in teams or exiting teams region // (teams is a frame and no other frames inside the teams) # endif /* OMP_40_ENABLED */ + { + master_th->th.th_ident = loc; __kmp_itt_region_joined( gtid ); + } #endif /* USE_ITT_BUILD */ #if OMP_40_ENABLED @@ -4644,6 +4530,7 @@ __kmp_register_root( int initial_thread ) root -> r.r_root_team -> t.t_threads[0] = root_thread; root -> r.r_hot_team -> t.t_threads[0] = root_thread; root_thread -> th.th_serial_team -> t.t_threads[0] = root_thread; + root_thread -> th.th_serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now). root -> r.r_uber_thread = root_thread; /* initialize the thread, get it ready to go */ @@ -5007,6 +4894,19 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid ) TCW_4( __kmp_init_monitor, 1 ); __kmp_create_monitor( & __kmp_monitor ); KF_TRACE( 10, ( "after __kmp_create_monitor\n" ) ); + #if KMP_OS_WINDOWS + // AC: wait until monitor has started. This is a fix for CQ232808. + // The reason is that if the library is loaded/unloaded in a loop with small (parallel) + // work in between, then there is high probability that monitor thread started after + // the library shutdown. At shutdown it is too late to cope with the problem, because + // when the master is in DllMain (process detach) the monitor has no chances to start + // (it is blocked), and master has no means to inform the monitor that the library has gone, + // because all the memory which the monitor can access is going to be released/reset. + while ( TCR_4(__kmp_init_monitor) < 2 ) { + KMP_YIELD( TRUE ); + } + KF_TRACE( 10, ( "after monitor thread has started\n" ) ); + #endif } __kmp_release_bootstrap_lock( & __kmp_monitor_lock ); } @@ -5049,6 +4949,7 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid ) 0 ); } KMP_ASSERT ( serial_team ); + serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now). serial_team -> t.t_threads[0] = new_thr; KF_TRACE( 10, ( "__kmp_allocate_thread: after th_serial/serial_team : new_thr=%p\n", new_thr ) ); @@ -5144,76 +5045,94 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid ) * IF YOU TOUCH THIS ROUTINE, RUN EPCC C SYNCBENCH ON A BIG-IRON MACHINE!!! */ static void -__kmp_reinitialize_team( - kmp_team_t * team, - int new_nproc, - #if OMP_30_ENABLED - kmp_internal_control_t * new_icvs, - ident_t * loc - #else - int new_set_nproc, int new_set_dynamic, int new_set_nested, - int new_set_blocktime, int new_bt_intervals, int new_bt_set - #endif // OMP_30_ENABLED -) { - int f; - #if OMP_30_ENABLED - KMP_DEBUG_ASSERT( team && new_nproc && new_icvs ); - KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc ); - team->t.t_ident = loc; - #else - KMP_DEBUG_ASSERT( team && new_nproc && new_set_nproc ); - #endif // OMP_30_ENABLED +__kmp_reinitialize_team( kmp_team_t *team, +#if OMP_30_ENABLED + kmp_internal_control_t *new_icvs, ident_t *loc +#else + int new_set_nproc, int new_set_dynamic, int new_set_nested, + int new_set_blocktime, int new_bt_intervals, int new_bt_set +#endif + ) { + KF_TRACE( 10, ( "__kmp_reinitialize_team: enter this_thread=%p team=%p\n", + team->t.t_threads[0], team ) ); +#if OMP_30_ENABLED + KMP_DEBUG_ASSERT( team && new_icvs); + KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc ); + team->t.t_ident = loc; +#else + KMP_DEBUG_ASSERT( team && new_set_nproc ); +#endif // OMP_30_ENABLED team->t.t_id = KMP_GEN_TEAM_ID(); -#if KMP_BARRIER_ICV_PULL - // - // Copy the ICV's to the team structure, where all of the worker threads - // can access them and make their own copies after the barrier. - // + // Copy ICVs to the master thread's implicit taskdata +#if OMP_30_ENABLED load_icvs(new_icvs); - store_icvs(&team->t.t_initial_icvs, new_icvs); - - // - // Set up the master thread's copy of the ICV's. __kmp_fork_call() - // assumes they are already set in the master thread. - // FIXME - change that code to use the team->t.t_initial_icvs copy - // and eliminate this copy. - // __kmp_init_implicit_task( loc, team->t.t_threads[0], team, 0, FALSE ); store_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs); sync_icvs(); - KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n", - 0, team->t.t_threads[0], team ) ); +# else + team -> t.t_set_nproc[0] = new_set_nproc; + team -> t.t_set_dynamic[0] = new_set_dynamic; + team -> t.t_set_nested[0] = new_set_nested; + team -> t.t_set_blocktime[0] = new_set_blocktime; + team -> t.t_set_bt_intervals[0] = new_bt_intervals; + team -> t.t_set_bt_set[0] = new_bt_set; +# endif // OMP_30_ENABLED -#elif KMP_BARRIER_ICV_PUSH - // - // Set the ICV's in the master thread only. - // They will be propagated by the fork barrier. - // - __kmp_init_implicit_task( loc, team->t.t_threads[0], team, 0, FALSE ); + KF_TRACE( 10, ( "__kmp_reinitialize_team: exit this_thread=%p team=%p\n", + team->t.t_threads[0], team ) ); +} + +static void +__kmp_setup_icv_copy(kmp_team_t * team, int new_nproc, +#if OMP_30_ENABLED + kmp_internal_control_t * new_icvs, + ident_t * loc +#else + int new_set_nproc, int new_set_dynamic, int new_set_nested, + int new_set_blocktime, int new_bt_intervals, int new_bt_set +#endif // OMP_30_ENABLED + ) +{ + int f; + +#if OMP_30_ENABLED + KMP_DEBUG_ASSERT( team && new_nproc && new_icvs ); + KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc ); +#else + KMP_DEBUG_ASSERT( team && new_nproc && new_set_nproc ); +#endif // OMP_30_ENABLED + + // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team. + // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called. +#if KMP_BARRIER_ICV_PULL + // Copy the ICVs to master's thread structure into th_fixed_icvs (which remains untouched), where all of the + // worker threads can access them and make their own copies after the barrier. load_icvs(new_icvs); - store_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs); + KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point + store_icvs(&team->t.t_threads[0]->th.th_fixed_icvs, new_icvs); sync_icvs(); + KF_TRACE(10, ("__kmp_setup_icv_copy: PULL: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team)); - KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n", - 0, team->t.t_threads[0], team ) ); +#elif KMP_BARRIER_ICV_PUSH + // The ICVs will be propagated in the fork barrier, so nothing needs to be done here. + KF_TRACE(10, ("__kmp_setup_icv_copy: PUSH: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team)); #else - // - // Copy the icvs to each of the threads. This takes O(nthreads) time. - // -#if OMP_30_ENABLED + // Copy the ICVs to each of the non-master threads. This takes O(nthreads) time. +# if OMP_30_ENABLED load_icvs(new_icvs); -#endif - for( f=0 ; f<new_nproc ; f++) { +# endif // OMP_30_ENABLED + KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point + for(f=1 ; f<new_nproc ; f++) { // skip the master thread # if OMP_30_ENABLED // TODO: GEH - pass in better source location info since usually NULL here - KF_TRACE( 10, ( "__kmp_reinitialize_team1: T#%d this_thread=%p team=%p\n", + KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n", f, team->t.t_threads[f], team ) ); __kmp_init_implicit_task( loc, team->t.t_threads[f], team, f, FALSE ); store_icvs(&team->t.t_implicit_task_taskdata[f].td_icvs, new_icvs); - KF_TRACE( 10, ( "__kmp_reinitialize_team2: T#%d this_thread=%p team=%p\n", + KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n", f, team->t.t_threads[f], team ) ); # else team -> t.t_set_nproc[f] = new_set_nproc; @@ -5226,9 +5145,8 @@ __kmp_reinitialize_team( } # if OMP_30_ENABLED sync_icvs(); -# endif -#endif // KMP_BARRIER_ICV_PUSH || KMP_BARRIER_ICV_PULL - +# endif // OMP_30_ENABLED +#endif // KMP_BARRIER_ICV_PULL } /* initialize the team data structure @@ -5246,6 +5164,8 @@ __kmp_initialize_team( int new_set_blocktime, int new_bt_intervals, int new_bt_set #endif // OMP_30_ENABLED ) { + KF_TRACE( 10, ( "__kmp_initialize_team: enter: team=%p\n", team ) ); + /* verify */ KMP_DEBUG_ASSERT( team ); KMP_DEBUG_ASSERT( new_nproc <= team->t.t_max_nproc ); @@ -5290,18 +5210,18 @@ __kmp_initialize_team( team -> t.t_control_stack_top = NULL; - __kmp_reinitialize_team( - team, new_nproc, - #if OMP_30_ENABLED - new_icvs, - loc - #else - new_set_nproc, new_set_dynamic, new_set_nested, - new_set_blocktime, new_bt_intervals, new_bt_set - #endif // OMP_30_ENABLED - ); + __kmp_reinitialize_team( team, +#if OMP_30_ENABLED + new_icvs, loc +#else + new_set_nproc, new_set_dynamic, new_set_nested, + new_set_blocktime, new_bt_intervals, new_bt_set +#endif // OMP_30_ENABLED + ); + KMP_MB(); + KF_TRACE( 10, ( "__kmp_initialize_team: exit: team=%p\n", team ) ); } #if KMP_OS_LINUX @@ -5700,15 +5620,15 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, // TODO???: team -> t.t_max_active_levels = new_max_active_levels; team -> t.t_sched = new_icvs->sched; #endif - __kmp_reinitialize_team( team, new_nproc, + __kmp_reinitialize_team( team, #if OMP_30_ENABLED - new_icvs, - root->r.r_uber_thread->th.th_ident + new_icvs, root->r.r_uber_thread->th.th_ident #else - new_set_nproc, new_set_dynamic, new_set_nested, - new_set_blocktime, new_bt_intervals, new_bt_set -#endif - ); + new_set_nproc, new_set_dynamic, new_set_nested, + new_set_blocktime, new_bt_intervals, new_bt_set +#endif // OMP_30_ENABLED + ); + #if OMP_30_ENABLED if ( __kmp_tasking_mode != tskm_immediate_exec ) { @@ -5768,15 +5688,14 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, if(team -> t.t_max_nproc < new_nproc) { /* reallocate larger arrays */ __kmp_reallocate_team_arrays(team, new_nproc); - __kmp_reinitialize_team( team, new_nproc, + __kmp_reinitialize_team( team, #if OMP_30_ENABLED - new_icvs, - NULL // TODO: !!! + new_icvs, NULL #else - new_set_nproc, new_set_dynamic, new_set_nested, - new_set_blocktime, new_bt_intervals, new_bt_set -#endif - ); + new_set_nproc, new_set_dynamic, new_set_nested, + new_set_blocktime, new_bt_intervals, new_bt_set +#endif // OMP_30_ENABLED + ); } #if KMP_OS_LINUX @@ -5859,8 +5778,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, # endif #endif - } - else { + } + else { KA_TRACE( 20, ("__kmp_allocate_team: reusing hot team\n" )); #if KMP_MIC // This case can mean that omp_set_num_threads() was called and the hot team size @@ -5877,15 +5796,14 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, team -> t.t_sched = new_icvs->sched; #endif - __kmp_reinitialize_team( team, new_nproc, + __kmp_reinitialize_team( team, #if OMP_30_ENABLED - new_icvs, - root->r.r_uber_thread->th.th_ident + new_icvs, root->r.r_uber_thread->th.th_ident #else - new_set_nproc, new_set_dynamic, new_set_nested, - new_set_blocktime, new_bt_intervals, new_bt_set -#endif - ); + new_set_nproc, new_set_dynamic, new_set_nested, + new_set_blocktime, new_bt_intervals, new_bt_set +#endif // OMP_30_ENABLED + ); #if OMP_30_ENABLED KF_TRACE( 10, ("__kmp_allocate_team2: T#%d, this_thread=%p team=%p\n", @@ -6000,6 +5918,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc, * up seems to really hurt performance a lot on the P4, so, let's not use * this... */ __kmp_allocate_team_arrays( team, max_nproc ); + + KA_TRACE( 20, ( "__kmp_allocate_team: making a new team\n" ) ); __kmp_initialize_team( team, new_nproc, #if OMP_30_ENABLED new_icvs, @@ -6293,7 +6213,6 @@ __kmp_join_barrier( int gtid ) KA_TRACE( 10, ("__kmp_join_barrier: T#%d(%d:%d) arrived at join barrier\n", gtid, team_id, tid )); - #if OMP_30_ENABLED if ( __kmp_tasking_mode == tskm_extra_barrier ) { __kmp_tasking_barrier( team, this_thr, gtid ); @@ -6329,25 +6248,6 @@ __kmp_join_barrier( int gtid ) #endif // OMP_30_ENABLED } - #if KMP_OS_WINDOWS - // AC: wait here until monitor has started. This is a fix for CQ232808. - // The reason is that if the library is loaded/unloaded in a loop with small (parallel) - // work in between, then there is high probability that monitor thread started after - // the library shutdown. At shutdown it is too late to cope with the problem, because - // when the master is in DllMain (process detach) the monitor has no chances to start - // (it is blocked), and master has no means to inform the monitor that the library has gone, - // because all the memory which the monitor can access is going to be released/reset. - // - // The moment before barrier_gather sounds appropriate, because master needs to - // wait for all workers anyway, and we want this to happen as late as possible, - // but before the shutdown which may happen after the barrier. - if( KMP_MASTER_TID( tid ) && TCR_4(__kmp_init_monitor) < 2 ) { - __kmp_wait_sleep( this_thr, (volatile kmp_uint32*)&__kmp_init_monitor, 2, 0 - USE_ITT_BUILD_ARG( itt_sync_obj ) - ); - } - #endif - #if USE_ITT_BUILD if ( __itt_sync_create_ptr || KMP_ITT_DEBUG ) __kmp_itt_barrier_starting( gtid, itt_sync_obj ); @@ -6390,34 +6290,22 @@ __kmp_join_barrier( int gtid ) USE_ITT_BUILD_ARG( itt_sync_obj ) ); } +#if USE_ITT_BUILD && USE_ITT_NOTIFY // Join barrier - report frame end -#if USE_ITT_BUILD - // Collect information only if the file was opened successfully. - if( __kmp_forkjoin_frames_mode == 1 && __kmp_itt_csv_file ) - { - ident_t * loc = this_thr->th.th_ident; - if (loc) { - // Use compiler-generated location to mark the frame: - // "<func>$omp$frame@[file:]<line>[:<col>]" - kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 ); - - kmp_uint64 fr_end; -#if defined( __GNUC__ ) -# if !defined( __INTEL_COMPILER ) - fr_end = __kmp_hardware_timestamp(); -# else - fr_end = __rdtsc(); -# endif -#else - fr_end = __rdtsc(); -#endif - K_DIAG( 3, ( "__kmp_join_barrier: T#%d(%d:%d) frame_begin = %llu, frame_end = %llu\n", - gtid, ( team != NULL ) ? team->t.t_id : -1, tid, this_thr->th.th_frame_time, fr_end ) ); - - __kmp_str_buf_print( &__kmp_itt_frame_buffer, "%s$omp$frame@%s:%d:%d,%llu,%llu,,\n", - str_loc.func, str_loc.file, str_loc.line, str_loc.col, this_thr->th.th_frame_time, fr_end ); - - __kmp_str_loc_free( &str_loc ); + if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) { + kmp_uint64 tmp = __itt_get_timestamp(); + ident_t * loc = team->t.t_ident; + switch( __kmp_forkjoin_frames_mode ) { + case 1: + __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc ); + break; + case 2: + __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc ); + break; + case 3: + __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc ); + __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc ); + break; } } #endif /* USE_ITT_BUILD */ @@ -6571,20 +6459,16 @@ __kmp_fork_barrier( int gtid, int tid ) #if OMP_30_ENABLED # if KMP_BARRIER_ICV_PULL - // - // FIXME - after __kmp_fork_call() is modified to not look at the - // master thread's implicit task ICV's, remove the ! KMP_MASTER_TID - // restriction from this if condition. - // - if (! KMP_MASTER_TID( tid ) ) { - // - // Copy the initial ICV's from the team struct to the implicit task - // for this tid. - // - __kmp_init_implicit_task( team->t.t_ident, team->t.t_threads[tid], - team, tid, FALSE ); - load_icvs(&team->t.t_initial_icvs); - store_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &team->t.t_initial_icvs); + // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team. + // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called. + // We cannot modify __kmp_fork_call() to look at the fixed ICVs in the master's thread struct, because it is + // not always the case that the threads arrays have been allocated when __kmp_fork_call() is executed. + if (! KMP_MASTER_TID( tid ) ) { // master thread already has ICVs + // Copy the initial ICVs from the master's thread struct to the implicit task for this tid. + KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d(%d) is PULLing ICVs\n", gtid, tid )); + load_icvs(&team->t.t_threads[0]->th.th_fixed_icvs); + __kmp_init_implicit_task( team->t.t_ident, team->t.t_threads[tid], team, tid, FALSE ); + store_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &team->t.t_threads[0]->th.th_fixed_icvs); sync_icvs(); } # endif // KMP_BARRIER_ICV_PULL @@ -6716,13 +6600,13 @@ __kmp_launch_thread( kmp_info_t *this_thr ) void __kmp_internal_end_dest( void *specific_gtid ) { - #ifdef __INTEL_COMPILER + #if KMP_COMPILER_ICC #pragma warning( push ) #pragma warning( disable: 810 ) // conversion from "void *" to "int" may lose significant bits #endif // Make sure no significant bits are lost int gtid = (kmp_intptr_t)specific_gtid - 1; - #ifdef __INTEL_COMPILER + #if KMP_COMPILER_ICC #pragma warning( pop ) #endif @@ -7503,7 +7387,6 @@ __kmp_do_serial_initialize( void ) __kmp_dflt_team_nth_ub = __kmp_sys_max_nth; } __kmp_max_nth = __kmp_sys_max_nth; - __kmp_threads_capacity = __kmp_initial_threads_capacity( __kmp_dflt_team_nth_ub ); // Three vars below moved here from __kmp_env_initialize() "KMP_BLOCKTIME" part __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME; @@ -7572,18 +7455,17 @@ __kmp_do_serial_initialize( void ) if ( __kmp_str_match_true( val ) ) { kmp_str_buf_t buffer; __kmp_str_buf_init( & buffer ); - __kmp_i18n_dump_catalog( buffer ); + __kmp_i18n_dump_catalog( & buffer ); __kmp_printf( "%s", buffer.str ); __kmp_str_buf_free( & buffer ); }; // if __kmp_env_free( & val ); #endif + __kmp_threads_capacity = __kmp_initial_threads_capacity( __kmp_dflt_team_nth_ub ); // Moved here from __kmp_env_initialize() "KMP_ALL_THREADPRIVATE" part __kmp_tp_capacity = __kmp_default_tp_capacity(__kmp_dflt_team_nth_ub, __kmp_max_nth, __kmp_allThreadsSpecified); - // omalyshe: This initialisation beats env var setting. - //__kmp_load_balance_interval = 1.0; // If the library is shut down properly, both pools must be NULL. Just in case, set them // to NULL -- some memory may leak, but subsequent code will work even if pools are not freed. @@ -7876,38 +7758,6 @@ __kmp_parallel_initialize( void ) __kmp_print_version_2(); } -#if USE_ITT_BUILD - // Create CSV file to report frames - if( __kmp_forkjoin_frames_mode == 1 ) - { - // Open CSV file to write itt frame information - const char * csv_file; -/* Internal AXE variables - char * host_name = __kmp_env_get("INTEL_MRTE_HOST_NAME"); - char * out_dir = __kmp_env_get("INTEL_MRTE_DATA_DIR");*/ - char * host_name = __kmp_env_get("AMPLXE_HOSTNAME"); - char * out_dir = __kmp_env_get("AMPLXE_DATA_DIR"); - - if( out_dir && host_name ) { - csv_file = __kmp_str_format( "%s/omp-frames-hostname-%s.csv", out_dir, host_name ); - __kmp_itt_csv_file = fopen( csv_file, "w" ); - __kmp_str_free( &csv_file ); - } else { -#ifdef KMP_DEBUG - // Create CSV file in the current dir - csv_file = __kmp_str_format( "./omp-frames-hostname-xxx.csv" ); - __kmp_itt_csv_file = fopen( csv_file, "w" ); - __kmp_str_free( &csv_file ); -#endif - } - if( __kmp_itt_csv_file ) { - __kmp_str_buf_init( & __kmp_itt_frame_buffer ); - __kmp_str_buf_print( & __kmp_itt_frame_buffer, "name,start_tsc.TSC,end_tsc,pid,tid\n" ); - } - } - -#endif /* USE_ITT_BUILD */ - /* we have finished parallel initialization */ TCW_SYNC_4(__kmp_init_parallel, TRUE); @@ -8347,16 +8197,6 @@ __kmp_cleanup( void ) __kmp_i18n_catclose(); -#if USE_ITT_BUILD - // Close CSV file for frames - if( __kmp_forkjoin_frames_mode && __kmp_itt_csv_file ) { - fprintf( __kmp_itt_csv_file, __kmp_itt_frame_buffer.str ); - - __kmp_str_buf_free( & __kmp_itt_frame_buffer ); - fclose( __kmp_itt_csv_file ); - } -#endif /* USE_ITT_BUILD */ - KA_TRACE( 10, ("__kmp_cleanup: exit\n" ) ); } @@ -8576,14 +8416,6 @@ __kmp_aux_set_defaults( * internal fast reduction routines */ -// implementation rev. 0.4 -// AT: determine CPU, and always use 'critical method' if non-Intel -// AT: test loc != NULL -// AT: what to return if lck == NULL -// AT: tune the cut-off point for atomic reduce method -// AT: tune what to return depending on the CPU and platform configuration -// AT: tune what to return depending on team size -// AT: move this function out to kmp_csupport.c PACKED_REDUCTION_METHOD_T __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), @@ -8641,22 +8473,10 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid, #error "Unknown or unsupported OS" #endif // KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN - #elif KMP_ARCH_X86 + #elif KMP_ARCH_X86 || KMP_ARCH_ARM #if KMP_OS_LINUX || KMP_OS_WINDOWS - // similar to win_32 - // 4x1x2 fxqlin04, the 'linear,linear' barrier - - // similar to lin_32 - // 4x1x2 fxqwin04, the 'linear,linear' barrier - - // actual measurement shows that the critical section method is better if team_size <= 8; - // what happenes when team_size > 8 ? ( no machine to test ) - - // TO DO: need to run a 32-bit code on Intel(R) 64 - // TO DO: test the 'hyper,hyper,1,1' barrier - // basic tuning if( atomic_available ) { @@ -8667,7 +8487,6 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid, #elif KMP_OS_DARWIN - if( atomic_available && ( num_vars <= 3 ) ) { retval = atomic_reduce_block; } else if( tree_available ) { @@ -8686,18 +8505,6 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid, } - //AT: TO DO: critical block method not implemented by PAROPT - //if( retval == __kmp_critical_reduce_block ) { - // if( lck == NULL ) { // critical block method not implemented by PAROPT - // } - //} - - // tune what to return depending on the CPU and platform configuration - // (sometimes tree method is slower than critical) - - // probably tune what to return depending on team size - - // KMP_FORCE_REDUCTION if( __kmp_force_reduction_method != reduction_method_not_defined ) { diff --git a/openmp/runtime/src/kmp_settings.c b/openmp/runtime/src/kmp_settings.c index b190cce1486..3a0f6ce80b9 100644 --- a/openmp/runtime/src/kmp_settings.c +++ b/openmp/runtime/src/kmp_settings.c @@ -1,7 +1,7 @@ /* * kmp_settings.c -- Initialize environment variables - * $Revision: 42642 $ - * $Date: 2013-09-06 01:57:24 -0500 (Fri, 06 Sep 2013) $ + * $Revision: 42816 $ + * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $ */ @@ -26,9 +26,6 @@ #include "kmp_io.h" -#define KMP_MAX( x, y ) ( (x) > (y) ? (x) : (y) ) -#define KMP_MIN( x, y ) ( (x) < (y) ? (x) : (y) ) - static int __kmp_env_isDefined( char const * name ); static int __kmp_env_toPrint( char const * name, int flag ); @@ -3915,7 +3912,7 @@ __kmp_stg_parse_lock_kind( char const * name, char const * value, void * data ) || __kmp_str_match( "testandset", 2, value ) ) { __kmp_user_lock_kind = lk_tas; } -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) else if ( __kmp_str_match( "futex", 1, value ) ) { if ( __kmp_futex_determine_capable() ) { __kmp_user_lock_kind = lk_futex; @@ -4322,6 +4319,16 @@ __kmp_stg_print_omp_display_env( kmp_str_buf_t * buffer, char const * name, void } } // __kmp_stg_print_omp_display_env +static void +__kmp_stg_parse_omp_cancellation( char const * name, char const * value, void * data ) { + __kmp_stg_parse_bool( name, value, & __kmp_omp_cancellation ); +} // __kmp_stg_parse_omp_cancellation + +static void +__kmp_stg_print_omp_cancellation( kmp_str_buf_t * buffer, char const * name, void * data ) { + __kmp_stg_print_bool( buffer, name, __kmp_omp_cancellation ); +} // __kmp_stg_print_omp_cancellation + #endif // ------------------------------------------------------------------------------------------------- @@ -4476,6 +4483,7 @@ static kmp_setting_t __kmp_stg_table[] = { # if OMP_40_ENABLED { "OMP_DISPLAY_ENV", __kmp_stg_parse_omp_display_env, __kmp_stg_print_omp_display_env, NULL, 0, 0 }, + { "OMP_CANCELLATION", __kmp_stg_parse_omp_cancellation, __kmp_stg_print_omp_cancellation, NULL, 0, 0 }, #endif { "", NULL, NULL, NULL, 0, 0 } }; // settings diff --git a/openmp/runtime/src/kmp_str.c b/openmp/runtime/src/kmp_str.c index d9b98ab9e30..c1f9e9b6406 100644 --- a/openmp/runtime/src/kmp_str.c +++ b/openmp/runtime/src/kmp_str.c @@ -1,7 +1,7 @@ /* * kmp_str.c -- String manipulation routines. - * $Revision: 42613 $ - * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $ + * $Revision: 42810 $ + * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ */ @@ -329,9 +329,9 @@ void __kmp_str_fname_free( kmp_str_fname_t * fname ) { - __kmp_str_free( const_cast< char const ** >( & fname->path ) ); - __kmp_str_free( const_cast< char const ** >( & fname->dir ) ); - __kmp_str_free( const_cast< char const ** >( & fname->base ) ); + __kmp_str_free( (char const **)( & fname->path ) ); + __kmp_str_free( (char const **)( & fname->dir ) ); + __kmp_str_free( (char const **)( & fname->base ) ); } // kmp_str_fname_free diff --git a/openmp/runtime/src/kmp_stub.c b/openmp/runtime/src/kmp_stub.c index e72b196ef72..c1914f4f570 100644 --- a/openmp/runtime/src/kmp_stub.c +++ b/openmp/runtime/src/kmp_stub.c @@ -1,7 +1,7 @@ /* * kmp_stub.c -- stub versions of user-callable OpenMP RT functions. - * $Revision: 42150 $ - * $Date: 2013-03-15 15:40:38 -0500 (Fri, 15 Mar 2013) $ + * $Revision: 42826 $ + * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $ */ @@ -29,11 +29,32 @@ #include <sys/time.h> #endif +#include "omp.h" // Function renamings. #include "kmp.h" // KMP_DEFAULT_STKSIZE #include "kmp_version.h" -#include "omp.h" // Function renamings. +// Moved from omp.h +#if OMP_30_ENABLED +#define omp_set_max_active_levels ompc_set_max_active_levels +#define omp_set_schedule ompc_set_schedule +#define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num +#define omp_get_team_size ompc_get_team_size + +#endif // OMP_30_ENABLED + +#define omp_set_num_threads ompc_set_num_threads +#define omp_set_dynamic ompc_set_dynamic +#define omp_set_nested ompc_set_nested +#define kmp_set_stacksize kmpc_set_stacksize +#define kmp_set_stacksize_s kmpc_set_stacksize_s +#define kmp_set_blocktime kmpc_set_blocktime +#define kmp_set_library kmpc_set_library +#define kmp_set_defaults kmpc_set_defaults +#define kmp_malloc kmpc_malloc +#define kmp_calloc kmpc_calloc +#define kmp_realloc kmpc_realloc +#define kmp_free kmpc_free static double frequency = 0.0; @@ -243,29 +264,5 @@ double __kmps_get_wtick( void ) { return wtick; }; // __kmps_get_wtick - -/* - These functions are exported from libraries, but not declared in omp,h and omp_lib.f: - - // omalyshe: eight entries below removed from the library (2011-11-22) - kmpc_get_banner - kmpc_get_poolmode - kmpc_get_poolsize - kmpc_get_poolstat - kmpc_poolprint - kmpc_print_banner - kmpc_set_poolmode - kmpc_set_poolsize - - kmpc_set_affinity - kmp_threadprivate_insert - kmp_threadprivate_insert_private_data - VT_getthid - vtgthid - - The list is collected on lin_32. - -*/ - // end of file // diff --git a/openmp/runtime/src/kmp_tasking.c b/openmp/runtime/src/kmp_tasking.c index ea5cdc034af..8cac009b266 100644 --- a/openmp/runtime/src/kmp_tasking.c +++ b/openmp/runtime/src/kmp_tasking.c @@ -1,7 +1,7 @@ /* * kmp_tasking.c -- OpenMP 3.0 tasking support. - * $Revision: 42522 $ - * $Date: 2013-07-16 05:28:49 -0500 (Tue, 16 Jul 2013) $ + * $Revision: 42852 $ + * $Date: 2013-12-04 10:50:49 -0600 (Wed, 04 Dec 2013) $ */ @@ -620,13 +620,28 @@ __kmp_task_finish( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t *resumed_tas #if OMP_40_ENABLED if ( taskdata->td_taskgroup ) KMP_TEST_THEN_DEC32( (kmp_int32 *)(& taskdata->td_taskgroup->count) ); - __kmp_release_deps(gtid,taskdata); + __kmp_release_deps(gtid,taskdata); #endif } KA_TRACE(20, ("__kmp_task_finish: T#%d finished task %p, %d incomplete children\n", gtid, taskdata, children) ); +#if OMP_40_ENABLED + /* If the tasks' destructor thunk flag has been set, we need to invoke the + destructor thunk that has been generated by the compiler. + The code is placed here, since at this point other tasks might have been released + hence overlapping the destructor invokations with some other work in the + released tasks. The OpenMP spec is not specific on when the destructors are + invoked, so we should be free to choose. + */ + if (taskdata->td_flags.destructors_thunk) { + kmp_routine_entry_t destr_thunk = task->destructors; + KMP_ASSERT(destr_thunk); + destr_thunk(gtid, task); + } +#endif // OMP_40_ENABLED + // bookkeeping for resuming task: // GEH - note tasking_ser => task_serial KMP_DEBUG_ASSERT( (taskdata->td_flags.tasking_ser || taskdata->td_flags.task_serial) == @@ -739,10 +754,10 @@ __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr, kmp_team_t *te task->td_flags.complete = 0; task->td_flags.freed = 0; -#if OMP_40_ENABLED +#if OMP_40_ENABLED task->td_dephash = NULL; task->td_depnode = NULL; -#endif +#endif if (set_curr_task) { // only do this initialization the first time a thread is created task->td_incomplete_child_tasks = 0; @@ -850,7 +865,7 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags, taskdata->td_task_id = KMP_GEN_TASK_ID(); taskdata->td_team = team; - taskdata->td_alloc_thread = thread; + taskdata->td_alloc_thread = thread; taskdata->td_parent = parent_task; taskdata->td_level = parent_task->td_level + 1; // increment nesting level taskdata->td_ident = loc_ref; @@ -863,6 +878,9 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags, taskdata->td_flags.tiedness = flags->tiedness; taskdata->td_flags.final = flags->final; taskdata->td_flags.merged_if0 = flags->merged_if0; +#if OMP_40_ENABLED + taskdata->td_flags.destructors_thunk = flags->destructors_thunk; +#endif // OMP_40_ENABLED taskdata->td_flags.tasktype = TASK_EXPLICIT; // GEH - TODO: fix this to copy parent task's value of tasking_ser flag @@ -890,7 +908,7 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags, taskdata->td_taskgroup = parent_task->td_taskgroup; // task inherits the taskgroup from the parent task taskdata->td_dephash = NULL; taskdata->td_depnode = NULL; -#endif +#endif // Only need to keep track of child task counts if team parallel and tasking not serialized if ( !( taskdata -> td_flags.team_serial || taskdata -> td_flags.tasking_ser ) ) { KMP_TEST_THEN_INC32( (kmp_int32 *)(& parent_task->td_incomplete_child_tasks) ); @@ -946,24 +964,46 @@ static void __kmp_invoke_task( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t * current_task ) { kmp_taskdata_t * taskdata = KMP_TASK_TO_TASKDATA(task); +#if OMP_40_ENABLED + int discard = 0 /* false */; +#endif KA_TRACE(30, ("__kmp_invoke_task(enter): T#%d invoking task %p, current_task=%p\n", gtid, taskdata, current_task) ); __kmp_task_start( gtid, task, current_task ); +#if OMP_40_ENABLED + // TODO: cancel tasks if the parallel region has also been cancelled + // TODO: check if this sequence can be hoisted above __kmp_task_start + // if cancellation has been enabled for this run ... + if (__kmp_omp_cancellation) { + kmp_info_t *this_thr = __kmp_threads [ gtid ]; + kmp_team_t * this_team = this_thr->th.th_team; + kmp_taskgroup_t * taskgroup = taskdata->td_taskgroup; + if ((taskgroup && taskgroup->cancel_request) || (this_team->t.t_cancel_request == cancel_parallel)) { + // this task belongs to a task group and we need to cancel it + discard = 1 /* true */; + } + } + // // Invoke the task routine and pass in relevant data. // Thunks generated by gcc take a different argument list. // + if (!discard) { +#endif // OMP_40_ENABLED #ifdef KMP_GOMP_COMPAT - if (taskdata->td_flags.native) { - ((void (*)(void *))(*(task->routine)))(task->shareds); - } - else + if (taskdata->td_flags.native) { + ((void (*)(void *))(*(task->routine)))(task->shareds); + } + else #endif /* KMP_GOMP_COMPAT */ - { - (*(task->routine))(gtid, task); + { + (*(task->routine))(gtid, task); + } +#if OMP_40_ENABLED } +#endif // OMP_40_ENABLED __kmp_task_finish( gtid, task, current_task ); @@ -1079,10 +1119,8 @@ __kmpc_omp_taskwait( ident_t *loc_ref, kmp_int32 gtid ) // GEH: if team serialized, avoid reading the volatile variable below. while ( TCR_4(taskdata -> td_incomplete_child_tasks) != 0 ) { __kmp_execute_tasks( thread, gtid, &(taskdata->td_incomplete_child_tasks), - 0, FALSE, &thread_finished, -#if USE_ITT_BUILD - itt_sync_obj, -#endif /* USE_ITT_BUILD */ + 0, FALSE, &thread_finished + USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint ); } } @@ -1134,10 +1172,8 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part ) __kmp_itt_taskwait_starting( gtid, itt_sync_obj ); #endif /* USE_ITT_BUILD */ if ( ! taskdata->td_flags.team_serial ) { - __kmp_execute_tasks( thread, gtid, NULL, 0, FALSE, &thread_finished, -#if USE_ITT_BUILD - itt_sync_obj, -#endif /* USE_ITT_BUILD */ + __kmp_execute_tasks( thread, gtid, NULL, 0, FALSE, &thread_finished + USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint ); } @@ -1162,7 +1198,7 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part ) // __kmpc_taskgroup: Start a new taskgroup void -__kmpc_taskgroup( ident* loc, int gtid ) +__kmpc_taskgroup( ident_t* loc, int gtid ) { kmp_info_t * thread = __kmp_threads[ gtid ]; kmp_taskdata_t * taskdata = thread->th.th_current_task; @@ -1170,6 +1206,7 @@ __kmpc_taskgroup( ident* loc, int gtid ) (kmp_taskgroup_t *)__kmp_thread_malloc( thread, sizeof( kmp_taskgroup_t ) ); KA_TRACE(10, ("__kmpc_taskgroup: T#%d loc=%p group=%p\n", gtid, loc, tg_new) ); tg_new->count = 0; + tg_new->cancel_request = cancel_noreq; tg_new->parent = taskdata->td_taskgroup; taskdata->td_taskgroup = tg_new; } @@ -1180,7 +1217,7 @@ __kmpc_taskgroup( ident* loc, int gtid ) // and its descendants are complete void -__kmpc_end_taskgroup( ident* loc, int gtid ) +__kmpc_end_taskgroup( ident_t* loc, int gtid ) { kmp_info_t * thread = __kmp_threads[ gtid ]; kmp_taskdata_t * taskdata = thread->th.th_current_task; @@ -1201,10 +1238,8 @@ __kmpc_end_taskgroup( ident* loc, int gtid ) if ( ! taskdata->td_flags.team_serial ) { while ( TCR_4(taskgroup->count) != 0 ) { __kmp_execute_tasks( thread, gtid, &(taskgroup->count), - 0, FALSE, &thread_finished, -#if USE_ITT_BUILD - itt_sync_obj, -#endif /* USE_ITT_BUILD */ + 0, FALSE, &thread_finished + USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint ); } } @@ -1420,15 +1455,13 @@ __kmp_steal_task( kmp_info_t *victim, kmp_int32 gtid, kmp_task_team_t *task_team // checker is the value to check to terminate the spin. int -__kmp_execute_tasks( kmp_info_t *thread, - kmp_int32 gtid, +__kmp_execute_tasks( kmp_info_t *thread, + kmp_int32 gtid, volatile kmp_uint *spinner, kmp_uint checker, - int final_spin, - int *thread_finished, -#if USE_ITT_BUILD - void * itt_sync_obj, -#endif /* USE_ITT_BUILD */ + int final_spin, + int *thread_finished + USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained ) { kmp_task_team_t * task_team; @@ -2297,11 +2330,9 @@ __kmp_task_team_sync( kmp_info_t *this_thr, kmp_team_t *team ) // in team > 1 ! void -__kmp_task_team_wait( kmp_info_t *this_thr, +__kmp_task_team_wait( kmp_info_t *this_thr, kmp_team_t *team -#if USE_ITT_BUILD - , void * itt_sync_obj -#endif /* USE_ITT_BUILD */ + USE_ITT_BUILD_ARG(void * itt_sync_obj) ) { kmp_task_team_t *task_team = team->t.t_task_team; @@ -2320,9 +2351,7 @@ __kmp_task_team_wait( kmp_info_t *this_thr, // termination condition. // __kmp_wait_sleep( this_thr, &task_team->tt.tt_unfinished_threads, 0, TRUE -#if USE_ITT_BUILD - , itt_sync_obj -#endif /* USE_ITT_BUILD */ + USE_ITT_BUILD_ARG(itt_sync_obj) ); // @@ -2361,7 +2390,8 @@ __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gtid ) #if USE_ITT_BUILD KMP_FSYNC_SPIN_INIT( spin, (kmp_uint32*) NULL ); #endif /* USE_ITT_BUILD */ - while (! __kmp_execute_tasks( thread, gtid, spin, 0, TRUE, &flag, NULL ) ) { + while (! __kmp_execute_tasks( thread, gtid, spin, 0, TRUE, &flag + USE_ITT_BUILD_ARG(NULL), 0 ) ) { #if USE_ITT_BUILD // TODO: What about itt_sync_obj?? KMP_FSYNC_SPIN_PREPARE( spin ); diff --git a/openmp/runtime/src/kmp_version.c b/openmp/runtime/src/kmp_version.c index 0beb824803a..5d0de7716c0 100644 --- a/openmp/runtime/src/kmp_version.c +++ b/openmp/runtime/src/kmp_version.c @@ -1,7 +1,7 @@ /* * kmp_version.c - * $Revision: 42594 $ - * $Date: 2013-08-16 04:14:33 -0500 (Fri, 16 Aug 2013) $ + * $Revision: 42806 $ + * $Date: 2013-11-05 16:16:45 -0600 (Tue, 05 Nov 2013) $ */ @@ -27,7 +27,7 @@ #define stringer( x ) _stringer( x ) // Detect compiler. -#ifdef __INTEL_COMPILER +#if KMP_COMPILER_ICC #if __INTEL_COMPILER == 1010 #define KMP_COMPILER "Intel C++ Compiler 10.1" #elif __INTEL_COMPILER == 1100 @@ -49,7 +49,9 @@ #elif __INTEL_COMPILER == 9999 #define KMP_COMPILER "Intel C++ Compiler mainline" #endif -#elif defined( __GNUC__ ) +#elif KMP_COMPILER_CLANG + #define KMP_COMPILER "Clang " stringer( __clang_major__ ) "." stringer( __clang_minor__ ) +#elif KMP_COMPILER_GCC #define KMP_COMPILER "GCC " stringer( __GNUC__ ) "." stringer( __GNUC_MINOR__ ) #endif #ifndef KMP_COMPILER diff --git a/openmp/runtime/src/makefile.mk b/openmp/runtime/src/makefile.mk index d7c826685e7..8185e78736b 100644 --- a/openmp/runtime/src/makefile.mk +++ b/openmp/runtime/src/makefile.mk @@ -1,6 +1,6 @@ # makefile.mk # -# $Revision: 42661 $ -# $Date: 2013-09-12 11:37:13 -0500 (Thu, 12 Sep 2013) $ +# $Revision: 42820 $ +# $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $ # #//===----------------------------------------------------------------------===// @@ -37,7 +37,7 @@ inc_dir = $(LIBOMP_WORK)src/include/$(OMP_VERSION)/ # -------------------------------------------------------------------------------------------------- # Build compiler -BUILD_COMPILER := $(call check_variable,BUILD_COMPILER,icc gcc icl icl.exe) +BUILD_COMPILER := $(call check_variable,BUILD_COMPILER,icc gcc clang icl icl.exe) # Distribution type: com (commercial) or oss (open-source) DISTRIBUTION := $(call check_variable,DISTRIBUTION,com oss) @@ -161,6 +161,18 @@ ifeq "$(c)" "gcc" endif endif +ifeq "$(c)" "clang" + c-flags += -Wno-unused-value -Wno-switch + cxx-flags += -Wno-unused-value -Wno-switch + ifeq "$(arch)" "32" + c-flags += -m32 -msse + cxx-flags += -m32 -msse + fort-flags += -m32 -msse + ld-flags += -m32 -msse + as-flags += -m32 -msse + endif +endif + ifeq "$(LINK_TYPE)" "dyna" # debug-info ifeq "$(os)" "win" @@ -186,7 +198,7 @@ ifeq "$(os)" "win" endif # Enable saving compiler options and version in object files and libraries. -ifneq "$(c)" "gcc" +ifeq "$(filter gcc clang,$(c))" "" ifeq "$(os)" "win" # Newer MS linker issues warnings if -Qsox is used: # "warning LNK4224: /COMMENT is no longer supported; ignored" @@ -231,24 +243,17 @@ endif # Disable use of EBP as general purpose register. ifeq "$(os)" "win" ifeq "$(arch)" "32" - # ??? In original makefile, this option was specified only in debug builds. - # Compare with Linux* OS/OS X* -fno-omit-frame-pointer, which defined always. c-flags += -Oy- cxx-flags += -Oy- endif -else - ifneq "$(arch)" "64" - c-flags += -fno-omit-frame-pointer - cxx-flags += -fno-omit-frame-pointer - endif endif ifeq "$(os)" "lin" c-flags += -Wsign-compare cxx-flags += -Wsign-compare ld-flags += -Wsign-compare - ifneq "$(c)" "gcc" - c-flags += -Werror + ifeq "$(filter gcc clang,$(c))" "" + c-flags += -Werror cxx-flags += -Werror ld-flags += -Werror endif @@ -306,7 +311,7 @@ ifeq "$(CPLUSPLUS)" "on" ifeq "$(os)" "win" c-flags += -TP else - ifeq "$(c)" "gcc" + ifneq "$(filter gcc clang,$(c))" "" c-flags += -x c++ -std=c++0x else c-flags += -Kc++ @@ -352,12 +357,18 @@ ifeq "$(os)" "lin" ld-flags-dll += -static-libgcc ld-flags-extra += -Wl,-ldl endif + ifeq "$(c)" "clang" + ld-flags-extra += -Wl,-ldl + endif ifeq "$(arch)" "32" - ifneq "$(c)" "gcc" + ifeq "$(filter gcc clang,$(c))" "" # to workaround CQ215229 link libirc_pic manually ld-flags-extra += -lirc_pic endif endif + ifeq "$(filter 32 32e 64,$(arch))" "" + ld-flags-extra += $(shell pkg-config --libs libffi) + endif else ifeq "$(arch)" "32e" # ??? @@ -452,13 +463,13 @@ cpp-flags += -D KMP_VERSION_MAJOR=$(VERSION) cpp-flags += -D CACHE_LINE=64 cpp-flags += -D KMP_ADJUST_BLOCKTIME=1 cpp-flags += -D BUILD_PARALLEL_ORDERED +cpp-flags += -D KMP_ASM_INTRINS ifneq "$(os)" "lrb" cpp-flags += -D USE_LOAD_BALANCE endif ifneq "$(os)" "win" cpp-flags += -D USE_CBLKDATA # ??? Windows* OS: USE_CBLKDATA defined in kmp.h. - cpp-flags += -D KMP_ASM_INTRINS endif ifeq "$(os)" "win" cpp-flags += -D KMP_WIN_CDECL @@ -477,22 +488,42 @@ else # 5 endif endif +ifneq "$(filter 32 32e,$(arch))" "" cpp-flags += -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0 +endif -# define compatibility with OMP 3.0 +# define compatibility with different OpenMP versions +have_omp_50=0 +have_omp_41=0 +have_omp_40=0 +have_omp_30=0 +ifeq "$(OMP_VERSION)" "50" + have_omp_50=1 + have_omp_41=1 + have_omp_40=1 + have_omp_30=1 +endif +ifeq "$(OMP_VERSION)" "41" + have_omp_50=0 + have_omp_41=1 + have_omp_40=1 + have_omp_30=1 +endif ifeq "$(OMP_VERSION)" "40" - cpp-flags += -D OMP_40_ENABLED=1 - cpp-flags += -D OMP_30_ENABLED=1 -else - ifeq "$(OMP_VERSION)" "30" - cpp-flags += -D OMP_40_ENABLED=0 - cpp-flags += -D OMP_30_ENABLED=1 - else - cpp-flags += -D OMP_40_ENABLED=0 - cpp-flags += -D OMP_30_ENABLED=0 - # TODO: Check OMP_30_ENABLED == 0 is processed correctly. - endif + have_omp_50=0 + have_omp_41=0 + have_omp_40=1 + have_omp_30=1 +endif +ifeq "$(OMP_VERSION)" "30" + have_omp_50=0 + have_omp_41=0 + have_omp_40=0 + have_omp_30=1 endif +cpp-flags += -D OMP_50_ENABLED=$(have_omp_50) -D OMP_41_ENABLED=$(have_omp_41) +cpp-flags += -D OMP_40_ENABLED=$(have_omp_40) -D OMP_30_ENABLED=$(have_omp_30) + # Using ittnotify is enabled by default. USE_ITT_NOTIFY = 1 @@ -541,8 +572,13 @@ endif # only one, target architecture). So we cannot autodetect target architecture # within the file, and have to pass target architecture from command line. ifneq "$(os)" "win" - z_Linux_asm$(obj) : \ - cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64) + ifeq "$(arch)" "arm" + z_Linux_asm$(obj) : \ + cpp-flags += -D KMP_ARCH_ARM + else + z_Linux_asm$(obj) : \ + cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64) + endif endif # Defining KMP_BUILD_DATE for all files leads to warning "incompatible redefinition", because the @@ -606,7 +642,6 @@ ld-flags += $(LDFLAGS) lib_c_items := \ kmp_ftn_cdecl \ kmp_ftn_extra \ - kmp_ftn_stdcall \ kmp_version \ $(empty) lib_cpp_items := @@ -653,6 +688,7 @@ else # norm or prof ifeq "$(OMP_VERSION)" "40" lib_cpp_items += kmp_taskdeps + lib_cpp_items += kmp_cancel endif # OS-specific files. @@ -1214,7 +1250,9 @@ ifneq "$(os)" "lrb" tt-c-flags += -pthread endif tt-c-flags += -o $(tt-exe-file) - tt-c-flags += $(if $(filter 64,$(arch)),,$(if $(filter 32,$(arch)),-m32,-m64)) + ifneq "$(filter 32 32e 64,$(arch))" "" + tt-c-flags += $(if $(filter 64,$(arch)),,$(if $(filter 32,$(arch)),-m32,-m64)) + endif tt-libs += $(lib_file) ifeq "$(os)-$(COVERAGE)-$(LINK_TYPE)" "lin-on-stat" # Static coverage build on Linux* OS fails due to unresolved symbols dlopen, dlsym, dlclose. @@ -1343,8 +1381,16 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" "" ifeq "$(arch)" "64" td_exp += libc.so.6.1 endif + ifeq "$(arch)" "arm" + td_exp += libc.so.6 + td_exp += ld-linux-armhf.so.3 + endif td_exp += libdl.so.2 td_exp += libgcc_s.so.1 + ifeq "$(filter 32 32e 64,$(arch))" "" + td_exp += libffi.so.6 + td_exp += libffi.so.5 + endif ifneq "$(LIB_TYPE)" "stub" td_exp += libpthread.so.0 endif diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h index 9cc398c0b0e..9df6e2f3980 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h +++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h @@ -109,12 +109,18 @@ The same ID may not be reused for different instances, unless a previous # define ITT_PLATFORM_POSIX 2 #endif /* ITT_PLATFORM_POSIX */ +#ifndef ITT_PLATFORM_MAC +# define ITT_PLATFORM_MAC 3 +#endif /* ITT_PLATFORM_MAC */ + #ifndef ITT_PLATFORM # if ITT_OS==ITT_OS_WIN # define ITT_PLATFORM ITT_PLATFORM_WIN +# elif ITT_OS==ITT_OS_MAC +# define ITT_PLATFORM ITT_PLATFORM_MAC # else # define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif /* _WIN32 */ +# endif #endif /* ITT_PLATFORM */ #if defined(_UNICODE) && !defined(UNICODE) @@ -135,11 +141,11 @@ The same ID may not be reused for different instances, unless a previous # if ITT_PLATFORM==ITT_PLATFORM_WIN # define CDECL __cdecl # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define CDECL /* not actual on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define CDECL __attribute__ ((cdecl)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define CDECL /* actual only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* CDECL */ @@ -147,11 +153,11 @@ The same ID may not be reused for different instances, unless a previous # if ITT_PLATFORM==ITT_PLATFORM_WIN # define STDCALL __stdcall # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define STDCALL /* not supported on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define STDCALL __attribute__ ((stdcall)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define STDCALL /* supported only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* STDCALL */ @@ -164,8 +170,8 @@ The same ID may not be reused for different instances, unless a previous #if ITT_PLATFORM==ITT_PLATFORM_WIN /* use __forceinline (VC++ specific) */ -#define INLINE __forceinline -#define INLINE_ATTRIBUTE /* nothing */ +#define ITT_INLINE __forceinline +#define ITT_INLINE_ATTRIBUTE /* nothing */ #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /* * Generally, functions are not inlined unless optimization is specified. @@ -173,11 +179,11 @@ The same ID may not be reused for different instances, unless a previous * if no optimization level was specified. */ #ifdef __STRICT_ANSI__ -#define INLINE static +#define ITT_INLINE static #else /* __STRICT_ANSI__ */ -#define INLINE static inline +#define ITT_INLINE static inline #endif /* __STRICT_ANSI__ */ -#define INLINE_ATTRIBUTE __attribute__ ((always_inline)) +#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused)) #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /** @endcond */ @@ -398,6 +404,128 @@ ITT_STUBV(ITTAPI, void, thread_ignore, (void)) /** @} threads group */ /** + * @defgroup suppress Error suppression + * @ingroup public + * General behavior: application continues to run, but errors are suppressed + * + * @{ + */ + +/*****************************************************************//** + * @name group of functions used for error suppression in correctness tools + *********************************************************************/ +/** @{ */ +/** + * @hideinitializer + * @brief possible value for suppression mask + */ +#define __itt_suppress_all_errors 0x7fffffff + +/** + * @hideinitializer + * @brief possible value for suppression mask (suppresses errors from threading analysis) + */ +#define __itt_suppress_threading_errors 0x000000ff + +/** + * @hideinitializer + * @brief possible value for suppression mask (suppresses errors from memory analysis) + */ +#define __itt_suppress_memory_errors 0x0000ff00 + +/** + * @brief Start suppressing errors identified in mask on this thread + */ +void ITTAPI __itt_suppress_push(unsigned int mask); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask)) +#define __itt_suppress_push ITTNOTIFY_VOID(suppress_push) +#define __itt_suppress_push_ptr ITTNOTIFY_NAME(suppress_push) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_suppress_push(mask) +#define __itt_suppress_push_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_suppress_push_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** + * @brief Undo the effects of the matching call to __itt_suppress_push + */ +void ITTAPI __itt_suppress_pop(void); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, suppress_pop, (void)) +#define __itt_suppress_pop ITTNOTIFY_VOID(suppress_pop) +#define __itt_suppress_pop_ptr ITTNOTIFY_NAME(suppress_pop) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_suppress_pop() +#define __itt_suppress_pop_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_suppress_pop_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** + * @enum __itt_model_disable + * @brief Enumerator for the disable methods + */ +typedef enum __itt_suppress_mode { + __itt_unsuppress_range, + __itt_suppress_range +} __itt_suppress_mode_t; + +/** + * @brief Mark a range of memory for error suppression or unsuppression for error types included in mask + */ +void ITTAPI __itt_suppress_mark_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size)) +#define __itt_suppress_mark_range ITTNOTIFY_VOID(suppress_mark_range) +#define __itt_suppress_mark_range_ptr ITTNOTIFY_NAME(suppress_mark_range) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_suppress_mark_range(mask) +#define __itt_suppress_mark_range_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_suppress_mark_range_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** + * @brief Undo the effect of a matching call to __itt_suppress_mark_range. If not matching + * call is found, nothing is changed. + */ +void ITTAPI __itt_suppress_clear_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, suppress_clear_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size)) +#define __itt_suppress_clear_range ITTNOTIFY_VOID(suppress_clear_range) +#define __itt_suppress_clear_range_ptr ITTNOTIFY_NAME(suppress_clear_range) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_suppress_clear_range(mask) +#define __itt_suppress_clear_range_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_suppress_clear_range_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ +/** @} */ +/** @} suppress group */ + +/** * @defgroup sync Synchronization * @ingroup public * Indicate user-written synchronization code @@ -820,8 +948,10 @@ void ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_inst #if ITT_PLATFORM==ITT_PLATFORM_WIN void ITTAPI __itt_model_site_beginW(const wchar_t *name); #endif +void ITTAPI __itt_model_site_beginA(const char *name); void ITTAPI __itt_model_site_beginAL(const char *name, size_t siteNameLen); void ITTAPI __itt_model_site_end (__itt_model_site *site, __itt_model_site_instance *instance); +void ITTAPI __itt_model_site_end_2(void); /** @cond exclude_from_documentation */ #ifndef INTEL_NO_MACRO_BODY @@ -830,18 +960,24 @@ ITT_STUBV(ITTAPI, void, model_site_begin, (__itt_model_site *site, __itt_model_ #if ITT_PLATFORM==ITT_PLATFORM_WIN ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name)) #endif +ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name)) ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t siteNameLen)) ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_site_instance *instance)) +ITT_STUBV(ITTAPI, void, model_site_end_2, (void)) #define __itt_model_site_begin ITTNOTIFY_VOID(model_site_begin) #define __itt_model_site_begin_ptr ITTNOTIFY_NAME(model_site_begin) #if ITT_PLATFORM==ITT_PLATFORM_WIN #define __itt_model_site_beginW ITTNOTIFY_VOID(model_site_beginW) #define __itt_model_site_beginW_ptr ITTNOTIFY_NAME(model_site_beginW) #endif +#define __itt_model_site_beginA ITTNOTIFY_VOID(model_site_beginA) +#define __itt_model_site_beginA_ptr ITTNOTIFY_NAME(model_site_beginA) #define __itt_model_site_beginAL ITTNOTIFY_VOID(model_site_beginAL) #define __itt_model_site_beginAL_ptr ITTNOTIFY_NAME(model_site_beginAL) #define __itt_model_site_end ITTNOTIFY_VOID(model_site_end) #define __itt_model_site_end_ptr ITTNOTIFY_NAME(model_site_end) +#define __itt_model_site_end_2 ITTNOTIFY_VOID(model_site_end_2) +#define __itt_model_site_end_2_ptr ITTNOTIFY_NAME(model_site_end_2) #else /* INTEL_NO_ITTNOTIFY_API */ #define __itt_model_site_begin(site, instance, name) #define __itt_model_site_begin_ptr 0 @@ -849,18 +985,24 @@ ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_ #define __itt_model_site_beginW(name) #define __itt_model_site_beginW_ptr 0 #endif +#define __itt_model_site_beginA(name) +#define __itt_model_site_beginA_ptr 0 #define __itt_model_site_beginAL(name, siteNameLen) #define __itt_model_site_beginAL_ptr 0 #define __itt_model_site_end(site, instance) #define __itt_model_site_end_ptr 0 +#define __itt_model_site_end_2() +#define __itt_model_site_end_2_ptr 0 #endif /* INTEL_NO_ITTNOTIFY_API */ #else /* INTEL_NO_MACRO_BODY */ #define __itt_model_site_begin_ptr 0 #if ITT_PLATFORM==ITT_PLATFORM_WIN #define __itt_model_site_beginW_ptr 0 #endif +#define __itt_model_site_beginA_ptr 0 #define __itt_model_site_beginAL_ptr 0 #define __itt_model_site_end_ptr 0 +#define __itt_model_site_end_2_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ @@ -878,9 +1020,14 @@ ITT_STUBV(ITTAPI, void, model_site_end, (__itt_model_site *site, __itt_model_ void ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name); #if ITT_PLATFORM==ITT_PLATFORM_WIN void ITTAPI __itt_model_task_beginW(const wchar_t *name); +void ITTAPI __itt_model_iteration_taskW(const wchar_t *name); #endif +void ITTAPI __itt_model_task_beginA(const char *name); void ITTAPI __itt_model_task_beginAL(const char *name, size_t taskNameLen); +void ITTAPI __itt_model_iteration_taskA(const char *name); +void ITTAPI __itt_model_iteration_taskAL(const char *name, size_t taskNameLen); void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_instance *instance); +void ITTAPI __itt_model_task_end_2(void); /** @cond exclude_from_documentation */ #ifndef INTEL_NO_MACRO_BODY @@ -888,19 +1035,34 @@ void ITTAPI __itt_model_task_end (__itt_model_task *task, __itt_model_task_inst ITT_STUBV(ITTAPI, void, model_task_begin, (__itt_model_task *task, __itt_model_task_instance *instance, const char *name)) #if ITT_PLATFORM==ITT_PLATFORM_WIN ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name)) +ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name)) #endif +ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name)) ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t taskNameLen)) +ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name)) +ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t taskNameLen)) ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_task_instance *instance)) +ITT_STUBV(ITTAPI, void, model_task_end_2, (void)) #define __itt_model_task_begin ITTNOTIFY_VOID(model_task_begin) #define __itt_model_task_begin_ptr ITTNOTIFY_NAME(model_task_begin) #if ITT_PLATFORM==ITT_PLATFORM_WIN #define __itt_model_task_beginW ITTNOTIFY_VOID(model_task_beginW) #define __itt_model_task_beginW_ptr ITTNOTIFY_NAME(model_task_beginW) +#define __itt_model_iteration_taskW ITTNOTIFY_VOID(model_iteration_taskW) +#define __itt_model_iteration_taskW_ptr ITTNOTIFY_NAME(model_iteration_taskW) #endif +#define __itt_model_task_beginA ITTNOTIFY_VOID(model_task_beginA) +#define __itt_model_task_beginA_ptr ITTNOTIFY_NAME(model_task_beginA) #define __itt_model_task_beginAL ITTNOTIFY_VOID(model_task_beginAL) #define __itt_model_task_beginAL_ptr ITTNOTIFY_NAME(model_task_beginAL) +#define __itt_model_iteration_taskA ITTNOTIFY_VOID(model_iteration_taskA) +#define __itt_model_iteration_taskA_ptr ITTNOTIFY_NAME(model_iteration_taskA) +#define __itt_model_iteration_taskAL ITTNOTIFY_VOID(model_iteration_taskAL) +#define __itt_model_iteration_taskAL_ptr ITTNOTIFY_NAME(model_iteration_taskAL) #define __itt_model_task_end ITTNOTIFY_VOID(model_task_end) #define __itt_model_task_end_ptr ITTNOTIFY_NAME(model_task_end) +#define __itt_model_task_end_2 ITTNOTIFY_VOID(model_task_end_2) +#define __itt_model_task_end_2_ptr ITTNOTIFY_NAME(model_task_end_2) #else /* INTEL_NO_ITTNOTIFY_API */ #define __itt_model_task_begin(task, instance, name) #define __itt_model_task_begin_ptr 0 @@ -908,18 +1070,30 @@ ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_ #define __itt_model_task_beginW(name) #define __itt_model_task_beginW_ptr 0 #endif +#define __itt_model_task_beginA(name) +#define __itt_model_task_beginA_ptr 0 #define __itt_model_task_beginAL(name, siteNameLen) #define __itt_model_task_beginAL_ptr 0 +#define __itt_model_iteration_taskA(name) +#define __itt_model_iteration_taskA_ptr 0 +#define __itt_model_iteration_taskAL(name, siteNameLen) +#define __itt_model_iteration_taskAL_ptr 0 #define __itt_model_task_end(task, instance) #define __itt_model_task_end_ptr 0 +#define __itt_model_task_end_2() +#define __itt_model_task_end_2_ptr 0 #endif /* INTEL_NO_ITTNOTIFY_API */ #else /* INTEL_NO_MACRO_BODY */ #define __itt_model_task_begin_ptr 0 #if ITT_PLATFORM==ITT_PLATFORM_WIN #define __itt_model_task_beginW_ptr 0 #endif +#define __itt_model_task_beginA_ptr 0 #define __itt_model_task_beginAL_ptr 0 +#define __itt_model_iteration_taskA_ptr 0 +#define __itt_model_iteration_taskAL_ptr 0 #define __itt_model_task_end_ptr 0 +#define __itt_model_task_end_2_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ @@ -936,26 +1110,40 @@ ITT_STUBV(ITTAPI, void, model_task_end, (__itt_model_task *task, __itt_model_ * but may not have identical semantics.) */ void ITTAPI __itt_model_lock_acquire(void *lock); +void ITTAPI __itt_model_lock_acquire_2(void *lock); void ITTAPI __itt_model_lock_release(void *lock); +void ITTAPI __itt_model_lock_release_2(void *lock); /** @cond exclude_from_documentation */ #ifndef INTEL_NO_MACRO_BODY #ifndef INTEL_NO_ITTNOTIFY_API ITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock)) +ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock)) ITT_STUBV(ITTAPI, void, model_lock_release, (void *lock)) +ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock)) #define __itt_model_lock_acquire ITTNOTIFY_VOID(model_lock_acquire) #define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire) +#define __itt_model_lock_acquire_2 ITTNOTIFY_VOID(model_lock_acquire_2) +#define __itt_model_lock_acquire_2_ptr ITTNOTIFY_NAME(model_lock_acquire_2) #define __itt_model_lock_release ITTNOTIFY_VOID(model_lock_release) #define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release) +#define __itt_model_lock_release_2 ITTNOTIFY_VOID(model_lock_release_2) +#define __itt_model_lock_release_2_ptr ITTNOTIFY_NAME(model_lock_release_2) #else /* INTEL_NO_ITTNOTIFY_API */ #define __itt_model_lock_acquire(lock) #define __itt_model_lock_acquire_ptr 0 +#define __itt_model_lock_acquire_2(lock) +#define __itt_model_lock_acquire_2_ptr 0 #define __itt_model_lock_release(lock) #define __itt_model_lock_release_ptr 0 +#define __itt_model_lock_release_2(lock) +#define __itt_model_lock_release_2_ptr 0 #endif /* INTEL_NO_ITTNOTIFY_API */ #else /* INTEL_NO_MACRO_BODY */ #define __itt_model_lock_acquire_ptr 0 +#define __itt_model_lock_acquire_2_ptr 0 #define __itt_model_lock_release_ptr 0 +#define __itt_model_lock_release_2_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ @@ -1104,25 +1292,32 @@ ITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr)) */ void ITTAPI __itt_model_disable_push(__itt_model_disable x); void ITTAPI __itt_model_disable_pop(void); +void ITTAPI __itt_model_aggregate_task(size_t x); /** @cond exclude_from_documentation */ #ifndef INTEL_NO_MACRO_BODY #ifndef INTEL_NO_ITTNOTIFY_API ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x)) ITT_STUBV(ITTAPI, void, model_disable_pop, (void)) +ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t x)) #define __itt_model_disable_push ITTNOTIFY_VOID(model_disable_push) #define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push) #define __itt_model_disable_pop ITTNOTIFY_VOID(model_disable_pop) #define __itt_model_disable_pop_ptr ITTNOTIFY_NAME(model_disable_pop) +#define __itt_model_aggregate_task ITTNOTIFY_VOID(model_aggregate_task) +#define __itt_model_aggregate_task_ptr ITTNOTIFY_NAME(model_aggregate_task) #else /* INTEL_NO_ITTNOTIFY_API */ #define __itt_model_disable_push(x) #define __itt_model_disable_push_ptr 0 #define __itt_model_disable_pop() #define __itt_model_disable_pop_ptr 0 +#define __itt_model_aggregate_task(x) +#define __itt_model_aggregate_task_ptr 0 #endif /* INTEL_NO_ITTNOTIFY_API */ #else /* INTEL_NO_MACRO_BODY */ #define __itt_model_disable_push_ptr 0 #define __itt_model_disable_pop_ptr 0 +#define __itt_model_aggregate_task_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ /** @} model group */ @@ -1348,9 +1543,97 @@ ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void)) #define __itt_heap_internal_access_end_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ -/** @} heap group */ + +/** @brief record memory growth begin */ +void ITTAPI __itt_heap_record_memory_growth_begin(void); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void)) +#define __itt_heap_record_memory_growth_begin ITTNOTIFY_VOID(heap_record_memory_growth_begin) +#define __itt_heap_record_memory_growth_begin_ptr ITTNOTIFY_NAME(heap_record_memory_growth_begin) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_heap_record_memory_growth_begin() +#define __itt_heap_record_memory_growth_begin_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_heap_record_memory_growth_begin_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** @brief record memory growth end */ +void ITTAPI __itt_heap_record_memory_growth_end(void); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void)) +#define __itt_heap_record_memory_growth_end ITTNOTIFY_VOID(heap_record_memory_growth_end) +#define __itt_heap_record_memory_growth_end_ptr ITTNOTIFY_NAME(heap_record_memory_growth_end) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_heap_record_memory_growth_end() +#define __itt_heap_record_memory_growth_end_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_heap_record_memory_growth_end_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ +/** + * @brief Specify the type of heap detection/reporting to modify. + */ +/** + * @hideinitializer + * @brief Report on memory leaks. + */ +#define __itt_heap_leaks 0x00000001 + +/** + * @hideinitializer + * @brief Report on memory growth. + */ +#define __itt_heap_growth 0x00000002 + + +/** @brief heap reset detection */ +void ITTAPI __itt_heap_reset_detection(unsigned int reset_mask); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask)) +#define __itt_heap_reset_detection ITTNOTIFY_VOID(heap_reset_detection) +#define __itt_heap_reset_detection_ptr ITTNOTIFY_NAME(heap_reset_detection) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_heap_reset_detection() +#define __itt_heap_reset_detection_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_heap_reset_detection_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** @brief report */ +void ITTAPI __itt_heap_record(unsigned int record_mask); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask)) +#define __itt_heap_record ITTNOTIFY_VOID(heap_record) +#define __itt_heap_record_ptr ITTNOTIFY_NAME(heap_record) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_heap_record() +#define __itt_heap_record_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_heap_record_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** @} heap group */ +/** @endcond */ /* ========================================================================== */ /** @@ -1475,8 +1758,8 @@ static const __itt_id __itt_null = { 0, 0, 0 }; * @param[in] extra The extra data to unique identify object; low QWORD of the ID value. */ -INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) INLINE_ATTRIBUTE; -INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) +ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE; +ITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) { __itt_id id = __itt_null; id.d1 = (unsigned long long)((uintptr_t)addr); @@ -1633,6 +1916,40 @@ ITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create, (const char *na /** @endcond */ /** @} handles group */ +/** @cond exclude_from_documentation */ +typedef unsigned long long __itt_timestamp; +/** @endcond */ + +static const __itt_timestamp __itt_timestamp_none = (__itt_timestamp)-1LL; + +/** @cond exclude_from_gpa_documentation */ + +/** + * @ingroup timestamps + * @brief Return timestamp corresponding to current moment. + * This returns the timestamp in format that is most relevant for the current + * host or platform. Do not rely that it's RDTSC value. It is possible + * to compare __itt_timestamp values with "<" operator. + */ +__itt_timestamp ITTAPI __itt_get_timestamp(void); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void)) +#define __itt_get_timestamp ITTNOTIFY_DATA(get_timestamp) +#define __itt_get_timestamp_ptr ITTNOTIFY_NAME(get_timestamp) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_get_timestamp() +#define __itt_get_timestamp_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_get_timestamp_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ +/** @} timestamps */ +/** @endcond */ + /** @cond exclude_from_gpa_documentation */ /** @@ -1717,24 +2034,46 @@ void ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id); */ void ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id); +/** + * @ingroup frames + * @brief Submits a frame instance. + * Successive calls to __itt_frame_begin or __itt_frame_submit with the + * same ID are ignored until a call to __itt_frame_end or __itt_frame_submit + * with the same ID. + * Passing special __itt_timestamp_none value as "end" argument means + * take the current timestamp as the end timestamp. + * @param[in] domain The domain for this frame instance + * @param[in] id The instance ID for this frame instance or NULL + * @param[in] begin Timestamp of the beggining of the frame + * @param[in] end Timestamp of the end of the frame + */ +void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id, + __itt_timestamp begin, __itt_timestamp end); + /** @cond exclude_from_documentation */ #ifndef INTEL_NO_MACRO_BODY #ifndef INTEL_NO_ITTNOTIFY_API ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id)) ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id)) +ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end)) #define __itt_frame_begin_v3(d,x) ITTNOTIFY_VOID_D1(frame_begin_v3,d,x) #define __itt_frame_begin_v3_ptr ITTNOTIFY_NAME(frame_begin_v3) #define __itt_frame_end_v3(d,x) ITTNOTIFY_VOID_D1(frame_end_v3,d,x) #define __itt_frame_end_v3_ptr ITTNOTIFY_NAME(frame_end_v3) +#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e) +#define __itt_frame_submit_v3_ptr ITTNOTIFY_NAME(frame_submit_v3) #else /* INTEL_NO_ITTNOTIFY_API */ #define __itt_frame_begin_v3(domain,id) #define __itt_frame_begin_v3_ptr 0 #define __itt_frame_end_v3(domain,id) #define __itt_frame_end_v3_ptr 0 +#define __itt_frame_submit_v3(domain,id,begin,end) +#define __itt_frame_submit_v3_ptr 0 #endif /* INTEL_NO_ITTNOTIFY_API */ #else /* INTEL_NO_MACRO_BODY */ #define __itt_frame_begin_v3_ptr 0 #define __itt_frame_end_v3_ptr 0 +#define __itt_frame_submit_v3_ptr 0 #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ /** @} frames group */ @@ -2730,8 +3069,125 @@ ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event)) #endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ /** @} events group */ + + +/** + * @defgroup arrays Arrays Visualizer + * @ingroup public + * Visualize arrays + * @{ + */ + +/** + * @enum __itt_av_data_type + * @brief Defines types of arrays data (for C/C++ intrinsic types) + */ +typedef enum +{ + __itt_e_first = 0, + __itt_e_char = 0, /* 1-byte integer */ + __itt_e_uchar, /* 1-byte unsigned integer */ + __itt_e_int16, /* 2-byte integer */ + __itt_e_uint16, /* 2-byte unsigned integer */ + __itt_e_int32, /* 4-byte integer */ + __itt_e_uint32, /* 4-byte unsigned integer */ + __itt_e_int64, /* 8-byte integer */ + __itt_e_uint64, /* 8-byte unsigned integer */ + __itt_e_float, /* 4-byte floating */ + __itt_e_double, /* 8-byte floating */ + __itt_e_last = __itt_e_double +} __itt_av_data_type; + +/** + * @brief Save an array data to a file. + * Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only). + * @param[in] data - pointer to the array data + * @param[in] rank - the rank of the array + * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions. + * The size of dimensions must be equal to the rank + * @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types) + * @param[in] filePath - the file path; the output format is defined by the file extension + * @param[in] columnOrder - defines how the array is stored in the linear memory. + * It should be 1 for column-major order (e.g. in FORTRAN) or 0 - for row-major order (e.g. in C). + */ + +#if ITT_PLATFORM==ITT_PLATFORM_WIN +int ITTAPI __itt_av_saveA(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder); +int ITTAPI __itt_av_saveW(void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder); +#if defined(UNICODE) || defined(_UNICODE) +# define __itt_av_save __itt_av_saveW +# define __itt_av_save_ptr __itt_av_saveW_ptr +#else /* UNICODE */ +# define __itt_av_save __itt_av_saveA +# define __itt_av_save_ptr __itt_av_saveA_ptr +#endif /* UNICODE */ +#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +int ITTAPI __itt_av_save(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder); +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +#if ITT_PLATFORM==ITT_PLATFORM_WIN +ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder)) +ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder)) +#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder)) +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#if ITT_PLATFORM==ITT_PLATFORM_WIN +#define __itt_av_saveA ITTNOTIFY_DATA(av_saveA) +#define __itt_av_saveA_ptr ITTNOTIFY_NAME(av_saveA) +#define __itt_av_saveW ITTNOTIFY_DATA(av_saveW) +#define __itt_av_saveW_ptr ITTNOTIFY_NAME(av_saveW) +#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#define __itt_av_save ITTNOTIFY_DATA(av_save) +#define __itt_av_save_ptr ITTNOTIFY_NAME(av_save) +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#else /* INTEL_NO_ITTNOTIFY_API */ +#if ITT_PLATFORM==ITT_PLATFORM_WIN +#define __itt_av_saveA(name) +#define __itt_av_saveA_ptr 0 +#define __itt_av_saveW(name) +#define __itt_av_saveW_ptr 0 +#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#define __itt_av_save(name) +#define __itt_av_save_ptr 0 +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#if ITT_PLATFORM==ITT_PLATFORM_WIN +#define __itt_av_saveA_ptr 0 +#define __itt_av_saveW_ptr 0 +#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#define __itt_av_save_ptr 0 +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#endif /* INTEL_NO_MACRO_BODY */ /** @endcond */ +void ITTAPI __itt_enable_attach(void); + +/** @cond exclude_from_documentation */ +#ifndef INTEL_NO_MACRO_BODY +#ifndef INTEL_NO_ITTNOTIFY_API +ITT_STUBV(ITTAPI, void, enable_attach, (void)) +#define __itt_enable_attach ITTNOTIFY_VOID(enable_attach) +#define __itt_enable_attach_ptr ITTNOTIFY_NAME(enable_attach) +#else /* INTEL_NO_ITTNOTIFY_API */ +#define __itt_enable_attach() +#define __itt_enable_attach_ptr 0 +#endif /* INTEL_NO_ITTNOTIFY_API */ +#else /* INTEL_NO_MACRO_BODY */ +#define __itt_enable_attach_ptr 0 +#endif /* INTEL_NO_MACRO_BODY */ +/** @endcond */ + +/** @cond exclude_from_gpa_documentation */ + +/** @} arrays group */ + +/** @endcond */ + + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h index bccaa383ef0..40c8614d222 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h +++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h @@ -42,12 +42,18 @@ # define ITT_PLATFORM_POSIX 2 #endif /* ITT_PLATFORM_POSIX */ +#ifndef ITT_PLATFORM_MAC +# define ITT_PLATFORM_MAC 3 +#endif /* ITT_PLATFORM_MAC */ + #ifndef ITT_PLATFORM # if ITT_OS==ITT_OS_WIN # define ITT_PLATFORM ITT_PLATFORM_WIN +# elif ITT_OS==ITT_OS_MAC +# define ITT_PLATFORM ITT_PLATFORM_MAC # else # define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif /* _WIN32 */ +# endif #endif /* ITT_PLATFORM */ #if defined(_UNICODE) && !defined(UNICODE) @@ -68,11 +74,11 @@ # if ITT_PLATFORM==ITT_PLATFORM_WIN # define CDECL __cdecl # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define CDECL /* not actual on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define CDECL __attribute__ ((cdecl)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define CDECL /* actual only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* CDECL */ @@ -80,11 +86,11 @@ # if ITT_PLATFORM==ITT_PLATFORM_WIN # define STDCALL __stdcall # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define STDCALL /* not supported on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define STDCALL __attribute__ ((stdcall)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define STDCALL /* supported only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* STDCALL */ @@ -97,8 +103,8 @@ #if ITT_PLATFORM==ITT_PLATFORM_WIN /* use __forceinline (VC++ specific) */ -#define INLINE __forceinline -#define INLINE_ATTRIBUTE /* nothing */ +#define ITT_INLINE __forceinline +#define ITT_INLINE_ATTRIBUTE /* nothing */ #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /* * Generally, functions are not inlined unless optimization is specified. @@ -106,11 +112,11 @@ * if no optimization level was specified. */ #ifdef __STRICT_ANSI__ -#define INLINE static +#define ITT_INLINE static #else /* __STRICT_ANSI__ */ -#define INLINE static inline +#define ITT_INLINE static inline #endif /* __STRICT_ANSI__ */ -#define INLINE_ATTRIBUTE __attribute__ ((always_inline)) +#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused)) #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /** @endcond */ @@ -122,17 +128,19 @@ # define ITT_ARCH_IA32E 2 #endif /* ITT_ARCH_IA32E */ -#ifndef ITT_ARCH_IA64 -# define ITT_ARCH_IA64 3 -#endif /* ITT_ARCH_IA64 */ +#ifndef ITT_ARCH_ARM +# define ITT_ARCH_ARM 4 +#endif /* ITT_ARCH_ARM */ #ifndef ITT_ARCH -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ +# if defined _M_IX86 || defined __i386__ +# define ITT_ARCH ITT_ARCH_IA32 +# elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__ # define ITT_ARCH ITT_ARCH_IA32E -# elif defined _M_IA64 || defined __ia64 +# elif defined _M_IA64 || defined __ia64__ # define ITT_ARCH ITT_ARCH_IA64 -# else -# define ITT_ARCH ITT_ARCH_IA32 +# elif defined _M_ARM || __arm__ +# define ITT_ARCH ITT_ARCH_ARM # endif #endif @@ -145,7 +153,10 @@ #define ITT_TO_STR_AUX(x) #x #define ITT_TO_STR(x) ITT_TO_STR_AUX(x) -#define __ITT_BUILD_ASSERT(expr, suffix) do { static char __itt_build_check_##suffix[(expr) ? 1 : -1]; __itt_build_check_##suffix[0] = 0; } while(0) +#define __ITT_BUILD_ASSERT(expr, suffix) do { \ + static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \ + __itt_build_check_##suffix[0] = 0; \ +} while(0) #define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix) #define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__) @@ -158,7 +169,8 @@ #define API_VERSION_NUM 0.0.0 #endif /* API_VERSION_NUM */ -#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) " (" ITT_TO_STR(API_VERSION_BUILD) ")" +#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) \ + " (" ITT_TO_STR(API_VERSION_BUILD) ")" /* OS communication functions */ #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -176,12 +188,16 @@ typedef CRITICAL_SECTION mutex_t; #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */ #endif /* _GNU_SOURCE */ +#ifndef __USE_UNIX98 +#define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */ +#endif /*__USE_UNIX98*/ #include <pthread.h> typedef void* lib_t; typedef pthread_t TIDT; typedef pthread_mutex_t mutex_t; #define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#define _strong_alias(name, aliasname) extern __typeof (name) aliasname __attribute__ ((alias (#name))); +#define _strong_alias(name, aliasname) \ + extern __typeof (name) aliasname __attribute__ ((alias (#name))); #define strong_alias(name, aliasname) _strong_alias(name, aliasname) #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ @@ -200,29 +216,35 @@ typedef pthread_mutex_t mutex_t; #define __itt_thread_id() GetCurrentThreadId() #define __itt_thread_yield() SwitchToThread() #ifndef ITT_SIMPLE_INIT -INLINE int __itt_interlocked_increment(volatile long* ptr) +ITT_INLINE long +__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; +ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) { return InterlockedIncrement(ptr); } #endif /* ITT_SIMPLE_INIT */ #else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ #define __itt_get_proc(lib, name) dlsym(lib, name) -#define __itt_mutex_init(mutex) \ - { \ - pthread_mutexattr_t mutex_attr; \ - int error_code = pthread_mutexattr_init(&mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_init", error_code); \ - error_code = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", error_code); \ - error_code = pthread_mutex_init(mutex, &mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutex_init", error_code); \ - error_code = pthread_mutexattr_destroy(&mutex_attr); \ - if (error_code) \ - __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", error_code); \ - } +#define __itt_mutex_init(mutex) {\ + pthread_mutexattr_t mutex_attr; \ + int error_code = pthread_mutexattr_init(&mutex_attr); \ + if (error_code) \ + __itt_report_error(__itt_error_system, "pthread_mutexattr_init", \ + error_code); \ + error_code = pthread_mutexattr_settype(&mutex_attr, \ + PTHREAD_MUTEX_RECURSIVE); \ + if (error_code) \ + __itt_report_error(__itt_error_system, "pthread_mutexattr_settype", \ + error_code); \ + error_code = pthread_mutex_init(mutex, &mutex_attr); \ + if (error_code) \ + __itt_report_error(__itt_error_system, "pthread_mutex_init", \ + error_code); \ + error_code = pthread_mutexattr_destroy(&mutex_attr); \ + if (error_code) \ + __itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", \ + error_code); \ +} #define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex) #define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex) #define __itt_load_lib(name) dlopen(name, RTLD_LAZY) @@ -238,23 +260,29 @@ INLINE int __itt_interlocked_increment(volatile long* ptr) #ifdef __INTEL_COMPILER #define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val) #else /* __INTEL_COMPILER */ -/* TODO: Add Support for not Intel compilers for IA64 */ +/* TODO: Add Support for not Intel compilers for IA-64 architecture */ #endif /* __INTEL_COMPILER */ -#else /* ITT_ARCH!=ITT_ARCH_IA64 */ -INLINE int __TBB_machine_fetchadd4(volatile void* ptr, long addend) +#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */ +ITT_INLINE long +__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE; +ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend) { - int result; - __asm__ __volatile__("lock\nxaddl %0,%1" - : "=r"(result),"=m"(*(long*)ptr) - : "0"(addend), "m"(*(long*)ptr) + long result; + __asm__ __volatile__("lock\nxadd %0,%1" + : "=r"(result),"=m"(*(int*)ptr) + : "0"(addend), "m"(*(int*)ptr) : "memory"); return result; } +#elif ITT_ARCH==ITT_ARCH_ARM +#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val) #endif /* ITT_ARCH==ITT_ARCH_IA64 */ #ifndef ITT_SIMPLE_INIT -INLINE int __itt_interlocked_increment(volatile long* ptr) +ITT_INLINE long +__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE; +ITT_INLINE long __itt_interlocked_increment(volatile long* ptr) { - return __TBB_machine_fetchadd4(ptr, 1) + 1; + return __TBB_machine_fetchadd4(ptr, 1) + 1L; } #endif /* ITT_SIMPLE_INIT */ #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c index 5257d0d0299..4b5f464feb8 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c +++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c @@ -29,7 +29,7 @@ #include "disable_warnings.h" -static const char api_version[] = API_VERSION "\0\n@(#) 201495 2011-12-01 14:14:56Z\n"; +static const char api_version[] = API_VERSION "\0\n@(#) $Revision: 42754 $\n"; #define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n) @@ -43,6 +43,12 @@ static const char* ittnotify_lib_name = "libittnotify.dylib"; #error Unsupported or unknown OS. #endif +#ifdef __ANDROID__ +/* default location of userapi collector on Android */ +#define ANDROID_ITTNOTIFY_DEFAULT_PATH "/data/data/com.intel.vtune/intel/libittnotify.so" +#endif + + #ifndef LIB_VAR_NAME #if ITT_ARCH==ITT_ARCH_IA32 #define LIB_VAR_NAME INTEL_LIBITTNOTIFY32 @@ -146,7 +152,7 @@ typedef struct ___itt_group_alias static __itt_group_alias group_alias[] = { { "KMP_FOR_TPROFILE", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_mark) }, - { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_fsync | __itt_group_mark) }, + { "KMP_FOR_TCHECK", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) }, { NULL, (__itt_group_none) }, { api_version, (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */ }; @@ -162,7 +168,7 @@ static __itt_api_info api_list[] = { /* Define functions with static implementation */ #undef ITT_STUB #undef ITT_STUBV -#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)}, +#define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)}, #define ITT_STUBV ITT_STUB #define __ITT_INTERNAL_INIT #include "ittnotify_static.h" @@ -170,7 +176,7 @@ static __itt_api_info api_list[] = { /* Define functions without static implementation */ #undef ITT_STUB #undef ITT_STUBV -#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)}, +#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)}, #define ITT_STUBV ITT_STUB #include "ittnotify_static.h" {NULL, NULL, NULL, NULL, __itt_group_none} @@ -225,7 +231,7 @@ static __itt_string_handle null_string_handle = { static const char dll_path[PATH_MAX] = { 0 }; /* static part descriptor which handles. all notification api attributes. */ -static __itt_global __itt_ittapi_global = { +__itt_global _N_(_ittapi_global) = { ITT_MAGIC, /* identification info */ ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD, /* version info */ 0, /* api_initialized */ @@ -261,9 +267,9 @@ static void __itt_report_error(__itt_error_code code, ...) { va_list args; va_start(args, code); - if (__itt_ittapi_global.error_handler != NULL) + if (_N_(_ittapi_global).error_handler != NULL) { - __itt_error_handler_t* handler = (__itt_error_handler_t*)__itt_ittapi_global.error_handler; + __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler; handler(code, args); } #ifdef ITT_NOTIFY_EXT_REPORT @@ -281,7 +287,7 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))( { __itt_domain *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))) @@ -289,16 +295,16 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))( } if (name == NULL) - return __itt_ittapi_global.domain_list; + return _N_(_ittapi_global).domain_list; - ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global); - for (h_tail = NULL, h = __itt_ittapi_global.domain_list; h != NULL; h_tail = h, h = h->next) + ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); + for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next) if (h->nameW != NULL && !wcscmp(h->nameW, name)) break; if (h == NULL) { - NEW_DOMAIN_W(&__itt_ittapi_global,h,h_tail,name); + NEW_DOMAIN_W(&_N_(_ittapi_global),h,h_tail,name); } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); return h; } @@ -309,7 +315,7 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(c { __itt_domain *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -322,16 +328,16 @@ static __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(c } if (name == NULL) - return __itt_ittapi_global.domain_list; + return _N_(_ittapi_global).domain_list; - ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global); - for (h_tail = NULL, h = __itt_ittapi_global.domain_list; h != NULL; h_tail = h, h = h->next) + ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); + for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next) if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name)) break; if (h == NULL) { - NEW_DOMAIN_A(&__itt_ittapi_global,h,h_tail,name); + NEW_DOMAIN_A(&_N_(_ittapi_global),h,h_tail,name); } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); return h; } @@ -340,7 +346,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre { __itt_string_handle *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))) @@ -348,16 +354,16 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre } if (name == NULL) - return __itt_ittapi_global.string_list; + return _N_(_ittapi_global).string_list; - ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global); - for (h_tail = NULL, h = __itt_ittapi_global.string_list; h != NULL; h_tail = h, h = h->next) + ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); + for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next) if (h->strW != NULL && !wcscmp(h->strW, name)) break; if (h == NULL) { - NEW_STRING_HANDLE_W(&__itt_ittapi_global,h,h_tail,name); + NEW_STRING_HANDLE_W(&_N_(_ittapi_global),h,h_tail,name); } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); return h; } @@ -368,7 +374,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre { __itt_string_handle *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -381,16 +387,16 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre } if (name == NULL) - return __itt_ittapi_global.string_list; + return _N_(_ittapi_global).string_list; - ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global); - for (h_tail = NULL, h = __itt_ittapi_global.string_list; h != NULL; h_tail = h, h = h->next) + ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); + for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next) if (h->strA != NULL && !__itt_fstrcmp(h->strA, name)) break; if (h == NULL) { - NEW_STRING_HANDLE_A(&__itt_ittapi_global,h,h_tail,name); + NEW_STRING_HANDLE_A(&_N_(_ittapi_global),h,h_tail,name); } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); return h; } @@ -398,7 +404,7 @@ static __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_cre static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void) { - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))) @@ -407,12 +413,12 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void) return; } } - __itt_ittapi_global.state = __itt_collection_paused; + _N_(_ittapi_global).state = __itt_collection_paused; } static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void) { - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))) @@ -421,7 +427,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void) return; } } - __itt_ittapi_global.state = __itt_collection_normal; + _N_(_ittapi_global).state = __itt_collection_normal; } #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -430,7 +436,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const w TIDT tid = __itt_thread_id(); __itt_thread_info *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))) @@ -440,18 +446,18 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const w } } - __itt_mutex_lock(&__itt_ittapi_global.mutex); - for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next) + __itt_mutex_lock(&_N_(_ittapi_global).mutex); + for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next) if (h->tid == tid) break; if (h == NULL) { - NEW_THREAD_INFO_W(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_normal, name); + NEW_THREAD_INFO_W(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name); } else { h->nameW = name ? _wcsdup(name) : NULL; } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); } static int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen) @@ -469,7 +475,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const ch TIDT tid = __itt_thread_id(); __itt_thread_info *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -487,18 +493,18 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const ch #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ } - __itt_mutex_lock(&__itt_ittapi_global.mutex); - for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next) + __itt_mutex_lock(&_N_(_ittapi_global).mutex); + for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next) if (h->tid == tid) break; if (h == NULL) { - NEW_THREAD_INFO_A(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_normal, name); + NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name); } else { h->nameA = name ? __itt_fstrdup(name) : NULL; } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); } #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -522,7 +528,7 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void) TIDT tid = __itt_thread_id(); __itt_thread_info *h_tail, *h; - if (!__itt_ittapi_global.api_initialized && __itt_ittapi_global.thread_list->tid == 0) + if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0) { __itt_init_ittlib_name(NULL, __itt_group_all); if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))) @@ -532,19 +538,19 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void) } } - __itt_mutex_lock(&__itt_ittapi_global.mutex); - for (h_tail = NULL, h = __itt_ittapi_global.thread_list; h != NULL; h_tail = h, h = h->next) + __itt_mutex_lock(&_N_(_ittapi_global).mutex); + for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next) if (h->tid == tid) break; if (h == NULL) { static const char* name = "unknown"; - NEW_THREAD_INFO_A(&__itt_ittapi_global, h, h_tail, tid, __itt_thread_ignored, name); + NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_ignored, name); } else { h->state = __itt_thread_ignored; } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); } static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void) @@ -552,6 +558,17 @@ static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void) ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(); } +static void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void) +{ +#ifdef __ANDROID__ + /* + * if LIB_VAR_NAME env variable were set before then stay previous value + * else set default path + */ + setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0); +#endif +} + /* -------------------------------------------------------------------------- */ static const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len) @@ -666,80 +683,10 @@ static const char* __itt_get_env_var(const char* name) return NULL; } -#if ITT_PLATFORM==ITT_PLATFORM_WIN - -#include <Winreg.h> - -typedef LONG (APIENTRY* RegCloseKeyProcType)(HKEY); -typedef LONG (APIENTRY* RegOpenKeyExAProcType)(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY); -typedef LONG (APIENTRY* RegGetValueAProcType)(HKEY, LPCTSTR, LPCTSTR, DWORD, LPDWORD, PVOID, LPDWORD); - -/* This function return value of registry key that placed into static buffer. - * This was done to aviod dynamic memory allocation. - */ -static const char* __itt_get_lib_name_registry(void) -{ -#define MAX_REG_VALUE_SIZE 4086 - static char reg_buff[MAX_REG_VALUE_SIZE]; - DWORD size; - LONG res; - HKEY hKey; - RegCloseKeyProcType pRegCloseKey; - RegOpenKeyExAProcType pRegOpenKeyExA; - RegGetValueAProcType pRegGetValueA; - HMODULE h_advapi32 = LoadLibraryA("advapi32.dll"); - DWORD autodetect = 0; - - if (h_advapi32 == NULL) - { - return NULL; - } - - pRegCloseKey = (RegCloseKeyProcType)GetProcAddress(h_advapi32, "RegCloseKey"); - pRegOpenKeyExA = (RegOpenKeyExAProcType)GetProcAddress(h_advapi32, "RegOpenKeyExA"); - pRegGetValueA = (RegGetValueAProcType)GetProcAddress(h_advapi32, "RegGetValueA"); - - if (pRegCloseKey == NULL || - pRegOpenKeyExA == NULL || - pRegGetValueA == NULL) - { - FreeLibrary(h_advapi32); - return NULL; - } - - res = pRegOpenKeyExA(HKEY_CURRENT_USER, (LPCTSTR)"Software\\Intel Corporation\\ITT Environment\\Collector", 0, KEY_READ, &hKey); - if (res != ERROR_SUCCESS || hKey == 0) - { - FreeLibrary(h_advapi32); - return NULL; - } - - size = sizeof(DWORD); - res = pRegGetValueA(hKey, (LPCTSTR)"AutoDetect", NULL, RRF_RT_REG_DWORD, NULL, (BYTE*)&autodetect, &size); - if (res != ERROR_SUCCESS || size == 0 || autodetect == 0) - { - pRegCloseKey(hKey); - FreeLibrary(h_advapi32); - return NULL; - } - - size = MAX_REG_VALUE_SIZE-1; - res = pRegGetValueA(hKey, (LPCTSTR)ITT_TO_STR(LIB_VAR_NAME), NULL, REG_SZ, NULL, (BYTE*)®_buff, &size); - pRegCloseKey(hKey); - FreeLibrary(h_advapi32); - - return (res == ERROR_SUCCESS && size > 0) ? reg_buff : NULL; -} - -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ - static const char* __itt_get_lib_name(void) { const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME)); -#if ITT_PLATFORM==ITT_PLATFORM_WIN - if (lib_name == NULL) - lib_name = __itt_get_lib_name_registry(); -#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ + return lib_name; } @@ -761,9 +708,8 @@ static __itt_group_id __itt_get_groups(void) const char* chunk; while ((group_str = __itt_fsplit(group_str, ",; ", &chunk, &len)) != NULL) { - __itt_fstrcpyn(gr, chunk, sizeof(gr)); - - gr[min((unsigned int)len, sizeof(gr) - 1)] = 0; + __itt_fstrcpyn(gr, chunk, sizeof(gr) - 1); + gr[min(len, (int)(sizeof(gr) - 1))] = 0; for (i = 0; group_list[i].name != NULL; i++) { @@ -810,8 +756,8 @@ static void __itt_reinit_all_pointers(void) { register int i; // Fill all pointers with initial stubs - for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++) - *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].init_func; + for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func; } */ @@ -819,8 +765,8 @@ static void __itt_nullify_all_pointers(void) { register int i; /* Nulify all pointers except domain_create and string_handle_create */ - for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++) - *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func; + for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; } #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -834,30 +780,30 @@ ITT_EXTERN_C void _N_(fini_ittlib)(void) __itt_api_fini_t* __itt_api_fini_ptr; static volatile TIDT current_thread = 0; - if (__itt_ittapi_global.api_initialized) + if (_N_(_ittapi_global).api_initialized) { - __itt_mutex_lock(&__itt_ittapi_global.mutex); - if (__itt_ittapi_global.api_initialized) + __itt_mutex_lock(&_N_(_ittapi_global).mutex); + if (_N_(_ittapi_global).api_initialized) { if (current_thread == 0) { current_thread = __itt_thread_id(); - __itt_api_fini_ptr = (__itt_api_fini_t*)__itt_get_proc(__itt_ittapi_global.lib, "__itt_api_fini"); + __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_fini"); if (__itt_api_fini_ptr) - __itt_api_fini_ptr(&__itt_ittapi_global); + __itt_api_fini_ptr(&_N_(_ittapi_global)); __itt_nullify_all_pointers(); /* TODO: !!! not safe !!! don't support unload so far. - * if (__itt_ittapi_global.lib != NULL) - * __itt_unload_lib(__itt_ittapi_global.lib); - * __itt_ittapi_global.lib = NULL; + * if (_N_(_ittapi_global).lib != NULL) + * __itt_unload_lib(_N_(_ittapi_global).lib); + * _N_(_ittapi_global).lib = NULL; */ - __itt_ittapi_global.api_initialized = 0; + _N_(_ittapi_global).api_initialized = 0; current_thread = 0; } } - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); } } @@ -870,51 +816,52 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou #endif /* ITT_COMPLETE_GROUP */ static volatile TIDT current_thread = 0; - if (!__itt_ittapi_global.api_initialized) + if (!_N_(_ittapi_global).api_initialized) { #ifndef ITT_SIMPLE_INIT - ITT_MUTEX_INIT_AND_LOCK(__itt_ittapi_global); + ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global)); #endif /* ITT_SIMPLE_INIT */ - if (!__itt_ittapi_global.api_initialized) + if (!_N_(_ittapi_global).api_initialized) { if (current_thread == 0) { current_thread = __itt_thread_id(); - __itt_ittapi_global.thread_list->tid = current_thread; + _N_(_ittapi_global).thread_list->tid = current_thread; if (lib_name == NULL) lib_name = __itt_get_lib_name(); groups = __itt_get_groups(); if (groups != __itt_group_none || lib_name != NULL) { - __itt_ittapi_global.lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name); - if (__itt_ittapi_global.lib != NULL) + _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name); + + if (_N_(_ittapi_global).lib != NULL) { __itt_api_init_t* __itt_api_init_ptr; - int lib_version = __itt_lib_version(__itt_ittapi_global.lib); + int lib_version = __itt_lib_version(_N_(_ittapi_global).lib); switch (lib_version) { case 0: groups = __itt_group_legacy; case 1: /* Fill all pointers from dynamic library */ - for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++) + for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) { - if (__itt_ittapi_global.api_list_ptr[i].group & groups & init_groups) + if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups) { - *__itt_ittapi_global.api_list_ptr[i].func_ptr = (void*)__itt_get_proc(__itt_ittapi_global.lib, __itt_ittapi_global.api_list_ptr[i].name); - if (*__itt_ittapi_global.api_list_ptr[i].func_ptr == NULL) + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = (void*)__itt_get_proc(_N_(_ittapi_global).lib, _N_(_ittapi_global).api_list_ptr[i].name); + if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL) { /* Restore pointers for function with static implementation */ - *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func; - __itt_report_error(__itt_error_no_symbol, lib_name, __itt_ittapi_global.api_list_ptr[i].name); + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; + __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name); #ifdef ITT_COMPLETE_GROUP - zero_group = (__itt_group_id)(zero_group | __itt_ittapi_global.api_list_ptr[i].group); + zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group); #endif /* ITT_COMPLETE_GROUP */ } } else - *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func; + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; } if (groups == __itt_group_legacy) @@ -934,15 +881,15 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou } #ifdef ITT_COMPLETE_GROUP - for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++) - if (__itt_ittapi_global.api_list_ptr[i].group & zero_group) - *__itt_ittapi_global.api_list_ptr[i].func_ptr = __itt_ittapi_global.api_list_ptr[i].null_func; + for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) + if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group) + *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func; #endif /* ITT_COMPLETE_GROUP */ break; case 2: - __itt_api_init_ptr = (__itt_api_init_t*)__itt_get_proc(__itt_ittapi_global.lib, "__itt_api_init"); + __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, "__itt_api_init"); if (__itt_api_init_ptr) - __itt_api_init_ptr(&__itt_ittapi_global, init_groups); + __itt_api_init_ptr(&_N_(_ittapi_global), init_groups); break; } } @@ -963,7 +910,7 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou { __itt_nullify_all_pointers(); } - __itt_ittapi_global.api_initialized = 1; + _N_(_ittapi_global).api_initialized = 1; current_thread = 0; /* !!! Just to avoid unused code elimination !!! */ if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0; @@ -971,25 +918,26 @@ ITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_grou } #ifndef ITT_SIMPLE_INIT - __itt_mutex_unlock(&__itt_ittapi_global.mutex); + __itt_mutex_unlock(&_N_(_ittapi_global).mutex); #endif /* ITT_SIMPLE_INIT */ } /* Evaluating if any function ptr is non empty and it's in init_groups */ - for (i = 0; __itt_ittapi_global.api_list_ptr[i].name != NULL; i++) - if (*__itt_ittapi_global.api_list_ptr[i].func_ptr != __itt_ittapi_global.api_list_ptr[i].null_func && - __itt_ittapi_global.api_list_ptr[i].group & init_groups) + for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++) + if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func && + _N_(_ittapi_global).api_list_ptr[i].group & init_groups) return 1; return 0; } ITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler) { - __itt_error_handler_t* prev = (__itt_error_handler_t*)__itt_ittapi_global.error_handler; - __itt_ittapi_global.error_handler = (void*)handler; + __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler; + _N_(_ittapi_global).error_handler = (void*)(size_t)handler; return prev; } #if ITT_PLATFORM==ITT_PLATFORM_WIN #pragma warning(pop) #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ + diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h index 1e9eb43f6e0..fe1fe3c14f7 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h +++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h @@ -60,6 +60,8 @@ ITT_STUB(LIBITTAPI, int, thr_name_set, (const char *name, int namelen), (IT ITT_STUBV(LIBITTAPI, void, thr_ignore, (void), (ITT_NO_PARAMS), thr_ignore, __itt_group_thread | __itt_group_legacy, "no args") #endif /* __ITT_INTERNAL_BODY */ +ITT_STUBV(ITTAPI, void, enable_attach, (void), (ITT_NO_PARAMS), enable_attach, __itt_group_all, "no args") + #else /* __ITT_INTERNAL_INIT */ #if ITT_PLATFORM==ITT_PLATFORM_WIN @@ -78,6 +80,11 @@ ITT_STUBV(ITTAPI, void, sync_cancel, (void *addr), (ITT_FORMAT addr), sync_c ITT_STUBV(ITTAPI, void, sync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_sync, "%p") ITT_STUBV(ITTAPI, void, sync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync, "%p") +ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask), (ITT_FORMAT mask), suppress_push, __itt_group_suppress, "%p") +ITT_STUBV(ITTAPI, void, suppress_pop, (void), (ITT_NO_PARAMS), suppress_pop, __itt_group_suppress, "no args") +ITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_mark_range, __itt_group_suppress, "%d, %p, %p, %d") +ITT_STUBV(ITTAPI, void, suppress_clear_range,(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_clear_range,__itt_group_suppress, "%d, %p, %p, %d") + ITT_STUBV(ITTAPI, void, fsync_prepare, (void* addr), (ITT_FORMAT addr), sync_prepare, __itt_group_fsync, "%p") ITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr), (ITT_FORMAT addr), sync_cancel, __itt_group_fsync, "%p") ITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr), (ITT_FORMAT addr), sync_acquired, __itt_group_fsync, "%p") @@ -95,16 +102,26 @@ ITT_STUBV(ITTAPI, void, model_induction_uses, (void* addr, size_t size), (I ITT_STUBV(ITTAPI, void, model_reduction_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses, __itt_group_model, "%p, %d") ITT_STUBV(ITTAPI, void, model_observe_uses, (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses, __itt_group_model, "%p, %d") ITT_STUBV(ITTAPI, void, model_clear_uses, (void* addr), (ITT_FORMAT addr), model_clear_uses, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p") -ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args") #ifndef __ITT_INTERNAL_BODY #if ITT_PLATFORM==ITT_PLATFORM_WIN ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name), (ITT_FORMAT name), model_site_beginW, __itt_group_model, "\"%s\"") ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name), (ITT_FORMAT name), model_task_beginW, __itt_group_model, "\"%s\"") +ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name), (ITT_FORMAT name), model_iteration_taskW, __itt_group_model, "\"%s\"") #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name), (ITT_FORMAT name), model_site_beginA, __itt_group_model, "\"%s\"") ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL, __itt_group_model, "\"%s\", %d") +ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name), (ITT_FORMAT name), model_task_beginA, __itt_group_model, "\"%s\"") ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL, __itt_group_model, "\"%s\", %d") +ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name), (ITT_FORMAT name), model_iteration_taskA, __itt_group_model, "\"%s\"") +ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, "\"%s\", %d") +ITT_STUBV(ITTAPI, void, model_site_end_2, (void), (ITT_NO_PARAMS), model_site_end_2, __itt_group_model, "no args") +ITT_STUBV(ITTAPI, void, model_task_end_2, (void), (ITT_NO_PARAMS), model_task_end_2, __itt_group_model, "no args") +ITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock), (ITT_FORMAT lock), model_lock_acquire_2, __itt_group_model, "%p") +ITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock), (ITT_FORMAT lock), model_lock_release_2, __itt_group_model, "%p") +ITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t count), (ITT_FORMAT count), model_aggregate_task, __itt_group_model, "%d") +ITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x), (ITT_FORMAT x), model_disable_push, __itt_group_model, "%p") +ITT_STUBV(ITTAPI, void, model_disable_pop, (void), (ITT_NO_PARAMS), model_disable_pop, __itt_group_model, "no args") #endif /* __ITT_INTERNAL_BODY */ #ifndef __ITT_INTERNAL_BODY @@ -123,16 +140,23 @@ ITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* ad ITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end, __itt_group_heap, "%p, %p, %p, %lu, %d") ITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, "no args") ITT_STUBV(ITTAPI, void, heap_internal_access_end, (void), (ITT_NO_PARAMS), heap_internal_access_end, __itt_group_heap, "no args") +ITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void), (ITT_NO_PARAMS), heap_record_memory_growth_begin, __itt_group_heap, "no args") +ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void), (ITT_NO_PARAMS), heap_record_memory_growth_end, __itt_group_heap, "no args") +ITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask), (ITT_FORMAT reset_mask), heap_reset_detection, __itt_group_heap, "%u") +ITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask), (ITT_FORMAT record_mask), heap_record, __itt_group_heap, "%u") ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_create, __itt_group_structure, "%p, %lu") ITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_destroy, __itt_group_structure, "%p, %lu") +ITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void), (ITT_NO_PARAMS), get_timestamp, __itt_group_structure, "no args") + ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), region_begin, __itt_group_structure, "%p, %lu, %lu, %p") ITT_STUBV(ITTAPI, void, region_end, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), region_end, __itt_group_structure, "%p, %lu") #ifndef __ITT_INTERNAL_BODY ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_begin_v3, __itt_group_structure, "%p, %p") ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_end_v3, __itt_group_structure, "%p, %p") +ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, "%p, %p, %lu, %lu") #endif /* __ITT_INTERNAL_BODY */ ITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_group, __itt_group_structure, "%p, %lu, %lu, %p") @@ -280,4 +304,13 @@ ITT_STUBV(ITTAPI, void, set_track, (__itt_track *track), ITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, "no args") #endif /* __ITT_INTERNAL_BODY */ +#ifndef __ITT_INTERNAL_BODY +#if ITT_PLATFORM==ITT_PLATFORM_WIN +ITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveA, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d") +ITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveW, __itt_group_arrays, "%p, %d, %p, %d, \"%S\", %d") +#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */ +ITT_STUB(ITTAPI, int, av_save, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_save, __itt_group_arrays, "%p, %d, %p, %d, \"%s\", %d") +#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ +#endif /* __ITT_INTERNAL_BODY */ + #endif /* __ITT_INTERNAL_INIT */ diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h index 27991730fdb..3695a67089b 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h +++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_types.h @@ -29,6 +29,8 @@ typedef enum ___itt_group_id __itt_group_heap = 1<<11, __itt_group_splitter_max = 1<<12, __itt_group_structure = 1<<12, + __itt_group_suppress = 1<<13, + __itt_group_arrays = 1<<14, __itt_group_all = -1 } __itt_group_id; @@ -57,6 +59,8 @@ typedef struct ___itt_group_list { __itt_group_stitch, "stitch" }, \ { __itt_group_heap, "heap" }, \ { __itt_group_structure, "structure" }, \ + { __itt_group_suppress, "suppress" }, \ + { __itt_group_arrays, "arrays" }, \ { __itt_group_none, NULL } \ } diff --git a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h index b10676f78d7..99192945010 100644 --- a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h +++ b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h @@ -47,12 +47,18 @@ # define ITT_PLATFORM_POSIX 2 #endif /* ITT_PLATFORM_POSIX */ +#ifndef ITT_PLATFORM_MAC +# define ITT_PLATFORM_MAC 3 +#endif /* ITT_PLATFORM_MAC */ + #ifndef ITT_PLATFORM # if ITT_OS==ITT_OS_WIN # define ITT_PLATFORM ITT_PLATFORM_WIN +# elif ITT_OS==ITT_OS_MAC +# define ITT_PLATFORM ITT_PLATFORM_MAC # else # define ITT_PLATFORM ITT_PLATFORM_POSIX -# endif /* _WIN32 */ +# endif #endif /* ITT_PLATFORM */ #if defined(_UNICODE) && !defined(UNICODE) @@ -73,11 +79,11 @@ # if ITT_PLATFORM==ITT_PLATFORM_WIN # define CDECL __cdecl # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define CDECL /* not actual on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define CDECL __attribute__ ((cdecl)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define CDECL /* actual only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* CDECL */ @@ -85,11 +91,11 @@ # if ITT_PLATFORM==ITT_PLATFORM_WIN # define STDCALL __stdcall # else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ -# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__ -# define STDCALL /* not supported on x86_64 platform */ -# else /* _M_X64 || _M_AMD64 || __x86_64__ */ +# if defined _M_IX86 || defined __i386__ # define STDCALL __attribute__ ((stdcall)) -# endif /* _M_X64 || _M_AMD64 || __x86_64__ */ +# else /* _M_IX86 || __i386__ */ +# define STDCALL /* supported only on x86 platform */ +# endif /* _M_IX86 || __i386__ */ # endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ #endif /* STDCALL */ @@ -102,8 +108,8 @@ #if ITT_PLATFORM==ITT_PLATFORM_WIN /* use __forceinline (VC++ specific) */ -#define INLINE __forceinline -#define INLINE_ATTRIBUTE /* nothing */ +#define ITT_INLINE __forceinline +#define ITT_INLINE_ATTRIBUTE /* nothing */ #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /* * Generally, functions are not inlined unless optimization is specified. @@ -111,11 +117,11 @@ * if no optimization level was specified. */ #ifdef __STRICT_ANSI__ -#define INLINE static +#define ITT_INLINE static #else /* __STRICT_ANSI__ */ -#define INLINE static inline +#define ITT_INLINE static inline #endif /* __STRICT_ANSI__ */ -#define INLINE_ATTRIBUTE __attribute__ ((always_inline)) +#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused)) #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ /** @endcond */ diff --git a/openmp/runtime/src/z_Linux_asm.s b/openmp/runtime/src/z_Linux_asm.s index 1bfdc0bf8cd..1f1ba1b3884 100644 --- a/openmp/runtime/src/z_Linux_asm.s +++ b/openmp/runtime/src/z_Linux_asm.s @@ -1,7 +1,7 @@ // z_Linux_asm.s: - microtasking routines specifically // written for Intel platforms running Linux* OS -// $Revision: 42582 $ -// $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $ +// $Revision: 42810 $ +// $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $ // ////===----------------------------------------------------------------------===// @@ -77,7 +77,7 @@ KMP_PREFIX_UNDERSCORE($0): KMP_PREFIX_UNDERSCORE(\proc): .endm # endif // defined __APPLE__ && defined __MACH__ -#endif // __i386 || defined __x86_64 +#endif // KMP_ARCH_X86 || KMP_ARCH_x86_64 // ----------------------------------------------------------------------- @@ -1573,3 +1573,19 @@ L_kmp_1_exit: // ----------------------------------------------------------------------- #endif /* KMP_ARCH_X86_64 */ + +#if KMP_ARCH_ARM + .data + .comm .gomp_critical_user_,32,8 + .data + .align 4 + .global __kmp_unnamed_critical_addr +__kmp_unnamed_critical_addr: + .4byte .gomp_critical_user_ + .size __kmp_unnamed_critical_addr,4 +#endif /* KMP_ARCH_ARM */ + + +#if defined(__linux__) +.section .note.GNU-stack,"",@progbits +#endif diff --git a/openmp/runtime/src/z_Linux_util.c b/openmp/runtime/src/z_Linux_util.c index 4675302a693..27e394f8797 100644 --- a/openmp/runtime/src/z_Linux_util.c +++ b/openmp/runtime/src/z_Linux_util.c @@ -1,7 +1,7 @@ /* * z_Linux_util.c -- platform specific routines. - * $Revision: 42582 $ - * $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $ + * $Revision: 42847 $ + * $Date: 2013-11-26 09:10:01 -0600 (Tue, 26 Nov 2013) $ */ @@ -32,7 +32,7 @@ #if KMP_OS_LINUX # include <sys/sysinfo.h> -# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) // We should really include <futex.h>, but that causes compatibility problems on different // Linux* OS distributions that either require that you include (or break when you try to include) // <pci/types.h>. @@ -55,6 +55,12 @@ #include <ctype.h> #include <fcntl.h> +// For non-x86 architecture +#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64) +# include <stdbool.h> +# include <ffi.h> +#endif + /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ @@ -112,7 +118,7 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond ) * stone forever. */ -# if KMP_ARCH_X86 +# if KMP_ARCH_X86 || KMP_ARCH_ARM # ifndef __NR_sched_setaffinity # define __NR_sched_setaffinity 241 # elif __NR_sched_setaffinity != 241 @@ -434,7 +440,7 @@ __kmp_change_thread_affinity_mask( int gtid, kmp_affin_mask_t *new_mask, /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ -#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) int __kmp_futex_determine_capable() @@ -451,7 +457,7 @@ __kmp_futex_determine_capable() return retval; } -#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64) +#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) /* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */ @@ -2004,43 +2010,21 @@ __kmp_get_xproc( void ) { } // __kmp_get_xproc -/* - Parse /proc/cpuinfo file for processor frequency, return frequency in Hz, or ~ 0 in case of - error. -*/ -static -kmp_uint64 -__kmp_get_frequency_from_proc( -) { +int +__kmp_read_from_file( char const *path, char const *format, ... ) +{ + int result; + va_list args; - kmp_uint64 result = ~ 0; - FILE * file = NULL; - double freq = HUGE_VAL; - int rc; + va_start(args, format); + FILE *f = fopen(path, "rb"); + if ( f == NULL ) + return 0; + result = vfscanf(f, format, args); + fclose(f); - // - // FIXME - use KMP_CPUINFO_FILE here if it is set!!! - // - file = fopen( "/proc/cpuinfo", "r" ); - if ( file == NULL ) { - return result; - }; // if - for ( ; ; ) { - rc = fscanf( file, "cpu MHz : %lf\n", & freq ); // Try to scan frequency. - if ( rc == 1 ) { // Success. - break; - }; // if - fscanf( file, "%*[^\n]\n" ); // Failure -- skip line. - }; // for - fclose( file ); - if ( freq == HUGE_VAL || freq <= 0 ) { - return result; - }; // if - result = (kmp_uint64)( freq * 1.0E+6 ); - KA_TRACE( 5, ( "cpu frequency from /proc/cpuinfo: %" KMP_UINT64_SPEC "\n", result ) ); return result; -} // func __kmp_get_frequency_from_proc - +} void __kmp_runtime_initialize( void ) @@ -2059,15 +2043,6 @@ __kmp_runtime_initialize( void ) }; // if #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ - if ( __kmp_cpu_frequency == 0 ) { - // First try nominal frequency. - __kmp_cpu_frequency = __kmp_cpuinfo.frequency; - if ( __kmp_cpu_frequency == 0 || __kmp_cpu_frequency == ~ 0 ) { - // Next Try to get CPU frequency from /proc/cpuinfo. - __kmp_cpu_frequency = __kmp_get_frequency_from_proc(); - }; // if - }; // if - __kmp_xproc = __kmp_get_xproc(); if ( sysconf( _SC_THREADS ) ) { @@ -2536,5 +2511,42 @@ __kmp_get_load_balance( int max ) #endif // USE_LOAD_BALANCE + +#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64) + +int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc, + void *p_argv[] ) +{ + int argc_full = argc + 2; + int i; + ffi_cif cif; + ffi_type *types[argc_full]; + void *args[argc_full]; + void *idp[2]; + + /* We're only passing pointers to the target. */ + for (i = 0; i < argc_full; i++) + types[i] = &ffi_type_pointer; + + /* Ugly double-indirection, but that's how it goes... */ + idp[0] = >id; + idp[1] = &tid; + args[0] = &idp[0]; + args[1] = &idp[1]; + + for (i = 0; i < argc; i++) + args[2 + i] = &p_argv[i]; + + if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, argc_full, + &ffi_type_void, types) != FFI_OK) + abort(); + + ffi_call(&cif, (void (*)(void))pkfn, NULL, args); + + return 1; +} + +#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64) + // end of file // diff --git a/openmp/runtime/src/z_Windows_NT_util.c b/openmp/runtime/src/z_Windows_NT_util.c index bd22c25be05..ba59110e8b8 100644 --- a/openmp/runtime/src/z_Windows_NT_util.c +++ b/openmp/runtime/src/z_Windows_NT_util.c @@ -1,7 +1,7 @@ /* * z_Windows_NT_util.c -- platform specific routines. - * $Revision: 42518 $ - * $Date: 2013-07-15 11:12:26 -0500 (Mon, 15 Jul 2013) $ + * $Revision: 42816 $ + * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $ */ @@ -391,14 +391,14 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker ) /* TODO: shouldn't this use release semantics to ensure that __kmp_suspend_initialize_thread gets called first? */ - old_spin = __kmp_test_then_or32( (volatile kmp_int32 *) spinner, + old_spin = KMP_TEST_THEN_OR32( (volatile kmp_int32 *) spinner, KMP_BARRIER_SLEEP_STATE ); KF_TRACE( 5, ( "__kmp_suspend: T#%d set sleep bit for spin(%p)==%d\n", th_gtid, spinner, *spinner ) ); if ( old_spin == checker ) { - __kmp_test_then_and32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) ); + KMP_TEST_THEN_AND32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) ); KF_TRACE( 5, ( "__kmp_suspend: T#%d false alarm, reset sleep bit for spin(%p)\n", th_gtid, spinner) ); @@ -501,7 +501,7 @@ __kmp_resume( int target_gtid, volatile kmp_uint *spin ) } TCW_PTR(th->th.th_sleep_loc, NULL); - old_spin = __kmp_test_then_and32( (kmp_int32 volatile *) spin, ~( KMP_BARRIER_SLEEP_STATE ) ); + old_spin = KMP_TEST_THEN_AND32( (kmp_int32 volatile *) spin, ~( KMP_BARRIER_SLEEP_STATE ) ); if ( ( old_spin & KMP_BARRIER_SLEEP_STATE ) == 0 ) { KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p): " @@ -874,24 +874,6 @@ __kmp_runtime_initialize( void ) }; // if #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ - if ( __kmp_cpu_frequency == 0 ) { - // __kmp_hardware_timestamp() calls to QueryPerformanceCounter(). If - // __kmp_hardware_timestamp() rewritten to use RDTSC instruction (or its 64 analog), - // probably we should try to get frequency from __kmp_cpuinfo.frequency first (see - // z_Linux_util.c). - LARGE_INTEGER freq; - BOOL rc; - rc = QueryPerformanceFrequency( & freq ); - if ( rc ) { - KMP_DEBUG_ASSERT( sizeof( __kmp_cpu_frequency ) >= sizeof( freq.QuadPart ) ); - KMP_DEBUG_ASSERT( freq.QuadPart >= 0 ); - __kmp_cpu_frequency = freq.QuadPart; - KA_TRACE( 5, ( "cpu frequency: %" KMP_UINT64_SPEC "\n", __kmp_cpu_frequency ) ); - } else { - __kmp_cpu_frequency = ~ 0; - }; // if - }; // if - /* Set up minimum number of threads to switch to TLS gtid */ #if KMP_OS_WINDOWS && ! defined GUIDEDLL_EXPORTS // Windows* OS, static library. diff --git a/openmp/runtime/tools/check-tools.pl b/openmp/runtime/tools/check-tools.pl index 8140e110aea..1878ca53b17 100755 --- a/openmp/runtime/tools/check-tools.pl +++ b/openmp/runtime/tools/check-tools.pl @@ -268,6 +268,9 @@ sub get_gnu_compiler_version($) { } elsif ( $stdout =~ m{^.*? \(SUSE Linux\) (\d+\.\d+\.\d+)\s+\[.*? (\d+)\]}m ) { # gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291] ( $ver, $bld ) = ( $1, $2 ); + } elsif ( $stdout =~ m{^.*? \(SUSE Linux\) (\d+\.\d+\.\d+)\s+\d+\s+\[.*? (\d+)\]}m ) { + # gcc (SUSE Linux) 4.7.2 20130108 [gcc-4_7-branch revision 195012] + ( $ver, $bld ) = ( $1, $2 ); } elsif ( $stdout =~ m{^.*? \((Debian|Ubuntu).*?\) (\d+\.\d+\.\d+)}m ) { # gcc (Debian 4.7.2-22) 4.7.2 # Debian support from Sylvestre Ledru @@ -286,6 +289,35 @@ sub get_gnu_compiler_version($) { }; # sub get_gnu_compiler_version +sub get_clang_compiler_version($) { + my ( $tool ) = @_; + my ( @ret ) = ( $tool ); + my ( $rc, $stdout, $stderr, $version ); + $rc = run( [ $tool, "--version" ], $stdout, $stderr ); + if ( $rc >= 0 ) { + my ( $ver, $bld ); + if ( $target_os eq "mac" ) { + # Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) + $stdout =~ m{^.*? (\d+\.\d+) \(.*-(\d+\.\d+\.\d+)\)}m; + ( $ver, $bld ) = ( $1, $2 ); + } else { + if ( 0 ) { + } elsif ( $stdout =~ m{^.*? (\d+\.\d+) \((.*)\)}m ) { + # clang version 3.3 (tags/RELEASE_33/final) + ( $ver, $bld ) = ( $1, $2 ); + } + }; # if + if ( defined( $ver ) ) { + $version = $ver . ( defined( $bld ) ? " ($bld)" : "" ); + } else { + warning( "Cannot parse Clang compiler version:", $stdout, "(eof)" ); + }; # if + }; # if + push( @ret, $version ); + return @ret; +}; # sub get_gnu_compiler_version + + sub get_ms_compiler_version() { my ( $rc, $stdout, $stderr, $version ); my $tool = "cl"; @@ -349,18 +381,30 @@ sub get_ms_linker_version() { my $make; my $intel = 1; # Check Intel compilers. -my $gnu_fortran = 0; # Check GNU Fortran. +my $fortran = 0; # Check for corresponding Fortran compiler, ifort for intel + # gfortran for gnu + # gfortran for clang +my $clang = 0; # Check Clang Compilers. my $intel_compilers = { "lin" => { c => "icc", cpp => "icpc", f => "ifort" }, "lrb" => { c => "icc", cpp => "icpc", f => "ifort" }, "mac" => { c => "icc", cpp => "icpc", f => "ifort" }, "win" => { c => "icl", cpp => undef, f => "ifort" }, }; +my $gnu_compilers = { + "lin" => { c => "gcc", cpp => "g++", f => "gfortran" }, + "mac" => { c => "gcc", cpp => "g++", f => "gfortran" }, +}; +my $clang_compilers = { + "lin" => { c => "clang", cpp => "clang++" }, + "mac" => { c => "clang", cpp => "clang++" }, +}; get_options( Platform::target_options(), "intel!" => \$intel, - "gnu-fortran!" => \$gnu_fortran, + "fortran" => \$fortran, + "clang" => \$clang, "make" => \$make, "pedantic" => \$pedantic, ); @@ -375,21 +419,32 @@ if ( $intel ) { # If Intel C++ compiler has a name different from C compiler, check it as well. push( @versions, [ "Intel C++ Compiler", get_intel_compiler_version( $ic->{ cpp } ) ] ); }; # if - if ( defined( $ic->{ f } ) ) { - push( @versions, [ "Intel Fortran Compiler", get_intel_compiler_version( $ic->{ f } ) ] ); - }; # if + # fortran check must be explicitly specified on command line with --fortran + if ( $fortran ) { + if ( defined( $ic->{ f } ) ) { + push( @versions, [ "Intel Fortran Compiler", get_intel_compiler_version( $ic->{ f } ) ] ); + }; # if + }; }; # if if ( $target_os eq "lin" or $target_os eq "mac" ) { - push( @versions, [ "GNU C Compiler", get_gnu_compiler_version( "gcc" ) ] ); - push( @versions, [ "GNU C++ Compiler", get_gnu_compiler_version( "g++" ) ] ); - if ( $gnu_fortran ) { - push( @versions, [ "GNU Fortran Compiler", get_gnu_compiler_version( "gfortran" ) ] ); - }; # if -}; # if + # check for gnu tools by default because touch-test.c is compiled with them. + push( @versions, [ "GNU C Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ c } ) ] ); + push( @versions, [ "GNU C++ Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ cpp } ) ] ); + if ( $clang ) { + push( @versions, [ "Clang C Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ c } ) ] ); + push( @versions, [ "Clang C++ Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ cpp } ) ] ); + }; + # if intel fortran has been checked then gnu fortran is unnecessary + # also, if user specifies clang as build compiler, then gfortran is assumed fortran compiler + if ( $fortran and not $intel ) { + push( @versions, [ "GNU Fortran Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ f } ) ] ); + }; +}; if ( $target_os eq "win" ) { push( @versions, [ "MS C/C++ Compiler", get_ms_compiler_version() ] ); push( @versions, [ "MS Linker", get_ms_linker_version() ] ); }; # if + my $count = 0; foreach my $item ( @versions ) { my ( $title, $tool, $version ) = @$item; diff --git a/openmp/runtime/tools/common.inc b/openmp/runtime/tools/common.inc index 4154b29d89a..8eceb98e9b0 100644 --- a/openmp/runtime/tools/common.inc +++ b/openmp/runtime/tools/common.inc @@ -56,10 +56,14 @@ endif # Setting defaults mode?=release -ifeq "$(omp_os)" "windows" - compiler?=icl +ifeq "$(filter 32 32e 64,$(arch))" "" + compiler?=gcc else - compiler?=icc + ifeq "$(omp_os)" "windows" + compiler?=icl + else + compiler?=icc + endif endif ifneq "$(mic)" "no" diff --git a/openmp/runtime/tools/lib/Platform.pm b/openmp/runtime/tools/lib/Platform.pm index 584eeb7491f..d723174a29e 100644 --- a/openmp/runtime/tools/lib/Platform.pm +++ b/openmp/runtime/tools/lib/Platform.pm @@ -48,6 +48,8 @@ sub canon_arch($) { $arch = "32"; } elsif ( $arch =~ m{\A\s*(?:48|(?:ia)?32e|Intel\s*64|Intel\(R\)\s*64|x86[_-]64|x64|AMD64)\s*\z}i ) { $arch = "32e"; + } elsif ( $arch =~ m{\Aarm(?:v7\D*)?\z} ) { + $arch = "arm"; } else { $arch = undef; }; # if @@ -59,6 +61,7 @@ sub canon_arch($) { my %legal = ( "32" => "IA-32 architecture", "32e" => "Intel(R) 64", + "arm" => "ARM", ); sub legal_arch($) { @@ -76,6 +79,7 @@ sub canon_arch($) { "32" => "ia32", "32e" => "intel64", "64" => "ia64", + "arm" => "arm", ); sub arch_opt($) { @@ -153,6 +157,8 @@ sub target_options() { $_host_arch = "64"; } elsif ( $hardware_platform eq "x86_64" ) { $_host_arch = "32e"; + } elsif ( $hardware_platform eq "arm" ) { + $_host_arch = "arm"; } else { die "Unsupported host hardware platform: \"$hardware_platform\"; stopped"; }; # if @@ -178,7 +184,7 @@ if ( defined( $ENV{ LIBOMP_ARCH } ) ) { # Use arch specified in LIBOMP_ARCH. $_target_arch = canon_arch( $ENV{ LIBOMP_ARCH } ); if ( not defined( $_target_arch ) ) { - die "Uknown architecture specified in LIBOMP_ARCH environment variable: \"$ENV{ LIBOMP_ARCH }\""; + die "Unknown architecture specified in LIBOMP_ARCH environment variable: \"$ENV{ LIBOMP_ARCH }\""; }; # if } else { # Otherwise use host architecture. @@ -191,7 +197,7 @@ if ( defined( $ENV{ LIBOMP_OS } ) ) { # Use OS specified in LIBOMP_OS. $_target_os = canon_os( $ENV{ LIBOMP_OS } ); if ( not defined( $_target_os ) ) { - die "Uknown OS specified in LIBOMP_OS environment variable: \"$ENV{ LIBOMP_OS }\""; + die "Unknown OS specified in LIBOMP_OS environment variable: \"$ENV{ LIBOMP_OS }\""; }; # if } else { # Otherwise use host OS. diff --git a/openmp/runtime/tools/lib/Uname.pm b/openmp/runtime/tools/lib/Uname.pm index f978f8b8a83..9556884cfbd 100644 --- a/openmp/runtime/tools/lib/Uname.pm +++ b/openmp/runtime/tools/lib/Uname.pm @@ -145,6 +145,8 @@ if ( 0 ) { $values{ hardware_platform } = "i386"; } elsif ( $values{ machine } =~ m{\Ax86_64\z} ) { $values{ hardware_platform } = "x86_64"; + } elsif ( $values{ machine } =~ m{\Aarmv7\D*\z} ) { + $values{ hardware_platform } = "arm"; } else { die "Unsupported machine (\"$values{ machine }\") returned by POSIX::uname(); stopped"; }; # if @@ -276,7 +278,7 @@ if ( 0 ) { or runtime_error( "$release: Cannot find the first line:", $bulk, "(eof)" ); my $first_line = $1; $values{ operating_system_description } = $first_line; - $first_line =~ m{\A(.*?)\s+release\s+(.*?)\s+\((.*?)(?:\s+Update\s+(.*?))?\)\s*$} + $first_line =~ m{\A(.*?)\s+release\s+(.*?)(?:\s+\((.*?)(?:\s+Update\s+(.*?))?\))?\s*$} or runtime_error( "$release:1: Cannot parse line:", $first_line ); $values{ operating_system_name } = $1; $values{ operating_system_release } = $2 . ( defined( $4 ) ? ".$4" : "" ); diff --git a/openmp/runtime/tools/src/common-checks.mk b/openmp/runtime/tools/src/common-checks.mk index 08c246f0954..0959fc63ebc 100644 --- a/openmp/runtime/tools/src/common-checks.mk +++ b/openmp/runtime/tools/src/common-checks.mk @@ -19,17 +19,27 @@ # Check tools versions. # ifeq "$(clean)" "" # Do not check tools if clean goal specified. - ifeq "$(c)" "gcc" - curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --no-intel --gnu-fortran --make)) - ifneq "$(findstring N/A,$(curr_tools))" "" - curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --make)) - fort = ifort - else - fort = gfortran - endif + + check_tools_flags = --make + + # determine if fortran check is required from goals + # MAKECMDGOALS is like argv for gnu make + ifneq "$(filter mod all,$(MAKECMDGOALS))" "" + check_tools_flags += --fortran else - curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) --make)) + ifeq "$(MAKECMDGOALS)" "" # will default to all if no goals specified on command line + check_tools_flags += --fortran + endif endif + ifneq "$(filter gcc clang,$(c))" "" # if build compiler is gcc or clang + check_tools_flags += --no-intel + endif + ifeq "$(c)" "clang" + check_tools_flags += --clang + endif + + curr_tools := $(strip $(shell $(perl) $(tools_dir)check-tools.pl $(oa-opts) $(check_tools_flags))) + ifeq "$(curr_tools)" "" $(error check-tools.pl failed) endif diff --git a/openmp/runtime/tools/src/common-defs.mk b/openmp/runtime/tools/src/common-defs.mk index 1c164bcea4a..ebd1922c7a5 100644 --- a/openmp/runtime/tools/src/common-defs.mk +++ b/openmp/runtime/tools/src/common-defs.mk @@ -45,7 +45,7 @@ endif # Description: # The function return printable name of specified architecture, IA-32 architecture or Intel(R) 64. # -legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(error Bad architecture specified: $(1)))))) +legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(error Bad architecture specified: $(1)))))) # Synopsis: # var_name = $(call check_variable,var,list) @@ -128,9 +128,9 @@ endif # -------------------------------------------------------------------------------------------------- os := $(call check_variable,os,lin lrb mac win) -arch := $(call check_variable,arch,32 32e 64) +arch := $(call check_variable,arch,32 32e 64 arm) platform := $(os)_$(arch) -platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lrb_32e mac_32 mac_32e win_32 win_32e win_64) +platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64) # oa-opts means "os and arch options". They are passed to almost all perl scripts. oa-opts := --os=$(os) --arch=$(arch) diff --git a/openmp/runtime/tools/src/common-tools.mk b/openmp/runtime/tools/src/common-tools.mk index 65bc92e87e9..a9c9fbcee65 100644 --- a/openmp/runtime/tools/src/common-tools.mk +++ b/openmp/runtime/tools/src/common-tools.mk @@ -33,6 +33,10 @@ # on Windows* OS generates such a dependency: "kmp_runtime.obj: .\kmp_i18n.inc", and make complains # "No rule to build .\kmp_i18n.inc". Using "./" solves the problem. cpp-flags += -I ./ +# For non-x86 architecture +ifeq "$(filter 32 32e 64,$(arch))" "" + cpp-flags += $(shell pkg-config --cflags libffi) +endif # Add all VPATH directories to path for searching include files. cpp-flags += $(foreach i,$(VPATH),-I $(i)) @@ -60,6 +64,9 @@ ifneq "$(filter lin lrb mac,$(os))" "" ifeq "$(c)" "gcc" cxx = g++ endif + ifeq "$(c)" "clang" + cxx = clang++ + endif # Output file flag. c-out = -o$(space) cxx-out = -o$(space) @@ -70,7 +77,9 @@ ifneq "$(filter lin lrb mac,$(os))" "" c-flags-m += -M -MG cxx-flags-m += -M -MG # Enable C99 language. - c-flags += -std=c99 + ifneq "$(CPLUSPLUS)" "on" + c-flags += -std=gnu99 + endif # Generate position-independent code (a must for shared objects). ifeq "$(LINK_TYPE)" "dyna" c-flags += -fPIC @@ -118,12 +127,24 @@ ifneq "$(filter lin lrb mac,$(os))" "" ifeq "$(c)" "gcc" as = gcc endif + ifeq "$(c)" "clang" + as = clang + endif as-out = -o$(space) as-flags += $(cpp-flags) # Compile only, no link. as-flags += -c as-flags += -x assembler-with-cpp # --- Fortran --- + ifeq "$(c)" "icc" + fort = ifort + endif + ifeq "$(c)" "gcc" + fort = gfortran + endif + ifeq "$(c)" "clang" + fort = gfortran + endif ifeq "$(fort)" "" fort = ifort endif @@ -148,6 +169,11 @@ ifeq "$(os)" "lin" cxx-flags += -mia32 endif endif + ifeq "$(c)" "gcc" + ifeq "$(arch)" "arm" + c-flags += -marm + endif + endif # --- Librarian --- ar = ar ar-out = $(empty) @@ -298,7 +324,9 @@ ifeq "$(os)" "win" c-flags-m += -QM -QMM -QMG cxx-flags-m += -QM -QMM -QMG # Enable C99 language. - c-flags += -Qstd=c99 + ifneq "$(CPLUSPLUS)" "on" + c-flags += -Qstd=gnu99 + endif # Enable C++ exception handling. # ??? Why we disable it on Linux* OS? cxx-flags += -EHsc diff --git a/openmp/www/README.txt b/openmp/www/README.txt index 3880bf036a3..6ecca7f64e8 100644 --- a/openmp/www/README.txt +++ b/openmp/www/README.txt @@ -74,13 +74,13 @@ Supported RTL Build Configurations Supported Architectures: IA-32 architecture, Intel(R) 64, and Intel(R) Many Integrated Core Architecture - ----------------------------------------------------------- - | icc/icl | gcc | ---------------|------------------------------|--------------------------| -| Linux* OS | Yes(1,5) | Yes(2,4) | -| OS X* | Yes(1,3,4) | No | -| Windows* OS | Yes(1,4) | No | -------------------------------------------------------------------------- + -------------------------------------------- + | icc/icl | gcc | clang | +--------------|---------------|--------------------------| +| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) | +| OS X* | Yes(1,3,4) | No | Yes(4,6,7) | +| Windows* OS | Yes(1,4) | No | No | +---------------------------------------------------------- (1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are supported (12.1 is recommended). @@ -89,6 +89,14 @@ Intel(R) Many Integrated Core Architecture (4) Intel(R) Many Integrated Core Architecture not supported. (5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0 or later are required. +(6) clang version 3.3 is supported. +(7) clang currently does not offer a software-implemented 128 bit extended + precision type. Thus, all entry points reliant on this type are removed + from the library and cannot be called in the user program. The following + functions are not available: + __kmpc_atomic_cmplx16_* + __kmpc_atomic_float16_* + __kmpc_atomic_*_fp Front-end Compilers that work with this RTL =========================================== diff --git a/openmp/www/Reference.pdf b/openmp/www/Reference.pdf index 60ce4008d6d..680f98c0faa 100644 --- a/openmp/www/Reference.pdf +++ b/openmp/www/Reference.pdf @@ -778,11 +778,11 @@ endobj << /S /GoTo /D [521 0 R /Fit ] >> endobj 523 0 obj << -/Length 252 +/Length 257 /Filter /FlateDecode >> stream -xڅMKAwIGQ(voұt-eSO!XY]^,-ԯ d95h^cyմ]=C:bCؠ!B>'ĺCp2(zNF1c$K|6#J|(oVb*_6T~BoCeuȠLSdٚ+}:kLMn0? Xd--YBm~^rbgu
<l: +xڅMK1aǙI&=("{SƲw?j]ia&AVSOx"D$zV'%ւ$M_Cu1D48d%=',XvDssus@T=:DHM[fSr^n~ܘҢA28TlȠ,rǛm^p/:7A#Oax endstream endobj 521 0 obj << @@ -800,16 +800,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 529 0 obj << -/Length 1187 +/Length 1184 /Filter /FlateDecode >> stream -xڕVY6~ЇRZK]d
4Hh$*:u}gxȶVh'fs|s{{z]]nR/6ve4Mۖ'_WooNQ/<ȣ+է/+AޣAɽgY{Ii]yWYPv{㯣,'w k7j75B`h ;Cu45&~iQ觔:6Pu++ߚ1%Gf+5AaJ~R!%;7Y;YtT!^.{<aޡG۸mL1|w !_'l - F,9&4eSJINJ%zl@ -2S$vZ -7|IwABcif`;SKt܋<MJ+ɨi{ޅ4m[ɂV`! (G"!A@pߍA)Ԫes@YI'+e7G!dca>nFBTغcȦא.*dtq09Mqqm68/Eͻ5쮹2nE6 Zgc̢n5|_mKfvnVCR66k<"ص/9; -56vR:}8
]I@ini4H[
n~ѓeЦRT\n~(Dv9}6;;w?ܟBE:,Ujfq .~}`[[`E
PƮ%TXM;wjm+!M|/-!+s;<fT;itKDK#2Il+{+a4ģh
F(XN*^a $i| -kqD339 +xڕVYo6~_! +L]ĉI@ZwHFG,4퓆399(m=ݬlVeaIim^^!M}f}-EVQEzUx5{$L{֚fI Ѝ}E~F!q7W:v?VQq:'v2cW9 #~+E;{lY`[`J5X "2Πwg=k-Um}Zf݉SNU:ɿw>ـfz$Qe9:J㽽7 +|j1uJHhͪaxm$p&V[xf}]=5Iz1|[t +iNhN惁Jiئ++-S/aγvJn$RL,5k4P!y%Wx6|IuN\cif`;SKOt܋<2ɨi{߅4}#*ۀG"?'YgpYqýE#S(hUg
y@YIǷܚ+z +0uT7J!*Ml݅?mdrvpkH>
Z~z8~I8{f6Aռeݷ_z\7p%-ijOĆ ٘[
77+ezr̥)͚h8v닶qSFik'x?!ӧ!Mȥ&_,ua"g=-]n٧Xm*UDgHݮ8#c>wVugǻcH%Fmլ0.XEï6rmksQs endstream endobj 528 0 obj << @@ -1058,15 +1057,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 609 0 obj << -/Length 1208 +/Length 1206 /Filter /FlateDecode >> stream -x]6++&LYb7ðXk0Wav= -2ƫvommZ$64&zk(*HH -gx;LL+cicw -ŰK/RYK+5=76ĸF, -ϱfc̶1 =8|j>rΕ078LjOY!#s@k1КƏ Xh4qՑVж7 +xOs8:z6lg6Ca&^O7+@άk^=J@͵ˁ]!(= +āBlO1s+IeETJׂsQgywۦJjaWsjSΠTA2 +WV"zagܞX$Ȣ443FǶ(0C@t1ӃԃP;D
CGq5MVWhFxH4*54.mJG
C-xk*'/K"+-E0}meim|ō!+ۮ`7[[<FR$F>&ָXF>QRpgfXlX3SEdOUg&ه*n\B9L@ub!V8K%CY7Q>ņ,06of$2#3M:
3Yϫp>tȎr$wd(Xt~W:z@ЦSvۄZ8[r7qAZ±i|(8fr0k0_K˂8H{xZP\m7^O2f㯱z\7AZKVPbsՖ\:55LE_ZeX|v,>Y=41'LY>ĸ,{핑hYMʼLq<F2Ŭ?k)O5~ + ^ao~`Rlda|G(~^_z:Ź2!:f +w{HumEK]Iݯ[U'y7+'</¤_: endstream endobj 608 0 obj << @@ -1362,15 +1361,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 652 0 obj << -/Length 1113 +/Length 1107 /Filter /FlateDecode >> stream -x]sF+.\&M2ʹIsggS 5u} Kk1bŬ=E ~:NsH@j\{o>}~/^$)go3l[>0g_X> --c;ؓ3瘩&381LF\3""2]`H>#1e4br=ljb-V&]qf^'qrA1%>5C1h̅GMtm¥' 4w&;vIz2]jtҜO&wyds^xI3x -#@&X-z, -鎠iol%ԤvrImSs6'j:Ǒⶹ/'GsnjjXBxWi6iM%*0?x]<JO=BƬ<1Q9devms?uY}T+֛x6i ҉Cbvӵ[m"ZeAZ-zfYUgӍo۾"k9KMXMk}7s#wIٲ~ZA>Ow&1j
Bt[vog`#VQ>:|F݇LJNEQk,3o[ϰIJMպ$Nvvc/ceNλ0'8{|L5swO/0MG^f87R1u*20
m&CXhTMzJ%QϛD=J -MJTr=T*X8\BE9H;'ޤ&}lőbgٝO.ܬn駭IC; m%U i=HG}UsJ|ާy-m54b|ᾼ. +x[sF+.!mL39f*!$rY"O\ÍѢ~bt9PPAH@j%~ax.b۳z"Dg +āΨ+R(9fZyAzx
>8}1WsE9uOz-U]XBezra{rf3dg6A"ȟkF:S}#䨁S:HQF#&'XI\mqSF-6+beev(Y+S_S3hCawI]xD D&],]zIs56R\x6,l`6$8 +턴T$V|՜6}ȡϧ}Bo0mYɧp(8&qRI endstream endobj 651 0 obj << @@ -1666,15 +1663,17 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 674 0 obj << -/Length 927 +/Length 925 /Filter /FlateDecode >> stream -xIsH}zz_|TRYflnN¨-S(}^xHThZ~+Mf"JdUiRH[EٷK "0c~gWG[`JW/-;D0]73WHH -NVNt -uGQJ ^+IpN9gM:L:ݬ\^'͐_
R)lhubqhN5VZU9 nƥ&vc<
.
<Ox
Q֗K#!
\&[j`sJ̪ڕOUtY@K5丑Q%ARF6UTX/AzDY&kÖ%S*x$qW-R9%Ng}5قevAy*bN|1D+1aS3WM ]IV -)kֱVЂ:z#9uC>e5-H~0̲߾(FjJ9݇|vNzpA=aفBX$$T -~/Ipӎ{5n7.o +xIs68ؗędus2eN,%:y⚤TGn3S;$=<x+A +QfbˉS@Kd(Z#8-gEpwˏ?,»W;%J׳-;Dp43H*ApfhV+\uO;E(o4#WUGD4gBp|:ќ_mu +I4WJ=?`C01p$93D~,/"M oUpR1diNJxQWO#>N/Hs59JʪڗO=<UtY@+I丑15x1NqR}U*mQl3ю=4EΉcrlɌ<cƯ|d<bW*gTB" +5ӿ"f +x1;.(oE\C̉o*hE5&,zՐ@H7xz.@}FM!bCDY2T 뤪t`)2$ۻ낢¶aQMOk?8MS^<4c} ݧiٙ裂~tʚw -N>0a;bPuwOdUM"<.fw%j-Qet;0cF% '2f\#@dr/a~$V{ # 7=4@F9=(%%TvGoqϠ;Cu.SHn +rMf
ܗI72+δar1{8śzzW}X_h䌰iJn}m^gk +-(PS|ێ\5n-4._oW endstream endobj 673 0 obj << @@ -1885,24 +1884,24 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 687 0 obj << -/Length 2637 +/Length 2634 /Filter /FlateDecode >> stream -xڭZܸ
(ïW 6MhPx#{ΏKEnjMˎ-QEH~z"
Q$[/XE^ -q:b0/NDaoz/?K1.@ZNLѼk)NWM55;l_~4 pD(ozK00&'CT(YP{w`MDKCҋ#V"uuբB]@4~*)k4MVuG#m8B~sMVk(Y+z4_l6i"M,띶 -Xs0n(Ѣowu_o4UeepVn~;
n -MnĊ44*/-Xw7r'HQc,*o0.<Dl!,D8#:²YasMpaJH'2H7eGse~Ĉf&wĹY﷏YBogHDTCL- -kY8tFZ'>!pcP:vyN|0x19(ڋY#]Se{,,C`80!㯖Ɯ7+%Yg"22#Qc_>gFN[C=|B譫XdxݎPD0L玁ޭ -}wG!thؼsFMf^C:PeFz{:z1urmtO{{h<^h'wX -꾲Vu$}rPdr̉dQ9rs){1!nFI!.:{c^m[qb5hF{7u5
jИ&eZ8R[w<x.K&ᗼI~f!h-%hhTήÊh[mVrrˡ)!ξY`^ͮ, Z܈+6p-fЦLq`k]Aa08k4.F/`zQJvt F!]8a00m{sˠ\Hn rZ
'(tuD9g6 -;,:ꗰ)xiݡl'Jlk)a"D4Aq-pA+Ks&^ -ҳ*{x -Z4I/ -e\BFs/b(y'(Aq} I"ȋ,_YT9R8bBʋKƢiv9aB8,ͤKKIJ8Vβ425Х&4J*S -2^0u!{5tMFo=˹Ql6$1"%CmM~. -
(P?OOt&G/Tr[㈩οx -(;yR@ʼn+ SM. +xڭZmܸ
HQdKk+KCI&[Er(c=g{.Y%E/3n6/;DQ"
/~ɋ,Rű.$i{ID,{Zt俬{S}PQZGQٛV\<2/*FZ'BTD˝U^yZܹ7\ KOHUmv ~d)w^i(V彻E0UBOD"$Kb)V*MەMݡB[h8~4%SF~0{Sж[`bi?fT&͆8M$ݴ܌_n
ϚlP*b-ȢλivG6 +eh>*y]q60sLU\hb[E, +l@oꢬoJEey*#)GiI u* +CpaJi'"#&(5j!?T=Ylw gtpjpȞ[-|ƘD\I L4@2"\bg@ҫi MB+wʱ+ +ҍ!XA\^"P:?u3")R=?}aP:jiy$B}-|ԘϹUfoѬ́^>!A^7d,|i=~KO7P,T(掁m +BgS}_WVҊ_QG.*5h9^xEpY:4l_o9'ռYr;(1Tّ^^@2w3ZsmyLJ{AM~rSبj~ĭD}Tݓ+WfNؑk/kTV=Y+c"8X?܌o^]|c^t5@雦[yCfiHLwGjcT=%"^f˒i%G9 4Y4G*upAxk'Ų"&bq̊ͷL7۲fy[n#[!LIoakSCA
QQیb0(%P:ӄD\tM}kƐ0n̠ZHX7a9Hu[ +)$3- +<%H BsPqhw=:J)!exFqb!KʀI$/H +8\BX$a]Ґgivh7 1_ +Z9dt8l! +o~( +(<)PM- +^|cj3[fgp661v@BNeTe9tËwnrb@wV4"6D7*PÅq=Ğ/~6Ld SW=4Y
).+Ll1nrYanPNFd_(|Ɠ0CNzd˪2Ւ
q=Po&=K]϶XjTc=ÖU_]?߶&/:- +ã;?כi7ZC^!oH[Somi0,
C܆}w6ԨXkp3DHtB;ɉ4NE¹fK=TP4K隝`@WX<dbԲ,2*TŦH1?aDE5hKzٸ~UzdO#jNW]FIli.EY}OV~G:?ݛg endstream endobj 686 0 obj << @@ -1938,22 +1937,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 699 0 obj << -/Length 2939 +/Length 2937 /Filter /FlateDecode >> stream -xڝZYܶ~_<Rx$őʮ8VʃRqIKrCM*=}r<
Fu9:7I}I|/c'k/VM|pu+o۬]+߽瑟,70L(J5-p7W٧W~v|/اQ0 -(]9qE
cV͛z}NGCMse7ꚳOe}nznUMi┛K?dUu/'m"~ߝL;NHFH]b{5yYUCäf}Sİ5YEvk}-C%zVh^ܺ5+Az46ؼC;ˇn\ֹiUv -PDP,<4j.?Ȗa
mM>
d/_oznPa30ZIuNё#G^c "p)]UKܢ5]x!NYK/_Y[f@V1.(bO
[ -SC;{`Ir= -% -7P
Nf^jn9Lalv2GƃI ->N1ox ORX@32 -B1`p%LܝzK -G/Q0 v}df(dK,rvtr?ĔX2, 9T`f,:[J("+P4ڻp^a<).Yf&hFX/Zah -Scu+Cf4[/*tppeXgĦms=qKW+& -.N:'c'Δ"W?v~zʍ}&ΡzEĢ;>g -Z/* D`e!vAifi~?cdž2D`굉KI +xڝZYs
~ׯ`hy>qV6U"{fXcVT{p5/Qts\`J4|zoŮDʉ<뺰>۞.U+oڬ]z}#^,럭 H0L5-q_/<s-od$N+?]|õ +r?M;<YA;aC>]D"GLB;oro;D\ϕupkN?1U5)~Ȫ^&["nu;NHNZHl,"kI aZaWpNdzuޗ`ay{qF*lcX**.qZ[Vu酶8`$Ü:!Zrp^Z~g+x*a/9@: + +{RZvquNс#vcs8L#o?p px˛bEJA0nb\Y'QDf
[= +g]CI*sSGC])zNo>~ie4'OQ +;A +a+ +|VAo1)0ziBO2]B6TY}Ӱ;>`MuhdQx}4 +O&MfnWshP2$Co9|!k- +s*-%w$E89л,Tsi)ƾ"}9J[q9TdӐ+.7 #b`A;PqltP1!;.4`lƼ3Uff)ln +|,F!%zSt6 endstream endobj 698 0 obj << @@ -2017,15 +2015,22 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 722 0 obj << -/Length 2187 +/Length 2188 /Filter /FlateDecode >> stream -xZ]6`fg2X -w`QRQd?܄V}MZwS&FJ -VERDըt)-~./@kHG6HM!Fæ`F3r1hȀ(JzǏ|taHn4l_#(5)6%dU/ԲVwnfé1_g1=H$>'q-1Weўu_ڠM,.faس&vE.&9;H^<vn -f]HB,jE9ɚB=KhSRR4ޗmSu.Y+tjf)C|E EO.}(,7~O<A}OmtXb;CgUӕ-uma-9;gkՋ-¯?~MUU l -LqTk=U0f +xZ[6~_!`ތRE),LM&.,Ӷvdɕ"J{d'HC?'/l <ǚ,y l!k>Lf?ɫG{^<ɰ=.qp8(Q:K\=>-e?.YQ1!8#\sb\ί~Bl)Pmvx{gh-oX8o̭b`Z~*ka"PGmcaEQ=o_^YD|L]8a~074t#p5u$ݓIFQG*a2YJdK閲ek_V:v7yNvQ!iy>Ӌg6s}o +-udqvET+*$e&j:2&RZdpKIJ-Qlm%qU`yۮ_1mbz'.[I*NH~v*6NTdU#|tQe\BЎg>gȳ#%]b{+9`܀IQj +A8,H {?=o rQ" +gۢ|44)?QKrޖ|؎U2&|ːI,**jDk$MF.TTiT +3YVou(2qZ@J+8ڒu [ +o^j|qPM
KuN]`A1jZ),R6-e>k4^)0?uVS +X7VwY/AlH d=(ͣ;)筑B͓I o#y0If4sqWhWê(Ԗ +=w8ߧjłꝁuZ>Z&?(cR[Ŏ+QHblC-}I&O-Z +F@gJt:f&1Da]OkIPc\(P?ZSc ͖cJPJcV"3<m`PVkm!a,U/>"5cWӳsll>J(M-0:Cti3E-/84ΐInte`FrXqٚ6}&|us<jW_ooo~VU榒VcX&D5J2y*ϠU=d
sMPypeڠC@ +~LL]Tśb;f%@l WQڅ*;Xw:t>Co{v$GGbcAعx8>|$(%Cm?j +;ZraC}DC\O Ќ4(z`, +NQg(#Τ!-sgdљSf@Lx&pnMi(7skcƇOiLo6\ރ_vL1ԗM'/DP9jC}0xn^">Qo+4gaAk^v>il=#7C%ZLY? endstream endobj 721 0 obj << @@ -2147,15 +2152,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 741 0 obj << -/Length 535 +/Length 534 /Filter /FlateDecode >> stream -xڝMs0{t,Jt2N'8NiῳL\"g%o\M|hp#!e4.bv0Ƿjez -J9ڑMk1:No'm:`..w -e{%j%iKZ<2iQҭZtnLt5;]"lO?-}ۻxGa'`h?X~ա٨qkށ
`:鷁/$4&-fx- g给1ӬjNmr7bRMW-jP7NmQUk"pqQ*\vXUT,?7.M잿 -c8zhkS#iK}/mnn=/E]MpFl>RbUX2,_6ai㋏ - (鷬UhmT[bs+iQN⻠Lkvv=,j|qxſ +xڝKo@st +Q[SENi-'8B|w^)jKvgv?508L&K0`$ːE6]oWn7C[TʒLjgp2 |o)kъAFgP&7kDKگs)`- PTd魋k#mιFH0#K4p*9yDT~U5\980(3 +J~$nɳH3Ӽq6+]_2ڸA֮*I*jt7lLX(z -f1zjJ$..8X5Wy5TܷJk?a_\l{ʯ}>OOѿQ7`c&+\V.3)zZ~s~å_v\Y2V nJo-* +a + (HLm[Qb.E~˔rryϼhǛdu'I1 endstream endobj 740 0 obj << @@ -2173,11 +2178,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 745 0 obj << -/Length 322 +/Length 319 /Filter /FlateDecode >> stream -xڕQn0+poc܀C +xڕQn1+|H=XQPQns,!ЎZdˡ=N60"%z
yc$kȜ1``C 5EOoMcMZzbV#9IRZ&#)lQ_&1eUy|}7E=Gz/ir/C!W%y!<"O1',d2CXſ1 [܃Ғid<lF0v4LXҒ JE$3uPϏaw;T9mNa.se\u[POԚotI 5[G9$B"}?m@G> endstream endobj 744 0 obj << @@ -2295,13 +2300,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << -/Length 301 +/Length 299 /Filter /FlateDecode >> stream -xڕQn0+6Ǫ-**܀4"ATvgv0%w}t -,uZv`Z8N5,ebu64Vg}s^§7}Tr!#_YK-Q!w3@*YT*).`AGS 1hمACRQ`S_f<fXSX921tDK9&u3Ŋ+/G__qG.8rF3v -Q߾傏Saχm 2L.lN&˾'8ష"y +xڕQn0+6NJ 7 endstream endobj 763 0 obj << @@ -2362,11 +2365,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 774 0 obj << -/Length 302 +/Length 300 /Filter /FlateDecode >> stream -xڕQn0+ǾPQ>
8P<h*}8AzixfaSrD
Vk0 A"bHJ";+nlX.f*:u<r/<
]䬥K(b YT*)<.`NGS/1hم^CRQ\SW&k]U1x:l"DpGԺbɕǗ_qyGwa;GHjeKD1~V>rޏU+]~ڭ0:κ1:۞~_~ +xڕQn0+6ǖZp +gg J+x#/T&HG1Ք-\#u!TT>7]|X'>DDb|n64\x|zs7G9bQ.XQ߾UylNG]?fYw6<>e|+
8dy` endstream endobj 773 0 obj << @@ -2428,24 +2432,26 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 785 0 obj << -/Length 2709 +/Length 2710 /Filter /FlateDecode >> stream -x[mOWlʚ;媤UU*e_X 8KͯObArayg{{vs緡 -d0RRzAH$zq=c:l
]<ⴌ$Kuo~"{R{է_g?xPy!OWٕd5dU
ɀB8..prno0@YT2̐"3JWw]rDZxD F/S[`ؑ&<)Gl=Zen.QH&75LP{ -Y]TYF5 v*^T!u54/-cAP_ҥkJ{" -QH[MҚme -l(QgcJ -8Uܗ q\VA8T/4ŁG(Y,[ -fׇ%XlѼ͗])v_ھ$GG/8(eVr?ʣ]\'~^O< -DRMs$\P&`ϵξLi:鳩%QNmT! ?wShg?6ǰLUiw+W=I@!E_/;}=M?OrjsrHi#?Ɨ&Ay3uOC1a,7=qjcH@!EۃSr;Vxi5Ƀ6mFWh r
[/W|BnVDUmGQ~ohb.lBȜzt{XQiWD,#b(
6O9/a&^N XFOOvON-5E7noyO-'C)2m&nTMB{`W -K8ej]:6}E9uSIv=ߡR"΅j;z -D"I26,| -:/`<wwS43ެS@lc'pe -osF,κ\DULso*O'/&(z%8r"pUZ{,RGS8@aZ]D?Kzxn,gz.8{J1Di0pJKײWszÆN&4B}i&=s5lձcVsU{'*hZoNMO -wT7$n<sH?rM_ =G?ðp>tohqOAPꃝzTR5O%C9~ŐT 8hU7̓U(5?FWgPE fF*H3I=/hq업}^)+]Kl8-leCToFFw$LY
<,h$H$hFp+[+OS`p%.[%Gͳz -L{ V?v_FE\]MQ܀ȋ?ъsZ\$&F?-t^>"@t bXfϊ qpN=2vfs7?{{CRLk!rw+?VL?O2CvT1&ULv.+{rG:䮱|tSpQ +x[mOWlʚ;媤]l*/[V%_bArl0t<3{{vs緡 +d0RRzAH$zq=S:l
]<ⴌ$Kuo~"{R{է_g?xPy!+K_j K" +p"\\6 +$2ta$Sd!ED[gj划v;NÛ@ +B;_оLc?
Y>D`<1A&D!.\ +h +^*{{ͰQ~ezMw;}fJčK2T%yvk&`Vo,mj]jhˍǺUߖzOk}ҎȵG[F ++ bcU/4ŁG(Y,[ +ILYj>-$~yk}
#ʧ}qoݻzVdmV@ aȤD;{dxK\M˾1ݗ +f%XjѼ͗])v_ھ$GG/8(eVn5~G!N*Nm +>CM!bBїHa1BEݲ70$Doy\AM&9\ +y6x +HZ$Yb
hWtcD<s<^U!HOPE\e6t2H,pTO6q+XԮYf6ߵS>QACzEeuJՇoz>֬ЎAPL[7fe. +{ \ +,h$H$hFp+WPJ]J7#gfP`OK%O2*>$BǾn!]8uJml"IoGHџ.AKOa0 +!uqwz3*c~I}hBR\-n:x{HTH$ʏ+3B2rD0q|<esUُ]]#|Lto:)ƿIpP endstream endobj 784 0 obj << @@ -2500,13 +2506,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 797 0 obj << -/Length 1151 +/Length 1149 /Filter /FlateDecode >> stream -xX]&}ѮmUUwF]mn^U$qY'3'ʹܗ@.~A`~\yo04-HL)IF `U?8X$*t#㹨ڦރ( -aR0J[y_=,IsD8x_({`4 H)g7F[!=!JB|y7N>ziI~H[=7Ѳv
+p\ `]bTkA'ֆZYIu`Lkto#fqwD[vS)W5~*U+e0ܱƬ^k6A-l$$<8o0E, SGɈ0?!p,xˑ}|D12U| OxU -
jN;_d|Q-CktOvx~
+xX[6~Wk0*ΨV楚YE@֘LfZ/9||A`~\yo04-HL)IF `U?8X$*t#㹨ڦ>ރ( +aR0J[y_<,IsD8x(e{`4 H)GF[!=!JB|y7N>iI~tO[=7Ѳv
+p `]bTkA'ֆZIu`Lkto#fqWD4MhVoW0'U ĨZ))5fZd?hdqk}$1S(̒0U~Hû`IbNk^G#]ߙ@tQkqA`B3 Ul㡤4XDIx'rkTf0&!l궘Ul/ գ&νv2.뾛75u>Uyz7A-n>xh}w @hy
G &qF/"&`R1}~]uBmS՟E*FX_*Qe,>͋MPg;Й[;uSi!)GCt:+-CU\C+w3fx +dj1ޝx>SY oLmNfoZ7i
z37sʰә7U`E_t*&/S{[=Dw8 +hnʍԅFSPed.ۺE2 +jxA:
V_v5& + endstream endobj 796 0 obj << @@ -2545,12 +2554,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 804 0 obj << -/Length 665 +/Length 663 /Filter /FlateDecode >> stream xڕMs0 -CTI,_9vfidlp!}~vyѲ+ q>ΧoB}dqfO-s= ]7ܽ3S+/TҮu;_cőLC*`yx,2(dx.Fߎ8)}|nx,ԗ\&ߪY&iWW2Y<SIeɲw*&Uu :+Q9Rg?<IIS:BJ@CZy:*S[dbK*45%{[ONu%$m3$.$A>m>9u'I[?XAORt4imzl
ۚ@BCG7oCCoC=D+3^O^fhfޙ }׃3 'hكb +CT 9vdi-0pCP +0q?Z^j{b];WΧg!jCX\IBqu<8Hώ֙)/uj\I[Ժ+őLCʹ,0(d{F_J0ţBbTm'm]i)yIAF7[,5Y9EK$-nGMN)
)%!dzr.;UG$aBIJ\SIZ\Zd nxēM_K<IpOs'I?X7@5h҄!`[qw4k8_
m14[
lRm}3111ΓIr89kfٛA 7>o {=z=8QrƋ=)V^H^^H^^Ny=9M0{͠ z= y=@{= y=8z25{05{Sy?yf~l6( += endstream endobj 803 0 obj << @@ -2568,12 +2579,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 808 0 obj << -/Length 640 +/Length 638 /Filter /FlateDecode >> stream xڝAs0 -CTI!rkmv&ܒ
N bW zۓdoy$\yb( FJ$ސQ #A'qFcWW6yvEm^5ҧA[qUK={.2ZS-$YW#}0GlG"2br+ɭcnbD(]);M?UNm)vy&2Y7]毣aF.B >wق0ޯ$ƸqNM[Z]BbQIV"P2&n(F/M5\uotf[w4-l0Y@g7Gq¨ؔuĭýq*UE1
ݾ8]\
bxDR;nIām '-&,80zz*Y(-8?4*itӘluP-gao<i\QYOOf=>ǃ/
.mz":a:6SkӹkEEI*0:Kkwۼq.(+R@W`/./EkPtAPҐC~ϘNmT+ /Vmj?ś[Y
6gfAD> +CTIL;mSnILA8 +ο@0d7'dyoy",ω&>I$bTIIXPIY@BDjv6urdmcrKa[aޗ{?*+EȪ{Q?Vd;5 B+bة[.4|ujWr~oY6]"җ?Uڴ)^Ì\DV >wق0-$ƸqN#P-@bQx4/_(RG#ÝǦCfy'
,uD:(B(NtZٰAp/3DTvr[#\j8*85{ +Ҙ +N"t
&,80zj,I܀
ʸAgABe=z +X֛*,Me=z +hS<濬1*~/96]1aTD28XJ{. +E&F)wW+..Y|_:ۢz<ZC#Nc:ZFNe]8od39;~}}6۽=
@G +nI= endstream endobj 807 0 obj << @@ -2591,14 +2609,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 812 0 obj << -/Length 857 +/Length 854 /Filter /FlateDecode >> stream -xڕXMo0+|umcjV[G9VQH6,_@d#9ن71,A2 fOYpv1I!b-QJEYnC* - ǜ>nUD,zUjgmY+d߀j,AͧX2Up{OP]iBDEV'1NcncmR+(&ߋN-&dh֍[ךzpu]2Brv2S\gEΆSĒh6nǘbb6ݽm*$쪹v\KbS;~bF~r7ѩ<b$|i1)To,EQ{zo6Ew2=_x$.@ӵ>DՆ-sVJx/) 'i,:}~?z1uU.˕&ͧ<p9][ -BXAIIi|Kfha,b
p m[$H$D*I*I*IHHo "#z_c8?ƍ -nP}p݃,TZ!ֶVn;7)nBqsvpZ^RW;.sDhӔF4=jwY̯Neշy3{R֛'C.u˃0 +xڕXo0~_GZg>N[U+*JЂIQߓmЙQp5afw4KIʨ,'~vM$1D>nS<zUjmY+|M~O@cRRc&ݵ&e<YdE$Ilؐvڲ+S+CdqCHq;ƢZTnKZCH.ۀs4vg?F9b,Xǐ'A#f6m*tRq.{+̌"r7ѩ2,;cL@oYEQz/vEw2=_ +0O endstream endobj 811 0 obj << @@ -2619,14 +2635,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 817 0 obj << -/Length 1078 +/Length 1072 /Filter /FlateDecode >> stream -xڭX](}ϯё&0`\Vj;ڏ[ęXM.N쌕O|8\=B#"ni:zw -p*e+DIʰhD"x}lmΚ*/$֤v -MՃ#RX1ѷ-/8U"M
ݏT$qĪkf?,V*kmbXk $^"y -6>63aaw&$GLD +xڭXَ6}WQwQA[h--%Wgח6`@ޣm, FP +@rF2:uUy[~ +jfDt,6e-+E&.WfS&J12]a(Ya*1-bSVao(79~{i7UUOzA&ؙEQ` 57jRC&RQ̄e<$ze#8R}ME@d*VpU2`MIaw1g3G?2lG
4.#L<<@yPo_HF___z_YzL24Pu uJouJ_ubX3WUxo!p_Zh[jof]
!Tnu{jUA}****iӪ8*
1XEXEXwz81$٨}&ӿ1.)s!Kߝ7ۺr- jkG{Z[}7oG{EXV*dpE1V7^54+i1ʦcͣ^m}PpW:` endstream endobj 816 0 obj << @@ -2647,14 +2662,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 830 0 obj << -/Length 1374 +/Length 1376 /Filter /FlateDecode >> stream -xڽ[oHFZs}˅Vi&KjB&Vf6sI}H0bcmĽEB0oœBx2Hoxw> G=י<YNUGe_Lee\y;Q[gdֹ~{aĢXμ3c}N'FCT,=BQD_- -Ġ7nE>C -G!~\V<e>3WS膖!W_su6I|O"/!`K%0kՔ[Dfcg?irN/e_O3;c(tvz<]L`מFT{#롎E -r<WWV4P'qPUazb:tgazP{~n%XcL~O]UN'E^Ƌg+?<@aŴFT/=IoQ>O1z,1pww;f۠[K$]x'^cܭ-b&oxP%]%$ra^Uf4O +xڽYoF)!Pm̛%p5@ōCD"Uj~Dd0yIӳ3]vf8xpw9=@XL>#%D c &i!$q:`<Ba0>z*Ux]WI1
'{lq@J!E`}:*Z.3#cN(7U,BQL-µ`d@+UqWVg_j*X
Q[cEXTr+Jf!"c;Jf)ێʙN׀0XKmcoRzdz'rו_1i?5Ў51n?Gx?yw{1>C~ɻt<~5<*b<ÿnC11G^N+0[P}ƑYgD|NUuʵ^l$# N#IP첑W}N*w>W6gY>ۛTWB2??:[Yikܓ|8QGgoc6y6JB"\p[Wܔ`le(FxB9=A%Q'Qeb^b(*".aW{/cpV տ@0|9&UsR[x
:j?Sn,58A҈"FI݅ +Uρ%:ƽgq-ӕv >K@:nOs?W/3O[.NdL3(qILw3 +{階CF*E`JLۖ$ CGpY$/#wyv]>sҬԐS=[i|VJ$,UEt')NK]D~; +r~?g_RV7y_`:a{WsԜLzgygzGbYlj>ƦOglVUz2<%p~OLm}c>Mm
V|ýoR?AN?K9poQ aW7]{=e?1k$])}n6
lLnsǥ=U)b
m{u6/m-j^05~p endstream endobj 829 0 obj << @@ -2777,13 +2792,11 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 841 0 obj << -/Length 453 +/Length 450 /Filter /FlateDecode >> stream -xڕMo0:ڇԷcѵXa-V92ɖE/;"E_ 3Ar]ōĀUrC4Qh@QR6!&mͲPܱx*@>'zk&H4!vG5|rOTlG&V&'sZ9EM(V-\/V0t6}=]+quHHVLfh~k?~7gÀRvX1!l,Qn]TK8V)ڸc:9؏Cv}= }$A0BB!AeحPyD T|1
)Cʓ^ -v)Em -y?λ#*n\{ 8 jbK`,ϱ>MKiDzHu_p<\~ +xڕMO0>&5o#.**-"&4ulg KO3<7 endstream endobj 840 0 obj << @@ -2810,17 +2823,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 848 0 obj << -/Length 1057 +/Length 1055 /Filter /FlateDecode >> stream -xڭWMHWM&Jf'i&h cb[
6{w"hCQUzL"b6H)+ 6J!1(Z>`$XP5w>iܔ~c:pƳO3 -ާ10A)<A/ ɱ.F~'L)ш2Q*V.qy8n+ĵM!af}\wMQ|AМ,ko:*FGZw\J7eVԜcyט9ЗK0LzY4(eu/<Iκ -_ވPTβB3}*eai2sj -I+{.?e`M |EW5@z2ŗ,MfУ@1H:F# -7a=pJBaxw=R@jU*c\O,Ƭˉ`@J])uXqDb';SL@f Xt@#E!e
C4OC&⍭mRLӴ) \"pɉ'PXa.XSI9 -LQ̀d\0b='IÒC=|jcettFTH)XW4n,L8+CwgK -EX".[B8ќ6`}fD 1l[eYQ?+#;`v"v؉T?'NiN2 o -ow6?*vwivE\y}jl1_ +xڭWMHWM&Jfgb=AX[
6{w"hCQUzL"b>H)+ 6J!1(Z1`$XP5w>iܕ~c:pƳO3 +ާ10A)<A ɱ.F1#>OtGwYSe8T(&]pN !V6kB"qdk)9'Xz_u+UX 8l<1&ǹ*Xoˬ9Ջ1s/`,iP.W!'AY`=^x"\td)\>#eOpg>T1ux +n|͛ÞzXquą$&z"oԢDU50j56Z$!X*=Y1y +!.L +J5nEvK]on$q99l-r+43Ep$XBxL?V~nVz_e~"^N} ɻw/Em'&U-}ji_s-"Em<eU +8tE\94c/W| endstream endobj 847 0 obj << @@ -2877,15 +2889,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 860 0 obj << -/Length 1542 +/Length 1540 /Filter /FlateDecode >> stream -xڽX[6~ĊB[gL&nx2N=B},Ĺ} -f4o(\N.~X(WuPN`|@Q,nƶ# 939E*Vܽ}k+;.╩Laoe>{(K荫Ȱ\ -I,=&N@˩,1 -@NFJ-
WU' -&}e)~*%ad)-v T!) D`.KE2|aFR
h:<N[<4gvw6զMv7E4mxYb8';a.c?^EQRG]CG,X1cС,&ih<~yۉ¼&[qe:Lʽ-V +xڽX[6~ĊB[gMM-[e8IlmB98ZD8z3vZ(AZJG +DHi$nї#>Pğ봂?zrLD}qΐP42(F6qDZUIʣr+]I9 +ˣϣ?F؛vi/UD(҄; `CDzhpn"ޡ:B*фa1u7Ŭbݗ/ĞH~p(w/!d}LE\fsƳZ~jNٴL.W7Ȋ])#
VcB1TLa8 grfK八0q5cofb
B8y +cr7yGYywڨugx]trYB{Ni8FAU.VWoQY$@cc
FngZGad LE(}؊ĥx<ADV7ځ +o|g4#3ODumP0d^C}CavrA\BBV7 endstream endobj 859 0 obj << @@ -2965,18 +2977,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 883 0 obj << -/Length 2380 +/Length 2382 /Filter /FlateDecode >> stream -x[IF 0\c`Ifb9DH%y*R-lޫzq
pwOhddK0RP$I >,(]CG0]O漋+1y<=ZJHSD``Č(V.>}bD}i]B!D- 9/~^ROn`T/>b_D,ӧwI|@ -1RH+zZr|7K{eD"U -q˟}>Ni{;vRV;Z'ўmՑd}rd4)lws[w1Z!J-aSHG]=1LiCd#vGqGpz]x^ׇ%~/lcxP"@ꂄTlr;widӫ툯ձܙ:2H1
/hח%Prŧu5kR5ID4<mO<>5bu&[L4n VaƮ::iX6 -
VE])"H.hD'BCs,S(/6%Y쬞f}?8q(M -͓10=>ORT2;kӰ@1Az*^X ʶ}i=F@ީ4C G [8}(b4'Eo-#u)BR;u>-\&R\35\89 q}år& -{~,S^5;}o;!F O0EA
}>6d.^2ǰ,nfÀoe+jty/Q]K7ETA -O.'QB!Mo͐ނ;0tX }|Oa^OgXN_ [N|^h'{p{c| -Éc}7-e|ȓ%?&ϧ"j;cZ ~ +x[[o~ ЇJ@4;KAMSM2Trx(Ŗ93}gh=OFx))2I=/+J=1'xw=
UzcxJ4Ov_@`-H)Sk)߰~0bF{d+ nu>}bD}i]<B!D- 9
~YS/`T>a_Dd[bV!6#iy9܅IS˚DJ+Ow!*}Ma.π\mKD* c$ZG\#vW9cw`-eêmtJXIGK)GFbmO:&_+D "%vtPq'o&aHz]vem5y۞m&KAh_lSq$wWǗ_gocg䦷! 4 +]_CU!VԌI&eY.fRwr<R?LL"F:mui9@.
`uguҰ:lȝϛ'mF!R
]yCX5\ЈwO4EPfY2phB,0zsٚb$G1%Ύ2[0BMț&|wij4 +(#Mt<BK>7
4HYO狿?덄s\ m 1HҺ6hҙLW&d5l;caЌ1i]|%1=ءN!kKlJȝ-#)YIjW +1"Zm
XV4twAo%vA)2.d)@dr9Taq0hV#zZ/s3ѰC +-R~?tRB8tUSk9aOyg y|j\ +/~ZOgF?S\"{lxV4
}88sxÉi-ZO+`ط5%zJ%?E/,j;c ~g endstream endobj 882 0 obj << @@ -3155,17 +3165,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 899 0 obj << -/Length 2518 +/Length 2514 /Filter /FlateDecode >> stream -x[MCl`oR{v3"A&;}Y4nu[[r&_G%Kؒ^Zj*V2^#wUdI^"C:21'E/3I;0t*]OTї9wd9ׇ")QF@K)zow4b*k2Z~FxSDm칎0鄭wM1_3B+xceoEqH^ܘ6=Sqoɫl>tt:sAotTy?nRzF
oxO<+MP,1mUxy}\ۭ,JEwp.DFMË0Cp8R @l=wXL,a.ElHPnP&B{+b#?=vKE$;Vi S3GDJ3fHTuw VM9͋"v#RrLN40{,ޅN'L!c0VN-Q,/3imsq{v#7ǰxt,}$Jn~Bs~/u+m9ZuZ -16wk+r$UϼD+GK2ЛXVL?
!nH*jK١j[CyZn9,HkA1i -a|B<JF(sMEQSՔazcT[.CXvX8 -I,,R؞uVXaEIDi&I;8AUyrŔӬ+`%@7Hx-l -挓!nOC`e -;Lk/m)l_768;NFt4f*kav91NF2GN_%er -2ɟ+KVŮk.}w0pu3ٻ3]9Zʉv Z~.!*[[i%k6Xy˛#Pp9 +x[Kϯ C$`Es3b"ezSnD+>2/#
٬j +42R%Pi)e($xx~p$T͇-Û0$JܕX-ś,Ϳ8dÏ @K)2{\Ui4p˯8x{?1CVX|;6%A[#%)˷Dl>^<zwyV'?4N/QYR +w59TQ|ڂnTz
D! pG1i\ęWzIzTPHo~:whg@RFTX'ڏDUˋ`HQ' +'Hꖪ5bS#2x,8GLT ǘDT0l)Q_(LF5BFuCCR\6n$n#Hv4pHH}P[ImАJZWar@ء5Z݇*D4,gPݡ2.5C2.1b`ݯ"S10 #D'ko'?&AU<T; y65/`AqZo^ܝ 0ٲ/C,4v0T"!PՒ<1n-$P,;8 +A9k}4}O +qҿ1\DNSu0O紈ޑ%iY[Y endstream endobj 898 0 obj << @@ -3219,18 +3228,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 917 0 obj << -/Length 2000 +/Length 1998 /Filter /FlateDecode >> stream -xZKs6WHUޏSIMjSɎuIhXH/EdvDJŲGwF
Q4yLhՏ˫9X!1X8,Y)ߗ?'BI"uf576iݦ+'_my+si2%$\}&+9D8|37T(:W4I Wďh5&a8n
D/4]"[ܦSinNJ(1iTBkA<sˈ߿z -/? TN(J+?V+jBbD -`` 2I,9buIޟ>p$VS\Ym\tZTH8[k✚8Cs^%
̀%(D pBP*F>:N(/T;;6z< -!*n Xx\q; -8ϢK՞G~Ϫ) fQ -+>h^&[ެ!1ZzrgӇsPEա2릾
SIhUߋKOQݶe -O<t\3VAtp#t+|,cX
bcU@xAz;zbePqew}B -e]on=.и-ONY$A~o4O\I* +xZrF+p,-ǔSI9u]*$T@@tB$L,Y{^!Hۄ&?py⥕!V)\$T-'%]ʳŇ˟!31\rSsMzUy_
N>3si¶2!gI:{&K9DX|t3WI&ꨓg`'%\b?ՌqbC#48g+%MY0jg-B%49d{/7M"cL
eh0X-ݹ*cuU5aAno4 +&Wu{`i^_nW͂tڗKSI(4ī~&Zbc! +S*pf3b
s +FPƍowAZ:@K\ Ŧ8#<; x +-? TNR(J="~6C6'JD 5"pnhUcYNYZ3=V,td^LpY˙ Lޘ]dW +p2=ء.;9w=UӔ=:zQeʆUtSΥ`x/3p5&ljP<%uNcqIc%X7DM{R||;C]`wrGQRj}?Nsh
>rCm ZX[e{c* ++ڗhV*_g-ѻܚkk-]`oLmΣ~ +: !eѯH +?[*xSqo|W4\I* endstream endobj 916 0 obj << @@ -3365,14 +3375,13 @@ endobj /Filter /FlateDecode >> stream -xڽXKF+t*3h|L9qٕr 1˪"FX8ίO sAbnl_rd.SRfJS$IXeٜ|oM -inju9CB1ߣN~YLL,9)'#쫗d\2| -Ȓ 001<&Ms:>s\mO;T"pP%@!X`ٜQ#Cٜ`s -aK $qB12"Z118S
I&oK=re}2GJu,zĮHAYgV) naS}v
0: -<t2E9i18IR!NQ(A< -Mel@&ABp1=v7ogOؘδ3Bq]:OG+vWrII ~*7^8,zsy]LLB4,9"^&P&}}[Zc!a䁿btPPŐ>Y| -qY:I9R&/{g}k>t8F/c9_ٕqQv齢쪿fsXR`1DUH -ʩ ڸg!^nm$YTt-Epe=}to`}U['U֑;ҚvoAmm4f?Gsa08a>]hA'[ȚH6giq1mYzL68q6CX}bYXƔfybv8dUIH#I$In:2?9DaCagP\a6)26<|pk_yθ"\7I<xr()!)i;GK$Ѳ'~Ya1kn'BQ_Lг0$^Gvr<ýڍm}xsb}3dd⚑+7[dNaWMdz>wNq_na4d}gTĤI(~,b)rX$ď`CDa,C`Oj#E{`@~C\\1=XԳz*Ou<p,ܘ맍E4N
]j8))N;5kK%4 k_JcNe@(7}3ZumS^k|y6}އfҸ1LX"vvݙ#cT,G+`,hy?jOV/Ook/`]8 +xڽXK6Wh,s$Nķ$#\2-YqN/LAGgg&.&"ˑeLaK)M$b}r$gs5*ܿ3M)ϋ7 @ +:m12!3W(<+7qgo2γ^rqʸSVg&N1d.G Kp|c.\ʚpG +7mWM7lC% +]^8b:D <@ZL/ιB~'#)*ePَ#=d*D*GpK QW*s[]ͲGjY
~ub f)ш1շkgj +]EPQ&aT#CbRe?լaȑc7JO5[2b@P +y's'pS*(OT*3Ə1NʑԖ4!}yp{Z;Ns9p4zq]ˡʮ?KeW=w}9$BG6lyvYěIum(5;#b- +4غ`{
o5`T) ٮژ؆&)vrKclXhZqEO_sƓƇG<R۶ل캎\14mUuDa;;#{cx7R9HP!CЯBqzI1MA5A@Xa8ZGFVU]uͮ^jXn#jhN#o&Ztfq{dsVtu`ض)dsƹ6P_6h#m3.=G6E`Li)aÌM&OX$TI8m9DD;{\Xg !l(k6,^b&EƆnk2RV_v&/u߿Tߛ4v=5%6'3
yX}h$Z:1,fm
D(]6 zqqdH ]]CwV۱ϕߔxڟMr撙L6L\2q}̩"좉VO'k15ƁJTЖQ3 7E4E.%c9cz<EXOcw(I-t|ȯ3qPƢGzV6=i|@i1~EsɰKMX#1它>ib?\f
|v&|uK)y{CpF+wbrc+cM/6ne[_xYNw>'E3'*8XJz6&soqo]6u endstream endobj 929 0 obj << @@ -3408,18 +3417,17 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1012 0 obj << -/Length 1804 +/Length 1802 /Filter /FlateDecode >> stream -x[[F~HfDK$jԨmΑY>صQYn1Mϓ/|3 -xq'`ky(1)>?FBЃz!)Hh/" +1f jP.0=ȶkwM/[kڄmf'Un{F9D")VHND)O0 ąIH蝤tE!H -.FpKB.ׅKB -Ճ=RmfC?Fa<g1<&KA@z-H{ympyr?Tj]l?m-"7{ j^,˹E -Cw~& rF̚Q0X'ԥ -kgx6J@|DQ"|Dj?HDj0iDN)ZձWI֙JDz^Sv4=i;x5{w"~贎aHJ헃߲ -i o~v˹Pgu^4yL Za -*KGҝt[v.ASm8غMQE(=ՇDNngZKp7D6E&4n*Q}=,¹l'py(**#S=ĢXd+'VkX{!TjQno!Vw{)͵E?Ֆ>kR[jNԖ펞jmvRܒ˩Ymש-Y[sXE6@mrYcJpe^+^8*S +x[[F~HfDK՜QɑpNdصQYn1Mϓ/|3 +#-<$qn}nLG08/O;JXϓUų8\G#bZ#M3_cLJFȕC9λѯ#ۉȭ&X9"o$s s\>ζaH
ϐc'
<v&~1!\5KަW"o#Hr&#Lr{JE\n"K0c"'mza}7qbѿNֈPgBDnƧf +`%blmef4|l_37Nx$KV [v% M@9lF|e<-L6Fqh[\w=r)iOGNfQ@~g8|0rLw;zYULZˁDI9Iu +Χ.vIMTckQƠ(ViUx`7M$cf?:`Gznb[?b~-qij2 kC0$OdpCGA<@@<q8S ÂY}<CxXpFC#!{YAD@SMu$WjɌf{˘FUQDC_EKJ\OXad[NڵB5mr
3Rҽ"W+I$]'ߔ` B^$Y$NR"^o$Bp%!]%!]A)w30Os |tN|p9Z*pGJjgw^rx.
e5 +HC/ ܢx!KH
;t?I9#fM~(]m +O)R +^e ÀbQ,eRMbzcm+5,ǽn*(V7+TڢjKE~-}\'jKvGO6^hx)nI
-₀9]["[m,Vb{zo//JDYRUW?ge700_ ,F6c{*8~ћ_J!*p"ڶ+v"Y陷Imȟ87vw%]Ez@rgx endstream endobj 1011 0 obj << @@ -3975,17 +3983,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1065 0 obj << -/Length 2535 +/Length 2534 /Filter /FlateDecode >> stream -xڵZY~_PU+7I?:{$]x]Cb$J,L~}@Qhf`
>p{D1I}QkD 'y9$Z,y/4
Wir@JAT$Gͻۛ?o 1?h؏%"on. -IKl|
Epeo3H%z^3BG [,4|kؚcxCotp;>߽z$,$ZŞefczmX/][3eR 0= 2!]Rj7@};'Dk}fϘ]\1{k&KG$J%c$QϬA[3SDԑ`ZBuҺ1UQB:7,6k\ʹ"1i^7)A7 -r,ߕH;sHqP.dBZ[GדcWƳ)aRxCKe_>ՙ fs?Ltq>f>awC-b}>3:#WHnIIDr|;ztjPZrl!O
z]m}2sҍ ^+:襁R[V;s:ݶ:y@s c>] -j<#_Op_N"*ٵɛWIޞ#g8==&е$kR:gOqD.?#ˑS.+"s9U>mYP>w:~֦͢Wj+:oF"E(wIW2\a;CͩSЖ"?>1(@K]`yH;J:Vd3"R)c`YBi'<f٬n`?w1Y5䰬Şb`M}O^^C0\IB(
q:mu-\Zϴ ?n:ZJSRSDZ[)1oN||_C&|iͱArFS{=3 ř-:nQ`? -̭T%%gILlbr,tQy0bd?LTpp1ϺjY혥C-ʡjPc|GDk~=#ŀŗE$r&/T.@6PLxMWlF?Y>n[dwg{5# - -*n?ֿM0v
LLj +xڵZK6 b/TĔ7Go̮zÌu1po +{B )3C8X8xwbdCaKD"I,r-4{Iy^qc9C"b@Πzq@zqbʃt{dcSqhGn.7ĊͿo#*L<G(J,c&houwM^VwhKʑwѵmٵ{M{[[f4>]l@|H(:%mOd yݹPsG2 +Iɻyڵ˙2 D!!+8,YHKBҍAb@`RfJumUacNa
MzO&Rd $}K+U[QU;;b0 P
)i&C^tn}Q
FGvT[?3:ꖡn}ye3kvb@ZJ?nr'/(ZPj2V>|Ř.ň>n'sT";K糊p$;HyiDQY6(Z$orރ_zü~_8DRuu3>9S&wh_œke&lZ'-loxkkFgnd6OKyŻqYd7;fݥ+/r[e88qݏ^`~̼/y_JH/P&E1:әqu04#ng|(70k*f)kҶtuaIi/CCl&r"eG8bUU8@Ùʹvk(a=H'
/:%^%Y^&C +R_ +/&zECAxqϗUښj-s\i_j֥Q
E/}TF%"+OK?1UՆ13{'aȗ:"ǁ +2vF`y(x/Qi*tvVC$bNrorzLTG7Ebuɕ +.d8{#Wqk@RGݔEZI-8lG&8G:xRTO>@ +!P υ-97>O
P=n1쐱W\)f[]*\b:u +w{gVm!~v^wbz56ADǺ`eDM#P3O^w9OwNac7$6<ěWaz]߷$ߴ<[.]V6{-c`^,]|B_vS_#1adZ0?--()ۣ~xY[ً˧5 endstream endobj 1064 0 obj << @@ -4109,25 +4119,23 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1075 0 obj << -/Length 2438 +/Length 2433 /Filter /FlateDecode >> stream -x[r6}WQ/yJ26{fR.E۬IDe۸CJ[ŒHOph8zpo7_oDEHK)C$&zzq՟qoҫoe\fEn7mj4QrWmF{%!-6
ne \9]^{URlRm/4)ӍW^غDȀa*a)RTLY%?r,C DIַ}<手Cv^l~|:kǼ̶kJcɱ>7qVMЗ&DdRr`i,`cǧCr8vDC@a&X5~0 -,sG -1DAokWE9m -r4
d --N2UwނT7R*>X8J5BRYSD!JjP Z<(UR-땪«BRZ1yc -V}2Å - .TrRH}B0惄jJÄjJׄj TMTWNIRRFJ%)SAo䂺-\R*eMAKTEPvzUዀRIt:"Vd$ɨ4tJ:jFX"$6JѣS_4Tw=V74͡;_:Kz8$kW|ݥ] v۳0Y8 L-N.02TN -cw0)RF7nEc6ӛh/4D B'` :yk'![(K<4WCފp1?L2Rѻ\DZ].ha沋9Ey65 mrQ}p5z7vn@{\wF{qƀ@<E/I-;c*XٚMdvxgιp ,O k9Igm!7UN˜N }WA{VC -tN -g$0Yh4:yp({8aLwUI"Й>g{Pz'WۧΔ9o`By'=H,X(&՚ӀoW[!Uj-o^>gs}>x -b -=ͤY=ɪ>m/GpN</4*CCz/EvWצgǬW= -~XoƖql"<.'w`F[ !i}zQBz8We`ʝ8w_d?#U6;ߦZ>u;fE]]ÚbS)0BG[謨Kp*ꊋEPAnUJEd/ag
~06;K%łRPWD^/3|W$,H=䔆;z:-FȠzVB+_3˒p/(}~4Lx*L -=(x%ZҔ[00=N-bP -G5@,QY?ۗǰ\}y+Kc3-)QƼY *q¥!y4OtlwZЪm$"N[2~BإO?Ίi{YlFj-`{/U2l
}ܻUMxmӽmފ|}ri7& +x[K4WT1BG +v +]jxf\!qX_O˒v8~1@qI[-}j8x +pv7F)Yp(2IܭwKW}0'W>[7**8<Rx8 L<w`
Ͼ
0bFۀvEOI.:=hD2ֱ<xmÊ{ZU?C$ +&"LhIn\ӆ + h0K9<F9Z0@{NFu +BMٯw]ϱWbxcO}}OC/3.{CЧ.<+\dpB9T4L!I4ڃ}o +1DC+ʗY>m_0FdpKj$P0#%BRԉD=@\YPFD&:9<ZsPf nDn:۠:"e5ѓ5Lܷ35F`q&vyC7oTR"%T +E2YLB5EӦM4g0m(uC7=QWߍPT ++ujTS5P{Ts~%T
T~"*͐|P
tNTp
-gFU*ƱgqoHn(XSLa0g:ʊ"a9P=S5P{1WjXT
T`rװ+W듞?NTĨW"*џ 䤘M! +Da{%QQ%QR`2jRJL%1LSƁo脺%\b*eEAOTYP.]*Sg7@xJYP-Q&ͧ3QiJV=xJ)ՈJi1IlDŕ8uDO}PS] +V#=#1Bm`>={:]Y(.ɟe63^n}Lg6 4qPhcl7f"˪ހqؗ۾N<͓me!}۾(l^2Z0융ڣুfh={Q=nz-|V* +hu#!j){?>@2QEŹ%qmOJlwh&g'-=uzF]]ϨÚl)0BKhͨK(D1LeӪꕌ:8\xrF}Lf6MȢJ uw'PgzB]!.ID$z Cɩ.︖W0!Z
˧9<pwԮ8bN.lKNyhO`
Ӱ) endstream endobj 1074 0 obj << @@ -4219,17 +4227,25 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1086 0 obj << -/Length 2767 +/Length 2765 /Filter /FlateDecode >> stream -x\KoW̑~TlE8@c0E*S=3b=_LwW]U"3OZbLSbʴDz}fKz{?@,}z_1f&l1ǫlQ"ɾ+3HMWK {3#+FD3_0J?szu)c \l' "j0.<]DjD2)©O\"5> oÈ^oׇS+,S+1ZB&\Ա>c*|{9u6%u0ZRQ.b:VBmvwoPHE*Kpm62E<wA_?Wq
P:Qo1r`պ9|usKF0돛mYTa
N`MX.ۚ۸-9Vo
Q"Ŧ-̡a-?+eؠ$V=ljq%Nө)I1z81|hr*(`iwYu|[ -^epsN<ܸ~#g4Qh_r̗wf,fwQS}._3-93RùEP ^S`qxC4&H L!nBG -EGRALs&r -px<Hk>(h<
$ -NuJEA!H~gR&b!ʿCY -ehtnj8q2~7tSk֝_/?pͮ0?W1~<WTWdPL;gr+9o $!2j2\S$\/h9fUL6GH:eQ/sG՚qs繠u``FBȇ^A=4p/Hpj'4>pR SGC`lbslq|펜^zHi3-,gIR ri;F)y>]Wce~F+iSֵ -fT$,V\;-$]y{]`RpFF 9`k`<)ѫ"QGq
(QOpu%Ua[0};Fbvg)b-a%0,L dYLeZɩu#VuGYin!a$IcX?}Hiآ{љFALAM;Rh>&k4DuQ}.)j,PQ}][kۥ9vS$!
!3zù4 7C)8RRI9ek&k?xsʻ{&c?wsc7 RݜM$PiPՆnƉ9=MV37gVF_m&U'nROiFnNe7o#{p č#nqGn?
÷GO}7'T]_J"H9ޣ"\{US0ywE0g_8"(UE00w&P6qG+ * [UюMgkڊ`Vв+)+)
{VAWs?"Ȋ3HS'W"Պ SUS@AMb=M|5WB?'OUMl(#뇣M|*jԁ3%TC*eH!|RS:B;M B2@l{6=%/8~'ˮpbA=7 +x\Yo~ׯG0{>1pl"A[@@#0E*<U~}gzFlri 9z꯫J}BW僅HMQ*іŒeu"θ6Mlw}yV'R +Z
nݷW/iJexMJ5ɏlc"IGl|R=/:Bv=b3F)gdZ^ǘ%d2WMal) .5/ +55Zb0p +!j4?,zP[LmQTWաi' ru϶2n~M,Cp`D]F1+Z;(RcX1pi-"XNs7RjYJ'J=
¸C@b~1et.oOi{`DsNVT"aٚm#XS%k*nm-9V5o
Q"Ʀ沣3a-?f/?1ݨM-si@c6tjrReuP ".Ku|K7߫4#FQ2Rz7˓%kU5C77ԺÍK72`̘& +->|qjaW4i{wȲHOOSùEP ^)nS<e$@ M9(܄Z+L) 02d^hf4G?cd'젙jcMdaÎ0 GXo9;wC=vFbZN~Tisʗ(攘o1ͅ<&~ V0G:<.q( +(9)([*#i\#D
F/B
:Z@8#{) + /`@5ܪT"قQx˳!s&V" :Cم
:CAv>h+[ ۅan$^8,X~]J6FF,DxJvJRCe8 *gu'L4%Ë;0~;r5:]%f7doЖ8V4y2;Ҭ@-L0+ 'U
^IҶW5Fǝx#$m7-풯j-erabwӑJ3U6,@F/>|7LjR$ZuטNX +
WD* +ZFF~gEȹא NG[ +rll@}"g ضG#61hr%ո"[k 9e0CU>_9Vzkzg$5XOM$ +>nS}+;w#f_)m
("ݥ!/]::w"kHD@3(1C7 +Do?9U&uY2js)9?S%Si2
JAv^bf>n<7g tz.{;MAihܤO!vrmtI7{Y$NU Mga}`lhE&Pf$1Y4Q>!F< +sh<dhqQaBMk`uZ0i*:k}\t`6#\28upD +5VQl>lʳnm0"VLd(ڱβʴu#x:أYo!j7IǰFgӰYo6*gz.
Rk +jT endstream endobj 1085 0 obj << @@ -4322,21 +4338,24 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1091 0 obj << -/Length 2311 +/Length 2310 /Filter /FlateDecode >> stream -x͛[o+h
x-zټu"+P[Jml;)Ŵ(n
%ezf83~C18zpw7>F,{FZHI7o!b#NS;-UzLχ*/3滻niej4Qz"XCCͯ7ىyqVfKpc7G -1D`7R)]>B1M}5RBd 4Fl1SPD9fEOR -:8s_gz̫<MSTo>bQU~20V& dݧʍƁefA>b A2
ڗ7nЕH pt=CA -8L^T'1㾼ucD 3SLjF\U.5Q^cTq0APiO>u+k(VPU)CHIJkH3 -*Izm [/*&Gʎ[B6oU1̅Dq,uEdhH#!_: -AvCMhF>C3r酛!_<Sv?ÖMybsA],ZRv"bH1Bc02v~QZ?UA|hB=O{8]61Kv}%xs>gGy(ȓmD`/"6Rsxx*@tŁkXd1C-؊< -6%|2&&nPk
Pb${éC#3>9\C=J]{)=$.a-+
)"XX~n嗛Ca봇Z_!Sqa=л@=P-2Y&â0uz FF03ӺZ3n|@e2\G"&0=DuWfm -̆46w:<o9@x?x{#+`S㧑Dk(ui5:Be: _! -DZ;T)hKO(hP!!ti4aTz62 }uhs -H`?uPSj6,G' 6F=Hi@0\sJ$f幹r}'gW2}707؊\Vɰ9 -^#IQk(ui}0[w1q5CU TyOH|h#hPP+_A8X[i*G5FS1KYaYK훷2kC[%fW8^FbdX#:MY֞6`!ft a%ajY pIMaj"~<S=L2dc\eQ. -ro^\a"ҧOڮK-s'Fۃ`7|i:ד*́. 7:?ϊ옴Ll|ȞRLXs[N~z0_Qe9sVKKn+c(]d6O#ۧ*oDh
xWֽc= +OZ +x͛Ks6<JU1G[Lm*n|ˤdYIGv~H"k]s$ +nt7_0N|~4"HɒDaLHnaxO qw_moқez~ΊjWeapw
8!L<Io~'{#ftpV!_7ۉ}V"fKpc7G +1D`7R)}>Bֿ҆r>pi45Hp>AB5t +(gҬI +_CgLy՛OXywղI|YLb`XfY;
"*H!C~](G3T+Eh~b=c#)3ϸ@#qV"D
zAS}AӞ|*V-PS잳HJRޒmTFV7ISleh&ntMH*ܯUqw%dsˊʼ6ZCj\HdUdz +/!o + +cʄjEi\E <PwVOlw-}vt<ٶn@&fYpA#T1װb\[ +yE>CܫMjH~NOPo*䚘XuC=5[C%
+o$p
;vk(ayw1ւސ"~͡2*ps(B/d憭j}6L10TB0BeLC!a +O+9?P3:k((ýώu0(AA2wRЖ;cPѠBB49iZme2)@@eS GLQDF-DpxcUlar3?ZwbO積R)P!nX7, +,e2 3Q1:iWXĨI(3V.5AdokOZʡ9<=*I> +h[yn\IUM?@Ly>"e2Z0מO5M൙jkyu
^dYpFuG
Dߺ=Aht:"X1;CF/QX)l1<m+|߲cHv=.aziS +e$LC1"9^D5`jh-ڽ5n$$L-"> :LM@ЏgTcƴQlL7" k,e4UANR+ GSI7wIeh{qO!M7\zQe>&'1+㮥f?szY'+;B{?=Xn'*ϗז +VIA.2vۇ*oNDh
Pֽc= +"O;OQ endstream endobj 1090 0 obj << @@ -4402,30 +4421,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1103 0 obj << -/Length 2929 +/Length 2928 /Filter /FlateDecode >> stream -x\I$JL@@PKnڢe=V")rsiQT-UzF#o(^_7F8id(ZDba,sch:?o_fy/#)QF -[`v8Ύ:e$Fakr^ne)#VUV'l!ȹ'Fl3-8=qn`H#R>R* fJPZmo -25w9!*@36+WE(xsEhݮ0?'_.A4UUʶ*#9'NHQҚ+sӚۭfUWHXU] -;_P5R'Ũ37rik´v#BP
ʪ[={827oaPn%Z -XBFu/mYfތHIM-~Zxz|h`?gӄvs`k)L
]~NФ16>ӪYEh\sB
#@H5hoYIp"нd6˽:֦^O`#N-ps'>xo -ds9rך !I\t
v):R8{y -˚1ɷ"۷l<_/)my(jDH! hc{om @hJy?浐xGާ<bpv - a N99N.%8h«y3X׃yDxf4XP㖎Skr_"$$D#{{s&u8+R5K%P}Lo=nO6#UKȀF`D#.%qWӊD)\kƻz% B^$5ÐD# -̻&"(α* -S-x_wu[ˡ,%L@B j
0/!WX~|!.u݅SHdg).AAd@G
{IpɂK4R
c\`C -_tLc2
+^pM/*>Jރ6W4
4! C+_gɯ?h9砐p:ざFx~9w} -D>LՁqy:IH0/IS䁵%.DŽluJ~T:#Hb/4n/͢yS__@TQ& kS0[*isGD6Dh5CBxX$ؑt`YBvPWa;$Dk|b0U?RZ7BD¸8l
25|/`r/s'X6-T7_/?sk"pG;I(5|2+3ET& -&M/n-!cm K@H!SIjݳMz1^(IlT_ƺ<%MZe:'ZAcsjLzZ)pYAaGϽ]%1'PpiרmM\\74KO!JTw/9,V!%>IC9hCNMC3n,=*3UR|@kW --H -}_cp
%_c
%`c
%O'n1%kF7?~lu.&.fmU}`DHΘmHʀݪ7ml{߮
6YlCGͮl:ΒoN<ĀsG-ig
Y,}ҹj9אr.q5$\yf"Og6Gl.j -d -D4&K47h]֨f$/yZ'#he;h21
撶0ߖjnknR5rȒ}zf]$|Y -?'0
+i;=C}
:2cEȝeHH;4-O}װ~`g -ĽKޢU'8)¤JnYOMڗi+]no5-i>?a , &,C21FxYo0^ -́-8o4
nv"v ۆv2mR('y(k.}htNS?M֝Ƴ]<H ɺeMvӲZ@@v&ώٴ=FK0,L;G\'~7d+sl[q.0`S`&/] -<%xw +x\KFϯr +U$`q;уqGeE>=o5RKnb0U(2Ӈ St
_͉V+*NY+Qf\e徆sxrʈU [HG(rAƉ.LEOa98Tq)~3A<Zm +25w>!*@36+WEa/xΏ +<z
Ѻ]!9hA!a*zO?%mi\mUFrN\-x>5WV5]v>IUWHXU] +;_P5R'Ũ3Wram´v#BP
ʪk=ۧ`0kjG-Uu,O!T6r=oF
vC$$&}?-a=?n4p +ךǹ"ˀ{ɮ( C0H."JS +Tb]dVPw& !I\z + gwh)'Giz0j`9!|J0ldU<Ug*88a>trv +ttWEA|=쳿1Oogpf7eGο{W44. CdopJZwEH4AR98A!)?t-ύ>A~q|qZ";hfUf<?ä>Y$y$p8S䁵%.焫luHv~T6#GD4pyU7'zѼR_'Uqsd9̖ +fsGD6Dh5CBxX$ؑt`YBvPWa;$DK|b0U?RZ7BD¸8l
25|/`r/sX6-]U7_.?Sk"pG;I(5|23ET& +&M/-!cm K@H!3IjݳUr1V(IlT_ƺ%MVe:'ZAcshLzZ)pYAaGϽ/]%1'PpiרmM\_]74KO!JTw+9,V!%>IKtf!aStۦ!zf^T}]*)\ڕBK+B\Ck|}llClokl[`cLI聭R=4M}AI6ylU_-6X3&F,2A*M`#(^knۤ"",q:ۯ:/:1 ܑ@K)iqE9Kt.rs5l/e#p
"|py$$0Xyy3õ
|yf>5*FIGǼkG434VچTsIwK5GP757j>j|d.J,j9.MН)xSF &˂7f\
@%M3Y3.Mޤ@yRt3- XsX3Ř<3e
d<
3d'^&Yko?ݿnZH|3[
Fw21q>naNi֏[{-q>n=~:\ǿ,}<FJvh6Ua>nX endstream endobj 1102 0 obj << @@ -4498,14 +4508,18 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1110 0 obj << -/Length 1356 +/Length 1354 /Filter /FlateDecode >> stream -xXnF}Wy -#-eE$y9ete.a#N랾N*olJg<e6:!`5Ҕ'rNw F乳\&\0$Hn&Lpؒ qsCO 8kJyZ!>B҆v<b6(D^?
B
Ҥ?|37HvBX?hUOH綶sP@i,b5p30lΌ DŘy#z$"hQWW"%TsC3yPMQ6H'Qckmʅ 6>Z# - Ddʼna/hBCqvwE0ek*e4D(HIO@8\0E,c39t3BƼ|Zq{a}6O{8=ِp9}3|I
=Q&28m|b/GzY[Es`~Z~hu= -A$PFvۃ/\`|$%.UU\+=FwJL] 1TIPdOs +xXnF}Wy +̨OЗ628m}b_D}*Sf"n{ +FpA>= +jDTTqՏ*' (ź3uP%A]=u/ +<';^@FO1;^IH&uqj3]h_F l;1Dzj?7 ǹEy> +Rv&X Fh8L߭{P{a胲m?GBr&z"a`I@ ßmno8砯4L ?FUǜaWDfu_]odSi +pjb6%@1XhBwcҶlL50 @|ֻZr +nѽ-!w{Jz$;rWvsY# endstream endobj 1109 0 obj << @@ -4538,23 +4552,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1134 0 obj << -/Length 2152 +/Length 2153 /Filter /FlateDecode >> stream -x[nF}WQN/y\L&`L p$MDO٤%m`_[TjF~ݏ,qZkd(ZGqY>-${nldt/9]ϸH_#)QF!ۻsKƴrww~~5D8}+G"Dcݿ-51kFh?V0?Sa\x4ڧѽDR^~h?-XsרgUpm^)C(LjyL8vpgEtdŒ-VEp-, 9sf*xZ;fvF @,I|Cb3"%sȵZI~XpISj\Y!xqoWE\N:N'7Xv -˛½PP@56}|]R6@§:OϚ(SItm)9$Կ6}cX -ՇtMv4{ihEL `IܯoX|ƮlwЙbËHjFt8ѮiKpH`c
4V+bxe _Xn=Qch5S +M)(eBZ -FISA0Njf֭Z -cհL= -9+J3 -7-w@ƅՁ
i}Xٴˈ߰; m"DP1HIzjql']+dIs"c@)vD[Ot6arB1_{bOىbw @ai>!p;R|
b -Ek)Ġ$h,[OzJyty'
LP R99ޖ@ u_Y*ZpᲺ][Są45՛ץ|$% B)1@JJw3kRNKٍ -@S -:0;mۂ ZY3tU[ԷZ;;vűf,tO%j6oxdC$$u,Ŕ(.^ͦ^lBͳ -jY&9>`ٙ0,7<U~jNOT! -4YN3Qö{bx7EDIx1Z` -dܤnQ)<Fa1gH^{]\~|||*xp<>Ӝ{Yj8|?h
q%ɒ<ntg]1OGs-WN߰$I 3W$oΩl$y l;Η?/9*zF[ }?V_f_ +x[MFϯQ2q8`f-3D$jTMMQ%5_u~i藻=ީFud'EB.>~KFO>Kt-5ReX-?wkL[K,zwwm_#Jѷr. +I4>p) +/Q1Ncf3Ji53OQN}J$l&
Rek{U̹ +>+]r0 Y=W)SLhcnXŪ%"qrΌBSpxgv8ی3@2)6#_<\Ep!p 1 UW/vU^u]įt2<({j>YF$1VVm%_11Fdpu*c8-^@ֽ
葛يT0^':y05 +#OLp'pwPFwXbC'~J rh})2qdD`=tUJ`;s5|6qww\ + \bh>1t苿Ƕ2D
*vmcY/5,,%=쨩Q}S +mCUP,|~ ڎc Zl\)E+v<AЉɐ8_"Gix@8FHS*T]:d+e,1lƟƊbYMcQzvRt3՜1DS*ZR2WxyVJj/PM߂0߹xqM69E'" +T]{xJI5Mߢt#.y!=od,o%A!Ӥ~4A'XwR#֟9k9h0-ts"`+)NkR-'XM$^Yb+[OX ZTJS2t)6J{)TiauX5,'SdGplD:ӈn8m&PMOtM.PqatEu`jZ{g//&>V6-27,8g~[6A%qERҩZ+g+9+IWlJ`Ym"PJ-Q݆fXܱaמ!.2|v"|؝x7PqXpO<=NdçBZ{c)01h+ ֭i3v^<ItCrti +i)QPXh +S]xfGm[D=KRx_NZCYj6Zksǎ`8v얅U
lzdS$.ٜ%V9p%ԅ۫KMHxxS85mfV7m +"iF^4 mXg4D;y\m||gAxzSol +؈y$<(=@OګN;O0FޖlT ƃe?m߃% endstream endobj 1133 0 obj << @@ -4741,22 +4753,21 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1149 0 obj << -/Length 2650 +/Length 2652 /Filter /FlateDecode >> stream -x[Ks6WpsT#xq7Ԧ6lƷLjh5c_iR5ȸ*"ݍk -(tQ
=g#f)ύ=x!d#P߁9#js8u <FDP L=v!0"\V'oC's>|=>S}4QL6tA)"۾ D'BJ
,TsH -Q֏T|1äpz'*?f؋`jEp7ȯvH d5 Ye{IDi-F&Ex[ 7(sPl"&G#Uc3W^ۇ#&}e^M
L{Lm^wx R+q|ŗ]<Gp1H@b)G1Lǚwj46N»2ۡ3
Bx+Z"J:pܧIk4ܜ5Yp\y_R=ֵM!W -b -Jhj}+=MPl4_Vۙ:i 6u]ψKz性O~%E )Miԟ>mZkhXn-t&eZ\H`_z-.Fŕr8-+%{ vK
'HwK5 -Wm[L5/2lak -h8k3t l<#<{Zm_HS+.JG9'86ed{ݿ]R%M.Ez&`AH9pWNn]fVMތmp_r_z;;hO`풌y#K4RQ]j!dt+&xUU%*](-ږM@\n#3sm^iyvk+ejײ!dA
qyi~N^\1W1Lag9ɋSʺ̳U"CQ^-!U
PzJ|5i{.,'/rR}q?%LcS {Y`;E@{ruO9$/1ZZTg -I
o%0E[FKU$XpU$̽y<<eR{UhJH'u*rC\<Gp1Vګb@ȦU])}C],}y<[˔TkԜ^byQv]9ZTYapWH* -`ZC}A=PPZUyʠ[BhQ`o1HX52<>Em -<^Ko:2f_Rԟ0d>pWO_]xhC>+ILRG `doBu;&e p].m䕞Нr+zeA 1*L3IG[_ڳMס5E= c&?5p/'>X-O
^uc=wl6uPlp̞$ݸn+!k{>8;3o"д1砻Ǽ~x4~t()P4ZX`EI nFM d\offj --(.cQiOomh~!]m -7w.n披Gx +x[Kϯ`|Tcb+s(Z #ɯOA)rLU.")4
+ZƤ/%BxuR&/R +Q6ԌN.9c,IZ
2N#C~,CQ<Ն3 dLIJn'_픑1Af:AN<m!8%ZLL: oPd#>0<EL(F.f_+vG +W(8v</xb̑R +tdc|]pMڧ! {kBx("E}+=]P,MV/ZcL +t~BJKIn`DHN%i_lIѯ`d~ +?_Rp$WWJXxEl1_KennBJ5b_qU=X@j ~qn^F=:in9)3a0cr@%+xZwrt^rWj~fj{6'2qE7@Q_ &.T1J$OEХBvNr[7MU]2bׅʢm. M6b<7'=O̪m\FPƠvzRM4Pvڭ(ťp*vh;e<[խ 2u}a Mh(JR5@ +T2WTP*V|v[DA VolM̿O`p$J[$& +M O
܋.ESkcbsOj`fS
&9{(I2ݍ~9xVcv1M.M!s{(f=f~p; +>_3.@ѼeR[~:*=<ڪaZ{L^1ddb/ {_9{fK"$P#9P3~8Cޕy+KùP-P߉toVb + endstream endobj 1148 0 obj << @@ -4816,20 +4827,19 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1157 0 obj << -/Length 2484 +/Length 2478 /Filter /FlateDecode >> stream -x[K6
%n.6eVwcˎ%wק(QhѲ% -؋-TUckw^ww_ӈD##%K_2Q"IUۂ#}@^XxSʷ?&3$=Lox/qBFdw.ft^$\0n_~ÞՒ 1Qk:/>nv}Q(^GE
s4'` -~MtSl9,J8->8gH\yk+Y')2dPCY)ؕl3x3m}^12x2
e9Can":-5fi#º+f߽*8 -rO+aW])2ؾȢ -<5ZȭF*Yd]F
F7;xm.(6CMFBja{V__k=9OyrϠG{:@A,i:~x@q=Q2K%!qayBuQ=&>KW͵ua^xz"T1эy]EF#=tx45
OP5ȅ@q:lS6JB,yl7uV;@mCS1zB%u>d8|({a4dIDՓO -wn&+{
@qm@')zsZ --Q}=;.;jnaG9lvT9Q+ -(BcVbDv_G1 -y1ۛ@7!&T&Mc<e]#0q/{Zo f(V^z*\;.&fB.%üY&yӖKsde| -%DV_Qwj]6gCB&:{^y55ݿ6YQLbN01B!MyDTIeK?dEO֗ٮ a
F/1TwYjq7;X/7ΑΟuOsnZdkK.& +x[[o6~ϯУ4,b孧[Icˮ$7=J%YlؗX?#*ۏﰽoΈH##%_"2R"IMۊ#}@^)[z)^L?D3$3L;9iʣq{?] +F|{WF<VKplDc;-"D!xc7b$%[f%#!T])#0KUkR"JJ%\W':qA1DZ$+J7DƁ]vA}ՃA}ݯp(aQ^QŐzP%S'1yvo1p&Y,©[WD ^oLp +ژ0 \\2aG vIB +~tSl9J8-LQTCٳlAllp.<͵ˬYH(HcY)ؕlx3}yZk12x2
e9Ca"jӶY=w;戰 +4^
'0ȫɮ8/*2z>@h{ +#v
ם +W%*qdiQ6]nsJ/ +Ji7*iRH|lݏӺ8iJFu{9( + N2&tVv&+/R7jU6'y!X$C2wap}og^i.>+&09LAPH)?m~+Uw~-kY#IqwyZ_|6igFW|%XFߐcIߟNjq7Ays{fs:嘕9?s^TP;whg"O5/PW endstream endobj 1156 0 obj << @@ -4859,23 +4869,16 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1183 0 obj << -/Length 1841 +/Length 1840 /Filter /FlateDecode >> stream -xZMF+tUf<%YW\qűy]+iAVN6>=H+ !Ȯx[{z{ގ~^iddSi)=e(ěg; 8a\v:ܯ*߬c4^'/_#b6Fr/x}{aČ|`Hpc}1.No틋`!$sd1m4!X6:&Q~!n٬ls0:ބa1fbW^_rYI8Hi`;JEYDS}gs]$Lٟ`7c]aaQwVO - xB$NX.쉦=u`wdKI8iơfk _٬^1RMQ3@v ))Y4)k8\< -l8'aψgvjyO.tH?.FX - -9Z y斸7)2 -br - -'' -36Pq,T]i#5WX0ɺ\$Ӟ\ E혣0֦(Q*JQ K6Q=B#\_ -qU?Z"zHR#AmL#DŽ+$'i>!ajW -Н#kIwqQ[j'ڏZeY<L4hat'8|RU1<'6LCP=YgiHfwa.cx_<Qp*v)rD4CJKIӁIW剽yuNݩS϶@1c.o-%PU뀇qC.+d_ n%':C -K
]rJ"chS@'F@PSl~ - ){jKw:f}MMĠ|Yg!%|@yM)_SC<9$p'FIb!PM0]!o8}#۴1v;+dnuG?J$99R}Ə.۹OE6WVyZd7DI35V +xZKF+tUf<oImW\qln^JZPͯOhEB +p(w#!duHELcv=AVQU4!:$Խlna +
A! a{' +eVO,gtlilp³IyGn6#rMBYC_@2{ĉHg$*rlʐd<xk{pqu8vNE;D{2:<Y77O4ⵂLc{$bZ)0z8V|datxO[۳]ւ$=HMD 0݈Wr4']L +I-AkDHD#D!2 j+x[uͽp +x0,r;l!b1{[tsS;𑃂kMpTOz|6hD\&ɧ"dU5<0qöCRBxlq 4;+gjizY\|!CЭE]{r9:0MfdžtTqw5P}Ѓ@ꪺ=ϝT$ٟ5e&xA
jIs5S90j h;w(2 Mtx)nr,FK{qh[ efvrV`{Y_DU qlzt)3g=s-MFJ endstream endobj 1182 0 obj << @@ -5082,24 +5085,30 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1200 0 obj << -/Length 3610 +/Length 3608 /Filter /FlateDecode >> stream -xڵr_GsIi'i$)TU$W%6ɽ -8d! jZA b-݊@ے|
*J(,wݷ)ƈ*a
0%àMS~H:PfE"atN$n8b$т[S[+@cai#-& ChSk@/VP $HJȁ ,VIrJb.Ӽ1˖4'ucl^-l3Y퉐VL(^xC$!R/\^LiJ#vR"I -E kpcxT/HwiXI9I$<YYhE1'B ->sZ܀@ڠ5x|"༭Ls -^-WBkS=:࣪3{:ă=KW=`hY_LTp|& /|p+{CpGIB-sO*iػx3K ͮg})SQ<qςō:[pf8b(p:i蟫.ϺD.vۧHMN@guavH}?
-/F8)mڴ.eT1(;d_o-9/i*R![SaLY`QMua<_1&.f9Ok;]W wSp7ouY`z;UmR -"Dr -~ὣV܃nGS/^h>$G=ˢŦ]4és ^j:K_&D1EOrb. Xŧ40ѥa@={<<rLSs)3[zFT@}茜qO;tc* Ť[A)egaxloB .#h_ա:XX[PPfY/S3]-Nl@Ky,8?]~ሪ(]>1$~L<xcqo0?x6b`w"H8MNô՜3>RRmK{Z陇;/KRp3v*^zYDl4-`d'mK1eW@,Q,~{g?YB~GmC -,Zn -5y1U~ozۻxI2 Js?ԆÁe>!u>Rf vi -?TֱXXaƵ9{~]Jsy__4d壔D|/0Hw2}r}l}ʦ1B5 -AIU\!cDI(k%1׀LWfy!=%"( -R=[G0)NM"i3òS.E28]qE!HV(~rj&F_,x{Y - RQ7SΩIbR^Y^&suwӅ_!0 |ȒtWɾ5
^Kκj0t0 0uqᘔ`Y֍cՍ̓.!(S6E4 +xڵ]sݿBRuzi3$Mdnh9EUz lÝH].kx\7cɵ$zarN4[ܭ.%Wd˻}Un_^q,
pOn.w?,D-<ap/w7a0HCe$rQ>;]JD-ؙ +~U(v'M*Eи4sM$Izޕӝ3#sͻm'6Ȍ!-b %1d]`cBADYwN6lYM7'7WpƆkq[kPo>Je$B--i(0aVp,̗m0>UnWNJWm]ZXlfKVJp"zZX\m@}h*bM#Ap
2 iqPf]_ٮ=h}X<XpsFrɁq>jS! +AR +k|[oϤ{j/p>W?'Aq(1*L2%ގ|Br)-C +;N +Cou(QjtV( +E kpcxTHwiXI㯩<I̞yf(*jrEr~V0)@dy`}KT' eGB9zh҇@AQתs
T
Z+Agx/mmfCa +u O뀏H: + =CWc`Y_LTp|& /|p+{CpGC&!Pc]M +%}ЄfWW3̩ +/FHDlZֲoXrK}ѽoNQ4YSaLY`QM'} +eꘌ4 w6yZ=uEYo\
7~7ź,Um? +ὣV܃_ngc/^>$.kޞeщP.D!p~x蓗.[Wg)2ht#~|Q|T>?|4ͺ2te;=^U{{/C_&)9D-E=#*SpTtFRѸ__;tc*Ť[|@WDˮ;د +F314X|XWζ`^coAu8@I- +kU<N~ +lyw +x4KA{"be:iG)bb |m,ۋ8rÓ;:gWl6)AtkhuȬ[=Ŷ +rC|,yMC/]xtU"RfF$6=Ç +7~ULqʩ6CArF*ceE +lihՎ4IDxD Q4{A<`
vc'|p+[AO\\]1R4
!FC?&$p>&$HAdZhOʝ/ܿ_= :I ?ݏb\\F$^
ujC@2_Qex)N;ش``>1A #U6<jთnNjBu,V88qcĞߗ\^/
Y$/F+p<_y(?ymXy!A$*zi"ԤuhT<kP&3RC#TX_o2& +(۴a9
- endstream endobj 1199 0 obj << @@ -5156,24 +5165,14 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1207 0 obj << -/Length 1856 +/Length 1851 /Filter /FlateDecode >> stream -xZnF}WQ/y)Z 4h- Ebl2JT\;{!EKY$Ť3=3Mד_&_hddDaLHj|2=|&a#Nsݬt6JO_n4/EɯW'TZ#My|<{`ČNȻ6ɇɟ -{k/{U}iVI̽bwέc篸&qΓ9\1e~&ˋt_=O46b(2vFtqx:H[z<
~:cx)ݦU|jQ,3yI*L?aL1. -]gy,7juwaAKA1;đA1@OO7٪? -8 ,27+s\#"MjI0A<m@D`Ҝ4]ئ7oOX`QNa đ S\aIҍ#]L9ADPd9ҳ0DTYG&angQ-Q6"vG8r#4 q/iBva -,luvՁ:gy - AFkˮj -ͺ$Y"C|g)[lw
.BG<~+FD;] 8`"aH4S0گ}}k*^_wȪL*p]^XJ+Pj ŚҴP2\Mu -jtmz))FL%b -hð=$gn69_ݗ4oM-S}n3Xi@sB,t^t>l(M+<{oVk<dK;ߢBP2nӏk01~3!
zeaP -6t}:
-<U)aC^&)j&T5Bj,Sj%r ˔ZI4-KuI)Vd,)E(AG6-jrMz"ii)vy"dg**҅<gL"i3=@l+'|״j**&vpiR,T -$CrQMqS -Kbg
{Tbl7ml -#Ў "26(SYTaGaxHIseHͮ3 -g?w۱&<yѩ2(@%@h ĉ͞ki//`+ UXhe8Ntn齿!- n~DqoU0YQV"{eZaʏx 5 +xZێ6}WbK^i-Vv֖MËdɢ/+5<3ΐ]דn&_hddDaLHf2=x&a#Ns]lN.4/Eͭ8!HS,7qgoɣ$\0$N1!ꊨ'Xi(ɑ.-|:{h<S?lHwE>DL/3*"LþfOw9Qx~\j@32]XG9ع44CtQ:`ɨ~W;mg-A@LB.G1 +,m`)=6X%R*U:q F\*.ĞEޒD,lF.:qx4!0E~yĺ@3Ł<ń #5k6DnH$sAP%Z&E4^㈧OcHRb$L\\ PBvחyʤ[ڈ$XBuЬ!Ma-5dc WJIئ.n:1`̑b$T"6+Lc!:0qn"f]tskT:Czی(Gaxl9ci,t_t>m(m/<߬q7-|:AɸE?#Я1H944l락;9'@oG<Xz~t*m*0B:H- +v\L
tg{(SoS12tgZ#%u)f7wE 0q4~2UZTZ!)S0B:( R\GbVejx6~em +h`;7 l:&BCu'㞼#OzSt{u`۟fpHaLxSmwh+Ejҝ5hb]s:ix2"Y]{ⳟ;\yѩ2h@%@h ̉͞ki//` +<ښGi @~zvYEpCR\Ս/P (CeE endstream endobj 1206 0 obj << @@ -5209,28 +5208,25 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1217 0 obj << -/Length 2974 +/Length 2971 /Filter /FlateDecode >> stream -xڽ\Ys7~ׯGj -(`9cŢa
!1ɏ7?Lo{kebU'ӇDSbJX2O>at<mFӱKz_^|MGӟ!8pUnݻ7o70|&`1 ͧ?hrPI^ω(L8a74hM Hk`T'eLWe0J)C:u -8hiáɄS"(o.[Uwo*4SD >Z -N -.%9tq0N%aLWs/{!G - cTx/Y%mcKD_9D8Ma1zD-8)QTcz(5 -p -Ѱn++& -,tD ?| Iɽa``V2"pJ1˰D^# - :/+'%YxDs}#yFHVT^&ay!SbaMΉb
k4@k]L*+#ѭ-^c\9{8j%8z
ʤ?TXvqK:63T)AS
kE0 &IFȦGUZ?
NLJ1<Ο]36D2ǒb,XxX9
"%sCق -EgNI#oVG -ֻi>!@/x`Q -kU=xysw *~vY ru -P*c2vG -:b9Hb0lQa. 8V/>g'R˭]vE'6WgxzYp
p~b&!)U;7_ǫY&npv́鎙AK괄#S\Wƾ|`
ݑY;[2j\EޝָVQ ci$e
9>QTrbfbc7.q[@wP.4!\]8ؔ)Xݔ)w*zMæE[u)W+A`+Mb<Z:Kv -Ǧ.Xˆk֊`Y0&P9!߶d -vgyW>O Xc^bOX.@_}@n? -w1QEmI՟n}]Q}Vv骾': +xڽ\Ys7~ׯGj +(`8xaX9쯁@7d<&4۫ZbC)1J%Q,O>Maz +Ln
̷_cvk:]qs"'Rsʭ{՟Wߤ ; Cd|g?'pkWs"$ +N2p
ZSҽt? bU(Fh}RP\`*_CV9L9%BvZj[~~VN3E e.@־|J&__fj!|q65lOpyl4O_M;*Qq>]f@/p#.L}G)wO7V)5xf^65]O㕅Nz+Er5h&4Q`kd髗YzNpL#Vki5Y]dr_ŷ=+%(bgl 5e6/bBlrV' +eDm:rQ\@-TWEP+:cU7H"qCdFpeځ +$9ts50N%aLs/{!G +(cXxh.Yʒ6Oӱ%X"O/rBeVGKG`0Jp=bMHS)1wFwXxB -7-jNlYz_ԠBc4Ǡ`4lBF+)Q/O'_0HQr/=c!a\k*8WB@: +p+wֲhz$4o+X|$,O;pJ,9Qe +D초,$#sKX +tQ +<j*@sMRU\*5?u6lAq/YGO 21։>cw4 pYBtfaZr*K92vx2FURQsw.LjQ@10*,$V&cR^99orD\dcL5uưx\VW|WNM3xXckk GΌ};#EM-wteXt;6q AHr|Z#&n\je])Tf\hcAp)S\)WSTlk
Ma +WŎyt`l+M]ֱ%N?7D.`L{s)(wC~㱩m +Zt"&#`8/uT\:%B
6!Bx
4pviI4 gB+6a7MaŔ3:AU
m0tBgDC\cm.M+ly>/"sӏbrd;OsnS?\2'a|#=9uUsPO +vrӅ3MW馼U&_ܤE(+S`OX.@_}@n? +(2?Ԗ̡GY9/Շikj7k?_?[uH' endstream endobj 1216 0 obj << @@ -5310,13 +5306,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1227 0 obj << -/Length 307 +/Length 303 /Filter /FlateDecode >> stream -xڕQN0+0k{H@<[C۸R*q!qggv0e7948 ߁EIn,t@i$Tw=JZ۶UnuՁ]>Xw`[ -o3@2=Ҋkfa^:S@ѱA+incon+^7>mL!c(Mڥǥ&'_=t -(u%n^"[RV͡xa;Ne<V0{
p| +xڕQN0+0#VT ^=[EjRA''NxvfrSS`Z@q +\P䌰"f傥Mń[OsWtjmL%vvK:V.0GJwIS|{ endstream endobj 1226 0 obj << @@ -5334,14 +5329,15 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1236 0 obj << -/Length 1026 +/Length 1035 /Filter /FlateDecode >> stream -xVێ6}W,9I)- -4hi@%zM,$~}y-ۛn³̙
^.K\|Z|2`)`jHJR!R"$*oh <zȡ -h7DkK$IlS4_zb(UϜp(Ljy0KBP[\A/qj$Fh]wQ<_Gxo u$۔=gϬ:Z MIf%~F[7MG|MՋ>:V3N4l@;LT:7'nE#os/sT#E7=* -8Z7Sc_2j?a,K1'ʗx.$;SlI(z{')nS;uGa<_\K,@z4OFKZQ+cLJcҜXtyp:o8AX}ۻϚ8N/˶vDp50Z"ו֙3tCلgi<xmƦH{I/BwՂhF2]x4ԟK{wz)Fo Kw6[N( +xڽVێ6}W,9H)- +qE4n &V\KN/Zn/³̙w
^K 1y9q9'FeRdu )IDJ,&|)vGs4L_&@pA<IH + q@oQlp'+L3nz%
X7xk@^u7"HBUE,bYL$->&hbf2,:mYv{F29_)rB/Ib*~Ez)xLz\/T_Fu^e2;OFAq"fMV&}Ws +zvݖV)$,mu֍`)sFC_"_"dC"|gJmW/*ڟ9Iq
ԋa8iBor;yO +_Gh]Qf=^e'rx u[*۔=gϬPpNbByY9ߺgzxz?<<Dtis֡9cS?JSxsb"\*<2WM[i2kQOs*ߡ0U}Kk_fS ~#rAX*Ny8PwEOҹMHB;y~Y3O26~96d{'nH11HvFDIGճ恣!sB<V˶vp5V?ZVוƙ# ucG
g9?zM90*awޟVnz}$T|0՝|Kx=W&/}um]
ev endstream endobj 1235 0 obj << @@ -5383,9 +5379,9 @@ endobj 1233 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.182 409.103 156.068 419.371] +/Rect [146.104 409.103 179.989 419.371] /Subtype /Link -/A << /S /GoTo /D (structident_ad1e271d732662abda25b1320f66e9935) >> +/A << /S /GoTo /D (structident_a8c2ccc106967f36d7191d59d4d5a65dc) >> >> endobj 1237 0 obj << /D [1235 0 R /XYZ 70.866 789.024 null] @@ -5428,16 +5424,18 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1246 0 obj << -/Length 727 +/Length 723 /Filter /FlateDecode >> stream xڵKS0:C# -)N8$2uR}ז1dڤ')꿻?{MtEDJq4Z MQ -aEhƱ` -qEz6y9Փ:+]cE?" -ǐ`9]!yj}kY !9"G3l%DP
I'[bɀBKejj1'ePQ+\8C}ʮmLwI!} -3#rh{cW<I,hL`%w)MZn eί 'q i UBI<qoɴL&Lƶʼn+h{ӹ!EȻ̅ p)~m\p4O2r*(L)?+HBWr=v8,$%t5ǢC("E@y w(:m=p妚ٱ;5oѼ#,:?xR/2ωlr{HW0Nא +)N_y(~Pǁ$!&%=Iv hލӋT"S8-&(tʰh4GXfth~߳|^'M|^6-IUekE?# +) 4+
AsBԠβ@Br,EDG_#edm/C5H$A3̓%?ۗ(8բcO 飬(#X)W
g"flku20BP#IfFnŐ<I,hL`%s)qEZn ek/N +$nꄒxRuCk&*2Km%5VPns{M+!γOB
sj%m +0{<, #Qc)L*V|j;Cp/[FcQv!I܋"J`y`*
g(:@Ѷ~8EjSX7nh^?`u8;9'DV6ܾ$_kVN + +k +c}͘[R`{{?oH endstream endobj 1245 0 obj << @@ -5837,13 +5835,13 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1373 0 obj << -/Length 1158 +/Length 1157 /Filter /FlateDecode >> stream -x͚]s8+tif6T w&ͤi;3I!l`h@ncLqe,{ -6nFfoܤx[},-<ES.ps0xBA7fNQBw0R5K+mf<J1-OD,PG^ꞹRv NjvJ -C% +x͚]s8+tif* лN3n4qgw&0
,m__ 0Ǝ?xϣ#!@p18~
`6!?!JnʷGc"]F?[jax7|~#f[GQstCSB//XeIA*\@9,& 2~A}'v4,ȑ +PP7<LW^]mM^x;hǃyN\C|@JT}xLtY%Q+k`1cM͔ےgI=˥ZCo(WYk<j֍t0|,Z![ݶW?M,wo[Űjݍjv372&VV*KlCo3WNy\Zp0g~g])Nrـ'ߞ:;g4X8'ƭS6z|ʰ$ںk}h|1yňʽo)$lq;h3GJ)Kd
AӲkTNds",ALb
->QVuMβ`&'Ip8/Kjy=DO +|}D?b endstream endobj 1372 0 obj << @@ -6338,16 +6336,12 @@ endobj /ProcSet [ /PDF /Text ] >> endobj 1452 0 obj << -/Length 998 +/Length 997 /Filter /FlateDecode >> stream -xڵ[6)RCmcnXv^w# -9IЀ`:o_l`y ؆ -/?7TO4E "GQq|_TIumogeS˨7pAhoF~l6ȫXҖ
f%] 욥mf:{F -6G#J
vzQsEN=;ah>{i@5i!:0xeQB2qSV53U%KwǚѴG~gRUP|&^ٗfn#hE,:L<|GF|zhO<gLdTCז1B[S*)<*)+֧,:'49tM5;d:ЀkauHDYW9txdUQ.W1h#҆)Nf#ٔfMEErTYLN5.ľ-6\jXleA`!4\9)4LM4p-R5Ҭ鮼օPW) -m^#tΌ?n,!A+WBEKzd3UHgzE)*T,rڶu589^M`9?yV˺gC,] {/b$6B!vMîA\/vȚ"MWk|vjdag.u61S*Βt1xI40NJ-/x9g;9@ΙqVSݱ _1DЂ#;sNo+X{~_P=")( -P BqDƳ-u~0u*s{>\dŰKK-h=-v\-]? +xڵ[8~iմVniWVO|LCK ~{ +O,R=媞S~9!z~*my?<Kd6RMiT'9,)j2zBmb_C,6cb\ChsRh4ʨp?p-RΓ5ҬօPW)'ʼFj
bҟIe
R^<RZ#J(HE*S-JH>%^lN:;N-e8s~Av9"uVĤjx hf)M~ĞǽAE]R맰Kb%ËvԲ%I[S%13IJiI˛S詒q%RWb]<'jbCENwɷq s&׳}PzM f\:oh b8!Fo߭n4=wEOBP$EJA(@Ƴ-y~0u,-Y1n}I7We0xw/Pvj~p endstream endobj 1451 0 obj << @@ -8662,12 +8656,12 @@ endobj /Limits [(section.4.2) (section.4.7)] >> endobj 1519 0 obj << -/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R] -/Limits [(section.4.8) (structident_a91db2d18476e0a527ba20e04ca2c3e74)] +/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1240 0 R] +/Limits [(section.4.8) (structident_a8c2ccc106967f36d7191d59d4d5a65dc)] >> endobj 1520 0 obj << -/Names [(structident_ad1e271d732662abda25b1320f66e9935) 1240 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R] -/Limits [(structident_ad1e271d732662abda25b1320f66e9935) (subsection.4.1.1)] +/Names [(structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R] +/Limits [(structident_a91db2d18476e0a527ba20e04ca2c3e74) (subsection.4.1.1)] >> endobj 1521 0 obj << /Names [(subsection.4.10.1) 466 0 R (subsection.4.10.2) 470 0 R (subsection.4.2.1) 86 0 R (subsection.4.2.2) 90 0 R (subsection.4.2.3) 118 0 R (subsection.4.3.1) 130 0 R] @@ -8834,8 +8828,8 @@ endobj >> endobj 1561 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20130912114258-05'00') -/ModDate (D:20130912114258-05'00') +/CreationDate (D:20131213120956-06'00') +/ModDate (D:20131213120956-06'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj @@ -8847,567 +8841,567 @@ xref 0000000004 00000 f 0000000000 00000 f 0000000015 00000 n -0000056114 00000 n -0000341492 00000 n +0000056106 00000 n +0000341420 00000 n 0000000060 00000 n 0000000304 00000 n -0000056295 00000 n -0000341420 00000 n +0000056287 00000 n +0000341348 00000 n 0000000351 00000 n 0000000438 00000 n -0000056417 00000 n -0000341334 00000 n +0000056409 00000 n +0000341262 00000 n 0000000486 00000 n 0000000619 00000 n -0000059563 00000 n -0000341248 00000 n +0000059552 00000 n +0000341176 00000 n 0000000667 00000 n 0000000873 00000 n -0000059685 00000 n -0000341162 00000 n +0000059674 00000 n +0000341090 00000 n 0000000921 00000 n 0000001181 00000 n -0000059807 00000 n -0000341039 00000 n +0000059796 00000 n +0000340967 00000 n 0000001229 00000 n 0000001301 00000 n -0000063785 00000 n -0000340941 00000 n +0000063772 00000 n +0000340869 00000 n 0000001354 00000 n 0000001522 00000 n -0000063907 00000 n -0000340867 00000 n +0000063894 00000 n +0000340795 00000 n 0000001580 00000 n 0000001695 00000 n -0000064029 00000 n -0000340793 00000 n +0000064016 00000 n +0000340721 00000 n 0000001753 00000 n 0000001863 00000 n -0000064150 00000 n -0000340707 00000 n +0000064137 00000 n +0000340635 00000 n 0000001911 00000 n 0000002031 00000 n -0000069273 00000 n -0000340597 00000 n +0000069261 00000 n +0000340525 00000 n 0000002079 00000 n 0000002146 00000 n -0000069394 00000 n -0000340536 00000 n +0000069382 00000 n +0000340464 00000 n 0000002199 00000 n 0000002332 00000 n -0000073594 00000 n -0000340411 00000 n +0000073578 00000 n +0000340339 00000 n 0000002378 00000 n 0000002468 00000 n -0000073654 00000 n -0000340350 00000 n +0000073638 00000 n +0000340278 00000 n 0000002516 00000 n 0000002578 00000 n -0000075353 00000 n -0000340224 00000 n +0000075335 00000 n +0000340152 00000 n 0000002624 00000 n 0000002709 00000 n -0000075413 00000 n -0000340163 00000 n +0000075395 00000 n +0000340091 00000 n 0000002757 00000 n 0000002837 00000 n -0000078386 00000 n -0000340034 00000 n +0000078366 00000 n +0000339962 00000 n 0000002883 00000 n 0000003013 00000 n -0000078507 00000 n -0000339923 00000 n +0000078487 00000 n +0000339851 00000 n 0000003061 00000 n 0000003176 00000 n -0000078567 00000 n -0000339862 00000 n +0000078547 00000 n +0000339790 00000 n 0000003229 00000 n 0000003359 00000 n -0000092863 00000 n -0000339736 00000 n +0000092831 00000 n +0000339664 00000 n 0000003407 00000 n 0000003492 00000 n -0000092923 00000 n -0000339662 00000 n +0000092891 00000 n +0000339590 00000 n 0000003545 00000 n 0000003675 00000 n -0000092983 00000 n -0000339536 00000 n +0000092951 00000 n +0000339464 00000 n 0000003728 00000 n 0000003911 00000 n -0000093104 00000 n -0000339462 00000 n +0000093072 00000 n +0000339390 00000 n 0000003969 00000 n 0000004120 00000 n -0000093225 00000 n -0000339373 00000 n +0000093193 00000 n +0000339301 00000 n 0000004178 00000 n 0000004297 00000 n -0000093346 00000 n -0000339282 00000 n +0000093314 00000 n +0000339210 00000 n 0000004356 00000 n 0000004503 00000 n -0000093468 00000 n -0000339190 00000 n +0000093436 00000 n +0000339118 00000 n 0000004562 00000 n 0000004709 00000 n -0000093590 00000 n -0000339098 00000 n +0000093558 00000 n +0000339026 00000 n 0000004768 00000 n 0000004867 00000 n -0000093711 00000 n -0000339020 00000 n +0000093679 00000 n +0000338948 00000 n 0000004926 00000 n 0000005030 00000 n -0000094598 00000 n -0000338904 00000 n +0000094563 00000 n +0000338832 00000 n 0000005084 00000 n 0000005220 00000 n -0000094720 00000 n -0000338839 00000 n +0000094685 00000 n +0000338767 00000 n 0000005279 00000 n 0000005345 00000 n -0000096691 00000 n -0000338709 00000 n +0000096654 00000 n +0000338637 00000 n 0000005394 00000 n 0000005525 00000 n -0000096813 00000 n -0000338630 00000 n +0000096776 00000 n +0000338558 00000 n 0000005579 00000 n 0000005710 00000 n -0000096874 00000 n -0000338512 00000 n +0000096837 00000 n +0000338440 00000 n 0000005764 00000 n 0000005905 00000 n -0000096996 00000 n -0000338447 00000 n +0000096959 00000 n +0000338375 00000 n 0000005964 00000 n 0000006092 00000 n -0000099964 00000 n -0000338316 00000 n +0000099925 00000 n +0000338244 00000 n 0000006141 00000 n 0000006275 00000 n -0000100086 00000 n -0000338237 00000 n +0000100047 00000 n +0000338165 00000 n 0000006329 00000 n 0000006460 00000 n -0000100147 00000 n -0000338119 00000 n +0000100108 00000 n +0000338047 00000 n 0000006514 00000 n 0000006655 00000 n -0000100269 00000 n -0000338040 00000 n +0000100230 00000 n +0000337968 00000 n 0000006714 00000 n 0000006811 00000 n -0000100452 00000 n -0000337961 00000 n +0000100413 00000 n +0000337889 00000 n 0000006870 00000 n 0000006957 00000 n -0000106674 00000 n -0000337830 00000 n +0000106637 00000 n +0000337758 00000 n 0000007006 00000 n 0000007143 00000 n -0000106856 00000 n -0000337751 00000 n +0000106819 00000 n +0000337679 00000 n 0000007197 00000 n 0000007328 00000 n -0000106917 00000 n -0000337619 00000 n +0000106880 00000 n +0000337547 00000 n 0000007382 00000 n 0000007518 00000 n -0000107039 00000 n -0000337554 00000 n +0000107002 00000 n +0000337482 00000 n 0000007577 00000 n 0000007658 00000 n -0000107161 00000 n -0000337436 00000 n +0000107124 00000 n +0000337364 00000 n 0000007712 00000 n 0000007853 00000 n -0000107281 00000 n -0000337357 00000 n +0000107244 00000 n +0000337285 00000 n 0000007912 00000 n 0000008105 00000 n -0000107462 00000 n -0000337264 00000 n +0000107425 00000 n +0000337192 00000 n 0000008164 00000 n 0000008284 00000 n -0000110578 00000 n -0000337171 00000 n +0000110537 00000 n +0000337099 00000 n 0000008343 00000 n 0000008468 00000 n -0000110761 00000 n -0000337078 00000 n +0000110720 00000 n +0000337006 00000 n 0000008527 00000 n 0000008675 00000 n -0000110944 00000 n -0000336985 00000 n +0000110903 00000 n +0000336913 00000 n 0000008734 00000 n 0000008892 00000 n -0000111127 00000 n -0000336906 00000 n +0000111086 00000 n +0000336834 00000 n 0000008951 00000 n 0000009121 00000 n -0000115787 00000 n -0000336775 00000 n +0000115744 00000 n +0000336703 00000 n 0000009170 00000 n 0000009291 00000 n -0000115909 00000 n -0000336696 00000 n +0000115866 00000 n +0000336624 00000 n 0000009345 00000 n 0000009476 00000 n -0000115970 00000 n -0000336578 00000 n +0000115927 00000 n +0000336506 00000 n 0000009530 00000 n 0000009671 00000 n -0000116092 00000 n -0000336499 00000 n +0000116049 00000 n +0000336427 00000 n 0000009730 00000 n 0000009893 00000 n -0000116274 00000 n -0000336406 00000 n +0000116231 00000 n +0000336334 00000 n 0000009952 00000 n 0000010110 00000 n -0000116455 00000 n -0000336313 00000 n +0000116412 00000 n +0000336241 00000 n 0000010169 00000 n 0000010337 00000 n -0000118576 00000 n -0000336220 00000 n +0000118533 00000 n +0000336148 00000 n 0000010396 00000 n 0000010559 00000 n -0000118759 00000 n -0000336141 00000 n +0000118716 00000 n +0000336069 00000 n 0000010618 00000 n 0000010748 00000 n -0000137235 00000 n -0000336010 00000 n +0000137190 00000 n +0000335938 00000 n 0000010797 00000 n 0000010888 00000 n -0000140969 00000 n -0000335931 00000 n +0000140923 00000 n +0000335859 00000 n 0000010942 00000 n 0000011073 00000 n -0000141031 00000 n -0000335799 00000 n +0000140985 00000 n +0000335727 00000 n 0000011127 00000 n 0000011311 00000 n -0000141156 00000 n -0000335734 00000 n +0000141110 00000 n +0000335662 00000 n 0000011370 00000 n 0000011451 00000 n -0000142478 00000 n -0000335615 00000 n +0000142432 00000 n +0000335543 00000 n 0000011505 00000 n 0000011646 00000 n -0000142602 00000 n -0000335536 00000 n +0000142556 00000 n +0000335464 00000 n 0000011705 00000 n 0000011817 00000 n -0000146501 00000 n -0000335443 00000 n +0000146450 00000 n +0000335371 00000 n 0000011876 00000 n 0000012029 00000 n -0000146689 00000 n -0000335350 00000 n +0000146638 00000 n +0000335278 00000 n 0000012088 00000 n 0000012246 00000 n -0000146814 00000 n -0000335257 00000 n +0000146763 00000 n +0000335185 00000 n 0000012305 00000 n 0000012458 00000 n -0000146939 00000 n -0000335164 00000 n +0000146888 00000 n +0000335092 00000 n 0000012517 00000 n 0000012675 00000 n -0000147063 00000 n -0000335071 00000 n +0000147012 00000 n +0000334999 00000 n 0000012734 00000 n 0000012887 00000 n -0000147251 00000 n -0000334978 00000 n +0000147200 00000 n +0000334906 00000 n 0000012946 00000 n 0000013104 00000 n -0000151608 00000 n -0000334885 00000 n +0000151555 00000 n +0000334813 00000 n 0000013163 00000 n 0000013316 00000 n -0000151733 00000 n -0000334792 00000 n +0000151680 00000 n +0000334720 00000 n 0000013375 00000 n 0000013533 00000 n -0000151857 00000 n -0000334699 00000 n +0000151804 00000 n +0000334627 00000 n 0000013593 00000 n 0000013746 00000 n -0000152045 00000 n -0000334606 00000 n +0000151992 00000 n +0000334534 00000 n 0000013806 00000 n 0000013964 00000 n -0000152170 00000 n -0000334513 00000 n +0000152117 00000 n +0000334441 00000 n 0000014024 00000 n 0000014177 00000 n -0000152294 00000 n -0000334420 00000 n +0000152241 00000 n +0000334348 00000 n 0000014237 00000 n 0000014395 00000 n -0000155137 00000 n -0000334327 00000 n +0000155083 00000 n +0000334255 00000 n 0000014455 00000 n 0000014590 00000 n -0000155324 00000 n -0000334234 00000 n +0000155270 00000 n +0000334162 00000 n 0000014650 00000 n 0000014775 00000 n -0000155512 00000 n -0000334141 00000 n +0000155458 00000 n +0000334069 00000 n 0000014835 00000 n 0000014965 00000 n -0000155700 00000 n -0000334048 00000 n +0000155646 00000 n +0000333976 00000 n 0000015025 00000 n 0000015150 00000 n -0000155888 00000 n -0000333955 00000 n +0000155834 00000 n +0000333883 00000 n 0000015210 00000 n 0000015363 00000 n -0000156075 00000 n -0000333862 00000 n +0000156021 00000 n +0000333790 00000 n 0000015423 00000 n 0000015589 00000 n -0000160247 00000 n -0000333769 00000 n +0000160192 00000 n +0000333697 00000 n 0000015649 00000 n 0000015820 00000 n -0000160372 00000 n -0000333676 00000 n +0000160317 00000 n +0000333604 00000 n 0000015880 00000 n 0000016046 00000 n -0000160496 00000 n -0000333583 00000 n +0000160441 00000 n +0000333511 00000 n 0000016106 00000 n 0000016277 00000 n -0000160621 00000 n -0000333490 00000 n +0000160566 00000 n +0000333418 00000 n 0000016337 00000 n 0000016439 00000 n -0000162587 00000 n -0000333397 00000 n +0000162530 00000 n +0000333325 00000 n 0000016499 00000 n 0000016606 00000 n -0000162774 00000 n -0000333318 00000 n +0000162717 00000 n +0000333246 00000 n 0000016666 00000 n 0000016768 00000 n -0000169289 00000 n -0000333187 00000 n +0000169233 00000 n +0000333115 00000 n 0000016817 00000 n 0000016920 00000 n -0000169414 00000 n -0000333108 00000 n +0000169358 00000 n +0000333036 00000 n 0000016974 00000 n 0000017105 00000 n -0000169476 00000 n -0000332990 00000 n +0000169420 00000 n +0000332918 00000 n 0000017159 00000 n 0000017300 00000 n -0000169601 00000 n -0000332911 00000 n +0000169545 00000 n +0000332839 00000 n 0000017359 00000 n 0000017466 00000 n -0000169788 00000 n -0000332818 00000 n +0000169732 00000 n +0000332746 00000 n 0000017525 00000 n 0000017670 00000 n -0000169974 00000 n -0000332725 00000 n +0000169918 00000 n +0000332653 00000 n 0000017729 00000 n 0000017912 00000 n -0000173219 00000 n -0000332632 00000 n +0000173165 00000 n +0000332560 00000 n 0000017971 00000 n 0000018139 00000 n -0000173407 00000 n -0000332539 00000 n +0000173353 00000 n +0000332467 00000 n 0000018198 00000 n 0000018323 00000 n -0000173594 00000 n -0000332446 00000 n +0000173540 00000 n +0000332374 00000 n 0000018382 00000 n 0000018545 00000 n -0000173781 00000 n -0000332353 00000 n +0000173727 00000 n +0000332281 00000 n 0000018604 00000 n 0000018701 00000 n -0000173968 00000 n -0000332260 00000 n +0000173914 00000 n +0000332188 00000 n 0000018760 00000 n 0000018862 00000 n -0000177061 00000 n -0000332181 00000 n +0000177001 00000 n +0000332109 00000 n 0000018921 00000 n 0000019061 00000 n -0000183663 00000 n -0000332050 00000 n +0000183602 00000 n +0000331978 00000 n 0000019110 00000 n 0000019282 00000 n -0000183788 00000 n -0000331971 00000 n +0000183727 00000 n +0000331899 00000 n 0000019336 00000 n 0000019467 00000 n -0000183850 00000 n -0000331839 00000 n +0000183789 00000 n +0000331767 00000 n 0000019521 00000 n 0000019657 00000 n -0000183974 00000 n -0000331760 00000 n +0000183913 00000 n +0000331688 00000 n 0000019716 00000 n 0000019797 00000 n -0000184099 00000 n -0000331667 00000 n +0000184038 00000 n +0000331595 00000 n 0000019856 00000 n 0000019960 00000 n -0000184224 00000 n -0000331574 00000 n +0000184163 00000 n +0000331502 00000 n 0000020019 00000 n 0000020095 00000 n -0000184348 00000 n -0000331481 00000 n +0000184287 00000 n +0000331409 00000 n 0000020154 00000 n 0000020253 00000 n -0000184472 00000 n -0000331388 00000 n +0000184411 00000 n +0000331316 00000 n 0000020312 00000 n 0000020388 00000 n -0000189027 00000 n -0000331309 00000 n +0000188964 00000 n +0000331237 00000 n 0000020447 00000 n 0000020546 00000 n -0000189089 00000 n -0000331191 00000 n +0000189026 00000 n +0000331119 00000 n 0000020600 00000 n 0000020741 00000 n -0000189214 00000 n -0000331112 00000 n +0000189151 00000 n +0000331040 00000 n 0000020800 00000 n 0000020927 00000 n -0000189401 00000 n -0000331019 00000 n +0000189338 00000 n +0000330947 00000 n 0000020986 00000 n 0000021161 00000 n -0000191868 00000 n -0000330926 00000 n +0000191800 00000 n +0000330854 00000 n 0000021220 00000 n 0000021405 00000 n -0000192056 00000 n -0000330847 00000 n +0000191988 00000 n +0000330775 00000 n 0000021464 00000 n 0000021672 00000 n -0000196454 00000 n -0000330730 00000 n +0000196383 00000 n +0000330658 00000 n 0000021722 00000 n 0000021828 00000 n -0000196579 00000 n -0000330651 00000 n +0000196508 00000 n +0000330579 00000 n 0000021883 00000 n 0000022014 00000 n -0000196640 00000 n -0000330533 00000 n +0000196569 00000 n +0000330461 00000 n 0000022069 00000 n 0000022210 00000 n -0000196765 00000 n -0000330454 00000 n +0000196694 00000 n +0000330382 00000 n 0000022270 00000 n 0000022441 00000 n -0000196953 00000 n -0000330375 00000 n +0000196882 00000 n +0000330303 00000 n 0000022501 00000 n 0000022644 00000 n -0000200172 00000 n -0000330243 00000 n +0000200106 00000 n +0000330171 00000 n 0000022691 00000 n 0000022817 00000 n -0000200296 00000 n -0000330139 00000 n +0000200230 00000 n +0000330067 00000 n 0000022866 00000 n 0000023010 00000 n -0000200420 00000 n -0000330060 00000 n +0000200354 00000 n +0000329988 00000 n 0000023064 00000 n 0000023195 00000 n -0000200482 00000 n -0000329942 00000 n +0000200416 00000 n +0000329870 00000 n 0000023249 00000 n 0000023408 00000 n -0000200607 00000 n -0000329863 00000 n +0000200541 00000 n +0000329791 00000 n 0000023467 00000 n 0000023520 00000 n -0000200732 00000 n -0000329770 00000 n +0000200666 00000 n +0000329698 00000 n 0000023579 00000 n 0000023642 00000 n -0000201978 00000 n -0000329677 00000 n +0000201908 00000 n +0000329605 00000 n 0000023701 00000 n 0000023782 00000 n -0000202103 00000 n -0000329584 00000 n +0000202033 00000 n +0000329512 00000 n 0000023841 00000 n 0000023922 00000 n -0000202227 00000 n -0000329505 00000 n +0000202157 00000 n +0000329433 00000 n 0000023981 00000 n 0000024062 00000 n -0000329425 00000 n +0000329353 00000 n 0000024121 00000 n 0000024174 00000 n -0000024559 00000 n -0000024739 00000 n +0000024564 00000 n +0000024744 00000 n 0000024226 00000 n -0000024678 00000 n -0000327646 00000 n -0000327996 00000 n -0000026198 00000 n -0000026079 00000 n -0000024811 00000 n -0000326935 00000 n -0000326616 00000 n -0000027818 00000 n -0000027968 00000 n -0000028121 00000 n -0000028274 00000 n -0000028427 00000 n -0000028580 00000 n -0000028733 00000 n -0000028891 00000 n -0000029055 00000 n -0000029218 00000 n -0000029371 00000 n -0000029524 00000 n -0000029681 00000 n -0000029831 00000 n -0000029984 00000 n -0000030134 00000 n -0000030286 00000 n -0000030436 00000 n -0000030589 00000 n -0000030748 00000 n -0000030901 00000 n -0000031060 00000 n -0000031219 00000 n -0000031383 00000 n -0000031546 00000 n -0000031710 00000 n -0000031874 00000 n -0000032038 00000 n -0000032198 00000 n +0000024683 00000 n +0000327574 00000 n +0000327924 00000 n +0000026200 00000 n +0000026081 00000 n +0000024816 00000 n +0000326863 00000 n +0000326544 00000 n +0000027820 00000 n +0000027970 00000 n +0000028123 00000 n +0000028276 00000 n +0000028429 00000 n +0000028582 00000 n +0000028735 00000 n +0000028893 00000 n +0000029057 00000 n +0000029220 00000 n +0000029373 00000 n +0000029526 00000 n +0000029683 00000 n +0000029833 00000 n +0000029986 00000 n +0000030136 00000 n +0000030288 00000 n +0000030438 00000 n +0000030591 00000 n +0000030750 00000 n +0000030903 00000 n +0000031062 00000 n +0000031221 00000 n +0000031385 00000 n +0000031548 00000 n +0000031712 00000 n +0000031876 00000 n +0000032040 00000 n +0000032200 00000 n 0000034267 00000 n -0000032415 00000 n -0000027455 00000 n -0000026296 00000 n -0000327109 00000 n -0000032354 00000 n +0000032417 00000 n +0000027457 00000 n +0000026298 00000 n +0000327037 00000 n +0000032356 00000 n 0000034431 00000 n 0000034583 00000 n 0000034742 00000 n @@ -9447,967 +9441,967 @@ xref 0000040207 00000 n 0000040371 00000 n 0000040532 00000 n -0000042437 00000 n +0000042431 00000 n 0000040694 00000 n 0000033816 00000 n -0000032527 00000 n -0000042601 00000 n -0000042764 00000 n -0000042928 00000 n -0000043093 00000 n -0000043258 00000 n -0000043423 00000 n -0000043588 00000 n -0000043753 00000 n -0000043918 00000 n -0000044082 00000 n -0000044247 00000 n -0000044412 00000 n -0000044576 00000 n -0000044740 00000 n -0000044904 00000 n -0000045068 00000 n -0000045233 00000 n -0000045398 00000 n -0000045563 00000 n -0000045716 00000 n -0000045873 00000 n -0000046032 00000 n -0000046196 00000 n -0000046360 00000 n -0000046523 00000 n -0000046687 00000 n -0000046851 00000 n -0000047014 00000 n -0000047178 00000 n -0000047342 00000 n -0000047506 00000 n -0000047658 00000 n -0000047817 00000 n -0000047975 00000 n -0000048139 00000 n -0000048302 00000 n -0000048464 00000 n -0000048628 00000 n -0000048789 00000 n -0000050348 00000 n -0000048951 00000 n -0000041986 00000 n +0000032529 00000 n +0000042595 00000 n +0000042758 00000 n +0000042922 00000 n +0000043087 00000 n +0000043252 00000 n +0000043417 00000 n +0000043582 00000 n +0000043747 00000 n +0000043912 00000 n +0000044076 00000 n +0000044241 00000 n +0000044406 00000 n +0000044570 00000 n +0000044734 00000 n +0000044898 00000 n +0000045062 00000 n +0000045227 00000 n +0000045392 00000 n +0000045557 00000 n +0000045710 00000 n +0000045867 00000 n +0000046026 00000 n +0000046190 00000 n +0000046354 00000 n +0000046517 00000 n +0000046681 00000 n +0000046845 00000 n +0000047008 00000 n +0000047172 00000 n +0000047336 00000 n +0000047500 00000 n +0000047652 00000 n +0000047811 00000 n +0000047969 00000 n +0000048133 00000 n +0000048296 00000 n +0000048458 00000 n +0000048622 00000 n +0000048783 00000 n +0000050340 00000 n +0000048945 00000 n +0000041980 00000 n 0000040792 00000 n -0000050507 00000 n -0000050670 00000 n -0000050834 00000 n -0000050998 00000 n -0000051162 00000 n -0000051316 00000 n -0000051476 00000 n -0000051635 00000 n -0000051800 00000 n -0000051964 00000 n -0000052114 00000 n -0000052266 00000 n -0000052425 00000 n -0000052582 00000 n -0000052746 00000 n -0000052910 00000 n -0000053074 00000 n -0000053238 00000 n -0000053402 00000 n -0000053563 00000 n -0000050057 00000 n -0000049049 00000 n -0000055889 00000 n -0000056477 00000 n -0000055750 00000 n -0000053661 00000 n -0000056053 00000 n -0000056173 00000 n -0000056234 00000 n -0000326761 00000 n -0000056355 00000 n -0000328114 00000 n -0000059867 00000 n -0000059321 00000 n -0000056603 00000 n -0000059440 00000 n -0000326471 00000 n -0000059501 00000 n -0000059623 00000 n -0000059745 00000 n -0000063181 00000 n -0000063342 00000 n -0000063499 00000 n -0000066839 00000 n -0000064210 00000 n -0000063026 00000 n -0000060006 00000 n -0000063663 00000 n -0000063724 00000 n -0000063845 00000 n -0000063967 00000 n -0000064089 00000 n -0000092802 00000 n -0000096630 00000 n -0000099903 00000 n -0000066995 00000 n -0000067158 00000 n -0000067319 00000 n -0000067481 00000 n -0000067645 00000 n -0000067805 00000 n -0000068005 00000 n -0000068206 00000 n -0000068358 00000 n -0000068555 00000 n -0000068753 00000 n -0000068952 00000 n -0000069454 00000 n -0000066604 00000 n -0000064336 00000 n -0000069151 00000 n -0000069212 00000 n -0000069333 00000 n -0000106613 00000 n -0000115726 00000 n -0000137173 00000 n -0000183601 00000 n -0000169227 00000 n -0000078446 00000 n -0000100208 00000 n -0000100391 00000 n -0000200234 00000 n -0000147001 00000 n -0000151795 00000 n -0000176999 00000 n -0000173532 00000 n -0000070376 00000 n -0000070196 00000 n -0000069580 00000 n -0000070315 00000 n -0000071058 00000 n -0000070878 00000 n -0000070475 00000 n -0000070997 00000 n -0000071992 00000 n -0000072146 00000 n -0000072300 00000 n -0000072454 00000 n -0000072608 00000 n -0000072762 00000 n -0000072916 00000 n -0000073070 00000 n -0000073224 00000 n -0000073378 00000 n -0000073714 00000 n -0000071781 00000 n -0000071143 00000 n -0000073533 00000 n -0000328232 00000 n -0000074362 00000 n -0000074182 00000 n -0000073800 00000 n -0000074301 00000 n -0000074985 00000 n -0000075138 00000 n -0000075473 00000 n -0000074838 00000 n -0000074447 00000 n -0000075292 00000 n -0000076122 00000 n -0000075942 00000 n -0000075559 00000 n -0000076061 00000 n -0000078627 00000 n -0000078206 00000 n -0000076207 00000 n -0000078325 00000 n -0000081711 00000 n -0000081864 00000 n -0000082018 00000 n -0000082537 00000 n -0000081556 00000 n -0000078766 00000 n -0000082172 00000 n -0000082233 00000 n -0000082294 00000 n -0000327819 00000 n -0000082355 00000 n -0000082416 00000 n -0000082477 00000 n -0000084069 00000 n -0000084222 00000 n -0000084558 00000 n -0000083922 00000 n -0000082690 00000 n -0000084375 00000 n -0000084436 00000 n -0000084497 00000 n -0000328350 00000 n -0000085610 00000 n -0000085430 00000 n -0000084684 00000 n -0000085549 00000 n -0000086610 00000 n -0000086430 00000 n -0000085709 00000 n -0000086549 00000 n -0000087884 00000 n -0000087647 00000 n -0000086709 00000 n -0000087766 00000 n -0000087827 00000 n -0000089410 00000 n -0000089169 00000 n -0000088010 00000 n -0000089288 00000 n -0000089349 00000 n -0000091213 00000 n -0000091366 00000 n -0000091562 00000 n -0000091759 00000 n -0000091955 00000 n -0000092152 00000 n -0000092348 00000 n -0000092544 00000 n -0000093772 00000 n -0000091018 00000 n -0000089563 00000 n -0000092741 00000 n -0000093043 00000 n -0000093164 00000 n -0000093285 00000 n -0000093407 00000 n -0000093529 00000 n -0000093650 00000 n -0000094659 00000 n -0000094781 00000 n -0000094418 00000 n -0000093884 00000 n -0000094537 00000 n -0000328468 00000 n -0000096178 00000 n -0000096372 00000 n -0000097118 00000 n -0000096031 00000 n -0000094893 00000 n -0000096569 00000 n -0000096752 00000 n -0000096935 00000 n -0000327465 00000 n -0000097057 00000 n -0000099044 00000 n -0000099246 00000 n -0000099443 00000 n -0000099645 00000 n -0000100574 00000 n -0000098881 00000 n -0000097258 00000 n -0000099842 00000 n -0000100025 00000 n -0000100330 00000 n -0000100513 00000 n -0000103448 00000 n -0000103641 00000 n -0000103834 00000 n -0000104031 00000 n -0000104223 00000 n -0000104418 00000 n -0000104610 00000 n -0000104802 00000 n -0000104998 00000 n -0000105190 00000 n -0000105387 00000 n -0000105580 00000 n -0000105773 00000 n -0000105969 00000 n -0000106162 00000 n -0000106359 00000 n -0000107584 00000 n -0000103189 00000 n -0000100728 00000 n -0000106552 00000 n -0000106735 00000 n -0000106795 00000 n -0000106978 00000 n -0000107100 00000 n -0000107222 00000 n -0000107340 00000 n -0000107401 00000 n -0000107523 00000 n -0000110883 00000 n -0000110700 00000 n -0000110517 00000 n -0000111066 00000 n -0000111248 00000 n -0000110337 00000 n -0000107738 00000 n -0000110456 00000 n -0000110639 00000 n -0000110822 00000 n -0000111005 00000 n -0000111187 00000 n -0000113694 00000 n -0000113891 00000 n -0000114088 00000 n -0000114286 00000 n -0000114483 00000 n -0000114681 00000 n -0000114877 00000 n -0000115075 00000 n -0000115272 00000 n -0000115469 00000 n -0000116577 00000 n -0000113483 00000 n -0000111402 00000 n -0000115665 00000 n -0000115848 00000 n -0000116031 00000 n -0000116153 00000 n -0000116214 00000 n -0000116334 00000 n -0000116394 00000 n -0000116516 00000 n -0000118515 00000 n -0000118698 00000 n -0000118881 00000 n -0000118335 00000 n -0000116717 00000 n -0000118454 00000 n -0000118637 00000 n -0000118820 00000 n -0000328586 00000 n -0000121651 00000 n -0000121848 00000 n -0000122079 00000 n -0000122310 00000 n -0000122542 00000 n -0000122774 00000 n -0000123005 00000 n -0000123236 00000 n -0000123468 00000 n -0000123700 00000 n -0000123930 00000 n -0000124161 00000 n -0000124392 00000 n -0000124623 00000 n -0000124854 00000 n -0000125086 00000 n -0000125318 00000 n -0000125550 00000 n -0000125781 00000 n -0000126013 00000 n -0000126245 00000 n -0000126477 00000 n -0000126672 00000 n -0000126869 00000 n -0000127067 00000 n -0000127264 00000 n -0000127462 00000 n -0000127658 00000 n -0000127856 00000 n -0000128053 00000 n -0000128251 00000 n -0000128448 00000 n -0000128646 00000 n -0000128842 00000 n -0000129039 00000 n -0000129236 00000 n -0000129434 00000 n -0000129631 00000 n -0000129829 00000 n -0000130026 00000 n -0000130224 00000 n -0000130421 00000 n -0000130619 00000 n -0000130811 00000 n -0000131006 00000 n -0000131202 00000 n -0000131400 00000 n -0000131597 00000 n -0000131795 00000 n -0000131989 00000 n -0000132186 00000 n -0000132384 00000 n -0000132581 00000 n -0000132778 00000 n -0000132976 00000 n -0000133173 00000 n -0000133370 00000 n -0000133567 00000 n -0000133764 00000 n -0000133960 00000 n -0000134158 00000 n -0000134355 00000 n -0000134553 00000 n -0000134750 00000 n -0000134948 00000 n -0000135145 00000 n -0000135344 00000 n -0000135542 00000 n -0000135741 00000 n -0000135939 00000 n -0000136133 00000 n -0000136329 00000 n -0000136528 00000 n -0000136726 00000 n -0000136917 00000 n -0000137422 00000 n -0000120907 00000 n -0000119021 00000 n -0000137110 00000 n -0000137297 00000 n -0000137359 00000 n -0000141093 00000 n -0000141218 00000 n -0000141281 00000 n -0000141344 00000 n -0000141407 00000 n -0000141470 00000 n -0000141533 00000 n -0000141596 00000 n -0000141659 00000 n -0000141722 00000 n -0000141785 00000 n -0000141848 00000 n -0000141911 00000 n -0000141974 00000 n -0000142037 00000 n -0000142100 00000 n -0000142163 00000 n -0000142226 00000 n -0000142289 00000 n -0000142352 00000 n -0000142415 00000 n -0000160558 00000 n -0000155261 00000 n -0000160746 00000 n -0000155449 00000 n -0000142540 00000 n -0000152356 00000 n -0000162711 00000 n -0000155637 00000 n -0000155825 00000 n -0000147188 00000 n -0000147313 00000 n -0000151670 00000 n -0000151982 00000 n -0000152107 00000 n -0000152232 00000 n -0000146438 00000 n -0000146751 00000 n -0000146626 00000 n -0000146876 00000 n -0000156013 00000 n -0000160184 00000 n -0000160309 00000 n -0000160433 00000 n -0000140313 00000 n -0000140512 00000 n -0000140709 00000 n -0000142725 00000 n -0000140152 00000 n -0000137535 00000 n -0000140906 00000 n -0000327286 00000 n -0000142663 00000 n -0000145585 00000 n -0000145783 00000 n -0000145981 00000 n -0000146179 00000 n -0000147375 00000 n -0000145415 00000 n -0000142895 00000 n -0000146375 00000 n -0000146563 00000 n -0000147125 00000 n -0000150558 00000 n -0000150756 00000 n -0000150954 00000 n -0000151151 00000 n -0000151349 00000 n -0000152418 00000 n -0000150379 00000 n -0000147530 00000 n -0000151545 00000 n -0000151919 00000 n -0000156136 00000 n -0000154952 00000 n -0000152559 00000 n -0000155074 00000 n -0000155199 00000 n -0000155386 00000 n -0000155574 00000 n -0000155762 00000 n -0000155950 00000 n -0000159464 00000 n -0000159662 00000 n -0000159860 00000 n -0000160808 00000 n -0000159302 00000 n -0000156291 00000 n -0000160058 00000 n -0000160121 00000 n -0000160683 00000 n -0000328709 00000 n -0000162898 00000 n -0000162401 00000 n -0000160963 00000 n -0000162524 00000 n -0000162649 00000 n -0000162835 00000 n -0000165584 00000 n -0000165785 00000 n -0000165982 00000 n -0000166183 00000 n -0000166380 00000 n -0000166579 00000 n -0000166776 00000 n -0000166977 00000 n -0000167175 00000 n -0000167374 00000 n -0000167571 00000 n -0000167771 00000 n -0000167969 00000 n -0000168170 00000 n -0000168368 00000 n -0000168568 00000 n -0000168765 00000 n -0000168966 00000 n -0000170097 00000 n -0000165287 00000 n -0000163053 00000 n -0000169164 00000 n -0000169351 00000 n -0000169538 00000 n -0000169663 00000 n -0000169725 00000 n -0000169849 00000 n -0000169912 00000 n -0000170034 00000 n -0000173718 00000 n -0000173156 00000 n -0000173906 00000 n -0000173344 00000 n -0000174029 00000 n -0000172970 00000 n -0000170238 00000 n -0000173093 00000 n -0000173281 00000 n -0000173469 00000 n -0000173656 00000 n -0000173843 00000 n -0000177186 00000 n -0000176750 00000 n -0000174184 00000 n -0000176873 00000 n -0000176936 00000 n -0000177123 00000 n -0000179565 00000 n -0000179763 00000 n -0000179961 00000 n -0000180160 00000 n -0000180358 00000 n -0000180556 00000 n -0000180755 00000 n -0000180954 00000 n -0000181153 00000 n -0000181351 00000 n -0000181550 00000 n -0000181747 00000 n -0000181946 00000 n -0000182145 00000 n -0000182344 00000 n -0000182543 00000 n -0000182742 00000 n -0000182941 00000 n -0000183140 00000 n -0000183339 00000 n -0000184596 00000 n -0000179250 00000 n -0000177327 00000 n -0000183538 00000 n -0000183725 00000 n -0000183911 00000 n -0000184036 00000 n -0000184161 00000 n -0000184286 00000 n -0000184410 00000 n -0000184534 00000 n -0000189151 00000 n -0000191805 00000 n -0000189338 00000 n -0000191993 00000 n -0000188568 00000 n -0000188767 00000 n -0000189526 00000 n -0000188415 00000 n -0000184723 00000 n -0000188964 00000 n -0000189276 00000 n +0000050499 00000 n +0000050662 00000 n +0000050826 00000 n +0000050990 00000 n +0000051154 00000 n +0000051308 00000 n +0000051468 00000 n +0000051627 00000 n +0000051792 00000 n +0000051956 00000 n +0000052106 00000 n +0000052258 00000 n +0000052417 00000 n +0000052574 00000 n +0000052738 00000 n +0000052902 00000 n +0000053066 00000 n +0000053230 00000 n +0000053394 00000 n +0000053555 00000 n +0000050049 00000 n +0000049043 00000 n +0000055881 00000 n +0000056469 00000 n +0000055742 00000 n +0000053653 00000 n +0000056045 00000 n +0000056165 00000 n +0000056226 00000 n +0000326689 00000 n +0000056347 00000 n +0000328042 00000 n +0000059856 00000 n +0000059310 00000 n +0000056595 00000 n +0000059429 00000 n +0000326399 00000 n +0000059490 00000 n +0000059612 00000 n +0000059734 00000 n +0000063168 00000 n +0000063329 00000 n +0000063486 00000 n +0000066827 00000 n +0000064197 00000 n +0000063013 00000 n +0000059995 00000 n +0000063650 00000 n +0000063711 00000 n +0000063832 00000 n +0000063954 00000 n +0000064076 00000 n +0000092770 00000 n +0000096593 00000 n +0000099864 00000 n +0000066983 00000 n +0000067146 00000 n +0000067307 00000 n +0000067469 00000 n +0000067633 00000 n +0000067793 00000 n +0000067993 00000 n +0000068194 00000 n +0000068346 00000 n +0000068543 00000 n +0000068741 00000 n +0000068940 00000 n +0000069442 00000 n +0000066592 00000 n +0000064323 00000 n +0000069139 00000 n +0000069200 00000 n +0000069321 00000 n +0000106576 00000 n +0000115683 00000 n +0000137128 00000 n +0000183540 00000 n +0000169171 00000 n +0000078426 00000 n +0000100169 00000 n +0000100352 00000 n +0000200168 00000 n +0000146950 00000 n +0000151742 00000 n +0000176939 00000 n +0000173478 00000 n +0000070363 00000 n +0000070183 00000 n +0000069568 00000 n +0000070302 00000 n +0000071042 00000 n +0000070862 00000 n +0000070462 00000 n +0000070981 00000 n +0000071976 00000 n +0000072130 00000 n +0000072284 00000 n +0000072438 00000 n +0000072592 00000 n +0000072746 00000 n +0000072900 00000 n +0000073054 00000 n +0000073208 00000 n +0000073362 00000 n +0000073698 00000 n +0000071765 00000 n +0000071127 00000 n +0000073517 00000 n +0000328160 00000 n +0000074344 00000 n +0000074164 00000 n +0000073784 00000 n +0000074283 00000 n +0000074967 00000 n +0000075120 00000 n +0000075455 00000 n +0000074820 00000 n +0000074429 00000 n +0000075274 00000 n +0000076102 00000 n +0000075922 00000 n +0000075541 00000 n +0000076041 00000 n +0000078607 00000 n +0000078186 00000 n +0000076187 00000 n +0000078305 00000 n +0000081692 00000 n +0000081845 00000 n +0000081999 00000 n +0000082518 00000 n +0000081537 00000 n +0000078746 00000 n +0000082153 00000 n +0000082214 00000 n +0000082275 00000 n +0000327747 00000 n +0000082336 00000 n +0000082397 00000 n +0000082458 00000 n +0000084048 00000 n +0000084201 00000 n +0000084537 00000 n +0000083901 00000 n +0000082671 00000 n +0000084354 00000 n +0000084415 00000 n +0000084476 00000 n +0000328278 00000 n +0000085587 00000 n +0000085407 00000 n +0000084663 00000 n +0000085526 00000 n +0000086585 00000 n +0000086405 00000 n +0000085686 00000 n +0000086524 00000 n +0000087856 00000 n +0000087619 00000 n +0000086684 00000 n +0000087738 00000 n +0000087799 00000 n +0000089376 00000 n +0000089135 00000 n +0000087982 00000 n +0000089254 00000 n +0000089315 00000 n +0000091181 00000 n +0000091334 00000 n +0000091530 00000 n +0000091727 00000 n +0000091923 00000 n +0000092120 00000 n +0000092316 00000 n +0000092512 00000 n +0000093740 00000 n +0000090986 00000 n +0000089529 00000 n +0000092709 00000 n +0000093011 00000 n +0000093132 00000 n +0000093253 00000 n +0000093375 00000 n +0000093497 00000 n +0000093618 00000 n +0000094624 00000 n +0000094746 00000 n +0000094383 00000 n +0000093852 00000 n +0000094502 00000 n +0000328396 00000 n +0000096141 00000 n +0000096335 00000 n +0000097081 00000 n +0000095994 00000 n +0000094858 00000 n +0000096532 00000 n +0000096715 00000 n +0000096898 00000 n +0000327393 00000 n +0000097020 00000 n +0000099005 00000 n +0000099207 00000 n +0000099404 00000 n +0000099606 00000 n +0000100535 00000 n +0000098842 00000 n +0000097221 00000 n +0000099803 00000 n +0000099986 00000 n +0000100291 00000 n +0000100474 00000 n +0000103411 00000 n +0000103604 00000 n +0000103797 00000 n +0000103994 00000 n +0000104186 00000 n +0000104381 00000 n +0000104573 00000 n +0000104765 00000 n +0000104961 00000 n +0000105153 00000 n +0000105350 00000 n +0000105543 00000 n +0000105736 00000 n +0000105932 00000 n +0000106125 00000 n +0000106322 00000 n +0000107547 00000 n +0000103152 00000 n +0000100689 00000 n +0000106515 00000 n +0000106698 00000 n +0000106758 00000 n +0000106941 00000 n +0000107063 00000 n +0000107185 00000 n +0000107303 00000 n +0000107364 00000 n +0000107486 00000 n +0000110842 00000 n +0000110659 00000 n +0000110476 00000 n +0000111025 00000 n +0000111207 00000 n +0000110296 00000 n +0000107701 00000 n +0000110415 00000 n +0000110598 00000 n +0000110781 00000 n +0000110964 00000 n +0000111146 00000 n +0000113651 00000 n +0000113848 00000 n +0000114045 00000 n +0000114243 00000 n +0000114440 00000 n +0000114638 00000 n +0000114834 00000 n +0000115032 00000 n +0000115229 00000 n +0000115426 00000 n +0000116534 00000 n +0000113440 00000 n +0000111361 00000 n +0000115622 00000 n +0000115805 00000 n +0000115988 00000 n +0000116110 00000 n +0000116171 00000 n +0000116291 00000 n +0000116351 00000 n +0000116473 00000 n +0000118472 00000 n +0000118655 00000 n +0000118838 00000 n +0000118292 00000 n +0000116674 00000 n +0000118411 00000 n +0000118594 00000 n +0000118777 00000 n +0000328514 00000 n +0000121606 00000 n +0000121803 00000 n +0000122034 00000 n +0000122265 00000 n +0000122497 00000 n +0000122729 00000 n +0000122960 00000 n +0000123191 00000 n +0000123423 00000 n +0000123655 00000 n +0000123885 00000 n +0000124116 00000 n +0000124347 00000 n +0000124578 00000 n +0000124809 00000 n +0000125041 00000 n +0000125273 00000 n +0000125505 00000 n +0000125736 00000 n +0000125968 00000 n +0000126200 00000 n +0000126432 00000 n +0000126627 00000 n +0000126824 00000 n +0000127022 00000 n +0000127219 00000 n +0000127417 00000 n +0000127613 00000 n +0000127811 00000 n +0000128008 00000 n +0000128206 00000 n +0000128403 00000 n +0000128601 00000 n +0000128797 00000 n +0000128994 00000 n +0000129191 00000 n +0000129389 00000 n +0000129586 00000 n +0000129784 00000 n +0000129981 00000 n +0000130179 00000 n +0000130376 00000 n +0000130574 00000 n +0000130766 00000 n +0000130961 00000 n +0000131157 00000 n +0000131355 00000 n +0000131552 00000 n +0000131750 00000 n +0000131944 00000 n +0000132141 00000 n +0000132339 00000 n +0000132536 00000 n +0000132733 00000 n +0000132931 00000 n +0000133128 00000 n +0000133325 00000 n +0000133522 00000 n +0000133719 00000 n +0000133915 00000 n +0000134113 00000 n +0000134310 00000 n +0000134508 00000 n +0000134705 00000 n +0000134903 00000 n +0000135100 00000 n +0000135299 00000 n +0000135497 00000 n +0000135696 00000 n +0000135894 00000 n +0000136088 00000 n +0000136284 00000 n +0000136483 00000 n +0000136681 00000 n +0000136872 00000 n +0000137377 00000 n +0000120862 00000 n +0000118978 00000 n +0000137065 00000 n +0000137252 00000 n +0000137314 00000 n +0000141047 00000 n +0000141172 00000 n +0000141235 00000 n +0000141298 00000 n +0000141361 00000 n +0000141424 00000 n +0000141487 00000 n +0000141550 00000 n +0000141613 00000 n +0000141676 00000 n +0000141739 00000 n +0000141802 00000 n +0000141865 00000 n +0000141928 00000 n +0000141991 00000 n +0000142054 00000 n +0000142117 00000 n +0000142180 00000 n +0000142243 00000 n +0000142306 00000 n +0000142369 00000 n +0000160503 00000 n +0000155207 00000 n +0000160691 00000 n +0000155395 00000 n +0000142494 00000 n +0000152303 00000 n +0000162654 00000 n +0000155583 00000 n +0000155771 00000 n +0000147137 00000 n +0000147262 00000 n +0000151617 00000 n +0000151929 00000 n +0000152054 00000 n +0000152179 00000 n +0000146387 00000 n +0000146700 00000 n +0000146575 00000 n +0000146825 00000 n +0000155959 00000 n +0000160129 00000 n +0000160254 00000 n +0000160378 00000 n +0000140267 00000 n +0000140466 00000 n +0000140663 00000 n +0000142679 00000 n +0000140106 00000 n +0000137490 00000 n +0000140860 00000 n +0000327214 00000 n +0000142617 00000 n +0000145534 00000 n +0000145732 00000 n +0000145930 00000 n +0000146128 00000 n +0000147324 00000 n +0000145364 00000 n +0000142849 00000 n +0000146324 00000 n +0000146512 00000 n +0000147074 00000 n +0000150505 00000 n +0000150703 00000 n +0000150901 00000 n +0000151098 00000 n +0000151296 00000 n +0000152365 00000 n +0000150326 00000 n +0000147479 00000 n +0000151492 00000 n +0000151866 00000 n +0000156082 00000 n +0000154898 00000 n +0000152506 00000 n +0000155020 00000 n +0000155145 00000 n +0000155332 00000 n +0000155520 00000 n +0000155708 00000 n +0000155896 00000 n +0000159409 00000 n +0000159607 00000 n +0000159805 00000 n +0000160753 00000 n +0000159247 00000 n +0000156237 00000 n +0000160003 00000 n +0000160066 00000 n +0000160628 00000 n +0000328637 00000 n +0000162841 00000 n +0000162344 00000 n +0000160908 00000 n +0000162467 00000 n +0000162592 00000 n +0000162778 00000 n +0000165528 00000 n +0000165729 00000 n +0000165926 00000 n +0000166127 00000 n +0000166324 00000 n +0000166523 00000 n +0000166720 00000 n +0000166921 00000 n +0000167119 00000 n +0000167318 00000 n +0000167515 00000 n +0000167715 00000 n +0000167913 00000 n +0000168114 00000 n +0000168312 00000 n +0000168512 00000 n +0000168709 00000 n +0000168910 00000 n +0000170041 00000 n +0000165231 00000 n +0000162996 00000 n +0000169108 00000 n +0000169295 00000 n +0000169482 00000 n +0000169607 00000 n +0000169669 00000 n +0000169793 00000 n +0000169856 00000 n +0000169978 00000 n +0000173664 00000 n +0000173102 00000 n +0000173852 00000 n +0000173290 00000 n +0000173975 00000 n +0000172916 00000 n +0000170182 00000 n +0000173039 00000 n +0000173227 00000 n +0000173415 00000 n +0000173602 00000 n +0000173789 00000 n +0000177126 00000 n +0000176690 00000 n +0000174130 00000 n +0000176813 00000 n +0000176876 00000 n +0000177063 00000 n +0000179504 00000 n +0000179702 00000 n +0000179900 00000 n +0000180099 00000 n +0000180297 00000 n +0000180495 00000 n +0000180694 00000 n +0000180893 00000 n +0000181092 00000 n +0000181290 00000 n +0000181489 00000 n +0000181686 00000 n +0000181885 00000 n +0000182084 00000 n +0000182283 00000 n +0000182482 00000 n +0000182681 00000 n +0000182880 00000 n +0000183079 00000 n +0000183278 00000 n +0000184535 00000 n +0000179189 00000 n +0000177267 00000 n +0000183477 00000 n +0000183664 00000 n +0000183850 00000 n +0000183975 00000 n +0000184100 00000 n +0000184225 00000 n +0000184349 00000 n +0000184473 00000 n +0000189088 00000 n +0000191737 00000 n +0000189275 00000 n +0000191925 00000 n +0000188505 00000 n +0000188704 00000 n 0000189463 00000 n -0000328834 00000 n -0000192181 00000 n -0000191619 00000 n -0000189681 00000 n -0000191742 00000 n -0000191930 00000 n -0000192118 00000 n -0000195549 00000 n -0000195741 00000 n -0000195939 00000 n -0000196131 00000 n -0000197078 00000 n -0000195378 00000 n -0000192322 00000 n -0000196328 00000 n -0000196391 00000 n -0000196516 00000 n -0000196702 00000 n -0000196827 00000 n -0000196890 00000 n -0000197015 00000 n -0000197794 00000 n -0000197608 00000 n -0000197219 00000 n -0000197731 00000 n -0000199168 00000 n -0000199356 00000 n -0000199544 00000 n -0000199732 00000 n -0000199920 00000 n -0000200856 00000 n -0000198988 00000 n -0000197880 00000 n -0000200109 00000 n -0000200358 00000 n -0000200544 00000 n -0000200669 00000 n -0000200794 00000 n -0000202040 00000 n -0000202164 00000 n -0000202289 00000 n -0000201792 00000 n -0000200983 00000 n -0000201915 00000 n -0000203848 00000 n -0000203999 00000 n -0000204150 00000 n -0000204300 00000 n -0000204451 00000 n -0000204601 00000 n -0000204752 00000 n -0000204902 00000 n -0000205053 00000 n -0000205204 00000 n -0000205355 00000 n -0000205506 00000 n -0000205657 00000 n -0000205808 00000 n -0000205959 00000 n -0000206110 00000 n -0000206261 00000 n -0000206411 00000 n -0000206562 00000 n -0000206713 00000 n -0000206863 00000 n -0000207014 00000 n -0000207165 00000 n -0000207316 00000 n -0000207465 00000 n -0000207615 00000 n -0000207766 00000 n -0000207917 00000 n -0000208068 00000 n -0000208219 00000 n -0000208370 00000 n -0000208521 00000 n -0000208672 00000 n -0000208823 00000 n -0000208974 00000 n -0000209124 00000 n -0000209275 00000 n -0000209425 00000 n -0000209576 00000 n -0000209726 00000 n -0000209877 00000 n -0000210028 00000 n -0000210179 00000 n -0000210330 00000 n -0000210481 00000 n -0000210632 00000 n -0000210783 00000 n -0000210934 00000 n -0000211083 00000 n -0000211295 00000 n -0000203272 00000 n -0000202402 00000 n -0000211232 00000 n -0000328959 00000 n -0000213369 00000 n -0000213520 00000 n -0000213671 00000 n -0000213820 00000 n -0000213969 00000 n -0000214119 00000 n -0000214270 00000 n -0000214421 00000 n -0000214571 00000 n -0000214722 00000 n -0000214873 00000 n -0000215024 00000 n -0000215175 00000 n -0000215326 00000 n -0000215477 00000 n -0000215625 00000 n -0000215775 00000 n -0000215925 00000 n -0000216076 00000 n -0000216227 00000 n -0000216378 00000 n -0000216529 00000 n -0000216680 00000 n -0000216831 00000 n -0000216982 00000 n -0000217132 00000 n -0000217282 00000 n -0000217433 00000 n -0000217584 00000 n -0000217735 00000 n -0000217886 00000 n -0000218037 00000 n -0000218188 00000 n -0000218338 00000 n -0000218487 00000 n -0000218637 00000 n -0000218788 00000 n -0000218939 00000 n -0000219090 00000 n -0000219241 00000 n -0000219392 00000 n -0000219543 00000 n -0000219694 00000 n -0000219845 00000 n -0000219995 00000 n -0000220146 00000 n -0000220297 00000 n -0000220448 00000 n -0000220599 00000 n -0000220749 00000 n -0000220900 00000 n -0000221050 00000 n -0000221201 00000 n -0000221351 00000 n -0000221502 00000 n -0000221653 00000 n -0000221804 00000 n -0000221954 00000 n -0000222103 00000 n -0000222253 00000 n -0000222404 00000 n -0000222555 00000 n -0000222706 00000 n -0000222857 00000 n -0000223008 00000 n -0000223159 00000 n -0000223309 00000 n -0000223458 00000 n -0000225668 00000 n -0000223670 00000 n -0000212622 00000 n -0000211382 00000 n -0000223607 00000 n -0000225819 00000 n -0000225969 00000 n -0000226119 00000 n -0000226270 00000 n -0000226419 00000 n -0000226570 00000 n -0000226721 00000 n -0000226871 00000 n -0000227022 00000 n -0000227173 00000 n -0000227323 00000 n -0000227474 00000 n -0000227625 00000 n -0000227776 00000 n -0000227927 00000 n -0000228076 00000 n -0000228226 00000 n -0000228377 00000 n -0000228528 00000 n -0000228679 00000 n -0000228830 00000 n -0000228980 00000 n -0000229131 00000 n -0000229282 00000 n -0000229433 00000 n -0000229583 00000 n -0000229734 00000 n -0000229885 00000 n -0000230034 00000 n -0000230183 00000 n -0000230334 00000 n -0000230484 00000 n -0000230635 00000 n -0000230786 00000 n -0000230937 00000 n -0000231088 00000 n -0000231239 00000 n -0000231390 00000 n -0000231541 00000 n -0000231692 00000 n -0000231843 00000 n -0000231994 00000 n -0000232145 00000 n -0000232296 00000 n -0000232447 00000 n -0000232598 00000 n -0000232747 00000 n -0000232897 00000 n -0000233047 00000 n -0000233197 00000 n -0000233347 00000 n -0000233498 00000 n -0000233648 00000 n -0000233799 00000 n -0000233949 00000 n -0000234098 00000 n -0000234247 00000 n -0000234398 00000 n -0000234548 00000 n -0000234699 00000 n -0000234849 00000 n -0000235000 00000 n -0000235150 00000 n -0000235301 00000 n -0000235451 00000 n -0000235602 00000 n -0000235753 00000 n -0000235904 00000 n -0000236055 00000 n -0000236204 00000 n -0000236354 00000 n -0000236505 00000 n -0000236654 00000 n -0000236805 00000 n -0000236955 00000 n -0000237169 00000 n -0000224849 00000 n -0000223769 00000 n -0000237106 00000 n -0000325937 00000 n -0000237268 00000 n -0000237388 00000 n -0000237860 00000 n -0000238333 00000 n -0000238369 00000 n -0000238761 00000 n -0000239421 00000 n -0000240022 00000 n -0000240563 00000 n -0000241229 00000 n -0000243038 00000 n -0000243273 00000 n -0000244846 00000 n -0000245096 00000 n -0000263088 00000 n -0000263618 00000 n -0000275575 00000 n -0000276011 00000 n -0000289174 00000 n -0000289629 00000 n -0000297760 00000 n -0000298048 00000 n -0000306311 00000 n -0000306612 00000 n -0000318991 00000 n -0000319626 00000 n -0000325634 00000 n -0000329057 00000 n -0000329177 00000 n -0000329276 00000 n -0000329349 00000 n -0000341602 00000 n -0000341785 00000 n -0000342171 00000 n -0000342677 00000 n -0000343122 00000 n -0000343573 00000 n -0000344149 00000 n -0000344658 00000 n -0000345148 00000 n -0000345640 00000 n -0000346131 00000 n -0000346691 00000 n -0000347252 00000 n -0000347813 00000 n -0000348373 00000 n -0000349104 00000 n -0000349937 00000 n -0000350770 00000 n -0000351375 00000 n -0000351647 00000 n -0000351871 00000 n -0000352042 00000 n -0000352212 00000 n -0000352385 00000 n -0000352560 00000 n -0000352737 00000 n -0000352912 00000 n -0000353080 00000 n -0000353274 00000 n -0000353480 00000 n -0000353675 00000 n -0000353871 00000 n -0000354071 00000 n -0000354273 00000 n -0000354580 00000 n -0000354939 00000 n -0000355183 00000 n -0000355426 00000 n -0000355669 00000 n -0000355912 00000 n -0000356193 00000 n -0000356476 00000 n -0000356759 00000 n -0000357042 00000 n -0000357328 00000 n -0000357619 00000 n -0000357909 00000 n -0000358196 00000 n -0000358479 00000 n -0000358762 00000 n -0000359045 00000 n -0000359328 00000 n -0000359577 00000 n -0000359772 00000 n -0000359970 00000 n -0000360171 00000 n -0000360370 00000 n -0000360571 00000 n -0000360770 00000 n -0000360962 00000 n -0000361049 00000 n -0000361217 00000 n -0000361431 00000 n -0000361606 00000 n -0000361735 00000 n -0000361854 00000 n -0000361982 00000 n -0000362121 00000 n -0000362265 00000 n -0000362398 00000 n -0000362519 00000 n -0000362646 00000 n -0000362755 00000 n -0000362839 00000 n -0000362879 00000 n -0000363079 00000 n +0000188352 00000 n +0000184662 00000 n +0000188901 00000 n +0000189213 00000 n +0000189400 00000 n +0000328762 00000 n +0000192113 00000 n +0000191551 00000 n +0000189618 00000 n +0000191674 00000 n +0000191862 00000 n +0000192050 00000 n +0000195478 00000 n +0000195670 00000 n +0000195868 00000 n +0000196060 00000 n +0000197007 00000 n +0000195307 00000 n +0000192254 00000 n +0000196257 00000 n +0000196320 00000 n +0000196445 00000 n +0000196631 00000 n +0000196756 00000 n +0000196819 00000 n +0000196944 00000 n +0000197719 00000 n +0000197533 00000 n +0000197148 00000 n +0000197656 00000 n +0000199102 00000 n +0000199290 00000 n +0000199478 00000 n +0000199666 00000 n +0000199854 00000 n +0000200790 00000 n +0000198922 00000 n +0000197805 00000 n +0000200043 00000 n +0000200292 00000 n +0000200478 00000 n +0000200603 00000 n +0000200728 00000 n +0000201970 00000 n +0000202094 00000 n +0000202219 00000 n +0000201722 00000 n +0000200917 00000 n +0000201845 00000 n +0000203778 00000 n +0000203929 00000 n +0000204080 00000 n +0000204230 00000 n +0000204381 00000 n +0000204531 00000 n +0000204682 00000 n +0000204832 00000 n +0000204983 00000 n +0000205134 00000 n +0000205285 00000 n +0000205436 00000 n +0000205587 00000 n +0000205738 00000 n +0000205889 00000 n +0000206040 00000 n +0000206191 00000 n +0000206341 00000 n +0000206492 00000 n +0000206643 00000 n +0000206793 00000 n +0000206944 00000 n +0000207095 00000 n +0000207246 00000 n +0000207395 00000 n +0000207545 00000 n +0000207696 00000 n +0000207847 00000 n +0000207998 00000 n +0000208149 00000 n +0000208300 00000 n +0000208451 00000 n +0000208602 00000 n +0000208753 00000 n +0000208904 00000 n +0000209054 00000 n +0000209205 00000 n +0000209355 00000 n +0000209506 00000 n +0000209656 00000 n +0000209807 00000 n +0000209958 00000 n +0000210109 00000 n +0000210260 00000 n +0000210411 00000 n +0000210562 00000 n +0000210713 00000 n +0000210864 00000 n +0000211013 00000 n +0000211225 00000 n +0000203202 00000 n +0000202332 00000 n +0000211162 00000 n +0000328887 00000 n +0000213298 00000 n +0000213449 00000 n +0000213600 00000 n +0000213749 00000 n +0000213898 00000 n +0000214048 00000 n +0000214199 00000 n +0000214350 00000 n +0000214500 00000 n +0000214651 00000 n +0000214802 00000 n +0000214953 00000 n +0000215104 00000 n +0000215255 00000 n +0000215406 00000 n +0000215554 00000 n +0000215704 00000 n +0000215854 00000 n +0000216005 00000 n +0000216156 00000 n +0000216307 00000 n +0000216458 00000 n +0000216609 00000 n +0000216760 00000 n +0000216911 00000 n +0000217061 00000 n +0000217211 00000 n +0000217362 00000 n +0000217513 00000 n +0000217664 00000 n +0000217815 00000 n +0000217966 00000 n +0000218117 00000 n +0000218267 00000 n +0000218416 00000 n +0000218566 00000 n +0000218717 00000 n +0000218868 00000 n +0000219019 00000 n +0000219170 00000 n +0000219321 00000 n +0000219472 00000 n +0000219623 00000 n +0000219774 00000 n +0000219924 00000 n +0000220075 00000 n +0000220226 00000 n +0000220377 00000 n +0000220528 00000 n +0000220678 00000 n +0000220829 00000 n +0000220979 00000 n +0000221130 00000 n +0000221280 00000 n +0000221431 00000 n +0000221582 00000 n +0000221733 00000 n +0000221883 00000 n +0000222032 00000 n +0000222182 00000 n +0000222333 00000 n +0000222484 00000 n +0000222635 00000 n +0000222786 00000 n +0000222937 00000 n +0000223088 00000 n +0000223238 00000 n +0000223387 00000 n +0000225596 00000 n +0000223599 00000 n +0000212551 00000 n +0000211312 00000 n +0000223536 00000 n +0000225747 00000 n +0000225897 00000 n +0000226047 00000 n +0000226198 00000 n +0000226347 00000 n +0000226498 00000 n +0000226649 00000 n +0000226799 00000 n +0000226950 00000 n +0000227101 00000 n +0000227251 00000 n +0000227402 00000 n +0000227553 00000 n +0000227704 00000 n +0000227855 00000 n +0000228004 00000 n +0000228154 00000 n +0000228305 00000 n +0000228456 00000 n +0000228607 00000 n +0000228758 00000 n +0000228908 00000 n +0000229059 00000 n +0000229210 00000 n +0000229361 00000 n +0000229511 00000 n +0000229662 00000 n +0000229813 00000 n +0000229962 00000 n +0000230111 00000 n +0000230262 00000 n +0000230412 00000 n +0000230563 00000 n +0000230714 00000 n +0000230865 00000 n +0000231016 00000 n +0000231167 00000 n +0000231318 00000 n +0000231469 00000 n +0000231620 00000 n +0000231771 00000 n +0000231922 00000 n +0000232073 00000 n +0000232224 00000 n +0000232375 00000 n +0000232526 00000 n +0000232675 00000 n +0000232825 00000 n +0000232975 00000 n +0000233125 00000 n +0000233275 00000 n +0000233426 00000 n +0000233576 00000 n +0000233727 00000 n +0000233877 00000 n +0000234026 00000 n +0000234175 00000 n +0000234326 00000 n +0000234476 00000 n +0000234627 00000 n +0000234777 00000 n +0000234928 00000 n +0000235078 00000 n +0000235229 00000 n +0000235379 00000 n +0000235530 00000 n +0000235681 00000 n +0000235832 00000 n +0000235983 00000 n +0000236132 00000 n +0000236282 00000 n +0000236433 00000 n +0000236582 00000 n +0000236733 00000 n +0000236883 00000 n +0000237097 00000 n +0000224777 00000 n +0000223698 00000 n +0000237034 00000 n +0000325865 00000 n +0000237196 00000 n +0000237316 00000 n +0000237788 00000 n +0000238261 00000 n +0000238297 00000 n +0000238689 00000 n +0000239349 00000 n +0000239950 00000 n +0000240491 00000 n +0000241157 00000 n +0000242966 00000 n +0000243201 00000 n +0000244774 00000 n +0000245024 00000 n +0000263016 00000 n +0000263546 00000 n +0000275503 00000 n +0000275939 00000 n +0000289102 00000 n +0000289557 00000 n +0000297688 00000 n +0000297976 00000 n +0000306239 00000 n +0000306540 00000 n +0000318919 00000 n +0000319554 00000 n +0000325562 00000 n +0000328985 00000 n +0000329105 00000 n +0000329204 00000 n +0000329277 00000 n +0000341530 00000 n +0000341713 00000 n +0000342099 00000 n +0000342605 00000 n +0000343050 00000 n +0000343501 00000 n +0000344077 00000 n +0000344586 00000 n +0000345076 00000 n +0000345568 00000 n +0000346059 00000 n +0000346619 00000 n +0000347180 00000 n +0000347741 00000 n +0000348301 00000 n +0000349032 00000 n +0000349865 00000 n +0000350698 00000 n +0000351303 00000 n +0000351575 00000 n +0000351799 00000 n +0000351970 00000 n +0000352140 00000 n +0000352313 00000 n +0000352488 00000 n +0000352665 00000 n +0000352840 00000 n +0000353008 00000 n +0000353202 00000 n +0000353408 00000 n +0000353603 00000 n +0000353799 00000 n +0000353999 00000 n +0000354201 00000 n +0000354508 00000 n +0000354867 00000 n +0000355111 00000 n +0000355354 00000 n +0000355597 00000 n +0000355840 00000 n +0000356121 00000 n +0000356404 00000 n +0000356687 00000 n +0000356970 00000 n +0000357256 00000 n +0000357547 00000 n +0000357837 00000 n +0000358124 00000 n +0000358407 00000 n +0000358690 00000 n +0000358973 00000 n +0000359256 00000 n +0000359505 00000 n +0000359700 00000 n +0000359898 00000 n +0000360099 00000 n +0000360298 00000 n +0000360499 00000 n +0000360698 00000 n +0000360890 00000 n +0000360977 00000 n +0000361145 00000 n +0000361359 00000 n +0000361534 00000 n +0000361663 00000 n +0000361782 00000 n +0000361910 00000 n +0000362049 00000 n +0000362193 00000 n +0000362326 00000 n +0000362447 00000 n +0000362574 00000 n +0000362683 00000 n +0000362767 00000 n +0000362807 00000 n +0000363007 00000 n trailer << /Size 1562 /Root 1560 0 R /Info 1561 0 R -/ID [<0CF6A151112D8671651F0CC4C7122EBE> <0CF6A151112D8671651F0CC4C7122EBE>] >> +/ID [<66BFFE03FB2447F25C17B2469142EE98> <66BFFE03FB2447F25C17B2469142EE98>] >> startxref -363411 +363339 %%EOF |

