하는 모습이 코드를 가지고.
imageI= clCreateImage2D(context,CL_MEM_READ_ONLY,&format,img.cols,img.rows,0,0,&err);
CHECK_CL_ERROR(err);
err = clEnqueueWriteImage(queue,imageI,CL_TRUE,origin,region,img.cols*sizeof(uchar),0,img.data,0,NULL,NULL);
CHECK_CL_ERROR(err);
imageJ= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err);
CHECK_CL_ERROR(err);
err = clEnqueueWriteImage(queue,imageJ,CL_TRUE,origin,region,img.cols*sizeof(uchar),0,img.data,0,NULL,NULL);
CHECK_CL_ERROR(err);
cl_kernel gauss = clCreateKernel(program, "gauss",&err);
CHECK_CL_ERROR(err);
err = clSetKernelArg(gauss, 0, sizeof(cl_mem), (void*)&imageI);
CHECK_CL_ERROR(err);
err = clSetKernelArg(gauss, 1, sizeof(cl_mem), (void*)&imageJ);
CHECK_CL_ERROR(err);
err = clEnqueueNDRangeKernel(queue,gauss,2,NULL,szGlobalWorkSize,szLocalWorkSize,0,NULL,&event);
CHECK_CL_ERROR(err);
를 GPU 메모리의 덩어리를 조작하는 그리고 지금은 다른 커널로 ImageJ에 전송.
Gradient= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err);
CHECK_CL_ERROR(err);
Angle= clCreateImage2D(context,CL_MEM_READ_WRITE,&format,img.cols,img.rows,0,0,&err);
CHECK_CL_ERROR(err);
cl_kernel sobel = clCreateKernel(program, "sobel",&err);
CHECK_CL_ERROR(err);
err = clSetKernelArg(sobel, 0, sizeof(cl_mem), (void*)&imageJ);
CHECK_CL_ERROR(err);
err = clSetKernelArg(sobel, 1, sizeof(cl_mem), (void*)&Gradient);
CHECK_CL_ERROR(err);
err = clSetKernelArg(sobel, 2, sizeof(cl_mem), (void*)&Angle);
CHECK_CL_ERROR(err);
err = clEnqueueNDRangeKernel(queue,sobel,2,NULL,szGlobalWorkSize,szLocalWorkSize,0,NULL,&event);
CHECK_CL_ERROR(err);
CPU를 절대 통과하지 마십시오.