2013-11-04 63 views
0

我想用hough變換在二值圖像中檢測一個圓。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); 
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和RAR文件http://www.files.com/set/527152684017e使用OpenCV的LIB kernel.cl壓縮讀和顯示img

回答

3

與非原子等價物相比,原子操作本身的性質非常緩慢。你不應該在內部循環中使用它們。

嘗試儘可能多的使用本地內存,只使用原子來存儲最終結果。

搜索「並行縮減」,因爲該轉換與縮減(每個像素的輸出是權重之和)有很多相同之處。

+0

我在代碼中做了一些改變,而不是在內核中,只有main.cpp我將本地工作大小從1更改爲32,對於2方向速度執行時間更快20倍,但沒有在[]中輸出累加器數組[原子函數保持零作爲初始化,但運行代碼更快,如果返回本地工作組爲1程序確定並看到霍夫圈 提示:全局工作大小(過程映像的大小)%mod本地組大小= 0映像大小512 * 512 當本地大小爲1和32時,內核不會改變兩種情況,但當1爲好時,在[]中的累加器中輸出,但在非常慢的過程中當本地大小爲32時,輸出爲 – user2933632