opencl:原子函数减慢执行时间

opencl:原子函数减慢执行时间,opencl,atomic,Opencl,Atomic,我试图用霍夫变换在二值图像中检测一个圆 内核代码在执行时非常慢。原子函数中的等待时间 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

我试图用霍夫变换在二值图像中检测一个圆

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

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;
          }

          }

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

因为(int r=20;r原子操作本质上比非原子操作慢。你不应该在内部循环中使用它们

尽量使用本地内存,只使用原子存储最终结果


搜索“并行减少”,因为此转换与减少有很多共同之处(每个像素的输出是权重的总和)。

原子操作本质上比非原子操作慢。不应在内部循环中使用它们

尽量使用本地内存,只使用原子存储最终结果


搜索“并行减少”,因为此转换与减少有很多共同之处(每个像素的输出是权重的总和)。

原子操作本质上比非原子操作慢。不应在内部循环中使用它们

尽量使用本地内存,只使用原子存储最终结果


搜索“并行减少”,因为此转换与减少有很多共同之处(每个像素的输出是权重的总和)。

原子操作本质上比非原子操作慢。不应在内部循环中使用它们

尽量使用本地内存,只使用原子存储最终结果


搜索“并行缩减”,因为此转换与缩减有很多共同之处(每个像素的输出是权重的总和)。

我对代码进行了一些更改,而不是在内核中,只有main.cpp i将本地工作大小从1更改为32,用于2个方向。执行速度快20倍,但没有输出[]中的累加器阵列在原子函数中,初始化时保持为零,但如果将本地工作组返回到1,则运行代码会更快。程序正常,并查看hough圆提示:全局工作大小(进程图像的大小)%mod local group size=0映像大小512*512内核在两种情况下不会更改,当本地大小为1和32时,但当1正常时,[]中的累加器中有输出但是当本地大小32 ii对内核以外的代码进行一些更改时,进程非常慢,只有main.cpp i将本地工作大小从1更改为32,用于2个方向。执行速度快20倍,但没有输出[]中的累加器数组在原子函数中,初始化时保持为零,但如果将本地工作组返回到1,则运行代码会更快。程序正常,并查看hough圆提示:全局工作大小(进程图像的大小)%mod local group size=0映像大小512*512内核在两种情况下不会更改,当本地大小为1和32时,但当1正常时,[]中的累加器中有输出但是当本地大小32 ii对内核以外的代码进行一些更改时,进程非常慢,只有main.cpp i将本地工作大小从1更改为32,用于2个方向。执行速度快20倍,但没有输出[]中的累加器数组在原子函数中,初始化时保持为零,但如果将本地工作组返回到1,则运行代码会更快。程序正常,并查看hough圆提示:全局工作大小(进程图像的大小)%mod local group size=0映像大小512*512内核在两种情况下不会更改,当本地大小为1和32时,但当1正常时,[]中的累加器中有输出但是当本地大小32 ii对内核以外的代码进行一些更改时,进程非常慢,只有main.cpp i将本地工作大小从1更改为32,用于2个方向。执行速度快20倍,但没有输出[]中的累加器数组在原子函数中,初始化时保持为零,但如果将本地工作组返回到1,则运行代码会更快。程序正常,并查看hough圆提示:全局工作大小(进程图像的大小)%mod local group size=0映像大小512*512内核在本地大小为1和32的两种情况下不会更改,但当1正常时,[]中的累加器中有输出,但当本地大小为32时,进程非常缓慢