ࡱ> J|GHI=`!Q~E@O齜 & m~:!`htQxڄ?dL]]`] ťP@(EwZKq($'3I_vϽ}~d,6s %HsITW~$f_* iI_ UKȥTV_¯s3T%4'MIyylKJB%I(?JJo %3NSD־Z7O-P˳ ^M~[[<R7y-ߪ|u|Px2* +sK|sEt"^E{wqU>۽׹? ԻΣk44n0fj / ?<#DXu~kp|,H ^E>>C]^^ǛA8Wn7VcaK^cedEz1ndg&Cj&fc%b| #d1ao(O6j㮷 㼭Fovk62C:+YjVjb/*"ㅽX`d4F Qn/9OmT?JeQ!sEY{(crn} Jڋ`t1Pܮ(fGFVˋá/jWX^NX1:=BvV. ,Lo|hh %!5'a%kn9qُS vM( UѾ `̀aCIĪ^Vo `,f]2aG]^U*v$vkv >"_o5x`UB aެ`_31nXnV@۬kw5͎vKvs\7ngn;qi"Ҭę&f_9iauZ뜶yifunkhƐz} Rٙ5Z柴1Sh2Zs,74⬞ٝ7簆Qg5x's ח׺DBRCƵ!lRm.5!H|sc?lg`R') iUf^5dyl2:9e$9\4K57Q<=kȧ͙oD)|Lc M[lVf.wכmfjm55O`?Κ1zwD zL]3hMvdL;hϘsf~LΤ33̬a3~̩m/faY^dBTl5{ͯX9MSk_3Ȭ3w37'f:ij/3\yCs {4j)4L&ޚ1w#|@->ƻAߛkq=}nƱIJ-P L87q359l&!Lw|7o{'V9ûb<-Sx͇s>5KGsaUarj ҭA3T\,`WoMO039͒s,\6 9̼)sԌs=HĿqNf/͹fAIYss\39;[rqpϚ9op L^2u7'̀Ӽ5y+j3bf>E~7^ȼE.efbԿ_>uzz>~Q eYنc19Iæ4d@cUw?szxwul6҇́0 )ܢ05|6⼬5S:RSc!3vҬϹUYyZ$b9^K[yu+okg-WճPzJ#]!^z68n%Y4Ófbf ~׬_?OWcFߩy12׼[wYZ6n`WYIjk7vTi|<6Ng9м6?7$ BYz,KXd1k,l͓y125N'XeEbU lcQVK 3eIX/t'BuiYV"o%[wkt.#;z>},큲]T^G+浵rxmܞާƱB1H; k-co +}5Pi "o>ZlmX%n}Y_eWZeؾ/BEVW3ʷgYmd>jQdA}@P?-2|o dՉ̰_dUVćeh'dj&;$tUnFVz@XI =h%dՖlRSoey,REV2ӊ"S\QcL h5nu&__/SkC{w70k;N*/VQw]es7XyjrZ/LkG v½QV7ªF[Kq1oߛnm~x|k5a- {Kp o+?^ߊvY7#V59{JNɚ嬶:,+U x߯Ou^C Fha5DjfX} mV[m^euц[=T_UC} 1mBkd6ݪͶ*k\+y_!G e>vP5B_кFݒj띶zfѦY7s덶z,q4ާo΄{*3L9Tk3̱F9ZCW7tt[-VCgU*m繁#5:[Rk`UQj5LQ˭jsQ75ڪY'B[M;?X1ΏV9ǡڣ[uZNXKgħ NYCϟ$ÚYk_S}2`;>&V|V)t >:X彂y`a`m^5XqX> F,|J0= 狃 ZlZ=. EPA *yVdՃ6xQ09o[ܼV0,K}P⯟pZ#H0##X`9 Fah61 ư\lm0eyٙ`>v-=`ه`iUfg݂%;vcYN;gU6F=}ibllݕ@ݟ:<[df+¶ۙ8hge(v.عU;݄'eI -DB,JP<=A0&\Y&˳"۰];;, ?{$#dcT6NaT6YaT6KeUq*ĶXv*ʔ*͒9YV(dSw*Nz:Y!iΆ:3dg&ř8n8Mp3Lb31[,۞ev[h1ubnVZns/ۊ t[n6f +DMns۔rn=v?{u_ׂAz9Xq5`M3|8Z^;Ζx2oMưdtfߑVGҘ-$:R!5 oIMhma1.+ 59҆lLB7nv0]#}:ƳT E bu֎Z.Z5fôFl"Z֌mĶZkvRkîj_qMo-Y.9+ oe}lO`R}":DeY6efY֕`mXjúlžY/cuVVbkz, R:,3D#7fxVd~l⇐w7`π4,W6+(Ϫ@@E,0MB.>}{`%F~dP`u x v&=qn@VW`e7pI TdkY B$)/x!g.*'lߐş=xP6oe5Pe|,"<<./ر/e;fGvF~N);92%!j2pLM2D4=R2Kczɒg,#<VRaVIcxVM fToNbNVϘ5vljjjVTVџ[?~ZZV z{5O~KazG8=TEtre~SFdfL_a]+ًYelen"xBaC Id:i$](ћ#ywLކ+p#qۻ$xw;=Sn4Kz!ZQjW_R{]p}:xTsoV7A& ӛߣ xTqUUNS9QT'#TL'7 xtlwqw8g?ݰnv&kRޝt:`(m4p;MJrZٜnuU'TӪjU%;_epV;S=s~T!gW;WPrs]sM8,9GjXa9$g9oOp~9 /;v'Ju:|X.9eg%۠n3猬\՜+2sUt^r;iUKwʨp20.L5V=RS5]W?jZjZ#*RM}8UgLP:#(g&:Ԅ2G^S#djT?5FyG(3aJ7ZW"qr#GrZS}e/MVUl*6$LKWKs'ҴȧSy~&acߑ; r=_}v~gok N&ۥ<+L_%'o5ͳ)؎MmOV*hSURABP#= }VɪI0S/ԩ,6 qy5W#8 ?~+߿0~+P/X Φ5Oi`9\pV&xW+,W ++傗"?yRZeC'a=+x~ ^` ؊ &׳g7l|p;`}d݃gX'qt&wLWQ /E6" yKl}ͳ#[o?`{lo0}":>o]+VN+ݚ_[ o dwQ/~> o`*j'pO:Rp!x (")/'-VNd %_3,.{gk1nCsjId*k>M쭽G0 1=,Bdr \mBǵc /&|" 5Ȧ\-n'86xRH#;,cdG^@~ф  }fG2z 3CAPVUeK꾜n\SR+ e6#(uVNVgx'uN6C~-uAE게RWeuM&Rץk/ɋp#Jޔ9E>#0emR6d{Q{IHϔB^-܃9V/{򶼋K?ulڇ>gw6W.SuyzUgS5ynURx)UaiJUDh rܒ_SNBVkUkl4YLS8?TTG38CiӟF;E~sp⨥g!xGT^zO]GUfzPUZ@dO\䴊$UrE U"rSWwG+ozUϼ_o UϽ>IQE#UU')O!}h?ADb\T[ZAT i!D]ٍ~_җFN\j?;gBiT>Uq[]U!N-Ta*\ŹjsA{!߯~ѡ&.;{*r*Cek.T1'˿CC-5&\`M|Z65YK8gl`ߜBg$tSr _HII96'5뤡Gt^u2N}2JЉ>p~pP&J3i4sbہp}$-u"|rx#/RAHyptrIO;m6yt"a%7䊳,#' od=WagՙE8 g"%$;5.A89! 02y};Z9&Ձ*GCH%;9(AyvQ(oSh}N]~i/;i#?t/ 8't\9I<[qKZn1-9 7zy7 /X7Ow"='v;N6~߉pN27Ӻ:,5Y5gI]َÞ8:$'Qg{Sr cUGXcL7eG~^_db2ܔ~S?o#~nt.ru;=ꮦUvWR]A{h:7-ŴxZKyh1U4neԭD) ݇~a =FL􄛖tnb1zΥK/v#4H&O{Jb+p62]J63`&[G.Mc6$l}U'$m%'=eyݗ8w#{zwH}>if!Ҥے4}CO½<2n)mA=i;tOkN:74 =*_M<㞑ܿF\^ ݫ\ ? mapmE5(Y[׽oS:? =; lü|r~^j%<4أ|^^ z7.=bgl ޱZ{kz˫c\^s^kKz}?O5C 1c["yC/7^6y)L&y^hgzcso"}Mo71o8e a8D#d2=FFd =A!ޚ NR!RN%pRA *)J+A+2iM .y"ߓd,xXNV*YAenEX2xS(Azx;,OW.5V򖒗L›@/!*@<x8h#w{B ^S<}IyׄS֓{&G:pA[1LZ58.E+@~^౴ h 25"ϯ8~7H'~ȗ)ߐ~s+ ]vh\5 Q<)£hF^uh8oE9D?6kVb9di'ɹEpdwHV9ާ4aB iIv&CfPFR.JZ&]K%@&;-X::fGdHPAwڇnC8J/mB_ m 4ɵe4֗ :)k?u$'ow-mp=􅷙V[3h2e{ZLИn $MH}ZTEC_{3/)}<ẼG<c\OH31 xəcs?ðйN;:kk6*P6š Ж<gx&ڙgݐ^=yY+Ӯosvh, %a#ݏ77= ңr gHzNNTzAΦ_Sו4a~̍p"v4fvG[B$mJWhmj0} ͨϦ$WN }iI-7j^">H!6+8I%IH鈭%#o4Fkһ.h/ccov۠jk"ⅴ'^N흗 iEH\{ŵ'Ms^k-?H>L'hOZR@wK>MCZ>;v^{.jOö{l^)>L;hy3-}|jlM84Z?O쮵C&|V/֪Zy~X+ɯj -/z ODO?hiS--ᨖlVhY|ߏZvAZZeߍh}pJ賸Zy@Jk2>]58\3.9ݯ'Vj'Z%F+MZai(#(SЀ@(qm"L䵶<~ Woi+9őZ~?h^ǂ4;?'rPʟr~CD~G~c9X&[UX[pQoꭹkӳ<'kʋ:+s<+Sj<1 ? WGݒsrWXfC<K 0K0Wdd7dkkLցf GVY%6Gg3kz^~A/O%,KwvEo}ԾO ֧ sX;OܦGw^>x2Ffad~Le Hd)vKaב,/ۑĮ5\p&-Ǡ|xCvCVDB6Ҳk21x8q spt)R-Czέ?%B4M|WkdJc ~=կ vOꏘ_sZw X{X~Uq} <5ó&?_,âM\h=9c/\vW 1gsw!vfwE]U|e0~~j>yNiؾ@|¥ߝjb. ?дb$,l#.ܢ*-(JR"-#jҢ-)bb7Ѽ$hд V 2¥{ZQ+'~cEj:,XR,X!z]s߇9Ï[;oY_,^aJCAcy򉏬pXE:B" $/іާƑ& qoM9kkՍb+EDWsn}Qm&"֢Ft[/8[OLp_a[Krn;1$]Pn_!o Zs: 4̭-RUD[BKyWL$uˋ'Nuqة':M( &8mTbfFM)&SbAtZT|uxOǺ +@eCTEEJTMUא%V`;[r /!jR>/'"xh&6scϭƜLqw&фgKW֟&" k&^mtbE@Xo &bM}qE#5[" ᾍ¼}><&X)#Yj.h9[̒?9r*Lw'9\LCx-Gr,'~r)'NHW@H'SXq&nۃs")> ZAb(&WZl fYJX's52`?}WK%}]R4^-Që#AaszEFC{^aW\JliQ_s4o-^/6jM&¶Hwk.beZo~zZW1Lk-iqb Lj_sh8~ rk qǚec}rNFML3V3b,f> ֗Ov_s?ӄ҄P9y8\bDQ4Wq?}U%(% +bRU1#JdFJk$U R 7JbS!uÕp Qpߪ+b:+>㢨sX p`>=oCROm e=qXOklET0f 29(#ZeDj]+nd )Xb -hܥE q6|74hLX`pDI^GRؘBߑhӍkfZ/Ka5y^i"T^j㽛¸4 71f4vsqpߊL;Q5+QuDf7x5c?raFe\[ @k  <>WGPB'npDF0yj5j{R4,bJlވkAqsK4$T,$Z,%@31ƑORIi$K$F iH2# tHJ"Z0$ᑴD4&1RPa:" (C_>3ibc6Mf@chW4BJ3iMm(lOF^M3jh9?B$(8HI C Hi -Ɉ0B$DC<CA( Š2P*Be աԁzC4 B; tzB/ _RF@H `2L`6̃_a1,UE[;$A z*BR# "^aMh=[䍀0)0̈́+ҋSp߅爿khf+a9,B·0ft&G0/ :CGhm48h ԆP*CIBI(!?B dl -ppH6 W "Xa `` La<10PA0zBw=C}5*B+Ay( %| 'dH !#4C2H;߅HFAڐ4!{̶p_p)䟀cp郰 l* C| D/n)48 =Bᡕ#V"uJ]O=wXeBwĻKt"剰-$Wjk:k0I22 =7p # wB]l_@xIHa[_K 001 c Gp=9!9Kt lKFr Z@3h:ԆR-^ؿU *#^ aEWYe4KTv_%j*ՠ:B@c mі h/%?%?%1%/Og@Wao` Gc`~N"p!o?C({/wQn3&؀6:X#o5ʭF8 L?tlS{yc`$a _^_Fa%]FW*\C&܆8^!<{2Q<'q nu{ `|k?8_8q.})4sP*<& #r3#˄_.^:K?6^P!ɑ(at)!1ߟ(e2L=Ht:H?Lx"-=E\G^ged?K KpoizN3`5@X$ĐahZxA5-'ȉs]&#c͎9"hQX#!sl3̆:YoVmdA_{S (D`ڋ~l[`;B;xü Y ^<͇em>;a/as_s({ !ٍ~wbs}C80,EHslK ǷuZƋ(<'"㵆V~T|pWjAmA_xQȏ~YY?s.,hlƻj(FB֋hјˣ>Da}<9?;Wc h &Da=: 峡^6/X "D\E,ȁ9!}%!<({^|n_|{1 $, L/ɑNm1ScNB("B1%$fRP3ue0SY/%/šE^xCZ䧁mP b/~#/ P& eP' 퇡}]="P/EuN^5/bvL/Oxd, }yO qN2qE_u.4C<@.ȍ;&Xȋ(/-BZb6v:@G tnz@O荾/ѷ?XaLa ⣐7ac ƌexD S ӱGL`6 sІo.ڛ/3[$"X2X"~ʘr`ˉ2&hk E| q3l #?O. {A_Y5rsaͅ'<&̰ w?we.t OKxo`AlQ"NnNc$ $xde$ʧDT@ZH #dFd(Ȏm9!XFf~}BPA (,UV@_ PBu6ԅzB#h M Bh9l;AgĻ";ވ/_ aȿG tǶ0F8a:ͅ%a2p @A_@o =t :@{BkhtKj \3-FS )&hF[Soq4)D6!VB,0q?8 yyԁZP9|Ng>8"Mp R5r-R&E]\?Ha3\S/HEy }Kb0[N3ƛ=$B"Cd,}vu8T@RHiifDSь8q3RLFʀC2ŷ!!{ BjH )0pC< ñ þq8\7ptGcBpl<&.8@bf!f 3#f]>`vy=y o1s;#/,HԖlfoAx2dOqRp{u{eH@_FhRECs&|DS;x 1k)<O1?ƼCp`!!a<hh쇿вofa/zO# `fۈ`=(<֥/e:@[Xn#mǚky>CXͽ;e^O<'ۧx"XbʉEn! |1̢޹̐wrSmU#fSg4Snʂ:{(賈2&sqh[7Wo/d.g̸7v㽡{w?\N3㼅Ǻ?ƺ7115cXc9sHsQvٿ&ְQ5` %F3>=J{yШo|?Ц dP08'3 ?T+Ǹ˛,5NԘ6c\2Ƈr=?};gkqo!V<;P=7zQ/0 )_$"PBe - m'Xj|HVjڌal3=su]jm.gSumfn N,}[+w;?2'ǝQ 70OQwm'D_g<_{l93SڞG&rBF>K{vC{ޗU{L!'I  ^dF%ʃݷg8SdVSc5VkVkRkXkWk%WkXk\ge7 rәL;"/^/Wk@0[s| [(B/TfY$"u,Rע}={O]lO__c^E^ zιo(3[=3jZJ*K+,| _e-B[&:Qa+ZϤ*(j ɇF7>FN}3Ϲ,5hF6ڔoM6qE^xzלz7h+崰xK~%H5FiKYc2/Uo׬ u=u(NW}6q\H}CXewҥω{uHtЂwSǒϮL9P b_qEGyE>(f'Kw>.ĕ'']Oѧj3%5D2-ʶ":-^N &] kյ6SﺨM+y|I=爑剛/~>@BuK/X"e)/_߭#8nAghe%`$8sFS%K/1ÍF府㚟y|1(Fhγg3Be,q1T//1D~W}&:S߇ć;$!1}H]ڣuGgta R_k|/s>"rg3S"Y c3оz{velJCÃb&S%2/ezï 708.sn<ѷr .g|8m\"7H DW|x`e\x ǃ5H?Nf@p22&-q{yNs`T=AEL֗*ָ։S'f-5T;BsTPS*f'J?ǟKOG gl4G˂sgF!Qc2K_*_2 .gI_bq:zgsW(;Y*UCS&ϵ&MǓ)VIe4Ws FʹDε:Jڹ3<E,f؉LZ#M6Bkһse|"&7=ֲZhw~4LXBc3{13vư8WRAyDo`.c9M4 V|^S쟪_Ӕ=M?ww:k&N f`hOomDA"HWbX}EAM4 qVƙx=?q_gŝNR/wn+㇂:nPv~R/W[vjWMv;<()8{m:~ʷG.c8q_ٜXٜqVϓ'h ۬nʶZX?Mjc$O+VAKv9(SX?#x^?X/2O=w?VA*#~U)^l~x6xNxƶzq%A+-[8,glM͞!gz:G="H&>kRSc$Έ>GC?UIJ+>j#+1pT3i m;j jQ=5%vn61o/[&m+[Bb7k7`EpIR0ֹqe}_``tc0"TNg0C|<}u O(S &Ѧ8ؘ 5_RsUг}¿zHgp&C0J\R '2ɹIp';W4KO4J[Fi[:KFynbmapGinq^vkGx\3/2:o&oޒo9^U^i|ܸ`>A%}$-5#?GbK]nv雹)`6`\7f6v[,FK[N65ٶJVV;fO=3M 26Z'6N;i6udUTrJk b]oK _|smG70TD%~2>v,پFLnA:ytpPNG  IHDR\ZtRNSbKGD#2 cmPPJCmp0712Om@IDATx6{,gayl9 a Yy/`4 pr2ɂDh,E(Jot$bXFKp!0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a0D@" H$a UrB}+BG(WK,CI~ JۭJuwiE=T[}0hwIXӾ}0{F=\Q5]0.V.MB˫{{`W:E.Bǧj !&ݥx{`0A4 (^Zstl0VY8qtѾ05^ Ҡ~z(>BhBvKuF9V!K^1ZQ0oak4&SQ4脀jq2KgAiڵ;zcmlp(a; PֲrtOaP2UKPn|y ޮav-`I TaXu'үPT^3FDaӝHzdqHP|ҦWR(u'RkgLU˗\/4GgT2AMw"WNju ؘA USLw Ɨ0&w [a,TZ*[Pa}qzQ2HߺxJ5NWUCOm]5NW}R,]T w1`T{`,^E+ ^qMG^gHtTRhT˶X!FMa,nT(B4NWJ) U+azi(ĘQuʵ2 s!rڴW`vT-3tq^fE74 u! # 0T u!XPWHPz WqׅDDa 5AJ.Hk00] SC)\*# ]VW0/jj3o:L[`O0`L!:G@tAa0L[w\agɥX 3 Zz3Xh8PkԚ'h F0О J)+ ȏ0#a0Ff0_)= F~$ <j}X T #5ڇatUk3?sxH /#3""Q$^FS;G$ #$h3Tۭէ:*S0ފzPaۗV;p}jd00ah8na%,P^a ˾~X _?8-;Fܸ@Ki0uޚqɮyq)Wp0nRE/a t~A=0ʏ%Wь02shBV0Kp@{1]ZشPh91cu9X|Ј-`d~a! u`E^00 f c6NuAg#aE`I$Sm9X㇭M7ĉ#5`ůfM`{0AF)( ;2!f.#S a0>#mB,GD d*afa5{ $EorJ'+?-,¸00^ w'w2 bpt,~gC_dWynqhxøk`4V0   8?60a|a1صLGH`w0~C dX*y~柊d9d v f RW^QT!3< `:'aoɆ0~+`SN뭸%.|+Τ^0# F gZo5_wd׬|SeV0Ɵy ##ykW$0>~\G nՄQs<7 iݰ٣a cH-è|a揗񮇑;Rߪ{M0n7&3>FAK hiwFEJ{_/`n[O Ɨ)׋Wx>47nYJ0jƷ9W጖y+# nna䷙ "`Ey y!0یo*gp0m`( (;/F6hO. #: }LDo0`T]FNw#]nCx=w(ImQI|* U]\3]c FD;`0;~+<g"m!M40 Rjۓ`4f3n&`lm tAI~ N3uߵv5F3,a}^nUk``s0(ך#iuAat5?C$AaFM.:'ZA!`$3;&L7bL^q2XFn cYk~a1!1e-HWp4 `n0D'T[S-C[kF-)c>da@@Ø;ь` ,K7wu`D`dF0e61h#`@ӥG}!n0U>;zv {LԢ>ًvD顧r"Ua8V83wB #;ٱ:&Bxr~8 @` Mk>zFl# Ij 3tvjƒqfv>QO/PIרFB0F0 5ikCmO;3 \^G_TQC{i|#EL;= 10Vazl;Hݙѳrs׻H>B8W˛7wY vυDl++׻T*R5kA͙yJUĜu8`m:RB k07/,H%5!zV12Y;XܜXGW=5˱ͪFRU! 1%fa7Vh*H8gtsj8 =hȹ&W➿HnS$^)b8wRZӻGJq l]XLmv5*AQhE"a:5Afwͬe,5 ԙH)ެw(&Xk>L+I70 oiY_RN!N$=B16fimtRpWȠı :q-4zf"=$~{2*gpw}#2ݥݥ;&^"ެdr9^FM*d7zl{EfY8sy5msbF W Qvpv\.SLѸ? J>j7S2bL3;m*hB.uz]w(ݦSH{'S Q0v,"B7+O |{(N֖%"GFaDn0#ˆ0" FaDFa#0"#ˆ0"صFƅa }0b3y0cGFqصFfEF#0ѡWY1ȟ F`dFaDFaDFaD_FziaD8t#˜!\2Ŏ]m7l(湵H6vaouQ.=t'RHaDFa\&;-' vߩZ7+<ߚ-}S[<>? D5ahz߃a$03N{0`4Og@5#°qfV#0h"YtQEFa  S80<8glr;noLq>$8e hq}ͤIuw03Jp4bH[4|S l6 Σ.̠~QAdAgxmUVH` N3J0PLa 0%"șӧn3 P5#/2Lj. 8#:@M8$!ΧM|VU`mWd'ІF&`T(@ 2? UGV0s u@t ֹ P:@ ª T/ ~J/ x@]Z:KR#caF4_E`~0(ԟ0q0 # PQyF va=01, La rcy7 ca6j3قQ0^ = FBor$°ѾfEFEx F-k@M\2ZJvS8Øm鎻¨o7ڳAd:M$͘KJ7jaN=Z9 #߂Q`P*XSÎKQhAc( #[¨? x"QTf+h $1Dzl0V 1E c,acV`P+0Y3|P뜁:k$Yx1A)*s8 CrpKm'0W`0N:QaHC <6Bd"k,"\!c7 4 0XC3Q"Øb"4}S: FbӌT!S! @0>/A˨/z s36a4+K,+ÖXV0kFa-f,QhG~ i}Axt0xl-Twpȇ*?i{ -V$atdVf wxF8#AEU?FM6c~vF h3Qvg|0Wwn(~w0o6`wva)0~#!eR҂_|T͐R06G؄ģ0nƇG1%8Cu`6 )79* y{iBGq[XhFc*L8jQ֊/{.%j#nw1Ԓ͐|d[3@0G37ffid\3Q % N7 Fƿow M`U€Οe LUvQ[[A96lϟt0Ʒw1.q `A|.Wa08 ]űz͸#]0f:ϊà_[4 RD>Pad?sVafҹA0r>J߄qٮu&s1j CwȻx3|]<5~o F}߅HRO8Yr}N= B@_Ր*!&{":HFb "Rvi#>P+~%RݟS`k7ITX珋t;Ҳ$W`͈0"LwDiԌ#ˆ040v`a`8Gwr3΅:GBd=?0\o4<=Vh`T[>/+ ]d+ s B;`8)0,nr΅4W#}ۓMpLlva8&TD5?0`!a>C0" W8IHufn/nu8&#2 3lf>/ѝ00B;( s@#L(s>0Ýh=pv$Ni>a8vArnk0t3|phaN qЎG `rOBf0rlZn/B\5bu:S ^!V]0RB C;0! 0kw߼\:F\ 0 o0𸱛 0 o0xnG*0}O`8GwO,Ⱥp>O# lJ9u>Wlokti%`f|p0L3H~aN7 p u+8?tG , 0\;G0\ƱaЎGѝav.\yh# 0,܌a7fxvaX`afxЈI0\;°}0\; ,B;oEh' א0,:+0R°< + džafx:4*ctǵK.v;F3X56gQ0֞jsrO F#{{8pQvbf1Xi n` hE3p`TH\Z7nO~љa4FkWK70rgP"k3]h3 P 6`Ѩut3|pxtgbcO Y*FcX>aFw\`m`18dq % b`c@u*C%u3ˍ" 0Vv.c3|\cnqjq Ia[i;X :&0;# JrVms3vL,h{T0;Sh77^) Ƙ˷|s43C XOn6H$s۱0dTM6e؆|pՊ d|(yTѝw'J8X3̾4>a8 ø(td{*_ѝ#}Ң$ZL|0S-VuBx3 %7Ʀ+3i MR0oVNڸ;U4J2&7Q0lνHcҨTt =0_, Js a0^PVlXvފ}x+ Ǘd K]RXQ'|+B-8ut~z2l| znsa0ixf:4E 8z3 FDG΅! 5jhh$O;Wh̕QIlOaJ0SU.Q"'PΌtYàr0+P$)OaBTf.(>mM]dk:F#IeD`<47  0EͰIи#:$@`ISx.(*q#\-c0VV,# Yƶ :R)gQc61Wwi2iL(ACtmʻ#s嘒k MaXjId0VK|qfe~jg^ C9:Ս(m`0( *, T+ ߭j:>Y#4SM.~C1+EGԖI)h]iڇvRݦ, F`h;5W,LM֚u- UM0 ?B Fw(BD$0# '0FMZ_byf5Fz_Τ〙 .vQhWGiBL.ykq0tz6C;aɀ0vb~0pf_Dg:Wƅ.95T0t.0m{0@)]ˋN߮z^FqJf BbyEa@L1U7&JN̽qĉgPd CyX|8Y8'Qdƴs/#C[I?x~"3 yL̿O+~Ha$CxɄoxZ-8sw5S% VJܗW,%a,gTD7iH+, ʺ'/QPTsLja0Z6Dˇ=ZOÇN"ЎV l1`uA󜆼C2Ѱ\5*1z耬6X3alT\-F~9h.U\ xӱ->댆2+°{vn0PŎd}܏aWtYDAk?u' ùլ5"w>mg )F]1Ą+`X\C\WOLf vd%'PJkh9dV:Cݥ)N鶻-4'X@01n[#adg@;ŝb0,U `趻cR[6+0莍{]- |0r؊LLmasuBxA;CmyֻMYz&ðn#y]eS 0N or6cͻYYC`H9"+TɯՎxL>@y5+R@(0Q`HQ#,gFb@j G3ϚN<$NwJs sCI~͑0оD.Dhk6%8+k=+:+BG*€e =זV^pckhؑ-Ye6Zگ,1BK5y30_6:0I`Xk,JDQ5?ަo& " -WY66`#`pH+W5#-D`wF/d( QX4 aB*v_tF8Wh]*zUtC26( NT;`| Aa0 >K. o/Pl|AQ}ٌlJe90RϺmuapދ=ZҤ"UqWCt!ICYmnie+AJo".0~1NW<&\VN-gOjyC5Qw;Y b^wMVC0 Ю~b=N~*oţ; 3鿸Yrv6{[~u2knU=0F^>IKnYo wGJn/'<>:-j3GyonFנIR -PWG/00L|`r8.Q&彾Z`wr#@r[b<>'Hu뜮׸tr񾃑0H#'YcOC7pqdC|H,axޜjI9A;0 h<C#02^FJ9ȸVpu0/ 7@aм `$`[Ȅ{!._yV*>l]aq6rFbY$< QnOck:#׍Mp߂QA[~/^='/ lj9wFY0j7 a0(/BȞ{ 0(`Я&Ϣ0L81Y(ʬ\q;N# a0";nJM8O`JOQn&QÁi:dR@-lU7/`'i?;\!!T'z^%|#G+ӤF|2 i:*gܿE%D#MҖ=H&G"2ʍ@&:zW@(F.Gxe=GSgB%oCwEr{~Dqex,a=}H/>h^$w W|νUmiڥ??AzW':hwQ3Qϵߥ]|_TkR0S*\_* l~gl+(!'6urt1ރ67ͻy9n,/rvSv-Um~ )Foپ&F+?<àWXzS!Cb_ /vbR G4Nap ͤڴKFȝ 0-oɼ0FU¸A7JƇu@ ciQu@u0e<0Rp|TWx4]30ʐ6aMˊ>] h<=F㘌BO#8&Q C6aA݌Mp0nFǧ@xhae8`cђM ~FP7CS:~;8nF=x ~f4gtvBCf4Da ܹvh0˱Iha݌Z{ͦ$t fU0]at3j1+ǾM$tz1Qy^o:Pm<f{/єN6#vQДY[Hw *0zS`MZ(xfXA& f> ;kt䅯Y00͠by,`S`5 #Dtr9v/{Z  {Q[vC ch'aZyLB~W=wO # x!Yt1L6 C #Da,`H^L],0:_Rz3`=0ۿ# ]7OLG¨V;R*eNcci*F= lpcQ3V{Ֆʫ^ɎaAu59Tt0ԇ>14ac[M%-:83`cDFQc0jgwK@{jDHkT*~wIdpb0T\F28vFPRќ283` Bg [m5;h[![/jT%ۆ_␲*PxrR5m2& UR㍝cE?ZN"1|sMt Dr\|) 7w8vʵ<\MH/Z79U?_aiSj0/KqK}ۑ)5 _ VL]X6pLUǭX! YPn-F:^jȢ(8~1+Y lۼuK,6^٩ [I+WLñ0tnq*oeI.ceZUG@V&f?g6UՋHuf}8zmL)+EL ҿ[NYխ.:a6p_0j0j=GGxa5)$y=+AJ} DߝtFE&=9T~7L Rkr:kY.`dw3/CI};d)BX\}ﬢNgtqb!75>k6gt0tq~dkv'{7&Muh ^αbZ Z g5ׅlu0tƋyC[g2!Ϟܴ62CU#Mtog 20Ļŋҥ|4^&1ObЇ,ߞ-05)9j[Y h|ׁqw4^,(Ӻk% gЦ{Fksxp94j4&ǺP(G9* n֨0taLݵYuYd"î9s+ܶ.ͺak_VΜ@oBk oՕY؋[i*.]5j |i*ЛPz?: 07Zh嚴PA } l-~Nƽ.@BQ6SyY b;^ɸ5(/X]OI`GƼ.-Xl `H#RN_$uI&AGs)) D B0a\q%jv31=X‹8w]0G}0=]è6]2el~1dX`uE qȖ//xC )0vA:FPb&:4@Z`T&ph(W,(|] MY==}#`4pFh(0ʥрqoO,OHyGCɥ( K&QI!8 zo{8[w_FUYNjX >JW̹bנެT]"˿?52[E름wԡ]TVWy?90x=`ExcJYfPFKTci'j!_d)5ҳΉk¨%Uؤ79*y\S`RM*4N4Hc }㴣`\`J~TXj\`TkHѤ4 =XoL<ׄUc1iu1 YIT(2n{ώ8 0DVJQ.%#JnL(p0S!>4qUuv\¨V _ E* - cPԊn 3ȩhiE͎\hPt) J]6SbfG֌#Ý o՝jZ5+ +H1c}}֝fWVM^b^W0D0+G h` {TtavW^ۆeyeKcn'dz`MS;IZ{LNYyl{Uʞ:/"eOL(R7;F ;StRP>R}||3O܄yc9CW9s0iңjغm? !i۞ҹ9 \yc 0vuH"ܿ+9:猥ŵ,sZ?WYN|b@쀬Қy&sCM#4#-$^HF8jao hF+wwxǨ!Ѯ-iJ(螉Nc<-lݯ#=6sq+h۳݊e6ƒ*>s-3ޛ'b:w AMgFR_^aٴmo1'[R3S Ѫf}f@';S҈w^1=7`,q)/ ꤝejNv3U =[y+YXqmw?£@Xg9tPf/, bv cM1L+Ȍ (('M0is 2*f~W) L wT. ѹd(BTJƘ/6qk! f-klkST{-+Ɏ'_>OB1WKvX N]*Cbf?ZWou Kh1<Ȍ=ԡ*53k/DsL jPJ-~}MM nSS[t7q5;rn[ &XXRiƆ;ȊY<*TÏ9m`G8}}kp$34U:z֘Ë+o{IC[ oE+XT3|fj7[gmJClEW'bn.zm!͋N[!ʘX֝Aw*o,?ȥ |a+DqF>xju]6>l( mp{(xSCt1E=ٿȣxڝ#!{.3os%'BeaNeL>"s<đz^Yz^|.#͹`]J߯}(y`{_O,q5,*&~-p$*ҺlЃڧQ? ?up'ےG,,?ŒT8tEXtOFIENDB`nY55 îX)$IPNG  IHDRrV PLTE@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤X4DbKGD pHYs&? IDATx˒@%z(PʉxSFo4(먌D9rPN IQ7ѱӽT(P ޠܦ3e~ CpPsq7"zaiw@9(ox%?A9-@oV6KZ(Pq= Ēp\F}QK*|(\RLp< QL)GY GQkg=5CQN;}1Tk1?c(\ni'ǧ(iT(rVTGQrE9rP,d>_M ɼ@9('Uxܡqj%@9('3HZOMPQNj qCS qeMF/r"iax#/Ჟ^SOtr@L94Ӵfէ{(x[U3wބ5Nrw [@9zzHGFXIk H`e]]A9}6\ʁ۔ 1r@B9S*"ǔn?N@9c@x]S9Cdmj!@9(ǿԏa2u\w~Buˬ8 (@9r@9(P(r@9rP(P;F .w8TXJg81Y#\΋9Eʁy &B)MDhrY>sx;g@9r`KT$3ѱCwe̹]Fg~@9'dր"0 )͓ׄrvRGPҲ1^r.D]r}Y: F9rX9[9 H8'X˚R!Rנ_W 8[9Gz/d~s:)36v<Rs A9)Gۑۚj7dy{4N#)sQ'hGsM(P9&ѳlޔ?ҍ6NrZyV:~̌kB9rP6Io0~v ON1u wx_188G$#ĉ.s?Xb7JMGĔ#B)PhB*ohF.XWUԽ} P(d77Lx#-U~-r܎6FP J1A5pN߹nBQ@JNƔ`U ZpQ*9LCs|qVwd?(V;Z J-\MGНpJ-cҧ3W2S3]UrQ"yHLœ (ÕSk!c&.nr҅CG~nb2oD+TDYFQtQ:2L{L.8gOQk8s;m pko!(ʝBPگ0?'zQanc&O]]PV9g8ET;G_vAiS-͌G};}~ʩNntߟ%BI%aXjwc'ӜfśL^ g3#Is8U׬>fi7{αW &5ߵm"= v[cĚs~<NBGbìCu9kE]}f[ٽuF9quNiX^~0@ng6}h|^9i2Au|GD!M|-蕯Z&֮Ȩ f:/L-(:l әh+%UjSrGz3xN9CېC]DrB<[:rm& lYM[9qVuNig˄֤̖]H">؝3"TG\N(ܱoV\+qQb?Lr(go3Go'ZքB9 i{vQƥB,7)e(}].3.*ڀiJ-cH/g=>/Mpzrn e؂Lܯ~􇼊AE a2Y´<75ul[mԥ@9g0z_ύ .cHqR-un&=e؋D Ȳ]Y!M}C\zEx⠓8rNjr c+ƫ4D)x|(%dAt_-+ʥ)~8Q¯*:c(yoQccEӆVfxkh*']rněyea 9qsN7jJ{GRG1Qnm$ a6WNכ$\IuC9rP"t_W2ҏY%A<ƯuY*^,~۔(r]5.l dg=d٣PY+5FiVPЃc/~r=BI&uμ\'-snYKVSfL͘tj[ǖ\Y9s avlޖ;ƿyQC_}E9rr@] (f"3;^glj@&f5)&?BeNP>oRڙ5GJʁȯbOgk03}$cMw:[E#ź&ʑD׆te;O9"wEj(P̢INz"G7wdO/ːc*>/gH[D a0S9:gEj7d-8*z:r$DV|SV,3ax~z{m+ؼo[)Yܵ{r@4u8n"IM[u:gdRV^3&)),W%ߢ%,]EM[(1i\w{ A#vpl_nܿ[.Ĺr7BIe7q*\)k3//g-ԽE9r ц`oRY:}\x10=@*'&Gc4]"ʭَRgh_p(Ӝ!L&58>^+Ūr":1ΌRʱvJHcEKl09no2vg3Gɍb& 8Pܦ7 J/9{Q r> W;]0fʷ_h-㞾J0w3 HMl6y޺$,(eMO~x W:*ҹ/E)~_KnZŦyGUrvU5YM`MӜù`uг'O.ٹ7uU!V9Or. rNv {PtË;@,Vb¨i3$$1'd.)+aJ g-T'.x⏩!AS^E9U5Jߠ3Q׷F, t U[a3QDoUXP&ىXKg: 'ʹmڭ {8U;s^98tI)8zd /] CkO^h^(QQWg#-&O]3\9;̮d9+ W^qR|m/h5 wko!+ʭS0uboYk'1E[k;Εc_4RޫS/ү"nJjif̠>郞] R9&#[مOzCMrLsoS76 g3#?rDb/]9(3SPt7-9ZWA;.|P]&anGYѮ[م}$f['W s+維qt8[&l1is?eAvHնaw7.4($]pa X_9ZvL9-j7TޜDښm}^ɸp~L:cD˚PB/51o{rD>ĺ oI$@i~*Ӯ6\q/ͦRO"DUrj\wz} m.=:w8鮓>lAqvʉv3瘦udvϏ5DS!ٔcRsʙ ;ۦINjLƨ 2Aԛg0m5Ym^ۍXS锅&XvݳT|.DTuq!9v >tf:Uޡۖ)$m5=FoZ~etA&1'~G7xcҺʉ]siJN`r8cgW14\I^:S˔Ш5Ϳ=½cEӆVf;xkʹyof)nYOlRΣ?rJ*%Y[W9 3c5 i(̋zat݄ 9kD?Eċ~r}ۢ1Se:ck\tقRfy3joQ'VNn,tZag4cdWPЃc/~r 1=P K/8u8 bGjQN-h U3[9ʹmgNC\-Tç̘114\#&IՔ@oV}΂SZ3 @J"D9p(@KJ(FJ.erP')JI,Q%)L|)rIy BrI >Rr> P#r+ТRx&w}gf[WJD .J%i{~NX+GgbET" Tj:Z UݦRwp ;B2J|4M,)(kaTSߠ@9B9jVwNyMt:͌>n¡[?nz hwDʜBPPeEEHfN]pA9k Jxyd gjjߟ%BI%6.o8ύJso3yQ2AZϸVT05)kAX[ltGnkXsO_SSB7>3feY .3h PGPS#Wc[BR̙j#?~1N ?:' !wlnA|=2vEFU_T0ya޾o٤ٓjo$sJϽt&JuTh*-9 mCu ؓʱ aXno[y)`ʖԽ=@5B S]9lLSu<Ll~ 5vy?8:h[(ܱoV\++ϸ(W1ޟNO!R@1:s1h?Ee3|ӂ3쬣sK79Ke0Y@oSʮQ\f\TӔۃ&RVο޿n#q&G/ZG9hvK33yfrr{*-|Cd=Աf\TSۃw(eIκiN=7&l Tkwpn:,M"CXj&{1hY++ܱo\ќkS/(]tz:PY]9jr cAUO7^M7 VljNSFQJȂ>ZVK?SNp3܅_UtPY9?Jˊ1iCDrrb4o)Zc%Idm7fEYke;r};@9 ި)mH~N9&>~1Qnm$ a6WݼR^6nBIe=L? eJx2,c_ut}oW^$|r0VWݼE{ӳ&ʡ堜Ҝ̘"{T*k%?H5 JhR7pֹ(6؋߬tO{=rǦarǬI3/j8Wa{{P(U_¤[֬udlgjS3Dz:ʙ38] Hfy50̋Lc*GrwL&X9{默 (hY2:X$ҥ7tVRNlu4o+JLT(YrQy{{<(-:.퇰 ߔLd.H'{m+ؼDb.߼NɪM) @9[#bcô"M[u_TJ\Nk {k+x7\!P~N([K@mfg.*ESh!qP^krm]*-2C&=[Wd΀L"\smoD+nD=UR\?I̾(MpR`!q P+֪Kt{뗲N2‹INzb, b^YDTU1B_@T9փRO_βsO1 堜:C~GcL)82G9Rz DN?ubjߝnc픐^}w%B6s `܅ORN9no2vg3G'5c@9÷D>1_oXM7]WzQً b~I %t7j!p'~?GrH]m帧˜Q@jbC%yeE-kz&>PtTs_RkimM쏪$no(Y` k08SSezzL0n (ʡ堜#4%8le$AV 倛r @9pG2@9(p@98 qKP Pr8(rkA9@T w1۳k!ZIS].]7a*rN2@9[;WSQ COgp_ोF93-A%!ᬷAysJt/]j@8$mFwR5>(g弳-ewTy##bp)ݦ@1BpRY#&ɀUDЗ)G5$8AD9o1֌OS5MmU: @U9u?nZjkn rwMVݛ 7YƱZ):F8Tp!F4F4Fz45Ei[PFhnjnK4aܮCbK 4QRRoΠQ[\n;ef~V={-ggG0rvq\Swu5.+GٱCхSd|۔K&4 ٔޖY?>^9;$g;w*ykVT؃tQ+zg#jB~IK9&v^U}t`nNƧu6y ~y˓mPk/)\/=uy~b7L}r֛ȦQ9j79eb$Τܖn Ljr'c(G4n-?~U|%|;0e,9A(Nq}.5UkQi?2Ȃq_6媽f6B92c 8ܷcGYhrtPzMloCokZ ~à }I GN҉(pvfkklZ=F.9hgc=Mi W0;iSʡac.iЏwoЉ?_M9"L`paԄ''X|$NN@A8ܻaMNk5;kd3#8Eq7XMG 2B+F\^|Bۡg婓͛{}S.vA9;s\.ZNJ946xS{^_qGh[Ej9iu:ʶa4?tnIH3^f%# ҆M+2JPŧ> hwo6*xuʹn5W# [j:Z޳۔rBU.nf܅vU(*1N2u< ܾaYBdltQqfv_Fqӛ*׮>!{{UDYF2_9k yO"堜g3҆_{iKތ-29KF??൩rKvZRe28Wgnf>ӧ 堜}+GjNJS=(cXyN#ZWЖ1ڮt/O\Lx?u*o.y}g]3H[xR岞qZQoZ ^svO N'anGYzoCխB>3խees}uctN78n;谻r.8W̰W5>uzΟ T86[E|3ʙ[eub13 -kqd[gg;|J1yhsu.hb4LڼS'R7Y-u|ѹ>6MP󵣒A3SSNdt а?<4ul:NTH}[|;{A(lUZ81*vr/24F"kk*5BosvݳT|. SD9Qs#J%޴LbbD7xcҺʉ]siJN`r8cgW14ԉR݄ 9 /JE*g޷-*3U3E{Ӭn<A9RNn,tZag4cZ4ة8P\zpoSN>0y<&gJ1aNi3fuĖvbjYt>eFyysko}Z3JYsqs: (g2RLDٹ*>cs&̨t6PHl\(G@z*hgS'<ʹ U*k^F'npFXӝGNFg/ؿr"vf.trD귀p&K{/A6xP9rLFz>&:Z$I ~̅SN%zHu|p~S'6ieqpDG_Ȋʊ& 5NdZymTpV'lvsr!bcô-"yM[u_f-^Nk ۢM{[M]L$ԫ%h3pNdn왕6@G6va1>N^/â-2g@Q|n(gܮ6n9ąΝmK$5uP^&V3N1堜*g>V, ‹fc$'VAd^mr̛x_WQ_\ [[JQWkw K=rn׭.- K"r4ĝʍ#.s3J^ L-דּPWZԋO\s^_J3GD2Ǚ>:k;|ަJ  xnf7t;upwϭu7oeZڍJ:BwOG,~oWX9vIU2tky7꠼:1 'WζhW:*ҹ/U;~OnZŦyGUnl`X|TjZ^e=&N񃠞h'hr iRHAm_CU; Q̷xbTjظCp#yݎwyY,+} s#WS0"6Xa-.sReBpQTX]E"mr' Vmа&Ce}w8CirĜV&4_ϭdF-_7Y3nTAGRA9 p: 釫Yr/uPLM>O]޴3A9 ն]@9╤mu=8O<\o~ZF;Zu&vZ:Jټ<ǯRf}3PnʹsKu' T IDAT#~Hu/ i<(('a(xjPz)kHZD9@#}z,y*k=%0> 4ʁ?TD@9#G&hS7<EiN  e#jy 5"PKVqR2ʌrJY66:ԛPY ǝU1TW߯L ދ׫"TI|}v s_j2xA WB9~Gu8IA9S Rv_-v=[CeF9C sF,'8mW45nyA OQ+# ƁbQC|9Mof:(0 _vh;6zlK'IrvE *epTFoc Rߓ$9VJ(Hq`|UOAiҫ+g?A9q`rtL&)4I.@m O'S#hzMdݎ^C9¡v,c ח('2|4IΞG9)f@@ڦ~skO^9(x2fhW<;=Zƛ zn_zsP`s]Q`8>k93uʁ*l9(guP3q?9xqpOoc<RPlN8c{W[ft/;PQ ܡ׿Y[x'A9(`8nuZoOrY_3έu5 لЋӶ} ޸{yKr#y;٠rlΗc߱U)x;_L8UI(9ܳ(=ZbO$(0N؂괎DӜ!ӄ }=qE Mb6*D__o,Qΰg|%$}X&0 Myb$H+mx(0NA3n~$'΋Qlkpؾ@G2$YݿdS+ϨP`[,) O"7HoNlOv#B_f ʁTM*kr<=7'wxu Rirʙ^{wrў$) T7uyOLC?@Rp7(G'yAV9z˕ohMivgpԩ9y|3[L-h {Xy.T v-Lk eijœY9@u~ttۄzԀ]K7ɑ۸&!oM~4ىIy)@(Pΐz}hW=|`oHnP&hN rq%m[$3p ^7wPQΪC&E9r|ie=-4uF3g*誾aq""bȐm* O 5bP Xn)\fߠ"EN9eA9@e\S'^kY{6hOHtNT84N܍S3+m6Ţޝ/=,/s[-Jp*2jk7/5\s3}9MڪI@(P{XJd$?V݅<@QCJsʙDjIO.ioLlRCVMs^7(!5o i(g4r6/m}`4=$7"-u87(gE[.eGbnןm5cEzK/q$goP ٖ`v~& DҞ ?O(A8<\orΎPQE.O7e=䲞Q,p `qͮr`τz+_k~.y<'}27zmJ0Q1OĂr,:zۣz]tdSf&8tߠd:¨S Ph (ays ' PC1C#{=Gg|'j9G PC9 z=0o{o 9s@It좳;㸂= Pʁxџ)?ym Z|Sv좳?-Ϳ ãj\b^/HrQ9gf7 POە3DEgƙ7sC{nx JlÃr<ι'7v4v F'6щ=їcmZk-S?t;RIڏx hPIiRΔsy77/{]d%i8C u#zPVjo`qӜR~9pgvOkVsm=r[Yo`ʑmgg7}4J>j+h$'ܪ7vClD5s^#8?Fd,r]BEo`ʱٵsS~=;Gz{qGbà+4C7Ab9槠ijGhzC5]c6' ֹkhN7kk E(ֿޟU) [͚ſ?0e q3)xyk)qc(֌;b`GP5mgTr`݊ճNO9s/SXޟ^9=oJzgQrux~ʹ"ߟg w$`PϨ)Ϳ)4ʁc+'9HZC;gƉf,㋮4fh#|+΁)IfP9{X}P Òi Wέ`j/rNRqIT2#lg,fDZ#u-(VA(r6vy>Ӧ9yAbrB9l+vqvISV׍KiJ9ۢ[ ]Aag;2'JD}0ѳG8r½:~ Pۮ{}DDWz{pΎ6}G9ǯOjS&&x%bWUS9a@mvi#~".V0\9DǕN-UN(sg0AFjgPcEkjjEo^. O`Ξ6Ɓ+gr}o)o OM:c( <IPαқ"Cb@9(@Ƽ'(t r`*R/'.?C(57O=Hݷp;X9@9(Q Kլ_'*1/Yv@ɼSrq{DhQ9(rB9mMsq7r!E=՞2s}; 5UNdQOVkQC*;qXT%go|r5aWP8{< VN׏cJKʡZuto*Ј]5#U U+v sv栜q[ij|(NӄVG;rNSgᅳtofhr`UԻӦ7kʱyL7P̹O'5Ia@9rfA9꼲nfhxFQ6%f;of^hX+1boش 7r49(ƙI70o(@9 Ɍђ7(g5?*PTJ_F9iEb, 3IXRᬶ39reN ccI#V}ՖM7rڡYڳz:}bUr]SٵnKo@9YƩLj7sA9copM9z5kMh={7H_PUuY#Dx^ߤ=6˙.1CpӜ圫5m(}$1G[R(<xqtI @9UNeʉ a$rZ}W+g yPZųȇPΧ@A:rވ}9ّ!HysRrly:|H%% ʙ_,9op|rS\դrr^ߐH)GT^,N7OYnFSAZUNZ{s^{qH>D9}F22?-yFA9rN\T18rWdw,vDWЕr=+Dy8)Gg3vZt4e Z!z}v,gk}ҁ+Gu5c!Z% K>/7ЈfR5 9rV2ΪӀhSnlJ;9Zy סT9w8 Dl9H^0S9Cg/WI%rrlOE93bʍ|t߯F~oJݔ9q&}V8?]2f|-.y$eKzM>?4)֑(+1g}8-(Š[I'8{h7ɉ7H}3h^AkQ1.yr.5orvԄr^T/3l) "#෺-~bWlGWNT>{qD<ňXtbO΅3(1]CgOErNUq#8纣؇|*o0oHӱcAu{Նr0sY~ IDAT~W[Be4g |ii[L9[rΗS9{mrU-s#tg2INlo7wt@rnŸ[9,'s<1f ٮ巫}]9`.:pL%gy蘌"S-urPή xEKAj~53wс祳b[5LLF i}'r>$yzPt*j 3|E63LvgIN8YSAuGp0,x Ֆ(ǞŃr^*؛Ddꇍwނ7'[堜1J TΗ3BE[2^S'cʝ_m(A9;)ۍ2y5cr r%⑽sZW ywA9(ٕ֨ZʹN80{=O>u(n닑#(ayrP8+9&bpʱg0H**YWg|r NmlZTЃg85j3$9]txQ8OIY9ʙ ιN*@*3GM|yJuE|p+k@wс+'u%oL&`iLtr`O)rL -Gʹ4.prqopYq*'."uzJ -{f텻蠜&L"]r@[԰4MG"x`rtGRθtJdR,cO5%vοf(xor!ۍZ:kK3uiprʄm´0xTHoqO2%b]Z.:(KsWfȮ(xxV>J*VBd@Qa`tB)>r&mn6-n).0,q$P9meTSlT?8êNA9k!ybю*GְaX$ñ堜]WR74p2QүA+ES=ðN2P9q|\;!Y1B0a=.:rP,gc/aSN=|5 K;Kf j6s_9$7oD\,D/3'?wrƹ9iӾLl Qؐmm@9(稕/P>jg-r.3KwʁYEqq6U0nWq)_1m0(k_EfXtA9G`8;VѮ6Dp=堜կ-(Hʑ3ƫyBzYkP{UΌjҙFL|`s?wKb NC9(x֯[35볃ݳrfty2|yq4?93+^3EPʁN7s q6-wr3N/?A9tv j9r6 sZԂ$ @9Bh}.:@p@9yz8I(T8@EP]8Y`r`,g}@9(VP^-(O"ʁi2=3rPlaP8HbㄣA9.1&Pyq @t PPY$@9rEI0T `r(+5`mGmbxQ<5v-Y5C8`m!#{BtdMpn8(TƩ,t:rF9Wk4a\wшDy~"wiQoB9pgDZ-e4ƣsGYD9+Wk bP@jwk\r3ΰ  hlCD7U(gf!sXE-0pJ@AW'6(gS @8 ]_yNe:| q?67%8(,]T9qtIsL;]P2MjSrNIUNN'EyfF'@92N%oI(rM ؤ-Zۗ#y x)8(DƩ@9WQ('|9-ig6:(P9`O}" d7:#G2/gr"8Yʩájay\Ig+a8pӕ#"t5g%XcF5oa9*6YמqQm-kaqP.+>FGS;mT=\I kqJqPL)PΕPyo8rV SA8rPZ#k(W=rA8rP=;iR@9(gݺPNp(Vqfd8P)rA9#>vJ(@9('gޖ(PɝJ)οBrPs_7A9Sql (堜SN7rPNr)N85(<F8rPBp堜Fz(3)=8rPγ)NY'rfOq-rPbp堜OhJ Ѕ(嬐 @9(gk8Z@9(g]tntA9[[$a-tSIPYt-Ŕ@9mUHꨍ`Kʹ)y jT~E 1KʹOqP&QT3Δs検'߉CM_a}xF?^_״CN9A.ږ[o>iM)I/4g ͐2*G :tL9AycSA3';x8֘d^j2PWVˤ*z/ҽj PȌ*d'~ZkQ匚a95@9*AM}yrC8rv X3a7*:šA PcJR98p+1TN%j9r)مr,1U~ś6]Pήc#Y9‰5@9Q3\k3:ke9Q`@9QNy?>>p[9MPNt's?]9!#5UkۻHq5 `}l)ku@ Afj9jqB_"?9M1b:rQD9C0:p=j"f89[tL/sE rDNX<tnIO?@䈜CuI| 9,85@䈜G@"G'=p> rDNRC#rg>9"'pqTs9"'$ rDNlMU8nTD M)qT6 rDNo%DD;9S9DDNuqΈN5 "goр!2r ΉjJCdΪS 9G;98q9DFr{}jȹL899O "_ @pt\$9!r.ȹ8Br._o99՜KYfv5C!j~|8A9S\.Dۉ#y>C!2r!3GDs/Ds9rd r=jQ."9E9e r8@DW$#qD9"'$rSn.919Eg>DNL\ T9>r. r:yWߎ<`$9"?9눑8"ș9"':r#qD3pCI3"ș#z"yL?S\9")oDLJ9DNyLg<GCr)_"G="gcDΖa쪪 rbC^l p3]@'Ϋ9"4רiм9cy(4t39cIgs[UE1DίkCq3r r~S @q{sƘj"'w̥iO|?dv|Mm#: Uncvf#rmS4ڬtZF䥊lŹ?m^Vձ;c^m9"73&uh}?%:|//-:>mZ*U̮]#'6Msl_Wt[:qREܓ"41nQRho}8ӜEc:oo믻X u@_Z`^Lnspg{އU]/VmmJ5ul8]ZhPRܯ=>U16.EΏ֧_:7&<3by~;s*wQvqkJبtjͣ/*5n9?'kAY>݃m2-aXa}&&{|-aȮ=NT-MqZ :NWՓ[lU=ަ5Θfk"租W}ƙvJxnfrX` v-L_k][Vۦi:^Y-vREn~mjqRhiS~dkwח52>66Vn]p)gw]:^I-~VFT1 k ''ڥng8瞵kN{<_vn`k;ې]{/V/W:LU^*rV5Qsl"G:wF|HU{Է92{KoFVyصu~mQǫU>SJ"kM~WSl"WвqWf(@:,}qMRxʏC-Sn7xʧf RŶlݲ㯢ƅռK#rN1csnk&[t*׏!"Lf<u^SZh73,*5>nF"ۥ9ENr"xOs|~z#푸zA}_O4Q[&[mpJX*Brb[c6fnoFBۥ9EN3?6^G j6 !#Lp*OEoqQɅ5O8[3Zhe=+Ulk,oX^mv)rDNd4gߩ6/2;*A[fy8_ZD8_ZƈBb[ciɸf#r"[3ڥ9vk}.8**5nzGtWuno$=.Nz.Eȉ1}5I_mfhs}[;;rkUoʥ::IR8c9ޔv5#~Eε7^\?9agbBm/ۀ9}O|aΪ[kW/\l8|XӛǠVuZIMkg\6٦9븰-]_%_*5ޣpۀ9ʇ[PG>-0s,_W/V9b׹ [oc[l]^X{xdniF|_t⛨Q /H{Zst-Ms9ɋYrĮs!I:.)E_ָ{=o~M`szE[ /翈zX‚g#Knzy|ǻ?=*IDATt}*:gKb^"l]^XɠՋwU rnO[&bY85ڌcQz~y=Uu؝΀vq\[ϟɋٵKbY"L^ٛH: DDGbr!?Sge'(R{33;*ܯ^bL>O+%jVF m_7ÛӶ3oaݝ7(0yχfqi/T$'9"pλiںձżz&Pyڋ"밻 99M~'UɋھδEawA r 6rVc$ϩ/{t&VTv䴅hWCmO{Q|"B#gwٱj{rGeϜX\ЦCmO{Q-D suoD@97 ٜ_ @Co~}/r""p@_OO{n>о?`s3va7(n-DGN~%7Iݯ[޻I[ GNa]o?wYOW>~',i/͓~ r#g غ/n6l x3) mӘCSˋôi/TRmgf r 8r]BatASDU7Ϯ?|ƴWE*_ښKH/՗<nii 75399s4C"W]mczZYOP+ڲ@ژcۛKx&VG5vyV[: io:]ݙȁi7)\ǂޚ  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes Estndar, sncrono, buffered y readyLZ/%Z/%rComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin. P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinNn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    +   /oqsuwy{    0` ̙33` 3` 3333f` 999MMM` f` f3` 3>?" dd v? dd @` n?" dd   @@``PR    @ ` ` p>>  4,(  _  T lԔֳԔֳ ?" l iHaga clic para editar el estilo del texto del patrn Segundo nivel Tercer nivel Cuarto nivel Quinto nivel5    j  Zlgg ?"0  l D*Sistemas LAM/MPI Aitor Viana, Octavio Hombrados, Jess Lpez, Juan F. Ramos&M; 8/ hh88  Zԝlgg ?"0 l `*hh88  # ll_ֳ_ֳd ?"0 l W#Haga clic para editar el estilo del$ $  Ttlgֳgֳ ?" P ^(2  hh88H  0@޽h? ? a( TransparenciasHc  0  @(    TDhGԔֳԔֳ ?"   G PHaga clic para modificar &   `kGgֳgֳ ?"`o  G p*  hh88   `rGgֳgֳ ?"`o G ^*hh88  ZtGgֳgֳ ?"@ G o7Haga clic para modificar el estilo de ttulo del patrn88 H  0@޽h? ? a(q 0 `(    TybJbJ ?2(   x* hh88  TbJbJ ?g (  z* hh88  ZDbJbJ ?92]   x* hh88  ZbJbJ ?9g ]  z* hh88Q  Tgijgij ? 7b  iHaga clic para editar el estilo del texto del patrn Segundo nivel Tercer nivel Cuarto nivel Quinto nivel5    jp  01 ? x  H  0gL? ? a(80___PPT10.o3  0( tz  H  0gL? ? a(80___PPT10.?/  0 L0 og0(  x  c $ 0`   L  C $A MPI-1'@    0l/ |&Paradigma de Transferencia de Mensajes'( 2'&  5   0l^ P`0 Cada procesador corre un programa Todas las variables son privadas La comunicacin se realiza a travs de subrutinas especiales( 2     6d@ P lTrans-mensajes  H  0@޽h ? a($  0 P T $(  T r T S ҝ0   r T S <ӝ  H T 0@޽h ? a(80___PPT10.Pn  0 ` X n(  X b X 04lP0[ dMPI (Message Passing Interface) Una coleccin de rutinas adecuadas para facilitar la comunicacin (intercambio de datos y sincronizacin de tareas) entre distintos procesadores. MPI : 1994 / MPI 2 : 1997 Existen bibliotecas para C y Fortran (C++ y F90). Caractersticas: Es estndar (por consenso, no por normativa) Portable Flexible (~ 125 rutinas) y expandible Simple (con las 6 rutinas bsicas se puede hacer mucho!) 2!( 2C 2 v32 3E13fe 3fS3f23         N     ;  X C x(_ֳ_ֳd ?0   H X 0@޽h ? a(80___PPT10. J  0 L0  <(   ~  s *t10  1 ~  s *L1 1 H  0@޽h ? ̙33"  0 L0   J(   ~  s *,<10  1   s *T1 1 @H  0@޽h ? ̙33  0 L0 P 0(   x  c $dr10  1 x  c $`j1 1 H  0@޽h ? a(  0 L0 ` (   x  c $1 1    1_ֳ_ֳd ?0  1 H  0@޽h ? a(  0 aY (   r  S 10  1 ?  T1gֳgֳ ?"<Z  -MPICH2 es una implementacin (bastante) portable de alta performance del standart MPI (-1 y -2) Principales logros: 1) provee una implementacin MPI soportada en una gran variedad de plataformas HETEROGENEAS. Con gran variedad de redes (10Gigabits, Infiniband, Myrinet, Quadrics ) y tiene algunas cosas interesantes para su mejor funcionamiento en sistemas propietarios como BlueGene, Cray, etc 2) Es fcil de utilizar en otros entornos derivados lo que permite ampliar sus capacidades enormemente. Por ejemplo crear nuestra librera, o Petsc, o scalapack. 2.*( , ,  ,  , , , ,  , , , , ,a , , , , , , , , ,  , ,hh88H  0@޽h ? a(80___PPT10.pR$  0  $(   r  S 710  1 r  S  1 1 H  0@޽h ? a(80___PPT10.P90kM  0 L0 p $ u(  $  $  l1_ֳ_ֳd ?0  1  $ 0,1P0  [En FORTRAN ser va el llamado a subrutinas: call MPI_ROUTINE (ARGUMENTOS, IERROR) En C el uso ser de la forma: MPI_Xxxxxx(argumentos)< 246p.       !   X $ 0@p $ 01p El primer paso ser invocar a la biblioteca adecuada (C: mpi.h, F: mpif.h) p.e.: #include  mpi.h e 2e9              $ 01  dTodo programa MPI tiene que ser inicializado y finalizado (para liberar correctamente los recursos).e 2ed  H $ 0@޽h ? a(u   0   p \ u (  \ r \ S 10  1  \ 011 : lVersin Fortran PROGRAM simple include  mpif.h integer errcode ! Inicializar MPI call MPI_INIT (errcode) ! Parte Principal del Prog... ! Terminar MPI call MPI_FINALIZE (errcode) end8( 2 2                                    v \ 011@  Versin C #include  mpi.h /* Headers */ main(int argc, char **argv) { /* Inicializar MPI */ MPI_Init (&argc, &argv); /* Parte principal del Prog..... */ /* Terminar MPI */ MPI_Finalize (); exit (0); }F ( 2 2                                            \ 0G`` > 2   \ 0|G` v"Un programa MPI: el esquema bsico# 2#"   \ 6XG P a Prog.Basico   H \ 0@޽h ? a(80___PPT10.`K  0  ` K(  ` r ` S G0  G ` ` 0`G4t Los siguientes pasos son definir un comunicador, indicar el nmero total de procesadores en el sistema y el rango de cada uno dentro del conjunto.2( 2$ d   ` 0LG0 pEl comunicador tpico es MPI_COMM_WORLD (definido en mpi.h/mpif.h): son todos los nodos requeridos al sistema. (Pueden definirse otros comunicadores si es necesario)@p 27( 2 f      d   ` 6d$G P _ Comunicador    ` dHHA Frame_60H ` 0@޽h ? a(80___PPT10.@   0 L0 < 0(  < x < c $,0   x < c $  H < 0@޽h ? a(  0 L0 @ 0(  @ x @ c $G0  G x @ c $@G G H @ 0@޽h ? a(  0L0 @l 0(  l x l c $ G@  G x l c $|G0  G H l 0@޽h ? a(  0L0 Pt 0(  t x t c $G@  G x t c $`G0  G H t 0@޽h ? a(  0 L0 p| 0(  | x | c $8G@  G x | c $G0`  G H | 0@޽h ? a(  0L0  0(   x  c $XG@  G x  c $0G0`  G H  0@޽h ? a(  0 L0  0(   x  c $xG@ G x  c $PG0`  G H  0@޽h ? a(  0 L0  0(   x  c $LG@ G x  c $G0`  G H  0@޽h ? a(   0 L0  0(   x  c $pG@ G x  c $HG0`  G H  0@޽h ? a(l   0  d l(  d r d S G0  G  d 0GP 2 Hola Mundo en C con MPI( 2   d 0G@ .#include  mpi.h #include <stdio.h> int main(int argc, char **argv) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); printf(  Hola Mundo! Soy el proceso %d de %d\n , rank,size); MPI_Finalize (); exit (0); }6 2oN3[                                                                d 6PS P ` Hola Mundo C   H d 0@޽h ? a(80___PPT10.ऒ:  0 qi h (  h  h TH%Sgֳgֳ ?"F:w "$#define CONMPI #ifdef CONMPI #include "mpi.h" #endif main(int argc, char *argv[]) { int nprocs=1,rank=0; #ifdef CONMPI MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&nprocs); MPI_Comm_rank(MPI_COMM_WORLD,&rank); // printf("proceso %i de %i \n",rank,nprocs); #endif% 2%                                                    hh88  h T <gֳgֳ ?"w~ {DEFINES 23 , hh88H h 0@޽h ? a(80___PPT10.\  0 /' l (  l r l S )S S   l T@%gֳgֳ ?"w~ {DEFINES 23 , hh88H l 0@޽h ? a(80___PPT10.`p^  0 /' p (  p r p S ~    p T6gֳgֳ ?"w~ {DEFINES 23 , hh88H p 0@޽h ? a(80___PPT10.@v7  0 /' t (  t r t S :S S   t T:gֳgֳ ?"w~ {DEFINES 23 , hh88H t 0@޽h ? a(80___PPT10.P`  0 6. (   r  S  {SA  S   TԔֳԔֳ ?z~`  #ifdef CONMPI if(rank==cero) { end=MPI_Wtime(); #else end=clock(); #endif FINALIZE #ifdef CONMPI MPI_Finalize(); #endif* ZY 3)6                 ,       z  Tgֳgֳ ?"<6 JMido tiempos, imprimo en rank cero, libero memoria en rank cero y finalizoK 2K3@     hh88H  0@޽h ? a(80___PPT10.d$  0  $(   r  S غS0  S r  S S S H  0@޽h ? a(80___PPT10. Z   0 |t  (   r  S S0  S Z  C 2Afigura4b_dosFH  0@޽h ? a(80___PPT10.p  0 L0  L (  L  L C xxaxaAo?"@   S L  `W>1  ??Arial Black5HY?fH  r L S `S0  S H L 0@޽h ? l.  0 P (  X  C  x     S  7b   " H  0gL ? a( 0 p ,(  p ^ p S  x    p c $S 7b   " H p 0gL ? a( 0 `x ,(  x ^ x S  x   S x c $$S 7b  S " H x 0gL ? a( 0  ,(   ^  S  x   S  c $S 7b  S " H  0gL ? a(  0  ,(   ^  S  x   S  c $$S 7b  S " H  0gL ? a(  0  ,(   ^  S  x   S  c $8S 7b  S " H  0gL ? a(  0  ,(   ^  S  x   S  c $S 7b  S " H  0gL ? a(  0  ,(   ^  S  x   S  c $0S 7b  S " H  0gL ? a(r0tkr  [_t fnαn޳R6.0̆܈ x{ޚ[>I@d] +](`b   ~0http://www.mpi-forum.org2http://www.mpi-forum.org/p/ 0|DTimes New Roman8-- 0DOh+'0O@ LX |   mpidD:\Documents and Settings\miguellop\Mis documentos\Mi Documentacin\Plantillas\TransparenciasH.potale229Microsoft PowerPoint 4.0@i A@PZ@g2^@ AfIGNt  &$    """)))UUUMMMBBB999|PP3f333f3333f3ffffff3f̙3ff333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffff3ffff̙fff3fffff3fff333f3f3ff3ff33f̙̙3̙ff̙̙̙3f̙3f333f3333f3ffffff3f̙3f3f3f333f3333f3ffffff3f̙3f3ffffffffff!___www84$A o(o`Eʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___wwwmmmmmmmmmmmmmmmmmmCmmmmmmmmmmmmmmmmmCCmmCCmmmmmmmmmmmmmmmmmmCmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmCmmmmCCmmmmmmmmmmmCCmmmC_Taleale,D՜.+,     jA4 (210 x 297 mm)W' %Times New RomanTahoma WingdingsCourierArialTransparenciasH/INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE) Qu es MPI? Qu |DTimes New Roman8- 0DTahomaew Roman8- 0" DWingdingsRoman8- 00DCouriersRoman8- 0 1@DArialrsRoman8- 0" B.2hh88  @n?" dd@  @@``  +   ( E11fI     $?%$'(+&-')%/0  O2$~E@O齜 & m~Qb$:ytpAQb$_j7 *u YCrޒƒb$55 îX)$Ia gֳgֳ     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S"0 3@8 D FlO ʚ;ʚ;g4KdKdh 0p1 pLg4bdbdj 0Jppp0 <4!d!dw 0-<4ddddw 0-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~>     L !"#$%&'()*+,-./01234569:;<=>?@ABCDEFKMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{8~7Root EntrydO)A}@PicturesyCurrent User)SummaryInformation(OPowerPoint Document(4TDocumentSummaryInformation8Tahomaew Roman8-- 0" DWingdingsRoman8-- 00DCouriersRoman8-- 0 1@DArialrsRoman8-- 0" B.2hh88  @n?" dd@  @@``  +   ( E11fI     $?%$'(+&-')%/0  O2$~E@O齜 & m~Qb$:ytpAQb$_j7 *u YCrޒƒb$55 îX)$Ia gֳgֳ     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S"0 3@8 D FlO ʚ;ʚ;g4KdKd`g- 0p1 pLg4RdRdh- 0ppp0 <4!d!dw 0--<4ddddw 0--0___PPT10 ppV___PPT98/ 0z{? O  E=_.INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)P/$$$ >  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes Estndar, sncrono, buffered y readyLZ/%Z/%rComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{ $  0  $(   r  S 0   r  S   H  0@޽h ? a(80___PPT10.@#9rTAV'c(`b   ~0http://www.mpi-forum.org2http://www.mpi-forum.org/p/ 0 ՜.+,D՜.+,     jA4 (210 x 297 mm)4, %Times New RomanTahoma WingdingsCourierArialTransparenciasH/INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE) Qu es MPI? Qu es MPI?Caractersticas de MPIPortabilidad de los programas Local Area Multiprocesor (LAM)Local Area Multiprocesor (LAM)MPICH y MPICH2Como funcionan?Como funciona MPI?Diapositiva 11Como funciona MPI?ComunicadoresComunicadoresClases de llamadas MPIComunicacin punto a puntoComunicacin punto a puntoComunicacin colectivaComunicacin colectivaComunicacin colectivaComunicacin colectivaDiapositiva 22Diapositiva 23Diapositiva 24Diapositiva 25Diapositiva 26Diapositiva 27)Mediciones de eficiencia y escalabilidad Mediciones ReferenciasDiapositiva 31 Fuentes usadasPlantilla de diseoTtulos de diapositiva 8@ _PID_HLINKSAlhttp://www.mpi-forum.org/0___PPT10 ppV___PPT98/ 0z{? O  B_.INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)P/$$$ >  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard  no hay garanta de que el recv se inicio synchronous  se completa cuando el recv comenz. buffered  Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready  El usuario dice cuando se completo la recepcin Los recv son mas sencillos: Se completan cuando el data esta listo para usarseZZZ/ZZO ZZ/ + & XZ      Y8GrComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{   0 L0 og0(  x  c $;0`   L  C $A MPI-1'@    0@/ |&Paradigma de Transferencia de Mensajes'( 2'&  5   0xC^ P`0 Cada procesador corre un programa Todas las variables son privadas La comunicacin se realiza a travs de subrutinas especiales( 2     6 I P lTrans-mensajes  H  0@޽h ? a(  0L0 Pt 0(  t x t c $K~.  K x t c $xK0  K H t 0@޽h ? a(rW_Bp!V1'c(`b   ~0http://www.mpi-forum.org2http://www.mpi-forum.org/p/ 0|DTimes New Roman8- 0DTahomaew Roman8- 0" DWingdingsRoman8- 00DCouriersRoman8- 0 1@DArialrsRoman8- 0" B.2hh88  @n?" dd@  @@``  +   ( E11fI     $?%$'(+&-')%/0  O2$~E@O齜 & m~Qb$:ytpAQb$_j7 *u YCrޒƒb$55 îX)$Ia gֳgֳ     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S"0 3@8 D FlO ʚ;ʚ;g4KdKdh 0p1 pLg4bdbdj 0Jppp0 <4!d!dw 0-<4ddddw 0-0___PPT10 ppV___PPT98/ 0z{? O  B_.INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)P/$$$ >  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard  no hay garanta de que el recv se inicio synchronous  se completa cuando el recv comenz. buffered  Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready  El usuario dice cuando se completo la recepcin Los recv son mas sencillos: Se completan cuando el data esta listo para usarseZZZ/ZZO ZZ/ + & XZ      Y8GrComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{ ruQ$'c(`b   ~0http://www.mpi-forum.org2http://www.mpi-forum.org/p/ 0|DTimes New Roman8- 0DTahomaew Roman8- 0" DWingdingsRoman8- 00DCouriersRoman8- 0 1@DArialrsRoman8- 0" B.2hh88  @n?" dd@  @@``  +   ( E11fI     $?%$'(+&-')%/0  O2$~E@O齜 & m~Qb$:ytpAQb$_j7 *u YCrޒƒb$55 îX)$Ia gֳgֳ     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S"0 3@8 D FlO ʚ;ʚ;g4KdKdh 0p1 pLg4bdbdj 0Jppp0 <4!d!dw 0-<4ddddw 0-0___PPT10 ppV___PPT98/ 0z{? O  B_.INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)P/$$$ >  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard  no hay garanta de que el recv se inicio synchronous  se completa cuando el recv comenz. buffered  Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready  El usuario dice cuando se completo la recepcin Los recv son mas sencillos: Se completan cuando el data esta listo para usarseZZZ/ZZO ZZ/ + & XZ      Y8GrComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<g      !"#$%&'()*+,-./0123456789:;<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~O g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{ r$$'c(`b   ~0http://www.mpi-forum.org2http://www.mpi-forum.org/p/ 0|DTimes New Roman8- 0DTahomaew Roman8- 0" DWingdingsRoman8- 00DCouriersRoman8- 0 1@DArialrsRoman8- 0" B.2hh88  @n?" dd@  @@``  +   ( E11fI     $?%$'(+&-')%/0  O2$~E@O齜 & m~Qb$:ytpAQb$_j7 *u YCrޒƒb$55 îX)$Ia gֳgֳ     A@  A5% 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||S"0 3@8 D FlO ʚ;ʚ;g4KdKdh 0p1 pLg4bdbdj 0Jppp0 <4!d!dw 0-<4ddddw 0-0___PPT10 ppV___PPT98/ 0z{? O  B_.INTRODUCCION A M(ESSAGE) P(ASSING) I(NTERFACE)P/$$$ >  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard  no hay garanta de que el recv se inicio synchronous  se completa cuando el recv comenz. buffered  Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready  El usuario dice cuando se completo la recepcin Los recv son mas sencillos: Se completan cuando el data esta listo para usarseZZZ/ZZO ZZ/ + & XZ      Y8GrComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{ r;jmc(`b   ~#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((4_o|-x޿mns*$geGB,Dcz ps6_P<j7ߠi|-Zk#ҢB+ȱ6P#xGR1?Q,6o⿋׾!4F_a[IYn452- nH_$0;b?g8zG$Qb?g8zG$W1Zln|mD&fxBmf0˺I3F;ṂpP1j Ҁ?w~|YXx^&<1ybMFBˑ˞hlvFEo?_g+xnǧkRk4MI_Mop%=9MwsT[`4FG" ox6y7nvs,#&8EQEQEQEQEQEQEQEQEQFq@f0=s_?S:7SX []luh]%Y? ṑ;q R'c;x=kBm𵾻wvj#mYYwEi G#%Q0̎mN?:>\GH~jXJ٬[pwC0iPO#F`;/_e C~ |/ N;)gGvۛu+YYv/ `odyBp{:-#+Y|+Ψ>|L~W#>!Wyɷv7yo8AI@Tr"*xyt өMxwy?g7vɻwb~;:sK`S!k%O> c kijlxsa UX12q?hx_~j,Vq7Mt% .nҬk-r&&icHf^<𮙮ZhլW~ap6xT%$ѕԕ`A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@׵s~+WU_hΕW O2Eit3>m[HntYI' Hap(~.|<~[˻kK3W%+A nI[Ƅ&\3'jO]s5W2Cn\IkiPUxMZRग़^56_)m?j=,F 2NDI2$}J`(=9 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( @$h=io ~?>(cLڭakh|׍i ClK,hXPW_?6ں[xW¶ӬW%EoiYbVP(y?g?h{^+x<W:+ yn&Ӵ[X=ڤR4ax&Y'I9 ,SU|G{+E<>5;馟P>hqen$+BKBAU?>x;\7=xWzfd<$H+Gwwfvf CL|fY->xOumE{V n7$rR";q ,5(~(n`sҸjO!úwSe闊LSǐDuGIQHDteu ;:(?0Vg|)s7<wXq\n*źgO޿9U?G[]4~q#mq*CNRm 8CuZI =+?[;N|/U5Lϛ:Q)n/#!thvZG7? X??߇xz~>Vgj|EǬ4#H $rR PEPEPEPEPEPEPEPEPY0^/ jZi&K}j)mico%Y\4EfgbH֞FqM<_uj~ǿ% ]VZյ4A @G?!Y#qk`E5yKW#X 1&<^bЯ%~3{MIΟwZb#WRHr鹁JYX_3 o3㇀|A/8W޵j=Mq օp]`Ky@KY n(?+/u;CΡ0Hط2D {eW1$B'agˋ6)1%^k]M~.@szEPY. jzi։ZKaisi}o*bpVH Mh@?Y4Bx'/.\okll{6䳸2ۓƋi?o_'Ⱦ)?jCE֋vt^G5Nb4vhcI$ٕFZE!`@=WoY<%i -I'#(nRIemRma>A;Wa?| ^?r&^=ׂ˭O{z|Rom1y Ŵr }ݗdBt߷(((((((( ԁ@/c[-#+߷M-?x5&ߌ>̍eO2 fYtn7u# w ,W㏁,ū蚌:ߗ#D\3#pE-Q@Q@ u5K@o ~˾ՎGKv77rAqfF_R tjׯ?u]?q X<[oiz% |%㱱䔠I#sa?L''<[y6wx_ݷWH>Y(79~F sօZMA#ޑ8~؟_#ho>:Mխś'H c)un 1@A4䞵_ko(>:Ou>f58$mjkmlv|2 Af W'?i⦟[⦟υ&>{/DmnlWٳKQp]Cݏߵ+|dTjx;5Ag@M} +x#wTuHKIx 9KJ5= ^4kC֭%4t r,n d`C +EA#R:xlSB5rk{qk+|ʎY(i6H<_ؒQuGsW? ~~6ojPlg47y XK쳁 )}l-WL)wu?1-g'ōĖ=I$kDH}EPEPEPEPEPEPEPEPVJf:xtޛi il8)if\XJ-u~!M 7']6Pÿ8_S0j-O Oqyv3Z {rV`#Q)k'6o},=yqԉ 4W KLӎsyrYI{smY X-Dř-#*(01 Z(p23@`@  ! hC%jF _q溏ε['?aM> H᷼$QV@(`0 3O3¿|Vᯈ>0ֵKPCOcsGu#?g!Voc{34Kyl$O4GV:tKIXm:O~HK95ˉ"aoz r䷜E:|C…]!S]S =O]i|AQwym-i]$$FwfYJp5;m߇t>UdU~.k}3F}UMt=:((((((((((((((((((((((,Sx~˿MI~׺;bٛ+K)K7FgC"j.~uD?.tֿ_8Umྣ{v |55K{'Qms4m(ITh$q 47 G{7 ?i/D 7)l<3`][\Z2<҇+Hm,A"JEˢΨ}GB> 3*D,'%) y3HcE]Ŏ2I$h$nk'=G~1şl%iw6.~ؖFkYna+fkF ,j-ԛi&Krr0+8_(/|k,EbQcKu'ن˖d.΢ '"'FGT`dÎ@y/8$@> W Z*|?Ox'+Ym'd ( |}75s<kij_Ÿ^۵ϗ-^䩸]brdp9r)Lǥ-2p"?kOfu-7L^$[6ot(i^,rh.`4i?أm}iYĖZj1iwD őCo?T!pʌ  @MP][ xK5+֘>xof3Ro]\_oQP9ә`K|9/-)\ʹQq~I ;REPEPEPEPEPEPEPMpN0423P_٧^=~tC}ំگ4xcؾrP[,-$1mk?W_#M[.4}r%K?ef6wY$4Y-S #dgUsjI|.<1+y(dn6\$hdmG# gؚ_ "~ \6-s/I9)3;Jߵ_g?oj]B[ЬgѮ%j =1B҃n?f_s_G>i [FkV ԤւB O#Ex1L Usq}b?K~ _\ih xkqipt&A6pvwO?9{WO5~JohZ[kupRO%&#+. Ҽ}zXkZ/ۥͥzr,N ?e? ~?{#> +mG;S 鿴?ƭ+m ㏈wx#!Dk{;i.%HU) XGE /S>𭗆ͻwfw WFݛ3vao>9đj߰O_>|A&#šޑeu/k!//紌W1۫&8X3n2%37V|'|xGqEoF5[ᑉ) `l}9;Fq_?_AO~)j0#}L1;WG n(f-Sf|ޝN>jVgwFayPH-F$~?/Uѣ/iw+ ,|4zAsE|Fg&9˃M*~>9'.?񢟎cԇM*^>G( ( ( ( ( ( ( Sdx' $64۫_[yQo0?vG =vrkTK-ǧj^։ZZrHDֲ,qUqiZ(>NH¯꿔Oڟ A04>V$ϗkf>} ȢX^g-iCc_?u_( V8+4+mgX}JQTmrz{GmX1DbhEGď^*uڿß7"}Ⱦd,${UB[>B!5Ox^? ~]^孽:Ζ/nm%XpA|iX~a7CVxV|2ҝGTy8ݣ1R2C$ee7_ !i4o< mnuI( s֖@~@O2?jih+8=Ph( ?L(ߌ<?G "_i3 $/T &{I" ҡ𧍜WUEG͕ϸXK"<HV7~Ysi"Zq-FCmEtEh_ |ek4}7[F,h/Lաkn/~gψͧR`bhx zS?/;Vmt5}HKw>abRJGFF}//۳熾7xSķ~?x:M~jVw0Kk6a0T #l4k!8cz'wO_FsnwYVN[٭R >%y$?1tW4PܿSړG[[CA6Hb8"ƨ= =!uO~.'1M~Uo eޠ[V#G Ʃ!0߰?Q@k'g+rbGks KZmד; CLiU]H +?a]WvYQeծjmwx-uRUKK}F iaEږbB+=|1smK} χdgc.M8sҀ$p+ 5~ޟO?ޡx;}mxbgđ Z_khbW3Ϳ{pQ@7||_MO|;CV'Pѯu5y|+G q5w7ppJr",y"_tz|wf|AaoͥEE-ړBWI-ǽ}/u?в~˚tOx~? iAޣo Ws*^GK k6kd?5?gC@𧉼A}ieeZMc M尳|MHLA7̟PF.h p ~)韶+-7^ g^&gȩ{$1y,B6O+C N? n-"l?ۥ~QI6@)h-^_O|I%~}^״7Fb./bGC+7{3?~|hƗvZu[LZȂBJ,rx"I#E~8nޯq#O Ko=ķ~&DL:\ ԌeYmJG ("k߀j<igqx_ vq@S,28pGW4P,M۫?4> Ib{Mgڴ?ifߴoVٷM~.|CM3P5 +t JI,&H*)$ˆ:4P\w J>6wx$ Dk{;i.%X) ꤑؖH`cŚ}/pzdN>Q3\QsO6M)oQHр~qu_s V=NjχIq x׺nLӯ]r&]o4Ϫ$pCp!M::O^ mڿß+>+<`ȽM${[}cK_?l J?~ОM>_miFЪi׋$\ֈeq"A_2E5б+ OjO* *E=_ _WZޭkZ,%-leƬ}Hon_Կlg[>1|"Ã*ºc}.l;oy]IݼIIs1E_nW_\|ROI^;?xro?. OHLkq0(?i)Wg?K߂vSk~"kZt\~UrD Z#7wMCk{[yfKk,1 |cu  7vw ZH"G 2n,0WKm߄|[šfjz~kv_\_ʁ)P7FVWRC?ฟC]Gujw~4VՓ(t"),nX{wv0?$;?g'~0{]ΗAσ/Dd w%CBr@ ~xi*o ^)1&C+R9]%FWDGFWU`J?*Ï+?|7W4*^Yo3xHF /o&hnUkc?d; ft 5'cJwYE"!#?.EIU`/,0Ǹ) 8ddPEM`PX/$8# W߁K.3Ŀi #uMJ)v,{mɜqf@VHm/w~?Qž K77W2I2AQY5.Ȁ g_^?-xƞ->iV&LUвIz >)omM^1\&C+R9¼r!Y#tGFWUaS]Kc Mf׏+Pzogii|>:Xj;K 3ƫ(ttyp7?j/>ZQyjlLw":o9]YG\O$VyS:>!xNV$q\$p2Y܂O$ fDO'_nW~|^'4ZqxTe;~2&{;UVFqq{Eyoh|/> 0gIkx"4"M28YQYH#7H@ J3R@_qசWIŐi> wWIR佸:v!I-%L*GLֵωy'_Qx7[5=WzffGn,Yi$wfwI#;3€ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Z ]K\7cZn-tmF+mgCv)-G"s"9p|ȢtFX4.?o7ǚ$(ˋ)M턶G}]gGd Zfi&{[f]&L7E5[}N:k]o7O@1Du'Τ3ؔ$ZߡxSʞ}δ/-tpU|eghu;Z]4뵷~bc0E)Gj"eO2 CI*xC2xñXx\3<\ZvbK <ڙ! t=ʏhT ɿ f´i۞O#>?R)k~+qk1[n4V{'VӖ-+67 >w3<\fG/|LԼEx3^Q)Z\$+^x̃x0|e||irxJI|^m5rjF䬖Egdb5XTtw?!+2oↅm~d7 oPdEg a]M>v_+,2Ny ▀ ( ( ( ( ( ( ( ( ( ( ( ( 3E#~K?rOUqO~6_`48|AgWuKBK7y>lo_& !ʃ#h(((((((((((((((((((((((((((( V}@8'_U7J;>EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEAq^={~w+m?<-嶉3,I3. FHp=SX@G,տeh#V?A?G΀?_[X:?5oczG,?s_?5?_Oe~z-7H<ۦ/(RW%Es/(w?xGof}[Ҵ,#6ixc},1۸]X8W_ft|Cf} gqۻ;[;p2^y$_ ~ :_[X:~ 5oczG,տehq@ " R]H~w>1x+O}V0ٯ'1"T#eJJ`(((((((9'k88zQ_?2ɿo>j~]_&}hF o.(0"0ѱBUۀ?z1H~Q_?B=#tj߲?Y 5oczG,~?H|+#ZB5y~_S|}i?Fx<'94[tZJMK;C1`3`M̙;c,~?H~_?B=#tj߲?Y~ #?gGF,h@@5w 1f|:qᏉ&zo?4kVݑZg2T +|AQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEրC i g#z첣?: 5Ogi#U8zG,4 2E~Hxo9΀?W~-/~8|-7Sb5O xI5?>H>gs <^dlvr Ӽ~H ?/ߧRKG?g_o?I7~#h1t=oW^Z\-ķ ^Y!I^hԿe( Η#TpO ?&:} 5Ogx8:?5Og8 4Y?OdG?h iY/W xPcm &v=:+[$kyՠh^9 7 zr*lWEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE((pHt_gG17_  SOӴْ/.$8fT߂ptw?!+?ʟE?h/So^~ ?/So^~ !r?N!r?N?/So^~ ?/So^~ !r?N!r?N?/So^~ ?/So^~ x#Oo}8~#6PQ@Q@Q@Q@Q@Q@Q@Q@ǧ>x7|B]Bo}R$?fm4q< xGGE~~ 2x˿$Z_VyrlKYTBΟxL+I4B  GB  _@._A._AB  GB  _@._A._AB  GB v~!`ʳ*wV}`ʟJoj?w~(((( p)7qZZ(=i7-Q@PHh0# )w΀ (4PE 83pr1@PEdg8 Av3-Q@Q@g{Qz(f ( ( ( @&ß*+e_ӖQ-ěAo$w2+-!2R%ZzO_Qឥx;u->#Uzlovg[xvD[)G1(fv3_9~ N|?x3n?i/cm˷jO/ѴM?g?gϓ2m_&L-\ل+{~?QoqOki6,1aHC!e 5,̿?ƟC?ך~$dK݋.!I233B*~@q큥gM n5_?߳7oټy;>J<[$4?ǝiaNHu ]Zq43dm [M . L,g2.IDV x$lei o5o7"&L_exfyat&2J%Ep2bFV>AOcGůzx/—&Ӵ/$4`p{]$dA ?SQO+U4]W7Gr((((((((((((((((((?AG?CW?/Uѣ׿򂏎ԇL*^>G( (N(֓ppI (? 2$G-M?MvgŻGiQx][@LIoGG( ( ( ( ( ( ( (??.OqwyR i]Jaj\> )so<T"1( smvE<3SuLך>i76MgpK%ωA1сV"F &( @8s@ E& A.9Q((*)>UG2R%Zz(((( ~_!~%i/if 9d閠hZ; yh-텯~_LO<-Ң%-^bHOtNevرI_.95OGִ;-Wh;UR9S+)<{?3+h?T?{_㝟sga!ҼWfn!~ݝؤfx'%t_)k(k:_ZzMd&_.EhlՔp@?UKY-)kjֱ^@]$r uYmD 4rȍeV  ;྿]]+ Kм3eGMBzfoݼrͨ14Mtey lt9+vד?OsOMi=~{)o`" >TȬf%$KӾ,nS,. ܷiѤӑܲOk,8Y$j͖?H;|Sׇ>~w?6/+c1m{R#@$֍c|>f֯|Ikf66L%34ax{ta_ۣSpѾ'0ֿ|?Ŵʱ_跊e3yW\YYY$)#zs_Ώ+Ogߌއ~ԟ]ŝVsH*dK}򂭋Ld_s?N[SuOOtM[CQK{]>$/,$q)fv *IV~h_8 3G]B^K ykۂv XjnPݾ 8i%v\J++H I$ ^ |W?/ mJ di9/#QHso2 -Oۃ~+?~gw-egӑݙ`c`S,HUFf<_WǾ*sSuoZP/^W/$䴒;ff$I$uMA9J=GNо1j_a5}14ā`HaO=j3$0۹Y!o k_wi/'Wo<+gj͠}y#7dq>He袊((+*)>UGž-Ҽ]O]u=?E4[Io B-,-B,B"3@$2_eP+N#V}?( (#8@N3җpN1@<(QExQeK*G. cSsUbY~JQT~QEQEQEQEQEQEQEV|Om jzZ֚MGaa>w"Fbi D#*1SdRy;P~,bSеߌrj}ݫ֑q^Eww-*r\:u!Qe5?04n'Mc@֬$Gr,pܘ %$?kO⟄]gx/—Muqx^+F~hF3SF^ 8&df~?j ?O<|lėUu:m.~Ґ7oȖ; __K f9࿁?>.~zVI4*MWt:U̓e-B#5#2~nFM_L_9;O/_ i h&ҵW]uiWNu+h-C9#KkTƨcb )Eᆫk V+k,[KsҠ14Aʲ#(`:@`q־{|+~|> =wsº&{yug.X>ͱaf3rmgkҟVo~>Mx[\:mbmC?on#j%$d -6O@`_?C:%5xHeDHV>o &"!Nkp?2!wQ]c6yKisq4˂Jq0㿊ugWïT5 ~^4xLU_2_ nʚKN3K_T8Jig__>uhv elcyZMXDT-'FUYW_w|?Ꮝu}XW>=qwu3lwYS`s.ւ z__ )~ϺgOj~uo 5Ŕ[F^XX#Y|g [πt.jj16{ka<D dEP?DNh; Gsqvma6fUQi`wE$Rrg3rh:;PQeOUu4hsth=;S4 jp[$ h ʤ0OѶ6eVGUu4hEP^=k~ btV=nNOhR_2X8eXߒ a9' fړWAp;V/}CWryV{om's QW@4~ULjIӵY7OKxr%@ʴvQ~/7Ŀ xVOK xTtm$ZX7P2EpcEቕAQ:wH; {¾ψ_iGp^UXyj//a=d&6)XoA> o]cO|w]3Y|Oeq |Ih Iv 2}iigmA~1GO{'74 #¶u[]6L]TclBOeh'ӥ-Q@?z'vxF^zne<-*/KYQ{K@6봪c5kUSNOkj4ͷo"hO2΃p-IVGmD F&!aya#I QEQEQEQEQEQEQEQE _W~ 2E"~ѭ:x.}?E?~OzRI89I3„@|uBq4QE5Ԓ_#O+w\yQe zNOL{'k8V_*USc\p%e OFjoWJv4mYt ȭIGY'{ "_$I|7|_?uU`eƭ9'ԭ&FHğe|XYDoC G?G񆡨k__Ʒ;+\It2o|͆R]'eF1'H/$o*3L߈-j/z֖m- $M43F"+wUd@?r >)i#RI斀 (?2R%Zz*)>UG ( ( ( (<{(s &)"$ٷ5ߖDQA7dUk0?į2>1jn^$C)+$n̒#2\p2_(K:u=ZxH:g ezLІexf q1q;F#y}+$Ln(QDԮ Pto4C2C#'ayPn'F =~k Io~0>5ǢvYKv}3dBb/'؀#o?W?a/'O_'/|*𞝢Dψ{ovPp "H T)ic<ZB2~yN'Ɛh<;m`N&)ommDEܲ¶U[dI?0ay!“]C|o%DtgB:I:P)9Z^ij:ַ]aqw}q+(GvUUPKN+ ,]Z%~1Л+ucƥ@᣶%5|AW ⛉"|񇊴GdÞ.ޅdi0@c+|~pOW?]t-|Z֡tQqk2ɧZ,Ty]lbrK{{Ž1_Z:מßex+ͦlU8~<..8bWfyd %9@ Y0 jZi։ZKaisk}o*bpVHVV +NXq@7߰ euVdqiYw{#Qm,yFFh݌w+HGZ_LOT쏴Ijw i~y14ӯR ZDǟ lG? :tDaw}~W<&?tE))h.]7uXt-M$63yI#WTo.(r07g2w]/_f7جlwcsc'ǿ_GK7ំψ.~з/㷺F .(ۯX"T0i P *1EQEQEy0ecxVG2R%Zz+N{:y~l&}ߦAYK YdrVʳ)h$ E??#|L5~?O]ھ}R;9v\li"KHCpؿVK;X{CºEV~8l0ƿ* ~]7FPID)wyGbY@??"?C_lo]l ĞWm?2!S%|؄9KCs ^msQnE֭4R{Y-mn4<$zż4wY5oWwMdg_O_wej\W,yQ$r #wf?WX| <3B·+?>mW[vlq( |aoMJ!?]GP]qj?O-Z'θ_^Z-Dӏ(F/.?.ޓS~}"xw^KM~OUo"cu$fP1S$;6-[^y{H .icFdD!P9~`{i{-o HdBqm4<T +@^ w;go*c<OxHYc4]C˨]ֱY&Ekc5̨FrE~Y|h>,*4_?۟ Lt|B%Ԯmn}&N[./AqkfUhr$ U~_M߂N/ 7 -^%]I,4EC,G-؟Ey?ij^!yS3A5yvX 2[Kc( ٢~*_៎:'!-kŞxTYxċqglgR/HIS'<{o٣@ѵ|_<1NCoa,ڬ]3##4Ͻ?g^+ߌ ~{ A5.m&Il慦_s"HYcie(_>2㻿kq]^vZ6b5:\3%FDkF`1K˾@?bԯ?x4.O_ ? CKT>~qKڼW5 EyB0 ?|G\xXxQg[.t?B J[C(Kvy!ufo@vco/n_C4xO񭟆Jln$HZ77ǿcfRѡSXn||U?|9w7׉/uS{Iĺ]rI rF_, w1u?bor6χaS/iޝayŭKdDqN EvLپ—?]F 9| Kdi"mi#KF @vϐxO LgPU]~HEgq4u10v5'&8ύ?ǀi/ [_ 薗k=UQY)єHI8 ሮCgXx?g=_EvakFI+"nW`x$WQ@rEc>|0n"}62iW7z֓ou5EGB +Ur_eYUu4htw?!+?ʟE?h("9"^]_Zh;3am ^g}>woe*M0u,gMmUg|^ci]gR,wѮ.&Ib杭$Wf O)I ?ܿ#ºn~ֱXi}[ZX[D#(4E x {K]~(|ֵj[GP&swq+ie}4;3;X$k о/|0׾!X݋x5?ZVIm@^I8gG!Z=RKEQE-s SOF^k3ԿFw5[iuM,4O09Y&c>\$_q ~*i)vgūGyPh][AA$j-D"8#t}?2W]XuGYX#{#g1HR8)?l5i|\Oox..ņ[Z$q$A 4PEJ]FXww,s ~ i >?j?QKH94QEV/E-dh1nOWQeK*G. cSsTEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPtw?!+?ʟE?hAG?CW?/UѣQ@Q@Q@Q@Q@?z?K/UӿѬQU?^?=SQiUWNF^Znn5{C*.tGu k1*De kquқw,:\\nrQEQEQEQEQEQEQEQE"~:k{_ObO~gI)dICL谡*9R2*K/d*4zS ?!+ ß?e3 sW'#l+S7o3chے_nWG7V$$?QFG/ ]ߊu٧Q4InMBlj{wkn\ deP x5(ѿfGP6$KLq:_LFπ,R$#~ǂJ+?/aPMHʝ8ꟲP?g@W ep|@#V?A?G΀?_ 1ɯ/[X:ieY_eP# FUG?2S||p@ >g4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWTS<~j?w~,S<)o"F_$쳎f x$xs9|M)t{gk?&FT%L;ȧȇԶ: Pj[|F}i+ 9t9o72YMI33 嘶-?A?'$|8 ӡ5-,"kڌzeđ)3ꇒ6ʩ T`T|?tj?i}=>_O 5ŅT$Au )!!DMoP SZo٧\@xZw/,Zm{B1gxIs x._A5Yx;MV][U΅aO%AO"h˦bWqK@\?ׅ,gn$Rddi#2FZVEFRWb:O#^ ?t^}ϸ_I$io7``Q@Q@Q@Q@Q@Q@Q@Q@5Է@= :~ӟC|W⻳ڮcP$#{2HYݘ )D7/?u}E|~ŸC'Q~ŸC'WP )D7/?u )D7/?u}E~h~пn5]s.wx$!~%v\J+(!H(fU,FXkp~ԟT_tO? ~3...r[[FeˆळY2O5K]dKoO Wfix{qZOuy^['rz? ð?/W A._Aw[`υ"ά,mg# F$q^s wR>\aO!y\aO!y(د6;*_sT%$43<^]̨3%-(a?OKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5ԒW^,f?axSo~ijrM5 XG. 1HXDD\*}E|~ŸC'Q~ŸC'W4\a147//u|Yh3߳63kko x_׊Ro[ʷz4 +(I$~V&?g9|kY|AA(ލ5+,JE ɷƏ_}^>]3C41^H#v+mg$g&i e F f'~wZxTӦek;my%TR\ Uk\aF ~ |6wM?U5ZE-e|-lf+{{i|UŴDKMB?xZd Z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (::nNZ?Y4AooY/V1XDJml)!UVI9$S:g=gh>ұ I}^2"I #G'+,|\:Ưc#G/ta%zBO",v^dEUHbP5xPZ>$vU.y6ky,&?A3ďwk+>̰E9ԡ.Hai4K'boWӥ5<-iS❝Zajsk;ySk8%$tbܡ*Oe9Fю(AcZ((((((((((((((((((((((((((0<_)oS𦕧jOF;A}#2Kg-'{,SB2~r5 V}MZm>-|{ Yޅ< oo vWʮ[OJ9^|Aށa'Ol\M!Hb|e @~gk?~ N|-ho5=R #*GaGDEgeSq?~4c[Kd|+_·NɆO+VKF` %nXNU*ď+'k+i>|_ Vv{ 3QN͸b JȠ,qG 1~AkºwB~0붷vHR˸δ%0Yf)$ic^C oA 4|~|C !FP:4P0D}j~ޮy4Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@u? wOy~ӣ/<ĸCF9S?QOwO>=}7Gf ? f`hlҼ}KCt;Z5Il5 >.moB,N *) Q[VYK<}þ"am/7jg8JG4@%Bړy?P-' c⽜|ZޥktfLFωI\mv}!(((((((((((( ۟ [ozp\>X7g?.<1*m*,P5.`[d 4R27,QQ@_euO_?gMbOD] y xc(%{O*ba&#,xy_1?_Q~&_=j~K m3n,|$oUx^j~kL} |]7F]Up@9Q@9QEQEQEQEQEQEQEQEQEQEQEB_' Y[ǟ hmF)OBmbkc5U[-6"OA';__n&~+GZixMdwB;RcI~5][D#P]|ʒ1o}nt{h"Q,@!$^AJU[]l>0t P Ӯ. ?H .uI|/̈^ZEV mE][h01(h@q@B QEQEQEQEQEQEQEQEQEQE',8w ; UKz'ebW-俲Z}E[n$_ڋ ^Co|){k5d47Ω#Mw2J0_:U@(o|;𦙮h:zͤWvapҠxD%$Ы+*A@TRoREPE'RnkCxl𭾻>wvj#mIwDi G#$FgWEz_n5߇>9KKPmpд;Hة9 "a@;u f|_'ԵwS]EQK{[ x#ƈ 3THna6߶ O]EqJg?!X5H6pݼ$Gq%:*p??]W Yυ /o_:-ڙd*^<%;4u K`$6 ? B9j n}haø6ջ7 տफ़*NP>hdEwNC:٣YP$40K-5 i~𦙡hzf-V:~alֶ6 H$#B(@h( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( l"E8_yO ~'/3>Vmn~?31`hnb>hEğ>+|As[ϛ 4~HUWȾe,${UB[{OO^ (eܼD1j6we?). L1R?&?$wk9l0B+i-E%{-Zgڹ`;kϿiڧs|ixbz}UUInqp+$&x/(a㿉>~4P|9 _MookǼ̶vewG":0?)>.9Ь~ |hyu4Z H/.fowXRT ,zڗן|Q |3oMYgoxOީ \wڄ`~[uEiBm-HtRVX#[@F]#Lq#/nDf 2-s*I7 >jo?y[͛y?ًg޻3Zn?zN8&:٧uU->1|.uojiaӛ\}13BCH??T#?n3}]fLj> $CMMxr$gv.D׋yE,aRA ]% f 1^)ޟqZCZ-̾mOsMqnd%Rg <Gn5|2yr[%z4l@OKt&)4- #%\O]~ i[TB"2aݔ2[C4xQ@ @Q@Q@g PE f (=3EQEQEQA`:PX APM~_ּOϙZ|WdӬdS!,kOOWKwZڄ?[i^-E',$($bHcd$iwO GYl//itP5xMƍg(U"1qs$~DC2IcP3?M/ZoFѯ g^; [{;io7``.qZi؂9#NM>DF2?Z~ʿ?~xJ6~S -m;ˁ +^$q*Ddটh'ُ·^/j48Yk=#M!Ԥ3bHM+%Ŀi:wFY Ė,{nɀd1B_ V??ାxK'm3IMߍ}F̂TYb[~lY_n|+4D,r8\"⿎o*?YS4㿆RxwXY.T#D8HMO"?3Yx'>!/J2D}藖A"왖TYpGn@?r29ח~?w?G;~k[ymb I L4QJ̒F Q}8&x\[4G&H;G=LEYY#p   ] ?N_?>&u".>thʿ MTKo:ob)e|e/\I}E-[}Fyi;"&Yfhp?_m?X|2<+T/oW;|Ow͊LGk/a?o:ZO“]ǞYϩ-I(t(5Gg~U?@_ܫ3Ki ̬O)?_K  ,q _7Iwl,eſ/5.WߞQW*Wտ?-?|'~;gi|7Rr<;n~{1yi\Y[Yh('$ G ogH i.amkao@8UQ@ VPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPs[:_mx#|OkgVi%mM?&/kZmP)@]MQGݽM,m_n?:((((uHc WOן ij4KOʛ)%22Q\}c~_`CO??}>0GS$1m!WxLo嫆}_?]4^Y! dϥٵojaO}Eb8.<;W u[kg/>6|Qԭ./K^ƱI+g%F PqiZ7zeF|A5]K?xD?d93?4zÍqf<~@#Bcc$$XṒB>Qρ~wogaZUyv\kX$d8_+ -fCj~?jQ=/uKʰ7.Z8)*ɱ#+Kմ.VۄGoi$wmG19 d|U \izkvdyUZYnUggyJ/oo؎5b?V?xnjOkcö7ou{A{ȏ,3kL\$S#l_OoO- Ə_ݛm vw j#Lkg?|5mxw֋q?t{ei2:Now}nuԊlGﺈoڿ <-;W|? i^gNO$idV4#2h1~,lߏ7>*]:,r4 q+'I^6H͛f Ȍ3O |Ҽϱ&akH iGwme'=y4P( kl`N>>(/+7qx476C>$Ԡo7Fd"$[{eW1K$(Q~x/ c|!w$wVf02XdPq-Ŵ$2 ޝKc~K+Ŀڇ&c/ ]xkh5k v71Co?l6DHa}k~-}Bo -][_^}U?ͪ9PAhhu P ^_>,| 5?$O.EXxCDx.IE4 m3%㿵Zx3G9Hż|Č%D]d?}gw?~ O𯃼+ho5=N2@Uݑ$ H般PwWVyDDŽnuFӭXm4U9y$wb"D\Lv x x_BMoWZ׉Ys6n MwݰI#lS+iP˼a+ 9h >J.feZeQ-ܡW͸b尪*GqVJwO5(|߉;6 {+Ʒ@ZK 62",s*YF3szEQEQEQE5В Ҿ):ofM?Þ"Ե?jW)kN -!u'(̷Nα?5 1z @I5/Y4__37>jy[= ?X}9'M6{($<wkv~`?P>!4O^ iW-&#" 1"Rd\V(VdfH-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERX3uj~`'7!|)#-.i]mⷊFm:\Z*ahF+\~VP?%ïO{6w=Ժ1#\Kq*)K n|?_ڗо+xr=B[ usy*hעE.%]8㷎ܱT i_):'ǫKk =BvHec K$ȋ\]$Iq%  fhR1X+OY~B$6<Wh(p둊7QFsӜQ@!`8'|:xW x-FtG} οL!?K!E 0Z-4h'x{O+*ɬƍȂ(Rr$϶d#4??ߵ^gX׎-ZBO+473oĦ8K';Hix'[ c>|aw\jB<YfV9XC((b83t+R:oԲ]> j[%(+oa!BBni$,/ |8u:70?fke֯TK}y( Irp*Eqƥ.qZZ()sؚZ(i؟'tѾ+9഻Xb'kK|<}kHkKlگ&gy~t嫕ME QEQEQEQEWտWloƟ mi xJJ2Mk~94@E##yrTRH G%𯏿P3Nx vsaużXC4w"7ْ QԮkhIGB>5<1 *[/< ])4VDmuVWI~Ňg ui4Yg5ig)D*Z\eI;[vNڍ׌bݛ˹$d}6PcgH1I#@qWUo⍍:dLMS BQ$w2o7 gNCCG?z׳c->n|+2i2/:DsZ~X2|d '+.mAzFC$W lAo’8XR ƺD^$kX]91oR2K)E| _qt_ QJZuQ5W͸bUUD"8ؗ sɠl'`(~ (IdWOς:]IK77zSښڭyʷ}4 ѻRWQ@_?UxXֵw"KIua tDMNvIos)h~y]? ho+@Bo|'F4ha;ͼz+<)sj -|? ~_4oNPYc Z7"#Hżchvmf,=&7y<Խb tmRS? :}߶Ei#nhVs*\y?:4 &!'[ 'ďkWÝ]+k_7 2.$D_!?wW0^jwˢxf]rX8 X2Y@s8~wgP%/ 56[xWfcpZ|a1aR9'Y%r%hOU?'wK+NO.@"Z$3+Yd%'ZM?hv>=^/,"鶓\7 na_<#xšf~hX}[ZXĂ8$cUU (A >ԴQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@}Y| %|3]S?_fOm%lwl޻˜[ b>!)ga]:Vկ[=Ay8͜ ҜՋFPhu$tsN=w ͱ@nI=2; *K9IamL&1*௎~ ?# =IF#QXLb<9iW{o[ |/~ 7%߿wט.7Ϙw@?P(>X|+T %?4/+Gn+<ۻvz4QIz7\PFh((((((((((((((((((((((((((((( xKJ= ]4kD֭%4d$X7Fed`C) ߵ$ࣚ PۿWn%a6K<VZ]K@+u4(?G^-~~MßxK;I52+1.RsipGi#:81 GK ӼYٷI{|? imcOox K[˸J9Qϝi#Ή 1 k?ѿGڐ> |tv^~0j|'Z(ݯ&7_&~x[ezT* &y,D.XK&yb@:n:-%ThZއ -"PPDRJ.#|WxF<S.~r;? ӒVM18s_C,>VB-eQ-eo5 $??<~> |/siYyWu}m1"y<ջB#tt?_"m~2Iy~.VW7wg٦~WM0[ftkm aل"P ɢ1((((((((((:W~,%5Fa+8R7e n$VQcos.~Zw>|FmitJ[o xNxGRH#xysJӲA@q м4zFB/|HcpFw p<2YlZ{x6,NH M_WڋcԼ??<|P𥨰tr}SGtiF[CqBY=+Ͼ9ɿ ii' 77g7QۍZg;F??٧Q얟~|?ae-ҧúcnw^(mbR)Sߡ?O⟊n4r_ l{Oxig@F5a _-#lb?Џ77/iktz>qH Ay#w/w «'ַW7zfK᫹фP$\-h+^XhGm),$ kpZdY [o;ڽŏ|I6D}s+ ̉ZbEI"h0=s_?N<~_Ÿuv*͵ơK~2^[aV%ߙ$t~,_OKcT>ū蚄:ߗ#D\г#i8de<(A((((((((((((((((((((((((((((/>ge_ u W RԃN@n 4/km,|#?fS7$5bĚd9K6~S -m;ˁ +^$q*D|5_?:|!U}3Þ@vmEn0eRUM6oGíC7^\ݶxbYҮ uٴ>]oNmak=5խ^$nX{kvt+DQqkOo7ſ~nYYOuJ])Ȥ~|._>OMxcT>ǫ蚌:ߗ#E'<,Ѿ'  =z{_f*Íp\>)xs^v0nE#ȪCpHf?||| 1|B< gp{d9>g ϖ_ɍpr#Fk'3}j!~j ϝ5a>~ku%wG26M 4Ksn,2"c 82ƝkboQ5=us7ޑZ~9rƮb@  O_^7{-;WG>o;G+n.3z EQ??PoHG>!lt?[ꚋga؎)_$$7\|/;W_lMkwv?WS[,4eCQr 7gs<+6 wq\Jp(M! R$b9$ $nTU7'AZGl|QihbYCa $^C<r7Q ~,W㏁,4ۿf[_~/|/wji#Mu5;̱O*3F^90&6ʜ'Ïw? ]*ij?lo4}w,R[Dz|F"s)AZaJ~IQ|{_|Ai'ķj[-ŝז{y# R ~x<.[Jɴmz VYO&2Bj0 A7ǿ'?_nhOX|8> ߅uef5H {Hc̊Jp$"Lh9/k?jz~ qx6?zJ-w,oqqżK4NV]oX dkw  G]CW~%{.G}i}oAŭ/̡dػᖝ_z}QZv<=s$M q< Z飒)#9E;W?<' :aq˫A,$){/&;5 RMOO[|)ٟ_VҴmBKD}p5^Z`a9$I@@Q_ ~& ·6S:ů~e։lSq|8?b,x/ďLGP𷌼-vl-2ZYYlJ+,eH4˟ad|5h>$t> uuKghgd"B%KW ٳox?%AxYҭfdwXVY)aN; u8~(wV|cm'|g ]Bm.~k~ YőI hU/FJ=@)`:;ҿw#hQCwcg΃yek\3!{hri/5'rwǺwKt:Tois}u| v1@l+H=  |?g) |Cl3 8kgI»)f!o>ik{[#MYh f2Ĭ@`ָk??W 3Hl?y˿M8/rx;Zψ*5j?lo~ u}^r;IQV xoR(DRۡ%.<np+>B~|rՇA;\@?DLHEPEPEPEPEPEPEPEPEP_þ$ ./㳹[;{(缷T% >Ɵ%ْLrhW;ovo|xcM։yA;^ #etFV O7QO?c.s{l[g\3g?WWέa+3ro/{pבyjџ-*]?&v:G =MezbE9%FA)_GYxšnjz~kV_\[ʁ)P7FVWRC+ P>faLli]7q^AuB7[y%@hGԕee$|$Xx[^1c4M>>̑.UcM;` 9$訠\-PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPFh$II'=w]4Dm%5 4 hY @^~Hsz_4{i%xM=oG1$Do~Ȗߵjpz'»Y}oqu==GBbG\ͱQ@ۇ??l`|-zn~|63i 2ibKO4 {` 6ۿ5/ cl"ǿxϤ,o46fxXoR`~46w(((((@h{OҀ? O e9?t4k>]xß|+kkkk~}^/%iച) ),S\ysg^Fto |!O?#gx/XC}{x%mo/Ede&Ya i?؟৊gUgztF ,4eOe,7MCxrEii@rlmbO59x'Ox\ ˧xu m4KytY_ܲ:sr U ?6Kf~Zw?oľƟ V6!jfu{MB)"/LwY- <7?ho nt[|7׬H WThbPc)1+FZݥ%(g5:g7V0ۿnP?E?-tHK-|-qIx.:I$Hv Ygd.{=LI H#{b2K<팼;Y?TCkܿ mO. o⥤:Ƶu1ä jM%V[65ħ͔K~n+ͮv5OZX^=@e)(Zh*F̠N-n_ t)=B]Nkm}iõDI$KkuwQ$"_iP}SN[Way%Kvx G!7o!ग़w~)|~(6:q|rKyD3O*E%ܹWeK3!hbOm?#cxk~i~϶~;XucenK4YVP?|7}~v?<3/zj[uT-^c)qnBgc$ilV9 o?_'77 ~z~_յ}cDRP;+{X̥̑d:|MC)kxeÿ)o\á#Sd"72_jr<h#hEH7Joد "x/ZMៈ5HGAxo oZw/6C$FY if%2|/~|/?h lx晥4z]#[C=€'dlۼ3~ s4{h~*Twm]6MV!XK)/~AS*Jo>۪D)nn$پI6p3*?U+Q]CE;4f͋IjE,pܘw*Gicx\Z9dz.Um$0g8&੾|s6cgsuxOI%t.|{iT-+G15?g|Q/k~O? +ڧkcShT H1 f-eD>`%_ĺ)k^KAk;`đPD"\"C#?N^|57x7Oִ?VO՝|VҪKIn^c1ib!dGOy {0A;BROeZ5jjdqoR,:ڛʑ >EĔº9Sx>=M/|2_KE]?*\@ߣezc k9u54h/$ 8M#O߉V: %n; $S!1Usy+Ku3? Kij zpHdK_:|sG%&GG x|*=/׀7;|̿WZ~>Zy~^ݛn0+,OVA5=MOo TI,K x.&[()om|%/>|?J_ x.ۻV,K84//Yg=뱙b=&={M7 9Ҵ+CiIyXLtKk$9;FDI;ſo_௟?W/<#:>lt潻 9ⶉa#%ټ7`ĉ^a[m`m|;$r]Wz堺@q46$2Cz\;?xx@)ĠJ*ֵMcUdr\ MX]JOɲP+ֳfO i?Pg~Ϩ6k PKl*y^[frǵK>$|~>xǀx⧁5 *3ͣZ;GOrw>S(e@BA=; Jtw? ~vR^Z[h;J`H/y|쮲;,*~?A_(!xt?_ ]h%d-PydA{X n"#q/xwO¡wmcCЬcQio*=LwW2(Qfnp￴G_ g4j?/+ ltբ./D[ٶ&I/,)!Ã*4.S{ri։x/]_6XK鶡'{kec,c 0<;XxI h({ [ygf3%ԄJ$P o?K࿟C+i|x-֛%ΌZ%ȒRInW[h巂%RVUM3)? diw~*ׯt{q,~[7tg2M7&(h)G1N??;C3?[S񎛦O |g`4 m}-EoYT.Hcݩ)u%~( ~ۯ o[bۈ$٦K7J$ǁ_ UԾehk4e/I_EFM|RzW~2|[#ڄ7'tM9l~o%[Y6/#;rfDGZ((((((((((((((((((((((((((((;Y/^O Z&Kj7 mkąY4E,PI OxI/-{\D-%5 < h @濙_9s B 'EPIxR[ybK2ĥVYw~Ÿp,MυFS,muˈ)urCAlf DQ[/RTght[yq{[w\:>V x_IeX%$[<2Mo.K7w1н}0_­'L<mt_x-;/K?h ]6lq++ۭXq܃|_i7o/4j2wxoI4lB7rF$QAF~9 ׼YhT~}<9t<17 AHwb_OWJx΅q],<9~%v*+HR5,U'  V?%~-O6ψ.\yI>Ҋ+ W~ѿNSxY : >'g{-٤Ėyiv8Ig#ހ?o&_9B7|SmPm,t|#RNtd,BԼQu-_]„񴛱k}A$Юqέ8l0[im'H'?य़m:?q _O<<.\yɈ>Ҋ+ ߱Kx{PO]ݜiB-ّ$9&<~S,@JU`v@9I dh'?|@sxGWR=MA|TK.PƟzÏf?>x]{33M[۱fy[2;67w~0e|C\UlV5H!$5!$v-W\_w~_Yh=n-3("8v—5P@?R@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ q3Rд'Sfi(.$ϦA#=T#kH}+S_g?XjB7e~7Gؾ&C q>_W4gðYO׍&vdN 2I WxZ!-+4- L]EO-$ 1D$q*(+!g#wHHegrV?HtP켸IJ3X 2h(((((2Fh,ZBg'-_%o.xK_~.ڄ1hDwGkVKyH|{qp;F8ǚ?§mGnԡFG`q1( SP.PEPEPEPEPEPQc9J5-w]4Dm%5 4 h@~)~{Ïu/׵M}|;Vi}nd6"<OW$x-~w~_sj\џ /bR: a2!1;,]RS1Z(<@Q@Q@Q@Q@Q@8dtŷ>||z񎧭,Z6N Kx3 < yDI)m?cwR7kI2VIw :x+_1it[ McFr@Q@ (($I{ x7~~uLy|դ} !h:?ޓ |t}75mEkϳFbKC(14 7ǯjW0xoEMH.K5|ĕͤom1EpZvLM~Q-Ɵ)fJ A4O;{#SR[kypexѵ93ds5@jU'H =~,|0; zżѪ̋2NaxYCڤei%_SZ?6/5?:,lQ)?ٸC@۵6vIi߇>sc6Z|xcT"&-#r8^bF|[xºfz~kV_ڍ\J)P7FVWRC) hto~(jl.t|/̔]GpՅ6W8P'~זo?#g>}5wmj)ȎHŜlbR3 ycs xSӾៃL&oK>aJ؎dK\}kPTs{W ij`[կqսI%Ѿ"Dtwr@H[JSES]76{c(ۣ9Cmd|Ee6Ezo-ZJ*2"`Qn('9_s?Vnyk[7lpD$ )DkY;E#t_)k6zޟ#u_ jw@VIc` ja@J<Y_>?35?C*ffqJUxGVG¼n? O6^MٿE]gE}G+i&t ̒ӫpȸ.bO(oǟ$'vn;Vmp~ S@oe?ͬ.91/<}[E{jz,/5{ˋ>;{xC9hđE1$U )wGgB(/s-Zv+snۭ s+~vO-4;iG[k)1+ ۪0~ilAumog:jSޤK=hF3Oxg}U'}RRTWXKk<2H"eg K 1Fu_jeׅ|UkEa[4` (%"nZ&e /mP*K 1s86"ig,<a9?~-?O'mn$[k)44̅u-!%$uo ^=ZP˨\naI$X_gQ@9Sd8?֜X ׏~ߟ.0iZ+-Gxy+EK >i?7{|:xus W-P]ே{[X#jq\\C"fY#{FP {y6js.tk:|>+t2Dn4-7s$Ԡo7F-q2H ?O me4|5?oDk6B=CHTYx0 ʩ"G4yx`+a_ۣWqѾ(|/ֿ|?yboTcyf#ܹ\edHFsҀ ( (:@ů:%oiWZޯ{?,iˍZG1ڊq ?/ z_Qkf ]JU{%]D`?[jN-|cѬ紒 .Hgԥ.VH 9 i#2G$Csȷ?ग़+5~ x~{H5(屷hdS1Kx8$g3XiP+gKeVVnn8 H {REPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^2@+(c?g_~hm4b_@IB+8YVo2C7x 7aSj0\\FdGCN 2K|]?^pGowymy.&qki*0h`|4B/>1j|CC쮬o5F%Qa(Udw1:2N~VI`#xo1_p~m->(2J[1s?u[.%I;d/6.So߁w_olj_ |/$K~Oc^cػ/>bA;?ZMK/ڝfxplr$J#Zۦo pOlr;=#.@[}''K/6xV) 3]H#L3.9Dج0.[ R `c43͡`g+ 2=WUu$^}KB XZ$tޢH&]> |iF/-|R iއk[ǒ4m6sEx 3 a:A <+'E3NQ5x.oXb}\n$ 9_*X_:(ZmH+? w/Yj,ݾנQI5j{&DcI}!)?_PG"ZmmZ^/}o[i-oR1qpb3Fgcmv~QORv^3U?Z`g$|6`Vf|3*3FUEQEQFhA'_ʯ <߄r MOK'źF2vͷtW5̩3rt?dx?gAyve.7Ca^Hi%C"I>)7?~uzخoXWRXX[JМ/-REx 9z1|?k{ "R\GeegHc!Ij};-rAub _@H [G;8(2JE}!E֐H(@k \~j~ 6|JҒ_M?fWHkK"! Eɼ^8_pgBF;9|=*6Zx:d2*CG":$n?/+⯄?fC ZU}sϯi(O/u,ryS57s6XYk¿< cx0Ϋ}Wu .FO.xY}#  B#Oد qG#~)w|Q ejGk&qsЭ7z|n$WHѬ~xGl+A~6 I]xn$'?u ukz͵dLFWhdڅvfQJ}z/u_OED4|LG<+/BpΰaW bF'F3Y/ i.Zcmkco@#DUUU Ѡ(rk O[p; _eό4e8PPI$dyΖ/#.sh%tG _F]5O3ǸX>|>k)o}d+Y>n ։Z}7)si}o*hBVHY]I H"!6oڗ߆l$$7?tM"2(FĢ[bC/kK??ċM?/Z g]aisvi'5ڻ#-oMq2Lj(: ?SG@jmytG@FsԚ1~lj@ iFI7~'Mym߳)nWA|qл ȭm[W(Uۥ+74<vON)P b>{1> 0~[Ɠy5^]~x!$3 Q,pFc?1 Q@Q@6D,gqN?,?_7JV»-;DZ"mkh*Z9x bXf"/*[oWi7lO~ u!tiٛ99]5јi1K$2k+'l+}C7i58h!7\]Y&G"qҗ?_\_W PxQ5 |Bݬ7:u"7q#$bKI's7R#23WCFx{~2v?xZ`uXln\yFFogW+Zzk-ۥͭRXfI#tfVF29?hًH|=N>8xgKoq$mVaAȋ+sm<4ed[v@^t+xb[-y?ٍy/b|ϷKT?eR|3jW5 H`ѧ0G鎆F ;Cjr$_/ړ v៊Yt#6/뺮)eG g#|tqn;+%mOq8՝_Mxo6:LA+HԱg$j|6xV]xD[5U "²!H`lq$_GbvoݱG |?=N7M^<|7+~̮ W;G_F;.zY, &yi?-Z"͙Qh>8alO h &5St1{?5y(1(UӬ6ӾO ŭk3,-r\dH#7"+Fcocsto 4_J3ZeQ-/q&ªhqƠ o&qᏄ~o5}nK(m.|A纕cv`'OFQES]K~( 4zڏuw ηo Z%͡5jv4+# 1xGD/+MbU-|I-$&d\΍VO(C?g/ًYѼCP8xK̏o'[ilh8k&v^ $}wD*yYQO!o67:toOxeuhsm ,"_?ȟYi|;HxI+9fMۼs<'=gK<xUZNjմܶi#y мU8[fmTaO'#|9m}UxCOg!myn.% O3B؈ (?a?NFaFn&eZeQ-Gq&`*qqG/!@$ s֖ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9 -|? j_4oOPYc Z7"#E#rO5+wwfwZrz4+kow/'#yFI f|(FߵPLGn5 vUd_oǘR-mY#uynWEo<9~-/L߆t;H|Ն/_2EUrMz opM6C⭅»3w8uf{uEK얲  - Qu es MPI?   Es una implementacin de un estndar del modelo de paso de mensajes Atiende a una estructura SPMD (Single Program/Multiple Data) Imgenes del programa en cada mquina Datos locales a cada maquina Todos los procesadores trabajan con el mismo programa, pero los datos pueden ser diferentes. Como asignar tareas diversas con datos diversos? Los datos se comparten por medio del paso de mensajes Consiste en una serie de libreras C ZZZ^Z\pd     D ^ . Qu es MPI?    Caractersticas de MPILPrincipalmente dirigido a proveer portabilidad del cdigo fuente. No esta totalmente alcanzado todava Ofrece gran funcionalidad Diferentes tipos de comunicaciones Soporta gran cantidad de tipo de datos Soporta datos definidos por el usuario Manejo de diferentes topologas MPI se escribi con algunos puntos un poco perdidos En teora las aplicaciones MPI se pueden compilar con cualquier implementacin MPI existente, pero es posible que el comportamiento sea ligeramente diferente Necesidad de recursos que no estn garantizados por la implementacin MPI NO ES PORTABLE TOTALMENTEPrPUPPPrUPortabilidad de los programas Aspectos a considerar debido a la variedad de implementaciones MPI Suponer buffering. No asumir que el envo de datos es tipo buffer Suponer sincronizacin de barrera para llamadas colectivas. En MPI, la comunicacin colectiva es bloqueante, pero el programa no debe depender del tipo de sincronizacin (en este caso barrera) Ambigedades en la comunicacin. Los mensajes enviados son los que se espera recibirhDZZZD1; 4L I Local Area Multiprocesor (LAM), Entorno y sistema de desarrollo para procesamiento en paralelo que trabaja sobre redes formadas por procesadores independientes Utiliza programacin estndar de paso de mensajes (MPI) LAM proporciona al usuario una librera API para el paso de mensajes entre diferentes nodos que colaboran para la realizacin de una aplicacin paralela Funciona en una gran cantidad de plataformas UNIX y permite trabajar con diferentes tipos de maquinas mezclados!Local Area Multiprocesor (LAM), Las diferentes mquinas pueden conectarse a travs de una red de rea local o a travs de Internet Caractersticas: Completa implementacin del estndar MPI Existen diversas herramientas de desarrollo Posibilidad      de mezclar diferentes tipos de maquinas en una misma red Es posible activar o desactivar nodos dentro de la red Si un nodo cae se detecta y es posible recuperarlo cuando vuelva a funcionar Existen libreras adicionales MPI para la programacin LAM&uZuZ=MPICH y MPICH2   >Como funcionan?  3Se debe compilar con las librerias adecuadas. mpicc -o s.exe sistema.c -lm Se debe ejecutar con las instrucciones adecuadas. En general en maquinas grandes, ese problema no es nuestro problema source /opt/Modules/3.2.6/init/bash module add mvapich2 Mpirun/mpiexec --comm=pmi -np $NP S.exe4.) wf 4\          x <                "Como funciona MPI? /   0Como funciona MPI?   ( ComunicadoresA cada proceso se le asigna un numero (rank) consecutivo empezando desde 0 Un mismo procesador puede pertenecer a varios comunicadores diferentes, y su  rank sera diferente en cada uno de ellos MPI_COMM_WORLD es un comunicador que engloba a todos los procesos Los mensajes se marcan con una etiqueta o tag que sirve para distinguir entre diferentes tiposgZgP'o2) ComunicadoresPara recibir un mensaje no siempre es necesario especificar el  rank de la fuente aunque si lo es para enviarlo  context sirve para evitar conflictos entre el codigo de diferentes programadores. Se aade automaticamente MPI_COMM_SELF es un comunicador que solo engloba a un solo miembro MPI_COMM_PARENT engloba los grupos de un proceso y de su proceso padrekZkP@/('nClases de llamadas MPI kInicializar, dirigir y finalizar comunicacin Iniciar y finalizar comunicacin Identificar nmero de procesos, qu proceso corre en cada procesador y crear subgrupos de procesadores MPI_Init, MPI_Finalice Comunicacin punto a punto MPI_Send, MPI_Recv Comunicacin colectiva MPI_Bcast, MPI_Scatter, MPI_Gather, MPI_Reduce Creacin de tipos de datos MPI_Type_struct.ZZZZZ/ZZZ./ pComunicacin punto a punto Un procesador enva y otro recibe Comunicacin elemental en MPI Dos modos de comunicacin Bloqueante: La rutina de enviar o recibir no termina hasta que la operacin se ha completado. Asegura que los datos llegan al receptor sin error. No bloqueante: La funcin enva o recibe inmediatamente. El procesador puede hacer otras tareas durante el envo Cuatro procedimientos para transmitir mensajes standard  no hay garanta de que el recv se inicio synchronous  se completa cuando el recv comenz. buffered  Se completa cuando el dato se copio al buffer local. (No implica que se recibi bien) ready  El usuario dice cuando se completo la recepcin Los recv son mas sencillos: Se completan cuando el data esta listo para usarseZZZ/ZZO ZZ/ + & XZ    Y8GrComunicacin punto a punto MPI_Send (void *buf, int count, MPI Datatype dtype, int dest, int tag, MPI_Comm comm); MPI_Recv (void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_status *status); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados o recibidos dtype: tipo de datos enviados o recibidos dest/source: procesador destino/fuente tag: etiqueta de comunicacin comm: comunicador de envo o recepcin status: cdigo de retorno de la operacin de recepcin, P7P5,Xg2x Comunicacin colectiva Comunicaciones de un procesador a varios y de varios procesadores a uno Se reduce la posibilidad de error Una llamada a una rutina colectiva reemplaza a varias llamadas a rutinas punto a punto Cdigo fuente ms fcil de leer Simplifica depuracin y mantenimiento Normalmente, la rutina colectiva es ms rpida Est ms optimizada que su equivalente expresada por medio de rutinas punto a puntotjW &/TjW &/T t Comunicacin colectiva eOperacin broadcast: Un nico proceso enva copia de los mismos datos a todos los procesos de un grupo MPI_Bcast (void *buf, int count, MPI_Datatype dtype, int root, MPI_Comm comm); buf: localizacin en memoria de los datos count: Nmero de datos del tipo indicado enviados dtype: tipo de datos enviados root: procesador fuente comm: comunicador de envo<gO g> U Hv Comunicacin colectiva Operacin reduction: Un nico proceso recoge datos de todos los procesos de un grupo y los combina segn una operacin aritmtica MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype dtype, MPI_Op op, int root, MPI_Comm com); sendbuf: localizacin en memoria de los datos recvbuf: buffer donde se combinan los datos recibidos count: nmero de datos del tipo indicado recibidos dtype: tipo de datos recibidos op: operacin aritmtica que se aplica a los datos recibidos root: procesador destino com: comunicador de recepcinLn +n*> p d#z Comunicacin colectiva  Operacin scatter: Los datos de un procesador se dividen en N bloques (N n de procesos), y se envan a cada proceso segn orden de rank MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); Operacin gather: Paso inverso, se agrupan los datos de todos los procesos y se envan a uno solo MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm);f b bP y S 1   2  3 #ifdef CONMPI //Broadcasteo la info MPI_Bcast(&k,uno, MPI_DOUBLE,cero,MPI_COMM_WORLD); MPI_Bcast(&v,uno, MPI_DOUBLE,cero, MPI_COMM_WORLD); . . . #endif& (x                      4 0#ifdef CONMPI if(rank==cero) { Temptot=(double*)malloc(sizeof(double)*nprocs*Neq); curtot=(double*)malloc(sizeof(double)*nprocs*Neq); #endif /*Abro archivos donde guardo los datos (en p=cero)*/ fp1=fopen("Mag.dat","a+"); fp2=fopen("Prom.dat","a+"); #ifdef CONMPI } #endif1 Z1                         A             5 {#ifdef CONMPI if(rank==cero) { start=MPI_Wtime(); #else start=clock(); #endif #ifdef CONMPI } #endif| |                    : %Barrier: MPI_Barrier(MPI_COMM_WORLD); & 34    ?(Mediciones de eficiencia y escalabilidad)) ) Speed Up Tiempo Paralelo/(Tiempo Serie) terico: recta! Eficiencia P*Tiempo Paralelo/(Tiempo Serial) terico: Unidad    @ Mediciones    A Referencias   , Bibliografia en la pagina de la materia The MPI Forum, http://www.mpi-forum.org. http://www-unix.mcs.anl.gov/mpi/www/www3 (| 6J  , ,                08P+   /oqsuwy{   0 L0 um0(  x  c $;0`      0@/ |&Paradigma de Transferencia de Mensajes'( 2'&  5   0xC^ P`0 Cada procesador corre un programa Todas las variables son privadas La comunicacin se realiza a travs de subrutinas especiales( 2     6 I P lTrans-mensajes  R  C *AUntitledd ] H  0@޽h ? a(r_OzS