-
Notifications
You must be signed in to change notification settings - Fork 0
/
sobel_kernels.cu
121 lines (104 loc) · 3.18 KB
/
sobel_kernels.cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include "config.h"
#include "headers.h"
#include "test_cases.h"
__device__ uchar compute_sobel(uchar tl, //top left
uchar tm, //top middle
uchar tr, //top right
uchar ml, //middle left
uchar mr, //middle right
uchar bl, //bottom left
uchar bm, //bottom middle
uchar br, //bottom right
float norm)
{
short horz = tl + 2 * tm + tr - br - 2 * bm - bl;
short vert = tl + 2 * ml + bl - tr - 2 * mr - br;
short all = (short)(norm * float(fabsf(horz) + fabsf(vert)));
if(all < 0)
all = 0;
if(all > 0xff)
all = 0xff;
return all;
}
__device__ void read_write_filter_block(int x, int y,uchar *in, uchar *out,uint width,float norm)
{
uchar value = compute_sobel(in[PXL_ID(x,y,width)],
in[PXL_ID(x,y+1,width)],
in[PXL_ID(x,y+2,width)],
in[PXL_ID(x+1,y,width)],
in[PXL_ID(x+1,y+2,width)],
in[PXL_ID(x+2,y,width)],
in[PXL_ID(x+2,y+1,width)],
in[PXL_ID(x+2,y+2,width)],
norm);
out[PXL_ID(x+1,y+1,width)] = value;
}
__global__ void kernel_sobel_filter_coalesc(uchar *in, uchar *out,uint width, uint height,uint pxl_p_thd,float norm)
{
int x = blockIdx.x*BATCH_W + threadIdx.x - RAD;
int y = blockIdx.y*BATCH_H + threadIdx.y - RAD;
if(x >= 0 && y >= 0 && y < height)
{
for(int ix = x; ix < width; ix += blockDim.x)
{
read_write_filter_block(ix,y,in,out,width,norm);
}
}
}
__global__ void kernel_sobel_filter_non_coalesc(uchar *in, uchar *out,uint width, uint height,uint pxl_p_thd,float norm)
{
int x = blockIdx.x*BATCH_W + threadIdx.x - RAD;
int y = blockIdx.y*BATCH_H + threadIdx.y - RAD;
if(x >= 0 && y >= 0 && y < height)
{
for(int ix = x * pxl_p_thd; ix < (x+1) * pxl_p_thd; ++ix)
{
if(ix < width)
{
read_write_filter_block(ix,y,in,out,width,norm);
}
}
}
}
void sobel_filter_coalesc(uchar* in, uchar* out,size_t width, size_t height)
{
exec_kernel(in,out,width,height,kernel_sobel_filter_coalesc);
}
void sobel_filter_non_coalesc(uchar* in, uchar* out,size_t width, size_t height)
{
exec_kernel(in,out,width,height,kernel_sobel_filter_non_coalesc);
}
void testSobelOversubStd()
{
std::cout << "Testing oversubscription std\n";
testOversubStd(kernel_sobel_filter_coalesc);
}
void testSobelOversubUM()
{
std::cout << "Testing oversubscription UM naive\n";
testOversubNaiveUM(kernel_sobel_filter_coalesc);
testOversubNaiveUM(kernel_sobel_filter_coalesc,false);
}
void testSobelOversubUMOpt(bool withAdvise)
{
std::cout << "Testing oversubscription UM MultiImg opt "<< withAdvise << std::endl;
testOversubUMOpt(kernel_sobel_filter_coalesc,withAdvise);
}
void testSobelOversubMultiImgStd()
{
std::cout << "Testing oversubscription UM MultiImg Std\n";
testOversubMultiImgStd(kernel_sobel_filter_coalesc);
}
void testSobelStreamUM(bool withAdvise)
{
std::cout << "Testing streams img processing UM " << withAdvise << std::endl;
testStreamImgProcessingUm(kernel_sobel_filter_non_coalesc,"Stream Image Processing UM",200,withAdvise);
}
void testSobelStreamStd()
{
std::cout << "Testing streams img processing Std\n";
testStreamImgProcessingStd(kernel_sobel_filter_non_coalesc);
}