Advertisement
kernel_memory_dump

SPPURV VEZBA 7 MEDIAN MEAN FILTER CILK FUCK JEA

Apr 19th, 2015
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.05 KB | None | 0 0
  1. #include <cilk/cilk.h>
  2. #include <iostream>
  3. #include <stdlib.h>
  4.  
  5. #include "BitmapRawConverter.h"
  6. #include "cilktime.h"
  7.  
  8. #define __ARG_NUM__ 6
  9.  
  10. using namespace std;
  11.  
  12. /**
  13. * @brief Serial version of moving average filter.
  14. * @param inBuffer buffer of input image
  15. * @param outBuffer buffer of output image
  16. * @param width image width
  17. * @param height image height
  18. */
  19. void filter_serial_avg(int* inBuffer, int* outBuffer, int width, int height)
  20. {
  21.     for (int i = 1; i < width - 1; i ++)
  22.     {
  23.         for (int j = 1; j < height - 1; j++)
  24.         {
  25.             // naredne dve petlje realizuju formulu dvostruke sume iz prateceg dokumenta
  26.             for (int m = -1; m <= 1; m++)
  27.             {
  28.                 for (int n = -1; n <= 1; n++)
  29.                 {
  30.                     outBuffer[j * width + i] += inBuffer[(j + n) * width + (i + m)] / 9;
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37.  
  38. /**
  39. * @brief Parallel version of moving average filter.
  40. *
  41. * @param inBuffer buffer of input image
  42. * @param outBuffer buffer of output image
  43. * @param width image width
  44. * @param height image height
  45. */
  46.  
  47. void avg(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
  48.     int sum=0;
  49.     sum+=__sec_reduce_add(inBuffer[(width*(i-1)+j-1):3]);
  50.     sum+=__sec_reduce_add(inBuffer[(width*i+j-1):3]);
  51.     sum+=__sec_reduce_add(inBuffer[(width*(i+1)+j-1):3]);
  52.     outBuffer[i*width+j]=sum/9;
  53. }
  54.  
  55. void filter_parallel_avg(int* inBuffer, int* outBuffer, int width, int height)
  56. {
  57.     // TODO: PLACE CODE HERE
  58.     int i, j;
  59.     for(i=1; i<height-1; i++)
  60.         cilk_for(j=1; j<width-1; j++)
  61.             avg(inBuffer, outBuffer, width, height, i, j);
  62. }
  63.  
  64.  
  65. /**
  66. * @brief Serial version of median filter.
  67. * @param inBuffer buffer of input image
  68. * @param outBuffer buffer of output image
  69. * @param width image width
  70. * @param height image height
  71. */
  72. void calc(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
  73.     int a[9];
  74.     int m, n, min, temp;
  75.     for(m=0; m<3; m++){
  76.         a[m]=inBuffer[(i-1)*width+j-1+m];
  77.         a[m+3]=inBuffer[i*width+j-1+m];
  78.         a[m+6]=inBuffer[(i+1)*width+j-1+m];
  79.     }
  80.     for(m=0; m<8; m++){
  81.         min=m;
  82.         for(n=m+1; n<9; n++)
  83.             if(a[min]>a[n])
  84.                 min=n;
  85.         temp=a[m];
  86.         a[m]=a[min];
  87.         a[min]=temp;
  88.     }
  89.     outBuffer[i*width+j]=a[4];
  90. }
  91.  
  92. void filter_serial_med(int* inBuffer, int* outBuffer, int width, int height)
  93. {
  94.     // TODO: PLACE CODE HERE
  95.     int i, j;
  96.     for(i=1; i<height-1; i++)
  97.         for(j=1; j<width-1; j++)
  98.             calc(inBuffer, outBuffer, width, height, i, j);
  99. }
  100.  
  101.  
  102. /**
  103. * @brief Parallel version of median filter.
  104. *
  105. * @param inBuffer buffer of input image
  106. * @param outBuffer buffer of output image
  107. * @param width image width
  108. * @param height image height
  109. */
  110. void calc_par(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
  111.     int a[9];
  112.     int m, n, min, temp;
  113.     a[0:3]=inBuffer[((i-1)*width+j-1):3];
  114.     a[3:3]=inBuffer[(i*width+j-1):3];
  115.     a[6:3]=inBuffer[((i+1)*width+j-1):3];
  116.     for(m=0; m<8; m++){
  117.         min=m;
  118.         for(n=m+1; n<9; n++)
  119.             if(a[min]>a[n])
  120.                 min=n;
  121.         temp=a[m];
  122.         a[m]=a[min];
  123.         a[min]=temp;
  124.     }
  125.     outBuffer[i*width+j]=a[4];
  126. }
  127.  
  128. void filter_parallel_med(int* inBuffer, int* outBuffer, int width, int height)
  129. {
  130.     // TODO: PLACE CODE HERE
  131.     int i, j;
  132.     for(i=1; i<height-1; i++)
  133.         cilk_for(j=1; j<width-1; j++)
  134.             calc_par(inBuffer, outBuffer, width, height, i, j);
  135. }
  136.  
  137.  
  138. /**
  139. * @brief Print program usage.
  140. */
  141. void usage()
  142. {
  143.     cout << "ERROR: call program like DigitalImageProcessing.exe input.bmp outputSerialAvg.bmp"
  144.         "outputParallelAvg.bmp outputSerialMed.bmp outputParallelMed.bmp." << endl;
  145. }
  146.  
  147.  
  148. int main(int argc, char* argv[])
  149. {
  150.     if (argc != __ARG_NUM__)
  151.     {
  152.         usage();
  153.         return 0;
  154.     }
  155.  
  156.     BitmapRawConverter inputFile(argv[1]);
  157.  
  158.     unsigned int width = inputFile.getWidth();
  159.     unsigned int height = inputFile.getHeight();
  160.  
  161.     BitmapRawConverter outputFileSerialAvg(width, height);
  162.     BitmapRawConverter outputFileParallelAvg(width, height);
  163.     BitmapRawConverter outputFileSerialMed(width, height);
  164.     BitmapRawConverter outputFileParallelMed(width, height);
  165.  
  166.     unsigned long long start_tick;
  167.     unsigned long long end_tick;
  168.  
  169.  
  170.     // SERIAL VERSION - MOVING AVERAGE FILTER
  171.     cout << "Running serial version of moving average filter" << endl;
  172.     start_tick = cilk_getticks();
  173.     filter_serial_avg(inputFile.getBuffer(), outputFileSerialAvg.getBuffer(), width, height);
  174.     end_tick = cilk_getticks();
  175.     cout << "Ticks: " << end_tick - start_tick << endl;
  176.     outputFileSerialAvg.pixelsToBitmap(argv[2]); // saves the result in a file
  177.  
  178.  
  179.     // PARALLEL VERSION - MOVING AVERAGE FILTER
  180.     cout << "Running parallel version of moving average filter" << endl;
  181.     start_tick = cilk_getticks();
  182.     // TODO: IMPLEMENT filter_parallel_avg FUNCTION
  183.     filter_parallel_avg(inputFile.getBuffer(), outputFileParallelAvg.getBuffer(), width, height);
  184.     end_tick = cilk_getticks();
  185.     cout << "Ticks: " << end_tick - start_tick << endl;
  186.     outputFileParallelAvg.pixelsToBitmap(argv[3]); // saves the result in a file
  187.  
  188.  
  189.     // SERIAL VERSION - MEDIAN FILTER
  190.     cout << "Running serial version of median filter" << endl;
  191.     start_tick = cilk_getticks();
  192.     // TODO: IMPLEMENT filter_serial_med FUNCTION
  193.     filter_serial_med(inputFile.getBuffer(), outputFileSerialMed.getBuffer(), width, height);
  194.     end_tick = cilk_getticks();
  195.     cout << "Ticks: " << end_tick - start_tick << endl;
  196.     outputFileSerialMed.pixelsToBitmap(argv[4]); // saves the result in a file
  197.  
  198.  
  199.     // PARALLEL VERSION - MEDIAN FILTER
  200.     cout << "Running parallel version of median filter" << endl;
  201.     start_tick = cilk_getticks();
  202.     // TODO: IMPLEMENT filter_parallel_med FUNCTION
  203.     filter_parallel_med(inputFile.getBuffer(), outputFileParallelMed.getBuffer(), width, height);
  204.     end_tick = cilk_getticks();
  205.     cout << "Ticks: " << end_tick - start_tick << endl;
  206.     outputFileParallelMed.pixelsToBitmap(argv[5]); // saves the result in a file
  207.  
  208.     cout<<memcmp(outputFileSerialAvg.getBuffer(), outputFileParallelAvg.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
  209.     cout<<memcmp(outputFileParallelAvg.getBuffer(), outputFileSerialMed.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
  210.     cout<<memcmp(outputFileSerialMed.getBuffer(), outputFileParallelMed.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
  211.     return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement