我对我的应用程序使用openCL,并希望知道如何在第一次返回该函数后保留GPU上的内存。 即。 发送100b到GPU做一些数学运算,返回另一个100b,并保留与GPU相同的100b,这样我就不需要将它发送给CPU,然后在下一次迭代中返回到GPU。OpenCL-共享内存访问
例如,
发送= {1,2,3}
kernel__计算值的B = A + 1,所以B = {2,3,4} 下一次我调用一些FN。它必须返回(3,4,5},我想这样做没有转移到CPU再回到GPU
感谢
我对我的应用程序使用openCL,并希望知道如何在第一次返回该函数后保留GPU上的内存。 即。 发送100b到GPU做一些数学运算,返回另一个100b,并保留与GPU相同的100b,这样我就不需要将它发送给CPU,然后在下一次迭代中返回到GPU。OpenCL-共享内存访问
例如,
发送= {1,2,3}
kernel__计算值的B = A + 1,所以B = {2,3,4} 下一次我调用一些FN。它必须返回(3,4,5},我想这样做没有转移到CPU再回到GPU
感谢
把你想成CL缓冲(cl_mem)的数据,该抽象允许您操作GPU内存块。
看看这段代码。
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);
,现在我的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。