2011-03-02 189 views
0

我对我的应用程序使用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

感谢

回答

0

把你想成CL缓冲(cl_mem)的数据,该抽象允许您操作GPU内存块。

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。