嵌入式开发者社区
标题:
自己的算法连续两次运行消耗时间差20倍
[打印本页]
作者:
bobhi009
时间:
2018-8-14 09:19
标题:
自己的算法连续两次运行消耗时间差20倍
本帖最后由 bobhi009 于 2018-8-16 12:00 编辑
3 d! O0 R- U: O$ n/ [
3 \4 W3 j- J, @: S$ P, ?$ d. ^
环境: 创龙提供的mcsdk (linux3.3 + bios6 + syslink)
V/ ~9 w5 X( B; @+ C+ h1 e
自己的算法连续两次运行消耗时间差20倍, 而且跟算法本身应该没有关系, 因为算法在dsplink 的开发环境下是运行的没有问题的
& I7 U9 A7 E8 Z) Q+ N7 m/ c
应该是mcsdk这套开发环境的影响。 有谁知道是什么原因?
* n4 |. J0 z6 b; y. C
! s/ ]( Q/ C: x R
. l3 K2 b( N' C
下面是统计结果
" P( h5 E1 Y& Z9 d- L* W" G
统计方法
: 通过EMUCNT0 EMUCNT1 寄存器统计算法执行周期 再除以主频得到运行时间
6 d n2 }8 p# b C# ^2 m
emucycle0_0 = EMUCNT0;
. o4 H) |) g8 N1 m' ~- [
emucycle1_0 = EMUCNT1;
" i/ \" x5 U! Z# q
emucycle0_1 = EMUCNT0;
/ R+ z1 [! N7 }5 L- x. j# H
emucycle1_1 = EMUCNT1;
8 a. u1 }9 C( ~/ N( X! f
emuoverhead = (emucycle0_1 - emucycle0_0);
1 R9 j N* _; d5 [; f
- e2 v. Z% C/ B5 }% o) C
算法();
0 U. Y5 e. Y4 W; W
0 U! t. X2 i3 [4 m, |
emucycle0_1 = EMUCNT0;
1 R1 i: [: f2 _* P1 Y" u
emucycle1_1 = EMUCNT1;
d) r1 s* {& ]. ~6 n( U" e t
/ a- y% I. x# c6 a
Cycle = ((emucycle0_1 - emucycle0_0) - emuoverhead) * 4;
" F; N7 M, ^0 e1 p: b3 Q Q
8 j5 Z4 @ Z0 ?2 g
& p9 i- u1 X" d$ k* o3 N* m
统计结果
: 每隔一次, 数据处理的时间会是前一次的将近20倍
8 Z0 m# h3 C$ R, \# p, d
DSP> cycles: 196468 : 11814000
1 _1 y$ O- B0 C
DSP> times: 430.85 us with CPU 456.
5 p/ D J# O' @, j }2 h% E& L
DSP> cycles: 3238292 : 11814000
0 s+ ~4 L: J% p+ ~) X& H4 K1 T
DSP> times: 7101.52 us with CPU 456.
' g5 \# J! c) B0 T$ P$ N1 X4 M
DSP> cycles: 157860 : 11814000
; _7 t; C4 G5 f S6 ?# K
DSP> times: 346.18 us with CPU 456.
# s8 c2 q6 F& j1 }( q
DSP> cycles: 3265684 : 11814000
( O* k; s, f3 `( T0 @6 b
DSP> times: 7161.59 us with CPU 456.
1 _$ z- D. J. Y1 a
DSP> cycles: 156344 : 11814000
8 W @& m }. o9 b) P
DSP> times: 342.86 us with CPU 456.
$ V$ {* d* H1 m( ?- w* X
DSP> cycles: 3304428 : 11814000
9 U- _) ]9 E8 M/ n- g# |
DSP> times: 7246.55 us with CPU 456.
- @3 r8 P* {: u& _9 G1 Z- b
& e7 `9 v1 F4 v9 {" ~! K% b0 }
设置
:相应的表放到IRAM中了
Q1 M7 Q& K: k
SECTIONS
0 u# Q" y" C+ H7 h/ K9 p
{
/ R; F$ }4 e( U$ e% T
.edma_data>IRAM align = 0x80
' D3 T, {8 y( p* g0 P
.audio_glb> IRAM align = 0x80
+ T: J' D Q2 N- x1 P6 n, q3 c6 G
.f_table> IRAM, align = 0x80
4 c5 X6 U1 @( b9 [' \8 S
.f_text> DSP_PROG, align = 0x80
5 I/ M8 ^: A1 }8 e+ L. L; n. f
.f_glb> IRAM align = 0x80
s2 { D! c* W' a4 u, J4 D0 K
.ref_glb > IRAM align = 0x80
+ G. [" ]& ?. ~; A
}
% m0 g- x9 j2 D# ?( r7 p* C6 B
# A6 D2 t# u+ F7 l5 A$ k
; l; l9 B2 D9 N0 [/ w* c" V0 B
编译加了-O3 优化参数
; K$ u0 {: B. u" q$ B
+ l3 p2 [4 u6 ^
; a- ]9 g5 j6 S( f
3 x) |( S0 @8 ^8 E& {/ w. U! T' l
" Y5 p5 }# f- j* ~. N4 z* n, v
" p9 x+ P, V" {8 D- Q0 M3 p- ?3 |
. `! @5 J: b! }+ X8 t1 c8 z/ l
作者:
广州创龙莫工
时间:
2018-8-14 15:48
您好,根据您的描述,暂时不能排查到具体的原因。建议您:可以先不跑双核,单跑dsp的情况下,测试算法的性能,再判断是否是syslink或双核的影响。
作者:
15901123858
时间:
2018-8-14 19:16
想请问下您是在LINUX环境下使用MAKEFILE编译双核工程的嘛?另外SECTIONS中的内容是在.CMD文件中编辑的嘛?
作者:
bobhi009
时间:
2018-8-16 12:03
1. 简单的说下原因, 由于创建任务时 , 由于栈空间地址较大, 所以更换了栈空间的地址, 这导致栈空间新的申请地址是没有开启cache的 , 所以开启栈空间地址的缓存就可以解决问题
Z: q0 Z2 U- ? b1 z! ?
$ H" p b1 k; Y
2. 相差20倍是算法本身的特性, 偶数帧的计算量比较大
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4