Introduction
   MIPS Pro Compilers
   Easy Parallelizations
   APO
   OpenMP
   MPT

SGI Origin 3000 ¼öÆÛÄÄÇ»Å͸¦ ÀÌ¿ëÇÑ º´·Ä󸮷Π(¾Æ·¡ÀÇ ³»¿ëÀ» ÀÐÀº ÈÄ¿¡ À̵¿ÇÏ¿© ÀÐÀ» °ÍÀ» ±ÇÀåÇÔ)

º´·Ä󸮶õ? 

ÄÄÇ»ÅÍ°¡ °³¹ßµÈ ÀÌ·¡ ÄÄÇ»ÅÍÀÇ µÎ³ú¿¡ ÇØ´çµÇ´Â ÇÁ·Î¼¼¼­´Â ´«ºÎ½Å ¹ßÀüÀ» °ÅµìÇÏ¿´Áö¸¸ ó¸®ÇØ¾ß µÇ´Â ÀÛ¾÷ÀÌ Áö¼ÓÀûÀ¸·Î ´ëÇüÈ­µÊ¿¡ µû¶ó ´ÜÀÏ ÇÁ·Î¼¼¼­·Î ó¸®ÇÒ ¼ö ÀÖ´Â ´É·ÂÀÇ ÇÑ°è¿¡ µµ´ÞÇÏ°Ô µÇ¾ú´Ù. ÀÌ·¯ÇÑ ³­°üÀ» ±Øº¹Çϱâ À§ÇÏ¿© ´ëµÎµÈ ¹æ¹ýÀÌ º´·Ä ó¸®ÀÌ´Ù. º´·Ä 󸮶õ ½±°Ô ¸»Çؼ­ ÇϳªÀÇ ÀÛ¾÷À» ó¸®Çϱâ À§Çؼ­ µ¿½Ã¿¡ ¿©·¯ °³ÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇÏ¿© ÀÛ¾÷ÀÇ Ã³¸® ¼Óµµ¸¦ ³ôÀÌ´Â °ÍÀ» ¸»ÇÑ´Ù. ÀÌ·¸°Ô ´ÙÁßÇÁ·Î¼¼¼­¸¦ µ¿½Ã¿¡ »ç¿ëÇÏ´Â º´·Ä󸮸¦ ÅëÇØ ¾òÀ» ¼ö ÀÖ´Â ¼º´É Çâ»óÀº ´ÙÀ½°ú °°ÀÌ ±â¼úµÉ ¼ö ÀÖ´Ù.

ÇϳªÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇÏ¿© ÀÛ¾÷À» ¼öÇàÇÏ¿´À» ¶§ ¼Ò¿äµÈ ½Ã°£À» t¶ó°í ÇÒ¶§ p°³ÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇÏ¿´À» ¶§ ÀÌ»óÀûÀÎ ¼Ò¿ä½Ã°£Àº t/pÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ ½ÇÁ¦ º´·Ä 󸮿¡¼­ ¾òÀ» ¼ö ÀÖ´Â ¼º´ÉÀº ¾Ë°í¸®µëÀÇ ¹®Á¦, ³×Æ®¿öÅ© ¹®Á¦ µîÀ¸·Î ÀÎÇÏ¿© À̺¸´Ù ¶³¾îÁö°Ô µÇ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ÀÌ·¯ÇÑ ¼º´É Çâ»óÀ¸·Î ÀÎÇÏ¿© ¾òÀ» ¼ö ÀÖ´Â °¡Àå Å« ÀåÁ¡Àº °¢ ºÐ¾ßÀÇ ¿¬±¸ÀÚµéÀÌ ÄÄÇ»ÅÍÀÇ ÀÚ¿øºÎÁ·À¸·Î ±×µ¿¾È Ç® ¼ö ¾ø¾ú´ø ¹®Á¦µéÀ» º´·Ä󸮸¦ ÅëÇØ Ç® ¼ö ÀÖ°Ô µÇ¾ú´Ù´Â °Í¿¡ ÀÖ´Ù.

ÁÖ¾îÁø ÇÁ·Î±×·¥¿¡¼­ µ¥ÀÌÅ͸¦ º´·Ä ó¸®ÇÏ´À³Ä ¶Ç´Â ÀÛ¾÷À» ºÐÇÒÇÏ¿© º´·Ä ó¸®ÇÏ´À³Ä¿¡ µû¶ó data parallelism °ú task parallelismÀ¸·Î ±¸ºÐµÈ´Ù.

Data Parallelism

data parallelism¿¡¼­´Â µ¿ÀÏÇÑ codeÀÇ segment¸¦ °¢°¢ÀÇ ÇÁ·Î¼¼¼­¿¡¼­ µ¿½Ã¿¡ ½ÇÇàÇÏ´Â ¹æ¹ýÀ¸·Î °¢ ÇÁ·Î¼¼¼­´Â ó¸®ÇØ¾ß ÇÏ´Â µ¥ÀÌÅÍÀÇ ¿µ¿ªÀ» ºÐÇÒ ÇÒ´ç ¹Þ´Â´Ù. ÀÌ ¹æ¹ýÀº Fortran¿¡¼­ »ç¿ëµÇ´Â Do ·çÇÁ °°Àº °÷¿¡ Àû¿ëÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù. Data parallelismÀº °è»êÀÛ¾÷À» ¸¹Àº ¼öÀÇ ÀÛÀº subtask·Î ºÐ»êÇÏ´Â ¹æ¹ýÀ̱⠶§¹®¿¡ fine grain parallelismÀ̶ó°íµµ ºÒ¸®¿î´Ù.

´ÙÀ½°ú °°Àº Fortran ÇÁ·Î±×·¥Àº Data parallelismÀÇ ¿¹·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ¾Æ·¡¿Í °°Àº Çà·Ä¿¬»ê ¹®Á¦´Â data parallelism ¿¡ °¡Àå ÀûÇÕÇÑ ¿¹Á¦ÀÌ´Ù. ´ÙÀ½ÀÇ Fortran code´Â Çà·Ä°£ÀÇ °ö¼À¹®Á¦ÀÌ´Ù.

Original Code

DO K=1,N

DO J=1,N

DO I=1,N

C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO

Original code¿¡ ´ëÇÑ º´·ÄÈ­´Â ÇÁ·Î¼¼¼­°£¿¡ ÀÛ¾÷À» ºÐÇÒ ¹è´çÇϱâ À§ÇØ ÇÊ¿äÇÑ OpenMP µð·ºÆ¼ºê(directives)¸¦ »ðÀÔÇÏ´Â ¹æ¹ýÀ¸·Î ÀÌ·ç¾îÁø´Ù. À§ÀÇ code´Â ´ÙÀ½°ú °°ÀÌ °£´ÜÇÑ µð·ºÆ¼ºê¸¦ »ðÀÔÇÏ¿© º´·ÄÈ­µÈ code·Î º¯°æÇÒ ¼ö ÀÖ´Ù.

Parallel Code

!$OMP PARALLEL DO

DO K=1,N

DO J=1,N

DO I=1,N

C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO

!$END PARALLEL DO

OpenMP´Â º´·Ä µð·ºÆ¼ºêÀÇ Ç¥ÁØÀ¸·Î ¸¹Àº Çϵå¿þ¾î ¾÷üµéÀÌ Ã¤ÅÃÇÏ°í ÀÖ´Ù. OpenMP µð·ºÆ¼ºê´Âdata parallelism°ú task parallelism¿¡ ¸ðµÎ Àû¿ëµÉ ¼ö ÀÖ´Ù. SGI»ç´Â OpenMPÀÇ Áö¿ø ¹× °³¹ßÀ» ÁÖµµÇÏ°í Àִ ȸ»çÀÌ´Ù. OpenMP¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é OpenMP website(http://www.openmp.org)¸¦ ¹æ¹®ÇÏ¸é µÈ´Ù.

OpenMP¿¡¼­ º´·Ä·Î 󸮵Ǵ ·çÇÁ´Â µð·ºÆ¼ºê ¹Ù·Î ´ÙÀ½¿¡ ¿À´Â ·çÇÁÀÌ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ º´·Ä·Î ½ÇÇàµÇ´Â ·çÇÁ´Â K ·çÇÁ (DO K=1,N) ÀÌ´Ù.

°¢ ÇÁ·Î¼¼¼­´Â ¼­·Î ´Ù¸¥ µ¥ÀÌÅÍ ¾î·¹ÀÌ ¿µ¿ªÀ» ÇÒ´ç ¹Þ¾î¼­ ½ÇÇàÀ» ÇÏ°Ô µÈ´Ù. K ·çÇÁ¿¡¼­ NÀÌ 20ÀÌ°í »ç¿ëµÈ ÇÁ·Î¼¼¼­°¡ 4¶ó°í ÇÒ ¶§ °¢ ÇÁ·Î¼¼¼­´Â ´ÙÀ½°ú °°ÀÌ µ¥ÀÌÅÍ ¿µ¿ªÀ» ÇÒ´ç ¹Þ¾î ó¸®ÇÏ°Ô µÈ´Ù.

Processor

Iterations of K

Data Elements

proc0

K=1:5

A(I, 1:5) B(1:5 ,J)

proc1

K=6:10

A(I, 6:10) B(6:10 ,J)

proc2

K=11:15

A(I, 11:15) B(11:15 ,J)

proc3

K=16:20

A(I, 16:20) B(16:20 ,J)

Data parallelism¿¡¼­´Â °¢ ÇÁ·Î¼¼¼­°¡ µ¿ÀÏÇÑ code segment¸¦ ½ÇÇàÇÏ°Ô µÇ´Âµ¥ À§ÀÇ ¿¹Á¦¿¡¼­´Â ´ÙÀ½°ú °°Àº segment°¡ °¢ ÇÁ·Î¼¼¼­¿¡¼­ µ¿ÀÏÇÏ°Ô ½ÇÇàµÈ´Ù.

DO J=1,N

DO I=1,N

C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO

Data parallelismÀº º´·ÄÈ­¸¦ Á¡ÁøÀûÀ¸·Î(incrementally) ÇÒ ¼ö ÀÖ´Ù´Â Æí¸®¼ºÀÌ ÀÖ´Ù.

Á¡ÁøÀû º´·ÄÈ­ÀÇ Àǹ̴ ÇÁ·Î±×·¥ Àüü¸¦ ÇѲ¨¹ø¿¡ º´·ÄÈ­ ½ÃÅ°´Â °ÍÀÌ ¾Æ´Ï¶ó °è»ê·®ÀÌ ¸¹Àº ·çÇÁºÎÅÍ º´·ÄÈ­ ½ÃÅ°°í ¿øÇÏ´Â º´·ÄÈ¿À²ÀÌ Ä¿Áú ¶§±îÁö ´Ù¸¥ ·çÇÁ¸¦ Á¡ÁøÀûÀ¸·Î º´·ÄÈ­ÇÏ¿© ½ÇÇàÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

Task Parallelism

Task parallelismÀº ´ÙÁßÀÇ µ¶¸³µÈ code segments¸¦ °¢ ÇÁ·Î¼¼¼­¿¡ ºÐ»êÇÏ¿© µ¿½Ã¿¡ ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¾²´Â º´·Ä ±â¹ýÀÌ´Ù. ÀÌ ±â¹ýÀº ÁÖ¾îÁø code¸¦ ¿©·¯ °³ÀÇ ºÎºÐµé·Î ºÐÇÒÇÏ¿© °¢ ÇÁ·Î¼¼¼­¿¡¼­ µ¶¸³ÀûÀ¸·Î µ¿½Ã¿¡ ½ÇÇàÇÏ´Â °ÍÀÌ °¡´ÉÇÒ ¶§ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. Task parallelism Àº °è»ê ÀÛ¾÷À» ÀÛÀº ¼öÀÇ subtasks·Î ºÐÇÒÇÏ¿© ½ÇÇàÇϱ⠶§¹®¿¡ coarse grain parallelismÀ¸·Î ºÒ¸®¿î´Ù. ÀÌ ¹æ¹ýÀº data parallelism º¸´Ù ³ôÀº ¼öÁØ¿¡¼­ º´·Ä±â¹ýÀÌ Àû¿ëµÇ±â ¶§¹®¿¡ ÀϹÝÀûÀ¸·Î º´·ÄÈ¿À²ÀÌ ´õ ³ôÀº ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀº parallel overhead°¡ ÀÛ°í data parallelism¿¡ ºñÇØ Àû¿ëÀÌ ½±´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸ codeÀÇ Æ¯¼º»ó °¢ ºÎºÐµéÀÌ ¹ÐÁ¢ÇÏ°Ô ¿¬°áµÇ¾î µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ¾Æ¾ß µÇ´Â °æ¿ì¿¡´Â Àû¿ëÇϱ⠰ï¶õÇÑ ¹æ¹ýÀÌ´Ù.

´ÙÀ½°ú °°Àº abstract code¸¦ º´·ÄÈ­ÇÏ´Â °ÍÀ» ¿¹¸¦ µé¸é,

Original Code
program main
code segment labelled A
code segment labelled B
code segment labelled C
code segment labelled D
end

ÀÌ °æ¿ì¿¡µµ ´ÙÀ½°ú °°ÀÌ OpenMP µð·ºÆ¼ºê¸¦ »ðÀÔÇÏ¿© task parallelismÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

Parallel Code
program main

!$OMP PARALLEL

!$OMP SECTIONS

code segment labelled A

!$OMP SECTION

code segment labelled B

!$OMP SECTION

code segment labelled C

!$OMP SECTION

code segment labelled D

!$OMP SECTIONS

!$OMP END PARALLEL
end

OpenMP SECTION µð·ºÆ¼ºê¸¦ »ç¿ëÇÏ°Ô µÇ¸é °¢ SECTIONÀº ´Ù¸¥ ÇÁ·Î¼¼¼­¿¡ ÇÒ´çµÇ°Ô µÈ´Ù. À§ÀÇ code¸¦ 4°³ÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇÏ¿© ó¸®ÇÑ´Ù°í ÇÒ ¶§ °¢ ÇÁ·Î¼¼¼­´Â ´ÙÀ½°ú °°Àº code segments¸¦ ÇÒ´ç¹Þ¾Æ ó¸®ÇÏ°Ô µÈ´Ù.

Processor

Code Segment

proc0

code segment labelled A

proc1

code segment labelled B

proc2

code segment labelled C

proc3

code segment labelled D

Amdahl¡¯s Law

À§¿Í °°Àº º´·Äó¸® ±â¹ýÀ» »ç¿ëÇÏ¿© º´·Ä󸮸¦ ÇÒ °æ¿ì ¾òÀ» ¼ö ÀÖ´Â ¼º´ÉÇâ»óÀº ÀÌ»óÀûÀÎ °æ¿ì¿¡ ÇÁ·Î¼¼¼­ÀÇ ¼ö°¡ ´Ã¾î³ª´Â °Í¿¡ ºñ·ÊÇÏ¿© ¼±ÇüÀûÀ¸·Î ´Ã¾î³ª¾ß ÇÏÁö¸¸ ¿©·¯ °¡Áö ¼º´É Á¦ÇÑ ¿ä¼Òµé·Î ÀÎÇÏ¿© ±×·¸Áö ¸øÇÑ °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ÀÌ·¯ÇÑ º´·Ä ¼º´ÉÇâ»óÀÇ ÇѰ踦 ±â¼úÇÑ ¹ýÄ¢ÀÌ Amdahl's lawÀÌ´Ù. ÀÌ ¹ýÄ¢¿¡ ÀÇÇϸé ÁÖ¾îÁø code¿¡¼­ º´·Ä·Î ½ÇÇàµÇÁö ¾Ê´Â ºÎºÐÀÌ ¼º´ÉÀ» Á¦ÇÑÇÏ¸ç ¼º´ÉÇâ»óÀÇ »óÇѼ±ÀÌ Á¤ÇØÁø´Ù°í ÇÑ´Ù. ÀÌ ¹ýÄ¢Àº ´ÙÀ½°ú °°ÀÌ ¼ö½ÄÈ­ µÉ ¼ö ÀÖ´Ù. ÁÖ¾îÁø code¿¡¼­ F % ¸¸Å­ º´·ÄÈ­ µÈ´Ù°í ÇÒ ¶§ ÇÁ·Î¼¼¼­ÀÇ ¼ýÀÚ°¡ ¹«ÇÑ°³·Î ´Ã¾î³ªµµcode´Â 100/(100-F) º¸´Ù ºü¸£°Ô ½ÇÇàµÉ ¼ö ¾ø´Ù. ±×¸®°í ÁÖ¾îÁø ÇÁ·Î¼¼¼­ÀÇ ¼ö P°³¿¡¼­ ¾òÀ» ¼ö ÀÖ´Â ÃÖ´ë º´·ÄÈ¿À²Àº ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµÈ´Ù.

Speed Up Ratio (Sp) = 100/(F/P+100-F) F=(0%,¡¦¡¦¡¦¡¦.,100%)

¿©±â¼­ ¼º´É Çâ»óºñÀÎ Speed Up Ratio´Â P°³ÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇßÀ» °æ¿ì ¾òÀº °è»ê ¼Ò¿ä½Ã°£°ú 1°³ÀÇ ÇÁ·Î¼¼¼­¸¦ »ç¿ëÇßÀ» °æ¿ì ¾òÀº ¼Ò¿ä½Ã°£À» ³ª´©¾î¼­ ¾òÀ» ¼ö ÀÖ´Â °ªÀÌ´Ù.

Speed Up Ratio (Sp) = (Elapsed time with P proc)/(Elapsed time with 1 proc)

À§ÀÇ µÎ ½ÄÀ» ÀÌ¿ëÇϸé ÁÖ¾îÁø code¿¡¼­ÀÇ º´·ÄÈ­ Á¤µµ¸¦ ³ªÅ¸³»´Â F¸¦ °è»êÇÒ ¼ö ÀÖ°í À̸¦ ÀÌ¿ëÇÏ¸é º´·Ä°è»êÀ» ÅëÇØ ¾òÀ» ¼ö ÀÖ´Â ÃÖ´ëÀÇ ¼º´É Çâ»óºñ¸¦ ¾Ë ¼ö ÀÖ°Ô µÈ´Ù.

º´·Ä ÇÁ·Î±×·¡¹Ö Áö¿ø ¶óÀ̺귯¸®

C³ª Fortran°°Àº ¾ð¾î¸¦ ÀÌ¿ëÇÏ¿© º´·Ä ÇÁ·Î±×·¡¹ÖÀ» ±¸ÇöÇϱâ À§Çؼ­´Â ÇÁ·Î¼¼¼­°£ÀÇ Åë½Å µîÀ» Áö¿øÇÏ´Â º´·Ä ÇÁ·Î±×·¡¹Ö Áö¿ø ¶óÀ̺귯¸®ÀÇ µµ¿òÀÌ ÇÊ¿äÇÏ´Ù. º´·Ä ÄÄÇ»ÅÍ °³¹ß Ãʱ⿡¼­ Çϵå¿þ¾î ¾÷üµé¸¶´Ù ¼­·Î ´Ù¸¥ º´·Ä ¶óÀ̺귯¸®¸¦ °³¹ßÇÏ¿© Áö¿øÀ» ÇÏ¿´Áö¸¸ º´·Ä ÄÄÇ»ÅÍ°¡ È®»êµÇ¸é¼­ ¼º´É ¹®Á¦³ª Æ÷ÆÃ(Porting) ¹®Á¦ µîÀ¸·Î ÀÎÇØ ¸¹Àº º´·Ä Áö¿ø ¶óÀ̺귯¸®°¡ »ç¶óÁö°í ÇöÀç¿¡´Â °øÀ¯ ¸Þ¸ð¸®Çü º´·Ä Áö¿ø ¶óÀ̺귯¸®ÀÎ OpenMP¿Í ºÐ»ê ¸Þ¸ð¸®Çü º´·Ä Áö¿ø ¶óÀ̺귯¸®ÀÎ MPI(Message Passing Interface)¸¸ÀÌ ±¤¹üÀ§ÇÏ°Ô »ç¿ëµÇ°í ÀÖ´Ù. OpenMP¿Í MPI´Â °¢°¢ http://www.openmp.org ¿Í http://www.mpi-forum.org ¶ó´Â ºñ¿µ¸®±â°ü¿¡¼­ Ç¥ÁØÀ» Á¤ÇÏ°í ÀÖ°í ´ëºÎºÐÀÇ Çϵå¿þ¾î ¾÷üµéÀÌ Áö¿øÀ» ÇÏ°í ÀÖ¾î ÀÌµé ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© °³¹ßÀ» ÇÒ °æ¿ì ¿©·¯ Çϵå¿þ¾î¿¡¼­ ¼öÁ¤ ¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áú ¼ö ÀÖ´Ù.

OpenMP

OpenMPÀÇ Ç¥ÁØÀº 1996³â¿¡ SGI»ç°¡ °øÀ¯ ¸Þ¸ð¸®Çü º´·Ä ÄÄÇ»ÅÍ¿¡¼­ ¼Ò½º ÄÚµåÀÇ È£È¯¼ºÀ» °®´Â º´·Ä ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé±â À§ÇØ ½ÃÀ۵Ǿú´Ù. ÀÌ ÇÁ·ÎÁ§Æ®´Â SGI»ç°¡ ½´ÆÛ ÄÄÇ»ÅÍÀÇ ´ë¸í»ç¿´´ø Cray»ç¸¦ ÀμöÇϸ鼭 º¤ÅÍ ÄÄÇ»ÅÍ¿Í ½ºÄ®¶ó ÄÄÇ»ÅÍ¿¡¼­ °øÈ÷ »ç¿ëÇÒ ¼ö ÀÖ´Â API(Application Programming Interface)ÀÇ Çʿ伺À¸·Î ÀÎÇØ °³¹ß ¼Óµµ°¡ °¡¼ÓÈ­µÇ¾î 1997³â¿¡ Fortran¿¡ ´ëÇÑ OpenMPÀÇ Ç¥ÁØÀÌ ¹ßÇ¥µÇ°í 1998³â¿¡ C/C++¿¡ ´ëÇÑ Ç¥ÁØÀÌ µÚÀ̾ ¹ßÇ¥µÇ¾ú´Ù. 2000³â¿¡´Â Fortran 95¿¡ ´ëÇÑ Ç¥ÁØÀÌ OpenMP V2.0¿¡ Æ÷ÇÔµÇ¾î ¹ßÇ¥µÇ¾ú´Ù. OpenMP´Â OpenMP¸¦ Áö¿øÇÏ´Â ÄÄÆÄÀÏ·¯¿¡¼­ ÀνÄÇÒ ¼ö ÀÖ´Â µð·ºÆ¼ºê(Directives)±â¹ÝÀÇ APIÀÌ´Ù. ÇÁ·Î±×·¥ °³¹ßÀÚ´Â ±âÁ¸ ¿ø½Ã codeÀÇ ¼öÁ¤ ¾øÀÌ OpenMP¿¡¼­ ÁöÁ¤µÈ ÀûÀýÇÑ µð·ºÆ¼ºê¸¦ »ðÀÔÇÔÀ¸·Î½á ¼Õ½±°Ô º´·Ä ÇÁ·Î±×·¥È­ ÇÒ ¼ö ÀÖ´Ù. OpenMP´Â ¾Æ·¡ÀÇ ¿¹¿Í °°ÀÌ Fortran¿¡¼­ÀÇ Do ·çÇÁ°°Àº °÷¿¡ ÁÖ·Î »ç¿ëµÇ¾î º´·ÄÈ­ Çϱ⠶§¹®¿¡ Á¾Á¾ Loop Level ParallelismÀ¸·Î ºÒ¸®±âµµ ÇÑ´Ù.

!$omp parallel do private(xx,yy,temp) reduction(+:error)
do j = 1,m

do i = 1,n

xx = -1.0d0 + dx * dble(i-1)

yy = -1.0d0 + dy * dble(j-1)

temp = u(i,j) - (1.0-xx*xx)*(1.0-yy*yy)

error = error + temp*temp

enddo
enddo

OpenMP´Â º´·Ä µð·ºÆ¼ºê¸¦ ÇÁ·Î±×·¥ÀÇ ÀϺκп¡¸¸ »ðÀÔÇÏ´Â ´Ü°èÀûÀÎ º´·ÄÈ­(Incremental Parallelism)ÀÇ Àû¿ëÀÌ °¡´ÉÇϱ⠶§¹®¿¡ »ó´ëÀûÀ¸·Î Á¢±ÙÀÌ ¿ëÀÌÇÏ´Ù. ¶Ç ±âÁ¸ Á÷·Ä ÇÁ·Î±×·¥ÀÇ ¼öÁ¤À» ÃÖ¼ÒÈ­ÇÒ ¼ö ÀÖ°í µð¹ö±ëÀÌ ½±´Ù´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

OpenMP´Â °øÀ¯ ¸Þ¸ð¸®¸¦ °®´Â º´·Ä ÄÄÇ»ÅÍ¿¡¼­ °øÈ÷ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾÷°èÀÇ Ç¥ÁØÀ̱⠶§¹®¿¡ À̽ļºÀÌ ¶Ù¾î³­ APIÀÌ´Ù.

MPI(Message Passing Interface)

MPI´Â °¢ ÇÁ·Î¼¼½º°£¿¡ µ¥ÀÌÅÍ ±³È¯À» Áö¿øÇØÁÖ´Â Functions(C ¾ð¾îÀÇ °æ¿ì)°ú Subroutines(Fortran ¾ð¾îÀÇ °æ¿ì)À» ¸ðÀº ¶óÀ̺귯¸®¸¦ ÁöĪÇÑ´Ù. MPIÀÇ Ç¥ÁØÀÌ Á¦Á¤µÇ±â Àü±îÁö´Â Ãʺ´·Ä ÄÄÇ»ÅÍ(Massively Parallel Processor)¿Í °°Àº ºÐ»ê ¸Þ¸ð¸®Çü ÄÄÇ»Å͸¶´Ù ¼­·Î ´Ù¸¥ Message Passing Library¸¦ °¡Áö°í ÀÖ¾î ÇÁ·Î±×·¥ °³¹ßÀÚ¿¡°Ô ºÎ´ãÀÌ µÇ¾ú´Ù. ÀÌ·¯ÇÑ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇØ 40¿©°³ÀÇ ±â°üÀ» ´ëÇ¥ÇÏ´Â MPI Forum(http://www.mpi-forum.org)°¡ °á¼ºµÇ¾î 2³â¿©ÀÇ ³ë·Â ³¡¿¡ °³¹ßµÈ °ÍÀÌ MPIÀÌ´Ù. ÃÖÃÊÀÇ MPI Ç¥ÁØÀº 1994³â¿¡ Á¦Á¤µÈ MPI-1 Ç¥ÁØÀÌ°í ÇöÀç¿¡´Â ÀϹæÇâ Åë½Å(One-Sided Communication)ÀÌ °¡´ÉÇØÁø MPI-2 Ç¥ÁØÀÌ °³¹ßµÇ¾î ¹ßÇ¥µÇ¾ú´Ù. ÀÌ Ç¥ÁØÀº °¢ ÇÔ¼ö ¶Ç´Â ¼­ºê·çƾÀÇ À̸§°ú ÇØ´çµÇ´Â Output, calling sequencesµîÀ» ±â¼úÇÏ°í ÀÖ¾î MPI Ç¥ÁØÀ» Áö¿øÇÏ´Â ¸ðµç Çϵå¿þ¾î¿¡ °³¹ßµÈ ÇÁ·Î±×·¥À» °øÈ÷ »ç¿ëÇÒ ¼ö ÀÖ´Â ¶Ù¾î³­ À̽ļºÀ» º¸ÀåÇÑ´Ù. °¢ Çϵå¿þ¾î Á¦Á¶¾÷ü´Â MPI Ç¥ÁØÀ» Áö¿øÇϸ鼭 Á¦Ç°ÀÇ Æ¯¼º¿¡ ¸Â´Â ÃÖÀûÈ­µÈ MPI ¹öÀüÀ» žÀçÇÏ°í ÀÖ´Ù.

MPI ÇÁ·Î±×·¥Àº ÀϹÝÀûÀ¸·Î ´ÙÀ½°ú °°Àº ÇüŸ¦ °¡Áö°í ÀÖ´Ù.

include MPI header file

variable declarations

initialize the MPI environment

...do computation and MPI communication calls...
close MPI communications

MPI header file·Î C¿¡¼­´Â #include <mpi.h>, Fortran¿¡¼­´Â INCLUDE 'mpif.h'¸¦ »ç¿ëÇÑ´Ù.

ÀÌ ÆÄÀÏ¿¡´Â ¸ðµç MPI Function°ú Subroutine¿¡ ´ëÇÑ Á¤ÀÇ°¡ µÇ¾î ÀÖ´Ù. À̸¦ Á¤ÀÇÇÑ ÈÄ¿¡ MPI¸¦ »ç¿ëÇϱâ À§Çؼ­´Â ¹Ýµå½Ã MPI ȯ°æÀ» ÃʱâÈ­ ½ÃÄÑÁà¾ß ÇÏ°í ÇÁ·Î±×·¥ ¸¶Áö¸·¿¡´Â MPI¸¦ Á¾·á ½ÃÄÑÁà¾ß ÇÑ´Ù. MPIÀÇ ÃʱâÈ­¿¡´Â MPI_InitÀ» »ç¿ëÇÏ°í MPI_Comm_rank, MPI_Comm_size¸¦ »ç¿ëÇÏ¿© MPIÀÇ ½ÇÇàÀ» À§ÇÑ Ãʱâ ȯ°æÀ» ±¸ÃàÇÑ´Ù. ÀÌÈÄ¿¡ MPI_RECV³ª MPI_SEND°°Àº ¸Þ½ÃÁö Åë½ÅÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© º´·Ä°è»êÀ» ¼öÇàÇÏ°í MPI_FINALIZE¸¦ ºÒ·¯ MPI ÇÁ·Î±×·¥À» Á¾·á½ÃŲ´Ù.

MPI´Â ´Ü¼øÈ÷ µð·ºÆ¼ºê¸¸À» »ðÀÔÇÏ´Â OpenMP¿Í´Â ´Þ¸® °³¹ßÀÚ°¡ ¸¹Àº °ÍÀ» ÁöÁ¤ÇØÁà¾ß ÇÑ´Ù. MPI´Â ´Ü°èÀû º´·ÄÈ­¸¦ ±¸ÇöÇÒ ¼ö ¾ø°í ±âÁ¸ Á÷·Ä ÇÁ·Î±×·¥ÀÇ ¼öÁ¤ÀÌ ¸¹ÀÌ ÇÊ¿äÇØ °³¹ß½Ã°£ÀÌ ¿À·¡ °É¸®´Â ´ÜÁ¡ÀÌ ÀÖÁö¸¸ ÀÏ´Ü °³¹ßÀÌ ¿Ï·áµÇ¸é ¿©·¯ Çϵå¿þ¾î¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ°í º´·Ä ¼º´Éµµ ¶Ù¾î³ª´Ù.

º´·Ä ÇÁ·Î±×·¡¹Ö¿¡¼­ÀÇ Issues

º´·Ä ÇÁ·Î±×·¥¿¡¼­ ÁÁÀº º´·Ä È¿À²À» º¸À̱â À§Çؼ­´Â °¢ ÇÁ·Î¼¼½º¿¡ µ¿ÀÏÇÑ Å©±âÀÇ ÀÏÀ» ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ÀÏÀ» ºÐ¹èÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¸øÇÏ¸é °¡Àå ¸¹Àº ÀÏÀ» ÇÒ´ç ¹ÞÀº ÇÁ·Î¼¼½º°¡ Á¾·á µÉ ¶§±îÁö ´Ù¸¥ ÇÁ·Î¼¼½º´Â ´ë±â »óÅ¿¡ Àֱ⠶§¹®¿¡ º´·Ä È¿À²ÀÌ Å©°Ô ¶³¾îÁö°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¹®Á¦¸¦ load balancing ¹®Á¦¶ó°í ÇÑ´Ù. ¸¹Àº °è»ê¹®Á¦¿¡¼­ ÀÛ¾÷·®À» ±ÕµîÇÏ°Ô ºÐ¹èÇÏ´Â °ÍÀº ½¬¿î ÀÏÀº ¾Æ´Ï¸ç °¢ ÀÀ¿ëºÐ¾ß¿¡¼­ ÀûÀýÇÑ ºÐ¹è¸¦ À§ÇÑ ¿©·¯ °¡Áö load balancing techniqueÀÌ °³¹ßµÇ¾î »ç¿ëµÇ°í ÀÖ´Ù

º´·Ä ½´ÆÛ ÄÄÇ»ÅÍÀÇ ¼º´ÉÀ» Á¦´ë·Î È°¿ëÇϱâ À§Çؼ­´Â Ç®°íÀÚ ÇÏ´Â ¹®Á¦ÀÇ Å©±â°¡ ÀûÀýÇØ¾ß ÇÑ´Ù. ´ÜÀÏ ÇÁ·Î¼¼¼­·Îµµ ÃæºÐÇÑ ¹®Á¦¸¦ º´·Ä·Î ó¸®ÇÒ °æ¿ì °è»ê½Ã°£ ´ëºñ¿¡¼­ ÇÁ·Î¼¼½º°£ÀÇ Åë½Å¿¡ ¼Ò¿äµÇ´Â ½Ã°£ÀÌ ´õ Ä¿Áö°Ô µÇ±â ¶§¹®¿¡ ±â´ëÇÏ´Â ¸¸Å­ÀÇ ¼º´ÉÀÌ ³ª¿ÀÁö ¾ÊÀ» °ÍÀÌ´Ù.

º´·Ä ½´ÆÛ ÄÄÇ»ÅÍ »ç¿ëÀڵ鿡 Áß¿äÇÑ ºÎºÐ ÁßÀÇ Çϳª´Â ÁÁÀº software toolsÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ µµ±¸µé Áß¿¡ ÁÖ·Î »ç¿ëµÇ´Â °Í¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.

- º´·Ä ÄÄÆÄÀÏ·¯(parallel compilers)
- º´·Ä µð¹ö°Å(parallel debuggers) [ PDF ]
- ¼º´ÉÇؼ®µµ±¸(performance analysis tools) [ PDF ]  
- º´·Ä °è»ê ¼ÒÇÁÆ®¿þ¾î ¶óÀ̺귯¸®(parallel math software library)

Âü°í 1: For performance analysis: http://techpubs.sgi.com > search speedshop (enter) ÇÏ¿© ã¾Æ¼­ °¡Á®¿Â Book :  32% SpeedShop User's Guide (Áï, À§ÀÇ ¼º´ÉÇؼ®µµ±¸¶õÀÇ PDF ÆÄÀÏ)¸¦ Ŭ¸¯ÇÏ¿© SpeedShop °ü·Ã ¸í·É¾îµéÀÇ »ç¿ë¹ýÀ» ÀÐÀº ÈÄ, 
¿¹¸¦ µé¾î,  º» ¼­¹öÀÇ /usr/demos/SpeedShop/generic µð·ºÅ丮¿¡ ÀÖ´Â generic.c ÆÄÀÏÀ» º»ÀÎÀÇ HOME directory ·Î copy ÇØ ¿Â ÈÄ,  
% cc generic.c (enter)     ÇÏ¿© ÄÄÆÄÀÏÇÑ ÈÄ¿¡, 
% ssrun -pcsampx a.out (enter)       ÇÏ¿© ssrun(SpeedShopRun)À» ½ÇÇàÇÑ ÈÄ,
% ls -la a.out.* (enter)      ÇÏ¿© »õ·Î »ý¼ºµÈ ÆÄÀÏÀ̳ª »ç¶÷ÀÌ ÀÐÀ» ¼ö ¾ø´Â ¸Å¿ì ±ä À̸§ÀÇ
                                    "a.out.?¼ýÀÚ" ÆÄÀÏÀ» È®ÀÎÇÑ ÈÄ,
% prof a.out.?¼ýÀÚ (enter)   Çϸé, a.out ½ÇÇàÆÄÀÏÀÇ ¼º´ÉÀ» ASCII ÆÄÀÏ ÇüÅ·Πº¼ ¼ö ÀÖ´Ù. 
Âü°í 2: For parallel debuggers: http://trinitas.mju.ac.kr/infosearch > search workshop (enter), and refer to % /usr/demos/WorkShop directory.
Âü°í 3: For parallel math software library: SCSL(Scientific Computing Software library) ¼Ò°³ ¹× http://trinitas.mju.ac.kr/infosearch > search scsl (enter).
Âü°í 4: For parallel compilers: SGI Origin 3000 ¼öÆÛÄÄÇ»Å͸¦ ÀÌ¿ëÇÑ º´·Ä󸮷Î

 
  Mail to Professor Sun Tae Soh Copyrights trinitas.mju.ac.kr All Rights Reserved.