Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 2nd, 2012  |  syntax: C  |  size: 4.04 KB  |  hits: 53  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <netpbm/pgm.h>
  2. #include <stdio.h>
  3. #include <mpi.h>
  4. #include <sys/time.h>
  5.  
  6. FILE *in,*out;
  7. gray **imageIN, **imageOUT;
  8. int width,height,maxg;
  9.  
  10. int root = 0;
  11. char name[80];
  12. int rank,size,length,rozmiar;
  13. int i,j,k;
  14. double start,end;
  15. int min,max;
  16. int sliceWidth,*recvbuf,*displacement,*slice;
  17.  
  18. int main(int argc, char *argv[]){
  19.  
  20.         // stworzenie uchwytów do plików
  21.         in = fopen("/mhome/mjedrzejas/projekt_koncowy/balloons.pgm","r");
  22.         out = fopen("/mhome/mjedrzejas/projekt_koncowy/mandrill_modified.pgm","w");
  23.  
  24.         if (in == NULL)
  25.         {
  26.                 printf("Nie odnaleziono obrazow do otwarcia.\n");
  27.                 exit(1);
  28.         }
  29.  
  30.         // zaladowanie zdjecia
  31.         imageIN = pgm_readpgm(in,&width,&height,&maxg);
  32.         imageOUT = pgm_allocarray(width,height);
  33.         rozmiar = width*height;
  34.        
  35.         // deklarowanie tablic
  36.         int sendbuf[rozmiar]; /* cały obraz jako wektor */
  37.        
  38.         //int displacement[PROCESOROW]; /* przesunięcie, określa gdzie zaczyna sie każdy z fragmentów */
  39.         //int slice[PROCESOROW]; /* ilość fragmentów*/
  40.        
  41.         // Inicjalizacja środowiska MPI
  42.         MPI_Init(&argc, &argv);
  43.  
  44.         MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  45.         MPI_Comm_size(MPI_COMM_WORLD,&size); /* ilość procesorów */
  46.         MPI_Get_processor_name(name,&length);
  47.        
  48.         sliceWidth = width/size + 1; /* wielkość na jeden procesor */
  49.         recvbuf = (int*)malloc(sliceWidth*height*sizeof(int)); /* wektor fragmentu*/
  50.        
  51.         displacement = (int*)malloc(size*sizeof(int)); /* przesunięcie, określa gdzie zaczyna sie każdy z fragmentów */
  52.         slice = (int*)malloc(size*sizeof(int)); /* ilość fragmentów*/
  53.        
  54.         if(rank == root)
  55.         {
  56.                 printf("procesorow %d\n",size);
  57.                 // pomiar czasu
  58.                
  59.                 // przepisanie danych zdjęcia z tablicy gray na tablice int,
  60.                 // zmienna gray jest zmienna bez znaku i poza tym nie obsługuje jej MPI
  61.                 for(j=0; j<height; j++)
  62.                         for(i=0,k=j*height; i<width; i++,k++)
  63.                                 sendbuf[k] = imageIN[j][i];
  64.  
  65.                 // obliczanie przesunięcia (początków fragmentów danych) oraz wielkości tych fragmentów
  66.                 for(i=0; i<size; i++)
  67.                 {
  68.                         displacement[i] = i*(rozmiar/size) - i*(height) /* -i*height ze względu na zakładki*/;
  69.                         slice[i] = height*(width/size) + height; /* + height bo zakładka (aby filtr miał dane) */
  70.                 }
  71.         }
  72.         start = MPI_Wtime();
  73.        
  74.         // rozesłanie danych do wszystkich procesorów
  75.         MPI_Scatterv(sendbuf,slice,displacement,MPI_INT,recvbuf,sliceWidth*height,MPI_INT,root,MPI_COMM_WORLD);
  76.        
  77.         // deklaracja tablicy z wynikami obliczeń danego fragmentu danych
  78.         int recvbuf2[sliceWidth*height];
  79.  
  80.         /*
  81.         filtracja obrazu filtrem
  82.         0  1  0
  83.         1 -4  1
  84.         0  1  0
  85.         */
  86.         for(i=width; i<(height*width)-width; i++)
  87.                 recvbuf2[i] = -4*recvbuf[i] + recvbuf[i-1] + recvbuf[i+1] + recvbuf[i-width] + recvbuf[i+width];
  88.  
  89.  
  90.         if(rank == root)
  91.         {
  92.                 // obliczenie wielkości pojedynczego slice'a
  93.                 int displacement[size];
  94.                 int slice[size];
  95.                 for(i=0; i<size; i++)
  96.                 {
  97.                         displacement[i] = i*(rozmiar/size) - i*(height) /* -i*height ze względu na zakładki*/;
  98.                         slice[i] = rozmiar/size ;
  99.                 }
  100.         }
  101.  
  102.         // odebranie przetworzonych danych
  103.         MPI_Gatherv(recvbuf2,(width/size)*height,MPI_INT,sendbuf,slice,displacement,MPI_INT,root,MPI_COMM_WORLD);
  104.         end = MPI_Wtime();
  105.  
  106.         if(rank == root)
  107.         {
  108.                
  109.                 // ustawiamy zmienne po wyszukania minimum i maximum w celu normalizacji
  110.                 min = sendbuf[0];
  111.                 max = sendbuf[0];
  112.  
  113.                 // wyszukiwanie minimum i maximum
  114.                 for(i=0; i<rozmiar; i++)
  115.                 {
  116.                         if(sendbuf[i] < min)
  117.                                 min = sendbuf[i];
  118.  
  119.                         if(sendbuf[i] > max)
  120.                                 max = sendbuf[i];
  121.                 }
  122.  
  123.                 // normalizacja do przedziały [0,255]
  124.                 for(i=0; i<rozmiar; i++)
  125.                         sendbuf[i]  = ((double)(sendbuf[i] - min))*255/(max-min);
  126.  
  127.                 // przepisanie przetworzonego obrazu ponownie do tablicy typu gray
  128.                 for(j=0;j<height;j++)
  129.                         for(i=0,k=j*width;i<width;i++,k++)
  130.                                 imageOUT[j][i] = sendbuf[k];
  131.  
  132.                 // zapisanie przetworzonego zdjęcia
  133.                 pgm_writepgm(out,imageOUT,width,height,maxg,0);
  134.                
  135.                 // oblieczenie czasu obliczeń oraz wypisanie wyniku
  136.                 printf("Czas obliczen wynosi: %f \n", end-start);
  137.         }
  138.  
  139.         // zwalnianie zasobów
  140.         if(rank == root)
  141.         {
  142.                 free(imageIN);
  143.                 free(imageOUT);
  144.                 fcloseall();
  145.         }
  146.        
  147.         MPI_Finalize();
  148. }