Advertisement
Guest User

Untitled

a guest
Feb 18th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.78 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <mpi.h>
  5.  
  6. double func(double a){
  7.         return double(4)/(1+(a*a)); //afraid of implicit type conv to int
  8. }
  9.  
  10. double trap(double a, double b, double step){
  11.         return 0.5*((func(a) + func(b))*step);
  12. }
  13.  
  14. int main(int argc, char *argv[]){// передаем число N
  15.         int i;
  16.         int N = atoi(argv[argc-1]); //N
  17.         double array[N+1]; //coordinates
  18.         int myrank, size;
  19.         double sum = 0;
  20.         MPI_Status Status;
  21.  
  22.         MPI_Init(NULL, NULL); //MPI программа начинается отсюда
  23.         MPI_Comm_size(MPI_COMM_WORLD, &size);
  24.         MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  25.         int divsn = int(ceil(double(N)/size));
  26.         int workr = N/divsn;
  27.         int addworkr = 0; //ноль, если всю работу делают запарные чуваки, иначе 1 доп чувак
  28.         if (N - divsn*workr != 0) addworkr = 1;
  29.         if (myrank >= workr + addworkr) return 0; //неиспользуемый тред
  30.         if (myrank == 0) {
  31.                 for (i = 0, i < N+1, i++) {
  32.                         array[i] = (i*double(1))/N;
  33.                 }
  34.                 for (i = 0, i< N, i++) {
  35.                         sum+= trap(array[i], array[i+1], double(1)/N);
  36.                 }
  37.                 printf("one thread sum is %f\n", sum);
  38.                 sum = 0;
  39.  
  40.  
  41.                 for (i = 1, i < workr, i++) {
  42.                         MPI_Send(&array[divsn*i], divsn+1, MPI_DOUBLE, i, i, MPI_COMM_WORLD);
  43.                 }
  44.                 if (addworkr != 0) {// если доп чувак есть, посылаем ему остатки сладки сладкие мулатки
  45.                         MPI_Send(&array[workr*divsn], N+1 - workr*divsn, MPI_DOUBLE, workr, workr, MPI_COMM_WORLD);
  46.                 }
  47.                 for (i = 0, i < divsn, i++) {/// нулевой процесс считает свой кусок (начальный)
  48.                         sum += trap(array[i], array[i+1], double(1)/N);
  49.                 }
  50.                 printf("i'm process %d, and my part is %f\n", myrank, sum);
  51.                 double newsum;// сюда будем записывать то, что присылают другие чуваки
  52.                                              for (i = 1, i<workr+addworkr, i++) {
  53.                         MPI_Recv(&newsum, 1, MPI_DOUBLE, i, (workr+addworkr)+i, MPI_COMM_WORLD, &Status); // проверь номер сенда
  54.                         sum += newsum;
  55.                 }
  56.                 printf("i'm process 0, and my par sum is %f\n",sum);
  57.  
  58.         } else {
  59.  
  60.                 if  (myrank < workr) {
  61.                         MPI_Recv (&array[0], divsn+1, MPI_DOUBLE, 0,myrank, MPI_COMM_WORLD, &Status);
  62.                         for (i = 0, i < divsn, i++) {
  63.                                 sum += trap(array[i], array[i+1], double(1)/N);
  64.                         }
  65.                         printf("i'm process %d, and my part is %f\n", myrank, sum);
  66.                 }
  67.                 if ((addworkr != 0) and (myrank == workr)) {
  68.                         MPI_Recv (&array[0], N+1 - workr*divsn, MPI_DOUBLE, 0, workr, MPI_COMM_WORLD, &Status); // с этим чуваком придется работать отдельно
  69.                         for (i = 0, i < N - workr*divsn, i++) {
  70.                                 sum += trap(array[i], array[i+1], double(1)/N);
  71.                         }
  72.                         printf("i'm process %d, and my part is %f\n", myrank, sum);
  73.                 }
  74.                 MPI_Send(&sum, 1, MPI_DOUBLE, 0, (workr+addworkr)+myrank, MPI_COMM_WORLD);//посылаем посчитанную сумму нулю
  75.         }
  76.         MPI_Finalize();
  77.         return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement