0

我正在尝试使用霍夫变换检测二进制图像中的圆圈。

内核代码在执行时非常慢。原子函数的等待时间

kernel void hough_circle(read_only image2d_t imageIn, global int* in,const int w_hough,__global        int * circle)
 {
 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;
 int x0=0,y0=0,r;
 int maxval=0;
 pixel=read_imageui(imageIn,sampler,(int2)(gid0,gid1));
 if(pixel.x==255)
 {
 for(int r=20;r<150;r+=2)
 {
// int r=100;

          for(int theta=0; theta<360;theta+=2)
          {

                          x0=(int) round(gid0-r*cos( (float) radians( (float) theta) ));
                        y0=(int) round(gid1-r*sin( (float) radians( (float) theta) ));
                       if((x0>0) && (x0<get_global_size(0)) && (y0>0)&&(y0<get_global_size(1)))
                        atom_inc(&in[w_hough*y0+x0]);
          }
          if(maxval<in[w_hough*y0+x0])
          {
          maxval=in[w_hough*y0+x0];
            circle[0]=gid0;
            circle[1]=gid1;
            circle[2]=r;
          }

          }

 }

}

任何人都可以帮我做些什么来避免代码 main.cpp 和 kernel.cl 压缩在 rar 文件http://www.files.com/set/527152684017e使用 opencv lib 读取和显示 img

4

1 回答 1

3

与非原子等价物相比,原子操作本质上非常慢。您不应该在内部循环中使用它们。

尽可能多地使用本地内存,并且只使用原子来存储最终结果。

搜索“并行归约”,因为这种变换与归约有很多共同点(每个像素的输出是权重的总和)。

于 2013-11-04T04:58:06.440 回答