OpenCL Ndrange全局大小/本地大小

时间:2013-11-08 17:32:24

标签: size opencl global local

我正在尝试使用霍夫变换检测二进制图像中的圆圈。 NDrangekernel中本地和全球工作规模的问题我不知道所需的优化值 global_work_size将维度处理图像的值设为512 * 512 local_work_size当将值1或8或16置为ok时程序运行正常 但是当将值更改为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]);
               }
         }

     }

}

为全球和本地规模选择最佳值的任何帮助

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 你不能使local_work_size任意大。对于CL_DEVICE_MAX_WORK_ITEM_SIZES,每个维度必须小于或等于clGetDeviceInfo,并且所有维度的乘积必须小于或等于CL_DEVICE_MAX_WORK_GROUP_SIZE的clGetDeviceInfo。对于某些GPU来说这是128,因此对于某些硬件来说16x16甚至太大了。 32x32不能在大多数GPU上运行。

  2. 如果指定local_work_size,则global_work_size 必须是local_work_size的整数倍(如果您使用的是OpenCL 1.x)。