dwt.c
上传用户:hhyinxing
上传日期:2013-09-10
资源大小:833k
文件大小:4k
源码类别:

并行计算

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "mpi.h"
  4. #define  MAX_PROCESSOR_NUM       12
  5. #define  MAX_N                 1024
  6. #define  MAX_L                  100
  7. void print(int b[], int start, int len)
  8. {
  9.     int end = start+len;
  10.     int i;
  11.     for(i = start; i < end; i ++)
  12.     {
  13.         printf("%d  ",b[i]);
  14.     }
  15.     printf("n");
  16. }
  17. int main(int argc, char *argv[])
  18. {
  19.     int c[MAX_N], d[MAX_N];
  20.     int h[MAX_L], g[MAX_L];
  21.     int pred[MAX_N], curr[MAX_N];
  22.     int N,L;
  23.     FILE *fin;
  24.     int n;
  25.     int offsetAddress;
  26.     int t;
  27.     int i, j, k;
  28.     int size, rank;
  29.     double  transTime = 0 ,tempCurrentTime, beginTime;
  30.     MPI_Status status;
  31.     MPI_Init(&argc, &argv);
  32.     MPI_Comm_size(MPI_COMM_WORLD,&size);
  33.     MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  34.     if(rank == 0)
  35.     {
  36.         fin = fopen("dataIn.txt","r");
  37.         if (fin == NULL)
  38.         {
  39.             puts("Not find input data file");
  40.             puts("Please create a file "dataIn.txt"");
  41.             puts("<example for dataIn.txt> ");
  42.             puts("10");
  43.             puts("1 9 40 5 67 2 6 8 49 5");
  44.             puts("1 3  4 5  6 7 8 8  0 4");
  45.             puts("16");
  46.             puts("1 0 4 5  5 6 7 8  5 4 0 3  4 6 1 2");
  47.             MPI_Finalize();
  48.             exit(-1);
  49.         }
  50.         else
  51.         {
  52.             /* read array h,g from dataIn.txt */
  53.             fscanf(fin,"%d",&L);
  54.             if ((L < 1)||(L > MAX_L))
  55.             {
  56.                 puts("Input the length of array h is out of range!");
  57.                 exit(-1);
  58.             }
  59.             for(i = 0; i < L; i ++) fscanf(fin,"%d", h+i);
  60.             for(i = 0; i < L; i ++) fscanf(fin,"%d", g+i);
  61.             /* read array c from dataIn.txt */
  62.             fscanf(fin,"%d",&N);
  63.             if ((N < 1)||(N > MAX_N))
  64.             {
  65.                 puts("Input the length of array c is out of range!");
  66.                 exit(-1);
  67.             }
  68.             for(i = 0; i < N; i ++) fscanf(fin,"%d", pred+i);
  69.             /* if  2^(t-1) < N < 2^t , then attach zero to expend N to 2^t */
  70.             puts("One dimensional wavelet transform's input data from file dataIn.txt");
  71.             printf("h[] : ");
  72.             print(h, 0, L);
  73.             printf("g[] : ");
  74.             print(g, 0, L);
  75.             printf("c[] : ");
  76.             print(pred, 0, N);
  77.             printf("n");
  78.         }
  79.     }
  80.     MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
  81.     MPI_Bcast(&L, 1, MPI_INT, 0, MPI_COMM_WORLD);
  82.     MPI_Bcast(h, L, MPI_INT, 0, MPI_COMM_WORLD);
  83.     MPI_Bcast(g, L, MPI_INT, 0, MPI_COMM_WORLD);
  84.     n = N;
  85.     offsetAddress = 0;
  86.     t = 0;
  87.     while(n > 1)
  88.     {
  89.         MPI_Bcast(pred, n, MPI_INT, 0, MPI_COMM_WORLD);
  90.         n /=2;
  91.         int jLength =  n/size;
  92.         int jStart  =  n%size+rank*jLength;
  93.         if (rank == 0)
  94.         {
  95.             for(j = 0; j < jStart+jLength; j ++)
  96.             {
  97.                 curr[j] = 0;
  98.                 d[offsetAddress+j] = 0;
  99.                 for(k = 0; k < L; k ++)
  100.                 {
  101.                     curr[j] += h[k]*pred[(2*j+k)%(2*n)];
  102.                     d[offsetAddress+j] += g[k]*pred[(2*j+k)%(2*n)];
  103.                 }
  104.             }
  105.             /* curr[0 .. jStart-1] ==> pred[0 .. jStart-1] */
  106.             for(j = 0; j < jStart; j ++) pred[j] = curr[j];
  107.         }
  108.         else
  109.         {
  110.             for(j = jStart; j < jStart+jLength; j ++)
  111.             {
  112.                 curr[j] = 0;
  113.                 d[offsetAddress+j] = 0;
  114.                 for(k = 0; k < L; k ++)
  115.                 {
  116.                     curr[j] += h[k]*pred[(2*j+k)%(2*n)];
  117.                     d[offsetAddress+j] += g[k]*pred[(2*j+k)%(2*n)];
  118.                 }
  119.             }
  120.         }
  121.         /* gather into &(pred+jStart) */
  122.         MPI_Gather( (curr+jStart), jLength, MPI_INT, (pred+n%size), jLength, MPI_INT, 0, MPI_COMM_WORLD);
  123.         MPI_Gather( (d+offsetAddress+jStart),jLength, MPI_INT, (d+offsetAddress+jStart), jLength, MPI_INT, 0, MPI_COMM_WORLD);
  124.         /* store in c[] */
  125.         if (rank == 0)
  126.         {
  127.             for(j = 0, k = offsetAddress; j < n;  j++, k ++) c[k] = pred[j];
  128.         }
  129.         if (rank == 0)
  130.         {
  131.             t ++;
  132.             printf("Running after loop  %dn", t);
  133.             printf("c[] : ");
  134.             print(c, offsetAddress, n);
  135.             printf("d[] : ");
  136.             print(d, offsetAddress, n);
  137.             printf("n");
  138.         }
  139.         offsetAddress += n;
  140.     }
  141.     MPI_Finalize();
  142. }