diff --git a/hpvm/test/parboil/benchmarks/pipeline/src/visc_parallel/main.cc b/hpvm/test/parboil/benchmarks/pipeline/src/visc_parallel/main.cc index 8438b9e31da2ffc9061106bcc08abdc01b7e04a2..b516f860a8c6b8317b11860127b8dc210c66b246 100644 --- a/hpvm/test/parboil/benchmarks/pipeline/src/visc_parallel/main.cc +++ b/hpvm/test/parboil/benchmarks/pipeline/src/visc_parallel/main.cc @@ -11,7 +11,7 @@ */ #include "opencv2/opencv.hpp" -#include "opencv2/ocl/ocl.hpp" +#include "opencv2/core/ocl.hpp" #include <stdio.h> #include <math.h> #include <stdlib.h> @@ -72,10 +72,6 @@ std::string output_window = "GPU Pipeline - Edge Mapping"; extern "C" { -struct RetStruct { - size_t bytesRet; -}; - struct __attribute__((__packed__)) InStruct { float* I ; size_t bytesI; @@ -247,14 +243,9 @@ void laplacianEstimate(float *Is, size_t bytesIs, // 3x3 image area float imageArea[SZB*SZB]; - //int gx = get_global_id(0); - //int gy = get_global_id(1); void* thisNode = __visc__getNode(); long gx = __visc__getNodeInstanceID_x(thisNode); long gy = __visc__getNodeInstanceID_y(thisNode); - //if(gx == 0 && gy == 0) - //std::cout << "Entered laplacian\n"; - int i, j; if ((gx < n) && (gy < m)) { @@ -313,9 +304,6 @@ void laplacianEstimate(float *Is, size_t bytesIs, float laplacian = dilatedPixel + erodedPixel - 2 * imageArea[1 * SZB +1]; L[gy*n+gx] = laplacian; } - //OutStruct output = {bytesB, bytesL}; - //if(gx == m-1 && gy == n-1) - //std::cout << "Exit laplacian\n"; __visc__return(1, bytesL); } @@ -358,15 +346,11 @@ void computeZeroCrossings(float *L, size_t bytesL, // 3x3 image area float imageArea[SZB][SZB]; - //int gx = get_global_id(0); - //int gy = get_global_id(1); void* thisNode = __visc__getNode(); long gx = __visc__getNodeInstanceID_x(thisNode); long gy = __visc__getNodeInstanceID_y(thisNode); int i, j; - //if(gx == 0 && gy == 0) - //std::cout << "Entered ZC\n"; if ((gx < n) && (gy < m)) { // Data copy for dilation filter imageArea[1][1] = L[gy * n + gx] > MIN_BR? MAX_BR : MIN_BR; @@ -435,9 +419,6 @@ void computeZeroCrossings(float *L, size_t bytesL, float pixelSign = dilatedPixel - erodedPixel; S[gy*n+gx] = pixelSign; } - //OutStruct output = {bytesB, bytesS}; - //if(gx == n-1 && gy == n-1) - //std::cout << "Exit ZC\n"; __visc__return(1, bytesS); } @@ -523,7 +504,6 @@ void computeGradient(float *Is, size_t bytesIs, } G[gloc] = sqrt(Gx*Gx + Gy*Gy); - //G[gloc] = Gx*Gx + Gy*Gy; } __visc__return(1, bytesG); } @@ -562,7 +542,6 @@ void computeMaxGradientLeaf(float *G, size_t bytesG, long m, long n) { __visc__hint(visc::CPU_TARGET); - //__visc__hint(visc::CPU_TARGET); __visc__attributes(1, G, 1, maxG); void* thisNode = __visc__getNode(); @@ -570,7 +549,6 @@ void computeMaxGradientLeaf(float *G, size_t bytesG, long lx = __visc__getNodeInstanceID_x(thisNode); // threadIdx.x long dimx = __visc__getNumNodeInstances_x(thisNode); // blockDim.x - // Assume a single thread block // Thread block iterates over all elements for (int i = lx + dimx; i < m*n; i+= dimx) { @@ -591,54 +569,10 @@ void computeMaxGradientLeaf(float *G, size_t bytesG, __visc__return(1, bytesMaxG); } -/* - * Reduction - * G : input - * maxG: output - * Each static node processes 2*nodeDim elements - * Need 1D grid, a thread per 2 pixels - */ -//void computeMaxGradientLeaf(float *G, size_t bytesG, - //float *maxG, size_t bytesMaxG, - //int m, int n) { - - //__visc__hint(visc::DEVICE); - //TODO: maxG should be initialized to zero (MIN_BR) every time - //__visc__attributes(2, G, maxG, 1, maxG); - - //void* thisNode = __visc__getNode(); - //void* parentNode = __visc__getParentNode(thisNode); - - //int lx = __visc__getNodeInstanceID_x(thisNode); - //int px = __visc__getNodeInstanceID_x(parentNode); - //int dimx = __visc__getNumNodeInstances_x(thisNode); - - //int gid = lx + 2*px*dimx; - - //for (unsigned stride = dimx; stride > 32; stride >>= 1) { - //if ((gid + stride < m*n) && (lx < stride)) - //if (G[gid + stride] > G[gid]) - //G[gid] = G[gid + stride]; - //__visc__barrier(); - //} - - //for (unsigned stride = 32; stride >= 1; stride >>= 1) { - //if ((gid + stride < m*n) && (lx < stride)) - //if (G[gid + stride] > G[gid]) - //G[gid] = G[gid + stride]; - //} - - //if (lx == 0) - //__visc__atomic_max(maxG,G[gid]); - - //__visc__return(1, m); -//} - void computeMaxGradientTB(float *G, size_t bytesG, float *maxG, size_t bytesMaxG, long m, long n, long block_x) { - //__visc__hint(visc::DEVICE); __visc__hint(visc::CPU_TARGET); __visc__attributes(2, G, maxG, 1, maxG); void* CMGLeafNode = __visc__createNodeND(1, computeMaxGradientLeaf, block_x); @@ -686,7 +620,6 @@ void rejectZeroCrossings(float *S, size_t bytesS, float *E, size_t bytesE, long m, long n) { __visc__hint(visc::DEVICE); - //__visc__hint(visc::CPU_TARGET); __visc__attributes(3, S, G, maxG, 1, E); void* thisNode = __visc__getNode(); @@ -694,7 +627,6 @@ void rejectZeroCrossings(float *S, size_t bytesS, int gy = __visc__getNodeInstanceID_y(thisNode); float mG = *maxG; - //float mG = 1.39203; if ((gx < n) && (gy < m)) { E[gy*n+gx] = ((S[gy*n+gx] > 0.0) && (G[gy*n+gx] > THETA*mG)) ? 1.0 : 0.0 ; } @@ -829,18 +761,8 @@ void getNextFrame(VideoCapture& VC, Mat& F) { cvtColor( F, F, CV_BGR2GRAY ); F.convertTo(F, CV_32F, 1.0/255.0); - } -//void showInOut(Mat& Input, Mat& Output) { - //Mat in, out; - //resize(Input, in, Size(512, 768)); - //resize(Output, out, Size(512, 768)); - //imshow(input_window, in); - //imshow(output_window, out); -//} - - int main (int argc, char *argv[]) { struct pb_Parameters *params; @@ -873,11 +795,6 @@ int main (int argc, char *argv[]) { NUM_FRAMES = 600; std::cout << "Number of frames = " << NUM_FRAMES << "\n"; - // Used to store time after each frame computation is completed - //timeval *timeStamps = (timeval *)malloc(NUM_RUNS*NUM_FRAMES*sizeof(timeval)); - //struct timeval tv_start; - //unsigned long cnt = 0; // Counter, for the video frames - namedWindow(input_window, CV_WINDOW_AUTOSIZE); namedWindow(output_window, CV_WINDOW_AUTOSIZE); moveWindow(input_window, POSX_IN, POSY_IN); @@ -905,7 +822,6 @@ int main (int argc, char *argv[]) { pb_InitializeTimerSet(&timers); __visc__init(); - //pb_SwitchToTimer( &timers, pb_TimerID_COMPUTE ); // copy A to device memory I_sz = src.size[0]*src.size[1]*sizeof(float); @@ -916,8 +832,6 @@ int main (int argc, char *argv[]) { 1, 1, 1, 1, 1, 1 }; size_t bytesB = 9*sizeof(float); - //Sx = [-1 0 1 ; -2 0 2 ; -1 0 1 ] - //Sy = [-1 -2 -1 ; 0 0 0 ; 1 2 1 ] float Sx[] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 }; @@ -941,10 +855,6 @@ int main (int argc, char *argv[]) { // grid_x should be equal to the number of SMs on GPU. FTX 680 has 8 SMs grid_x = 1; - // Copy A and B^T into device memory - //pb_SwitchToTimer( &timers, pb_TimerID_COMPUTE ); - - //showInOut(src, E); Mat in, out; resize(src, in, Size(HEIGHT, WIDTH)); resize(E, out, Size(HEIGHT, WIDTH)); @@ -952,7 +862,6 @@ int main (int argc, char *argv[]) { imshow(output_window, out); waitKey(0); - //NUM_FRAMES = 20; pb_SwitchToTimer( &timers, visc_TimerID_COMPUTATION ); struct InStruct* args = (struct InStruct*)malloc (sizeof(InStruct)); packData(args, (float*)src.data, I_sz, @@ -972,13 +881,6 @@ int main (int argc, char *argv[]) { // Check if the total elements is a multiple of block size assert(src.size[0]*src.size[1] % block_x == 0); - //imshow(input_window, src); - //imshow(output_window, E); - //waitKey(0); - - // Get the time just before computation starts - //gettimeofday(&tv_start,NULL); - for(unsigned j=0; j<NUM_RUNS; j++) { std::cout << "Run: " << j << "\n"; void* DFG = __visc__launch(1, edgeDetection, (void*)args); @@ -986,11 +888,7 @@ int main (int argc, char *argv[]) { cap = VideoCapture(params->inpFiles[0]); getNextFrame(cap, src); - //packData(args, A.data, BlockSize, &matB[i], BlockSize, &matC[i], BlockSize, BlockElements); - if(NUM_FRAMES >=2) { - //__visc__push(DFG, args); - //__visc__push(DFG, args); for(int i=0; i<NUM_FRAMES; i++) { std::cout << "Frame " << i << "\n"; args->I = (float*) src.data; @@ -1014,51 +912,15 @@ int main (int argc, char *argv[]) { std::cout << "Returned size: " << *(size_t *)ret << " expected " << I_sz << '\n'; - //llvm_visc_request_mem(E.data, I_sz); - //std::cout << "Show E" << "\n"; - //imshow(window_name, E); - //waitKey(0); - //llvm_visc_request_mem(src.data, I_sz); - //llvm_visc_request_mem(Is.data, I_sz); - //llvm_visc_request_mem(L.data, I_sz); - //llvm_visc_request_mem(S.data, I_sz); - //llvm_visc_request_mem(G.data, I_sz); llvm_visc_request_mem(maxG, bytesMaxG); llvm_visc_request_mem(E.data, I_sz); - //std::cout << "src.data = " << (float*)src.data << "\n"; - //std::cout << "Is.data = " << (float*)Is.data << "\n"; - //std::cout << "L.data = " << (float*)L.data << "\n"; - //std::cout << "S.data = " << (float*)S.data << "\n"; - //std::cout << "G.data = " << (float*)G.data << "\n"; - //std::cout << "E.data = " << (float*)E.data << "\n"; - //std::cout << "Max G = " << *maxG << "\n"; - - //gettimeofday(&timeStamps[cnt], NULL); - //cnt++; + Mat in, out; resize(src, in, Size(HEIGHT, WIDTH)); - //std::cout << "Show E\n"; resize(E, out, Size(HEIGHT, WIDTH)); imshow(output_window, out); imshow(input_window, in); waitKey(1); - //waitKey(0); - //std::cout << "Show Is\n"; - //resize(Is, out, Size(HEIGHT, WIDTH)); - //imshow(output_window, out); - //waitKey(0); - //std::cout << "Show L\n"; - //resize(L, out, Size(HEIGHT, WIDTH)); - //imshow(output_window, out); - //waitKey(0); - //std::cout << "Show S\n"; - //resize(S, out, Size(HEIGHT, WIDTH)); - //imshow(output_window, out); - //waitKey(0); - //std::cout << "Show G\n"; - //resize(G, out, Size(HEIGHT, WIDTH)); - //imshow(output_window, out); - //waitKey(0); llvm_visc_untrack_mem(src.data); llvm_visc_untrack_mem(Is.data); @@ -1073,72 +935,17 @@ int main (int argc, char *argv[]) { llvm_visc_untrack_mem(Sy); getNextFrame(cap, src); - } - //__visc__pop(DFG); - //__visc__pop(DFG); } else { __visc__push(DFG, args); __visc__pop(DFG); } - - __visc__wait(DFG); } - pb_SwitchToTimer(&timers, pb_TimerID_NONE); - - pb_PrintTimerSet(&timers); - - //const char *fn = "timestamps.txt"; - //std::ofstream outfile; - //outfile.open(fn); - //if (!outfile.is_open()) { - //std::cout << "Failed to open " << fn << " for writing\n"; - //} - //for (unsigned long i = 0; i < cnt; i++) { - //double elapsed = (timeStamps[i].tv_sec - tv_start.tv_sec) + - //((timeStamps[i].tv_usec - tv_start.tv_usec)/1000000.0); - //outfile << elapsed << "\n"; - //} - //free(timeStamps); - //outfile.close(); __visc__cleanup(); - - //if (params->outFile) { - - /* Write C to file */ - //pb_SwitchToTimer(&timers, pb_TimerID_IO); - //writeColMajorMatrixFile(params->outFile, - //src.size[0], src.size[1], matE); - //} - - //std::cout << "Show Is" << "\n"; - //Mat output(src.size[0], src.size[1], CV_32F); - //imshow(output_window, Is); - //waitKey(0); - - //std::cout << "Show G" << "\n"; - //imshow(output_window, L); - //waitKey(0); - - //std::cout << "Show L" << "\n"; - //imshow(output_window, S); - //waitKey(0); - - //std::cout << "Show S" << "\n"; - //imshow(output_window, G); - //waitKey(0); - - //std::cout << "Show E" << "\n"; - //imshow(output_window, E); - //waitKey(0); - - //double GPUtime = pb_GetElapsedTime(&(timers.timers[pb_TimerID_KERNEL])); - //std::cout<< "GFLOPs = " << 2.* src.size[0] * src.size[1] * src.size[1]/GPUtime/1e9 << std::endl; pb_FreeParameters(params); - return 0; }