/* Fill float vector with random numbers over a range. */ void vecran_float(float *vec, int beg, int end) { int i; float *pntr; double normalize_float(float *vec, int beg, int end); double drandom(void); pntr = vec + beg; for (i = end - beg + 1; i; i--) { (*pntr++) = drandom(); } normalize_float(vec, beg, end); }
int main(int argc, char *argv[]) { if (argc == 1) { const cl_uint width = 1920; const cl_uint height = 1080; const cl_uint numPixels = height * width; cl_int err = CL_SUCCESS; float *r = cl_malloc_array(float, numPixels); float *g = cl_malloc_array(float, numPixels); float *b = cl_malloc_array(float, numPixels); float *y = cl_malloc_array(float, numPixels); float *u = cl_malloc_array(float, numPixels); float *v = cl_malloc_array(float, numPixels); cl_uchar *Yp = cl_malloc_array(cl_uchar, numPixels); cl_uchar *Up = cl_malloc_array(cl_uchar, numPixels); cl_uchar *Vp = cl_malloc_array(cl_uchar, numPixels); float bt601[9] = {0.257f, 0.504f, 0.098f, -0.148f, -0.291f, 0.439f, 0.439f, -0.368f, -0.071f}; time_t start, diff; clock_t c_start, c_diff1, c_diff2; #ifdef CL_BUILD_RUNTIME cl_environment_t *pEnv = clCreateEnvironment(KDIR"kernel_yuv.cl",CL_DEVICE_TYPE_GPU,1,notify, CL_ARGS); #else cl_environment_t *pEnv = clCreateEnvironmentFromBins(&gKernelBins, notify, CL_ARGS); #endif printf("Processing %ux%u => %u pixels\n", width, height, numPixels); if (pEnv && r && g && b && y && u && v) { cl_uint i = 0; srand((unsigned int)time(NULL)); // initialize the data for (i = 0; i < numPixels; i++) { r[i] = frrand(0.0,1.0); // [0-1] g[i] = frrand(0.0,1.0); // [0-1] b[i] = frrand(0.0,1.0); // [0-1] y[i] = 0.00; u[i] = 0.00; v[i] = 0.00; } start = time(NULL); c_start = clock(); err = cl_convert_rgbf_to_yuvf_bt601(pEnv, r, g, b, y, u, v, numPixels); cl_assert(err == CL_SUCCESS,printf("Error = %d\n",err)); c_diff1 = clock() - c_start; diff = time(NULL) - start; printf("With Constants Version Ran in %lu seconds (%lu ticks)\n", diff, c_diff1); // initialize the data for (i = 0; i < numPixels; i++) { r[i] = frrand(0.0,1.0); // [0-1] g[i] = frrand(0.0,1.0); // [0-1] b[i] = frrand(0.0,1.0); // [0-1] y[i] = 0.00; u[i] = 0.00; v[i] = 0.00; } start = time(NULL); c_start = clock(); cl_convert_rgbf_to_yuvf(pEnv, r, g, b, y, u, v, bt601, numPixels); c_diff2 = clock() - c_start; diff = time(NULL) - start; printf("With No Constants Version Ran in %lu seconds (%lu ticks)\n", diff, c_diff2); normalize_float(y, 16, 235, Yp, numPixels); normalize_float(u, -128, 128, Up, numPixels); normalize_float(v, -128, 128, Vp, numPixels); #ifdef CL_DEBUG for (i = 0; i < numPixels; i++) printf("YUV = {0x%02x, 0x%02x, 0x%02x}\n", Yp[i], Up[i], Vp[i]); #endif clDeleteEnvironment(pEnv); } cl_free(r); cl_free(g); cl_free(b); cl_free(y); cl_free(u); cl_free(v); } else if (argc >= 6)