Guest User

Untitled

a guest
Jul 21st, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include "mpi.h"
  2. #include <cstdio>
  3. #include <cstdlib>
  4.  
  5.  
  6. int *initial(int *a, int d)                       //初始化
  7. {
  8.     a = (int *)malloc(sizeof(int) * d);
  9.     for(int i = 0; i < d; i++)
  10.     {
  11.         a[i] = 0;
  12.     }
  13.     return a;
  14. }
  15.  
  16. void divide(int *a, int d, int num)         //求倒數,num為欲求倒數的數
  17. {
  18.     int i = 0, n = 1;       //n為被除數,且=1
  19.     while(i < d)            //d為小數點後的位數
  20.     {
  21.         if(n==0)
  22.         {
  23.             break;
  24.         }
  25.         while(n < num)          //除數大於被除數(商為0),則跳到下一位計算
  26.         {
  27.             a[i] = 0;
  28.             n *= 10;
  29.             i++;
  30.         }
  31.         a[i] = n/num;
  32.         n = n - a[i] * num;
  33.         n *= 10;
  34.         i++;
  35.     }
  36. }
  37.  
  38. void add(int *a, int *b, int d)
  39. {
  40.     int i = d - 1;
  41.     while(i >= 0)               //元素各自相加
  42.     {
  43.         b[i] = a[i] + b[i];
  44.         i--;
  45.     }
  46.     i = d - 1;
  47.     while(i >= 0)       //進位
  48.     {
  49.         if(b[i] >= 10)
  50.         {
  51.             if(i != 0)      //我假設元素0為整數部分,因此整數部分暫時不需要考慮相加
  52.             {
  53.                 b[i - 1] += b[i] / 10;
  54.                 b[i] %= 10;
  55.             }
  56.         }
  57.         i--;
  58.     }
  59. }
  60.  
  61. int main(int argc, char *argv[])
  62. {
  63.     double begintime, endtime;
  64.     int n, d;       //n為加到某數的上限,d為小數後幾位
  65.     int myid, numprocs;         //myid處理器編號,numprocs處理器數量
  66.     int *temp, *proctemp, *result;          //用來存數字的陣列
  67.     MPI_Init(&argc, &argv);
  68.     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  69.     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  70.     if(myid == 0)
  71.     {
  72.         printf("Enter n:");
  73.         scanf("%d", &n);
  74.         printf("Enter d:");
  75.         scanf("%d", &d);
  76.     }
  77.     begintime = MPI_Wtime();
  78.     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);   //將n, d傳給每個處理器
  79.     MPI_Bcast(&d, 1, MPI_INT, 0, MPI_COMM_WORLD);
  80.     d += 8;                                         //多取8位使得數字變動較小(小數點後d位才不會有誤差)
  81.     temp=initial(temp, d);
  82.     proctemp=initial(proctemp, d);
  83.     result=initial(result, d);
  84.     for(int i = 1 + myid; i <= n; i += numprocs)            //倒數除法存到temp後再做加法存到proctemp
  85.     {
  86.         divide(temp, d, i);
  87.         add(temp, proctemp, d);
  88.         for(int i = 0; i < d; i++)
  89.         {
  90.             temp[i] = 0;
  91.         }      
  92.     }
  93.     MPI_Reduce(proctemp, result, d, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);       //把各個處理器proctemp陣列的元素分別加到result陣列
  94.     int i = d - 1;
  95.     while(i >= 0)       //進位
  96.     {
  97.         if(result[i] >= 10)
  98.         {
  99.             if(i != 0)      //我假設元素0為整數部分,因此整數部分暫時不需要考慮相加
  100.             {
  101.                 result[i - 1] += result[i] / 10;
  102.                 result[i] %= 10;
  103.             }
  104.         }
  105.         i--;
  106.     }
  107.     d -= 8;                                         //d值減回來
  108.     i = 0;
  109.     endtime = MPI_Wtime();
  110.     MPI_Finalize();
  111.     if(myid == 0){
  112.     printf("The result is:\n");
  113.     while(i <= d)                                   //印出結果
  114.     {
  115.         if(i == 0)
  116.             printf("%3d.", result[0]);
  117.         else
  118.             printf("%d", result[i]);
  119.         if(i%5 == 0)
  120.             printf("\n");
  121.         i++;
  122.     }
  123.     printf("\nThe execution time is %.6f\n", endtime - begintime);
  124.     }
  125. /*  if(myid == 0)
  126.     {
  127.         printf("The result is:\n");
  128.         while(d > 0)                                    //印出結果
  129.         {
  130.             if(i == 0)
  131.                 printf("%3d.", result[0]);
  132.             else
  133.                 printf("%d", result[i]);
  134.             if(i%5 == 0)
  135.                 printf("\n");
  136.             d--;
  137.             i++;
  138.         }
  139.         printf("\nThe execution time is %.6f\n", endtime - begintime);
  140.     }*/
  141. }
Add Comment
Please, Sign In to add comment