Tworzenie komunikatorów |
MPI_COMM_DUP (comm,newcomm,ierr)
MPI_COMM_CREATE (comm,group,newcomm,ierr)
MPI_COMM_FREE (comm,ierr)
MPI_COMM_SIZE (comm,size)
MPI_COMM_RANK (comm, rank)
Do zgrubnego porównywania komunikatorów służy poniższa funkcja.
- MPI_IDENT - gdy comm1 i comm2 wskazują na ten sam obiekt komunikatora;
- MPI_CONGRUENT - gdy grupy skojarzone z komunikatorami są identyczne pod względem zawartości i uporządkowania, a różnica leży w innych kontekstach komunikacji;
- MPI_SIMILAR - procesy należące do grup są te same, lecz ich uporządkowanie jest inne;
- MPI_UNEQUAL - w pozostałych przypadkach.
MPI_Comm_compare (comm1,comm2,*result)
MPI_COMM_COMPARE (comm1,comm2,result,ierr)
Przykład: Grupy i komunikatory
Tworzy dwie różne grupy procesów dla oddzielnej kolektywnej komunikacji. Wymaga też tworzenia nowych komunikatorów.
Język C |
#include "mpi.h" #include <stdio.h> #define NPROCS 8 main(int argc, char *argv[]) { int rank, new_rank, sendbuf, recvbuf, numtasks, ranks1[4]={0,1,2,3}, ranks2[4]={4,5,6,7}; MPI_Group orig_group, new_group; MPI_Comm new_comm; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); if (numtasks != NPROCS) { printf("Must specify MP_PROCS= %d. Terminating.\n",NPROCS); MPI_Finalize(); exit(0); } sendbuf = rank; /* Extract the original group handle */ MPI_Comm_group(MPI_COMM_WORLD, &orig_group); /* Divide tasks into two distinct groups based upon rank */ if (rank < NPROCS/2) { MPI_Group_incl(orig_group, NPROCS/2, ranks1, &new_group); } else { MPI_Group_incl(orig_group, NPROCS/2, ranks2, &new_group); } /* Create new new communicator and then perform collective communications */ MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm); MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, new_comm); MPI_Group_rank (new_group, &new_rank); printf("rank= %d newrank= %d recvbuf= %d\n",rank,new_rank,recvbuf); MPI_Finalize(); } |
rank= 7 newrank= 3 recvbuf= 22 rank= 0 newrank= 0 recvbuf= 6 rank= 1 newrank= 1 recvbuf= 6 rank= 2 newrank= 2 recvbuf= 6 rank= 6 newrank= 2 recvbuf= 22 rank= 3 newrank= 3 recvbuf= 6 rank= 4 newrank= 0 recvbuf= 22 rank= 5 newrank= 1 recvbuf= 22