MPI-2: Extensions to the Message-Passing Interface
Message Passing Interface Forum
¡¡
Á¦
6Àå ÀϹæÇâ Åë½Å (Chapter 6 One-Sided Communications)¸ð
»ó ¸¸¡¡
¼
·Ð (Introduction)Á¦6Àå ÀϹæÇâ Åë½ÅÀº ´ÜÀÏ ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© ¿Ï·áµÉ ¼ö ÀÖ´Â Åë½Å ·çƾÀ» Á¤ÀÇÇÑ´Ù. ÀÌµé ·çÆ¾Àº °øÀ¯ ¸Þ¸ð¸® µ¿ÀÛ(put/get)°ú ¿ø°Ý ´©Àû µ¿ÀÛÀ» Æ÷ÇÔÇÑ´Ù.
¿ø°Ý ¸Þ¸ð¸® Á¢±Ù(RMA)Àº MPIÀÇ Åë½Å ¸ÞÄ¿´ÏÁòÀ» È®ÀåÇÑ °ÍÀ¸·Î¼, ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ ¼Û½ÅÃø°ú ¼ö½ÅÃø ¸ðµÎÀÇ Åë½Å ÆÄ¶ó¹ÌÅ͸¦ ¸í½ÃÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. ÀÌ Åë½Å ¸ðµå´Â µ¥ÀÌÅÍ Á¢±Ù ÆÐÅÏÀ» µ¿ÀûÀ¸·Î º¯°æÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. °¢ ÇÁ·Î¼¼½º´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ Á¢±ÙÇÏ°í º¯°æÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, ÇÁ·Î¼¼½ºµéÀº ÀÚ½ÅÀÇ ¸Þ¸ð¸®¿¡ ÀÖ´Â ¾î¶² µ¥ÀÌÅͰ¡ ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© Á¢±Ù ¶Ç´Â º¯°æµÇ¾ú´ÂÁö ¾Ë ¼ö ¾øÀ¸¸ç, ½ÉÁö¾î ÀÌµé ¿ø°Ý ÇÁ·Î¼¼½º¸¦ ½Äº°ÇÒ ¼öµµ ¾ø´Ù. µû¶ó¼, ¸ðµç Àü¼Û ÆÄ¶ó¹ÌÅ͵éÀº ÇÑ ÂÊ¿¡¼¸¸ ¾Ë°í »ç¿ëÇÒ ¼ö ÀÖ´Ù. Åë»óÀûÀÎ send/receive Åë½ÅÀº ¼Û½ÅÀÚ¿Í ¼ö½ÅÀÚ »çÀÌÀÇ Á¤ÇÕ µ¿ÀÛÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ µ¿ÀÛÀº ³ëµç ÇÁ·Î¼¼½º°¡ ½Ã°£À» ³¶ºñÇÏ´Â Àü¿ªÀû °è»ê¿¡ Âü¿©ÇÏ°Ô Çϰųª Åë½Å ¿ä±¸¿¡ ´ëÇÏ¿© ÁÖ±âÀûÀ¸·Î Æú¸µ(polling)ÇÏ°Ô ÇÑ´Ù. RMA Åë½Å ¸ÞÄ¿´ÏÁòÀÇ »ç¿ëÀº Àü¿ªÀû °è»êÀ̳ª ¸í½ÃÀûÀÎ Æú¸µÀÇ Çʿ伺À» Á¦°ÅÇØ ÁØ´Ù.
¸Þ½ÃÁö Àü´Þ Åë½ÅÀº ¼Û½ÅÀڷκÎÅÍ ¼ö½ÅÀÚ·ÎÀÇ µ¥ÀÌÅÍ Åë½Å ¹× ¼Û½ÅÀÚ¿Í ¼ö½ÅÀÚ »çÀÌÀÇ µ¿±âÈ µî µÎ °¡ÁöÀÇ È¿°ú¸¦ ´Þ¼ºÇÏ°Ô ÇØÁØ´Ù. RMA ¼³°è´Â ÀÌµé µÎ ±â´ÉÀ» ºÐ¸®ÇÑ´Ù. MPI_PUT (¿ø°Ý ¾²±â), MPI_GET (¿ø°Ý Àбâ), MPI_ACCUMULATE (¿ø°Ý º¯°æ) µîÀÇ ¼¼ °¡Áö Åë½Å È£ÃâÀÌ Á¦°øµÈ´Ù. ¼·Î ´Ù¸¥ µ¿±âÈ ÇüŸ¦ Áö¿øÇϱâ À§ÇÏ¿© ¸¹Àº µ¿±âÈ È£ÃâÀÌ Á¦°øµÈ´Ù. ÀÌ´Â ¾àÇÑ Àϰü¼ºÀ» °®´Â ¸Þ¸ð¸® ½Ã½ºÅÛÀÇ ¼³°è¿Í Èí»çÇÏ´Ù.
RMA
±â´ÉÀÇ ¼³°è´Â ±¸ÇöÀÚ·Î ÇÏ¿©±Ý °í¼Ó Åë½ÅÀÇ ÀåÁ¡À» ¾òµµ·Ï ÇØÁØ´Ù.¡¡
ÃʱâÈ
(Initialization)À©µµ¿ì(window)´Â ÇϳªÀÇ Ä¿¹Â´ÏÄÉÀÌÅÍ(communicator) ³»ºÎ¿¡ ÀÖ´Â °¢ ÇÁ·Î¼¼½º°¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸® ³»ºÎÀÇ ÀÏÁ¤ ¿µ¿ªÀ» ¸»ÇÑ´Ù. ÃʱâÈ µ¿ÀÛÀº °¢ ÇÁ·Î¼¼½º°¡ À©µµ¿ì¸¦ ¼³Á¤ÇÏ´Â °ÍÀ» °¡´ÉÇÏ°Ô ÇØÁØ´Ù. À©µµ¿ì´Â ¿ø°Ý ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ÃʱâÈ È£ÃâÀº À©µµ¿ì ÁýÇÕÀ» ¼ÒÀ¯Çϰí Á¢±ÙÇÏ´Â ÇÁ·Î¼¼½º ±×·ìÀ» ³ªÅ¸³»´Â °´Ã¼¿Í °¢ À©µµ¿ìÀÇ ¼Ó¼ºÀ» µ¹·ÁÁØ´Ù.
¡¡
MPI_WIN_CREATE(base, size, disp_unit, info, comm, win)
¡¡
»ó±â È£ÃâÀº comm ±×·ì ³»¿¡ ÀÖ´Â ¸ðµç ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© ½ÇÇàµÇ´Â ÁýÇÕ È£ÃâÀÌ´Ù.
¡¡
MPI_WIN_FREE(win)
MPI_WIN_GET_GROUP(win, group)
¡¡
Åë½Å
È£Ãâ (Communication Calls)MPI
´Â ¼¼ °¡ÁöÀÇ RMA Åë½Å È£ÃâÀ» Áö¿øÇÑ´Ù. MPI_PUTÀº È£ÃâÀÚ ¸Þ¸ð¸®·ÎºÎÅÍ ¸ñÀûÁö ¸Þ¸ð¸®·Î µ¥ÀÌÅ͸¦ Àü¼ÛÇÑ´Ù. MPI_GETÀº ¸ñÀûÁö ¸Þ¸ð¸®·ÎºÎÅÍ È£ÃâÀÚ ¸Þ¸ð¸®·Î µ¥ÀÌÅ͸¦ Àü¼ÛÇÑ´Ù. MPI_ACCUMULATE´Â È£ÃâÀÚ ¸Þ¸ð¸®·ÎºÎÅÍ º¸³»Áø °ªÀ» ´õÇÏ¿© ¸ñÀûÁö ¸Þ¸ð¸®ÀÇ °ªÀ» º¯°æÇÑ´Ù. ÀÌµé µ¿ÀÛÀº nonblockingÀÌ´Ù. Áï, È£ÃâÀÌ Àü¼ÛÀ» °³½ÃÇÏÁö¸¸, Àü¼ÛÀº È£ÃâÀÌ º¹±ÍµÈ ÈÄ¿¡ °è¼ÓµÉ ¼öµµ ÀÖ´Ù. Æ÷ÇÔÇÑ À©µµ¿ì °´Ã¼¿¡ ´ëÇÏ¿© ¼Û½ÅÀÚ°¡ ÀÕµû¶ó µ¿±âÈ È£ÃâÀ» ¼öÇàÇϸé, Àü¼ÛÀº ¼Û½ÅÃø°ú ¼ö½ÅÃø ¸ðµÎ¿¡¼ ¿Ï·áµÈ´Ù.ÇϳªÀÇ À©µµ¿ì ¾È¿¡ ÀÖ´Â µ¿ÀÏ ¸Þ¸ð¸® À§Ä¡¿¡ ´ëÇÑ µ¿½Ã´Ù¹ßÀû Á¢±ÙÀº ¿À·ù¸¦ À¯¹ßÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. ÇϳªÀÇ ¸Þ¸ð¸® À§Ä¡°¡ put ¶Ç´Â accumulate µ¿ÀÛ¿¡ ÀÇÇÏ¿© º¯°æµÇ¸é, ÀÌ À§Ä¡´Â ¸ñÀûÁö¿¡¼ º¯°æ µ¿ÀÛÀÌ ¿Ï·áµÉ ¶§±îÁö load ¶Ç´Â ´Ù¸¥ RMA µ¿ÀÛ¿¡ ÀÇÇÏ¿© Á¢±ÙÇÒ ¼ö ¾ø´Ù.
¡¡
MPI_PUT(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win)
MPI_GET(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win)
MPI_ACCUMULATE(origin_addr, origin_count, origin_datatype, target_tank, target_disp, target_count, target_datatype, op, win)
¡¡
µ¿±âÈ
È£Ãâ (Synchronization Calls)RMA
Åë½ÅÀº µÎ °¡Áö ºÐ·ù·Î ³ª´©¾îÁø´Ù.´Éµ¿ ¸ñÀûÁö Åë½Å(active target communication): µ¥ÀÌÅͰ¡ ÇÑ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®·ÎºÎÅÍ ¶Ç ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®·Î À̵¿µÈ´Ù. µÎ ÇÁ·Î¼¼½º ¸ðµÎ ¸í½ÃÀûÀ¸·Î Åë½Å¿¡ Æ÷ÇԵȴÙ. ÀÌ Åë½Å ÆÐÅÏÀº ¸ðµç µ¥ÀÌÅÍ Àü¼Û ÀÎÀÚ°¡ ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© Á¦°øµÇ°í µÎ¹øÂ° ÇÁ·Î¼¼½º´Â µ¿±âÈ¿¡¸¸ Âü¿©ÇÏ´Â °ÍÀ» Á¦¿ÜÇϰí´Â ¸Þ½ÃÁö Àü´Þ°ú À¯»çÇÏ´Ù. (±×¸² 6.1 ÂüÁ¶)
¼öµ¿ ¸ñÀûÁö Åë½Å(passive target communication): µ¥ÀÌÅͰ¡ ÇÑ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®·ÎºÎÅÍ ¶Ç ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®·Î À̵¿µÇ°í, ¼Û½ÅÃø ÇÁ·Î¼¼½º¸¸ÀÌ ¸í½ÃÀûÀ¸·Î Àü¼Û¿¡ Æ÷ÇԵȴÙ. µû¶ó¼, µÎ °³ÀÇ ¼Û½Å ÇÁ·Î¼¼½º´Â ¸ñÀûÁö À©µµ¿ì¿¡ ÀÖ´Â µ¿ÀÏ ¸Þ¸ð¸® À§Ä¡¸¦ Á¢±ÙÇÔÀ¸·Î½á ¼·Î Åë½ÅÇÒ ¼ö ÀÖ´Ù. Åë½Å¿¡ ¸í½ÃÀûÀ¸·Î Âü¿©ÇÏÁö ¾Ê´Â °æ¿ì¿¡, ¸ñÀûÁö À©µµ¿ì¸¦ ¼ÒÀ¯ÇÑ ÇÁ·Î¼¼½º´Â µÎ °³ÀÇ Åë½Å ÇÁ·Î¼¼½º¿Í´Â º°µµ·Î ±¸ºÐµÈ´Ù. ÀÌ·¯ÇÑ Åë½Å ÆÐ·¯´ÙÀÓÀº °øÀ¯ µ¥ÀÌÅͰ¡ À§Ä¡¿¡ »ó°ü¾øÀÌ ¸ðµç ÇÁ·Î¼¼½º¿¡ ÀÇÇÏ¿© Á¢±ÙµÉ ¼ö ÀÖ´Â °øÀ¯¸Þ¸ð¸® ¸ðµ¨°ú ¸Å¿ì Èí»çÇÏ´Ù. (±×¸² 6.3 ÂüÁ¶)
ÀÎÀÚ winÀ» °®´Â RMA Åë½Å È£ÃâÀº win¿¡ ´ëÇÑ access epoch ³»¿¡¼¸¸ ÇÑ ÇÁ·Î¼¼½º¿¡¼ ÀϾ ¼ö ÀÖ´Ù. ±×¿Í °°Àº epoch´Â win¿¡ ´ëÇÑ RMA µ¿±âÈ È£Ãâ°ú ÇÔ²² ½ÃÀÛÇϰí, win¿¡ ´ëÇÏ¿© ¿µ(zero) ¶Ç´Â Çϳª ÀÌ»óÀÇ RMA Åë½Å È£Ãâ(MPI_PUT, MPI_GET, ¶Ç´Â MPI_ACCUMULATE)À» ¼öÇàÇϰí, win¿¡ ´ëÇÑ ¶Ç ´Ù¸¥ µ¿±âÈ È£Ãâ°ú ´õºÒ¾î Á¾·áÇÑ´Ù.
µ¿ÀÏ ¸Þ¸ð¸® À§Ä¡¿¡ ´ëÇÑ º°°³ÀÇ access epochs´Â °ãÄ¡Áö ¾Ê°í »óÈ£ µ¶¸³ÀûÀ̾î¾ß ÇÑ´Ù.
MPI
´Â ¼¼ °¡ÁöÀÇ µ¿±âÈ ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù. ÀÌµé °¢°¢Àº ¿ïŸ¸®(fence), ÀϹÝÀûÀÎ ´Éµ¿ ¸ñÀûÁö µ¿±âÈ(general active target synchronization, ±×¸² 6.4 ÂüÁ¶), ±×¸®°í Àá±Ý(lock) µîÀÌ ÀÖ´Ù.¡¡
MPI_WIN_FENCE(assert, win)
MPI_WIN_START(group, assert, win)
MPI_WIN_COMPLETE(win)
MPI_WIN_POST(group, assert, win)
MPI_WIN_WAIT(win)
MPI_WIN_TEST(win, flag)
MPI_WIN_LOCK(lock_type, rank, assert, win)
MPI_WIN_UNLOCK(rank, win)
¡¡
½Ã¸Çƽ½º
¹× Á¤È®¼º (Semantics and Correctness)RMA
µ¿ÀÛÀÇ ½Ã¸Çƽ½º´Â ½Ã½ºÅÛÀÌ ÇÁ·Î¼¼½º ¸Þ¸ð¸®¿¡ ÀÖ´Â ¿ø·¡ÀÇ À§Ä¡(»çÀ¯ À©µµ¿ì º¹»çº»)¿¡ Ãß°¡ÇÏ¿© °¢ À©µµ¿ìÀÇ ºÐ¸®µÈ °øÀ¯ º¹»çº»À» À¯ÁöÇÑ´Ù°í °¡Á¤ÇÔÀ¸·Î½á °¡Àå Àß ÀÌÇØµÉ ¼ö ÀÖ´Ù. (±×¸² 6.5 ÂüÁ¶)µÎ °³ÀÇ ÇÁ·Î¼¼¼°£ µ¿±âÈ È£ÃâÀÌ »óÈ£ ¼ø¼°¡ ¾ù°¥¸®´Â °æ¿ì¿¡ ±³Âø»óÅÂ(deadlock)°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î, ÇÁ·Î±×·¥Àº ÀÌ·¯ÇÑ ±³Âø»óŰ¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï À¯ÀÇÇØ¼ ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù. (±×¸² 6.7 ÂüÁ¶)
¡¡