Advertisement
Guest User

Example 5.22

a guest
Dec 18th, 2012
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <mpi.h>
  3.  
  4. typedef struct {
  5.     double val;
  6.     int log;
  7. } SegScanPair;
  8.  
  9. /* the user-defined function  */
  10. void segScan( SegScanPair *in, SegScanPair *inout, int *len, MPI_Datatype *dptr ) {
  11.     int i;
  12.     SegScanPair c;
  13. for (i = 0; i < *len; ++i) {
  14.         if (in->log == inout->log)
  15.                 c.val = in->val + inout->val;
  16.         else
  17.                 c.val = inout->val;
  18.         c.log = inout->log;
  19.         *inout = c;
  20.         in++; inout++;
  21.     }
  22. }
  23.  
  24. int main(int argc, char *argv[]) {
  25.         int i, base;
  26.     SegScanPair  a, answer;
  27.     MPI_Op       myOp;
  28.     MPI_Datatype type[2] = {MPI_DOUBLE, MPI_INT};
  29.     MPI_Aint     disp[2];
  30.     int          blocklen[2] = {1, 1};
  31.     MPI_Datatype sspair;
  32.         int rank, size;
  33.  
  34.         MPI_Init(&argc, &argv);
  35.         MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  36.         MPI_Comm_size(MPI_COMM_WORLD, &size);
  37.         if(rank <= 1) {
  38.                 a.log = 0;
  39.                 a.val = 1;
  40.         } else if (rank <= 4 ) {
  41.                 a.log = 1;
  42.                 a.val = 1;
  43.         } else if(rank <= 6) {
  44.                 a.log = 0;
  45.                 a.val = 1;
  46.         } else {
  47.         a.log = 1;
  48.         a.val = 1;
  49.     }
  50.         /* explain to MPI how type SegScanPair is defined */
  51.     MPI_Address(&a, disp);
  52.     MPI_Address(&a.log, disp + 1);
  53.     base = disp[0];
  54.     for (i = 0; i < 2; ++i) disp[i] -= base;
  55.     MPI_Type_create_struct(2, blocklen, disp, type, &sspair);
  56.     MPI_Type_commit(&sspair);
  57.     /* create the segmented-scan user-op   */
  58.     MPI_Op_create((MPI_User_function*)segScan, 0, &myOp);
  59.     MPI_Scan(&a, &answer, 1, sspair, myOp, MPI_COMM_WORLD);
  60.         int buf;
  61.         for(i = 0; i < size; ++i) {
  62.                 if(rank == i) {
  63.                         if(rank > 0) {
  64.                                 MPI_Recv(&buf, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  65.                         }
  66.                         //printf("rank = %d\n", rank);
  67.                         printf("%d\t%d %f\n", rank, answer.log, answer.val);
  68.                         if(rank + 1 < size) {
  69.                                 buf = rank;
  70.                                 MPI_Send(&buf, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
  71.                         }
  72.                 }
  73.         }
  74.         MPI_Finalize();
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement