Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
b705e0d8
Commit
b705e0d8
authored
Aug 27, 2013
by
Vladislav Vinogradov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
used new device layer for cv::gpu::sum
parent
9fe92e21
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
27 additions
and
140 deletions
+27
-140
sum.cu
modules/cudaarithm/src/cuda/sum.cu
+0
-0
reductions.cpp
modules/cudaarithm/src/reductions.cpp
+0
-131
CMakeLists.txt
modules/cudev/CMakeLists.txt
+1
-1
reduce.hpp
modules/cudev/include/opencv2/cudev/grid/detail/reduce.hpp
+3
-6
reduce.hpp
modules/cudev/include/opencv2/cudev/grid/reduce.hpp
+8
-0
vec_math.hpp
modules/cudev/include/opencv2/cudev/util/vec_math.hpp
+15
-2
No files found.
modules/cudaarithm/src/cuda/sum.cu
View file @
b705e0d8
This diff is collapsed.
Click to expand it.
modules/cudaarithm/src/reductions.cpp
View file @
b705e0d8
...
...
@@ -186,137 +186,6 @@ double cv::cuda::norm(InputArray _src1, InputArray _src2, GpuMat& buf, int normT
return
retVal
;
}
////////////////////////////////////////////////////////////////////////
// Sum
namespace
sum
{
void
getBufSize
(
int
cols
,
int
rows
,
int
cn
,
int
&
bufcols
,
int
&
bufrows
);
template
<
typename
T
,
int
cn
>
void
run
(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
template
<
typename
T
,
int
cn
>
void
runAbs
(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
template
<
typename
T
,
int
cn
>
void
runSqr
(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
}
Scalar
cv
::
cuda
::
sum
(
InputArray
_src
,
InputArray
_mask
,
GpuMat
&
buf
)
{
GpuMat
src
=
_src
.
getGpuMat
();
GpuMat
mask
=
_mask
.
getGpuMat
();
typedef
void
(
*
func_t
)(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
static
const
func_t
funcs
[
7
][
5
]
=
{
{
0
,
::
sum
::
run
<
uchar
,
1
>
,
::
sum
::
run
<
uchar
,
2
>
,
::
sum
::
run
<
uchar
,
3
>
,
::
sum
::
run
<
uchar
,
4
>
},
{
0
,
::
sum
::
run
<
schar
,
1
>
,
::
sum
::
run
<
schar
,
2
>
,
::
sum
::
run
<
schar
,
3
>
,
::
sum
::
run
<
schar
,
4
>
},
{
0
,
::
sum
::
run
<
ushort
,
1
>
,
::
sum
::
run
<
ushort
,
2
>
,
::
sum
::
run
<
ushort
,
3
>
,
::
sum
::
run
<
ushort
,
4
>
},
{
0
,
::
sum
::
run
<
short
,
1
>
,
::
sum
::
run
<
short
,
2
>
,
::
sum
::
run
<
short
,
3
>
,
::
sum
::
run
<
short
,
4
>
},
{
0
,
::
sum
::
run
<
int
,
1
>
,
::
sum
::
run
<
int
,
2
>
,
::
sum
::
run
<
int
,
3
>
,
::
sum
::
run
<
int
,
4
>
},
{
0
,
::
sum
::
run
<
float
,
1
>
,
::
sum
::
run
<
float
,
2
>
,
::
sum
::
run
<
float
,
3
>
,
::
sum
::
run
<
float
,
4
>
},
{
0
,
::
sum
::
run
<
double
,
1
>
,
::
sum
::
run
<
double
,
2
>
,
::
sum
::
run
<
double
,
3
>
,
::
sum
::
run
<
double
,
4
>
}
};
CV_Assert
(
mask
.
empty
()
||
(
mask
.
type
()
==
CV_8UC1
&&
mask
.
size
()
==
src
.
size
())
);
if
(
src
.
depth
()
==
CV_64F
)
{
if
(
!
deviceSupports
(
NATIVE_DOUBLE
))
CV_Error
(
cv
::
Error
::
StsUnsupportedFormat
,
"The device doesn't support double"
);
}
Size
buf_size
;
::
sum
::
getBufSize
(
src
.
cols
,
src
.
rows
,
src
.
channels
(),
buf_size
.
width
,
buf_size
.
height
);
ensureSizeIsEnough
(
buf_size
,
CV_8U
,
buf
);
buf
.
setTo
(
Scalar
::
all
(
0
));
const
func_t
func
=
funcs
[
src
.
depth
()][
src
.
channels
()];
double
result
[
4
];
func
(
src
,
buf
.
data
,
result
,
mask
);
return
Scalar
(
result
[
0
],
result
[
1
],
result
[
2
],
result
[
3
]);
}
Scalar
cv
::
cuda
::
absSum
(
InputArray
_src
,
InputArray
_mask
,
GpuMat
&
buf
)
{
GpuMat
src
=
_src
.
getGpuMat
();
GpuMat
mask
=
_mask
.
getGpuMat
();
typedef
void
(
*
func_t
)(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
static
const
func_t
funcs
[
7
][
5
]
=
{
{
0
,
::
sum
::
runAbs
<
uchar
,
1
>
,
::
sum
::
runAbs
<
uchar
,
2
>
,
::
sum
::
runAbs
<
uchar
,
3
>
,
::
sum
::
runAbs
<
uchar
,
4
>
},
{
0
,
::
sum
::
runAbs
<
schar
,
1
>
,
::
sum
::
runAbs
<
schar
,
2
>
,
::
sum
::
runAbs
<
schar
,
3
>
,
::
sum
::
runAbs
<
schar
,
4
>
},
{
0
,
::
sum
::
runAbs
<
ushort
,
1
>
,
::
sum
::
runAbs
<
ushort
,
2
>
,
::
sum
::
runAbs
<
ushort
,
3
>
,
::
sum
::
runAbs
<
ushort
,
4
>
},
{
0
,
::
sum
::
runAbs
<
short
,
1
>
,
::
sum
::
runAbs
<
short
,
2
>
,
::
sum
::
runAbs
<
short
,
3
>
,
::
sum
::
runAbs
<
short
,
4
>
},
{
0
,
::
sum
::
runAbs
<
int
,
1
>
,
::
sum
::
runAbs
<
int
,
2
>
,
::
sum
::
runAbs
<
int
,
3
>
,
::
sum
::
runAbs
<
int
,
4
>
},
{
0
,
::
sum
::
runAbs
<
float
,
1
>
,
::
sum
::
runAbs
<
float
,
2
>
,
::
sum
::
runAbs
<
float
,
3
>
,
::
sum
::
runAbs
<
float
,
4
>
},
{
0
,
::
sum
::
runAbs
<
double
,
1
>
,
::
sum
::
runAbs
<
double
,
2
>
,
::
sum
::
runAbs
<
double
,
3
>
,
::
sum
::
runAbs
<
double
,
4
>
}
};
CV_Assert
(
mask
.
empty
()
||
(
mask
.
type
()
==
CV_8UC1
&&
mask
.
size
()
==
src
.
size
())
);
if
(
src
.
depth
()
==
CV_64F
)
{
if
(
!
deviceSupports
(
NATIVE_DOUBLE
))
CV_Error
(
cv
::
Error
::
StsUnsupportedFormat
,
"The device doesn't support double"
);
}
Size
buf_size
;
::
sum
::
getBufSize
(
src
.
cols
,
src
.
rows
,
src
.
channels
(),
buf_size
.
width
,
buf_size
.
height
);
ensureSizeIsEnough
(
buf_size
,
CV_8U
,
buf
);
buf
.
setTo
(
Scalar
::
all
(
0
));
const
func_t
func
=
funcs
[
src
.
depth
()][
src
.
channels
()];
double
result
[
4
];
func
(
src
,
buf
.
data
,
result
,
mask
);
return
Scalar
(
result
[
0
],
result
[
1
],
result
[
2
],
result
[
3
]);
}
Scalar
cv
::
cuda
::
sqrSum
(
InputArray
_src
,
InputArray
_mask
,
GpuMat
&
buf
)
{
GpuMat
src
=
_src
.
getGpuMat
();
GpuMat
mask
=
_mask
.
getGpuMat
();
typedef
void
(
*
func_t
)(
PtrStepSzb
src
,
void
*
buf
,
double
*
sum
,
PtrStepSzb
mask
);
static
const
func_t
funcs
[
7
][
5
]
=
{
{
0
,
::
sum
::
runSqr
<
uchar
,
1
>
,
::
sum
::
runSqr
<
uchar
,
2
>
,
::
sum
::
runSqr
<
uchar
,
3
>
,
::
sum
::
runSqr
<
uchar
,
4
>
},
{
0
,
::
sum
::
runSqr
<
schar
,
1
>
,
::
sum
::
runSqr
<
schar
,
2
>
,
::
sum
::
runSqr
<
schar
,
3
>
,
::
sum
::
runSqr
<
schar
,
4
>
},
{
0
,
::
sum
::
runSqr
<
ushort
,
1
>
,
::
sum
::
runSqr
<
ushort
,
2
>
,
::
sum
::
runSqr
<
ushort
,
3
>
,
::
sum
::
runSqr
<
ushort
,
4
>
},
{
0
,
::
sum
::
runSqr
<
short
,
1
>
,
::
sum
::
runSqr
<
short
,
2
>
,
::
sum
::
runSqr
<
short
,
3
>
,
::
sum
::
runSqr
<
short
,
4
>
},
{
0
,
::
sum
::
runSqr
<
int
,
1
>
,
::
sum
::
runSqr
<
int
,
2
>
,
::
sum
::
runSqr
<
int
,
3
>
,
::
sum
::
runSqr
<
int
,
4
>
},
{
0
,
::
sum
::
runSqr
<
float
,
1
>
,
::
sum
::
runSqr
<
float
,
2
>
,
::
sum
::
runSqr
<
float
,
3
>
,
::
sum
::
runSqr
<
float
,
4
>
},
{
0
,
::
sum
::
runSqr
<
double
,
1
>
,
::
sum
::
runSqr
<
double
,
2
>
,
::
sum
::
runSqr
<
double
,
3
>
,
::
sum
::
runSqr
<
double
,
4
>
}
};
CV_Assert
(
mask
.
empty
()
||
(
mask
.
type
()
==
CV_8UC1
&&
mask
.
size
()
==
src
.
size
())
);
if
(
src
.
depth
()
==
CV_64F
)
{
if
(
!
deviceSupports
(
NATIVE_DOUBLE
))
CV_Error
(
cv
::
Error
::
StsUnsupportedFormat
,
"The device doesn't support double"
);
}
Size
buf_size
;
::
sum
::
getBufSize
(
src
.
cols
,
src
.
rows
,
src
.
channels
(),
buf_size
.
width
,
buf_size
.
height
);
ensureSizeIsEnough
(
buf_size
,
CV_8U
,
buf
);
buf
.
setTo
(
Scalar
::
all
(
0
));
const
func_t
func
=
funcs
[
src
.
depth
()][
src
.
channels
()];
double
result
[
4
];
func
(
src
,
buf
.
data
,
result
,
mask
);
return
Scalar
(
result
[
0
],
result
[
1
],
result
[
2
],
result
[
3
]);
}
////////////////////////////////////////////////////////////////////////
// minMax
...
...
modules/cudev/CMakeLists.txt
View file @
b705e0d8
...
...
@@ -4,7 +4,7 @@ endif()
set
(
the_description
"CUDA device layer"
)
ocv_warnings_disable
(
CMAKE_CXX_FLAGS /wd4189 /wd4505 -Wundef -Wmissing-declarations -Wunused-function -Wunused-variable
)
ocv_warnings_disable
(
CMAKE_CXX_FLAGS /wd4189 /wd4505 -Wundef -Wmissing-declarations -Wunused-function -Wunused-variable
-Wenum-compare
)
ocv_add_module
(
cudev
)
...
...
modules/cudev/include/opencv2/cudev/grid/detail/reduce.hpp
View file @
b705e0d8
...
...
@@ -418,9 +418,7 @@ namespace grid_reduce_detail
const
dim3
block
(
Policy
::
block_size_x
,
Policy
::
block_size_y
);
const
dim3
grid
(
divUp
(
cols
,
block
.
x
*
Policy
::
patch_size_x
),
divUp
(
rows
,
block
.
y
*
Policy
::
patch_size_y
));
const
int
BLOCK_SIZE
=
Policy
::
block_size_x
*
Policy
::
block_size_y
;
glob_reduce
<
Reductor
,
BLOCK_SIZE
,
Policy
::
patch_size_x
,
Policy
::
patch_size_y
><<<
grid
,
block
,
0
,
stream
>>>
(
src
,
result
,
mask
,
rows
,
cols
);
glob_reduce
<
Reductor
,
Policy
::
block_size_x
*
Policy
::
block_size_y
,
Policy
::
patch_size_x
,
Policy
::
patch_size_y
><<<
grid
,
block
,
0
,
stream
>>>
(
src
,
result
,
mask
,
rows
,
cols
);
CV_CUDEV_SAFE_CALL
(
cudaGetLastError
()
);
if
(
stream
==
0
)
...
...
@@ -433,10 +431,9 @@ namespace grid_reduce_detail
__host__
void
sum
(
const
SrcPtr
&
src
,
ResType
*
result
,
const
MaskPtr
&
mask
,
int
rows
,
int
cols
,
cudaStream_t
stream
)
{
typedef
typename
PtrTraits
<
SrcPtr
>::
value_type
src_type
;
const
int
cn
=
VecTraits
<
src_type
>::
cn
;
typedef
typename
MakeVec
<
ResType
,
cn
>::
type
work_type
;
typedef
typename
VecTraits
<
ResType
>::
elem_type
res_elem_type
;
glob_reduce
<
SumReductor
<
src_type
,
work_type
>
,
Policy
>
(
src
,
result
,
mask
,
rows
,
cols
,
stream
);
glob_reduce
<
SumReductor
<
src_type
,
ResType
>
,
Policy
>
(
src
,
(
res_elem_type
*
)
result
,
mask
,
rows
,
cols
,
stream
);
}
template
<
class
Policy
,
class
SrcPtr
,
typename
ResType
,
class
MaskPtr
>
...
...
modules/cudev/include/opencv2/cudev/grid/reduce.hpp
View file @
b705e0d8
...
...
@@ -59,6 +59,10 @@ namespace cv { namespace cudev {
template
<
class
Policy
,
class
SrcPtr
,
typename
ResType
,
class
MaskPtr
>
__host__
void
gridCalcSum_
(
const
SrcPtr
&
src
,
GpuMat_
<
ResType
>&
dst
,
const
MaskPtr
&
mask
,
Stream
&
stream
=
Stream
::
Null
())
{
typedef
typename
PtrTraits
<
SrcPtr
>::
value_type
src_type
;
CV_StaticAssert
(
VecTraits
<
src_type
>::
cn
==
VecTraits
<
ResType
>::
cn
,
""
);
dst
.
create
(
1
,
1
);
dst
.
setTo
(
0
,
stream
);
...
...
@@ -77,6 +81,10 @@ __host__ void gridCalcSum_(const SrcPtr& src, GpuMat_<ResType>& dst, const MaskP
template
<
class
Policy
,
class
SrcPtr
,
typename
ResType
>
__host__
void
gridCalcSum_
(
const
SrcPtr
&
src
,
GpuMat_
<
ResType
>&
dst
,
Stream
&
stream
=
Stream
::
Null
())
{
typedef
typename
PtrTraits
<
SrcPtr
>::
value_type
src_type
;
CV_StaticAssert
(
VecTraits
<
src_type
>::
cn
==
VecTraits
<
ResType
>::
cn
,
""
);
dst
.
create
(
1
,
1
);
dst
.
setTo
(
0
,
stream
);
...
...
modules/cudev/include/opencv2/cudev/util/vec_math.hpp
View file @
b705e0d8
...
...
@@ -194,10 +194,23 @@ CV_CUDEV_IMPLEMENT_VEC_UNARY_OP(~, uint, uint)
return VecTraits<output_type ## 4>::make(func (a.x), func (a.y), func (a.z), func (a.w)); \
}
namespace
vec_math_detail
{
__device__
__forceinline__
schar
abs_
(
schar
val
)
{
return
(
schar
)
::
abs
((
int
)
val
);
}
__device__
__forceinline__
short
abs_
(
short
val
)
{
return
(
short
)
::
abs
((
int
)
val
);
}
}
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
/*::abs*/
,
uchar
,
uchar
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
::
abs
,
char
,
char
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
vec_math_detail
::
abs_
,
char
,
char
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
/*::abs*/
,
ushort
,
ushort
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
::
abs
,
short
,
short
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
vec_math_detail
::
abs_
,
short
,
short
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
::
abs
,
int
,
int
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
/*::abs*/
,
uint
,
uint
)
CV_CUDEV_IMPLEMENT_VEC_UNARY_FUNC
(
abs
,
::
fabsf
,
float
,
float
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment