]> AND Private Git Repository - these_gilles.git/blob - THESE/Chapters/chapter5/code/median3-2pix.cu~
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
diapo v2
[these_gilles.git] / THESE / Chapters / chapter5 / code / median3-2pix.cu~
1 __device__ inline void s(unsigned char * a, unsigned char * b)
2 {
3   
4   unsigned short tmp ;
5   if (*a > *b)
6         {
7           tmp = *b ;
8           *b = *a ;
9           *a = tmp ;
10           }
11 }
12
13 /*********************************************************************
14  *    MACROS pour tri min-max utilisant la fonction de tri s(a,b) 
15  *********************************************************************/
16 #define min3(a, b, c) s(a, b); s(a, c);
17 #define max3(a, b, c) s(b, c); s(a, c);
18 #define minmax3(a, b, c) max3(a, b, c); s(a, b);
19 #define minmax4(a, b, c, d) s(a, b); s(c, d); s(a, c); s(b, d);
20 #define minmax5(a, b, c, d, e) s(a, b); s(c, d); min3(a, c, e); max3(b, d, e);
21 #define minmax6(a, b, c, d, e, f) s(a,d); s(b, e); s(c, f); min3(a, b, c); max3(d, e, f);
22
23 __global__ void kernel_median3_2pix( unsigned short*output, int i_dim, int j_dim)
24 {  
25   // coordonnees absolues du point
26   int j = __mul24(__mul24(blockIdx.x,blockDim.x) + threadIdx.x,2) ; 
27   int i = __mul24(blockIdx.y,blockDim.y) + threadIdx.y ;
28   
29   // registres
30   int a0, a1, a2, a3, a4, a5 ;
31   int b0, b1, b2, b3, b4, b5 ;
32
33   // les six premieres valeurs 
34   a0 = tex2D(tex_img_ins, j  , i-1) ;
35   a1 = tex2D(tex_img_ins, j+1, i-1) ;
36   a2 = tex2D(tex_img_ins, j  , i  ) ;
37   a3 = tex2D(tex_img_ins, j+1, i  ) ;
38   a4 = tex2D(tex_img_ins, j  , i+1) ;
39   a5 = tex2D(tex_img_ins, j+1, i+1) ;
40   
41   //identification des extrema
42   minmax6(&a0, &a1, &a2, &a3, &a4, &a5) ;
43
44   // séparation des processus   
45   b0=a0; b1=a1; b2=a2; b3=a3; b4=a4; b5=a5;
46   
47   // les valeurs suivantes en fin de liste 
48   a5 = tex2D(tex_img_ins, j-1, i  ) ;
49   b5 = tex2D(tex_img_ins, j+2, i  ) ;
50   // identification des extrema
51   minmax5(&a1, &a2, &a3, &a4, &a5) ;
52   minmax5(&b1, &b2, &b3, &b4, &b5) ;
53
54   // les 2 dernières étapes de la sélection
55   a5 = tex2D(tex_img_ins, j-1, i-1) ;
56   b5 = tex2D(tex_img_ins, j+2, i-1) ;
57   minmax4(&a2, &a3, &a4, &a5) ;
58   minmax4(&b2, &b3, &b4, &b5) ;
59   a5 = tex2D(tex_img_ins, j-1, i+1) ;
60   b5 = tex2D(tex_img_ins, j+2, i+1) ;
61   minmax3(&a3, &a4, &a5) ;
62   minmax3(&b3, &b4, &b5) ;
63   
64   // les medians sont en position milieu
65   // on sort les 2 valeurs à la suite 
66   output[ __mul24(i, j_dim) +j ] = a4 ;
67   output[ __mul24(i, j_dim) +j+1 ] = b4 ;
68  
69 }
70