嵌入式开发者社区
标题:
自己的算法连续两次运行消耗时间差20倍
[打印本页]
作者:
bobhi009
时间:
2018-8-14 09:19
标题:
自己的算法连续两次运行消耗时间差20倍
本帖最后由 bobhi009 于 2018-8-16 12:00 编辑
6 v0 P' a( ^8 N' b6 j. i6 Y4 s; @
2 |- |' ~8 {$ ?' k1 O
环境: 创龙提供的mcsdk (linux3.3 + bios6 + syslink)
' Y% v* }9 a$ Z6 {& X
自己的算法连续两次运行消耗时间差20倍, 而且跟算法本身应该没有关系, 因为算法在dsplink 的开发环境下是运行的没有问题的
. p4 _6 ~; i; z& p6 x$ ~: g6 C
应该是mcsdk这套开发环境的影响。 有谁知道是什么原因?
9 k: b( D" d! t
* a; r2 Y- w S# A r
# w$ ~0 ], N. S' X9 j8 ]8 q
下面是统计结果
4 W% A9 i, j, u" [3 f/ M
统计方法
: 通过EMUCNT0 EMUCNT1 寄存器统计算法执行周期 再除以主频得到运行时间
3 t$ _) K! T; a; k
emucycle0_0 = EMUCNT0;
; X/ W& Q" r# G6 E, N: W
emucycle1_0 = EMUCNT1;
8 e/ J! z, @! _' j
emucycle0_1 = EMUCNT0;
5 v) l" X$ Y4 ~$ r" ~3 O
emucycle1_1 = EMUCNT1;
. r* {* e: t" R6 G E
emuoverhead = (emucycle0_1 - emucycle0_0);
4 i8 i% L4 {) A6 u2 M; [
' U3 `8 t y( o
算法();
" c; ]/ k1 W3 d' C" I
1 H4 p3 y7 o8 H- \$ N
emucycle0_1 = EMUCNT0;
W+ c) S$ b: K' N
emucycle1_1 = EMUCNT1;
: y' g5 I) U# ~6 j
* f- i2 K: M" N$ Y
Cycle = ((emucycle0_1 - emucycle0_0) - emuoverhead) * 4;
# [: m6 q; S0 [9 X: h A
[3 S1 d( z4 E+ H* o& Z( H# Z
+ V. p; S8 b! S! P! O' s
统计结果
: 每隔一次, 数据处理的时间会是前一次的将近20倍
+ X# C6 X0 P7 ~) M& ~8 h0 ]1 U) q
DSP> cycles: 196468 : 11814000
, n# ?* E; v" {8 [2 l
DSP> times: 430.85 us with CPU 456.
- \. s0 m: N& [5 E( o
DSP> cycles: 3238292 : 11814000
9 I7 Z1 d* p% [5 t. a
DSP> times: 7101.52 us with CPU 456.
- ]/ O% c, ~& Y, Z
DSP> cycles: 157860 : 11814000
' J# D. C( Z4 E- T+ @5 f, |/ ^
DSP> times: 346.18 us with CPU 456.
5 A; u' x* F% D& C! h: z" C
DSP> cycles: 3265684 : 11814000
$ o. }( w# G9 U0 M. Q
DSP> times: 7161.59 us with CPU 456.
/ C _4 m) c' S2 w
DSP> cycles: 156344 : 11814000
. z4 m3 `% S9 F2 s
DSP> times: 342.86 us with CPU 456.
1 u" B! v& X5 v/ s: w3 M
DSP> cycles: 3304428 : 11814000
' v$ e1 C1 B d- M7 @) Z/ t3 Q
DSP> times: 7246.55 us with CPU 456.
5 _$ V K) t2 \& h4 l; p* c- B! V
9 |# p! Y2 Q$ s4 `4 t2 p3 N+ N1 p
设置
:相应的表放到IRAM中了
1 m3 i0 V0 u A0 e1 E: I
SECTIONS
# |* |9 U" N* z% I
{
3 \# a8 ~" |' l5 S- L. C9 C" M4 e
.edma_data>IRAM align = 0x80
$ I0 Q$ P3 n) s
.audio_glb> IRAM align = 0x80
7 [4 M5 F4 N* D1 e+ p/ f
.f_table> IRAM, align = 0x80
3 W& I0 C; L8 X2 M1 w9 ~! s
.f_text> DSP_PROG, align = 0x80
& E8 N5 t! ?4 ]# d7 m- V4 @
.f_glb> IRAM align = 0x80
! W0 r" D+ w8 B& l" W# l5 ?
.ref_glb > IRAM align = 0x80
8 v: r: r( `% j4 a0 |9 p/ Y
}
( E6 t- e) i2 g6 o' N7 z
, x$ W7 R: s5 _
8 D0 |% S3 Y# j
编译加了-O3 优化参数
% h0 E9 q. y5 n% R& d/ W! T
1 m: t' X" X; x2 |& d M; d
7 A# s. o4 R1 E/ U+ D3 V- O
; l3 r, L! g7 e% K8 P
# N6 u0 G, S9 C8 ]- \) g( ~
8 p) |. ^; b2 B
. c* U6 p2 L- t: j4 y* c
作者:
广州创龙莫工
时间:
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的 , 所以开启栈空间地址的缓存就可以解决问题
8 U. J2 z' p6 C( `4 p$ J, {
9 Q {# @& D2 E3 W( T
2. 相差20倍是算法本身的特性, 偶数帧的计算量比较大
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4