contiguousDerivedData.c

#include<stdio.h>
#include<mpi.h>
#define SIZE 4

int main( int argc, char *argv[]){
   int numTasks, rank, source = 0, dest, tag = 1;
   float a[SIZE][SIZE] = {
  {1.0, 2.0, 3.0, 4.0},
  {5.0, 6.0, 7.0, 8.0},
  {9.0, 10.0, 11.0, 12.0},
  {13.0, 14.0, 15.0, 16.0}
  };

   float b[SIZE];

  MPI_Status status;
  MPI_Datatype rowType;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &numTasks);

  MPI_Type_contiguous(SIZE, MPI_FLOAT, &rowType);         //contiguous
  MPI_Type_commit(&rowType);         //commit new datatypes to the system

   if(numTasks ==    SIZE){
     if(rank == 0){
       int i, j;
       for(i = 0; i < numTasks; i++){
               int count = 1;
         int dest = i;
         for(j = 0; j < numTasks; j++){
          MPI_Send(&a[i][j], count, rowType,    
            dest, tag, MPI_COMM_WORLD);
        }
      }
    }

    MPI_Recv(b, SIZE, MPI_FLOAT, source, tag,    
            MPI_COMM_WORLD, &status);
    printf( "rank = %d b = %3.1f %3.1f %3.1f %3.1f\n",
      rank, b[0], b[1], b[2], b[3]);

  } else{
    printf( "Must Specify %d processors. Terminating.\n", SIZE);    
  }

  MPI_Type_free(&rowType);
  MPI_Finalize();
}

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