嵌入式开发者社区

标题: 自己的算法连续两次运行消耗时间差20倍 [打印本页]

作者: bobhi009    时间: 2018-8-14 09:19
标题: 自己的算法连续两次运行消耗时间差20倍
本帖最后由 bobhi009 于 2018-8-16 12:00 编辑
) p, H) N+ p% d% [( V/ ~- l* n# @0 q
环境: 创龙提供的mcsdk (linux3.3 + bios6 + syslink)
4 @; ^9 k6 l& u自己的算法连续两次运行消耗时间差20倍, 而且跟算法本身应该没有关系, 因为算法在dsplink 的开发环境下是运行的没有问题的: q. P- d( ]  \1 X' s; x
应该是mcsdk这套开发环境的影响。 有谁知道是什么原因?* B& K0 y6 S7 \" H" O$ ?1 _: P0 ^

# S) V% t  v% t, ]  u- v
3 z6 R4 A0 N9 n: r
下面是统计结果6 M; I7 h) g" W. E4 d
统计方法: 通过EMUCNT0 EMUCNT1 寄存器统计算法执行周期 再除以主频得到运行时间    $ n0 F, C6 o8 a$ L
emucycle0_0 = EMUCNT0;2 S( z; b) S3 x, e. F! R, r! ~8 D  w+ i
emucycle1_0 = EMUCNT1;3 z! p+ {, \; p; G
emucycle0_1 = EMUCNT0;
$ O7 D9 m8 v' s# u' t4 c$ femucycle1_1 = EMUCNT1; 7 W. `5 E# |$ S7 y
emuoverhead = (emucycle0_1 - emucycle0_0);
2 ~0 ^8 |/ k$ C0 i
" d8 |* y1 ]1 j- K3 h' R6 e; l. H算法();
& Q( k6 `. M. }  B4 t3 t6 s- y. n7 @/ I
emucycle0_1 = EMUCNT0;
6 e, n& S- [' j) N+ i. ?6 {$ w* temucycle1_1 = EMUCNT1;
- b4 B+ `1 J/ \
7 U2 U$ g" o' J. @- wCycle = ((emucycle0_1 - emucycle0_0) - emuoverhead) * 4;
" l9 e6 v$ m9 S4 r( g
; x; g1 X; t: ^- _
9 k& l' C! o& P6 D' r* C2 f统计结果: 每隔一次, 数据处理的时间会是前一次的将近20倍
: D: ~- U" y" {' ~ DSP> cycles: 196468  :  118140006 T/ w6 B9 K( T5 H' ]9 k- n
DSP> times: 430.85 us with CPU 456.
/ j2 O) {- b) l0 C- W8 [- S- J DSP> cycles: 3238292  :  11814000
% s/ O" ~( x- g6 c. n0 G DSP> times: 7101.52 us with CPU 456.
* @# d& e( s6 _0 w" S DSP> cycles: 157860  :  11814000
) d# s8 q3 M# @+ }" F/ f$ k2 [6 i DSP> times: 346.18 us with CPU 456.
! v" H: }7 A6 E( b# t0 F1 M0 K DSP> cycles: 3265684  :  11814000
9 W$ a  l0 E# c DSP> times: 7161.59 us with CPU 456.
2 ]7 m3 P  i( [3 @* q, V' @) l DSP> cycles: 156344  :  118140002 z; e; ?- b- q/ m" |. ?6 c1 g4 U' i4 {
DSP> times: 342.86 us with CPU 456.7 w7 \: K/ {) A& ?; t+ A
DSP> cycles: 3304428  :  11814000
( O2 }/ v( j$ k$ T8 J1 R0 _6 e" M DSP> times: 7246.55 us with CPU 456.
5 _, Y8 T# X; r6 H; ?2 ]- h( p) ]8 r" U! W3 v$ t/ {2 j: V7 o' x
设置:相应的表放到IRAM中了
' \2 f1 i" @+ e3 C0 K' w2 G/ s( pSECTIONS
! v% D  }  Y- O* F" [) I7 V{9 D5 o# A$ I& w! N! L$ ^
    .edma_data>IRAM  align = 0x80
3 M! D8 T" I; y    .audio_glb> IRAM align = 0x80+ G4 C1 z. A: o0 f0 `8 X- C! A/ N' l
        .f_table>  IRAM,  align = 0x80   |/ a! o8 {* G8 y
        .f_text>  DSP_PROG,   align = 0x80 + F+ S  y  J/ d
        .f_glb> IRAM align = 0x808 c/ b3 r) A' i) d( w
        .ref_glb > IRAM align = 0x80
! [4 l2 W5 y% |1 A7 P  p- M}
- r* T6 K2 s& I  I# e4 p8 p& Z7 P% ^! `
* T4 v0 X" m1 ^" h( p! b" G2 g
编译加了-O3 优化参数! h9 B& |, [9 H/ X* J
4 `1 F* F' o. J
' [3 O$ R% A7 J) e0 f9 v

; J9 |- E% K$ w0 |  w7 J. ^0 y* r

9 Y+ V9 K0 ?9 l

/ n/ K& n& G4 w' h9 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的 , 所以开启栈空间地址的缓存就可以解决问题+ c* o4 i( l8 ^9 c5 r- w

7 ~' _: ~0 v4 C! G( X( f2. 相差20倍是算法本身的特性, 偶数帧的计算量比较大




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4