Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
c937e157
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c937e157
编写于
12月 31, 2014
作者:
V
Vadim Pisarevsky
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3555 from ilya-lavrenov:sse_integral
上级
f792fdc3
9436103e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
100 addition
and
0 deletion
+100
-0
modules/imgproc/src/sumpixels.cpp
modules/imgproc/src/sumpixels.cpp
+100
-0
未找到文件。
modules/imgproc/src/sumpixels.cpp
浏览文件 @
c937e157
...
...
@@ -50,6 +50,99 @@ static IppStatus sts = ippInit();
namespace
cv
{
template
<
typename
T
,
typename
ST
,
typename
QT
>
struct
Integral_SIMD
{
bool
operator
()(
const
T
*
,
size_t
,
ST
*
,
size_t
,
QT
*
,
size_t
,
ST
*
,
size_t
,
Size
,
int
)
const
{
return
false
;
}
};
#if CV_SSE2
template
<
>
struct
Integral_SIMD
<
uchar
,
int
,
double
>
{
Integral_SIMD
()
{
haveSSE2
=
checkHardwareSupport
(
CV_CPU_SSE2
);
}
bool
operator
()(
const
uchar
*
src
,
size_t
_srcstep
,
int
*
sum
,
size_t
_sumstep
,
double
*
sqsum
,
size_t
,
int
*
tilted
,
size_t
,
Size
size
,
int
cn
)
const
{
if
(
sqsum
||
tilted
||
cn
!=
1
||
!
haveSSE2
)
return
false
;
// the first iteration
memset
(
sum
,
0
,
(
size
.
width
+
1
)
*
sizeof
(
int
));
__m128i
v_zero
=
_mm_setzero_si128
(),
prev
=
v_zero
;
int
j
=
0
;
// the others
for
(
int
i
=
0
;
i
<
size
.
height
;
++
i
)
{
const
uchar
*
src_row
=
src
+
_srcstep
*
i
;
int
*
prev_sum_row
=
(
int
*
)((
uchar
*
)
sum
+
_sumstep
*
i
)
+
1
;
int
*
sum_row
=
(
int
*
)((
uchar
*
)
sum
+
_sumstep
*
(
i
+
1
))
+
1
;
sum_row
[
-
1
]
=
0
;
prev
=
v_zero
;
j
=
0
;
for
(
;
j
+
7
<
size
.
width
;
j
+=
8
)
{
__m128i
vsuml
=
_mm_loadu_si128
((
const
__m128i
*
)(
prev_sum_row
+
j
));
__m128i
vsumh
=
_mm_loadu_si128
((
const
__m128i
*
)(
prev_sum_row
+
j
+
4
));
__m128i
el8shr0
=
_mm_loadl_epi64
((
const
__m128i
*
)(
src_row
+
j
));
__m128i
el8shr1
=
_mm_slli_si128
(
el8shr0
,
1
);
__m128i
el8shr2
=
_mm_slli_si128
(
el8shr0
,
2
);
__m128i
el8shr3
=
_mm_slli_si128
(
el8shr0
,
3
);
vsuml
=
_mm_add_epi32
(
vsuml
,
prev
);
vsumh
=
_mm_add_epi32
(
vsumh
,
prev
);
__m128i
el8shr12
=
_mm_add_epi16
(
_mm_unpacklo_epi8
(
el8shr1
,
v_zero
),
_mm_unpacklo_epi8
(
el8shr2
,
v_zero
));
__m128i
el8shr03
=
_mm_add_epi16
(
_mm_unpacklo_epi8
(
el8shr0
,
v_zero
),
_mm_unpacklo_epi8
(
el8shr3
,
v_zero
));
__m128i
el8
=
_mm_add_epi16
(
el8shr12
,
el8shr03
);
__m128i
el4h
=
_mm_add_epi16
(
_mm_unpackhi_epi16
(
el8
,
v_zero
),
_mm_unpacklo_epi16
(
el8
,
v_zero
));
vsuml
=
_mm_add_epi32
(
vsuml
,
_mm_unpacklo_epi16
(
el8
,
v_zero
));
vsumh
=
_mm_add_epi32
(
vsumh
,
el4h
);
_mm_storeu_si128
((
__m128i
*
)(
sum_row
+
j
),
vsuml
);
_mm_storeu_si128
((
__m128i
*
)(
sum_row
+
j
+
4
),
vsumh
);
prev
=
_mm_add_epi32
(
prev
,
_mm_shuffle_epi32
(
el4h
,
_MM_SHUFFLE
(
3
,
3
,
3
,
3
)));
}
for
(
int
v
=
sum_row
[
j
-
1
]
-
prev_sum_row
[
j
-
1
];
j
<
size
.
width
;
++
j
)
sum_row
[
j
]
=
(
v
+=
src_row
[
j
])
+
prev_sum_row
[
j
];
}
return
true
;
}
bool
haveSSE2
;
};
#endif
template
<
typename
T
,
typename
ST
,
typename
QT
>
void
integral_
(
const
T
*
src
,
size_t
_srcstep
,
ST
*
sum
,
size_t
_sumstep
,
QT
*
sqsum
,
size_t
_sqsumstep
,
ST
*
tilted
,
size_t
_tiltedstep
,
...
...
@@ -57,6 +150,13 @@ void integral_( const T* src, size_t _srcstep, ST* sum, size_t _sumstep,
{
int
x
,
y
,
k
;
if
(
Integral_SIMD
<
T
,
ST
,
QT
>
()(
src
,
_srcstep
,
sum
,
_sumstep
,
sqsum
,
_sqsumstep
,
tilted
,
_tiltedstep
,
size
,
cn
))
return
;
int
srcstep
=
(
int
)(
_srcstep
/
sizeof
(
T
));
int
sumstep
=
(
int
)(
_sumstep
/
sizeof
(
ST
));
int
tiltedstep
=
(
int
)(
_tiltedstep
/
sizeof
(
ST
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录