Advertisement
m4ly

MPI

Nov 15th, 2015
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.59 KB | None | 0 0
  1. /* dmocek */
  2.  
  3. #include "mpi.h"
  4. #include <stdio.h>
  5. #include <math.h>
  6.  
  7. void main(int argc, char *argv[])
  8. {
  9.     int done = 0, n, numprocs, i;
  10.     double PI25DT = 3.141592653589793238462643;
  11.     double mypi, pi, h, sum, x;
  12.     double startwtime, endwtime;
  13.     int  namelen;
  14.     char processor_name[MPI_MAX_PROCESSOR_NAME];
  15.     double w[8];
  16.     double recv_data;
  17.     int t;
  18.     int mytid;
  19.     double a,c ;
  20.     MPI_Status b;
  21.  
  22.     MPI_Init(&argc,&argv);
  23.     MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
  24.     MPI_Comm_rank(MPI_COMM_WORLD,&mytid);
  25.     MPI_Get_processor_name(processor_name,&namelen);
  26.  
  27.     fprintf(stderr,"Process %d on %s\n", mytid, processor_name);
  28.     fflush(stderr);
  29.  
  30.     if(mytid == 0) {
  31.         printf("Podaj 8 wartosci: \n");
  32.         fflush(stdout);
  33.         scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &w[0], &w[1], &w[2], &w[3], &w[4], &w[5], &w[6], &w[7]);
  34.         printf("Podaj wartosc t:\n");
  35.         scanf("%d", &t);
  36.     }
  37.  
  38.     MPI_Scatter(w, 1, MPI_DOUBLE, &recv_data, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  39.     MPI_Bcast(&t, 1, MPI_INT, 0, MPI_COMM_WORLD);
  40.  
  41.     for(i = 0; i < t; i++) {
  42.         // send
  43.         // wyslij w prawo
  44.         if(mytid == 0) {
  45.                                                 // 6345 + 1
  46.             MPI_Send(&recv_data, 1, MPI_DOUBLE, mytid + 1, 0, MPI_COMM_WORLD);
  47.         }
  48.         // wyslij w lewo
  49.         else if(mytid == 7) {
  50.                                                 // 7869 - 1
  51.             MPI_Send(&recv_data, 1, MPI_DOUBLE, mytid - 1, 0, MPI_COMM_WORLD);
  52.         }
  53.         // wyslij prawo i lewo
  54.         else {
  55.             MPI_Send(&recv_data, 1, MPI_DOUBLE, mytid + 1, 0, MPI_COMM_WORLD);
  56.             MPI_Send(&recv_data, 1, MPI_DOUBLE, mytid - 1, 0, MPI_COMM_WORLD);
  57.         }
  58.  
  59.  
  60.         // recv
  61.         if(mytid == 0) {
  62.             MPI_Recv(&a, 1, MPI_DOUBLE, mytid + 1, 0, MPI_COMM_WORLD, &b);
  63.             c=0;
  64.         }
  65.         else if(mytid == 7) {
  66.             MPI_Recv(&a, 1, MPI_DOUBLE, mytid - 1, 0, MPI_COMM_WORLD, &b);
  67.             c=0;
  68.         }
  69.         else {
  70.             MPI_Recv(&a, 1, MPI_DOUBLE, mytid - 1, 0, MPI_COMM_WORLD, &b);
  71.             MPI_Recv(&c, 1, MPI_DOUBLE, mytid + 1, 0, MPI_COMM_WORLD, &b);
  72.         }
  73. //      MPI_Barrier(MPI_COMM_WORLD);
  74.  
  75.         recv_data = (a + 2*recv_data + c) / 4;
  76.     }
  77.  
  78.     MPI_Gather(&recv_data, 1, MPI_DOUBLE, w, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
  79.     printf("-------PID: %d---------\n", mytid);
  80.     printf("recv_data = %lf\n", recv_data);
  81.  
  82.     printf("w = ");
  83.     for(i = 0; i < 8; i++)
  84.         printf("%lf ", w[i]);
  85.     printf("\n");
  86.     MPI_Finalize();
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement