From 086ec74e94654e92b3a1c6f42612d12ef33ff4b2 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期五, 28 十月 2022 14:41:08 +0800 Subject: [PATCH] '优化自启动机制' --- ConsoleApplication/OpenCLExcuter.cpp | 984 +++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 608 insertions(+), 376 deletions(-) diff --git a/ConsoleApplication/OpenCLExcuter.cpp b/ConsoleApplication/OpenCLExcuter.cpp index f792d65..9d6fdc9 100644 --- a/ConsoleApplication/OpenCLExcuter.cpp +++ b/ConsoleApplication/OpenCLExcuter.cpp @@ -146,7 +146,7 @@ } -unsigned char** OpenCLExcuter::recognition_numbers(unsigned char* data, unsigned char* b_in, const int rows, const int cols, const int num_width, const int num_height, const int num_count) throw(std::string) { +unsigned char** OpenCLExcuter::recognition_numbers(unsigned char* data, unsigned char* b_in, const int rows, const int cols, const int num_width, const int num_height, const int line_number_count) throw(std::string) { //----------程序正文开始--------- auto startexectime = std::chrono::steady_clock::now(); const int resultSize = rows * cols / (num_width * num_height); @@ -177,15 +177,20 @@ } int width = cols / num_width; + //设置内核参数 error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); error |= clSetKernelArg(kernel, 2, sizeof(int), &width); error |= clSetKernelArg(kernel, 3, sizeof(int), &num_width); error |= clSetKernelArg(kernel, 4, sizeof(int), &num_height); - error |= clSetKernelArg(kernel, 5, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 5, sizeof(int), &line_number_count); error |= clSetKernelArg(kernel, 6, sizeof(cl_mem), &memObject4); if (error != CL_SUCCESS) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject4); throw string("Error setting kernel arguments!\n"); } //执行内核 @@ -197,6 +202,10 @@ error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL); if (error != CL_SUCCESS) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject4); throw string("Error queuing kernel for execution!\n"); } @@ -206,6 +215,10 @@ result, 0, NULL, NULL); if (error != CL_SUCCESS) { free(result); + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject4); throw string("Error reading result buffer!\n"); } /* @@ -250,6 +263,12 @@ localWorkSize, 0, NULL, NULL); if (error != CL_SUCCESS) { free(result); + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject21); + clReleaseMemObject(memObject22); throw string("Error queuing kernel for execution!\n"); } @@ -260,6 +279,12 @@ if (error != CL_SUCCESS) { free(result); free(result2); + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject21); + clReleaseMemObject(memObject22); throw string("Error reading result buffer!\n"); } @@ -287,7 +312,7 @@ clReleaseMemObject(memObject22); //复制最后的计算结果 - int fcol = num_count; + int fcol = line_number_count; int frow = rows / num_height; unsigned char** fresult = (unsigned char**)malloc(sizeof(unsigned char*) * frow); @@ -452,51 +477,164 @@ throw string("Creat memObject5 failed!\n"); } - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); - error |= clSetKernelArg(kernel, 4, sizeof(int), &img.cols); - error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); - error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); - error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_per_line); - error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); - error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + try { + + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); + error |= clSetKernelArg(kernel, 4, sizeof(int), &img.cols); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_per_line); + error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); + error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos.length }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result.data, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); } - //执行内核 - size_t globalWorkSize[1] = { pos.length }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + throw st; } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), - result.data, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); - clReleaseMemObject(memObject4); - clReleaseMemObject(memObject5); std::cout << " 耗时:" << (clock() - time_0) << std::endl; } +void OpenCLExcuter::splitTradeQueueNum(cv::Mat img, IntDataInfo pos, UcharDataInfo result, UcharDataInfo types, unsigned char* zero, int num_width, int num_height, int ele_count_per_line, int length_per_num) { + + + clock_t time_0 = clock(); + + kernel = clCreateKernel(program, "split_trade_queue_num", &error); + if (kernel == NULL) { + throw string("Couldn't create kernel!\n"); + } + + int inputSize = (img.cols * img.rows); + + int resultSize = pos.length * (length_per_num * 10 * num_width * num_height); + + + //创建缓存对象 + + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(unsigned char) * inputSize, img.data, &error); + if (error < 0) { + throw string("Creat memObject1 failed!\n"); + } + + cl_mem memObject2 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(int) * pos.length * 4, pos.data, &error); + if (error < 0) { + throw string("Creat memObject2 failed!\n"); + } + + cl_mem memObject3 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * num_width * num_height, zero, &error); + if (error < 0) { + throw string("Creat memObject3 failed!\n"); + } + + cl_mem memObject4 = clCreateBuffer(context, CL_MEM_WRITE_ONLY, + sizeof(unsigned char) * resultSize, NULL, &error); + if (error < 0) { + throw string("Creat memObject4 failed!\n"); + } + + + + cl_mem memObject5 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, + sizeof(unsigned char) * types.length, types.data, &error); + if (error < 0) { + throw string("Creat memObject5 failed!\n"); + } + + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); + error |= clSetKernelArg(kernel, 4, sizeof(int), &img.cols); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_per_line); + error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); + error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos.length }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result.data, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + } + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + throw st; + } + + + + + std::cout << " 耗时:" << (clock() - time_0) << std::endl; +} @@ -556,48 +694,59 @@ } int ele_count_line = 4; + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); + error |= clSetKernelArg(kernel, 4, sizeof(int), &img_width); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_line); + error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); + error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos_count }; + size_t localWorkSize[1] = { 1 }; - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject5); - error |= clSetKernelArg(kernel, 4, sizeof(int), &img_width); - error |= clSetKernelArg(kernel, 5, sizeof(int), &num_width); - error |= clSetKernelArg(kernel, 6, sizeof(int), &num_height); - error |= clSetKernelArg(kernel, 7, sizeof(int), &ele_count_line); - error |= clSetKernelArg(kernel, 8, sizeof(int), &length_per_num); - error |= clSetKernelArg(kernel, 9, sizeof(cl_mem), &memObject4); - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); } - //执行内核 - size_t globalWorkSize[1] = { pos_count }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); - } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + clReleaseMemObject(memObject5); + throw st; } - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); - clReleaseMemObject(memObject4); - clReleaseMemObject(memObject5); + std::cout << " 耗时:" << (clock() - time_0) << std::endl; } @@ -654,45 +803,52 @@ throw string("Creat memObject4 failed!\n"); } - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); - error |= clSetKernelArg(kernel, 3, sizeof(int), &img_width); - error |= clSetKernelArg(kernel, 4, sizeof(int), &num_width); - error |= clSetKernelArg(kernel, 5, sizeof(int), &num_height); - error |= clSetKernelArg(kernel, 6, sizeof(int), &num_count); - error |= clSetKernelArg(kernel, 7, sizeof(cl_mem), &memObject4); - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject3); + error |= clSetKernelArg(kernel, 3, sizeof(int), &img_width); + error |= clSetKernelArg(kernel, 4, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 5, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 6, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 7, sizeof(cl_mem), &memObject4); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { pos_count }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + std::cout << " 耗时:" << (clock() - time_0) << std::endl; } - //执行内核 - size_t globalWorkSize[1] = { pos_count }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + clReleaseMemObject(memObject4); + throw st; } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject4, CL_TRUE, 0, resultSize * sizeof(unsigned char), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); - clReleaseMemObject(memObject4); - std::cout << " 耗时:" << (clock() - time_0) << std::endl; } @@ -722,44 +878,52 @@ throw string("Creat memObject2 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &num_width); + error |= clSetKernelArg(kernel, 2, sizeof(int), &num_height); + error |= clSetKernelArg(kernel, 3, sizeof(int), &num_count); + error |= clSetKernelArg(kernel, 4, sizeof(cl_mem), &memObject2); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &num_width); - error |= clSetKernelArg(kernel, 2, sizeof(int), &num_height); - error |= clSetKernelArg(kernel, 3, sizeof(int), &num_count); - error |= clSetKernelArg(kernel, 4, sizeof(cl_mem), &memObject2); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { lines }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(unsigned char), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + } - //执行内核 - size_t globalWorkSize[1] = { lines }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + throw st; } - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(unsigned char), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); } -void OpenCLExcuter::splitL2RowData(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int lines, +void OpenCLExcuter::splitL2RowData(cv::Mat img, int* rowIndexs, int lines, int* result) { kernel = clCreateKernel(program, "splitL2RowData", &error); @@ -768,13 +932,13 @@ } - int inputSize = imgWidth * imgHeight; + int inputSize = img.cols * img.rows; int resultSize = lines * 7 * 4; //创建缓存对象 - cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error); + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, img.data, &error); if (error < 0) { throw string("Creat memObject1 failed!\n"); } @@ -791,41 +955,50 @@ throw string("Creat memObject3 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(int), &img.cols); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { lines }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); } - //执行内核 - size_t globalWorkSize[1] = { lines }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); - } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + throw st; } //printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]); - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); + } @@ -862,43 +1035,52 @@ throw string("Creat memObject3 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); + error |= clSetKernelArg(kernel, 3, sizeof(int), &fromIndex); + error |= clSetKernelArg(kernel, 4, sizeof(int), &toIndex); + error |= clSetKernelArg(kernel, 5, sizeof(cl_mem), &memObject3); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); - error |= clSetKernelArg(kernel, 3, sizeof(int), &fromIndex); - error |= clSetKernelArg(kernel, 4, sizeof(int), &toIndex); - error |= clSetKernelArg(kernel, 5, sizeof(cl_mem), &memObject3); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { lines }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); } - //执行内核 - size_t globalWorkSize[1] = { lines }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); - } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + throw st; } //printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]); - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); + } void OpenCLExcuter::recognitionNotNum(unsigned char* imgs, int imgWidth, int imgHeight, int* rowIndexs, int colCount, int lines, @@ -936,41 +1118,50 @@ throw string("Creat memObject3 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { resultSize }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); } - //执行内核 - size_t globalWorkSize[1] = { resultSize }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); - } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + throw st; } //printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]); - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); + } @@ -1011,44 +1202,53 @@ throw string("Creat memObject3 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); + error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 2, sizeof(int), &imgWidth); - error |= clSetKernelArg(kernel, 3, sizeof(cl_mem), &memObject3); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { resultSize }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); } - //执行内核 - size_t globalWorkSize[1] = { resultSize }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); - } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject3, CL_TRUE, 0, resultSize * sizeof(int), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + clReleaseMemObject(memObject3); + throw st; } //printf("%d %d %d %d \n", result[0], result[1], result[2], result[3]); - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); - clReleaseMemObject(memObject3); + } -void OpenCLExcuter::rgb2Gray(unsigned char* imgs, int imgWidth, int imgHeight, +void OpenCLExcuter::rgb2Gray(cv::Mat img, unsigned char* result) { kernel = clCreateKernel(program, "rgb2GrayImg", &error); @@ -1057,13 +1257,13 @@ } - int inputSize = imgWidth * imgHeight * 3; - int resultSize = imgWidth * imgHeight; + int inputSize = img.cols * img.rows * 3; + int resultSize = img.cols * img.rows; //创建缓存对象 - cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error); + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, img.data, &error); if (error < 0) { throw string("Creat memObject1 failed!\n"); } @@ -1075,41 +1275,49 @@ } - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); - error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + try { - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &img.cols); + error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { img.rows }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); } - //执行内核 - size_t globalWorkSize[1] = { imgHeight }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + throw st; } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); } -void OpenCLExcuter::rgba2Gray(unsigned char* imgs, int imgWidth, int imgHeight, +void OpenCLExcuter::rgba2Gray(cv::Mat img, unsigned char* result) { kernel = clCreateKernel(program, "rgba2GrayImg", &error); @@ -1118,13 +1326,13 @@ } - int inputSize = imgWidth * imgHeight * 4; - int resultSize = imgWidth * imgHeight; + int inputSize = img.cols * img.rows * 4; + int resultSize = img.cols * img.rows; //创建缓存对象 - cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, imgs, &error); + cl_mem memObject1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(uchar) * inputSize, img.data, &error); if (error < 0) { throw string("Creat memObject1 failed!\n"); } @@ -1135,37 +1343,47 @@ throw string("Creat memObject2 failed!\n"); } + try { - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); - error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &img.cols); + error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { img.rows }; + size_t localWorkSize[1] = { 1 }; + + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); } - //执行内核 - size_t globalWorkSize[1] = { imgHeight }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + throw st; } - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); + } @@ -1199,38 +1417,45 @@ } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); + error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); - error |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { imgHeight }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); } - //执行内核 - size_t globalWorkSize[1] = { imgHeight }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + throw st; } - - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); } @@ -1261,38 +1486,45 @@ throw string("Creat memObject2 failed!\n"); } + try { + //设置内核参数 + error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); + error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); + error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); + error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold); - //设置内核参数 - error = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObject1); - error |= clSetKernelArg(kernel, 1, sizeof(int), &imgWidth); - error = clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObject2); - error |= clSetKernelArg(kernel, 3, sizeof(int), &threadhold); + if (error != CL_SUCCESS) { + throw string("Error setting kernel arguments!\n"); + } + //执行内核 + size_t globalWorkSize[1] = { imgHeight }; + size_t localWorkSize[1] = { 1 }; - if (error != CL_SUCCESS) { - throw string("Error setting kernel arguments!\n"); + const int work_dim = 1; + + error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, + localWorkSize, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error queuing kernel for execution!\n"); + } + + //读取执行结果 + error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), + result, 0, NULL, NULL); + if (error != CL_SUCCESS) { + throw string("Error reading result buffer!\n"); + } + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); } - //执行内核 - size_t globalWorkSize[1] = { imgHeight }; - size_t localWorkSize[1] = { 1 }; - - const int work_dim = 1; - - error = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, globalWorkSize, - localWorkSize, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error queuing kernel for execution!\n"); + catch (string st) { + clReleaseKernel(kernel); + clReleaseMemObject(memObject1); + clReleaseMemObject(memObject2); + throw st; } - //读取执行结果 - error = clEnqueueReadBuffer(queue, memObject2, CL_TRUE, 0, resultSize * sizeof(uchar), - result, 0, NULL, NULL); - if (error != CL_SUCCESS) { - throw string("Error reading result buffer!\n"); - } - - clReleaseKernel(kernel); - clReleaseMemObject(memObject1); - clReleaseMemObject(memObject2); } -- Gitblit v1.8.0