groupCommunicator.c

#include<mpi.h>
#include<stdio.h>
#define NPROCESS 8

int 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 != NPROCESS){
    printf( "Must specify %d process! Terminating.\n", NPROCESS);
    MPI_Finalize();
    exit(0);
  }

  sendBuf = rank;

  MPI_Comm_group(MPI_COMM_WORLD, &orig_group);

   if(rank < NPROCESS/2){
    MPI_Group_incl(orig_group, NPROCESS/2, ranks1, &new_group);
  } else{
    MPI_Group_incl(orig_group, NPROCESS/2, ranks2, &new_group);
  }

  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();
   return 0;
}

你可能感兴趣的:(职场,休闲)