/normxcorr/trunk

To get this branch, use:
bzr branch http://suren.me/webbzr/normxcorr/trunk

« back to all changes in this revision

Viewing changes to cuda/local_sum_kernel.cu

  • Committer: Suren A. Chilingaryan
  • Date: 2009-12-02 05:08:22 UTC
  • Revision ID: csa@dside.dyndns.org-20091202050822-n6ouznm1zp2n2i5l
Instead of transfer compute local sums and denormals on board

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
__global__ void transpose1(float *dst, float *src, int width, int height, int step) {
 
2
    __shared__ float data[BLOCK_SIZE_2D][BLOCK_SIZE_2D];
 
3
 
 
4
    int dx = blockIdx.x * blockDim.x;
 
5
    int dy = blockIdx.y * blockDim.y;
 
6
 
 
7
    int x = threadIdx.x + dx;
 
8
    int y = threadIdx.y + dy;
 
9
    
 
10
    data[threadIdx.x][threadIdx.y] = 
 
11
        src[x + step + y*width] - src[x + y*width];
 
12
    
 
13
    __syncthreads();
 
14
 
 
15
    x = threadIdx.x + dy;
 
16
    y = threadIdx.y + dx;
 
17
    
 
18
    dst[x + y*height] = data[threadIdx.y][threadIdx.x];
 
19
}
 
20
 
 
21
 
 
22
__global__ void transpose2(float *lsum, float *denom, float *src1, float *src2, int width, int height, int step) {
 
23
    __shared__ float data1[BLOCK_SIZE_2D][BLOCK_SIZE_2D];
 
24
    __shared__ float data2[BLOCK_SIZE_2D][BLOCK_SIZE_2D];
 
25
 
 
26
    int dx = blockIdx.x * blockDim.x;
 
27
    int dy = blockIdx.y * blockDim.y;
 
28
 
 
29
    int x = threadIdx.x + dx;
 
30
    int y = threadIdx.y + dy;
 
31
    
 
32
    data1[threadIdx.x][threadIdx.y] = 
 
33
        src1[x + step + y*width] - src1[x + y*width];
 
34
 
 
35
    data2[threadIdx.x][threadIdx.y] = 
 
36
        src2[x + step + y*width] - src2[x + y*width];
 
37
    
 
38
    __syncthreads();
 
39
 
 
40
    x = threadIdx.x + dy;
 
41
    y = threadIdx.y + dx;
 
42
    
 
43
    float val1 = data1[threadIdx.y][threadIdx.x];
 
44
    float val2 = data2[threadIdx.y][threadIdx.x];
 
45
    float coef = step * step;
 
46
    
 
47
    if (x < height) {
 
48
        lsum[x + y*height] = val1;
 
49
        denom[x + y*height] = sqrtf(fmaxf((val2 - val1*val1/coef)/(coef - 1) ,0));
 
50
    }
 
51
}