【问题标题】:OpenCL-Shared memory accessOpenCL-共享内存访问
【发布时间】:2011-03-03 00:55:09
【问题描述】:

我正在为我的应用程序使用 openCL,并且想知道在函数第一次返回后如何在 GPU 上保留内存。 IE。 将 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 的情况下执行此操作

谢谢

【问题讨论】:

    标签: c opencl gpu


    【解决方案1】:

    将您想要的数据放入 CL 缓冲区 (cl_mem),这种抽象允许您操作 GPU 内存块。

    【讨论】:

      【解决方案2】:

      看看这段代码。

           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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2018-05-07
        • 1970-01-01
        相关资源
        最近更新 更多