13.02.2014 Views

Fortran 2003/2008 Lectures - Prace Training Portal

Fortran 2003/2008 Lectures - Prace Training Portal

Fortran 2003/2008 Lectures - Prace Training Portal

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!