我正在尝试使用霍夫变换检测二进制图像中的圆圈。
执行时内核代码非常慢。原子功能的等待时间
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;
}
}
}
}
任何人都可以帮助我做些什么改变来避免这种情况 rar文件http://www.files.com/set/527152684017e中的代码main.cpp和kernel.cl压缩使用opencv lib进行读取和显示img
答案 0 :(得分:3)
与非原子等价物相比,原子操作本质上非常慢。你不应该在内循环中使用它们。
尝试尽可能多地使用本地内存,并仅使用原子来存储最终结果。
搜索“并行缩减”,因为此变换与缩减有很多共同之处(每个像素的输出是权重之和)。