Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
magicwindyyd
mindspore
提交
6a1e6b01
M
mindspore
项目概览
magicwindyyd
/
mindspore
与 Fork 源项目一致
Fork自
MindSpore / mindspore
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mindspore
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6a1e6b01
编写于
8月 04, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
8月 04, 2020
浏览文件
操作
浏览文件
下载
差异文件
!3930 fix fp32 kernel bugs on arm32 and ReluFp32
Merge pull request !3930 from lixian/master
上级
7c030731
0921c33f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
98 addition
and
95 deletion
+98
-95
mindspore/lite/src/runtime/kernel/arm/opclib/assembly/arm32/IndirectGemmFp32_8x4.S
...e/kernel/arm/opclib/assembly/arm32/IndirectGemmFp32_8x4.S
+89
-91
mindspore/lite/src/runtime/kernel/arm/opclib/assembly/arm32/IndirectGemmInt8_2x4.S
...e/kernel/arm/opclib/assembly/arm32/IndirectGemmInt8_2x4.S
+7
-4
mindspore/lite/src/runtime/kernel/arm/opclib/common_func.cc
mindspore/lite/src/runtime/kernel/arm/opclib/common_func.cc
+2
-0
未找到文件。
mindspore/lite/src/runtime/kernel/arm/opclib/assembly/arm32/IndirectGemmFp32_8x4.S
浏览文件 @
6a1e6b01
...
...
@@ -17,16 +17,18 @@
IndirectGemmFp32_8x4
:
.
macro
INIT_BIAS
veor
q
10
,
q10
,
q10
veor
q
8
,
q8
,
q8
cmp
r3
,
#
0
beq
InitBias
vld1.32
q10
,
[
r3
]
vld1.32
{
q8
}
,
[
r3
]
InitBias
:
vmov
q11
,
q10
vmov
q12
,
q10
vmov
q13
,
q10
vmov
q14
,
q10
vmov
q15
,
q10
vmov
q9
,
q8
vmov
q10
,
q8
vmov
q11
,
q8
vmov
q12
,
q8
vmov
q13
,
q8
vmov
q14
,
q8
vmov
q15
,
q8
.
endm
//
at
return
,
clang
generates
"push {lr}, pop {pc}"" while gcc will generate "
bx
lr
"
...
...
@@ -36,7 +38,7 @@ IndirectGemmFp32_8x4:
//
r4
-
r8
and
q4
-
q7
must
be
saved
according
to
https
:
//
static
.
docs
.
arm
.
com
/
ihi0042
/
i
/
aapcs32
.
pdf
push
{
r4
-
r8
,
r10
,
r11
,
lr
}
vpush
{
q4
-
q7
}
add
sp
,
sp
,
#
160
add
sp
,
sp
,
#
96
ldr
r4
,
[
sp
]
ldr
r5
,
[
sp
,
#
4
]
...
...
@@ -66,8 +68,8 @@ IndirectGemmFp32_8x4:
//
load
weight
vld1.32
{
q4
,
q5
},
[
r2
]!
//
step
for
output
1
-
2
vm
ul
.f32
q8
,
q4
,
d0
[
0
]
vm
ul
.f32
q9
,
q4
,
d2
[
0
]
vm
la
.f32
q8
,
q4
,
d0
[
0
]
vm
la
.f32
q9
,
q4
,
d2
[
0
]
vmla.f32
q8
,
q5
,
d0
[
1
]
vmla.f32
q9
,
q5
,
d2
[
1
]
vld1.32
{
q6
,
q7
},
[
r2
]!
...
...
@@ -158,31 +160,31 @@ IndirectGemmFp32_8x4:
bne
Relu
b
WriteStart
Relu6
:
vmov.i32
q
14
,
#
6
vcvt.f32.s32
q
14
,
q14
vmin.f32
q
0
,
q0
,
q14
vmin.f32
q
1
,
q1
,
q14
vmin.f32
q
2
,
q2
,
q14
vmin.f32
q
3
,
q3
,
q14
vmin.f32
q
4
,
q4
,
q14
vmin.f32
q
5
,
q5
,
q14
vmin.f32
q
6
,
q6
,
q14
vmin.f32
q
7
,
q15
,
q14
vmov.i32
q
7
,
#
6
vcvt.f32.s32
q
7
,
q7
vmin.f32
q
8
,
q8
,
q7
vmin.f32
q
9
,
q9
,
q7
vmin.f32
q
10
,
q10
,
q7
vmin.f32
q
11
,
q11
,
q7
vmin.f32
q
12
,
q12
,
q7
vmin.f32
q
13
,
q13
,
q7
vmin.f32
q
14
,
q14
,
q7
vmin.f32
q
15
,
q15
,
q7
Relu
:
veor
q7
,
q7
,
q7
vmax.f32
q
0
,
q8
,
q7
vmax.f32
q
1
,
q9
,
q7
vmax.f32
q
2
,
q10
,
q7
vmax.f32
q
3
,
q11
,
q7
vmax.f32
q
4
,
q12
,
q7
vmax.f32
q
5
,
q13
,
q7
vmax.f32
q
6
,
q14
,
q7
vmax.f32
q
8
,
q8
,
q7
vmax.f32
q
9
,
q9
,
q7
vmax.f32
q
10
,
q10
,
q7
vmax.f32
q
11
,
q11
,
q7
vmax.f32
q
12
,
q12
,
q7
vmax.f32
q
13
,
q13
,
q7
vmax.f32
q
14
,
q14
,
q7
vmax.f32
q15
,
q15
,
q7
WriteStart
:
ldr
r10
,
[
sp
,
#
20
]
cmp
r10
,
#
0
bne
Write
C
4
bne
Write4
cmp
r6
,
#
1
beq
Write1
cmp
r6
,
#
2
...
...
@@ -191,98 +193,91 @@ IndirectGemmFp32_8x4:
beq
Write3
b
Write4
Write1
:
vst1.32
d
0
[
0
],
[
r11
]
vst1.32
d
16
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
2
[
0
],
[
r11
]
vst1.32
d
18
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
4
[
0
],
[
r11
]
vst1.32
d
20
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
6
[
0
],
[
r11
]
vst1.32
d
22
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
8
[
0
],
[
r11
]
vst1.32
d
24
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
10
[
0
],
[
r11
]
vst1.32
d
26
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d12
[
0
],
[
r11
]
vst1.32
d28
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d30
[
0
],
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d14
[
0
],
[
r11
]
add
r0
,
r0
,
#
4
b
WriteEnd
Write2
:
vst1.32
d0
,
[
r11
]
vst1.32
d16
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d18
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d2
,
[
r11
]
vst1.32
d2
0
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
4
,
[
r11
]
vst1.32
d
22
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
6
,
[
r11
]
vst1.32
d
24
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
8
,
[
r11
]
vst1.32
d
26
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
10
,
[
r11
]
vst1.32
d
28
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
12
,
[
r11
]
vst1.32
d
30
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d14
,
[
r11
]
add
r0
,
r0
,
#
8
b
WriteEnd
Write3
:
add
r12
,
r11
,
#
8
vst1.32
d0
,
[
r11
]
add
lr
,
r11
,
#
8
vst1.32
d16
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d17
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d18
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d1
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d2
,
[
r11
]
vst1.32
d1
9
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d2
0
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
3
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d
4
,
[
r11
]
vst1.32
d
21
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d
22
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
5
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d
6
,
[
r11
]
vst1.32
d
23
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d
24
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
7
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d
8
,
[
r11
]
vst1.32
d
25
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d
26
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
9
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d
10
,
[
r11
]
vst1.32
d
27
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d
28
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d
11
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d
12
,
[
r11
]
vst1.32
d
29
[
0
],
[
lr
]
add
lr
,
lr
,
r7
vst1.32
d
30
,
[
r11
]
add
r11
,
r11
,
r7
vst1.32
d13
[
0
],
[
r12
]
add
r12
,
r12
,
r7
vst1.32
d14
,
[
r11
]
vst1.32
d15
[
0
],
[
r12
]
vst1.32
d31
[
0
],
[
lr
]
add
lr
,
lr
,
r7
add
r0
,
r0
,
#
12
b
WriteEnd
WriteC4
:
vst1.32
q0
,
[
r11
],
r7
vst1.32
q1
,
[
r11
],
r7
vst1.32
q2
,
[
r11
],
r7
vst1.32
q3
,
[
r11
],
r7
vst1.32
q4
,
[
r11
],
r7
vst1.32
q5
,
[
r11
],
r7
vst1.32
q6
,
[
r11
],
r7
vst1.32
q7
,
[
r11
]
add
r0
,
r0
,
#
16
b
WriteEnd
Write4
:
//
prefetching
is
not
prefered
while
writing
results
in
spite
of
cache
missings
//
you
could
try
p
rfm
pstl2vst1
.32
m
//
you
could
try
p
ld
//
there
are
almost
no
benefits
observed
though
vst1.32
q0
,
[
r11
],
r7
vst1.32
q1
,
[
r11
],
r7
vst1.32
q2
,
[
r11
],
r7
vst1.32
q3
,
[
r11
],
r7
vst1.32
q4
,
[
r11
],
r7
vst1.32
q5
,
[
r11
],
r7
vst1.32
q6
,
[
r11
],
r7
vst1.32
q7
,
[
r11
]
vst1.32
{
q8
}
,
[
r11
],
r7
vst1.32
{
q9
}
,
[
r11
],
r7
vst1.32
{
q10
}
,
[
r11
],
r7
vst1.32
{
q11
}
,
[
r11
],
r7
vst1.32
{
q12
}
,
[
r11
],
r7
vst1.32
{
q13
}
,
[
r11
],
r7
vst1.32
{
q14
}
,
[
r11
],
r7
vst1.32
{
q15
},
[
r11
],
r7
add
r0
,
r0
,
#
16
WriteEnd
:
...
...
@@ -290,14 +285,17 @@ IndirectGemmFp32_8x4:
subs
r8
,
r8
,
#
1
bne
LoopKsize
subs
r6
,
r6
,
#
4
cmp
r6
,
#
4
ble
LoopOcEnd
sub
r6
,
r6
,
#
4
cmp
r3
,
#
0
beq
NoStepFowrard
add
r3
,
r3
,
#
16
NoStepFowrard
:
b
gt
LoopOc
b
LoopOc
add
sp
,
sp
,
#
160
LoopOcEnd
:
sub
sp
,
sp
,
#
96
vpop
{
q4
-
q7
}
pop
{
r4
-
r8
,
r10
,
r11
,
pc
}
#endif
...
...
mindspore/lite/src/runtime/kernel/arm/opclib/assembly/arm32/IndirectGemmInt8_2x4.S
浏览文件 @
6a1e6b01
...
...
@@ -31,7 +31,7 @@ IndirectGemmInt8_2x4:
//
r4
-
r8
and
q4
-
q7
must
be
saved
according
to
https
:
//
static
.
docs
.
arm
.
com
/
ihi0042
/
i
/
aapcs32
.
pdf
push
{
r4
-
r8
,
r10
,
r11
,
lr
}
vpush
{
q4
-
q7
}
add
sp
,
sp
,
#
160
add
sp
,
sp
,
#
96
ldr
r4
,
[
sp
]
ldr
r5
,
[
sp
,
#
4
]
...
...
@@ -226,14 +226,17 @@ IndirectGemmInt8_2x4:
subs
r8
,
r8
,
#
1
bne
LoopKsize
subs
r6
,
r6
,
#
4
cmp
r6
,
#
4
ble
LoopOcEnd
sub
r6
,
r6
,
#
4
cmp
r3
,
#
0
beq
NoStepFowrard
add
r3
,
r3
,
#
16
NoStepFowrard
:
b
gt
LoopOc
b
LoopOc
add
sp
,
sp
,
#
160
LoopOcEnd
:
sub
sp
,
sp
,
#
96
vpop
{
q4
-
q7
}
pop
{
r4
-
r8
,
r10
,
r11
,
pc
}
#endif
...
...
mindspore/lite/src/runtime/kernel/arm/opclib/common_func.cc
浏览文件 @
6a1e6b01
...
...
@@ -159,6 +159,7 @@ void ReluFp32(float *data, int ele_num) {
float32x4_t
relu_data
=
vld1q_f32
(
data
+
index
);
float32x4_t
zero_data
=
vdupq_n_f32
(
0
);
relu_data
=
vmaxq_f32
(
relu_data
,
zero_data
);
vst1q_f32
(
data
+
index
,
relu_data
);
#else
data
[
index
]
=
data
[
index
]
<
0
?
0
:
data
[
index
];
data
[
index
+
1
]
=
data
[
index
+
1
]
<
0
?
0
:
data
[
index
+
1
];
...
...
@@ -181,6 +182,7 @@ void Relu6Fp32(float *data, int ele_num) {
float32x4_t
six_data
=
vdupq_n_f32
(
6
);
relu6_data
=
vmaxq_f32
(
relu6_data
,
zero_data
);
relu6_data
=
vminq_f32
(
relu6_data
,
six_data
);
vst1q_f32
(
data
+
index
,
relu6_data
);
#else
data
[
index
]
=
data
[
index
]
<
0
?
0
:
data
[
index
];
data
[
index
]
=
data
[
index
]
>
6
?
6
:
data
[
index
];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录