]> AND Private Git Repository - book_gpu.git/blob - BookGPU/Chapters/chapter4/code/convoSepShH.cu
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
preface
[book_gpu.git] / BookGPU / Chapters / chapter4 / code / convoSepShH.cu
1 __global__ void kernel_convoSepShx8pH(unsigned char *output, int j_dim, int r)
2 {
3   int ic, jc, p;
4   int k = 2*r+1 ;
5   float outval0=0.0, outval1=0.0, outval2=0.0, outval3=0.0 ;
6   float outval4=0.0, outval5=0.0, outval6=0.0, outval7=0.0 ;
7   int bdimX = blockDim.x<<3 ; // all packets width
8   int tidX = threadIdx.x<<3 ; // one packet offset 
9     
10   // absolute coordinates of one packet base point
11   int j = (__umul24(blockIdx.x,blockDim.x) + threadIdx.x)<<3 ; 
12   int i = __umul24( blockIdx.y, blockDim.y) + threadIdx.y ;
13   int j0= __umul24(blockIdx.x,blockDim.x)<<3 ;
14   // absolute index in the image
15   int idx = __umul24(i,j_dim) + j ;
16
17   // offset of one ROI row in shared memory
18   int idrow = threadIdx.y*(bdimX+k-1) ;
19   
20   extern __shared__ unsigned char roi8p[];
21
22   // top left block
23   for (p=0; p<8; p++)
24         roi8p[  idrow  + tidX +p ] = tex2D(tex_img_inc, j-r+p  , i) ;
25   // top right block
26   if ( threadIdx.x < r )
27         {
28           roi8p[  idrow + bdimX + threadIdx.x    ] = tex2D( tex_img_inc, j0-r +bdimX+threadIdx.x  , i ) ;
29           roi8p[  idrow + bdimX + threadIdx.x +r ] = tex2D( tex_img_inc, j0   +bdimX+threadIdx.x  , i ) ;
30         }
31   
32   __syncthreads();
33   
34   // horizontal convolution
35   for (jc=0 ; jc<k ; jc++)
36           {
37                 int baseRoi = idrow + tidX +jc ;
38                 float valMask = mask[ jc ] ;
39                 outval0 += valMask*roi8p[  baseRoi    ] ;
40                 outval1 += valMask*roi8p[  baseRoi +1 ] ;
41                 outval2 += valMask*roi8p[  baseRoi +2 ] ;
42                 outval3 += valMask*roi8p[  baseRoi +3 ] ;
43                 outval4 += valMask*roi8p[  baseRoi +4 ] ;
44                 outval5 += valMask*roi8p[  baseRoi +5 ] ;
45                 outval6 += valMask*roi8p[  baseRoi +6 ] ;
46                 outval7 += valMask*roi8p[  baseRoi +7 ] ;
47           }
48         
49   // 8 pixels per thread --> global mem
50   output[ idx++ ] = outval0 ;
51   output[ idx++ ] = outval1 ;
52   output[ idx++ ] = outval2 ;
53   output[ idx++ ] = outval3 ;
54   output[ idx++ ] = outval4 ;
55   output[ idx++ ] = outval5 ;
56   output[ idx++ ] = outval6 ;
57   output[ idx++ ] = outval7 ;
58 }