посмотрите этот код.
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);
А теперь я передаю изображение J в другое ядро.
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);
и никогда не проходить через ЦП.