Size OpenCL Ndrange全局大小/本地大小

Size OpenCL Ndrange全局大小/本地大小,size,opencl,global,local,Size,Opencl,Global,Local,我试图用霍夫变换在二值图像中检测一个圆。 NDrangekernel中的局部和全局工作大小问题我不知道需要什么优化值 全局工作大小将维度进程映像的值放入512*512 本地工作大小当输入值为1、8或16时,程序运行正常 但当将值更改为32或64时,编译正常,程序在执行时运行得更快,但不会导致[]中累加器的输出 图像的大小为512*512 size_t szGlobalWorkSize[2]={img.cols,img.rows}; size_t szLocalWorkSize[2]={16,16

我试图用霍夫变换在二值图像中检测一个圆。 NDrangekernel中的局部和全局工作大小问题我不知道需要什么优化值 全局工作大小将维度进程映像的值放入512*512 本地工作大小当输入值为1、8或16时,程序运行正常 但当将值更改为32或64时,编译正常,程序在执行时运行得更快,但不会导致[]中累加器的输出

图像的大小为512*512
size_t szGlobalWorkSize[2]={img.cols,img.rows}; size_t szLocalWorkSize[2]={16,16}

     clEnqueueNDRangeKernel(clCommandQueue,hough_circle,2,NULL,szGlobalWorkSize,szLoc‌alWorkSize,0,NULL,&event);​ 
内核代码是:

 kernel void hough_circle(read_only image2d_t imageIn, global int* in,const int w_hough)
{
       sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE |         CLK_FILTER_NEAREST;
      int gid0 = get_global_id(0);
      int gid1 = get_global_id(1);
     uint4 pixel;
      pixel=read_imageui(imageIn,sampler,(int2)(gid0,gid1));
     if(pixel.x==255)
     {
   for(int r=90;r<110;r+=1)
        {
           for(int theta=0; theta<360;theta++)
              {
        x0=(int) round(gid0-r*sin_parameter[theta] );
        y0=(int) round(gid1-r*cos_parameter[theta] );
                if((x0>0) && (x0<get_global_size(0)) && (y0>0)&&(y0<get_global_size(1)))

                 atom_inc(&in[w_hough*y0+x0]);
               }
         }

     }

}
kernel void hough\u circle(只读image2d\t imageIn、全局int*in、常量int w\u hough)
{
取样器t取样器=CLK_归一化_坐标_假| CLK_地址| CLP_到|边缘| CLK_过滤器|;
int gid0=获取全局id(0);
int gid1=获取全局id(1);
uint4像素;
像素=read_imageui(imageIn,采样器,(int2)(gid0,gid1));
如果(像素x==255)
{
对于(int r=90;r两件事:

  • 您不能将本地设备最大工作项大小设置为任意大。对于CL设备最大工作项大小,每个维度必须小于或等于clGetDeviceInfo,对于CL设备最大工作组大小,所有维度的乘积必须小于或等于clGetDeviceInfo。对于某些GPU,这是128,因此对于某些硬件,16x16甚至太大。32x32是大多数GPU都不行

  • 如果指定本地工作大小,则全局工作大小必须是本地工作大小的整数倍(如果在OpenCL 1.x上)


  • 谢谢CL_DEVICE_MAX_WORK_ITEM_SIZE:256 256 CL_DEVICE_MAX_WORK_GROUP_SIZE:256如果我可以问一个问题,本地工作大小16*16或64*4之间是否有任何区别不特别重要,但这取决于您的数据布局。如果您正在读取图像,16x16可能获得更好的局部性,因此纹理缓存;但是,如果您正在读取如果使用缓冲区,64x4(或运行256项的1D内核)可能会更好。