嵌入式开发者社区

标题: 自己的算法连续两次运行消耗时间差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; kemucycle0_0 = EMUCNT0;; X/ W& Q" r# G6 E, N: W
emucycle1_0 = EMUCNT1;
8 e/ J! z, @! _' jemucycle0_1 = EMUCNT0;
5 v) l" X$ Y4 ~$ r" ~3 Oemucycle1_1 = EMUCNT1;
. r* {* e: t" R6 G  Eemuoverhead = (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- \$ Nemucycle0_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: ISECTIONS# |* |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 = 0x807 [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