我正在为我的应用程序使用openCL,并想知道在第一次返回函数后如何在GPU上保留内存。 即。 发送100b到GPU进行一些数学计算,返回另一个100b并且还保留与GPU相同的100b,这样我就不需要将它发送到CPU然后在下一次迭代中返回到GPU。
例如
发送一个= {1,2,3}
kernel__ calc的b = a + 1,所以b = {2,3,4} 下次我打电话给fn。它必须返回(3,4,5),我想这样做而不转移到CPU然后回到GPU
由于
答案 0 :(得分:0)
将您想要的数据放入CL缓冲区(cl_mem),这种抽象允许您操作GPU内存块。
答案 1 :(得分:0)
看看这段代码。
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。