Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cilk/cilk.h>
- #include <iostream>
- #include <stdlib.h>
- #include "BitmapRawConverter.h"
- #include "cilktime.h"
- #define __ARG_NUM__ 6
- using namespace std;
- /**
- * @brief Serial version of moving average filter.
- * @param inBuffer buffer of input image
- * @param outBuffer buffer of output image
- * @param width image width
- * @param height image height
- */
- void filter_serial_avg(int* inBuffer, int* outBuffer, int width, int height)
- {
- for (int i = 1; i < width - 1; i ++)
- {
- for (int j = 1; j < height - 1; j++)
- {
- // naredne dve petlje realizuju formulu dvostruke sume iz prateceg dokumenta
- for (int m = -1; m <= 1; m++)
- {
- for (int n = -1; n <= 1; n++)
- {
- outBuffer[j * width + i] += inBuffer[(j + n) * width + (i + m)] / 9;
- }
- }
- }
- }
- }
- /**
- * @brief Parallel version of moving average filter.
- *
- * @param inBuffer buffer of input image
- * @param outBuffer buffer of output image
- * @param width image width
- * @param height image height
- */
- void avg(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
- int sum=0;
- sum+=__sec_reduce_add(inBuffer[(width*(i-1)+j-1):3]);
- sum+=__sec_reduce_add(inBuffer[(width*i+j-1):3]);
- sum+=__sec_reduce_add(inBuffer[(width*(i+1)+j-1):3]);
- outBuffer[i*width+j]=sum/9;
- }
- void filter_parallel_avg(int* inBuffer, int* outBuffer, int width, int height)
- {
- // TODO: PLACE CODE HERE
- int i, j;
- for(i=1; i<height-1; i++)
- cilk_for(j=1; j<width-1; j++)
- avg(inBuffer, outBuffer, width, height, i, j);
- }
- /**
- * @brief Serial version of median filter.
- * @param inBuffer buffer of input image
- * @param outBuffer buffer of output image
- * @param width image width
- * @param height image height
- */
- void calc(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
- int a[9];
- int m, n, min, temp;
- for(m=0; m<3; m++){
- a[m]=inBuffer[(i-1)*width+j-1+m];
- a[m+3]=inBuffer[i*width+j-1+m];
- a[m+6]=inBuffer[(i+1)*width+j-1+m];
- }
- for(m=0; m<8; m++){
- min=m;
- for(n=m+1; n<9; n++)
- if(a[min]>a[n])
- min=n;
- temp=a[m];
- a[m]=a[min];
- a[min]=temp;
- }
- outBuffer[i*width+j]=a[4];
- }
- void filter_serial_med(int* inBuffer, int* outBuffer, int width, int height)
- {
- // TODO: PLACE CODE HERE
- int i, j;
- for(i=1; i<height-1; i++)
- for(j=1; j<width-1; j++)
- calc(inBuffer, outBuffer, width, height, i, j);
- }
- /**
- * @brief Parallel version of median filter.
- *
- * @param inBuffer buffer of input image
- * @param outBuffer buffer of output image
- * @param width image width
- * @param height image height
- */
- void calc_par(int *inBuffer, int *outBuffer, int width, int height, int i, int j){
- int a[9];
- int m, n, min, temp;
- a[0:3]=inBuffer[((i-1)*width+j-1):3];
- a[3:3]=inBuffer[(i*width+j-1):3];
- a[6:3]=inBuffer[((i+1)*width+j-1):3];
- for(m=0; m<8; m++){
- min=m;
- for(n=m+1; n<9; n++)
- if(a[min]>a[n])
- min=n;
- temp=a[m];
- a[m]=a[min];
- a[min]=temp;
- }
- outBuffer[i*width+j]=a[4];
- }
- void filter_parallel_med(int* inBuffer, int* outBuffer, int width, int height)
- {
- // TODO: PLACE CODE HERE
- int i, j;
- for(i=1; i<height-1; i++)
- cilk_for(j=1; j<width-1; j++)
- calc_par(inBuffer, outBuffer, width, height, i, j);
- }
- /**
- * @brief Print program usage.
- */
- void usage()
- {
- cout << "ERROR: call program like DigitalImageProcessing.exe input.bmp outputSerialAvg.bmp"
- "outputParallelAvg.bmp outputSerialMed.bmp outputParallelMed.bmp." << endl;
- }
- int main(int argc, char* argv[])
- {
- if (argc != __ARG_NUM__)
- {
- usage();
- return 0;
- }
- BitmapRawConverter inputFile(argv[1]);
- unsigned int width = inputFile.getWidth();
- unsigned int height = inputFile.getHeight();
- BitmapRawConverter outputFileSerialAvg(width, height);
- BitmapRawConverter outputFileParallelAvg(width, height);
- BitmapRawConverter outputFileSerialMed(width, height);
- BitmapRawConverter outputFileParallelMed(width, height);
- unsigned long long start_tick;
- unsigned long long end_tick;
- // SERIAL VERSION - MOVING AVERAGE FILTER
- cout << "Running serial version of moving average filter" << endl;
- start_tick = cilk_getticks();
- filter_serial_avg(inputFile.getBuffer(), outputFileSerialAvg.getBuffer(), width, height);
- end_tick = cilk_getticks();
- cout << "Ticks: " << end_tick - start_tick << endl;
- outputFileSerialAvg.pixelsToBitmap(argv[2]); // saves the result in a file
- // PARALLEL VERSION - MOVING AVERAGE FILTER
- cout << "Running parallel version of moving average filter" << endl;
- start_tick = cilk_getticks();
- // TODO: IMPLEMENT filter_parallel_avg FUNCTION
- filter_parallel_avg(inputFile.getBuffer(), outputFileParallelAvg.getBuffer(), width, height);
- end_tick = cilk_getticks();
- cout << "Ticks: " << end_tick - start_tick << endl;
- outputFileParallelAvg.pixelsToBitmap(argv[3]); // saves the result in a file
- // SERIAL VERSION - MEDIAN FILTER
- cout << "Running serial version of median filter" << endl;
- start_tick = cilk_getticks();
- // TODO: IMPLEMENT filter_serial_med FUNCTION
- filter_serial_med(inputFile.getBuffer(), outputFileSerialMed.getBuffer(), width, height);
- end_tick = cilk_getticks();
- cout << "Ticks: " << end_tick - start_tick << endl;
- outputFileSerialMed.pixelsToBitmap(argv[4]); // saves the result in a file
- // PARALLEL VERSION - MEDIAN FILTER
- cout << "Running parallel version of median filter" << endl;
- start_tick = cilk_getticks();
- // TODO: IMPLEMENT filter_parallel_med FUNCTION
- filter_parallel_med(inputFile.getBuffer(), outputFileParallelMed.getBuffer(), width, height);
- end_tick = cilk_getticks();
- cout << "Ticks: " << end_tick - start_tick << endl;
- outputFileParallelMed.pixelsToBitmap(argv[5]); // saves the result in a file
- cout<<memcmp(outputFileSerialAvg.getBuffer(), outputFileParallelAvg.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
- cout<<memcmp(outputFileParallelAvg.getBuffer(), outputFileSerialMed.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
- cout<<memcmp(outputFileSerialMed.getBuffer(), outputFileParallelMed.getBuffer(), sizeof(outputFileParallelAvg.getBuffer()))<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement