ÇÁ·Î¼¼½º »ý¼º°ú °ü¸®

  1. ¼­·Ð

    MPI-1ÀÇ ´ÜÁ¡

    MPI »ç¿ëÀÚÀÇ ¿ä±¸
    - ¾îÇø®ÄÉÀ̼ÇÀÌ ½ÃÀÛµÈ ÈÄ¿¡ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ°í °ü¸®ÇÒ ¼ö ÀÖµµ·Ï MPI-1 È®Àå ¿ä±¸
    ÀÚ¿ø Á¦¾î MPI-2¿¡ Ãß°¡µÇÁö ¾ÊÀ½ ÇÁ·Î¼¼½º °ü¸® ±â´É Ãß°¡ ÀÌÀ¯ : ±â¼úÀûÀÌ°í ½Ç¿ëÀû ÇÁ·Î¼¼½º °ü¸®°¡ Áß¿äÇÑ ¹Ý¸é ÇÁ·Î¼¼½º °ü¸® ±â´É Ãß°¡´Â ȣȯ¼º°ú ¼º´É ¹®Á¦¿Í »óÃæµÊ ÇÁ·Î¼¼½º °ü¸® ¸ðµ¨Àº ÀÌ·¯ÇÑ À̽´¸¦ ´ÙÀ½ µÎ °¡Áö·Î ¿ªÁ¡À» µÒ

  2. MPI-2 ÇÁ·Î¼¼½º ¸ðµ¨

    MPI ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÑ ÈÄ ÇÁ·Î¼¼½ºÀÇ »ý¼º°ú Çùµ¿ÀûÀÎ Á¾·á°¡ °¡´É
    »õ·Î »ý¼ºµÈ ÇÁ·Î¼¼½º¿Í ±âÁ¸ÀÇ MPI ÀÀ¿ëÇÁ·Î±×·¥°£ÀÇ Åë½Å ¼³Á¤ Á¦°ø
    »ý¼ºÇÑ ÇÁ·Î¼¼½º°¡ ¾Æ´Ï´õ¶óµµ ÇÁ·Î¼¼½º °£ÀÇ Åë½Å ¼³Á¤ Á¦°ø

    1. ÇÁ·Î¼¼½º ½ÃÀÛ

      MPI ÀÀ¿ëÇÁ·Î±×·¥Àº ¿ÜºÎ ÇÁ·Î¼¼½º °ü¸®ÀÚ¿ÍÀÇ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÃÀÛ °¡´É
      MPI_COMM_SPAWN : MPI ÇÁ·Î¼¼½ºµéÀ» ½ÃÀÛÇÏ°í ±×µé°ú Åë½ÅÀ» ¼³Á¤Çϰí intercommunicator¸¦ ¹Ýȯ
      MPI_COMM_SPAWN_MULTIPLE : ¼­·Î ´Ù¸¥ ¹ÙÀ̳ʸ®³ª ´Ù¸¥ ÀÎÀÚÀÇ °°Àº ¹ÙÀ̳ʸ®¸¦ ½ÃÀÛÇÏ°í °°Àº MPI_COMM_WORLD¿¡ ³õ°í intercommunicator¸¦ ¹Ýȯ
      ÇÁ·Î¼¼½ºµéÀ» Ç¥ÇöÇϱâ À§ÇØ ±âÁ¸ÀÇ group °ü³äÀ» »ç¿ë
      ÇÁ·Î¼¼½º´Â (group,rank)ÀÇ ½ÖÀ¸·Î ½Äº°

    2. runtime ȯ°æ

      MPI_COMM_SPAWN°ú MPI_COMM_SPAWN_MULTIPLEÀº MPI¿Í MPIÀÀ¿ëÇÁ·Î±×·¥ÀÇ runtime ȯ°æ»çÀÌÀÇ ÀÎÅÍÆäÀ̽º¸¦ Á¦°ø
      ȯ°æÀÇ ¿¹

      • ¹èÄ¡ Å¥ ½Ã½ºÅÛÀ¸·Î °ü¸®µÇ´Â MPP
      • PVMÀ» ÀÌ¿ëÇÑ Network of workstation(NOW)
      • load balancing ½Ã½ºÅÛÀ¸·Î °ü¸®µÇ´Â NOW
      • Unix¿Í Å« SMP
      MPI´Â ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¼öÇàµÇ´Â ȯ°æÀÇ Á¸À縦 ³»ÀçÀûÀ¸·Î °¡Á¤
      ->¿î¿µÃ¼Á¦ ¼­ºñ½º´Â Á¦°øÇÏÁö ¾ÊÀ½
      ¾î¶² ³·Àº ¼öÁØ¿¡¼­ runtime ½Ã½ºÅÛ°ú »óÈ£ÀÛ¿ëÀÌ °¡´ÉÇØ¾ß ÇÔ
      ->»óÈ£ÀÛ¿ëÀÇ ¼¼ºÎ´Â ±ÔÁ¤µÇÁö ¾ÊÀ½
      ȯ°æ °íÀ¯ÀÇ ±â´ÉÀÇ ÀåÁ¡À» ¾ò±âÀ§ÇØ ¸¹Àº MPI ·çƾÀÌ ÀÎÀÚ·Î info¸¦ °®À½
  3. ÇÁ·Î¼¼½º °ü¸® ÀÎÅÍÆäÀ̽º

    1. MPIÀÇ ÇÁ·Î¼¼½º
      (group,rank)½ÖÀ¸·Î Ç¥Çö
      (group,rank)½ÖÀº ÇϳªÀÇ ÇÁ·Î¼¼½º¸¦ ±ÔÁ¤Çϳª ÇϳªÀÇ ÇÁ·Î¼¼½º´Â (group,rank)½ÖÀÌ ¿©·¯ °³ÀÏ ¼ö ÀÖÀ½
    2. ÇÁ·Î¼¼½º ½ÃÀÛ°ú Åë½Å ¼³Á¤
      MPI_COMM_SPAWN(command, argv, maxprocs, info, root, comm, intercomm, array_of_errcodes)
      INcommand½ÃÀÛÇÒ ÇÁ·Î±×·¥ À̸§(¹®ÀÚ¿­)
      INargvcommandÀÇ ÀÎÀÚ(¹®ÀÚ¿­ ¹è¿­)
      INmaxprocs½ÃÀÛÇÒ ÇÁ·Î¼¼½ºÀÇ ÃÖ´ë°ª(Á¤¼ö)
      INinforuntime ½Ã½ºÅÛ¿¡°Ô ¾îµð¼­ ¾î¶»°Ô ½ÃÀÛÇÒ °ÍÀÎÁö ¾Ë¸®´Â key¿Í °ªÀÇ ÁýÇÕ(handle)
      INrootÀÌÀü ÀÎÀÚ¸¦ °ËÅäÇÑ ÇÁ·Î¼¼½ºÀÇ rank(Á¤¼ö)
      INcommÇÁ·Î¼¼½ºÀÇ group¸¦ °¡Áø intracommunicator(handle)
      OUTintercomm¿ø·¡ group°ú ÃÖ±ÙÀÇ »ý¼ºµÈ group°£ÀÇ intercommunicator(handle)
      OUTarray_of_errcodesÇÁ·Î¼¼½º´ç ÇϳªÀÇ ÄÚµå(Á¤¼ö ¹è¿­)
      int MPI_Comm_spawn(char *command, char *argv[], int maxprocs, MPI_INFO info, int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[])
      MPI_COMM_SPAWNÀº command·Î Á¤ÀÇµÈ ÇÁ·Î±×·¥À» maxprocs°³¸¸Å­ ½ÃÀÛÇÏ·Á°í ÇÏ°í ±×µé°ú Åë½ÅÀ» ¼³Á¤Çϰí intercommunicator¸¦ ¹Ýȯ
      spawnµÈ ÇÁ·Î¼¼½ºµéÀ» ÀÚ½ÄÀ̶ó ºÎ¸£°í ÀÚ½ÄÀº ºÎ¸ð¿Í´Â ´Ù¸¥ MPI_COMM_WORLD¸¦ °¡Áü
      MPI_COMM_SPAWNÀº commÀ§¿¡¼­ collectiveÇϰí ÀڽĿ¡¼­ MPI_INITÀÌ È£ÃâµÇ±âÀü¿¡ ¹ÝȯµÇÁö ¾ÊÀ» ¼ö ÀÖÀ½
      MPI_COMM_SPAWN¿¡ ÀÇÇØ ¹ÝȯµÇ´Â intercommunicator´Â local groupÀÇ ºÎ¸ð ÇÁ·Î¼¼½º¿Í remote groupÀÇ ÀÚ½Ä ÇÁ·Î¼¼½ºµéÀ» Æ÷ÇÔ
      ÀÌ intercommunicator´Â ÀڽĿ¡¼­ MPI_COMM_GET_PARENT¸¦ ÅëÇØ ¾ò¾îÁü
      • command ÀÎÀÚ: spawnµÉ ÇÁ·Î±×·¥ÀÇ À̸§À» °¡Áø ¹®ÀÚ¿­
        ¾î¶»°Ô ½ÇÇàÆÄÀÏÀ» ¹ß°ßÇϰí ÀÛ¾÷µð·ºÅ丮°¡ °áÁ¤µÇ´ÂÁö¿¡ ±ÔÁ¤µÇÁö ¾ÊÀ½
        ±¸Çö¿¡ Á¾¼ÓµÇ°í runtime ȯ°æ°ú ÀûÇÕÇØ¾ß ÇÔ
        MPI_INITÀ» È£ÃâÇÏÁö ¾Ê°í MPI_INITÀ» È£ÃâÇÏ´Â ÇÁ·Î±×·¥À» forkÇÏ¸é °á°ú´Â Á¤ÀǵÇÁö ¾ÊÀ½
      • argv ÀÎÀÚ : program¿¡ Àü´ÞµÉ ÀÎÀÚ¸¦ °¡Áø ¹®ÀÚ¿­ ¹è¿­
        óÀ½ ¿ø¼Ò´Â command ÀÚ½ÅÀÌ ¾Æ´Ñ óÀ½ ÀÎÀÚ
        MPI_ARGV_NULL »ó¼ö - ÀÎÀÚ°¡ ¾øÀ½À» ³ªÅ¸³»´Â »ó¼ö
      • maxprocs ÀÎÀÚ : maxprocs°³ÀÇ ÇÁ·Î¼¼½º¸¦ spawn, ½ÇÆÐÇϸé MPI_ERR_SPAWNÀ» raiseÇÔ
        MPI_COMM_SPAWNÀÌ ¼º°øÀûÀ¸·Î ¹ÝȯµÇ¸é spawnµÈ ÇÁ·Î¼¼½ºÀÇ ¼ö´Â intercommÀÇ remote groupÀÇ Å©±â
        ±×°ÍÀÌ maxprocsº¸´Ù ÀÛÀ¸¸é spawnµÇÁö ¾ÊÀº ÇÁ·Î¼¼½ºÀÇ ÀÌÀ¯°¡ array_of_errcodes¿¡ ÀúÀå
      MPI_COMM_GET_PARENT(parent)
      INparentºÎ¸ð communicator(handle)
      int MPI_Comm_get_parent(MPI_Comm *parent)
      ÇöÀç ÇÁ·Î¼¼½ºÀÇ ºÎ¸ð intercommunicator¸¦ ¹Ýȯ
      spawnµÈ ÇÁ·Î¼¼½º°¡ ¾Æ´Ï¶ó¸é MPI_COMM_NULL¸¦ ¹Ýȯ
      ºÎ¸ð communicator°¡ ²÷°å´Ù¸é MPI_COMM_NULLÀ» ¹Ýȯ
    3. ´ÙÁß ½ÇÇàÆÄÀÏ ½ÃÀÛ°ú Åë½Å ¼³Á¤
      MPI_COMM_SPAWN_MULTIPLE(count, array_of_commands, array_of_argv, array_of_maxprocs, array_of_info, root, comm, intercomm, array_of_errcodes)
      INcount¸í·É¾îÀÇ °³¼ö(¾çÀÇ Á¤¼ö)
      INcommand½ÃÀÛÇÒ ÇÁ·Î±×·¥ À̸§(¹®ÀÚ¿­ ¹è¿­)
      INargvcommandÀÇ ÀÎÀÚ(¹®ÀÚ¿­ ¹è¿­)
      INmaxprocs½ÃÀÛÇÒ ÇÁ·Î¼¼½ºÀÇ ÃÖ´ë°ª(Á¤¼ö ¹è¿­)
      INinforuntime ½Ã½ºÅÛ¿¡°Ô ¾îµð¼­ ¾î¶»°Ô ½ÃÀÛÇÒ °ÍÀÎÁö ¾Ë¸®´Â key¿Í °ªÀÇ ÁýÇÕ(handle ¹è¿­)
      INrootÀÌÀü ÀÎÀÚ¸¦ °ËÅäÇÑ ÇÁ·Î¼¼½ºÀÇ rank(Á¤¼ö)
      INcommÇÁ·Î¼¼½ºÀÇ group¸¦ °¡Áø intracommunicator(handle)
      OUTintercomm¿ø·¡ group°ú ÃÖ±ÙÀÇ »ý¼ºµÈ group°£ÀÇ intercommunicator(handle)
      OUTarray_of_errcodesÇÁ·Î¼¼½º´ç ÇϳªÀÇ ÄÚµå(Á¤¼ö ¹è¿­)
      int MPI_Comm_spawn(int count, char *array_of_commands[], char **array_of_argv[], int array_of_maxprocs, MPI_INFO info, int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[])
    4. ¿¹¾àµÈ key
      hosthostname
      archarchitecture
      wdirÀÛ¾÷ µð·ºÅ丮
      path½ÇÇà ÆÄÀÏÀ» ãÀ» °÷, pathÀÇ formatÀº ±¸ÇöÇϸ鼭 °áÁ¤
      fileÃß°¡Á¤º¸°¡ ±ÔÁ¤µÈ ÆÄÀÏ À̸§
      softMPI_COMM_SPAWNÀÌ »ý¼ºÇÒ ¼ö ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ ¼ö¿¡ ´ëÇÑ Çã°¡µÈ °ª
    5. SPAWN ¿¹Á¦
      manager /* manager */ #include "mpi.h" int main(int argc, char *argv[]) { int world_size, universe_size, *universe_sizep, flag; MPI_Comm everyone; /* intercommunicator */ char worker_program[100]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &world_size); if (world_size != 1) error("Top heavy with management"); MPI_Attr_get(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, &universe_sizep, &flag); if (!flag) { printf("This MPI does not support UNIVERSE_SIZE. How many\n\ processes total?"); scanf("%d", &universe_size); } else universe_size = *universe_sizep; if (universe_size == 1) error("No room to start workers"); /* * Now spawn the workers. Note that there is a run-time determination * of what type of worker to spawn, and presumably this calculation must * be done at run time and cannot be calculated before starting * the program. If everything is known when the application is * first started, it is generally better to start them all at once * in a single MPI_COMM_WORLD. */ choose_worker_program(worker_program); MPI_Comm_spawn(worker_program, MPI_ARGV_NULL, universe_size-1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &everyone, MPI_ERRCODES_IGNORE); /* * Parallel code here. The communicator "everyone" can be used * to communicate with the spawned processes, which have ranks 0,.. * MPI_UNIVERSE_SIZE-1 in the remote group of the intercommunicator * "everyone". */ MPI_Finalize(); return 0; }
      worker /* worker */ #include "mpi.h" int main(int argc, char *argv[]) { int size; MPI_Comm parent; MPI_Init(&argc, &argv); MPI_Comm_get_parent(&parent); if (parent == MPI_COMM_NULL) error("No parent!"); MPI_Comm_remote_size(parent, &size); if (size != 1) error("Something's wrong with the parent"); /* * Parallel code here. * The manager is represented as the process with rank 0 in (the remote * group of) MPI_COMM_PARENT. If the workers need to communicate among * themselves, they can use MPI_COMM_WORLD. */ MPI_Finalize(); return 0; }
  4. Åë½Å ¼³Á¤

    communicator¸¦ °øÀ¯ÇÏÁö ¾Ê´Â MPI ÇÁ·Î¼¼½ºµéÀÇ µÎ ÁýÇÕ»çÀÌÀÇ Åë½ÅÀ» ¼³Á¤ÇÏ´Â ÇÔ¼ö
    ÀÌ·¯ÇÑ ÇÔ¼ö°¡ À¯¿ëÇÑ °æ¿ì

    ÀÌ·¯ÇÑ °æ¿ì Àü¿¡ ¾ø¾ú´ø Åë½Å ä³ÎÀ» ¼³Á¤ÇØ¾ß ÇÏ°í ºÎ¸ð/ÀÚ½Ä °ü°è°¡ ¾Æ´Ô
    ±âÁ¸ÀÇ communicator¸¦ °øÀ¯ÇÏÁö ¾Ê´Â µÎ ÇÁ·Î¼¼½º group°£ÀÇ Á¢¼ÓÀ» ¼³Á¤ÇÔÀº collectiveÀ̳ª ºñ´ëĪÀû ÇÁ·Î¼¼½ºÀÓ
    server : ´Ù¸¥ ÇÁ·Î¼¼½º groupÀ¸·ÎºÎÅÍ ¿¬°áÀ» ¹Þ±â¸¦ ¿øÇÏ´Â ÇÁ·Î¼¼½º group
    client : server¿¡ ¿¬°áÇÏ´Â ´Ù¸¥ group
    1. À̸§, ÁÖ¼Ò, port
      MPI client/server ·çƾ¿¡¼­ º¹À⼺ÀÇ ´ëºÎºÐÀº server¸¦ ¾î¶»°Ô Á¢¼ÓÇÒ °ÍÀÎÁö¸¦ client°¡ ¾î¶»°Ô ¹ß°ßÇÏ´ÂÁö. ±× µÑ»çÀÌ¿¡ Åë½Å ä³ÎÀÌ ¾ø±â ¶§¹®¿¡ Åë½ÅÀ» ¼³Á¤ÇÏ·Á¸é Á¢¼ÓÁ¡¿¡ µ¿ÀÇÇØ¾ß ÇÑ´Ù
      Á¢¼ÓÁ¡À» µ¿ÀÇÇÏ´Â µ¥´Â Á¦»ïÀÚ°¡ Æ÷ÇԵȴÙ. Á¦»ïÀÚ´Â Á¢¼ÓÁ¡À» Á¦°øÇϰųª server·ÎºÎÅÍ client·ÎÀÇ Á¢¼ÓÁ¤º¸¸¦ Åë½ÅÇÒ ¼ö ÀÖ´Ù
      ´ÙÀ½Àº MPI¿Í ȣȯ°¡´ÉÇØ¾ß ÇÑ´Ù
      • server´Â ¾Ë·ÁÁø ÀÎÅÍ³Ý ÁÖ¼Ò host:port¿¡ Á¸Àç
      • server´Â Å͹̳ο¡ ÁÖ¼Ò¸¦ Ãâ·ÂÇÏ°í »ç¿ëÀÚ´Â ÀÌ ÁÖ¼Ò¸¦ client ÇÁ·Î±×·¥¿¡ ÁØ´Ù
      • server´Â ÁÖ¼ÒÁ¤º¸¸¦ nameserver¿¡ µÎ°í µ¿ÀÇµÈ À̸§À¸·Î °Ë»öÇÒ ¼ö ÀÖ´Ù
      • client°¡ Á¢¼ÓÇÏ´Â server´Â ½ÇÁ¦ server¿Í Áß°£Àڷμ­ ÇൿÇÏ´Â broker
      MPI´Â nameserver°¡ ÇÊ¿äÇÏÁö ¾Ê¾Æ¼­ À§ÀÇ ¸ðµç ½Ã³ª¸®¿À¸¦ Áö¿øÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. MPI°¡ ºÎ°¡ÀûÀ¸·Î nameserver ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ°í ¿ÜºÎÀÇ nameserver¿Í ȣȯµÈ´Ù
      port_nameÀº server¿Í ¿¬°áµÉ ¼ö ÀÖ´Â Àú¼öÁØÀÇ networkÁÖ¼Ò·Î º¯È¯µÇ´Â ½Ã½ºÅÛ¿¡¼­ Á¦°øÇÏ´Â ¹®ÀÚ¿­ÀÌ´Ù ´ëºÎºÐ IPÁÖ¼Ò¿Í port¹øÈ£Àε¥ ±¸ÇöÀº ¾î¶² ÇÁ·ÎÅäÄݵçÁö »ç¿ëÇÒ ¼ö ÀÖ´Ù. server´Â port_name¸¦ ÀÎÀÚ·Î MPI_OPEN_PORT¸¦ ½á¼­ ¼³Á¤ÇÑ´Ù. MPI_COMM_ACCEPT·Î ÁÖ¾îÁø port¿¡ Á¢¼ÓÀ» ¹Þ´Â´Ù.
      ÀÀ¿ëÇÁ·Î±×·¥ÀÌ Á¦°øÇÏ´Â service_nameÀ¸·Î ¾Ë·ÁÁöµµ·Ï server¸¦ ÁöÁ¤Çϸé client´Â port_nameÀ» ¾Ë ÇÊ¿ä¾øÀÌ service_nameÀ¸·Î Á¢¼ÓÇÒ ¼ö À־ ´õ Æí¸®ÇÏ´Ù.
      MPI ±¸Çö¿¡¼­ server°¡ (port_name,service_name)½ÖÀ» °øÇ¥Çؼ­ MPI_LOOKUP_NAMEÀ» °¡Áö°í service_nameÀ¸·ÎºÎÅÍ port_nameÀ» °Ë»öÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. À̰ÍÀº ±â´ÉÀÇ ´Ü°èÀÇ Áõ°¡¿Í ´õºÒ¾î ¼¼ ´Ü°èÀÇ È£È¯¼ºÀ» °¡´ÉÄÉ ÇÑ´Ù.
      1. À̸§ °øÇ¥ÀÇ ´É·Â¿¡ Á¿ìµÇÁö ¾Ê´Â ÀÀ¿ëÇÁ·Î±×·¥Àº ȣȯÀÌ ½±´Ù. server¿¡¼­ client·Î port_nameÀÌ »ç¶÷¿¡ ÀÇÇØ Àü´ÞµÈ´Ù.
      2. MPI_PUBLISH_NAMEÀ» »ç¿ëÇÏ´Â ÀÀ¿ëÇÁ·Î±×·¥Àº ÀÌ service¸¦ Á¦°øÇÏ´Â ±¸Çöµé »çÀÌ¿¡¼­ ¿Ïº®È÷ ȣȯµÈ´Ù. ¸ðµç ±¸Çö¿¡¼­ ȣȯµÇ±â À§Çؼ­´Â À̸§ÀÌ °øÇ¥µÇÁö ¾ÊÀ» ¶§ »ç¿ëµÇ´Â fall-back ¸ÞÄ«´ÏÁòÀ» °¡Á®¾ß ÇÑ´Ù.
      3. MPIÀÇ À̸§ °øÇ¥ ±â´ÉÀ» ¹«½ÃÇϰí À̸§À» °øÇ¥ÇÏ´Â ±× ÀÚ½ÅÀÇ ¸ÞÄ«´ÏÁòÀ» »ç¿ëÇÏ´Â ÀÀ¿ëÇÁ·Î±×·¥Àº À¯¿¬ÇÏÁö¸¸ ȣȯµÇÁö ¾Ê´Â´Ù.
    2. server ·çƾ
      server´Â µÎ ·çƾÀ¸·Î À̿밡´ÉÇÏ°Ô µÈ´Ù. ¸ÕÀú MPI_OPEN_PORT¸¦ ½á¼­ Á¢¼ÓÇÒ ¼ö ÀÖ´Â ÇϳªÀÇ port¸¦ ¼³Á¤ÇÑ´Ù. µÎ¹øÂ° MPI_COMM_ACCEPT¸¦ ½á¼­ client·ÎºÎÅÍ Á¢¼ÓÀ» ¹Þ´Â´Ù.
      MPI_OPEN_PORT(info,port_name)
      INinfoÁÖ¼Ò¸¦ ¼³Á¤Çϴµ¥ ÇÊ¿äÇÑ ±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      OUTport_name»õ·Î ¼³Á¤µÈ port(¹®ÀÚ¿­)
      int MPI_Open_port(MPI_Info info, char *port_name)
      MPI_CLOSE_PORT(port_name)
      INport_nameport(¹®ÀÚ¿­)
      int MPI_Close_port(char *port_name)
      MPI_COMM_ACCEPT(port_name,info,root,comm,newcomm)
      INport_nameportÀ̸§(¹®ÀÚ¿­)
      INinfo±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      INrootroot nodeÀÇ comm¿¡¼­ÀÇ rank(Á¤¼ö)
      INcomm¾îµð¿¡¼­ collectiveÀÎÁö¿¡ ´ëÇÑ intracommunicator(ÇÚµé)
      OUTnewcommremote groupÀ¸·Î client¿ÍÀÇ intercommunicator(ÇÚµé)
      int MPI_Comm_accept(char *port_name,MPI_Info info,int root,MPI_Comm comm,MPI_Comm *newcomm)
    3. client ·çƾ
      MPI_COMM_CONNECT(port_name,info,root,comm,newcomm)
      INport_namenetwork ÁÖ¼Ò(¹®ÀÚ¿­)
      INinfo±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      INrootroot nodeÀÇ comm¿¡¼­ÀÇ rank(Á¤¼ö)
      INcomm¾îµð¿¡¼­ collectiveÀÎÁö¿¡ ´ëÇÑ intracommunicator(ÇÚµé)
      OUTnewcommremote groupÀ¸·Î server¿ÍÀÇ intercommunicator(ÇÚµé)
      int MPI_Comm_connect(char *port_name,MPI_Info info,int root,MPI_Comm comm,MPI_Comm *newcomm)
    4. À̸§ °øÇ¥
      MPI_PUBLISH_NAME(service_name,info,port_name)
      INservice_nameport¿¡ ÇØ´çÇÏ´Â service À̸§(¹®ÀÚ¿­)
      INinfo±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      INport_nameport À̸§(¹®ÀÚ¿­)
      int MPI_Publish_name(char *service_name,MPI_Info info,char *port_name)
      MPI_UNPUBLISH_NAME(service_name,info,port_name)
      INservice_nameport¿¡ ÇØ´çÇÏ´Â service À̸§(¹®ÀÚ¿­)
      INinfo±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      INport_nameport À̸§(¹®ÀÚ¿­)
      int MPI_Unpublish_name(char *service_name,MPI_Info info,char *port_name)
      MPI_LOOKUP_NAME(service_name,info,port_name)
      INservice_nameport¿¡ ÇØ´çÇÏ´Â service À̸§(¹®ÀÚ¿­)
      INinfo±¸Çö»óÀÇ Á¤º¸(ÇÚµé)
      OUTport_nameport À̸§(¹®ÀÚ¿­)
      int MPI_Lookup_name(char *service_name,MPI_Info info,char *port_name)
    5. client/server ¿¹Á¦
      server char myport[MPI_MAX_PORT_NAME]; MPI_Comm intercomm; /* ... */ MPI_Open_port(MPI_INFO_NULL, myport); printf("port name is: %s\n", myport); MPI_Comm_accept(myport, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm); /* do something with intercomm */
      client MPI_Comm intercomm; char name[MPI_MAX_PORT_NAME]; printf("enter port name: "); gets(name); MPI_Comm_connect(name, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm);
      server MPI_Open_port(MPI_INFO_NULL, port_name); MPI_Publish_name("ocean", MPI_INFO_NULL, port_name); MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm); /* do something with intercomm */ MPI_Unpublish_name("ocean", MPI_INFO_NULL, port_name);
      client MPI_Lookup_name("ocean", MPI_INFO_NULL, port_name); MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_SELF, &intercomm);
      server include "mpi.h" int main( int argc, char **argv ) { MPI_Comm client; MPI_Status status; char port_name[MPI_MAX_PORT_NAME]; double buf[MAX_DATA]; int size, again; MPI_Init( &argc, &argv ); MPI_Comm_size(MPI_COMM_WORLD, &size); if (size != 1) error(FATAL, "Server too big"); MPI_Open_port(MPI_INFO_NULL, port_name); printf("server available at %s\n",port_name); while (1) { MPI_Comm_accept( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client ); again = 1; while (again) { MPI_Recv( buf, MAX_DATA, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, client, &status ); switch (status.MPI_TAG) { case 0: MPI_Comm_free( &client ); MPI_Close_port(port_name); MPI_Finalize(); return 0; case 1: MPI_Comm_disconnect( &client ); again = 0; break; case 2: /* do something */ ... default: /* Unexpected message type */ MPI_Abort( MPI_COMM_WORLD, 1 ); } } } }
      client #include "mpi.h" int main( int argc, char **argv ) { MPI_Comm server; double buf[MAX_DATA]; char port_name[MPI_MAX_PORT_NAME]; MPI_Init( &argc, &argv ); strcpy(port_name, argv[1] );/* assume server's name is cmd-line arg */ MPI_Comm_connect( port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server ); while (!done) { tag = 2; /* Action to perform */ MPI_Send( buf, n, MPI_DOUBLE, 0, tag, server ); /* etc */ } MPI_Send( buf, 0, MPI_DOUBLE, 0, 1, server ); MPI_Comm_disconnect( &server ); MPI_Finalize(); return 0; }
  5. ´Ù¸¥ ±â´É

    1. Universe Å©±â
      ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ ¸î°³ÀÇ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇؾßÇÏ´ÂÁö MPI_UNIVERSE_SIZE¿¡¼­ MPI_COMM_WORLDÀÇ Å©±â¸¦ »©¼­ ¾Ë ¼ö ÀÖ´Ù
      MPI_UNIVERSE_SIZE¸¦ ¼³Á¤ÇÏ´Â °¡´ÉÇÑ ¹æ¹ý
      • MPI ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÏ´Â ÇÁ·Î±×·¥¿¡ -universe_size ÀÎÀÚ·Î
      • ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÇÒ´çµÈ ÇÁ·Î¼¼½º¼ö¸¦ ¾Ë¾Æ³»´Â batch ½ºÄÉÁì·¯¿ÍÀÇ ÀÚµ¿ »óÈ£ÀÛ¿ë
      • »ç¿ëÀÚ¿¡ ÀÇÇÑ È¯°æº¯¼ö ¼³Á¤
      • MPI_COMM_SPAWNÇÔ¼ö¿¡ info ÀÎÀÚ¸¦ ÅëÇÑ Àü´Þ
      ±¸Çö½Ã MPI_UNIVERSE_SIZE¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» ¹®¼­È­ÇØ¾ß ÇÑ´Ù.
    2. ´ÜÀÏ MPI_INIT °í±Þ ±¸Çö¿¡¼­´Â ¾î¶² ÇÁ·Î¼¼½ºµµ MPI_INIT¸¦ È£ÃâÇÔÀ¸·Î½á MPI ÇÁ·Î¼¼½º°¡ µÉ ¼ö ÀÖ´Ù.
    3. MPI_APPNUM MPI_COMM_SPAWN_MULTIPLE¿¡ ÀÇÇØ spawnµÈ ÇÁ·Î¼¼½º´Â MPI_APPNUMÀÌ ÇöÀç ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ ¸í·É ¹øÈ£
    4. Á¢¼Ó ÇØÁ¦ Á¢¼ÓÀÌ µÇ±â Àü client¿Í server´Â µ¶¸³ÀûÀÎ MPI ÀÀ¿ëÇÁ·Î±×·¥ÀÌ´Ù. ÇϳªÀÇ ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¿¡·¯´Â ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù. Á¢¼ÓÀÌ µÇ¸é ¿¡·¯´Â ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. Á¢¼ÓÀ» ²÷À» ¼ö ÀÖÀ¸¸é ¿¡·¯°¡ ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ¹ÌÄ¡Áö ¾Ê´Â´Ù.
      • µÎ ÇÁ·Î¼¼½º»çÀÌ¿¡ Á¢¼Ó°æ·Î°¡ ÀÖÀ¸¸é µÎ ÇÁ·Î¼¼½º´Â ¿¬°áµÇ¾î ÀÖ´Ù. ´õ Á¤È®È÷
        1. ¾Æ·¡¿Í °°Àº °æ¿ì µÎ ÇÁ·Î¼¼½º´Â ¿¬°áµÇ¾î ÀÖ´Ù
          1. µÑ ´Ù °°Àº communicator¿¡ ¼ÓÇÑ °æ¿ì
          2. µÑ´Ù MPI_COMM_DISCONNECT´ë½Å MPI_COMM_FREE¸¦ ½á¼­ freeµÈ communicator¿¡ ¼ÓÇß´ø °æ¿ì
          3. µÑ´Ù °°Àº window³ª filehandleÀÇ group¿¡ ¼ÓÇÑ °æ¿ì
        2. A°¡ B¿¡ ¿¬°áµÇ°í B°¡ C¿¡ ¿¬°áµÇ¸é A´Â C¿¡ ¿¬°áµÈ´Ù.
      • µÎ ÇÁ·Î¼¼½º°¡ ¿¬°áµÇ¾î ÀÖÁö ¾ÊÀ¸¸é ¿¬°áµÇÁö ¾Ê¾Ò´Ù(¶Ç´Â µ¶¸³ÀûÀÌ´Ù)
      • À§ÀÇ Á¤ÀÇ¿¡ ÀÇÇØ ¿¬°áÀº transitive¼ºÁúÀ̾ MPI ÇÁ·Î¼¼½ºµéÀÇ Àüü ÁýÇÕÀº µ¶¸³ÀûÀÎ equivalence class·Î ³ª´©¾îÁø´Ù.
      • ¿¬°áµÇ¾î ÀÖÁö¸¸ °°Àº MPI_COMM_WORLD¸¦ °øÀ¯ÇÏÁö ¾Ê´Â ÇÁ·Î¼¼½ºµéÀº MPI_COMM_DISCONNECT¸¦ »ç¿ëÇØ¼­ Á¢¼Ó°æ·Î°¡ ¾ø¾îÁö¸é ¿¬°áµÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù.
      MPI-1 ÇÔ¼ö¿¡ ´ÙÀ½ÀÇ Ãß°¡ÀûÀÎ rule¿¡ Àû¿ëµÈ´Ù.
      • MPI_FINALIZE´Â ¿¬°áµÈ ÇÁ·Î¼¼½ºµéÀÇ ÁýÇÕ¿¡ collectiveÇÏ´Ù.
      • MPI_ABORT´Â µ¶¸³ÀûÀÎ ÇÁ·Î¼¼½º¸¦ abortÇÏÁö ¾Ê´Â´Ù.
      • MPI_FINALIZE¸¦ È£ÃâÇÏÁö ¾Ê°í ³¡³ª¸é µ¶¸³ÀûÀÎ ÇÁ·Î¼¼½º´Â ¿µÇâÀ» ¹ÞÁö ¾ÊÀ¸³ª ¿¬°áµÈ ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼­´Â ¿µÇâÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù.
      MPI_COMM_DISCONNECT(comm)
      INOUTcommcommunicator(ÇÚµé)
      int MPI_Comm_disconnect(MPI_Comm *comm)
      ¸ðµç pendingµÇ°í ÀÖ´Â Åë½ÅÀÌ ¿Ï·áµÇ±â ±â´Ù¸®°í communicator object¸¦ freeÇϰí commÀ» MPI_COMM_NULL·Î ¼³Á¤ÇÑ´Ù. collective
    5. MPIÅë½ÅÀ» ¼³Á¤ÇÏ´Â ´Ù¸¥ ¹æ¹ý
      MPI_COMM_JOIN(fd,intercomm)
      INfdsocket ÆÄÀÏ Áö½ÃÀÚ
      OUTintercomm»õ·Î¿î intercommunicator(ÇÚµé)
      int MPI_Comm_join(int fd,MPI_Comm *intercomm)
      MPI_COMM_JOINÀº ¹öŬ¸® ¼ÒÄÏ interface¸¦ Á¦°øÇϴ ȯ°æ¿¡ Á¸ÀçÇÏ´Â MPI ±¸ÇöÀ» ÁöÇâÇÑ´Ù. Á¦°øÇÏÁö ¾Ê´Â ȯ°æ¿¡¼­µµ MPI_COMM_NULLÀ» ¹ÝÈ¯ÇØ¾ß ÇÑ´Ù.