我正在尝试使用霍夫变换检测二进制图像中的圆圈。 并在此处发布我的问题Hough Transform: improving algorithm efficiency over OpenCL
执行时内核代码非常慢。在原子功能中的等待时间,我尝试使用本地内存,这是更快,但在[]输出累加器的问题 内核代码
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);
const int nWidth = get_local_size(0);
int i = get_group_id(0);
int j = get_group_id(1);
int idX = get_local_id(0);
int idY = get_local_id(1);
int ii = i*nWidth + idX;
int jj = j*nWidth + idY;
uint4 pixel;
int x0=0,y0=0,r;
int maxval=0;
local int localImage[25];
localImage[idY*5+idX] = 0;
barrier(CLK_LOCAL_MEM_FENCE);
pixel=read_imageui(imageIn,sampler,(int2)(gid0,gid1));
if(pixel.x==255)
{
// #pragma unroll 20
for(int r=90;r<110;r+=1)
{
// int r=190;
// #pragma unroll 360
for(int theta=0; theta<360;theta++)
{
// x0=(int) round(gid0-r*cos( (float) radians( (float) theta) ));
// y0=(int) round(gid1-r*sin( (float) radians( (float) 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)))
// in[w_hough*y0+x0]++;
localImage[5*y0+x0]++;
// atom_inc(&in[w_hough*y0+x0]);
}
}
}
in[jj*w_hough+ii]= localImage[jj*5+ii];
}
当地人 []中的输出累加器中的问题显示随机值不正确 任何人都可以帮我解决问题我做了什么改变
答案 0 :(得分:0)
本地内存在工作组中共享,所以我想第一个问题是你如何将线程分成工作组?
如果您只是使用clEnqueueNDRangeKernel
中的默认值,那么您可以让OpenCL决定哪个线程可以访问本地内存,并且看似奇怪的事情会发生。
也许您打算使用private
内存?如果是这样,请在声明localImage之前删除local。本地内存的声明类似于global:
__kernel void function(__global float *Input, __local float *WorkgroupBuffer){ }