admin
2022-07-22 9adb473067a993b4e0eacf3675baf14b29da3eca
ConsoleApplication/OpenCLExcuter.cpp
@@ -305,6 +305,99 @@
   std::cout << " 耗时:" << (clock() - time_0) << std::endl;
}
void OpenCLExcuter::splitL2NumNew(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_l2_num_new", &error);
   if (kernel == NULL) {
      throw("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("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("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("Creat memObject3 failed!\n");
   }
   cl_mem memObject4 = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
      sizeof(unsigned char) * resultSize, NULL, &error);
   if (error < 0) {
      throw("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("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("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("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("Error reading result buffer!\n");
   }
   clReleaseKernel(kernel);
   clReleaseMemObject(memObject1);
   clReleaseMemObject(memObject2);
   clReleaseMemObject(memObject3);
   clReleaseMemObject(memObject4);
   clReleaseMemObject(memObject5);
   std::cout << " 耗时:" << (clock() - time_0) << std::endl;
}
@@ -980,10 +1073,10 @@
void OpenCLExcuter::rgb2GrayInvert(unsigned char* imgs, int imgWidth, int imgHeight,
void OpenCLExcuter::rgb2ThresholdInvert(unsigned char* imgs, int imgWidth, int imgHeight,
   unsigned char* result) {
   kernel = clCreateKernel(program, "rgb2GrayImgInvert", &error);
   kernel = clCreateKernel(program, "rgb2ThresholdInvert", &error);
   if (kernel == NULL) {
      throw("Couldn't create kernel!\n");
   }
@@ -1041,10 +1134,10 @@
}
void OpenCLExcuter::rgba2GrayInvert(unsigned char* imgs, int imgWidth, int imgHeight,
void OpenCLExcuter::rgba2ThresholdInvert(unsigned char* imgs, int imgWidth, int imgHeight,
   unsigned char* result) {
   kernel = clCreateKernel(program, "rgba2GrayImgInvert", &error);
   kernel = clCreateKernel(program, "rgba2ThresholdInvert", &error);
   if (kernel == NULL) {
      throw("Couldn't create kernel!\n");
   }