OpenCL共享内存访问

时间:2011-03-02 10:35:25

标签: c opencl gpu

我正在为我的应用程序使用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

由于

2 个答案:

答案 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。