Fortran 2003/2008 Lectures - Prace Training Portal
Fortran 2003/2008 Lectures - Prace Training Portal
Fortran 2003/2008 Lectures - Prace Training Portal
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Pekka Manninen<br />
Sami Saarinen<br />
David Henty<br />
<strong>Fortran</strong> <strong>2003</strong>/<strong>2008</strong><br />
September 11-13, 2012<br />
PRACE Advanced <strong>Training</strong> Centre<br />
CSC – IT Center for Science Ltd, Finland
All material (C) 2012 by the authors.<br />
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0<br />
Unported License, http://creativecommons.org/licenses/by-nc-sa/3.0/
Agenda<br />
Tuesday<br />
Wednesday<br />
9.00-9.45 Getting started with <strong>Fortran</strong><br />
10.00-10.45 Arrays in <strong>Fortran</strong><br />
11.00-12.00 Exercises<br />
12.00-13.00 Lunch break<br />
13.00-13.45 Procedures & modules<br />
14.00-16.00 Exercises<br />
9.00-9.45 Derived datatypes<br />
10.00-10.45 File I/O<br />
11.00-12.00 Exercises<br />
12.00-13.00 Lunch break<br />
13.00-13.45 Exercises<br />
14.00-14.45 Other handy <strong>Fortran</strong> features<br />
15.00-16.00 Exercises<br />
Thursday<br />
9.00-9.45<br />
Coarray programming model<br />
and basic syntax<br />
10.00-11.00 Exercises<br />
11.15-12.00 Further coarray features<br />
12.00-13.00 Lunch break<br />
13.00-14.00 Exercises<br />
14.15-15.00 Advanced coarray features<br />
15.15-16.00 Exercises
Web resources<br />
CSC’s <strong>Fortran</strong>95/<strong>2003</strong> Guide (in Finnish) for free<br />
http://www.csc.fi/csc/julkaisut/oppaat<br />
<strong>Fortran</strong> wiki: a resource hub for all aspects of <strong>Fortran</strong> programming<br />
http://fortranwiki.org<br />
GNU <strong>Fortran</strong> online documents<br />
http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gfortran<br />
Code examples<br />
http://www.nag.co.uk/nagware/examples.asp<br />
http://www.personal.psu.edu/jhm/f90/progref.html<br />
Mistakes in <strong>Fortran</strong> 90 Programs That Might Surprise You<br />
http://www.cs.rpi.edu/~szymansk/OOF90/bugs.html
Ú±®¬®¿² ¬¸®±«¹¸ ¬¸» ¿¹»<br />
ÐßÎÌ ×æ ÙÛÌÌ×ÒÙ ÍÌßÎÌÛÜ É×ÌØ ÚÑÎÌÎßÒ<br />
Ú±®¬®¿² îððíæ ³¿±® ®»ª··±²ô ¿¼¼·²¹ »ò¹ò ±¾»½¬ó±®·»²¬»¼<br />
º»¿¬«®»<br />
Ú±®¬®¿² çëñîððí · ¬¸» ½«®®»²¬ ¼» º¿½¬± ¬¿²¼¿®¼<br />
̸» ´¿¬»¬ ¬¿²¼¿®¼ · Ú±®¬®¿² îððè ø¿°°®±ª»¼ îðïð÷ô ¿<br />
³·²±® «°¹®¿¼» ¬± îððí<br />
Ñ«¬´·²»<br />
Ú·®¬ »²½±«²¬»® ©·¬¸ Ú±®¬®¿²<br />
Ê¿®·¿¾´» ¿²¼ ¬¸»·® ¿·¹²³»²¬<br />
ݱ²¬®±´ ¬®«½¬«®»<br />
Ô±±µ ú Ú»»´<br />
ÐÎÑÙÎßÓ ¯«¿®»Á®±±¬Á»¨¿³°´»<br />
ÿ ݱ³³»²¬ ¬¿®¬ ©·¬¸ ¿² »¨½´¿³¿¬·±² °±·²¬ò<br />
ÿ DZ« ©·´´ º·²¼ ¼¿¬¿ ¬§°» ¼»½´¿®¿¬·±²ô ½±«°´» ¿®·¬¸³»¬·½ ±°»®¿¬·±²ÿ<br />
¿²¼ ¿² ·²¬»®º¿½» ¬¸¿¬ ©·´´ ¿µ ¿ ª¿´«» º±® ¬¸»» ½±³°«¬¿¬·±²ò<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÎÛßÔ ææ ¨ô §<br />
×ÒÌÎ×ÒÍ×Ý ÍÏÎÌ ÿ Ú±®¬®¿² ¬¿²¼¿®¼ °®±ª·¼» ³¿²§ ½±³³±²´§ «»¼ º«²½¬·±²ÿ<br />
ݱ³³¿²¼ ´·²» ·²¬»®º¿½»ò ßµ ¿ ²«³¾»® ¿²¼ ®»¿¼ ·¬ ·²<br />
ÉÎ×ÌÛ øöôö÷ ùÙ·ª» ¿ ª¿´«» ø²«³¾»®÷ º±® ¨æù<br />
ÎÛßÜ øöôö÷ ¨<br />
§ã¨ööîõï ÿ б©»® º«²½¬·±² ¿²¼ ¿¼¼·¬·±² ¿®·¬¸³»¬·½<br />
ÉÎ×ÌÛ øöôö÷ ù¹·ª»² ª¿´«» º±® ¨æùô ¨<br />
ÉÎ×ÌÛ øöôö÷ ù½±³°«¬»¼ ª¿´«» ±º ¨ööî õ ïæùô §<br />
ÿ Ю·²¬ ¬¸» ¯«¿®» ®±±¬ ±º ¬¸» ¿®¹«³»²¬ § ¬± ½®»»²<br />
ÉÎ×ÌÛ øöôö÷ ù½±³°«¬»¼ ª¿´«» ±º ÍÏÎÌø¨ööî õ ï÷æùô ÍÏÎÌø§÷<br />
ÛÒÜ ÐÎÑÙÎßÓ ¯«¿®»Á®±±¬Á»¨¿³°´»<br />
ê<br />
ɸ§ ´»¿®² Ú±®¬®¿²á<br />
É»´´ «·¬»¼ º±® ²«³»®·½¿´ ½±³°«¬¿¬·±²<br />
Ô·µ»´§ ±ª»® ëðû ±º ½·»²¬·º·½ ¿°°´·½¿¬·±² ¿®» ©®·¬¬»² ·²<br />
Ú±®¬®¿²<br />
Ú¿¬ ½±¼» ø½±³°·´»® ½¿² ±°¬·³·¦» ©»´´÷<br />
Ø¿²¼§ ¿®®¿§ ¼¿¬¿ ¬§°»<br />
Ý´¿®·¬§ ±º ½±¼»<br />
ᮬ¿¾·´·¬§ ±º ½±¼»<br />
Ñ°¬·³·¦»¼ ²«³»®·½¿´ ´·¾®¿®·» ¿ª¿·´¿¾´»<br />
±«®½» ½±¼»<br />
ݱ³°·´·²¹ ¿²¼ ´·²µ·²¹<br />
±¾»½¬ ½±¼»<br />
´·²µ»®<br />
»¨»½«¬¿¾´»<br />
´·²µ»® ±«¬°«¬<br />
ø±°¬·±²¿´÷<br />
Ú±®¬®¿² ¬¸®±«¹¸ ¬¸» ¿¹»<br />
×ÒÝÔËÜÛ<br />
º·´» ½±³°·´»® ±«¬°«¬<br />
½±³°·´»®<br />
ø±°¬·±²¿´÷<br />
³±¼«´»<br />
´·¾®¿®·»<br />
Ê¿®·¿¾´»<br />
Ö±¸² Éò Þ¿½µ« »¬ ¿´ øïçëì÷æ ̸» ×ÞÓ Ó¿¬¸»³¿¬·½¿´<br />
Ú±®³«´¿ Ì®¿²´¿¬·²¹ ͧ¬»³<br />
Û¿®´§ §»¿® ¼»ª»´±°³»²¬æ Ú±®¬®¿² ×× øïçëè÷ô Ú±®¬®¿² ×Ê<br />
øïçêï÷ô Ú±®¬®¿² êê ú Þ¿·½ Ú±®¬®¿² øïçêê÷<br />
Ú±®¬®¿² éé øïçéè÷<br />
Ú±®¬®¿² çð øïççï÷ ³¿±® ®»ª··±²ô Ú±®¬®¿² çë øïççë÷ ¿<br />
³·²±® ®»ª··±² ¬± ·¬<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎ ææ ²ð<br />
ÎÛßÔ ææ ¿ô ¾<br />
ÎÛßÔ ææ ®ïãðòð<br />
ÝÑÓÐÔÛÈ ææ ½<br />
ÝÑÓÐÔÛÈ ææ ·³¿¹Á²«³¾»®ãøðòïô ïòð÷<br />
ÝØßÎßÝÌÛÎøÔÛÒãèð÷ ææ °´¿½»<br />
ÝØßÎßÝÌÛÎøÔÛÒãèð÷ ææ ²¿³»ãùÖ¿³» Þ±²¼ù<br />
ÔÑÙ×ÝßÔ ææ ¬»¬ð ã òÌÎËÛò<br />
ÔÑÙ×ÝßÔ ææ ¬»¬ï ã òÚßÔÍÛò<br />
ÎÛßÔô ÐßÎßÓÛÌÛÎ ææ °·ãíòïìïëç<br />
Ê¿®·¿¾´» ³«¬ ¾» ¼»½´¿®»¼ ¿¬ ¬¸»<br />
¾»¹·²²·²¹ ±º ¬¸» °®±¹®¿³ ±®<br />
°®±½»¼«®»<br />
̸» ·²¬®·²·½ ¼¿¬¿ ¬§°» ·² Ú±®¬®¿² ¿®»<br />
×ÒÌÛÙÛÎô ÎÛßÔô ÝÑÓÐÔÛÈô<br />
ÝØßÎßÝÌÛÎ ¿²¼ ÔÑÙ×ÝßÔ<br />
̸»§ ½¿² ¿´± ¾» ¹·ª»² ¿ ª¿´«» ¿¬<br />
¼»½´¿®¿¬·±²<br />
ݱ²¬¿²¬ ¼»º·²»¼ ©·¬¸ ¬¸»<br />
ÐßÎßÓÛÌÛÎ ½´¿«» ¬¸»§ ½¿²²±¬ ¾»<br />
¿´¬»®»¼ ¿º¬»® ¬¸»·® ¼»½´¿®¿¬·±²
ÐÎÑÙÎßÓ ²«³¾»®<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ß«¬±³¿¬·½ ½¸¿²¹» ±º ®»°®»»²¬¿¬·±²ô<br />
×ÒÌÛÙÛÎ ææ ·<br />
©±®µ ¾»¬©»»² ¿´´ ²«³»®·½ ·²¬®·²·½<br />
ÎÛßÔ ææ ®<br />
¼¿¬¿ ¬§°»<br />
ÝÑÓÐÔÛÈ ææ ½ô ½½<br />
· ã é<br />
® ã ïòêïèðíì<br />
½ ã îòéïèîèïè ÿ¿³» ¿ ½ ã ÝÓÐÔÈøîòéïèîèïè÷<br />
½½ ã ®öøïôï÷<br />
ÝÓÐÔÈø®÷<br />
ÉÎ×ÌÛ øöôö÷ ·ô ®ô ½ô ½½<br />
ÛÒÜ ÐÎÑÙÎßÓ<br />
ß·¹²³»²¬ ¬¿¬»³»²¬<br />
Ñ«¬°«¬ ø±²» ·²¬»¹»® ¿²¼ ®»¿´ ¿²¼ ¬©± ½±³°´»¨ ª¿´«»÷ æ<br />
é ïòêïèðíì øîòéïèîèîô ðòðððððð÷ øïòêïèðíìô ïòêïèðíì÷<br />
ر© ½¿² × ½±²ª»®¬ ²«³¾»® ¬±<br />
½¸¿®¿½¬»® ¬®·²¹ ¿²¼ ª·½» ª»®¿á Í»»<br />
×ÒÌÛÎÒßÔ ×ñÑ ·² ¬¸» Ú·´» ×ñÑ ´»½¬«®»ò<br />
ÿ ÜÑ ´±±° ©·¬¸ ¿² ·²¬»¹»® ½±«²¬»® ø½±«²¬ ½±²¬®±´´»¼÷<br />
×ÒÌÛÙÛÎ ææ ·ô ¬»°·¦»ô Ò«³¾»®ÑºÐ±·²¬<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ³¿¨Á°±·²¬ãïððððð<br />
ÎÛßÔ ææ ¨Á½±±¼·²¿¬»ø³¿¨Á°±·²¬÷ô ¨ô ¬±¬¿´«³<br />
òòò<br />
¬»°·¦»ãî<br />
ÜÑ · ã ïô Ò«³¾»®ÑºÐ±·²¬ô ¬»°·¦»<br />
¨Á½±±®¼·²¿¬»ø·÷ ã ·ö¬»°·¦»öðòðë<br />
ÛÒÜ ÜÑ<br />
ÿ ݱ²¼·¬·±² ½±²¬®±´´»¼ ´±±° øÜÑ ÉØ×ÔÛ÷<br />
¬±¬¿´«³ ã ðòð<br />
ÎÛßÜøöôö÷ ¨<br />
ÜÑ ÉØ×ÔÛ ø¨ â ð÷<br />
¬±¬¿´«³ ã ¬±¬¿´«³ õ ¨<br />
ÎÛßÜøöôö÷ ¨<br />
ÛÒÜ ÜÑ<br />
Ú±®¬®¿²çë<br />
Ñ°»®¿¬±®<br />
ß®·¬¸³»¬·½ ±°»®¿¬±®<br />
ÎÛßÔ ææ ¨ô§<br />
×ÒÌÛÙÛÎ ææ · ã ïð<br />
¨ãîòðööøó·÷ ÿ°±©»® º«²½¬·±² ¿²¼ ²»¹¿¬·±² °®»½»¼»²½»æ º·®¬<br />
¨ã¨öÎÛßÔø·÷ ÿ³«´¬·°´·½¿¬·±² ¿²¼ ¬§°» ½¸¿²¹» °®»½»¼»²½»æ »½±²¼<br />
¨ã¨ñîòð ÿ¼·ª··±² °®»½»¼»²½»æ »½±²¼<br />
·ã·õï ÿ¿¼¼·¬·±² °®»½»¼»²½»æ ¬¸·®¼<br />
·ã·óï ÿ«¾¬®¿½¬·±² °®»½»¼»²½»æ ¬¸·®¼<br />
λ´¿¬·±²¿´ ±°»®¿¬±®òÔÌò<br />
±® ä ÿ´» ¬¸¿²<br />
òÔÛò ±® äã ÿ´» ¬¸¿² ±® »¯«¿´ ¬±<br />
òÛÏò ±® ãã ÿ»¯«¿´ ¬±<br />
òÒÛò ±® ñã ÿ²±¬ »¯«¿´ ¬±<br />
òÙÌò ±® â ÿ¹®»¿¬»® ¬¸¿²<br />
òÙÛò ±® âã ÿ¹®»¿¬»® ¬¸¿² ±® »¯«¿´ ¬±<br />
Ô±¹·½¿´ ±°»®¿¬±®òÒÑÌò<br />
ÿ´±¹·½¿´ ²»¹¿¬·±² °®»½»¼»²½»æ º·®¬<br />
òßÒÜò ÿ´±¹·½¿´ ½±²«²½¬·±² °®»½»¼»²½»æ »½±²¼<br />
òÑÎò ÿ´±¹·½¿´ ·²½´«·ª» ¼·«²½¬·±² °®»½»¼»²½»æ ¬¸·®¼<br />
ݱ²¬®±´ ¬®«½¬«®»æ ´±±°ÿ<br />
ÜÑ ´±±° ©·¬¸±«¬ ´±±° ½±²¬®±´<br />
ÎÛßÔ ææ ¨ô ¬±¬¿´«³ô »°<br />
¬±¬¿´«³ ã ðòð<br />
ÜÑ<br />
ÎÛßÜøöôö÷ ¨<br />
×Ú ø¨ ä ð÷ ÌØÛÒ<br />
ÛÈ×Ì ÿ »¨·¬ ¬¸» ´±±°<br />
ÛÔÍÛ ×Ú ø¨ â «°°»®´·³·¬÷ ÌØÛÒ<br />
ÝÇÝÔÛ ÿ ¼± ²±¬ »¨»½«¬» ¿²§ ¬¿¬»³»²¬ ¾«¬<br />
ÿ ½§½´» ¾¿½µ ¬± ¬¸» ¾»¹·²²·²¹ ±º ¬¸» ´±±°<br />
ÛÒÜ ×Ú<br />
¬±¬¿´«³ ã ¬±¬¿´«³ õ ¨<br />
ÛÒÜ ÜÑ<br />
Ú±®¬®¿²çë<br />
ß®®¿§<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ Ó ã ïððô Ò ã ëðð<br />
×ÒÌÛÙÛÎ ææ ·¼¨øÓ÷<br />
ÎÛßÔ ææ ª»½¬±®øðæÒóï÷<br />
ÎÛßÔ ææ ³¿¬®·¨øÓô Ò÷<br />
ÝØßÎßÝÌÛÎ ø´»² ã èð÷ ææ ½®»»² ø îì÷<br />
ÿ ±®<br />
×ÒÌÛÙÛÎô Ü×ÓÛÒÍ×ÑÒøïæÓ÷ ææ ·¼¨<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒøðæÒóï÷ ææ ª»½¬±®<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒøÓô Ò÷ ææ ³¿¬®·¨<br />
ÝØßÎßÝÌÛÎø´»²ãèð÷ô ¼·³»²·±²øîì÷ ææ ½®»»²<br />
Þ§ ¼»º¿«´¬ô ·²¼»¨·²¹ ¬¿®¬ º®±³ ï<br />
ݱ²¬®±´ ¬®«½¬«®»æ »´»½¬ ½¿»<br />
ÍÛÔÛÝÌ ÝßÍÛ ¬¿¬»³»²¬<br />
³¿¬½¸» ¬¸» »²¬®·» ±º ¿<br />
´·¬ ¿¹¿·²¬ ¬¸» ½¿» ·²¼»¨<br />
Ѳ´§ ±²» º±«²¼ ³¿¬½¸ ·<br />
¿´´±©»¼<br />
Ë«¿´´§ ¿®¹«³»²¬ ¿®»<br />
½¸¿®¿½¬»® ¬®·²¹ ±®<br />
·²¬»¹»®<br />
ÜÛÚßËÔÌ ¾®¿²½¸ ·º ²±<br />
³¿¬½¸ º±«²¼<br />
ݱ²¬®±´ ¬®«½¬«®»æ ´±±°òòò<br />
×ÒÌÛÙÛÎ ææ ·<br />
ÔÑÙ×ÝßÔ ææ ·Á°®·³»Á²«³¾»®ô<br />
¬»¬Á°®·³»Á²«³¾»®<br />
òòò<br />
ÍÛÔÛÝÌ ÝßÍÛ ø·÷<br />
ÝßÍÛ øîôíôëôé÷<br />
·Á°®·³»Á²«³¾»® ã òÌÎËÛò<br />
ÝßÍÛ øïôìôêôèæïð÷<br />
·Á°®·³»Á²«³¾»® ã òÚßÔÍÛò<br />
ÝßÍÛ ÜÛÚßËÔÌ<br />
·Á°®·³»Á²«³¾»®ã¬»¬Á°®·³»Á²«³¾»®ø·÷<br />
ÛÒÜ ÍÛÔÛÝÌ<br />
òòò<br />
Ú±®¬®¿²çë<br />
ÐÎÑÙÎßÓ ¬»¬Á·º<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÎÛßÔ ææ ¨ô§ô»°ô¬<br />
ݱ²¬®±´ ¬®«½¬«®»æ ½±²¼·¬·±²¿´<br />
ÉÎ×ÌÛøöôö÷ù Ù·ª» ¨ ¿²¼ § æù<br />
ÎÛßÜøöôö÷ ¨ô §<br />
»° ã ÛÐÍ×ÔÑÒø¨÷<br />
×Ú øßÞÍø¨÷ â »°÷ ÌØÛÒ<br />
¬ã§ñ¨<br />
ÛÔÍÛ<br />
ÉÎ×ÌÛøöôö÷ù¼·ª··±² ¾§ ¦»®±ù<br />
¬ãðòð<br />
ÛÒÜ ×Ú<br />
ÉÎ×ÌÛøöôö÷ù §ñ¨ ã ùô¬<br />
ÛÒÜ ÐÎÑÙÎßÓ<br />
Ú±®¬®¿²çë<br />
ݱ²¬®±´ ¬®«½¬«®» »¨¿³°´»<br />
ÐÎÑÙÎßÓ ¹½¼<br />
ÿ ݱ³°«¬» ¬¸» ¹®»¿¬»¬ ½±³³±² ¼·ª·±®ô Û«½´·¼»¿² ¿´¹±®·¬¸³<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎ ææ ³ô ²ô ¬<br />
ÉÎ×ÌÛøöôö÷ù Ù·ª» °±·¬·ª» ·²¬»¹»® ³ ¿²¼ ² æù<br />
ÎÛßÜøöôö÷ ³ô ²<br />
ÉÎ×ÌÛøöôö÷ù³æùô ³ôù ²æùô ²<br />
°±·¬·ª»Á½¸»½µæ ×Ú ø³ â ð òßÒÜò ² â ð÷ ÌØÛÒ<br />
³¿·²Á¿´¹±®·¬¸³æ ÜÑ ÉØ×ÔÛ ø² ñã ð÷<br />
¬ ã ÓÑÜø³ô²÷<br />
³ ã ²<br />
² ã ¬<br />
ÛÒÜ ÜÑ ³¿·²Á¿´¹±®·¬¸³<br />
ÉÎ×ÌÛøöôö÷ùÙ®»¿¬»¬ ½±³³±² ¼·ª·±®æ ùô³<br />
ÛÔÍÛ<br />
ÉÎ×ÌÛøöôö÷ùÒ»¹¿¬·ª» ª¿´«» »²¬»®»¼ù<br />
ÛÒÜ ×Ú °±·¬·ª»Á½¸»½µ<br />
ÛÒÜ ÐÎÑÙÎßÓ ¹½¼<br />
Ú±®¬®¿²çë<br />
Ô¿¾»´ ½¿² ¾» ¹·ª»² ¬±<br />
½±²¬®±´ ¬®«½¬«®» ¿²¼ «»¼<br />
·² ½±²«²½¬·±² ©·¬¸ »ò¹ò »¨·¬<br />
¿²¼ ½§½´» ¬¿¬»³»²¬
ÐÎÑÙÎßÓ °´¿½»¬»¬<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÔÑÙ×ÝßÔ ææ ·²Á¯«¿®»ïô ·²Á¯«¿®»î<br />
ÎÛßÔ ææ ¨ô§<br />
ß²±¬¸»® »¨¿³°´»<br />
ï<br />
î<br />
ÉÎ×ÌÛøöôö÷ ùÙ·ª» °±·²¬ ½±±®¼·²¿¬» ¨ ¿²¼ §ù<br />
ÎÛßÜ øöôö÷ ¨ô §<br />
·²Á¯«¿®»ï ã ø¨ âã ðò òßÒÜò ¨ äã îò òßÒÜò § âã ðò òßÒÜò § äã îò÷<br />
·²Á¯«¿®»î ã ø¨ âã ïò òßÒÜò ¨ äã íò òßÒÜò § âã ïò òßÒÜò § äã íò÷<br />
×Ú ø·²Á¯«¿®»ï òßÒÜò ·²Á¯«¿®»î÷ ÌØÛÒ ÿ ·²·¼» ¾±¬¸<br />
ÉÎ×ÌÛøöôö÷ б·²¬ ©·¬¸·² ¾±¬¸ ¯«¿®»<br />
ÛÔÍÛ ×Ú ø·²Á¯«¿®»ï÷ ÌØÛÒ ÿ ·²·¼» ¯«¿®» ï ±²´§<br />
ÉÎ×ÌÛøöôö÷ б·²¬ ·²·¼» ¯«¿®» ï<br />
ÛÔÍÛ ×Ú ø·²Á¯«¿®»î÷ ÌØÛÒ ÿ ·²·¼» ¯«¿®» î ±²´§<br />
ÉÎ×ÌÛøöôö÷ б·²¬ ·²·¼» ¯«¿®» î<br />
ÛÔÍÛ<br />
ÿ ¾±¬¸ ¿®» òÚßÔÍÛò<br />
ÉÎ×ÌÛøöôö÷ б·²¬ ±«¬·¼» ¾±¬¸ ¯«¿®»<br />
ÛÒÜ ×Ú<br />
ÛÒÜ ÐÎÑÙÎßÓ °´¿½»¬»¬<br />
Ú±®¬®¿²çë<br />
ͱ«®½» ½±¼» ®»³¿®µß<br />
ª¿®·¿¾´» ²¿³» ½¿² ¾» ²± ´±²¹»® ¬¸¿² íï ½¸¿®¿½¬»®ø½±²¬¿·²·²¹<br />
±²´§ ´»¬¬»®ô ¼·¹·¬ ±® «²¼»®½±®»ô ³«¬ ¬¿®¬<br />
©·¬¸ ¿ ´»¬¬»®÷<br />
Ó¿¨·³«³ ®±© ´»²¹¬¸ · ïíî ½¸¿®¿½¬»®<br />
̸»®» ½¿² ¾» ³¿¨ íç ½±²¬·²«¿¬·±² ´·²»<br />
·º ¿ ´·²» · »²¼»¼ ©·¬¸ ¿³°»®¿²¼ øú÷ô ¬¸» ´·²» ½±²¬·²«»<br />
±²¬± ¬¸» ²»¨¬ ´·²»ò<br />
Ò± ¼·¬·²½¬·±² ¾»¬©»»² ´±©»® ¿²¼ «°°»®½¿» ½¸¿®¿½¬»®<br />
ݸ¿®¿½¬»® ¬®·²¹ ¿®» ½¿» »²·¬·ª»<br />
ͱ«®½» ½±¼» ®»³¿®µ<br />
ÿ ݸ¿®¿½¬»® ¬®·²¹ ¿®» ½¿» »²·¬·ª»<br />
ÝØßÎßÝÌÛÎøÔÛÒãíî÷ ææ ½¸ïô ½¸î<br />
Ô±¹·½¿´ ææ ¿²<br />
½¸ï ã ù¿ù<br />
½¸î ã ùßù<br />
¿² ã ½¸ï òÛÏò ½¸î<br />
ÉÎ×ÌÛøöôö÷ ¿² ÿ ÑËÌÐËÌ º®±³ ¬¸¿¬ ÉÎ×ÌÛ ¬¿¬»³»²¬ ·æ Ú<br />
ÿ ɸ»² ¬®·²¹ ¿®» ½±³°¿®»¼<br />
ÿ ¬¸» ¸±®¬»® ¬®·²¹ · »¨¬»²¼»¼ ©·¬¸ ¾´¿²µ<br />
ÉÎ×ÌÛøöôö÷ ùßù òÛÏò ùß ù ÿÑËÌÐËÌæ Ì<br />
ÉÎ×ÌÛøöôö÷ ùßù òÛÏò ù ßù ÿÑËÌÐËÌæ Ú<br />
ÿ ͬ¿¬»³»²¬ »°¿®¿¬·±²æ ²»©´·²» ¿²¼ »³·½±´±²ô å<br />
ÿ Í»³·½±´±² ¿ ¿ ¬¿¬»³»²¬ »°¿®¿¬±®<br />
¿ ã ¿ ö ¾å ½ ã ¼öö¿<br />
ÿ ̸» ¿¾±ª» · »¯«·ª¿´»²¬ ¬± º±´´±©·²¹ ¬©± ´·²»<br />
¿ ã ¿ ö ¾<br />
½ ã ¼öö¿<br />
Ú±®¬®¿²çë<br />
Í«³³¿®§<br />
Ú±®¬®¿² çëñîððí · ¼»°·¬» ·¬ ´±²¹ ¸·¬±®§ ó ¿ ³±¼»®²<br />
°®±¹®¿³³·²¹ ´¿²¹«¿¹» »°»½·¿´´§ º±® ½·»²¬·º·½<br />
½±³°«¬·²¹<br />
Ê»®¿¬·´»ô ¯«·¬» »¿§ ¬± ´»¿®²ô °±©»®º«´<br />
ײ ±«® º·®¬ »²½±«²¬»®ô ©» ¼·½«»¼<br />
Ê¿®·¿¾´» ú ¼¿¬¿ ¬§°»<br />
ݱ²¬®±´ ¬®«½¬«®»æ ´±±° ú ½±²¼·¬·±²¿´<br />
Ñ°»®¿¬±®<br />
7
ß®®¿§ §²¬¿¨<br />
ÐßÎÌ ××æ ÚÑÎÌÎßÒ ßÎÎßÇÍ<br />
ײ ±´¼»® Ú±®¬®¿²ô ¿®®¿§ ©»®» ¬®¿¼·¬·±²¿´´§ ¿½½»»¼<br />
»´»³»²¬ó¾§ó»´»³»²¬ ¾¿·<br />
Ó±¼»®² Ú±®¬®¿² ¸¿ ¿ ©¿§ ±º ¿½½»·²¹ »ª»®¿´ »´»³»²¬<br />
·² ±²» ¹± ¿®®¿§ §²¬¿¨<br />
§øæ÷ ã §øæ÷ õ ßøæ ô Ö÷ ö ¨øÖ÷<br />
ß®®¿§ §²¬¿¨ °±¬»²¬·¿´´§ ·³°®±ª» ½±¼» ®»¿¼¿¾·´·¬§<br />
ß®®¿§ §²¬¿¨ ³¿§ ¿´± ¹·ª» ¬¸» Ú±®¬®¿² ½±³°·´»® ¿ ½¸¿²½»<br />
º±® ¾»¬¬»® °»®º±®³¿²½» ±°¬·³·¦¿¬·±²<br />
Ñ«¬´·²»<br />
Í·¹²·º·½¿²½» ±º Ú±®¬®¿² ¿®®¿§<br />
ß®®¿§ §²¬¿¨ ú ¿®®¿§ »½¬·±²<br />
ܧ²¿³·½ ³»³±®§ ¿´´±½¿¬·±²<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
ß®®¿§ §²¬¿¨<br />
ß®®¿§ §²¬¿¨ ¿´´±© º±® ´» »¨°´·½·¬ ÜÑ ´±±°<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ Ó ã ìô Ò ã ë<br />
ÎÛßÔ øµ·²¼ ã è÷ ææ ßøÓôÒ÷ ô ¨øÒ÷ô §øÓ÷<br />
×ÒÌÛÙÛÎ ææ × ô Ö<br />
§øæ÷ ã ð<br />
ÑËÌÛÎÁÔÑÑÐ æ ¼± Ö ã ïô Ò<br />
×ÒÒÛÎÁÔÑÑÐ æ ¼± × ã ïô Ó<br />
§øæ÷ ã §øæ÷ õ ßøæ ô Ö÷ ö ¨øÖ÷<br />
»²¼ ¼± ×ÒÒÛÎÁÔÑÑÐ<br />
»²¼ ¼± ÑËÌÛÎÁÔÑÑÐ<br />
Í·¹²·º·½¿²½» ±º Ú±®¬®¿² ¿®®¿§<br />
Ú±®¬®¿² ¿®®¿§ »²¿¾´» ¿ ²¿¬«®¿´ ¿²¼ ª»®¿¬·´» ©¿§ ¬±<br />
¿½½» ³«´¬·ó¼·³»²·±²¿´ ¼¿¬¿ ¼«®·²¹ ½±³°«¬¿¬·±²<br />
Ó¿¬®·½»ô ª»½¬±®ôòòò<br />
ß®®¿§ ¸¿ °¿®¬·½«´¿® ¼¿¬¿ ¬§°» ø¿³» º±® ¿´´ »´»³»²¬÷<br />
Ü·³»²·±² °»½·º·»¼ ·² ¬¸» ª¿®·¿¾´» ¼»½´¿®¿¬·±²<br />
Ú±®¬®¿² «°°±®¬ «° ¬± é ¼·³»²·±²¿´ ¿®®¿§<br />
ß®®¿§ §²¬¿¨<br />
Û´»³»²¬ó¾§ó»´»³»²¬ ·²·¬·¿´·¦¿¬·±²<br />
¼± ã ðô ïð<br />
ª»½¬±® ø÷ ã ð<br />
·¼¨ ø÷ ã <br />
»²¼ ¼±<br />
Ë·²¹ ¿®®¿§ §²¬¿¨ ·² ·²·¬·¿´·¦¿¬·±²<br />
ª»½¬±® ã ð<br />
ÿ ±®<br />
ª»½¬±®øæ÷ ã ð<br />
·¼¨øðæïð÷ ã øñ øô ã ðô ïð÷ ñ÷<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ Ó ã ïððô Ò ã ëðð<br />
×ÒÌÛÙÛÎ ææ ·¼¨øÓ÷ô ´³øóîæî÷<br />
ÎÛßÔ ææ ³¿¬®·¨øÓô Ò÷<br />
ÿ ±®<br />
×ÒÌÛÙÛÎô Ü×ÓÛÒÍ×ÑÒøÓ÷ ææ ·¼¨ô ·¼¨îô ·¼¨í<br />
ß®®¿§ ¼»½´¿®¿¬·±²<br />
ײ¼»¨·²¹ ¬¿®¬ º®±³ ï ¾§ ¼»º¿«´¬<br />
Ü·ºº»®»²¬ ·²¼»¨·²¹ ½¿² ¾» ¼»º·²»¼ ·² ¼»½´¿®¿¬·±²<br />
ß®®¿§ »½¬·±²<br />
É·¬¸ Ú±®¬®¿² ¿®®¿§ §²¬¿¨ ©» ½¿² ¿½½» ¿ °¿®¬ ±º ¿²<br />
¿®®¿§ ·² ¿ °®»¬¬§ ·²¬«·¬·ª» ©¿§æ ¿®®¿§ »½¬·±²<br />
Í«¾ÁÊ»½¬±® ø íæÒõè÷ ã ð<br />
Ûª»®§Á̸·®¼ ø ïæíöÒõï æ í ÷ ã ï<br />
Ü·¿¹ÁÞ´±½µ ø ·ïæ·õïô îæõî ÷ ã µ<br />
Í»½¬·±² »²¿¾´» « ¬± ®»º»® ¬± ø¿§÷ ¿ «¾ó¾´±½µ ±º ¿<br />
³¿¬®·¨ô ±® ¿ «¾ó½«¾» ±º ¿ íÜó¿®®¿§æ<br />
ÎÛßÔøµ·²¼ ã è÷ ææ ß ø ïðððô ïððð÷<br />
×ÒÌÛÙÛÎ øµ·²¼ ã î÷ ææ °·¨»´ÁíÜøîëêô îëêô îëê÷<br />
ßøîæëððô íæíððæí÷ ã ìòð<br />
°·¨»´ÁíÜ øïîèæïëðô ëêæèðô ïæîëêæè÷ ã íîððð<br />
9
ß®®¿§ »½¬·±²<br />
Þ» ¿©¿®» ±ºæ ©¸»² ½±°§·²¹ ¿®®¿§ »½¬·±²ô ¬¸»² ¾±¬¸ ´»º¬<br />
¿²¼ ®·¹¸¬ ¸¿²¼ ·¼» ±º ¬¸» ¿·¹²³»²¬ ¬¿¬»³»²¬ ¸¿ ¬±<br />
¸¿ª» ½±²º±®³·²¹ ¼·³»²·±² æ<br />
ÔØÍøïæíô ðæç÷ ã ÎØÍøóîæðô îðæîç÷ ÿ ̸· · ÑÕ<br />
ÿ ¾«¬ ¸»®» · ¿² »®®±® æ<br />
ÔØÍøïæîô ðæç÷ ã ÎØÍøóîæðô îðæîç÷<br />
Ó»³±®§ ¿´´±½¿¬·±² ©·¬¸ ¿«¬±³¿¬·½ ¿®®¿§<br />
ÍËÞÎÑËÌ×ÒÛ ÝßÔÝËÔßÌÛøÓô Ò÷<br />
×ÒÌÛÙÛÎô ×ÒÌÛÒÌø×Ò÷ ææ Óô Ò ÿ ײ¬»²¼»¼ ¼·³»²·±² ±º ¬¸» ¿®®¿§<br />
×ÒÌÛÙÛÎ ææ ·¼¨øðæÓóï÷ ÿ ß² ¿«¬±³¿¬·½ ¿®®¿§<br />
ÎÛßÔøµ·²¼ ã è÷ ææ ³¿¬øÓôÒ÷ ÿ ß² ¿«¬±³¿¬·½ ¿®®¿§<br />
ÿ Ò± »¨°´·½·¬ ßÔÔÑÝßÌÛ ¾«¬ ²± ½¸»½µ «°±² º¿·´«®» »·¬¸»®<br />
ÿ Ë» ·¼¨ ú ³¿¬ ¿«¬±³¿¬·½ ¿®®¿§ ¸»®»<br />
ÝßÔÔ ÜÑÁÍÑÓÛÌØ×ÒÙøÓô Òô ·¼¨ô ³¿¬÷<br />
ÿ Ò± »¨°´·½·¬ ÜÛßÔÔÑÝßÌÛ ó ³»³±®§ ¹»¬ ®»½´¿·³»¼ ¿«¬±³¿¬·½¿´´§<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ÝßÔÝËÔßÌÛ<br />
ܧ²¿³·½ ³»³±®§ ¿´´±½¿¬·±²<br />
ͱ º¿® ·² ±«® »¨¿³°´» ¬¸» ¿®®¿§ ¼·³»²·±² ¸¿ª» ¾»»²<br />
¼»½´¿®»¼ ¿¬ ½±³°·´» ¬·³»æ<br />
³»³±®§ ¿´´±½¿¬·±² · ¬¿¬·½<br />
׺ ¿² ¿®®¿§ ·¦» ¼»°»²¼ ±² ¬¸» ·²°«¬ ¬± °®±¹®¿³ô ·¬<br />
³»³±®§ ¸±«´¼ ¾» ¿´´±½¿¬»¼ ¿¬ ®«²¬·³»æ<br />
³»³±®§ ¿´´±½¿¬·±² ¾»½±³» ¼§²¿³·½<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
Þ«·´¬ó·² º«²½¬·±² ½¿² ¿°°´§ ª¿®·±« ±°»®¿¬·±² ±² ©¸±´»<br />
¿®®¿§ô ²±¬ «¬ ¿®®¿§ »´»³»²¬ß<br />
¿ ®»«´¬ »·¬¸»® ¿²±¬¸»® ¿®®¿§ ±® «¬ ¿ ½¿´¿® ª¿´«» ·<br />
®»¬«®²»¼<br />
ß «¾»¬ »´»½¬·±² ¬¸®±«¹¸ ³¿µ·²¹ · °±·¾´»<br />
ܧ²¿³·½ ³»³±®§ ¿´´±½¿¬·±²<br />
Ú±®¬®¿² °®±ª·¼» ¬©± ¼·ºº»®»²¬ ³»½¸¿²·³ ¬± ¿´´±½¿¬»<br />
³»³±®§ ¼§²¿³·½¿´´§ ¬¸®±«¹¸ ¿®®¿§æ<br />
ß®®¿§ ª¿®·¿¾´» ¼»½´¿®¿¬·±² ¸¿ ¿² ßÔÔÑÝßÌßÞÔÛ ø±® ¿<br />
ÐÑ×ÒÌÛÎ÷ ¿¬¬®·¾«¬»ô ¿²¼ ³»³±®§ · ¿´´±½¿¬»¼ ¬¸®±«¹¸ ¬¸»<br />
ßÔÔÑÝßÌÛ ¬¿¬»³»²¬ô ¿²¼ º®»»¼ ¬¸®±«¹¸ ÜÛßÔÔÑÝßÌÛ<br />
ß ª¿®·¿¾´»ô ©¸·½¸ · ¼»½´¿®»¼ ·² ¬¸» °®±½»¼«®» ©·¬¸ ·¦»<br />
·²º±®³¿¬·±² ½±³·²¹ º®±³ ¬¸» ¿®¹«³»²¬ ´·¬ ±® º®±³ ¿<br />
³±¼«´»ô · ¿² ¿«¬±³¿¬·½ ¿®®¿§ ó ²± ßÔÔÑÝßÌÛ · ²»»¼»¼ô<br />
²»·¬¸»® ÜÛßÔÔÑÝßÌÛ<br />
Ó¿µ·²¹ ¿²¼ «» ±º ¿®®¿§ ø·²¬®·²·½÷ º«²½¬·±² · ±º¬»²<br />
¿½½±³°¿²·»¼ ©·¬¸ «» ±º ÚÑÎßÔÔ ¿²¼ ÉØÛÎÛ ¿®®¿§<br />
¬¿¬»³»²¬ß®®¿§<br />
·²¬®·²·½ º«²½¬·±²<br />
Í×ÆÛ ø¿®®¿§ Åô ¼·³Ã÷ ®»¬«®² ý ±º »´»³»²¬ ·² ¬¸» ¿®®¿§ô<br />
±°¬·±²¿´´§ ¿´±²¹ ¬¸» °»½·º·»¼ ¼·³»²·±²<br />
ÍØßÐÛ ø¿®®¿§÷ ®»¬«®² ¿² ×ÒÌÛÙÛÎ ª»½¬±® ½±²¬¿·²·²¹ Í×ÆÛ<br />
±º ¿®®¿§ ©·¬¸ ®»°»½¬ ¬± »¿½¸ ±º ·¬ ¼·³»²·±²<br />
ÝÑËÒÌ øÔÁ¿®®¿§ Åô¼·³Ã÷ ®»¬«®² ¬¸» ½±«²¬ ±º »´»³»²¬<br />
©¸·½¸ ¿®» òÌÎËÛò ·² ¬¸» ÔÑÙ×ÝßÔ ÔÁ¿®®¿§<br />
ÍËÓ ø¿®®¿§Åô ¼·³ÃÅô ³¿µÃ÷ æ «³ ±º ¬¸» »´»³»²¬ô<br />
±°¬·±²¿´´§ ¿´±²¹ ¿ ¼·³»²·±²ô ¿²¼ ±°¬·±²¿´´§ «²¼»® ³¿µ<br />
ܧ²¿³·½ ³»³±®§ ¿´´±½¿¬·±²<br />
×ÒÌÛÙÛÎ ææ Óô Òô ¿´´±½Á¬¿¬<br />
×ÒÌÛÙÛÎô ßÔÔÑÝßÌßÞÔÛ ææ ·¼¨øæ÷<br />
ÎÛßÔøµ·²¼ ã è÷ô ßÔÔÑÝßÌßÞÔÛ ææ ³¿¬øæôæ÷<br />
Ó ã ïðð<br />
Ò ã îðð<br />
ßÔÔÑÝßÌÛ ø ·¼¨ øðæÓï÷ ô ÍÌßÌã¿´´±½Á¬¿¬ ÷<br />
×Ú ø¿´´±½Á¬¿¬ ñã ð÷ ÝßÔÔ ¿¾±®¬ø÷<br />
ßÔÔÑÝßÌÛ ø ³¿¬ øÓôÒ÷ ô ÍÌßÌã¿´´±½Á¬¿¬ ÷<br />
×Ú ø¿´´±½Á¬¿¬ ñã ð÷ ÝßÔÔ ¿¾±®¬ø÷<br />
òòò<br />
ÜÛßÔÔÑÝßÌÛ ø·¼¨ ô ³¿¬÷<br />
д»¿» ¼± ®»³»³¾»® ¿ ÜÛßÔÔÑÝßÌÛ<br />
º±® »ª»®§ ßÔÔÑÝßÌÛ ¬¿¬»³»²¬ «»¼ ÿÿ<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²ßÒÇ<br />
øÔÁ¿®®¿§ Åô ¼·³Ã÷ ®»¬«®² ¿ ½¿´¿® ª¿´«» ±º òÌÎËÛò ·º<br />
¿²§ ª¿´«» ·² ÔÑÙ×ÝßÔ ÔÁ¿®®¿§ · º±«²¼ ¬± ¾» òÌÎËÛò<br />
ßÔÔ øÔÁ¿®®¿§ Åô ¼·³Ã÷ ®»¬«®² ¿ ½¿´¿® ª¿´«» ±º òÌÎËÛò ·º ¿´´<br />
ª¿´«» ·² ÔÑÙ×ÝßÔ ÔÁ¿®®¿§ ¿®» òÌÎËÛò<br />
Ó×ÒÊßÔ ñÓßÈÊßÔ ø¿®®¿§ Åô¼·³Ã Åô ³¿µÃ÷ ®»¬«®² ¬¸»<br />
³·²·³«³ñ³¿¨·³«³ ª¿´«» ·² ¿ ¹·ª»² ¿®®¿§ Å¿´±²¹<br />
°»½·º·»¼ ¼·³»²·±²Ã Åô «²¼»® ³¿µÃ<br />
Ó×ÒÔÑÝñÓßÈÔÑÝ ø¿®®¿§ Åô ³¿µÃ÷ ®»¬«®² ¿ ª»½¬±® ±º<br />
´±½¿¬·±²ø÷ Åô «²¼»® ³¿µÃô ©¸»®» ¬¸»<br />
³·²·³«³ñ³¿¨·³«³ ª¿´«»ø÷ ·ñ¿®» º±«²¼<br />
10
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
×ÒÌÛÙÛÎ ææ Óô Ò<br />
ÎÛßÔ ææ ÈøÓôÒ÷ô ÊøÒ÷<br />
ÐÎ×ÒÌ öôÍ×ÆÛøÈ÷ô Í×ÆÛøÊ÷ ÿ Óô Òô<br />
Ò<br />
ÐÎ×ÒÌ öôÍØßÐÛøÈ÷ ÿ Óô Ò<br />
ÐÎ×ÒÌ öôÍ×ÆÛøÍØßÐÛøÈ÷÷ ÿ î<br />
ÐÎ×ÒÌ öôÝÑËÒÌøÈ âã ð÷<br />
ÐÎ×ÒÌ öôÍËÓøÈô Ü×Óãîô ÓßÍÕãÈ ä ï÷<br />
ÐÎ×ÒÌ öôßÒÇøÊ â óï ò¿²¼ò Ê ä ï÷<br />
ÐÎ×ÒÌ öôßÔÔøÈ âã ðô Ü×Óãï÷<br />
ÐÎ×ÒÌ öôÓ×ÒÊßÔøÊ÷ô ÓßÈÊßÔøÊ÷<br />
ÐÎ×ÒÌ öôÓ×ÒÔÑÝøÊ÷ô ÓßÈÔÑÝøÊ÷<br />
Û¨¿³°´» ±º ¿®®¿§ ½±²¬®±´ ¬¿¬»³»²¬<br />
×ÒÌÛÙÛÎ ææ ô ·¨øë÷<br />
·¨øæ÷ ã øñ øô ãïô·¦»ø·¨÷÷ ñ÷<br />
ÉØÛÎÛ ø·¨ ãã ð÷ ·¨ ã óçççç<br />
ÉØÛÎÛ ø·¨ ä ð÷<br />
·¨ ã ó·¨<br />
ÛÔÍÛÉØÛÎÛ<br />
·¨ ã ð<br />
ÛÒÜ ÉØÛÎÛ<br />
×ÒÌÛÙÛÎ ææ <br />
ÎÛßÔ ææ ¿øïððôïðð÷ô ¾øïðð÷ô ½øïðð÷<br />
ÿ Ú·´´ ·² ¼·¿¹±²¿´ ³¿¬®·¨<br />
ÚÑÎßÔÔ øãïæïðð÷ ¿øô÷ ã ¾ø÷<br />
ÿ Ú·´´ ·² ´±©»® ¾·ó¼·¿¹±²¿´ ³¿¬®·¨<br />
ÚÑÎßÔÔ øãîæïðð÷ ¿øôóï÷ ã ½ø÷<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
ÎÛÍØßÐÛ ø¿®®¿§ô ¸¿°»÷ ®»¬«®² ¿ ®»½±²¬®«½¬»¼ ¿®®¿§<br />
©·¬¸ ¼·ºº»®»²¬ ¸¿°» ¬¸¿² ·² ¬¸» ·²°«¬ ¿®®¿§ô º±® »¨¿³°´»æ<br />
Ý¿² ¾» «»¼ ¿ ¿ ·²¹´» ´·²» ¬¿¬»³»²¬ ¬± ·²·¬·¿´·¦» ¿² ¿®®¿§<br />
ø±º¬»² ·² »¨°»²» ±º ®»¿¼¿¾·´·¬§÷<br />
Ý®»¿¬» º®±³ ¿² Óó¾§óÒ ³¿¬®·¨ ¿ ª»½¬±® ±º ´»²¹¬¸ Ó¨Ò<br />
×ÒÌÛÙÛÎ ææ Óô Ò<br />
ÎÛßÔ ææ ßøÓô Ò÷ô ÊøÓöÒ÷<br />
ÿ Ý¿®¾±²ó½±°§ ß ¬± Ê ©·¬¸±«¬ ´±±°<br />
Ê ã ÎÛÍØßÐÛøßô ÍØßÐÛøÊ÷÷<br />
Í«³³¿®§<br />
ß®®¿§ ³¿µ» Ú±®¬®¿² ´¿²¹«¿¹» ¿ ª»®§ ª»®¿¬·´» ª»¸·½´» º±®<br />
½±³°«¬¿¬·±²¿´´§ ·²¬»²·ª» °®±¹®¿³ ¼»ª»´±°³»²¬<br />
Ë·²¹ ·¬ ¿®®¿§ §²¬¿¨ô ª»½¬±® ¿²¼ ³¿¬®·½» ½¿² ¾»<br />
·²·¬·¿´·¦»¼ ¿²¼ «»¼ ·² ¿ ª»®§ ·²¬«·¬·ª» ©¿§<br />
ܧ²¿³·½ ³»³±®§ ¿´´±½¿¬·±² »²¿¾´» ·¦·²¹ ±º ¿®®¿§<br />
¿½½±®¼·²¹ ¬± °¿®¬·½«´¿® ²»»¼<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±² º«®¬¸»® ·³°´·º§ ½±¼·²¹ »ºº±®¬<br />
¿²¼ ·³°®±ª» ½±¼» ®»¿¼¿¾·´·¬§<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²<br />
ͱ³» ¿®®¿§ º«²½¬·±² ³¿²·°«´¿¬» ª»½¬±®ñ³¿¬®·½» »ºº»½¬·ª»´§ æ<br />
ÜÑÌÁÐÎÑÜËÝÌ ø¿ô ¾÷ ®»¬«®² ¿ ¼±¬ °®±¼«½¬ ±º ¬©± ª»½¬±®<br />
ÓßÌÓËÔ ø¿ô ¾÷ ®»¬«®² ³¿¬®·¨ ³«´¬·°´§ ±º ¬©± ³¿¬®·½»<br />
ÌÎßÒÍÐÑÍÛ ø¿÷ ®»¬«®² ¬®¿²°±»¼ ±º ¬¸» ·²°«¬ ³¿¬®·¨<br />
×ÒÌÛÙÛÎ ææ Ôô Óô Ò<br />
ÎÛßÔ ææ ßøÔôÓ÷ô ÞøÓôÒ÷ô ÝøÔôÒ÷<br />
ÎÛßÔ ææ ßÁ¬®øÓôÔ÷<br />
ÎÛßÔ ææ ÊïøÒ÷ô ÊîøÒ÷ô ÜÑÌÐ<br />
ßÁ¬® ã ÌÎßÒÍÐÑÍÛøß÷<br />
Ý ã ÓßÌÓËÔøßô Þ÷<br />
ÜÑÌÐ ã ÜÑÌÁÐÎÑÜËÝÌøÊïô Êî÷<br />
ß®®¿§ ·²¬®·²·½ º«²½¬·±²ß®®¿§<br />
½±²¬®±´ ¬¿¬»³»²¬ ÚÑÎßÔÔ ¿²¼ ÉØÛÎÛ ¿®»<br />
½±³³±²´§ «»¼ ·² ¬¸» ½±²¬»¨¬ ±º ³¿²·°«´¿¬·²¹ ¿®®¿§<br />
̸»» ¿®» º®¿²µ´§ °»¿µ·²¹ ²±¬ ¿®®¿§ ·²¬®·²·½ º«²½¬·±²ô<br />
¾«¬ ª»®§ ½´±»´§ ®»´¿¬»¼ ¬±<br />
̸»§ ½¿² °®±ª·¼» ¿ ³¿µ»¼ ¿·¹²³»²¬ ±º ª¿´«» «·²¹<br />
»ºº»½¬·ª» ª»½¬±® ±°»®¿¬·±²<br />
11
Ю±½»¼«®» ¬§°»<br />
ÐßÎÌ ×××æ ÐÎÑÝÛÜËÎÛÍ ú ÓÑÜËÔÛÍ<br />
ײ¬»®²¿´ô »¨¬»®²¿´ô ¿²¼ ³±¼«´» °®±½»¼«®»<br />
ײ¬»®²¿´ °®±½»¼«®»æ ©·¬¸·² ¬¸» °®±¹®¿³ ¬®«½¬«®»<br />
Û¨¬»®²¿´ °®±½»¼«®»æ ·²¼»°»²¼»²¬´§ ¼»½´¿®»¼ô ³¿§ ¾» ±²<br />
±¬¸»® ´¿²¹«¿¹»<br />
Ó±¼«´» °®±½»¼«®»æ ¼»º·²»¼ ·² ¿ ³±¼«´»<br />
ײ¬»®²¿´ ¿²¼ ³±¼«´» °®±½»¼«®» °®±ª·¼» ¿ ¼»º·²»¼<br />
·²¬»®º¿½»ô ½±³°·´»® «» ¬¸· ¬± ½¸»½µ ¿®¹«³»²¬<br />
Ò± ¬§°» ½±²ª»®·±² ©·´´ ±½½«® ¼«®·²¹ ¬¸» °®±½»¼«®» ½¿´´æ<br />
¬¸» ¼¿¬¿ ¬§°» ±º ¿² ¿®¹«³»²¬ ±² ¬¸» ½¿´´ ·¬» ¿²¼ ·² ¬¸»<br />
°®±½»¼«®» ³«¬ ³¿¬½¸<br />
Ñ«¬´·²»<br />
Ю±¹®¿³ «²·¬<br />
ͬ®«½¬«®»¼ °®±¹®¿³³·²¹<br />
Ю±½»¼«®»æ º«²½¬·±² ¿²¼ «¾®±«¬·²»<br />
Ю±½»¼«®» ¿®¹«³»²¬<br />
Ó±¼«´»<br />
Ó¿·² °®±¹®¿³<br />
Û¨¬»®²¿´<br />
°®±½»¼«®»<br />
ײ¬»®²¿´ °®±½»¼«®»<br />
Ó±¼«´»<br />
Ó±¼«´» °®±½»¼«®»<br />
ͬ®«½¬«®»¼ °®±¹®¿³³·²¹<br />
ͬ®«½¬«®»¼ °®±¹®¿³³·²¹ ¾¿»¼ ±² °®±¹®¿³ «¾ó«²·¬øº«²½¬·±²ô<br />
«¾®±«¬·²» ¿²¼ ³±¼«´»÷ »²¿¾´»<br />
¬»¬·²¹ ¿²¼ ¼»¾«¹¹·²¹ »°¿®¿¬»´§<br />
®»ó«» ±º ½±¼»<br />
·³°®±ª»¼ ®»¿¼¿¾·´·¬§<br />
®»ó±½½«®®·²¹ ¬¿µ<br />
Ú«²½¬·±²<br />
ÅÌÇÐÛà ÚËÒÝÌ×ÑÒ º«²½øßÎÙÍ÷<br />
ÅÎÛÍËÔÌø¿®¹÷Ã<br />
ż»½´¿®¿¬·±²Ã<br />
Ŭ¿¬»³»²¬Ã<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ º«²½<br />
Ý¿´´ ½±²ª»²¬·±²<br />
®» ã º«²½øßÎÙÍ÷<br />
Ü»½´¿®¿¬·±²<br />
Í«¾®±«¬·²»<br />
ÍËÞÎÑËÌ×ÒÛ «¾ø¿®¹«³»²¬÷<br />
ż»½´¿®¿¬·±²Ã<br />
Ŭ¿¬»³»²¬Ã<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ «¾<br />
Ý¿´´ ½±²ª»²¬·±²<br />
ÝßÔÔ «¾ø¿®¹«³»²¬÷<br />
ɸ¿¬ ¿®» °®±½»¼«®»á<br />
É·¬¸ °®±½»¼«®» ©» ³»¿² «¾®±«¬·²» ¿²¼ º«²½¬·±²<br />
Í«¾®±«¬·²» »¨½¸¿²¹» ¼¿¬¿ ¬¸®±«¹¸ ·¬ ¿®¹«³»²¬ ´·¬<br />
±²´§<br />
Ú«²½¬·±² ®»¬«®² ¿ ª¿´«» ¿½½±®¼·²¹ ¬± ·¬ ¼»½´¿®»¼ ¼¿¬¿<br />
¬§°»<br />
×ÒÌÛÙÛÎ ÚËÒÝÌ×ÑÒ ¬»¬ø÷<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎ ææ <br />
¬»¬ãïðö<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ ¬»¬<br />
ÐÎÑÙÎßÓ ¼±Á±³»¬¸·²¹<br />
òòò<br />
®»«´¬ã¬»¬ø÷<br />
òòò<br />
Ü»½´¿®¿¬·±²<br />
ÍËÞÎÑËÌ×ÒÛ ¬»¬øô¬»¬÷<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎ ææ ô ¬»¬<br />
¬»¬ãïðö<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ¬»¬<br />
ÐÎÑÙÎßÓ ¼±Á±³»¬¸·²¹<br />
òòò<br />
½¿´´ ¬»¬øô®»«´¬÷<br />
òòò
ײ¬»®²¿´ °®±½»¼«®»<br />
Ю±½»¼«®» ¿®¹«³»²¬<br />
Û¿½¸ °®±¹®¿³ «²·¬ ø°®±¹®¿³ñ«¾®±«¬·²»ñº«²½¬·±²÷ ³¿§<br />
½±²¬¿·² ·²¬»®²¿´ °®±½»¼«®»<br />
Ü»½´¿®»¼ ¿¬ ¬¸» »²¼ ±º ¿ °®±¹®¿³ «²·¬ ¿º¬»® ¬¸»<br />
ÝÑÒÌß×ÒÍ ¬¿¬»³»²¬<br />
Ò»¬»¼ ÝÑÒÌß×ÒÍ ¬¿¬»³»²¬ ²±¬ ¿´´±©»¼<br />
ײ¸»®·¬ ª¿®·¿¾´» ¿²¼ ±¾»½¬ º®±³ ¬¸» °®±¹®¿³ «²·¬<br />
É» ³¿§ °¿ ·²¬±<br />
°®±½»¼«®» ¿´± ±¬¸»®<br />
°®±½»¼«®» ø·ò»òô ²±¬ ±²´§<br />
¼¿¬¿÷<br />
ײ¬»®²¿´ °®±½»¼«®»<br />
½¿²²±¬ ¾» «»¼ ¿<br />
¿®¹«³»²¬<br />
ÐÎÑÙÎßÓ ¼»¹¬»¬<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÎ×ÒÍ×Ý ßÍ×Òô ßÝÑÍô ßÌßÒ<br />
ÉÎ×ÌÛ øöôö÷ ¿®½·²øðòë÷æ ô ¼»¹øßÍ×Òôðòë÷<br />
ÉÎ×ÌÛ øöôö÷ ¿®½½±øðòë÷æ ô ¼»¹øßÝÑÍôðòë÷<br />
ÉÎ×ÌÛ øöôö÷ ¿®½¬¿²øïòð÷æ ô ¼»¹øßÌßÒôïòð÷<br />
ÝÑÒÌß×ÒÍ<br />
ÎÛßÔ ÚËÒÝÌ×ÑÒ ¼»¹øºô ¨÷<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÎ×ÒÍ×Ý ßÌßÒ<br />
ÎÛßÔô ÛÈÌÛÎÒßÔ ææ º<br />
ÎÛßÔô ×ÒÌÛÒÌø×Ò÷ ææ ¨<br />
¼»¹ ã ìëöºø¨÷ñßÌßÒøïòð÷<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ ¼»¹<br />
ÛÒÜ ÐÎÑÙÎßÓ ¼»¹¬»¬<br />
Û¨¬»®²¿´ °®±½»¼«®»<br />
Ü»½´¿®»¼ ·² ¿ »°¿®¿¬» °®±¹®¿³ «²·¬<br />
λº»®®»¼ ¬± ©·¬¸ ¬¸» ÛÈÌÛÎÒßÔ µ»§©±®¼<br />
Ø¿ª» ¬± ¾» ½±³°·´»¼ »°¿®¿¬»´§ ¿²¼ ´·²µ»¼<br />
ܱ ²±¬ «» ¬¸»³ ©·¬¸·² ¿ °®±¹®¿³æ ³±¼«´» ¿®» ³«½¸<br />
»¿·»® ¿²¼ ³±®» ®±¾«¬<br />
Û¨¬»®²¿´ °®±½»¼«®» ²»»¼»¼ ©¸»² «·²¹<br />
°®±½»¼«®» ©®·¬¬»² ©·¬¸ ¼·ºº»®»²¬ °®±¹®¿³³·²¹ ´¿²¹«¿¹»<br />
´·¾®¿®§ ®±«¬·²» ø»ò¹ò ÞÔßÍ÷<br />
п·²¹ ¿®®¿§ ¿®¹«³»²¬<br />
Ì©± ©¿§ ¬± °¿ ¿®®¿§ ¬± °®±½»¼«®»<br />
Û¨°´·½·¬ ¸¿°» ¿®®¿§ ø¼·³»²·±² °¿»¼ »¨°´·½·¬´§÷<br />
«¾®±«¬·²» º±±ø·¦»ïô ·¦»îô òòòô ³¿¬®·¨ô òòò÷<br />
òòò<br />
®»¿´ô ¼·³»²·±²ø·¦»ïô·¦»î÷ ææ ³¿¬®·¨<br />
ß«³»¼ ø·³°´·½·¬÷ ¸¿°» ¿®®¿§<br />
®»¿´ô ¼·³»²·±²øæôæ÷ ææ ³¿¬®·¨<br />
Ю±½»¼«®» ¿®¹«³»²¬<br />
Ý¿´´ ¾§ ®»º»®»²½»æ ¿²§ ½¸¿²¹» ¬± ¿®¹«³»²¬ ª¿´«»<br />
½¸¿²¹» ¬¸» ¿½¬«¿´ ¿®¹«³»²¬<br />
Þ»¸¿ª·±® ±º ¬¸» ¿®¹«³»²¬ ½¿² ¾» ½±²¬®±´´»¼ ©·¬¸ ¬¸»<br />
×ÒÌÛÒÌ µ»§©±®¼<br />
ݱ³°·´»® ½¸»½µ ¬¸» ¿®¹«³»²¬ ·º ¬¸» ·²¬»®º¿½» ±º<br />
°®±½»¼«®» · µ²±©² ¿¬ ½±³°·´¿¬·±² ¬·³» ø·² ·²¬»®²¿´ ¿²¼<br />
³±¼«´» °®±½»¼«®»÷<br />
Ú±® »¨¬»®²¿´ ®±«¬·²» ·¬ ½¿² ¾» ¼»½´¿®»¼ ©·¬¸ ¬¸»<br />
×ÒÌÛÎÚßÝÛ ¾´±½µ<br />
׬ · ¿ ¹±±¼ °®¿½¬·½» ¬±<br />
¼»º·²» ¬¸» ·²¬»®º¿½»<br />
º±® »¨¬»®²¿´<br />
°®±½»¼«®»<br />
Û²¿¾´» ½±³°·´¿¬·±²<br />
¬·³» »®®±® ½¸»½µ·²¹<br />
̸» ×ÒÌÛÎÚßÝÛ ¾´±½µ<br />
½¿² ¾» ¿´± «»¼ º±®<br />
¼»º·²·²¹ ½ò ¹»²»®·½<br />
°®±½»®«¼»<br />
ײ¬»®º¿½» ¼»º·²·¬·±²<br />
ÍËÞÎÑËÌ×ÒÛ ²¿¹Á®¿²¼ø¬¿¾´»÷<br />
×ÒÌÛÎÚßÝÛ<br />
ÍËÞÎÑËÌ×ÒÛ ¹ð뺿ºø¿ô ¾ô ²ô ¨÷<br />
ÎÛßÔô ×ÒÌÛÒÌø×Ò÷ ææ ¿<br />
ÎÛßÔô ×ÒÌÛÒÌø×Ò÷ ææ ¾<br />
×ÒÌÛÙÛÎô ×ÒÌÛÒÌø×Ò÷ ææ ²<br />
ÎÛßÔô ×ÒÌÛÒÌøÑËÌ÷ô Ü×ÓÛÒÍ×ÑÒø²÷ ææ ¨<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ¹ð뺿º<br />
ÛÒÜ ×ÒÌÛÎÚßÝÛ<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒøæ÷ô ×ÒÌÛÒÌøÑËÌ÷ ææ ¬¿¾´»<br />
ÝßÔÔ ¹ð뺿ºøóïòðô ïòðô Í×ÆÛø¬¿¾´»÷ô ¬¿¾´»÷<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ²¿¹Á®¿²¼<br />
Ü»º·²·²¹ ¿² ·²¬»®º¿½» º±® ¬¸» ¹ð뺿º<br />
«¾®±«¬·²» ±º ¬¸» ÒßÙ ´·¾®¿®§<br />
ø¹»²»®¿¬» ¿ »¬ ±º ®¿²¼±³ ²«³¾»®÷<br />
×ÒÌÛÒÌ µ»§©±®¼<br />
Ó±¼«´¿® °®±¹®¿³³·²¹<br />
Ü»½´¿®» ¸±© º±®³¿´<br />
¿®¹«³»²¬ · ·²¬»²¼»¼ º±®<br />
¬®¿²º»®®·²¹ ¿ ª¿´«»<br />
·²<br />
±«¬<br />
·²±«¬ ø¼»º¿«´¬÷<br />
ݱ³°·´»® «» ×ÒÌÛÒÌ º±®<br />
»®®±® ½¸»½µ·²¹ ¿²¼<br />
±°¬·³·¦¿¬·±²<br />
ÍËÞÎÑËÌ×ÒÛ º±±ø¨ô§ô¦÷<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÎÛßÔô×ÒÌÛÒÌø·²÷ ææ ¨<br />
ÎÛßÔô×ÒÌÛÒÌø·²±«¬÷ ææ §<br />
ÎÛßÔô×ÒÌÛÒÌø±«¬÷ææ ¦<br />
¨ãïð ÿ ݱ³°·´¿¬·±² »®®±®<br />
§ãïð ÿ ݱ®®»½¬<br />
¦ã§ö¨ ÿ ݱ®®»½¬<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ º±±<br />
Ó±¼«´¿®·¬§ ³»¿² ¼·ª·¼·²¹ ¿ °®±¹®¿³ ·²¬± ³¿´´<br />
³·²·³¿´´§ ¼»°»²¼»²¬ ³±¼«´»<br />
ß¼ª¿²¬¿¹»<br />
ݱ²¬¿²¬ô ª¿®·¿¾´»ô ¼¿¬¿ ¬§°» ¿²¼ °®±½»¼«®» ½¿² ¾»<br />
¼»º·²»¼ ·² ³±¼«´»<br />
Ó¿µ» ·¬ °±·¾´» ¬± ¼·ª·¼» °®±¹®¿³ ·²¬± ³¿´´»® »´ºó<br />
½±²¬¿·²»¼ «²·¬
Ù´±¾¿´ ¼»º·²·¬·±²<br />
Ë»º«´²» ±º Ú±®¬®¿² ³±¼«´»<br />
̸» ¿³» °®±½»¼«®» ¿²¼ ¼¿¬¿ ¬§°» ¿ª¿·´¿¾´» ·² ¼·ºº»®»²¬<br />
°®±¹®¿³ «²·¬<br />
ݱ³°·´»ó¬·³» »®®±® ½¸»½µ<br />
Ø·¼» ·³°´»³»²¬¿¬·±² ¼»¬¿·´ ø±¾»½¬ ±®·»²¬»¼<br />
°®±¹®¿³³·²¹÷<br />
Ù®±«° ®±«¬·²» ¿²¼ ¼¿¬¿ ¬®«½¬«®»<br />
Ü»º·²» ¹»²»®·½ °®±½»¼«®» ¿²¼ ½«¬±³ ±°»®¿¬±®<br />
Ê··¾·´·¬§ ±º ±¾»½¬<br />
Ê¿®·¿¾´» ¿²¼ °®±½»¼«®» ·² ³±¼«´» ½¿² ¾» ÐÎ×ÊßÌÛ ±®<br />
ÐËÞÔ×Ý<br />
ÐËÞÔ×Ý ã ª··¾´» º±® ¿´´ °®±¹®¿³ «²·¬ «·²¹ ¬¸» ³±¼«´»<br />
ø¼»º¿«´¬÷<br />
ÐÎ×ÊßÌÛ ©·´´ ¸·¼» ¬¸» ±¾»½¬ º®±³ ±¬¸»® °®±¹®¿³ «²·¬<br />
×ÒÌÛÙÛÎô ÐÎ×ÊßÌÛ ææ ¨<br />
×ÒÌÛÙÛÎô ÐËÞÔ×Ý ææ §<br />
Ó±¼«´» °®±½»¼«®»<br />
Ю±½»¼«®» ¼»º·²»¼ ·² ³±¼«´» ½¿² ¾» «»¼ ·² ¿²§ ±¬¸»®<br />
°®±¹®¿³ «²·¬<br />
д¿½·²¹ °®±½»¼«®» ·² ³±¼«´» ¸»´° ½±³°·´»® ¬± ¼»¬»½¬<br />
°®±¹®¿³³·²¹ »®®±® ¿²¼ ¬± ±°¬·³·¦» ¬¸» ½±¼»<br />
Ó±¼«´» °®±½»¼«®» ¿®» ¼»½´¿®»¼ ¿º¬»® ¬¸» ÝÑÒÌß×ÒÍ<br />
¬¿¬»³»²¬<br />
Í«³³¿®§<br />
Ю±½»¼«®¿´ °®±¹®¿³³·²¹ ³¿µ» ¬¸» ½±¼» ³±®» ®»¿¼¿¾´»<br />
¿²¼ »¿·»® ¬± ³±¼·º§<br />
Ю±½»¼«®» »²½¿°«´¿¬» ±³» °·»½» ±º ©±®µ ¬¸¿¬ ³¿µ»<br />
»²» ¿²¼ ³¿§ ¾» ©±®¬¸ ®»ó«·²¹ »´»©¸»®»<br />
Ú±®¬®¿² «» º«²½¬·±² ¿²¼ «¾®±«¬·²»<br />
Ê¿´«» ±º °®±½»¼«®» ¿®¹«³»²¬ ³¿§ ¾» ½¸¿²¹»¼ «°±²<br />
½¿´´·²¹ ¬¸» °®±½»¼«®»<br />
Ú±®¬®¿² ³±¼«´» ¿®» «»¼ º±® ³±¼«´¿® °®±¹®¿³³·²¹ ¿²¼<br />
¼¿¬¿ »²½¿°«´¿¬·±²<br />
Ë·²¹ ³±¼«´»<br />
Ü»½´¿®¿¬·±²<br />
ÓÑÜËÔÛ ½¸»½µ<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ú<br />
·²¬° ã ÍÛÔÛÝÌÛÜÁ×ÒÌÁÕ×ÒÜøè÷<br />
ÝÑÒÌß×ÒÍ<br />
ÚËÒÝÌ×ÑÒ ½¸»½µÁ¬¸·ø¨÷ ÎÛÍËÔÌø¦÷<br />
×ÒÌÛÙÛÎø·²¬°÷ææ ¨ô ¦<br />
òòò<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ<br />
ÛÒÜ ÓÑÜËÔÛ ½¸»½µ<br />
Ë¿¹»<br />
ÐÎÑÙÎßÓ ¬»¬°®±¹<br />
ËÍÛ ½¸»½µ<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÙÛÎøÕ×ÒÜã·²¬°÷ ææ ¨ô¬»¬<br />
¬»¬ã½¸»½µÁ¬¸·ø¨÷<br />
ÛÒÜ ÐÎÑÙÎßÓ ¬»¬°®±¹<br />
ß ¹±±¼ ¸¿¾·¬<br />
ËÍÛ ¿½½«®¿½§ô ÑÒÔÇæ ®»¿´°<br />
ݱ³³±² ª¿®·¿¾´» ©·¬¸ ³±¼«´»<br />
ײ ³¿²§ Ú±®¬®¿² éé ½±¼»ô ± ½¿´´»¼ ½±³³±² ¾´±½µ ¿®»<br />
«»¼<br />
λº»®»²½»¼ ¿²¼ñ±® ³±¼·º·»¼ ¿²§©¸»®» ·² ¬¸» °®±¹®¿³<br />
ÝÑÓÓÑÒñÛÏñÒôÒÌÑÌ<br />
ÝÑÓÓÑÒñÌÑÔñßÞÍÌÑÔôÎÛÔÌÑÔ<br />
̸» Ú±®¬®¿² çëñîððí ©¿§ ¬± ¼± ·¬ · ©·¬¸ ³±¼«´»<br />
ÓÑÜËÔÛ ½±³³±²<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ® ã ðòìî<br />
×ÒÌÛÙÛÎô ÍßÊÛ ææ ²ô ²¬±¬<br />
ÎÛßÔô ÍßÊÛ ææ ¿¾¬±´ô ®»´¬±´<br />
ÛÒÜ ÓÑÜËÔÛ ½±³³±²<br />
15
Ò«³»®·½¿´ °®»½··±²<br />
ÐÎÑÙÎßÓ Ð®»½··±²ÁÌ»¬<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÐßÎÌ ×Êæ ÜÛÎ×ÊÛÜ ÜßÌß ÌÇÐÛÍ<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ° ã ÍÛÔÛÝÌÛÜÁÎÛßÔÁÕ×ÒÜøêôíð÷ô ú<br />
¼° ã ÍÛÔÛÝÌÛÜÁÎÛßÔÁÕ×ÒÜøïðôîðð÷<br />
ÎÛßÔøÕ×ÒÜã°÷ ææ ¿<br />
ÎÛßÔøÕ×ÒÜã¼°÷ ææ ¾<br />
ÉÎ×ÌÛøöôö÷ °ô ¼°ô Õ×ÒÜøïòð÷ô Õ×ÒÜøïòðÁ¼°÷<br />
ÉÎ×ÌÛøöôö÷ Õ×ÒÜø¿÷ô ØËÙÛø¿÷ô Ì×ÒÇø¿÷ô ÎßÒÙÛø¿÷ô ÐÎÛÝ×Í×ÑÒø¿÷<br />
ÉÎ×ÌÛøöôö÷ Õ×ÒÜø¾÷ô ØËÙÛø¾÷ô Ì×ÒÇø¾÷ô ÎßÒÙÛø¾÷ô ÐÎÛÝ×Í×ÑÒø¾÷<br />
ÛÒÜ ÐÎÑÙÎßÓ Ð®»½··±²ÁÌ»¬<br />
Ñ«¬°«¬æ<br />
ì è ì è<br />
ì íòìðîèîíëÛõíè ïòïéëìçììÛóíè íé ê<br />
è ïòéçéêçíïíìèêîíïêÛõíðè îòîîëðéíèëèëðéîðïÛóíðè íðé ïë<br />
Ñ«¬´·²»<br />
λ½¿´´·²¹ Ú±®¬®¿² ¾«·´¬ó·² ¼¿¬¿ ¬§°»<br />
ο¬·±²¿´» ¾»¸·²¼ ¼»®·ª»¼ ¼¿¬¿ ¬§°»<br />
Ü¿¬¿ ¬§°» ¼»½´¿®¿¬·±² ¿²¼ ª··¾·´·¬§ ©·¬¸ »¨¿³°´»<br />
Ò«³»®·½¿´ °®»½··±²<br />
Ѭ¸»® ·²¬®·²·½ º«²½¬·±² ®»´¿¬»¼ ¬± ²«³»®·½¿´ °®»½··±²<br />
Õ×ÒÜøß÷ 묫®² ¬¸» µ·²¼ ±º ¬¸» «°°´·»¼ ¿®¹«³»²¬<br />
Ì×ÒÇøß÷ ̸» ³¿´´»¬ °±·¬·ª» ²«³¾»®<br />
ØËÙÛøß÷ ̸» ´¿®¹»¬ °±·¬·ª» ²«³¾»®<br />
ÛÐÍ×ÔÑÒøß÷ ̸» ³¿´´»¬ °±·¬·ª» ²«³¾»® ¿¼¼»¼ ¬± ïòð<br />
®»¬«®² ¿ ²«³¾»® «¬ ¹®»¿¬»® ¬¸¿² ïòð<br />
ÐÎÛÝ×Í×ÑÒøß÷ Ü»½·³¿´ °®»½··±²<br />
Ü×Ù×ÌÍøß÷ Ò«³¾»® ±º ·¹²·º·½¿²¬ ¼·¹·¬<br />
ÎßÒÙÛøß÷ Ü»½·³¿´ »¨°±²»²¬<br />
ÓßÈÛÈÐÑÒÛÒÌøß÷ Ô¿®¹»¬ »¨°±²»²¬ ø±º ¬¸» µ·²¼øß÷÷<br />
Ó×ÒÛÈÐÑÒÛÒÌøß÷ ͳ¿´´»¬ »¨°±²»²¬ ø±º ¬¸» µ·²¼øß÷÷<br />
Ú±®¬®¿² ¾«·´¬ó·² ¬§°»<br />
ͬ¿²¼¿®¼ Ú±®¬®¿² ¿´®»¿¼§ «°°±®¬ ¿ ©·¼» ª¿®·»¬§ ±º<br />
º«²¼¿³»²¬¿´ ¼¿¬¿ ¬§°» ¬± ®»°®»»²¬ ·²¬»¹»®ô º´±¿¬·²¹<br />
°±·²¬ ²«³¾»® ø®»¿´÷ô ¬®«¬¸ ª¿´«» ø´±¹·½¿´÷ ¿²¼ ª¿®·¿¾´»<br />
´»²¹¬¸ ½¸¿®¿½¬»® ¬®·²¹<br />
ײ ¿¼¼·¬·±² »¿½¸ ±º ¬¸»» ¾«·´¬ó·² ¬§°» ³¿§ ¸¿ª»<br />
¼»½´¿®»¼ ¿ ³«´¬·ó¼·³»²·±²¿´ ¿®®¿§<br />
Ú«®¬¸»®³±®»ô ®»¿´ ¿²¼ ·²¬»¹»® ½¿² ¾» ¼»½´¿®»¼ ¬±<br />
½±²«³» ´» ³»³±®§ ·² »¨°»²» ±º ®»¼«½»¼ ²«³»®·½¿´<br />
°®»½··±² ¬¸®±«¹¸ µ·²¼ °¿®¿³»¬»® ø»ò¹ò è ±® ì÷<br />
ɸ¿¬ · ¼»®·ª»¼ ¼¿¬¿ ¬§°» á<br />
Ü»®·ª»¼ ¼¿¬¿ ¬§°» · ¿ ¼¿¬¿ ¬®«½¬«®» ©¸·½¸ · ¼»º·²»¼ ¾§<br />
¬¸» °®±¹®¿³³»®<br />
Û¯«·ª¿´»²¬ ¬± ¬®«½¬ ·² Ý °®±¹®¿³³·²¹ ´¿²¹«¿¹»<br />
ݱ²·¬ ±º ±¬¸»® ¼¿¬¿ ¬§°» ·²½´«¼·²¹ ±¬¸»® ¼»®·ª»¼ ¬§°»<br />
Ü»®·ª»¼ ¬§°» · ¼»º·²»¼ ·² ¬¸» ª¿®·¿¾´» ¼»½´¿®¿¬·±² »½¬·±²<br />
±º °®±¹®¿³³·²¹ «²·¬<br />
Ò±¬ ª··¾´» ¬± ±¬¸»® °®±¹®¿³³·²¹ «²·¬<br />
˲´» ¼»º·²»¼ ·² ³±¼«´» ¿²¼ «»¼ ª·¿ ËÍÛ ½´¿«»<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ¸±®¬ãÍÛÔÛÝÌÛÜÁ×ÒÌÁÕ×ÒÜøì÷<br />
×ÒÌÛÙÛÎô ÐßÎßÓÛÌÛÎ ææ ¼±«¾´»ãÍÛÔÛÝÌÛÜÁÎÛßÔÁÕ×ÒÜøïîôïðð÷<br />
×ÒÌÛÙÛÎ øÕ×ÒÜ㸱®¬÷ ææ ·²¼»¨<br />
ÎÛßÔ øÕ×ÒÜã¼±«¾´»÷ ææ ¨ô§ô¦<br />
ÝÑÓÐÔÛÈ øÕ×ÒÜã¼±«¾´»÷ ææ ½<br />
ß ®»¿´ ²«³¾»® ¾»¬©»»²<br />
¨ãïòðÁ¼±«¾´»å §ãîòðÁ¼±«¾´» ö ßÝÑÍø¨÷ óïð ïðð ä ¨ ä ïð ïðð ô ¿½½«®¿¬» ¬± ïî<br />
¼»½·³¿´ß<br />
º»© ©±®¼ ¿¾±«¬ ²«³»®·½¿´ °®»½··±²<br />
̸» ª¿®·¿¾´» ®»°®»»²¬¿¬·±² ³»¬¸±¼ ø°®»½··±²÷ ³¿§ ¾»<br />
¼»½´¿®»¼ «·²¹ ¬¸» Õ×ÒÜ ¬¿¬»³»²¬<br />
ÿ ÍÛÔÛÝÌÛÜÁ×ÒÌÁÕ×ÒÜø®÷<br />
ÿ ÍÛÔÛÝÌÛÜÁÎÛßÔÁÕ×ÒÜø°÷<br />
ÿ ÍÛÔÛÝÌÛÜÁÎÛßÔÁÕ×ÒÜø°ô®÷<br />
ײ¬»¹»® ¾»¬©»»² óïð ® ä ² ä ïð ®<br />
λ¿´ ²«³¾»® ¿½½«®¿¬» ¬± ° ¼»½·³¿´<br />
Ü»®·ª»¼ ¼¿¬¿ ¬§°» ®¿¬·±²¿´»<br />
ß ©»´´ ¬®«½¬«®»¼ ¿²¼ ®»¿¼¿¾´» °®±¹®¿³ ¸±«´¼ ¬®§ ¬±<br />
»¨°®» ·¬ ª¿®·¿¾´» ¿ ±¾»½¬<br />
Ê¿®·¿¾´» «»¼ ·² ¬¸» ¿³» ½±²¬»¨¬ ¸±«´¼ ¾» ¹®±«°»¼<br />
¬±¹»¬¸»® ¬¸· ³¿µ» ¬¸» °®±¹®¿³ º´±© »¿·»® ¬±<br />
«²¼»®¬¿²¼ ¿²¼ ´» °®±²» ¬± »®®±®<br />
Ü»®·ª»¼ ¼¿¬¿ ¬§°» · ¿ º»¿¬«®» ©¸·½¸ ¿´´±© °®±¹®¿³³»®<br />
¬± ³¿µ» ±¾»½¬ ¹®±«°·²¹ °±·¾´»<br />
17
̧°» ¼»½´¿®¿¬·±²æ<br />
ÌÇÐÛ °´¿§»®¬§°»<br />
ÝØßÎßÝÌÛÎ øÔÛÒãíð÷ ææ ²¿³»<br />
×ÒÌÛÙÛÎ ææ ²«³¾»®<br />
ÎÛßÔ ææ ®¿¬·²¹<br />
ÛÒÜ ÌÇÐÛ °´¿§»®¬§°»<br />
Ü¿¬¿ ¬§°» ¼»½´¿®¿¬·±²<br />
Ê··¾·´·¬§ ±º ¼»®·ª»¼ ¼¿¬¿ ¬§°»<br />
ɸ»² ¼»½´¿®»¼ ·² ¿ ³±¼«´» «²·¬ô ¿ ¼»®·ª»¼ ¼¿¬¿ ¬§°» ½¿²<br />
¾» ¿½½»»¼ ±«¬·¼» ¬¸» ³±¼«´» ¬¸®±«¹¸ ËÍÛ󬿬»³»²¬æ<br />
ÓÑÜËÔÛ ÌÇÐÛÓÑÜ<br />
ÌÇÐÛ ÓÇÁÌÇÐÛ<br />
×ÒÌÛÙÛÎ ææ ÚÑÑ<br />
ÛÒÜ ÌÇÐÛ ÓÇÁÌÇÐÛ<br />
ÐËÞÔ×Ý ææ ÓÇÁÌÇÐÛ<br />
ÛÒÜ ÓÑÜËÔÛ ÌÇÐÛÓÑÜ<br />
ÍËÞÎÑËÌ×ÒÛ ÍËÞ<br />
ËÍÛ ÌÇÐÛÓÑÜô ÑÒÔÇ æ ÓÇÁÌÇÐÛ<br />
ÌÇÐÛøÓÇÁÌÇÐÛ÷ ææ ÊßÎ<br />
ÊßÎûÚÑÑ ã é<br />
ÝßÔÔ ÝßÔÝ øÊßÎ÷<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ÍËÞ<br />
ÍËÞÎÑËÌ×ÒÛ ÝßÔÝ øÒÛÉÊßÎ÷<br />
ËÍÛ ÌÇÐÛÓÑÜô ÑÒÔÇ æ ÓÇÁÌÇÐÛ<br />
ÌÇÐÛøÓÇÁÌÇÐÛ÷ ææ ÒÛÉÊßÎ<br />
ÐÎ×ÒÌ öôÒÛÉÊßÎ<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ÝßÔÝ<br />
Ü»½´¿®·²¹ ª¿®·¿¾´» «·²¹ ¿ ¼»®·ª»¼ ¼¿¬¿ ¬§°»æ<br />
ÌÇÐÛø°´¿§»®¬§°»÷ ææ ±¸²ô ´«·¦<br />
ÌÇÐÛø°´¿§»®¬§°»÷ô Ü×ÓÛÒÍ×ÑÒøïð÷ ææ °´¿§»®ß½½»·²¹<br />
¼¿¬¿ ¬§°»<br />
ײ·¬·¿´·¦¿¬·±²<br />
±¸²û²¿³» ã ùÖ±¸²ù<br />
±¸²û²«³¾»® ã ïï<br />
±¸²û®¿¬·²¹ ã éòí<br />
ß´¬»®²¿¬·ª»´§<br />
Ô«·¦ ã °´¿§»®¬§°»øùÔ«·¦ùô èô êòì÷<br />
Ê»½¬±® ±º ¼»®·ª»¼ ¼¿¬¿ ¬§°»æ »´»³»²¬ó©·» ¿¼¼®»·²¹<br />
°´¿§»®øï÷û²¿³» ã ùи·´ù<br />
°´¿§»®øï÷û²«³¾»® ã ì<br />
°´¿§»®øï÷û®¿¬·²¹ ã ëòë<br />
ß ´·²µ»¼ ´·¬<br />
ß ½¸¿·² ±º ¼¿¬¿ »´»³»²¬ ·² ¿ ¼§²¿³·½¿´´§ »¨¬»²¼¿¾´» ´·¬<br />
Ú±® »¨¿³°´»<br />
ÌÇÐÛ ´·¬Á±ºÁ¬»¿³<br />
ÌÇÐÛøº±±¬¾¿´´¬»¿³÷ ææ ¬»¿³<br />
ÌÇÐÛø´·¬Á±ºÁ¬»¿³÷ô ÐÑ×ÒÌÛÎ ææ ²»¨¬Á¬»¿³ ãâ ÒËÔÔø÷<br />
ÛÒÜ ÌÇÐÛ ´·¬Á±ºÁ¬»¿³<br />
Ô·²µ»¼<br />
´·¬<br />
Ò»¬»¼ ¼¿¬¿ ¬§°»<br />
Ü»½´¿®¿¬·±² ±º ¿ ¼¿¬¿ ¬§°» «·²¹ ¿²±¬¸»® ¼¿¬¿ ¬§°»æ<br />
ÌÇÐÛ º±±¬¾¿´´¬»¿³<br />
ÝØßÎßÝÌÛÎ øÔÛÒãèð÷ ææ ²¿³»<br />
ÌÇÐÛø°´¿§»®¬§°»÷ ææ °´¿§»®øïï÷<br />
ÛÒÜ ÌÇÐÛ º±±¬¾¿´´¬»¿³<br />
Ü»½´¿®·²¹ ª¿®·¿¾´»æ<br />
ÌÇÐÛøº±±¬¾¿´´¬»¿³÷ ææ ³¿²«ô ¿®»²¿´ô ®»¿¼·²¹<br />
ײ·¬·¿´·¦¿¬·±² ñ ¿½½» »¨¿³°´»æ<br />
³¿²«û²¿³» ã ùÓ¿²½¸»¬»® ˲·¬»¼ù<br />
³¿²«û°´¿§»®øï÷û²¿³» ã ùα¾·² ª¿² л®·»ù<br />
³¿²«û°´¿§»®øï÷û²«³¾»® ã îð<br />
ß ¾·²¿®§ ¬®»»<br />
Ü¿¬¿ »´»³»²¬ ·² ¿ ¾·²¿®§ ¬®»» ±ºº»® «°»®¾ »¿®½¸ °»»¼ ·²<br />
«¬ ±øÒ ´±¹ î Ò÷ ±°»®¿¬·±²<br />
ݱ²·¬ ±º ´»º¬ ¿²¼ ®·¹¸¬ ´»¿º<br />
ÌÇÐÛ ¾·²¿®§Á¬®»»<br />
ÌÇÐÛø³§Á¼¿¬¿Á¬§°»÷ ææ ¼¿¬¿<br />
ÌÇÐÛø¾·²¿®§Á¬®»»÷ô ÐÑ×ÒÌÛÎ ææ ´»º¬ ãâ ÒËÔÔø÷<br />
ÌÇÐÛø¾·²¿®§Á¬®»»÷ô ÐÑ×ÒÌÛÎ ææ ®·¹¸¬ ãâ ÒËÔÔø÷<br />
ÛÒÜ ÌÇÐÛ ¾·²¿®§Á¬®»»<br />
Þ·²¿®§<br />
¬®»»<br />
Ê··¾·´·¬§ ±º ¼»®·ª»¼ ¼¿¬¿ ¬§°»<br />
ɸ»² ¼»½´¿®»¼ ·² ¬¸» ¿³» °®±¹®¿³³·²¹ «²·¬ øª¿®·¿¾´»<br />
¼»½´¿®¿¬·±² »½¬·±²÷ ¼»®·ª»¼ ¼¿¬¿ ¬§°» ¿®» ª··¾´» ¬± ¬¸¿¬<br />
«²·¬ ±²´§ ø¿²¼ «¾ó«²·¬ «²¼»® ÝÑÒÌß×ÒÍ ¬¿¬»³»²¬÷ æ<br />
ÍËÞÎÑËÌ×ÒÛ ÍËÞ<br />
ÌÇÐÛ ÓÇÁÌÇÐÛ<br />
×ÒÌÛÙÛÎ ææ ÚÑÑ<br />
ÛÒÜ ÌÇÐÛ ÓÇÁÌÇÐÛ<br />
ÌÇÐÛøÓÇÁÌÇÐÛ÷ ææ ÊßÎ<br />
ÊßÎûÚÑÑ ã é<br />
ÝßÔÔ ÝßÔÝ<br />
ÝÑÒÌß×ÒÍ<br />
òòò<br />
òòò<br />
ÍËÞÎÑËÌ×ÒÛ ÝßÔÝ<br />
ÌÇÐÛøÓÇÁÌÇÐÛ÷ ææ ÒÛÉÊßÎ<br />
ÒÛÉÊßÎ ã ÊßÎ<br />
ÐÎ×ÒÌ öôÒÛÉÊßÎ<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ÝßÔÝ<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ ÍËÞ<br />
Í«³³¿®§<br />
Ü»®·ª»¼ ¼¿¬¿ ¬§°» »²¿¾´» ¹®±«°·²¹ ±º ¼¿¬¿ ¬± º±®³<br />
´±¹·½¿´ ±¾»½¬ß<br />
Ú±®¬®¿² °®±¹®¿³ ¾»½±³» ³±®» ®»¿¼¿¾´» ¿²¼ ³±¼«´¿®<br />
©·¬¸ »²·¾´» «» ±º ¼»®·ª»¼ ¼¿¬¿ ¬§°»<br />
Ø¿²¼´·²¹ ±º ´·²µ»¼ ´·¬ ±® ¾·²¿®§ ¬®»» ¾»½±³» ³±®»<br />
³¿²¿¹»¿¾´» ©·¬¸ «» ±º ¼¿¬¿ ¬®«½¬«®»<br />
18
Ñ«¬°«¬ º±®³¿¬¬·²¹æ ³·½»´´¿²»±«<br />
ÐßÎÌ Êæ Ú×ÔÛ ×ñÑ<br />
É·¬¸ ½±³°´»¨ ²«³¾»® °®±ª·¼» º±®³¿¬ º±® ¾±¬¸ ®»¿´ ¿²¼<br />
·³¿¹·²¿®§ °¿®¬æ<br />
ÝÑÓÐÔÛÈ ææ Æ<br />
ÉÎ×ÌÛ øöôùøÚêòíôîÈôÚêòí÷ù÷ Æ<br />
Ô·²» ¾®»¿µ ¿²¼ ¬¿¾¾·²¹æ<br />
ÉÎ×ÌÛ øöôùøÚêòíôñôÚêòí÷ù÷ Èô Ç<br />
ÉÎ×ÌÛ øöôùø×ëôÌîðô×ë÷ù÷ ×ô Ö<br />
׬ · °±·¾´» ¬¸¿¬ ¿² »¼·¬ ¼»½®·°¬±® ©·´´ ¾» ®»°»¿¬»¼ ¿<br />
°»½·º·»¼ ²«³¾»® ±º ¬·³»<br />
ÉÎ×ÌÛ øöôùøë×è÷ù÷<br />
ÉÎ×ÌÛ øöôùøíø×ëôÚèòí÷÷ù÷<br />
Ñ«¬´·²»<br />
ײ°«¬ñ±«¬°«¬ º±®³¿¬¬·²¹<br />
Ú·´» ±°»²·²¹ ¿²¼ ½´±·²¹<br />
É®·¬·²¹ ¿²¼ ®»¿¼·²¹ ¬±ñº®±³ ¿ º·´»<br />
Ú±®³¿¬¬»¼ ¿²¼ «²º±®³¿¬¬»¼ º·´»<br />
ͬ®»¿³ ×ñÑ<br />
ײ¬»®²¿´ ×ñÑ<br />
É®·¬·²¹ ¬± ±® ®»¿¼·²¹ º®±³ ¿ º·´» · ·³·´¿® ¬± ©®·¬·²¹ ±²¬±<br />
¿ ¬»®³·²¿´ ½®»»² ±® ®»¿¼·²¹ º®±³ ¿ µ»§¾±¿®¼<br />
Ñ°»²·²¹ ú ½´±·²¹ º·´» æ ¾¿·½ ½±²½»°¬<br />
Ü·ºº»®»²½»<br />
Ú·´» ³«¬ ¾» ±°»²»¼ ©·¬¸ ¿² ÑÐÛÒ ¬¿¬»³»²¬ô ·² ©¸·½¸ ¬¸»<br />
«²·¬ ²«³¾»® ¿²¼ ø±°¬·±²¿´´§÷ ¬¸» º·´» ²¿³» ¿®» ¹·ª»²<br />
Í«¾»¯«»²¬ ©®·¬» ø±® ®»¿¼÷ ³«¬ ¬± ®»º»® ¬± ¬¸» ¹·ª»²<br />
«²·¬ ²«³¾»®<br />
Ú·´» ¸±«´¼ ¾» ½´±»¼ ¿¬ ¬¸» »²¼<br />
ײ°«¬ñÑ«¬°«¬ º±®³¿¬¬·²¹<br />
̱ °®»¬¬·º§ ±«¬°«¬ ¿²¼ ¬± ³¿µ» ·¬ ¸«³¿² ®»¿¼¿¾´»ô «»<br />
ÚÑÎÓßÌ ¼»½®·°¬±® ·² ½±²²»½¬·±² ©·¬¸ ¬¸» ÉÎ×ÌÛ<br />
¬¿¬»³»²¬<br />
ß´¬¸±«¹¸ ´» ±º¬»² «»¼ ²±©¿¼¿§ô ·¬ ½¿² ¿´± ¾» «»¼<br />
©·¬¸ ÎÛßÜ ¬± ·²°«¬ ¼¿¬¿ ¿¬ º·¨»¼ ´·²» °±·¬·±² ¿²¼ «·²¹<br />
°®»¼»º·²»¼ º·»´¼ ´»²¹¬¸<br />
Ë» »·¬¸»® ¬¸®±«¹¸ ÚÑÎÓßÌ ¬¿¬»³»²¬ô ÝØßÎßÝÌÛÎ<br />
ª¿®·¿¾´» ±® »³¾»¼¼»¼ ·² ÎÛßÜ ñ ÉÎ×ÌÛ º³¬ µ»§©±®¼<br />
Ñ°»²·²¹ ú ½´±·²¹ ¿ º·´»<br />
̸» §²¬¿¨ · ø¬¸» ¾®¿½µ»¬ Å Ã ·²¼·½¿¬» ±°¬·±²¿´ µ»§©±®¼<br />
±® ¿®¹«³»²¬÷ æ<br />
ÑÐÛÒøÅ«²·¬ã÷«ô º·´»ãù²¿³»ù Åô ±°¬·±²Ã÷<br />
ÝÔÑÍÛøÅ«²·¬ã÷« Åô ±°¬·±²Ã÷<br />
Ú±® »¨¿³°´» æ<br />
ÑÐÛÒøïðô º·´»ã ù±«¬°«¬ò¼¿¬ùô ¬¿¬«ãù²»©ù÷<br />
ÝÔÑÍÛø«²·¬ãïðô ¬¿¬«ãùµ»»°ù÷<br />
Ü¿¬¿ ¬§°» ÚÑÎÓßÌ ¼»½®·°¬±® Û¨¿³°´»<br />
ײ¬»¹»® שô שò³ ÉÎ×ÌÛøöôùø×ë÷ù÷ Ö<br />
ÉÎ×ÌÛøöôùø×ëòí÷ù÷ Ö<br />
ÉÎ×ÌÛøöôùø×ð÷ù÷ Ö<br />
λ¿´ ø¼»½·³¿´ ¿²¼<br />
»¨°±²»²¬·¿´ º±®³ô<br />
¿«¬±ó½¿´·²¹÷<br />
Ñ«¬°«¬ º±®³¿¬¬·²¹<br />
Ú©ò¼<br />
Û©ò¼ô Û©ò¼Û»<br />
ïÐôÙ©ò¼<br />
ÉÎ×ÌÛøöôùøÚéòì÷ù÷ Î<br />
ÉÎ×ÌÛøöôùøÛïîòíÛì÷ù÷ Î<br />
ÉÎ×ÌÛøöôùøïÐôÙîðòïí÷ù÷ Î<br />
ݸ¿®¿½¬»® ßô ß© ÉÎ×ÌÛøöôùøß÷ù÷ Ý<br />
Ô±¹·½¿´ Ô© ÉÎ×ÌÛøöôùøÔî÷ù÷ Ô<br />
©ã©·¼¬¸ ±º ¬¸» ±«¬°«¬ º·»´¼ô ¼ã²«³¾»® ±º ¼·¹·¬ ¬± ¬¸» ®·¹¸¬ ±º ¼»½·³¿´<br />
°±·²¬ô ³ã³·²·³«³ ²«³¾»® ±º ½¸¿®¿½¬»® ¬± ¾» «»¼ô »ã²«³¾»® ±º ¼·¹·¬ ·²<br />
¬¸» »¨°±²»²¬ò Ê¿®·¿¾´»æ ײ¬»¹»® ææ Öô λ¿´ ææ Îô ݸ¿®¿½¬»® ææ Ýô Ô±¹·½¿´ ææ Ô<br />
Ñ°»²·²¹ ú ½´±·²¹ ¿ º·´»<br />
̸» º·®¬ °¿®¿³»¬»® · ¬¸» «²·¬ ²«³¾»®<br />
̸» µ»§©±®¼ «²·¬ã ½¿² ¾» ±³·¬¬»¼<br />
̸» «²·¬ ²«³¾»® ðô ë ¿²¼ ê ¿®» °®»¼»º·²»¼<br />
ð · ±«¬°«¬ º±® ¬¿²¼¿®¼ ø§¬»³÷ »®®±® ³»¿¹»<br />
ë · º±® ¬¿²¼¿®¼ ø«»®÷ ·²°«¬<br />
ê · º±® ¬¿²¼¿®¼ ø«»®÷ ±«¬°«¬<br />
̸»» «²·¬ ¿®» ±°»²»¼ ¾§ ¼»º¿«´¬ ¿²¼ ¸±«´¼ ²±¬ ¾» ®»ó<br />
±°»²»¼ ²±® ½´±»¼ ¾§ ¬¸» «»®
Ñ°»²·²¹ ú ½´±·²¹ ¿ º·´»<br />
̸» ¼»º¿«´¬ ±«¬°«¬ñ·²°«¬ «²·¬ ½¿² ¾» ®»º»®®»¼ ©·¬¸ ¿ ¬¿®æ<br />
ÉÎ×ÌÛøöô òòò÷<br />
ÎÛßÜøöô òòò÷<br />
Ò±¬» ¬¸¿¬ ¬¸»» ¿®» ²±¬ ²»½»¿®·´§ ¬¸» ¿³» ¿ ¬¸» ¬¼±«¬<br />
¿²¼ ¬¼·² «²·¬ ²«³¾»® ê ¿²¼ ë<br />
׺ ¬¸» º·´» ²¿³» · ±³·¬¬»¼ ·² ¬¸» ÑÐÛÒô ¬¸» º·´» ²¿³» ©·´´<br />
¾¿»¼ ±² «²·¬ ²«³¾»® ¾»·²¹ ±°»²»¼ô »ò¹ò º±® «²·¬ãïî ¬¸·<br />
««¿´´§ ³»¿² ¬¸» º·´»²¿³» º±®¬òïî ø±² ˲·¨ñÓßÝ÷<br />
Ú·´» ±°»²·²¹æ º·´» °®±°»®¬·»<br />
»¨·¬ æ ¼±» º·´» »¨·¬ á øÔÑÙ×ÝßÔ÷<br />
±°»²»¼ æ · º·´» ñ «²·¬ ±°»²»¼ á øÔÑÙ×ÝßÔ÷<br />
º±®³ æ º±®³¿¬¬»¼ ±® «²º±®³¿¬¬»¼ øÝØßÎ÷<br />
¿½½» æ »¯«»²¬·¿´ ±® ¼·®»½¬ ±® ¬®»¿³ øÝØßÎ÷<br />
¿½¬·±² æ ®»¿¼ô ©®·¬»ô ®»¿¼©®·¬» øÝØßÎ÷<br />
®»½´ æ ®»½±®¼ ´»²¹¬¸ ø×ÒÌÛÙÛÎ÷<br />
·¦» æ º·´» ·¦» ·² ¾§¬» ø×ÒÌÛÙÛÎ÷<br />
Ú·´» ±°»²·²¹ ±°¬·±²<br />
¬¿¬« æ »¨·¬»²½» ±º ¬¸» º·´»<br />
ù±´¼ùô ù²»©ùô ù®»°´¿½»ùô ù½®¿¬½¸ùô ù«²µ²±©²ù<br />
°±·¬·±² æ ±ºº»¬ô ©¸»®» ¬± ¬¿®¬ ©®·¬·²¹<br />
ù¿°°»²¼ù<br />
¿½¬·±² æ º·´» ±°»®¿¬·±² ³±¼»<br />
ù©®·¬»ùô ù®»¿¼ùô ù®»¿¼©®·¬»ù<br />
º±®³ æ ¬»¨¬ ±® ¾·²¿®§ º·´»<br />
ùº±®³¿¬¬»¼ùô ù«²º±®³¿¬¬»¼ù<br />
Ú·´» ±°»²·²¹æ º·´» °®±°»®¬·»<br />
Ú·²¼ ±«¬ ¿¾±«¬ »¨·¬»²½» ±º ¿ º·´»<br />
ÔÑÙ×ÝßÔ ææ º·´»Á»¨·¬<br />
×ÒÏË×ÎÛ øÚ×ÔÛãùº±±ò¼¿¬ùô ÛÈ×ÍÌ㺷´»Á»¨·¬÷<br />
×Ú øòÒÑÌò º·´»Á»¨·¬÷ ÌØÛÒ<br />
ÉÎ×ÌÛøöôö÷ ù̸» º·´» ¼±» ²±¬ »¨·¬ù<br />
ÛÔÍÛ<br />
ÿ ܱ ±³»¬¸·²¹ ©·¬¸ ¬¸» º·´» ùº±±ò¼¿¬ù<br />
ÛÒÜ×Ú<br />
Ú·´» ±°»²·²¹ ±°¬·±²<br />
¿½½» æ ¼·®»½¬ ±® »¯«»²¬·¿´ º·´» ¿½½»<br />
ù¼·®»½¬ùô ù»¯«»²¬·¿´ùô ù¬®»¿³ùô<br />
·±¬¿¬ æ »®®±® ·²¼·½¿¬±®ô ø±«¬°«¬÷ ·²¬»¹»®<br />
Ò±²ó¦»®± ±²´§ «°±² ¿² »®®±®<br />
»®® æ ¬¸» ´¿¾»´ ²«³¾»® ¬± «³° «°±² »®®±®<br />
®»½´ æ ®»½±®¼ ´»²¹¬¸ô ø·²°«¬÷ ·²¬»¹»®<br />
Ú±® ¼·®»½¬ ¿½½» º·´» ±²´§<br />
É¿®²·²¹ ø½¸»½µ÷æ ³¿§ ¾» ·² ¾§¬» ±® ©±®¼<br />
Ú·´» ©®·¬·²¹ ¿²¼ ®»¿¼·²¹<br />
É®·¬·²¹ ¬± ¿²¼ ®»¿¼·²¹ º®±³ ¿ º·´» · ¼±²» ¾§ ¹·ª·²¹ ¬¸»<br />
½±®®»°±²¼·²¹ «²·¬ ²«³¾»® ø·«÷ ¿ ¿ °¿®¿³»¬»® æ<br />
ÉÎ×ÌÛø·«ôö÷ ¬®<br />
ÉÎ×ÌÛø«²·¬ã·«ô º³¬ãö÷ ¬®<br />
ÎÛßÜø·«ôö÷ ¬®<br />
ÎÛßÜø«²·¬ã·«ô º³¬ãö÷ ¬®<br />
Ú±®³¿¬ ¿²¼ ±¬¸»® ±°¬·±² ½¿² ¾» «»¼ ¿ ²»»¼»¼<br />
̸» ¬¿® º±®³¿¬ øö÷ ·²¼·½¿¬» ´·¬ó<br />
¼·®»½¬»¼ ±«¬°«¬ ø·ò»ò °®±¹®¿³³»® ¼±»<br />
²±¬ ½¸±±» ¬¸» ·²°«¬ñ±«¬°«¬ ¬§´»÷<br />
׺ µ»§©±®¼ ù«²·¬ù «»¼ô ¿´± ùº³¬ù µ»§©±®¼ ³«¬ ¾» «»¼<br />
øùº³¬ù · ¿°°´·½¿¾´» ¬± º±®³¿¬¬»¼ô ¬»¨¬ º·´» ±²´§÷<br />
Ú·´» ±°»²·²¹æ º·´» °®±°»®¬·»<br />
Ë» ×ÒÏË×ÎÛ ¬¿¬»³»²¬ ¬± º·²¼ ±«¬ ·²º±®³¿¬·±² ¿¾±«¬<br />
º·´» »¨·¬»²½»<br />
º·´» «²·¬ ±°»² ¬¿¬«<br />
ª¿®·±« º·´» ¿¬¬®·¾«¬»<br />
̸» §²¬¿¨ ¸¿ ¬©± º±®³ô ±²» ¾¿»¼ ±² º·´» ²¿³»ô ¬¸»<br />
±¬¸»® º±® «²·¬ ²«³¾»®<br />
×ÒÏË×ÎÛøº·´»ã²¿³»ô ±°¬·±² òòò÷<br />
×ÒÏË×ÎÛø«²·¬ã·«ô ±°¬·±² òòò÷<br />
Ú±®³¿¬¬»¼ ªò «²º±®³¿¬¬»¼ º·´»<br />
Ì»¨¬ ±® º±®³¿¬¬»¼ º·´» ¿®»<br />
Ø«³¿² ®»¿¼¿¾´»<br />
ᮬ¿¾´» ·ò»ò ³¿½¸·²» ·²¼»°»²¼»²¬<br />
Þ·²¿®§ ±® «²º±®³¿¬¬»¼ º·´» ¿®»<br />
Ó¿½¸·²» ®»¿¼¿¾´» ±²´§ô ²±¬ °±®¬¿¾´»<br />
Ó«½¸ º¿¬»® ¬± ¿½½» ¬¸¿² º±®³¿¬¬»¼ º·´»<br />
Í«·¬¿¾´» º±® ´¿®¹» ¿³±«²¬ ±º ¼¿¬¿ ¼«» ¬± ®»¼«½»¼ º·´» ·¦»<br />
ײ¬»®²¿´ ¼¿¬¿ ®»°®»»²¬¿¬·±² «»¼ º±® ²«³¾»®ô ¬¸« ²± ²«³¾»®<br />
½±²ª»®·±²ô ²± ®±«²¼·²¹ ±º »®®±® ½±³°¿®»¼ ¬± º±®³¿¬¬»¼ ¼¿¬¿
˲º±®³¿¬¬»¼ ×ñÑ<br />
É®·¬» ¬± ¿ »¯«»²¬·¿´ ¾·²¿®§ º·´»<br />
ÎÛßÔ ®ª¿´<br />
ÝØßÎßÝÌÛÎø´»² ã êð÷ ¬®·²¹<br />
ÑÐÛÒøïðôº·´»ãùº±±ò¼¿¬ùôº±®³ãù«²º±®³¿¬¬»¼ù÷<br />
ÉÎ×ÌÛøïð÷ ®ª¿´<br />
ÉÎ×ÌÛøïð÷ ¬®·²¹<br />
ÝÔÑÍÛøïð÷<br />
Ò± ÚÑÎÓßÌ ¼»½®·°¬±® ¿´´±©»¼<br />
λ¿¼·²¹ ·³·´¿®´§<br />
ÎÛßÜøïð÷ ®ª¿´<br />
ÎÛßÜøïð÷ ¬®·²¹<br />
ײ°«¬ñÑ«¬°«¬ º±®³¿¬¬·²¹<br />
Í«³³¿®§<br />
Ú·´»æ ½±³³«²·½¿¬·±² ¾»¬©»»² ¿ °®±¹®¿³ ¿²¼ ¬¸»<br />
±«¬·¼» ©±®´¼<br />
Ñ°»²·²¹ ¿²¼ ½´±·²¹ ¿ º·´»<br />
Ü¿¬¿ ®»¿¼·²¹ ú ©®·¬·²¹<br />
Ë» «²º±®³¿¬¬»¼ ø¾·²¿®§÷ ×ñÑ º±® ¿´´ »¨½»°¬ ¬»¨¬ º·´»<br />
ͬ®»¿³ ×ñÑ<br />
ײ¬»®²¿´ ×ñÑ<br />
ͬ®»¿³ ×ñÑ<br />
ß ¾·²¿®§ º·´» ©®·¬» ¿¼¼ »¨¬®¿ ®»½±®¼ ¼»´·³·¬»® ø¸·¼¼»²<br />
º®±³ °®±¹®¿³³»®÷ ¬± ¬¸» ¾»¹·²²·²¹ ¿²¼ »²¼ ±º ®»½±®¼<br />
ײ Ú±®¬®¿²îððí «·²¹ ¿½½» ³»¬¸±¼ ù¬®»¿³ù ¿ª±·¼ ¬¸·<br />
¿²¼ ·³°´»³»²¬ øº·²¿´´§ÿ÷ ¿ Ýó°®±¹®¿³³·²¹ ´·µ» ¿°°®±¿½¸<br />
Ý®»¿¬» ¿ ¬®»¿³ ø¾·²¿®§÷ º·´»<br />
ÎÛßÔ ¼¾¸»¿¼»®øîð÷ô ¼¾¼¿¬¿øíðð÷<br />
ÑÐÛÒøïðôº·´»ãù³§Á¼¿¬¿¾¿»ò¼¿¬ùô¿½½»ãù¬®»¿³ù÷<br />
ÉÎ×ÌÛøïð÷ ¼¾¸»¿¼»®<br />
ÉÎ×ÌÛøïð÷ ¼¾¼¿¬¿<br />
ÝÔÑÍÛøïð÷<br />
λ¿¼·²¹ ·³·´¿®´§<br />
ײ¬»®²¿´ ×ñÑ<br />
Ѻ¬»² ·¬ · ²»½»¿®§ ¬± º·´¬»® ±«¬ ¼¿¬¿ º®±³ ¿ ¹·ª»²<br />
½¸¿®¿½¬»® ¬®·²¹<br />
Ñ® ¬± °¿½µ ª¿´«» ·²¬± ¿ ½¸¿®¿½¬»® ¬®·²¹<br />
Ú±®¬®¿² ·²¬»®²¿´ ×ñÑ ©·¬¸ ÎÛßÜ ú ÉÎ×ÌÛ ¾»½±³» ¸¿²¼§<br />
Ò± ¿½¬«¿´ ø°¸§·½¿´÷ º·´» ¿®» ·²ª±´ª»¼ ¿¬ ¿´´<br />
ײ¬»®²¿´ ×ñÑ æ Û¨¿³°´»<br />
Û¨¬®¿½¬ ¿ ²«³¾»® º®±³ ¿ ¹·ª»² ½¸¿®¿½¬»® ¬®·²¹ æ<br />
ÝØßÎßÝÌÛÎøÔÛÒãïí÷ ææ ÝÔ ãùÌ·³» ¬»°ý ïðù<br />
×ÒÌÛÙÛÎ ææ ×ÍÌÛÐ<br />
ÎÛßÜøÝÔôº³¬ãùøïðÈô×í÷ù÷ ×ÍÌÛÐ<br />
É®·¬» ¬»¨¬ ¿²¼ ¼¿¬¿ ¬± ¿ ½¸¿®¿½¬»® ¬®·²¹æ<br />
ÝØßÎßÝÌÛÎøÔÛÒãêð÷ ÝÔ<br />
ÉÎ×ÌÛøÝÔôº³¬ãùøßô×ð÷ù÷ ù̸» ²«³¾»® ±º ±¾ ½±³°´»¬»¼ ã ùôïðð<br />
21
Ù»²»®·½ °®±½»¼«®»<br />
ÐßÎÌ Ê×æ ÑÌØÛÎ ØßÒÜÇ ÚÑÎÌÎßÒ çëñîððí<br />
ÚÛßÌËÎÛÍ<br />
Ю±½»¼«®» ©¸·½¸ °»®º±®³ ·³·´¿® ¿½¬·±² ¾«¬ º±®<br />
¼·ºº»®»²¬ ¼¿¬¿ ¬§°» ½¿² ¾» ¼»º·²»¼ ¿ ¹»²»®·½<br />
°®±½»¼«®»<br />
Ю±½»¼«®» ¿®» ½¿´´»¼ «·²¹ ¬¸» ¹»²»®·½ ²¿³» ¿²¼<br />
½±³°·´»® «» ¬¸» ½±®®»½¬ °®±½»¼«®» ¾¿»¼ ±² ¬¸»<br />
¿®¹«³»²¬ ²«³¾»®ô ¬§°» ¿²¼ ¼·³»²·±²<br />
ݱ³°¿®» ©·¬¸ ±ª»®´±¿¼·²¹ ·² Ýõõ<br />
Ù»²»®·½ ²¿³» · ¼»º·²»¼ ·² ×ÒÌÛÎÚßÝÛ »½¬·±²<br />
Ñ«¬´·²»<br />
Ù»²»®·½ °®±½»¼«®» »¨¿³°´»<br />
б·²¬»® ¿´·¿·²¹<br />
Ù»²»®·½ °®±½»¼«®»<br />
Í°»½·¿´ °®±½»¼«®» ¿¬¬®·¾«¬» ú ±°¬·±²¿´ °®±½»¼«®»<br />
¿¬¬®·¾«¬»<br />
ݱ³³¿²¼ó´·²» ¿®¹«³»²¬<br />
ÓÑÜËÔÛ ©¿°³±¼<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
×ÒÌÛÎÚßÝÛ ©¿°<br />
ÓÑÜËÔÛ ÐÎÑÝÛÜËÎÛ ©¿°Á®»¿´ô ©¿°Á½¸¿®<br />
ÛÒÜ ×ÒÌÛÎÚßÝÛ<br />
ÝÑÒÌß×ÒÍ<br />
ÍËÞÎÑËÌ×ÒÛ ©¿°Á®»¿´ø¿ô ¾÷<br />
ÎÛßÔô ×ÒÌÛÒÌø×ÒÑËÌ÷ ææ ¿ô ¾<br />
ÎÛßÔ ææ ¬»³°<br />
¬»³° ã ¿å ¿ ã ¾å ¾ ã ¬»³°<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ<br />
ÍËÞÎÑËÌ×ÒÛ ©¿°Á½¸¿®ø¿ô ¾÷<br />
ÝØßÎßÝÌÛÎô ×ÒÌÛÒÌø×ÒÑËÌ÷ ææ ¿ô ¾<br />
ÝØßÎßÝÌÛÎ ææ ¬»³°<br />
¬»³° ã ¿å ¿ ã ¾å ¾ ã ¬»³°<br />
ÛÒÜ ÍËÞÎÑËÌ×ÒÛ<br />
ÛÒÜ ÓÑÜËÔÛ ©¿°³±¼<br />
ÐÎÑÙÎßÓ ©·¬½¸<br />
ËÍÛ ©¿°³±¼<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÝØßÎßÝÌÛÎ ææ ²ô<br />
ÎÛßÔ ææ ¨ô§<br />
² ã ùÖù<br />
ã ùÍù<br />
¨ãïð<br />
§ãîð<br />
ÐÎ×ÒÌ öô¨ô§<br />
ÐÎ×ÒÌ öô²ô<br />
ÝßÔÔ ©¿°ø²ô÷<br />
ÝßÔÔ ©¿°ø¨ô§÷<br />
ÐÎ×ÒÌ öô¨ô§<br />
ÐÎ×ÒÌ öô²ô<br />
ÛÒÜ ÐÎÑÙÎßÓ<br />
б·²¬»® ¬± ¿®®¿§<br />
̸» ÐÑ×ÒÌÛÎ ¿¬¬®·¾«¬» »²¿¾´» ¬± ½®»¿¬» ¿®®¿§ ø±® ½¿´¿®÷<br />
¿´·¿·²¹ ª¿®·¿¾´»<br />
б·²¬»® ª¿®·¿¾´» ¿®» ««¿´´§ »³°´±§»¼ ¬± ®»º»® ¬±<br />
¿²±¬¸»® ¿®®¿§ ±® ¿®®¿§ »½¬·±²<br />
ß °±·²¬»® ª¿®·¿¾´» ½¿² ¿´± ¾» ¿ ±´» ª¿®·¿¾´» ·¬»´ºô ¾«¬<br />
®»¯«·®» ßÔÔÑÝßÌÛ<br />
̸· · ²±¬ ¿ ®»½±³³»²¼»¼ °®¿½¬·½» «» ¬¸»<br />
ßÔÔÑÝßÌßÞÔÛ ¿¬¬®·¾«¬» ¿²¼ »³°´±§ ÐÑ×ÒÌÛÎ º±® ¿´·¿·²¹<br />
±²´§<br />
Ý °®±¹®¿³³»®æ ¿ °±·²¬»® ¸¿ ¿ ´·¹¸¬´§ ¼·ºº»®»²¬<br />
³»¿²·²¹ ·² Ý ¿²¼ Ú±®¬®¿²<br />
Í°»½·¿´ ¿¬¬®·¾«¬» º±® °®±½»¼«®»æ ÎÛÝËÎÍ×ÊÛ<br />
뽫®·±² ³»¿² ½¿´´·²¹ ¿ °®±½»¼«®» ©·¬¸·² ·¬»´º<br />
Ì®·¹¹»®»¼ ª·¿ ÎÛÝËÎÍ×ÊÛ µ»§©±®¼<br />
ÎÛÝËÎÍ×ÊÛ ÚËÒÝÌ×ÑÒ º¿½¬±®·¿´ø²÷ ÎÛÍËÔÌøº¿½÷<br />
×ÒÌÛÙÛÎô ×ÒÌÛÒÌø×Ò÷ ææ ²<br />
×ÒÌÛÙÛÎ ææ º¿½<br />
×Ú ø²ããð÷ ÌØÛÒ<br />
º¿½ãï<br />
ÛÔÍÛ<br />
º¿½ã²öº¿½¬±®·¿´ø²óï÷<br />
ÛÒÜ ×Ú<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ º¿½¬±®·¿´<br />
б·²¬»® ¬± ¿®®¿§<br />
ß ÐÑ×ÒÌÛÎ ½¿² ®»º»® ¬± ¿² ¿´®»¿¼§ ¿´´±½¿¬»¼ ³»³±®§<br />
®»¹·±²<br />
×ÒÌÛÙÛÎô ÐÑ×ÒÌÛÎ ææ °Á¨øæ÷ ãâ ÒËÔÔø÷<br />
×ÒÌÛÙÛÎô ÌßÎÙÛÌ ææ ¨øïððð÷<br />
òòò<br />
°Á¨ ãâ ¨<br />
°Á¨ ãâ ¨ ø î æ íðð ÷<br />
°Á¨ ãâ ¨ ø ï æ ïððð æ ë ÷<br />
òòò<br />
°Á¨øï÷ ã ð<br />
ÒËÔÔ×ÚÇø°Á¨÷<br />
ײ·¬·¿´·¦»¼ ¬± °±·²¬ ¬± ²±¬¸·²¹<br />
б·²¬»® °®±ª·¼» ¿ ²»¿¬ ©¿§ º±® ¿®®¿§<br />
»½¬·±²<br />
̸· ©±«´¼ ½¸¿²¹» ¿´± ¨øï÷ ¬± ð<br />
Ü·½±²²»½¬°Á¨ ½±²²»½¬·±² ¬± ¨<br />
Í°»½·¿´ ¿¬¬®·¾«¬» º±® °®±½»¼«®»æ ÐËÎÛ<br />
ÐËÎÛ µ»§©±®¼ ·²¼·½¿¬» ¬¸¿¬ ¬¸» º«²½¬·±² · º®»» ±º ·¼»<br />
»ºº»½¬<br />
Í«½¸ ¿ ¿ ½¸¿²¹» ·² ª¿´«» ±º ¿² ·²°«¬ ¿®¹«³»²¬ ±® ¹´±¾¿´<br />
ª¿®·¿¾´»<br />
ײ¬®·²·½ º«²½¬·±² ¿®» ¿´©¿§ °«®»<br />
Ò± ø»¨¬»®²¿´÷ ×ñÑ · ¿´´±©»¼ ·² ÐËÎÛ °®±½»¼«®»<br />
Ы®» °®±½»¼«®» ³«¬ °»½·º§ ·²¬»²¬ ±º ·¬ ¿´´ ¿®¹«³»²¬<br />
̸» ³±¬·ª¿¬·±² · »ºº·½·»²½§æ Û²¿¾´» ³±®» ¿¹¹®»·ª»<br />
½±³°·´»® ±°¬·³·¦¿¬·±² ¿²¼ °¿®¿´´»´·¦¿¬·±² ©·¬¸ »ò¹ò<br />
Ñ°»²ÓÐ<br />
23
Í°»½·¿´ ¿¬¬®·¾«¬» º±® °®±½»¼«®»æ ÛÔÛÓÛÒÌßÔ<br />
ݱ³³¿²¼ ´·²» ·²°«¬<br />
̸» ÛÔÛÓÛÒÌßÔ ¿¬¬®·¾«¬»<br />
¿´´±© º±® ¼»½´¿®·²¹<br />
°®±½»¼«®» ¬¸¿¬ ±°»®¿¬»<br />
»´»³»²¬ó¾§ó»´»³»²¬<br />
̸» ¿®¹«³»²¬ ½¿² ¾» ¿ ½¿´¿®<br />
±® ¿² ¿®®¿§ ±º ¿²§ ¸¿°»<br />
̸· · ¿²±¬¸»® ©¿§ º±®<br />
¼»º·²·²¹ ³±®» ¹»²»®¿´<br />
°®±½»¼«®»<br />
ÛÔÛÓÛÒÌßÔ ÎÛßÔ ÚËÒÝÌ×ÑÒ ºø¨ô§÷<br />
ÎÛßÔô ×ÒÌÛÒÌø×Ò÷ ææ ¨ô §<br />
º ã ÍÏÎÌø¨ööî õ §ööî÷<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ º<br />
òòò<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒø²ô²÷ ææ ¿ô ¾ô ½<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒø²÷ ææ ¬ô «ô ª<br />
òòò<br />
½ ã ºø¿ô¾÷<br />
ª ã ºø¬ô«÷<br />
Û¨¿³°´»æ ®»¿¼·²¹ ·²<br />
¬©± ·²¬»¹»® ª¿´«»<br />
º®±³ ¬¸» ½±³³¿²¼<br />
´·²»<br />
̸» øº«´´÷ °®±¹®¿³<br />
¸±«´¼ ¾» ´¿«²½¸»¼ ¿<br />
ø»ò¹ò÷<br />
û òñ¿ò±«¬ ïðð ïðð<br />
«¾®±«¬·²» ®»¿¼Á½±³³¿²¼Á´·²»ø¸»·¹¸¬ô ©·¼¬¸÷<br />
·²¬»¹»®ô ·²¬»²¬ø±«¬÷ ææ ¸»·¹¸¬ô ©·¼¬¸<br />
½¸¿®¿½¬»®ø´»²ãïð÷ ææ ¿®¹øî÷<br />
·²¬»¹»® ææ ²Á¿®¹ô ·<br />
²Á¿®¹ ã ½±³³¿²¼Á¿®¹«³»²¬Á½±«²¬ø÷<br />
·º ø ²Á¿®¹ ñã î ÷ ¬¸»²<br />
©®·¬»øöôö÷ ù Ë¿¹» æ òñ»¨» ¸»·¹¸¬ ©·¼¬¸ ù<br />
½¿´´ ¿¾±®¬ø÷<br />
»²¼ ·º<br />
¼± · ã ïô î<br />
½¿´´ ¹»¬Á½±³³¿²¼Á¿®¹«³»²¬ø·ô¿®¹ø·÷÷<br />
¿®¹ø·÷ ã ¬®·³ø¿¼«¬´ø¿®¹ø·÷÷÷<br />
»²¼ ¼±<br />
®»¿¼ø¿®¹øï÷ôö÷ ¸»·¹¸¬<br />
®»¿¼ø¿®¹øî÷ôö÷ ©·¼¬¸<br />
»²¼ «¾®±«¬·²» ®»¿¼Á½±³³¿²¼Á´·²»<br />
ÍßÊÛ¼ ª¿®·¿¾´»<br />
Ú±®¬®¿² çëñîððí ½®¿¸ ½±«®» «³³¿®§<br />
Þ§ ¼»º¿«´¬ ±¾»½¬ ·² °®±½»¼«®» ¿®» ¼§²¿³·½¿´´§<br />
¿´´±½¿¬»¼ «°±² ·²ª±½¿¬·±²<br />
Ѳ´§ ¿ª»¼ ª¿®·¿¾´» µ»»° ¬¸»·® ª¿´«» º®±³ ±²» ½¿´´ ¬± ¬¸»<br />
²»¨¬<br />
ÍßÊÛ ¿¬¬®·¾«¬»<br />
ÎÛßÔô ÍßÊÛ ææ ¿<br />
Ê¿®·¿¾´» ¿·¹²»¼ ©·¬¸ ¿ ª¿´«» «°±² ¼»½´¿®¿¬·±² ¿®» »¯«¿´<br />
¬± ÍßÊÛ ¿¬¬®·¾«¬» øÝ °®±¹®¿³³»® ¸±«´¼ ²±¬» ¬¸·ÿ÷<br />
ÎÛßÔ ææ ¿ ã ïòð<br />
Ê¿®·¿¾´»ô<br />
½±²¬®±´<br />
¬®«½¬«®»<br />
Ú·´» ×ñÑ<br />
ß®®¿§ô ¿®®¿§<br />
·²¬®·²·½<br />
Ю±½»¼«®»<br />
ú Ó±¼«´»<br />
б·²¬»®<br />
¿´·¿·²¹<br />
Ù»²»®·½<br />
°®±½»¼«®»<br />
ú °»½·¿´<br />
¿¬¬®·¾«¬»<br />
Ü»®·ª»¼<br />
¬§°»<br />
Ñ°¬·±²¿´ °®±½»¼«®» ¿®¹«³»²¬<br />
Ю±½»¼«®» ¿®¹«³»²¬<br />
½¿² ¾» ¼»º·²»¼ ¿<br />
±°¬·±²¿´ô ·ò»òô «·²¹<br />
±³» °®»¼»º·²»¼ ª¿´«»<br />
º±® ¿®¹«³»²¬ ²±¬<br />
°®±ª·¼»¼<br />
ݱ«²¬·²¹ ¿² ¿ª»®¿¹» ±º ¿ »¬<br />
±º ®»¿´ ²«³¾»® ±°¬·±²¿´´§ ²«³¾»®<br />
±«¬·¼» Å´±©ô«°Ã ½¿² ¾» ±³·¬¬»¼ º®±³<br />
¬¸» ¿ª»®¿¹»ò ̸» º«²½¬·±² ½¿² ¾» ½¿´´»¼<br />
©·¬¸ »·¬¸»® ïô î ±® í ¿®¹«³»¬ô ¾«¬ ¬¸» »¬<br />
±º ²«³¾»® ¸¿ ¬± ¾» °®±ª·¼»¼ò<br />
ÎÛßÔ ÚËÒÝÌ×ÑÒ ¿ª»®¿¹»ø¨ô ´±©ô «°÷<br />
×ÓÐÔ×Ý×Ì ÒÑÒÛ<br />
ÎÛßÔô Ü×ÓÛÒÍ×ÑÒøæ÷ô ×ÒÌÛÒÌø×Ò÷ ææ ¨<br />
ÎÛßÔô ×ÒÌÛÒÌø×Ò÷ô ÑÐÌ×ÑÒßÔ ææ ´±©ô «°<br />
ÎÛßÔ ææ ¿ô ¾<br />
×ÒÌÛÙÛÎ ææ ·ô ·½±«²¬<br />
¿ ã óØËÙÛø¿÷<br />
¾ ã ØËÙÛø¾÷<br />
×Ú øÐÎÛÍÛÒÌø´±©÷÷ ¿ ã ´±©<br />
×Ú øÐÎÛÍÛÒÌø«°÷÷ ¾ ã «°<br />
¿ª»®¿¹» ã ðòð<br />
·½±«²¬ ã ð<br />
ÜÑ · ã ïô Í×ÆÛø¨÷<br />
×Ú ø¨ø·÷ âã ¿ òßÒÜò ¨ø·÷ äã ¾÷ ÌØÛÒ<br />
¿ª»®¿¹» ã ¿ª»®¿¹» õ ¨ø·÷<br />
·½±«²¬ ã ·½±«²¬ õ ï<br />
ÛÒÜ ×Ú<br />
ÛÒÜ ÜÑ<br />
¿ª»®¿¹» ã ¿ª»®¿¹»ñ·½±«²¬<br />
ÛÒÜ ÚËÒÝÌ×ÑÒ ¿ª»®¿¹»<br />
̱©¿®¼ Ú±®¬®¿² îððè<br />
̸» Ú±®¬®¿² îððè ¬¿²¼¿®¼ º»¿¬«®» »ò¹ò ¬¸» º±´´±©·²¹<br />
½¿°¿¾·´·¬·» ±² ¬±° ±º Ú±®¬®¿² îððí<br />
Í«¾³±¼«´»<br />
ݱ¿®®¿§ Ú±®¬®¿² ¿ °¿®¿´´»´ »¨»½«¬·±² ³±¼»´<br />
Ü·½«»¼ ¬±³±®®±©<br />
̸» ÜÑ ÝÑÒÝËÎÎÛÒÌ ½±²¬®«½¬<br />
̸» ÝÑÒÌ×ÙËÑËÍ ¿¬¬®·¾«¬»<br />
̸» ÞÔÑÝÕ ½±²¬®«½¬<br />
ݱ³³¿²¼ ´·²» ·²°«¬<br />
ײ ³¿²§ ½¿»ô ·¬ · ½±²ª»²·»²¬ ¬± ¹·ª» °¿®¿³»¬»® º±® ¬¸»<br />
°®±¹®¿³ ¼·®»½¬´§ ¼«®·²¹ °®±¹®¿³ ´¿«²½¸<br />
ײ¬»¿¼ ±º «·²¹ ¿ °¿®»®ô ®»¿¼·²¹ º®±³ ¿² ·²°«¬ º·´» »¬½ò<br />
Ú±®¬®¿² îððí °®±ª·¼» ¿ ©¿§ º±® ¬¸·<br />
ÝÑÓÓßÒÜÁßÎÙËÓÛÒÌÁÝÑËÒÌø÷ æ ½±³°«¬» ¬¸» ²«³¾»® ±º<br />
«»®ó°®±ª·¼»¼ ¿®¹«³»²¬<br />
ÙÛÌÁÝÑÓÓßÒÜÁßÎÙËÓÛÒÌø·²¬»¹»® ·ô ½¸¿®¿½¬»®<br />
¿®¹ø·÷÷ »¨¬®¿½¬ ¬¸» ¿®¹«³»²¬ º®±³ °±·¬·±² ·<br />
DZ« ©·´´ ²»»¼ ·²¬»®²¿´ ×ñÑ ¬± ½±²ª»®¬ »ò¹ò ·²¬»¹»®óª¿´«»¼<br />
¿®¹«³»²¬ ·²¬± ª¿´«» ±º ·²¬»¹»® ª¿®·¿¾´»<br />
̱©¿®¼ Ú±®¬®¿² îððè<br />
þݱ¿®®¿§ ©»®» ¼»·¹²»¼ ¬± ¿²©»® ¬¸» ¯«»¬·±²æ ɸ¿¬<br />
· ¬¸» ³¿´´»¬ ½¸¿²¹» ®»¯«·®»¼ ¬± ½±²ª»®¬ Ú±®¬®¿² ·²¬± ¿<br />
®±¾«¬ ¿²¼ »ºº·½·»²¬ °¿®¿´´»´ ´¿²¹«¿¹»á<br />
̸» ¿²©»®æ ¿ ·³°´» §²¬¿½¬·½ »¨¬»²·±²ò<br />
׬ ´±±µ ¿²¼ º»»´ ´·µ» Ú±®¬®¿² ¿²¼ ®»¯«·®» Ú±®¬®¿²<br />
°®±¹®¿³³»® ¬± ´»¿®² ±²´§ ¿ º»© ²»© ®«´»òþ<br />
Ö±¸² λ·¼ô<br />
×ÍÑ Ú±®¬®¿² ݱ²ª»²»®<br />
24
̱©¿®¼ Ú±®¬®¿² îððè<br />
Í»» ¸¬¬°æññº±®¬®¿²©·µ·ò±®¹ñº±®¬®¿²ñ¸±©ñÚ±®¬®¿²õîððèõ¬¿¬«<br />
25
Programming models for HPC<br />
Parallel Programming<br />
with<br />
<strong>Fortran</strong> Coarrays<br />
Delivered at PRACE Advanced <strong>Training</strong> Centre,<br />
CSC IT Center for Science Ltd, Finland,<br />
September 13, 2012<br />
David Henty, Alan Simpson (EPCC)<br />
Harvey Richardson, Bill Long (Cray)<br />
The challenge is to efficiently map a problem to the<br />
architecture we have<br />
Take advantage of all computational resources<br />
Manage distributed memories etc.<br />
Optimal use of any communication networks<br />
The HPC industry has long experience in parallel programming<br />
Vector, threading, data-parallel, message-passing etc.<br />
We would like to have models or combinations that are<br />
efficient<br />
safe<br />
easy to learn and use<br />
5<br />
Tutorial Overview<br />
The <strong>Fortran</strong> Programming Model in context<br />
Basic coarray features<br />
Practical Session 1<br />
Further coarray features<br />
Practical Session 2<br />
Advanced coarray features<br />
Practical Session 3<br />
Experiences with coarrays<br />
Why consider new programming models?<br />
Next-generation architectures bring new challenges:<br />
Very large numbers of processors with many cores<br />
Complex memory hierarchy<br />
even today (2011) we are at 500k cores<br />
Parallel programming is hard, need to make this simpler<br />
Some of the models we currently use are<br />
bolt-ons to existing languages as APIs or directives<br />
Hard to program for underlying architecture<br />
unable to scale due to overheads<br />
So, is there an alternative to the models prevalent today?<br />
Most popular are OpenMP<br />
2<br />
6<br />
Shared-memory directives and OpenMP<br />
The <strong>Fortran</strong><br />
Programming Model<br />
in context<br />
memory<br />
threads<br />
7<br />
Motivation<br />
<strong>Fortran</strong> now supports parallelism as a full first-class feature of<br />
the language<br />
Changes are minimal<br />
Performance is maintained<br />
Flexibility in expressing communication patterns<br />
OpenMP: work distribution<br />
memory<br />
1-8 9-16 17-24 25-32<br />
!$OMP PARALLEL DO<br />
do i=1,32<br />
a(i)=a(i)*2<br />
end do<br />
threads<br />
4<br />
27<br />
8
OpenMP implementation<br />
MPI<br />
memory<br />
process 0<br />
process 1<br />
process<br />
memory<br />
memory<br />
cpu<br />
cpu<br />
threads<br />
cpus<br />
MPI_Send<br />
MPI_Recv<br />
9<br />
13<br />
Shared Memory Directives<br />
Multiple threads share global memory<br />
Most common variant: OpenMP<br />
Program loop iterations distributed to threads,<br />
more recent task features<br />
Each thread has a means to refer to private objects<br />
within a parallel context<br />
Terminology<br />
Thread, thread team<br />
Implementation<br />
Threads map to user threads running on one SMP node<br />
Extensions to distributed memory not so successful<br />
OpenMP is a good model to use within a node<br />
Message Passing<br />
Participating processes communicate using a message-passing<br />
API<br />
Remote data can only be communicated (sent or received) via<br />
the API<br />
MPI (the Message Passing Interface) is the standard<br />
Implementation:<br />
MPI processes map to processes within one SMP node or<br />
across multiple networked nodes<br />
API provides process numbering, point-to-point and collective<br />
messaging operations<br />
Mostly used in two-sided way, each endpoint coordinates in<br />
sending and receiving<br />
10<br />
14<br />
Cooperating Processes Models<br />
SHMEM<br />
process 0<br />
memory<br />
process 1<br />
memory<br />
PROBLEM<br />
cpu<br />
cpu<br />
processes<br />
shmem_put(a,b<br />
11<br />
15<br />
Message Passing, MPI<br />
SHMEM<br />
process<br />
memory<br />
memory<br />
memory<br />
Participating processes communicate using an API<br />
Fundamental operations are based on one-sided PUT and GET<br />
Need to use symmetric memory locations<br />
Remote side of communication does not participate<br />
Can test for completion<br />
Barriers and collectives<br />
Popular on Cray and SGI hardware, also Blue Gene version<br />
To make sense needs hardware support for low-latency RDMAtype<br />
operations<br />
cpu<br />
cpu<br />
cpu<br />
12<br />
28<br />
16
UPC<br />
<strong>Fortran</strong> coarray model<br />
thread<br />
thread<br />
thread<br />
process<br />
process<br />
process<br />
memory<br />
memory<br />
memory<br />
memory<br />
memory<br />
memory<br />
cpu<br />
cpu<br />
cpu<br />
cpu<br />
cpu<br />
cpu<br />
17<br />
21<br />
UPC<br />
<strong>Fortran</strong> coarray model<br />
thread<br />
thread<br />
thread<br />
process<br />
process<br />
process<br />
memory<br />
memory<br />
memory<br />
memory<br />
memory<br />
memory<br />
cpu<br />
cpu<br />
cpu<br />
upc_forall(i=0;i
Coarray <strong>Fortran</strong><br />
"Coarrays were designed to answer the question:<br />
What is the smallest change required to convert <strong>Fortran</strong><br />
into a robust and efficient parallel language?<br />
The answer: a simple syntactic extension.<br />
It looks and feels like <strong>Fortran</strong> and requires<br />
<strong>Fortran</strong> programmers to learn only a few new rules."<br />
Accessing coarrays<br />
integer :: a(4)[*], b(4)[*] !declare coarrays<br />
b(:) = a(:)[n] ! copy<br />
integer arrays a and b declared to be size 4 on all images<br />
copy array a from remote image n into local array b<br />
() for local access [] for remote access<br />
e.g. for two images and n = 2:<br />
image 1 image 2<br />
John Reid,<br />
ISO <strong>Fortran</strong> Convener<br />
a<br />
b<br />
1 2 3 4 a 2 9 3 7<br />
25 96<br />
37<br />
78<br />
b 10 2 11 9 12 3 13 7<br />
25<br />
29<br />
Some History<br />
Introduced in current form by Numrich and Reid in 1998 as a<br />
simple extension to <strong>Fortran</strong> 95 for parallel processing<br />
Many years of experience, mainly on Cray hardware<br />
A set of core features are now part of the <strong>Fortran</strong> standard<br />
ISO/IEC 1539-1:2010<br />
Additional features are expected to be published in a<br />
Technical Specification in due course.<br />
Synchronisation<br />
Be careful when updating coarrays:<br />
If we get remote data was it valid?<br />
Could another process send us data and overwrite<br />
something we have not yet used?<br />
How do we know that data sent to us has arrived?<br />
<strong>Fortran</strong> provides synchronisation statements<br />
For example, barrier for synchronisation of all images:<br />
sync all<br />
do not make assumptions about execution timing on images<br />
unless executed after synchronisation<br />
Note there is implicit synchronisation at program start<br />
26<br />
30<br />
How Does It Work?<br />
SPMD - Single Program, Multiple Data<br />
single program replicated a fixed number of times<br />
Each replication is called an image<br />
Images are executed asynchronously<br />
execution path may differ from image to image<br />
some situations cause images to synchronize<br />
Images access remote data using coarrays<br />
Normal rules of <strong>Fortran</strong> apply<br />
Retrieving information about images<br />
Two intrinsics provide index of this image and number of<br />
images<br />
this_image() (image indexes start at 1)<br />
num_images()<br />
real :: x[*]<br />
if(this_image() == 1) then<br />
read *,x<br />
do image = 2,num_images()<br />
x[image] = x<br />
end do<br />
end if<br />
sync all<br />
27<br />
31<br />
What are coarrays?<br />
Arrays or scalars that can be accessed remotely<br />
images can access data objects on any other image<br />
Additional <strong>Fortran</strong> syntax for coarrays<br />
Specifying a codimension declares a coarray<br />
real, dimension(10), codimension[*]:: x<br />
real :: x(10)[*]<br />
Making remote references<br />
We used a loop over images<br />
do image = 2,num_images()<br />
x[image] = x<br />
end do<br />
Note that array indexing within the coindex is not allowed<br />
so we can not write<br />
these are equivalent declarations of a array x<br />
of size 10 on each image<br />
x is now remotely accessible<br />
coarrays have the same size on each image!<br />
x[2:num_images()] = x<br />
! illegal<br />
28<br />
30<br />
32
Data usage<br />
coarrays have the same size on every image<br />
Declarations:<br />
round brackets () describe rank, shape and extent of local<br />
data<br />
square brackets [] describe layout of images that hold local<br />
data<br />
Many HPC problems have physical quantities mapped to n-<br />
dimensional grids<br />
You need to implement your view of global data from the local<br />
coarrays as <strong>Fortran</strong> does not provide the global view<br />
You can be flexible with the coindexing (see later)<br />
You can use any access pattern you wish<br />
Example: maximum of array<br />
real :: a(10)<br />
real :: maximum[*]<br />
implicit synchronisation<br />
call random_number(a)<br />
maximum = maxval(a)<br />
ensure all images set local maximum<br />
sync all<br />
if (this_image() == 1) then<br />
do image = 2, num_images()<br />
maximum = max(maximum, maximum[image])<br />
end do<br />
do image = 2, num_images()<br />
maximum[image] = maximum<br />
end do<br />
end if<br />
ensure all images have copy of maximum value<br />
sync all<br />
33<br />
37<br />
Data usage<br />
processors<br />
4 elements per processor = 4 coarrays on 4 images<br />
integer :: ca(4)[*]<br />
do image=1,num_images()<br />
print *,ca(:)[image]<br />
end do<br />
Recap<br />
We now know the basics of coarrays<br />
declarations<br />
references with []<br />
this_image() and num_images()<br />
sync all<br />
A<br />
ca(1:4)[1] ca(1:4)[2] ca(1:4)[3] ca(1:4)[4]<br />
Now consider a full program example...<br />
image 1 image 2 image 3 image 4<br />
34<br />
38<br />
1D cyclic data access<br />
coarray declarations remain unchanged<br />
but we use a cyclic access pattern<br />
integer :: ca(4)[*]<br />
do i=1,4<br />
do image=1,num_images()<br />
print *,ca(i)[image]<br />
end do<br />
end do<br />
A<br />
Example2: Calculate density of primes<br />
program pdensity<br />
implicit none<br />
integer, parameter :: n=10000000, nimages=8<br />
integer start,end,i<br />
integer, dimension(nimages) :: nprimes[*]<br />
real density<br />
start = (this_image()-1) * n/num_images() + 1<br />
end = start + n/num_images() - 1<br />
nprimes(this_image())[1] = num_primes(start,end)<br />
...<br />
...<br />
...<br />
...<br />
sync all<br />
image 1 image 2 image 3 image 4<br />
35<br />
39<br />
Synchronisation<br />
code execution on images is independent<br />
programmer has to control execution using synchronisation<br />
synchronise before accessing coarrays<br />
ensure content is not updated from remote images before<br />
you can use it<br />
synchronise after accessing coarrays<br />
ensure new content is available to all images<br />
implicit synchronisation after variable declarations at first<br />
executable statement<br />
guarantees coarrays exist on all images when your first<br />
program statement is executed<br />
We will revisit this topic later<br />
Example2: Calculate density of primes<br />
if (this_image()==1) then<br />
nprimes(1)=sum(nprimes)<br />
density=real(nprimes(1))/n<br />
print *,"Calculating prime density on", &<br />
& num_images(),"images"<br />
print *,nprimes(1),'primes in',n,'numbers'<br />
write(*,'(" density is ",2Pf0.2,"%")')density<br />
write(*,'(" asymptotic theory gives ", &<br />
& 2Pf0.2,"%")')1.0/(log(real(n))-1.0)<br />
end if<br />
36<br />
31<br />
40
Example2: Calculate density of primes<br />
Calculating prime density on 2 images<br />
664580 primes in 10000000 numbers<br />
density is 6.65%<br />
asymptotic theory gives 6.61%<br />
Backup Slides<br />
HPF model<br />
41<br />
45<br />
Launching a coarray program<br />
The <strong>Fortran</strong> standard does not specify how a program is<br />
launched<br />
The number of images may be set at compile, link or run-time<br />
A compiler could optimize for a single image<br />
Examples on Linux<br />
Cray XE<br />
aprun n 16000 solver<br />
g95<br />
./solver --g95 -images=2<br />
High Performance <strong>Fortran</strong> (HPF)<br />
Data Parallel programming model<br />
Single thread of control<br />
Arrays can be distributed and operated on in parallel<br />
Loosely synchronous<br />
Parallelism mainly from <strong>Fortran</strong> 90 array syntax, FORALL and<br />
intrinsics.<br />
This model popular on SIMD hardware (AMT DAP, Connection<br />
Machines) but extended to clusters where control thread is<br />
replicated<br />
42<br />
46<br />
Observations so far on coarrays<br />
HPF<br />
Natural extension, easy to learn<br />
Makes parallel parts of program obvious (syntax)<br />
Part of <strong>Fortran</strong> language (type checking, etc)<br />
No mapping of data to buffers (or copying) or creation of<br />
complex types (as we might have with MPI)<br />
Compiler can optimize for communication<br />
memory<br />
pe<br />
memory<br />
pe<br />
memory<br />
pe<br />
memory<br />
pe<br />
More observations later...<br />
memory<br />
cpu<br />
43<br />
47<br />
Exercise Session 1<br />
HPF<br />
Look at the Exercise Notes document for full details<br />
memory<br />
memory<br />
memory<br />
memory<br />
number of images<br />
pe<br />
pe<br />
pe<br />
pe<br />
Extend the simple <strong>Fortran</strong> code provided in order to perform<br />
operations on parts of a picture using coarrays<br />
memory<br />
A=SQRT(A)<br />
A (distributed)<br />
cpu<br />
44<br />
32<br />
48
2D Data<br />
More Coarray Features<br />
However, images are not restricted to a 1D arrangement<br />
For example, we can arrange images in 2x2 grid<br />
coarrays with 2 codimensions<br />
integer :: ca(4)[2,*]<br />
ca(:)[1,1] ca(:)[1,2]<br />
Parallel Programming with <strong>Fortran</strong> Coarrays<br />
Delivered at PRACE Advanced <strong>Training</strong> Centre,<br />
CSC IT Center for Science Ltd, Finland,<br />
September 13, 2012<br />
ca(:)[2,1] ca(:)[2,2]<br />
David Henty, Alan Simpson (EPCC)<br />
Harvey Richardson, Bill Long (Cray)<br />
image 1 image 2 image 3 image 4<br />
5<br />
Overview<br />
2D Local Array on 2D Grid<br />
Multiple Dimensions and Codimensions<br />
ca(1:4,1:4)[1,1] ca(1:4,1:4)[1,2]<br />
Allocatable Coarrays and Components of Coarray<br />
Structures<br />
Coarrays and Procedures<br />
image 1<br />
A<br />
image 3<br />
ca(1:4,1:4)[2,1] ca(1:4,1:4)[2,2]<br />
image 2<br />
global access: ca(3,1)[2,2]<br />
local access: ca(3,1)<br />
image 4<br />
2<br />
6<br />
Mapping data to images<br />
Coarray Subscripts<br />
P(m,n)[*]<br />
PROBLEM<br />
images<br />
Physical quantity<br />
PRESSURE<br />
Variables/arrays<br />
P(m,n)<br />
P(m,n)[k,*]<br />
images<br />
<strong>Fortran</strong> arrays defined by rank, bounds and shape<br />
integer, dimension(10,4) :: array<br />
rank 2<br />
lower bounds 1, 1; upper bounds 10, 4<br />
shape [10, 4]<br />
Coarray <strong>Fortran</strong> adds corank, cobounds and coshape<br />
integer :: array(10,4)[3,*]<br />
corank 2<br />
lower cobounds 1, 1; upper cobounds 3, m<br />
coshape [3, m]<br />
m would be ceiling(num_images()/3)<br />
3<br />
7<br />
2D Data<br />
assemble rather than distribute<br />
-<br />
Can assemble a 2D data structure from 1D arrays<br />
integer :: ca(4)[*]<br />
image 1<br />
-<br />
image 3<br />
Multiple Codimensions<br />
Coarrays with multiple Codimensions:<br />
character :: a(4)[2, *] !2D grid of images<br />
for 4 images, grid is 2x2; for 16 images, grid is 2x8<br />
real :: b(8,8,8)[10,5,*] !3D grid of images<br />
8x8x8 local array; with 150 images, grid is 10x5x3<br />
integer :: c(6,5)[0:9,0:*] !2D grid of images<br />
lower cobounds [ 0, 0 ]; upper cobounds [ 9,n]<br />
useful if you want to interface with MPI or want C like coding<br />
Sum of rank and corank should not exceed 15<br />
Flexibility with cobounds<br />
can set all but final upper cobound as required<br />
image 2<br />
image 4<br />
4<br />
8
Codimensions: What They Mean<br />
this_image() & image_index()<br />
for that coarray only<br />
A map so an image can find the coarray on any other image<br />
access the coarray using its grid coordinates<br />
e.g. character a(4)[2, *] on 6 images<br />
gives a 2 x 3 image grid<br />
usual <strong>Fortran</strong> subscript order to determine image index<br />
Axis 1<br />
Axis 2<br />
1<br />
2<br />
1<br />
image 1<br />
2<br />
image 3<br />
image 2 image 4<br />
a(2)[2,3]<br />
a(4)[1,2]<br />
3<br />
image 5<br />
image 6<br />
this_image()<br />
returns the image index, i.e., number between 1 and<br />
num_images()<br />
this_image(z)<br />
returns the rank-one integer array of cosubscripts for the<br />
calling image corresponding to the coarray z<br />
this_image(z, dim) returns cosubscript of<br />
codimension dim of z<br />
image_index(z, sub)<br />
returns image index with cosubscripts sub for coarray z<br />
sub is a rank-one integer array<br />
9<br />
13<br />
Codimensions and Array-Element Order<br />
Example 1<br />
Storage order for multi-dimensional<br />
<strong>Fortran</strong> arrays<br />
Ordering of images in multi-dimensional<br />
cogrids<br />
PROGRAM CAF_Intrinsics<br />
this_image() = 2<br />
this_image() = 5<br />
this_image(b) = [1, 2]<br />
image_index(b,[3,2]) = 7<br />
this_image(b) = [2, 1]<br />
real p(2,3,8)<br />
real q(4)[2,3,*]<br />
real :: b(90,96)[4,*]<br />
image_index(b,[3,2]) = 7<br />
1<br />
2<br />
Location Element<br />
1 p(1,1,1)<br />
2 p(2,1,1)<br />
3 p(1,2,1)<br />
4 p(2,2,1)<br />
5 p(1,3,1)<br />
6 p(2,3,1)<br />
7 p(1,1,2)<br />
8 p(2,1,2)<br />
Image Elements<br />
1 q(1:4)[1,1,1]<br />
2 q(1:4)[2,1,1]<br />
3 q(1:4)[1,2,1]<br />
4 q(1:4)[2,2,1]<br />
5 q(1:4)[1,3,1]<br />
6 q(1:4)[2,3,1]<br />
7 q(1:4)[1,1,2]<br />
8 q(1:4)(2,1,2]<br />
this_image()<br />
this_image(b)<br />
image_index(b,[3,2])<br />
Axis 1<br />
Axis 2<br />
1<br />
2<br />
3<br />
4<br />
48 p(2,3,8)<br />
48 q(1:4)[2,3,8]<br />
END PROGRAM CAF_Intrinsics<br />
this_image() = 7<br />
this_image(b) = [3, 2]<br />
10<br />
image_index(b,[3,2]) = 7<br />
14<br />
Multi Codimensions: An Example<br />
Domain Decomposition<br />
() gives local domain size<br />
[] provides image grid and easy access to other images<br />
Example 2<br />
PROGRAM CAF_Intrinsics<br />
this_image() = 96<br />
this_image(c) = [1, 0, 4]<br />
image_index(c,[1,0,4]) = 96<br />
2D domain decomposition of Braveheart<br />
Global data is 360 x 192<br />
real :: c(4,4,4)[5,-1:4,*]<br />
Axis 3<br />
Domain decomposition on 8 images with 4 x 2 grid<br />
local array size: (360 / 4) x (192 / 2) = 90 x 96<br />
declaration = real :: localPic(90,96)[4,*]<br />
this_image()<br />
Axis 1<br />
Axis 2<br />
Axis 2<br />
Axis 1<br />
this_image(c)<br />
360<br />
image_index(c,[1,0,4])<br />
END PROGRAM CAF_Intrinsics<br />
this_image() = 13<br />
this_image(c) = [3, 1, 1]<br />
image_index(c,[1,0,4]) = 96<br />
this_image() = 90<br />
this_image(c) = [5, 4, 3]<br />
image_index(c,[1,0,4]) = 96<br />
192<br />
11<br />
15<br />
Multi Codimensions: An Example<br />
Domain Decomposition<br />
() gives local domain size<br />
[] provides image grid and easy access to other images<br />
2D domain decomposition of Braveheart<br />
Boundary Swapping<br />
PROGRAM CAF_HaloSwap<br />
integer, parameter :: nximages = 4, nyimages = 2<br />
integer, parameter :: nxlocal = 90, nylocal = 96<br />
real :: pic(0:nxlocal+1, 0:nylocal+1)[nximages,*] ! Declare coarray with halos<br />
integer :: myimage(2) ! Array for my row & column coordinates<br />
Global data is 360 x 192<br />
myimage = this_image(pic) ! Find my row & column coordinates<br />
Find cosubscripts<br />
Domain decomposition on 8 images with 4 x 2 grid<br />
local array size: (360 / 4) x (192 / 2) = 90 x 96<br />
declaration = real :: localPic(90,96)[4,*]<br />
image 1<br />
Axis 1<br />
Axis 2<br />
1<br />
1<br />
2<br />
image 5<br />
image 6<br />
! Initialise pic on each image<br />
sync all<br />
Ensures pic initialised before accessed by other images<br />
! Halo swap<br />
if (myimage(1) > 1) &<br />
pic(0,1:nylocal) = pic(nxlocal,1:nylocal)[myimage(1)-1,myimage(2)]<br />
if (myimage(1) < nximages) &<br />
pic(nxlocal+1,1:nylocal) = pic(1,1:nylocal)[myimage(1)+1,myimage(2)]<br />
image 3<br />
90<br />
image 2<br />
2<br />
image 7<br />
if (myimage(2) > 1) &<br />
pic(1:nxlocal,0) = pic(1:nxlocal,nylocal)[myimage(1),myimage(2)-1]<br />
if (myimage(2) < nyimages)<br />
pic(1:nxlocal,nylocal+1) = pic(1:nxlocal,1)[myimage(1),myimage(2)+1]<br />
96<br />
3<br />
sync all<br />
Ensures all images have got old values before pic is updated<br />
image 4<br />
image 8<br />
! Update pic on each image<br />
4<br />
END PROGRAM CAF_HaloSwap<br />
12<br />
16
Allocatable Coarrays<br />
Can have allocatable Coarrays<br />
real, allocatable :: x(:)[:], s[:,:]<br />
n = num_images()<br />
allocate(x(n)[*], s[4,*])<br />
Must specify cobounds in allocate statement<br />
The size and value of each bound and cobound must be same<br />
on all images.<br />
allocate(x(this_image())[*]) ! Not allowed<br />
allocate statement involving coarrays<br />
deallocate statements involving coarrays<br />
Coarrays and Procedures<br />
An explicit interface is required if a dummy argument is a<br />
coarray<br />
Dummy argument associated with coarray, not a copy<br />
avoids synchronisation on entry and return<br />
Other restrictions on passing coarrays are:<br />
the actual argument should be contiguous<br />
a(:,2) is OK, but a(2,:) is not contiguous<br />
or the dummy argument should be assumed shape<br />
... to avoid copying<br />
Function results cannot be coarrays<br />
17<br />
21<br />
21<br />
Differently Sized Coarray Components<br />
A coarray structure component can vary in size per image<br />
Declare a coarray of derived type with a component that is<br />
!Define data type with allocatable component<br />
type diffSize<br />
real, allocatable :: data(:)<br />
end type diffSize<br />
!Declare coarray of type diffSize<br />
type(diffSize) :: x[*]<br />
! Allocate x%data to a different size on each image<br />
allocate(x%data(this_image())<br />
Coarrays as Dummy Arguments<br />
As with standard <strong>Fortran</strong> arrays, the coarray dummy arguments<br />
in procedures can be:<br />
Explicit shape: each dimension of a coarray declared with explicit value<br />
Assumed shape: extents and bounds determined by actual array<br />
Assumed size: only size determined from actual array<br />
Allocatable: the size and shape can be determined at run-time<br />
subroutine s(n, a, b, c, d)<br />
integer :: n<br />
real :: a(n) [n,*] ! explicit shape - permitted<br />
real :: b(:,:) [*] ! assumed shape - permitted<br />
real :: c(n,*) [*] ! assumed size - permitted<br />
real, allocatable :: d(:) [:,:] ! allocatable - permitted<br />
18<br />
22<br />
22<br />
Pointer Coarray Structure Components<br />
We are allowed to have a coarray that contains components<br />
that are pointers<br />
Note that the pointers have to point to local data<br />
We can then access one of the pointers on a remote image to<br />
get at the data it points to<br />
This technique is useful when adding coarrays into an existing<br />
MPI code<br />
We can insert coarray code deep in call tree without<br />
changing many subroutine argument lists<br />
Example follows...<br />
Assumed Size Coarrays<br />
Allow the coshape to be remapped to corank 1<br />
program cmax<br />
real, codimension[8,*] :: a(100), amax<br />
a = [ (i, i=1,100) ] * this_image() / 100.0<br />
amax = maxval( a )<br />
sync all<br />
amax = AllReduce_max(amax)<br />
...<br />
contains<br />
real function AllReduce_max(r) result(rmax)<br />
real :: r[*]<br />
sync all<br />
rmax = r<br />
do i=1,num_images()<br />
rmax = max( rmax, r[i] )<br />
end do<br />
sync all<br />
end function AllReduce_max<br />
19<br />
23<br />
Pointer Coarray Structure Components...<br />
Existing non-coarray arrays u,v,w<br />
Create a type (coords) to hold pointers (x,y,z) that we use to point<br />
to x,y,z. We can use the vects coarray to access u, v, w.<br />
subroutine calc(u,v,w)<br />
real, intent(in), target, dimension(100) :: u,v,w<br />
type coords<br />
real, pointer, dimension(:) :: x,y,z<br />
end type coords<br />
type(coords), save :: vects[*]<br />
vects%x => u ; vects%y => v ; vects%z => w<br />
sync all<br />
firstx = vects[1]%x(1)<br />
Coarrays Local to a Procedure<br />
Coarrays declared in procedures must have save attribute<br />
unless they are dummy arguments or allocatable<br />
save attribute: retains value between procedure calls<br />
avoids synchronisation on entry and return<br />
Automatic coarrays are not permitted<br />
Automatic array: local array whose size depends on dummy arguments<br />
would require synchronisation for memory allocation and deallocation<br />
would need to ensure coarrays have same size on all images<br />
subroutine t(n)<br />
integer :: n<br />
real :: temp(n)[*] ! automatic - not permitted<br />
integer, save :: x(4)[*] ! coarray with save attribute<br />
integer :: y(4)[*] ! not saved not permitted<br />
20<br />
35<br />
24
Summary<br />
Coarrays with multiple codimensions used to create a grid of<br />
images<br />
() gives local domain information<br />
[] gives an image grid with easy access to other images<br />
Can be used in various ways to assemble a multi-dimensional<br />
data set<br />
this_image() and image_index()<br />
are intrinsic functions that give information about the images in an<br />
multi-codimension grid<br />
Flexibility from non-coarray allocatable and pointer<br />
components of coarray structures<br />
Coarrays can be allocatable, can be passed as arguments<br />
to procedures, and can be dummy arguments<br />
25<br />
36
Synchronisation mistakes<br />
Advanced Features<br />
Parallel Programming with <strong>Fortran</strong> Coarrays<br />
Delivered at PRACE Advanced <strong>Training</strong> Centre,<br />
CSC IT Center for Science Ltd, Finland,<br />
September 13, 2012<br />
David Henty, Alan Simpson (EPCC)<br />
Harvey Richardson, Bill Long (Cray)<br />
This code is wrong<br />
subroutine allreduce_max_getput(v,vmax)<br />
double precision, intent(in) :: v[*]<br />
double precision, intent(out) :: vmax[*]<br />
integer i<br />
sync all<br />
vmax=v<br />
if (this_image()==1) then<br />
do i=2,num_images()<br />
vmax=max(vmax,v[i])<br />
end do<br />
do i=2,num_images()<br />
vmax[i]=vmax<br />
end do<br />
end if<br />
sync all<br />
5<br />
Advanced Features: Overview<br />
Execution segments and Synchronisation<br />
Non-global Synchronisation<br />
Critical Sections<br />
Visibility of changes to memory<br />
Other Intrinsics<br />
Miscellaneous features<br />
Future developments<br />
Synchronisation mistakes<br />
It breaks the rules<br />
subroutine allreduce_max_getput(v,vmax)<br />
double precision, intent(in) :: v[*]<br />
double precision, intent(out) :: vmax[*]<br />
integer i<br />
sync all<br />
vmax=v<br />
if (this_image()==1) then<br />
do i=2,num_images()<br />
vmax=max(vmax,v[i])<br />
end do<br />
do i=2,num_images()<br />
vmax[i]=vmax<br />
end do<br />
end if<br />
sync all<br />
2<br />
6<br />
More on Synchronisation<br />
We have to be careful with one-sided updates<br />
If we read remote data, was it valid?<br />
Could another process send us data and overwrite<br />
something we have not yet used?<br />
How do we know when remote data has arrived?<br />
The standard introduces execution segments to deal with this:<br />
segments are bounded by image control statements<br />
The standard can be summarized as follows:<br />
If a variable is defined in a segment, it must not be referenced,<br />
defined, or become undefined in another segment unless the<br />
segments are ordered John Reid<br />
Synchronisation mistakes<br />
This is ok<br />
subroutine allreduce_max_getput(v,vmax)<br />
double precision, intent(in) :: v[*]<br />
double precision, intent(out) :: vmax[*]<br />
integer i<br />
sync all<br />
if (this_image()==1) then<br />
vmax=v<br />
do i=2,num_images()<br />
vmax=max(vmax,v[i])<br />
end do<br />
do i=2,num_images()<br />
vmax[i]=vmax<br />
end do<br />
end if<br />
sync all<br />
3<br />
7<br />
Execution Segments<br />
image 1<br />
program hot<br />
double precision :: a(n)<br />
double precision :: temp(n)[*]<br />
!...<br />
if (this_image() == 1) then<br />
do i=1, num_images()<br />
read *,a<br />
temp(:)[i] = a<br />
end do<br />
end if<br />
temp = temp + 273d0<br />
sync all<br />
call ensemble(temp)<br />
2<br />
image 2<br />
program hot<br />
double precision :: a(n)<br />
double precision :: temp(n)[*]<br />
!...<br />
if (this_image() == 1) then<br />
do i=1, num_images()<br />
read *,a<br />
temp(:)[i] = a<br />
end do<br />
end if<br />
temp = temp + 273d0<br />
sync all<br />
call ensemble(temp)<br />
More about sync all<br />
Usually all images execute the same sync all statement<br />
But this is not a requirement...<br />
Images execute different code with different sync all<br />
statements<br />
All images execute the first sync all they come across<br />
this may match an arbitrary sync all on another image<br />
causing incorrect execution and/or deadlock<br />
ordering<br />
iimage synchronisation points<br />
wrong answers<br />
4<br />
37<br />
8
More about sync all<br />
e.g. Image practical: wrong answer<br />
! Do halo swap, taking care at the upper and lower picture boundaries<br />
if (myimage < numimage) then<br />
oldpic(1:nxlocal, nylocal+1) = oldpic(1:nxlocal, 1)[myimage+1]<br />
sync all<br />
end if<br />
! ... and the same for down halo<br />
! Now update the local values of newpic<br />
...<br />
All images NOT executing this sync all<br />
! Need to synchronise to ensure that all images have finished reading the<br />
! oldpic halo values on this image before overwriting it with newpic<br />
sync all<br />
oldpic(1:nxlocal,1:nylocal) = newpic(1:nxlocal,1:nylocal)<br />
! Need to synchronise to ensure that all images have finished updating<br />
! their oldpic arrays before this image reads any halo data from them<br />
sync all<br />
All images ARE executing this sync all<br />
Other Synchronisation<br />
lock and unlock statements<br />
Control access to data defined or referenced by more than one<br />
image<br />
as opposed to critical which controls access to lines of<br />
code<br />
USE iso_fortran_env module and define coarray of<br />
type(lock_type)<br />
e.g. to lock data on image 2<br />
type(lock_type) :: qLock[*]<br />
lock(qLock[2])<br />
!access data on image 2<br />
unlock(qLock[2])<br />
9<br />
13<br />
More about sync all<br />
sync images(imageList)<br />
Performs a synchronisation of the image executing sync<br />
images with each of the images specified in imageList<br />
imageList can be an array or a scalar<br />
if (myimage < numimage) then<br />
oldpic(1:nxlocal, nylocal+1) = oldpic(1:nxlocal, 1)[myimage+1]<br />
end if<br />
if (myimage > 1) then<br />
oldpic(1:nxlocal, 0) = oldpic(1:nxlocal, nylocal)[myimage-1]<br />
end if<br />
! Now perform local pairwise synchronisations<br />
if (myimage == 1 ) then<br />
sync images( 2 )<br />
else if (myimage == numimage) then<br />
sync images( numimage-1 )<br />
else<br />
sync images( (/ myimage-1, myimage+1 /) )<br />
end if<br />
Other Intrinsic functions<br />
lcobound(z)<br />
Returns lower cobounds of the coarray z<br />
lcobound(z,dim) returns lower cobound for<br />
codimension dim of z<br />
ucobound(z)<br />
Returns upper cobounds of the coarray z<br />
lcobound(z,dim) returns upper cobound for<br />
codimension dim of z<br />
real :: array(10)[4,0:*] on 16 images<br />
lcobound(array) returns [ 1, 0 ]<br />
ucobound(array) returns [ 4, 3 ]<br />
10<br />
14<br />
Other Synchronisation<br />
Critical sections<br />
Limit execution of a piece of code to one image at a time<br />
e.g. calculating global sum on master image<br />
integer :: a(100)[*]<br />
integer :: globalSum[*] = 0, localSum<br />
... ! Initialise a on each image<br />
localSum = SUM(a) !Find localSum of a on each image<br />
critical<br />
globalSum[1] = globalSum[1] + localSum<br />
end critical<br />
More on Cosubscripts<br />
integer :: a[*] on 8 images<br />
cosubscript a[9] is not valid<br />
real :: b(10)[3,*] on 8 images<br />
ucobound(b) returns [ 3, 3 ]<br />
cosubscript b[2,3]<br />
cosubscript b[3,3] is invalid (image 9)<br />
Programmer needs to make sure that cosubscripts are valid<br />
image_index returns 0 for invalid cosubscripts<br />
11<br />
15<br />
Other Synchronisation<br />
sync memory<br />
Coarray data held in caches/registers made visible to all images<br />
requires some other synchronisation to be useful<br />
unlikely to be used in most coarray codes<br />
Example usage: Mixing MPI and coarrays<br />
loop: coarray operations<br />
sync memory<br />
call MPI_Allreduce(...)<br />
sync memory implied for sync all and sync images<br />
Assumed Size Coarrays<br />
Codimensions can be remapped to corank greater than 1<br />
useful for determining optimal extents at runtime<br />
program 2d<br />
real, codimension[*] :: picture(100,100)<br />
integer :: numimage, numimagex, numimagey<br />
numimage = num_images()<br />
call get_best_2d_decomposition(numimage,&<br />
numimagex, numimagey)<br />
! Assume this ensures numimage=numimagex*numimagey<br />
call dothework(picture, numimagex, numimagey)<br />
...<br />
contains<br />
subroutine dothework(array, m, n)<br />
real, codimension[m,*] :: array(100,100)<br />
...<br />
end subroutine dothework<br />
12<br />
38<br />
16
I/O<br />
Each image has its own set of input/output units<br />
units are independent on each image<br />
Default input unit is preconnected on image 1 only<br />
,<br />
Default output unit is available on all images<br />
,<br />
It is expected that the implementation will merge<br />
records from each image into one stream<br />
TS: Teams...<br />
To define a set of images as a team<br />
call form_team(oddteam,[ (i,i=1,n,2) ])<br />
To synchronise the team<br />
sync team(oddteam)<br />
To determine images that constitute a team:<br />
oddimages=team_images(oddteam)<br />
17<br />
21<br />
Program Termination<br />
STOP or END PROGRAM statements initiate normal<br />
termination which includes a synchronisation step<br />
normal termination<br />
Other images can test for this using STAT= specifier to<br />
synchronisation calls or allocate/deallocate<br />
test for STAT_STOPPED_IMAGE (defined in<br />
ISO_FORTRAN_ENV module)<br />
The ERROR STOP statement initiates error<br />
termination and it is expected all images will be<br />
terminated.<br />
TS: Collectives<br />
Collective operations a key part of real codes<br />
broadcast<br />
global sum<br />
...<br />
Supported in other parallel models<br />
OpenMP reductions<br />
MPI_Allreduce<br />
Not currently supported for coarrays<br />
efficient implementation by hand is difficult<br />
calling external MPI routines rather ugly<br />
18<br />
22<br />
Coarray Technical Specification<br />
Additional coarray features may be described in a<br />
Technical Specification (TS)<br />
Developed as part of the official ISO standards process<br />
Work in progress and the areas of discussion are:<br />
image teams<br />
collective intrinsics for coarrays<br />
atomics<br />
TS: Collective intrinsic subroutines<br />
Collectives, with in/out arguments, invoked by same statement<br />
on all images (or team of images)<br />
Routines<br />
CO_BCAST<br />
CO_SUM and other reduction operations<br />
basically reproduce the MPI functionality<br />
Arguments include SOURCE, RESULT, TEAM<br />
Still discussion on need for implicit synchronisation and<br />
argument types (for example non-coarray arguments)<br />
19<br />
23<br />
TS: Teams<br />
Often useful to consider subsets of processes<br />
e.g. MPI communicators<br />
TS: Atomic operations<br />
Critical or lock synchronisation sometimes overkill<br />
counter[1] = counter[1] + 1<br />
Subsets not currently supported in <strong>Fortran</strong>, e.g.<br />
sync all: all images<br />
sync images: pairwise mutual synchronisation<br />
Extension involves TEAMS of images<br />
user creates teams<br />
specified as an argument to various functions<br />
Simple atomic operations can be optimised<br />
e.g. OpenMP atomic<br />
!$OMP atomic<br />
sharedcounter = sharedcounter + 1<br />
New variable types and operations for coarrays<br />
20<br />
39<br />
24
TS: Atomic variables<br />
<strong>Fortran</strong> already includes some atomic support (define,ref)<br />
TS expands on this to supports atomic compare and swap,<br />
integer (atomic_int_kind) :: counter[*]<br />
call atomic_define(counter[1],0)<br />
call atomic_add(counter[1],1)<br />
call atomic_ref(countval,counter[1])<br />
25<br />
40
Implementations we have used<br />
Experiences with<br />
Coarrays<br />
Parallel Programming with <strong>Fortran</strong> Coarrays<br />
Delivered at PRACE Advanced <strong>Training</strong> Centre,<br />
CSC IT Center for Science Ltd, Finland,<br />
September 13, 2012<br />
David Henty, Alan Simpson (EPCC)<br />
Harvey Richardson, Bill Long (Cray<br />
Cray X1/X2<br />
Hardware supports communication by direct load/store<br />
Very efficient with low overhead<br />
Cray XT<br />
PGAS (UPC,CAF) layered on GASNet/portals (so messaging)<br />
Not that efficient<br />
Cray XE<br />
PGAS layered on DMAPP portable layer over Gemini<br />
network hardware<br />
Intermediate between XT and X1/2<br />
Intel Composer XE 2011<br />
SMP and message-passing runtimes<br />
5<br />
Overview<br />
Implementations<br />
Performance considerations<br />
Where to use the coarray model<br />
Coarray benchmark suite<br />
Examples of coarrays in practice<br />
References<br />
Wrapup<br />
Implementations we have used...<br />
g95 on shared-memory<br />
Using cloned process images on Linux<br />
This is not being actively developed<br />
2<br />
6<br />
Implementation Status<br />
Intel XE on Ubuntu VM<br />
History of coarrays dates back to Cray implementations<br />
Expect support from vendors as part of <strong>Fortran</strong> <strong>2008</strong><br />
G95 had multi-image support in 2010<br />
has not been updated for some time<br />
gfortran<br />
Introduced single-image support at version 4.6<br />
Intel: multi-process coarray support in Intel Composer XE 2011<br />
(based on <strong>Fortran</strong> <strong>2008</strong> draft)<br />
Runtimes are SMP, GASNet and compiler/vendor runtimes<br />
GASNet has support for multiple environments<br />
(IB, Myrinet, MPI, UDP and Cray/IBM systems) so<br />
could be an option for new implementations<br />
3<br />
7<br />
Implementation Status (Cray)<br />
Cray has supported coarrays and UPC on various architectures<br />
over the last decade (from T3E)<br />
Full PGAS support on the Cray XT/XE<br />
Cray Compiling Environment 7.0 Dec <strong>2008</strong><br />
Current release is Cray Compiler Environment 7.4<br />
Full <strong>Fortran</strong> <strong>2008</strong> coarray support<br />
Full <strong>Fortran</strong> <strong>2003</strong> with some <strong>Fortran</strong> <strong>2008</strong> features<br />
Fully integrated with the Cray software stack<br />
Same compiler drivers, job launch tools, libraries<br />
Integrated with Craypat Cray performance tools<br />
Can mix MPI and coarrays<br />
When to use coarrays<br />
Two obvious contexts<br />
Complete application using coarrays<br />
Mixed with MPI<br />
As an incremental addition to a (potentially large) serial code<br />
As an incremental addition to an MPI code (allowing reuse of<br />
most of the existing code)<br />
Use coarrays for some of the communication<br />
opportunity to express communication much more simply<br />
opportunity to overlap communication<br />
For subset synchronisation<br />
Work-sharing schemes<br />
4<br />
41<br />
8
Adding coarrays to existing applications<br />
Constrain use of coarrays to part of application<br />
Move relevant data into coarrays<br />
Implement parallel part with coarray syntax<br />
Move data back to original structures<br />
Use coarray structures to contain pointers to existing data<br />
Place relevant arrays in global scope (modules)<br />
avoids multiple declarations<br />
Declare existing arrays as coarrays at top level and through<br />
the complete call tree<br />
(some effort but only requires changes to declarations)<br />
AllReduce (everyone gets, optimized)<br />
All images get data from others simultaneously but this is<br />
optimized so communication is more balanced<br />
!...<br />
sync all<br />
vmax=v<br />
do i=this_image()+1,num_images()<br />
vmax=max(vmax,v[i])<br />
end do<br />
do i=1,this_image()-1<br />
vmax=max(vmax,v[i])<br />
end do<br />
Have seen this much faster<br />
9<br />
13<br />
Performance Considerations<br />
What is the latency?<br />
Do you need to avoid strided transfers?<br />
Is the compiler optimising the communication for target<br />
architecture?<br />
Is it using blocking communication within a segment when<br />
it does no need to?<br />
Is it optimising strided communication?<br />
Can it pattern-match loops to single communication<br />
primitives or collectives?<br />
Synchronization<br />
For some algorithms (finitesync<br />
all<br />
but pairwise synchronization using sync images(image)<br />
10<br />
14<br />
Performance: Communication patterns<br />
Try to avoid creating traffic jams on the network, such as all<br />
images storing to a single image.<br />
Synchronization (one to many)<br />
Often one image will be communicating with a set of images<br />
In general not a good thing to do but assume we are...<br />
The following examples show two ways to implement an<br />
ALLReduce() function using coarrays<br />
Tempting to use sync all<br />
11<br />
15<br />
AllReduce (everyone gets)<br />
All images get data from others simultaneously<br />
function allreduce_max_allget(v) result(vmax)<br />
double precision :: vmax, v[*]<br />
integer i<br />
sync all<br />
vmax=v<br />
do i=1,num_images()<br />
vmax=max(vmax,v[i])<br />
end do<br />
Synchronisation (one to many)<br />
If this is all images then could do<br />
if ( this_image() == 1) then<br />
sync images(*)<br />
else<br />
sync images(1)<br />
end if<br />
Note that sync all is likely to be fast so is an<br />
alternative<br />
12<br />
42<br />
16
Synchronisation (one to many)<br />
For a subset use this<br />
if ( this_image() == image_list(1)) then<br />
sync images(image_list)<br />
else<br />
sync images(image_list(1))<br />
end if<br />
instead of sync images(image_list)<br />
for all of them which is likely to be slower<br />
Coarray Benchmark Suite<br />
Developed by David Henty at EPCC<br />
Aims to test fundamental features of a coarray implementation<br />
We can test basic language syntax for communication of data<br />
and synchronization<br />
Need to choose communication pattern and data access<br />
There is some scope for a given communication pattern:<br />
array syntax, loops over array elements<br />
inline code or use subroutines<br />
Choices can reveal compiler capabilities<br />
17<br />
21<br />
Collective Operations<br />
If you need scalability to a large number of images you may<br />
need to temporarily work around current lack of collectives<br />
Use MPI for the collectives if MPI+coarrays is supported<br />
Implement your own but this might be hard<br />
For reductions of scalars a tree will be the best to try<br />
For reductions of more data you would have to experiment and this may<br />
depend on the topology<br />
Coarrays can be good for collective operations where<br />
there is an unusual communication pattern that does not<br />
match what MPI collectives provide<br />
there is opportunity to overlap communication<br />
with computation<br />
Initial Benchmark<br />
Single contiguous point-to-point read and write<br />
Multiple contiguous point-to-point read and write<br />
Strided point-to-point read and write<br />
All basic synchronization operations<br />
Various representative communication patterns<br />
Halo-swap in multi-dimensional regular domain decomposition<br />
All communications include synchronisation cost<br />
use double precision (8-byte) values as the basic type<br />
use <strong>Fortran</strong> array syntax<br />
Synchronisations overhead measured separately as<br />
overhead = (delay + sync) delay<br />
18<br />
22<br />
Tools: debugging and profiling<br />
Tool support should improve once coarray takeup increases<br />
Cray Craypat tool supports coarrays<br />
Totalview works with coarray programs on Cray systems<br />
Allinea DDT<br />
support for coarrays and UPC for a number of compilers is<br />
in public beta and will be in DDT 3.1<br />
Scalasca<br />
Currently investigating how PGAS support can be<br />
incorporated.<br />
Platforms<br />
Limited compiler support at present<br />
results presented from Cray systems<br />
Cray Compiler Environment (CCE) 7.4.1<br />
Cray XT6<br />
MPP with dual 12-core Opteron Magny-Cours nodes and Cray<br />
Seastar2+ torus interconnect.<br />
Coarrays implemented using GASNET.<br />
Cray XE6<br />
Same nodes as XT6 but with Gemini torus interconnect which support<br />
RDMA<br />
19<br />
23<br />
Debugging Synchronisation problems<br />
One-sided model is tricky because subtle synchronisation<br />
errors change data<br />
TRY TO GET IT RIGHT FIRST TIME<br />
look carefully at the remote operations in the code<br />
Think about synchronisation of segments<br />
especially look for early arriving communications trashing<br />
your data at the start of loops (this one is easy to miss)<br />
One way to test is to put sleep() calls in the code<br />
Delay one or more images<br />
Delay master image, or other images for some patterns<br />
Pingpong<br />
8000<br />
6000<br />
4000<br />
2000<br />
XE6 put<br />
XT6 put<br />
XT6 MPI<br />
XE6 MPI<br />
Point-to-point comms<br />
0<br />
1 10 100 1000 10000 100000 1000000 10000000<br />
message length (doubles)<br />
20<br />
24
Pingpong (small message regime)<br />
80<br />
XE6 put<br />
XT6 put<br />
XE6 MPI<br />
60<br />
XT6 MPI<br />
40<br />
Point-to-point comms<br />
3D Halo Swap on XE6 (weak scaling V=50^3)<br />
150<br />
put p2p<br />
put all<br />
get p2p<br />
get all<br />
100<br />
20<br />
50<br />
0<br />
1 4 16 64 256 1024 4096<br />
message length (doubles)<br />
sync images put latency MPI latency<br />
XT6 33.1 45.3 7.4<br />
XE6 3.0 3.7 1.6<br />
25<br />
0<br />
8 32 128 512 2048 8192 32768<br />
images<br />
29<br />
Global Synchronisation<br />
3000<br />
sync all<br />
MPI Barrier * 100<br />
2000<br />
XT6 Synchronisation<br />
Examples of coarrays in practice<br />
Puzzles<br />
Distributed Remote Gather<br />
HIMENO Halo-Swap<br />
Gyrokinetic Fusion Code<br />
1000<br />
0<br />
16 32 64 128 256 512 1024 2048<br />
images<br />
XT coarray implementation not keeping up with MPI<br />
26<br />
30<br />
Global Synchronisation<br />
50<br />
XE6 Synchronisation<br />
Solving Sudoku Puzzles<br />
XE6 sync all<br />
40<br />
XE6 MPI_Barrier<br />
30<br />
20<br />
10<br />
0<br />
4 16 64 256 1024 4096 16384<br />
images<br />
Much faster than the previous XT results<br />
27<br />
31<br />
Global Synchronisation<br />
Also measured sync images<br />
various point-to-point patterns<br />
Observed that sync images is usually faster than<br />
sync all on more than 512 images<br />
Going Parallel<br />
Started with serial code<br />
Changed to read in all 125,000 puzzles at start<br />
Choose work-sharing strategy<br />
One image (1) holds a queue of puzzles to solve<br />
Each image picks work from the queue and writes result<br />
back to queue<br />
Arbitrarily decide to parcel work as<br />
blocksize = npuzzles /( 8* num_images() )<br />
28<br />
32
Data Structures<br />
use,intrinsic iso_fortran_env<br />
type puzzle<br />
integer :: input(9,9)<br />
integer :: solution(9,9)<br />
end type puzzle<br />
type queue<br />
type (lock_type) :: lock<br />
integer :: next_available = 1<br />
type(puzzle),allocatable :: puzzles(:)<br />
end type queue<br />
type(queue),save :: workqueue[*]<br />
type(puzzle) :: local_puzzle<br />
integer,save :: npuzzles[*],blocksize[*]<br />
Solve the puzzles and write back<br />
! Solve those puzzles<br />
do i = istart,iend<br />
local_puzzle%input = &<br />
& workqueue[1]%puzzles(i)%input<br />
call sudoku_solve &<br />
& (local_puzzle%input,local_puzzle%solution)<br />
workqueue[1]%puzzles(i)%solution = &<br />
& local_puzzle%solution<br />
end do<br />
33<br />
37<br />
Input<br />
if (this_image() == 1) then<br />
! After file Setup.<br />
inquire (unit=inunit,size=nbytes)<br />
nrecords = nbytes/10<br />
npuzzles = nrecords/9<br />
blocksize = npuzzles / (num_images()*8)<br />
write (*,*) "Found ", npuzzles<br />
allocate (workqueue%puzzles(npuzzles))<br />
do i = 1, npuzzles<br />
call read_puzzles( &<br />
& workqueue%puzzles(i)%input,inunit, &<br />
& error)<br />
end do<br />
Output the solutions<br />
! Need to synchronize puzzle output updates<br />
sync all<br />
if (this_image() == 1) then<br />
open (outunit,file=outfile,iostat=error)<br />
do i = 1, npuzzles<br />
call write_puzzle &<br />
& (workqueue%puzzles(i)%input, &<br />
& workqueue%puzzles(i)%solution,outunit,error)<br />
end do<br />
close(inunit)<br />
34<br />
38<br />
Core program structure<br />
! After coarray data loaded<br />
sync all<br />
blocksize = blocksize[1]<br />
npuzzles = npuzzles[1]<br />
done = .false.<br />
workloop: do<br />
! Acquire lock and claim work<br />
! Solve our puzzles<br />
end do workloop<br />
More on the Locking<br />
We protected access to the queue state by lock and unlock<br />
During this time no other image can acquire the lock<br />
We need to have discipline to only access data within the<br />
window when we have the lock<br />
There is no connection with the lock variable and the other<br />
elements of the queue structure<br />
The unlock is acting like sync memory<br />
If one image executes an unlock...<br />
Another image getting the lock is ordered after the<br />
first image<br />
35<br />
39<br />
Acquire lock and claim work<br />
! Reserve the next block of puzzles<br />
lock (workqueue[1]%lock)<br />
next = workqueue[1]%next_available<br />
if (next
Distributed remote gather<br />
The problem is how to implement the following gather loop on<br />
a distributed memory system<br />
REAL :: table(n), buffer(nelts)<br />
INTEGER :: index(nelts) ! nelts
References<br />
http://lacsi.rice.edu/software/caf/downloads/documentation/<br />
nrRAL98060.pdf- Co-array <strong>Fortran</strong> for parallel programming,<br />
Numrich and Reid, 1998<br />
ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1824.pdf<br />
Coarrays<br />
Ashby, J.V. and Reid, J.K (<strong>2008</strong>). Migrating a scientific<br />
application from MPI to coarrays. CUG <strong>2008</strong> Proceedings. RAL-<br />
TR-<strong>2008</strong>-015<br />
See http://www.numerical.rl.ac.uk/reports/reports.shtml<br />
http://upc.gwu.edu/ - Unified Parallel C at George Washington<br />
University<br />
http://upc.lbl.gov/ - Berkeley Unified Parallel C Project<br />
49<br />
Tutorial Wrapup<br />
Remember our first Motivation slide?<br />
<strong>Fortran</strong> now supports parallelism as a full first-class feature of<br />
the language<br />
Changes are minimal<br />
Performance is maintained<br />
Flexibility in expressing communication patterns<br />
We hope you learned something and have success<br />
with coarrays in the future<br />
50<br />
Acknowledgements<br />
The material for this tutorial is based on original content<br />
developed by EPCC of The University of Edinburgh for use in<br />
teaching their MSc in High-Performance Computing.<br />
The following people contributed to its development:<br />
Alan Simpson, Michele Weiland, Jim Enright and Paul Graham<br />
The material was subsequently developed by EPCC and Cray to<br />
form this tutorial with contributions from the following people:<br />
David Henty, Alan Simpson ( EPCC)<br />
Harvey Richardson, Bill Long, Roberto Ansaloni,<br />
Jef Dawson, Nathan Wichmann (Cray)<br />
This material is Copyright © 2011<br />
by The University of Edinburgh and Cray Inc.<br />
47
EXERCISE ASSIGNMENTS<br />
49
Practicalities<br />
Computing servers<br />
We will use CSC’s Cray supercomputer Louhi for the exercises. Log onto Louhi using the provided<br />
tnrgXX username and password, e.g.<br />
% ssh –X trng10@louhi.csc.fi<br />
Alteratively, feel free to use the local workstations or your own Linux/Mac laptop and GNU<br />
compiler, but for the Co-Array <strong>Fortran</strong> features we will need to use the Cray <strong>Fortran</strong> compiler. To<br />
enable the Cray compiler, we need to do (once on Louhi)<br />
% module swap PrgEnv-pgi PrgEnv-cray<br />
Other compilers (GNU, PGI, Pathscale, and Intel) are also available in CSC’s computing servers.<br />
The compiler can be changed via (for example)<br />
% module swap PrgEnv-cray PrgEnv-gnu<br />
For editing <strong>Fortran</strong> program files you can use e.g. Emacs editor with or without (the option –nw)<br />
X-Windows:<br />
emacs –nw prog.f90<br />
emacs prog.f90<br />
Also other popular editors (vim, nano) are available.<br />
Simple compilation<br />
Example program test.f90<br />
program test<br />
implicit none<br />
integer, parameter :: result = 42<br />
print *, ‘hello world!’<br />
print *, ‘the result is’, result<br />
end program test<br />
Compilation and execution are done via the ftn wrapper and the aprun scheduler:<br />
% ftn test.f90 -o test<br />
% aprun –n 1 ./test<br />
Hello world!<br />
The result is 42<br />
50
<strong>Fortran</strong> 95/<strong>2003</strong> exercises<br />
1. Playing around with control structures and arrays<br />
a. Declare an integer array of dimensions 100 by 100 and initialize it to zero otherwise but<br />
where the first index is equal to 50 or the second index is equal to 50 the array elements get<br />
a value of 1.<br />
Value 1 on the black rows, value 0<br />
elsewhere<br />
b. Then initialize another array with the same dimensions, but its values are computed from the<br />
first array such that<br />
• The cells with exactly two elements equal to 1 in the first array get the same value in the<br />
new array as in the first array.<br />
• Any cell with exactly three neighbors with value 1 gets the value 1 in the new array.<br />
• Otherwise, i.e. new array cells with less than two or more than three neighbors with<br />
value 1 in the old array get a value 0.<br />
At this stage, just run the indices from 2 to 99, i.e. not referencing to the boundaries at all.<br />
c. Modify the program from exercise 1b such that the array becomes periodic – that is, the<br />
boundaries depend on the cells on the other side of the array. The solutions for all three<br />
items of Exercise 1 is provided in ex1_arrays.f90.<br />
2. Getting acquainted with procedures<br />
a. Modify the program such that you can produce new arrays iteratively, i.e. taking the array<br />
from the previous iteration and obtaining a new array by applying the same rules for it.<br />
b. Modify the exercise 2a so that it uses a function or a subroutine to produce the new array.<br />
c. Change the initialization of the board such that the board starts from a random<br />
configuration. The intrinsic procedure is calledRANDOM_NUMBER. Wrap also this board<br />
initialization into its own procedure. The solutions for all three items of Exercise 2 is provided<br />
in ex2_procedures.f90.<br />
51
<strong>Fortran</strong> 95/<strong>2003</strong> exercises<br />
3. Game of Life<br />
The Game of Life (GoL) is a cellular automaton devised by John Horton Conway in 1970, see<br />
http://en.wikipedia.org/wiki/Conway's_Game_of_Life.<br />
You can compile a reference executable (since the file ex3_gol.f90 will contain the solution)<br />
with<br />
% ftn –o gol gol_io.f90 ex3_gol.f90<br />
Run the program of e.g. 200x200 board for 100 iterations. With the command xview or<br />
eog you can view the images (.pbm) and see how the automaton looks like after those. You<br />
can also animate the board development by first using convert as<br />
% convert -delay 40 -geometry 512x512 life_*.pbm life.gif<br />
(on a single line) and then displaying the animation with<br />
% animate life.gif<br />
a. See the file ex3_gol0.f90, get acquainted with the program and complete the missing parts<br />
of the code (search: “TODO”). Refer back to assignments 1 and 2.<br />
b. Experiment, how the game evolves if you replace the starting pattern (‘plus’, c.f. exercise 1a)<br />
to a random one (c.f. Exercise 2c).<br />
c. Modify the GoL program such that the board is manipulated through a derived datatype<br />
GoL_board, which contains the actual board, its dimensions as well as how many iterations<br />
it has gone through. No solution has been prepared.<br />
d. Now we will examine the I/O module of the Game of Life program. It visualizes the board in<br />
the netpbm image format, see http://en.wikipedia.org/wiki/Netpbm_format. Implement the<br />
writing of the board as pbm images - or in some other image format if you want to go your<br />
own way. Consult the gol_io.f90 when in trouble. Shortcut: study the draw subroutine in<br />
gol_io.f90 and make sure you understand the piece of code.<br />
e. Modify the program such that the user input is read directly from the command line instead<br />
of parsering, i.e. the program is launched as ./gol (# iterations) (board height) (board width),<br />
for example<br />
% ./gol 200 100 100<br />
The answer is provided in gol_io.f90.<br />
52
More bonus exercises<br />
<strong>Fortran</strong> Quiz<br />
a. Are the following <strong>Fortran</strong> statements written correctly?<br />
character_string = ’Awake in the morning,<br />
& asleep in the evening.’<br />
x = 0.4-6<br />
answer = ’True & false’<br />
low-limit = 0.0005E10<br />
y = E6<br />
b. Are the following declarations legimate in <strong>Fortran</strong>?<br />
DOUBLE :: x<br />
CHARACTER(LEN=*), PARAMETER :: "Name"<br />
REAL :: pi = 22/7<br />
REAL :: x = 2., y = -3<br />
REAL :: pii = 22.0/7.0<br />
REAL x = 1.0<br />
c. What are the iteration counts of the following DO loops, the values of loop variable i inside<br />
the loop, and the value of the loop variable after the DO construct?<br />
DO i = 1, 5<br />
DO i = 5, 0, -1<br />
DO i = 10, 1, -2<br />
DO i = 0, 30, 7<br />
DO i = 3, 2, 1<br />
Derived types<br />
a. Declare the derived type which can save the birth date in the form:<br />
21 01 1990<br />
This derived type thus contains three integers, which have different KIND values:<br />
SELECTED_INT_KIND(2) and SELECTED_INT_KIND(4).<br />
b. Add the field the for a name to the derived type. Write a function, which returns the name<br />
and date in a character string in the following form<br />
Charlie Brown (01.01.1999)<br />
Recursion<br />
Write a recursive function, which calculates ”Tribonacci numbers”:<br />
Calculate x 12 . Carry out the computation also using a loop structure.<br />
53
Edge detection and picture reconstruction<br />
Parallel Programming<br />
with <strong>Fortran</strong> Coarrays:<br />
Overview of Exercises<br />
Delivered at PRACE Advanced <strong>Training</strong> Centre,<br />
CSC IT Center for Science Ltd, Finland,<br />
September 13, 2012<br />
single pass<br />
hundreds<br />
of iterations<br />
David Henty, Alan Simpson (EPCC)<br />
Harvey Richardson, Bill Long (Cray)<br />
5<br />
Exercise 1<br />
Hello world example<br />
check you can log on, compile, submit and run<br />
Exercise 3 (unlikely to get here today!)<br />
Decompose picture across a 2D grid of images<br />
using multiple codimensions<br />
Writing arrays as pictures<br />
declare and manipulate coarrays<br />
write out arrays in PGM picture format<br />
view them using display from ImageMagick<br />
use both remote reads and remote writes<br />
2<br />
Sample output on 4 images<br />
Documentation<br />
Full instructions in exercise notes<br />
PDF copy in doc/ subdirectory<br />
Go at your own pace<br />
no direct dependencies between practicals & lectures<br />
each exercise follows on from the last<br />
questions then please ask us!<br />
3<br />
Exercise 2<br />
Perform simple edge detection of features in a picture<br />
halo communication between 1D grid of images<br />
Reconstruct picture from supplied edges<br />
an iterative algorithm<br />
computationally intensive so worth parallelising<br />
Terminate based on some stopping criterion<br />
requires global sums<br />
Use global or point-to-point synchronisation<br />
Look at scalability<br />
54