嵌入式开发者社区

标题: 自己的算法连续两次运行消耗时间差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; W0 U! t. X2 i3 [4 m, |
emucycle0_1 = EMUCNT0;
1 R1 i: [: f2 _* P1 Y" uemucycle1_1 = EMUCNT1;  d) r1 s* {& ]. ~6 n( U" e  t

/ a- y% I. x# c6 aCycle = ((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  :  118140001 _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  :  118140000 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  :  118140009 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
SECTIONS0 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