嵌入式开发者社区

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

作者: bobhi009    时间: 2018-8-14 09:19
标题: 自己的算法连续两次运行消耗时间差20倍
本帖最后由 bobhi009 于 2018-8-16 12:00 编辑
6 x$ {  j) s7 P( v
# E/ r+ ?$ x$ A/ A环境: 创龙提供的mcsdk (linux3.3 + bios6 + syslink): E0 N) l0 V7 ~4 ?0 F4 p
自己的算法连续两次运行消耗时间差20倍, 而且跟算法本身应该没有关系, 因为算法在dsplink 的开发环境下是运行的没有问题的: B, s7 V0 Q/ M' D9 S
应该是mcsdk这套开发环境的影响。 有谁知道是什么原因?. V' V, v9 `& l* E) g

$ F6 A; [. |( L* W$ B
  @& Y" M9 h! d# R
下面是统计结果
) H/ ]; k4 W# `+ \. ^. R( N. `! Q统计方法: 通过EMUCNT0 EMUCNT1 寄存器统计算法执行周期 再除以主频得到运行时间    
# O& N$ k! y6 K2 X  E& }" _emucycle0_0 = EMUCNT0;( S  {7 e) F! X- M" Q5 @5 l' L% Q
emucycle1_0 = EMUCNT1;
/ y+ F: @* H: F5 k; Wemucycle0_1 = EMUCNT0;2 c5 u9 Z* G9 V# m2 H4 K& r
emucycle1_1 = EMUCNT1;
. P+ I3 Q" B# }. oemuoverhead = (emucycle0_1 - emucycle0_0);5 f: K+ H$ z6 B( m6 ?' M3 F4 C% @- [
' c8 t2 _3 ~+ h! I
算法();
$ ~2 Q9 k5 E2 h$ M% W: @. y- q) D5 c
# K2 G, X4 u, U) }* ]. V  o0 hemucycle0_1 = EMUCNT0;
5 P$ |0 J9 i0 W3 i( W  J  Zemucycle1_1 = EMUCNT1;9 Z4 V! l: A+ u! H7 A  y% T
- s1 x$ f9 Z5 G7 A2 f
Cycle = ((emucycle0_1 - emucycle0_0) - emuoverhead) * 4;
; g/ s! u% {' @: b: Y* t) D3 s1 m$ u$ n" c5 x; r

) ^' h6 s9 s. f4 F3 M" k+ `统计结果: 每隔一次, 数据处理的时间会是前一次的将近20倍
* E' H' H, c: V, K  D, H( j' @* ] DSP> cycles: 196468  :  11814000
! U$ @$ U1 _1 g# ^5 V2 a) I DSP> times: 430.85 us with CPU 456.; f9 C! w9 Z) W2 Z
DSP> cycles: 3238292  :  11814000% {0 N$ I+ w9 q; l' f2 F: N
DSP> times: 7101.52 us with CPU 456.
% b; O" A4 T5 }4 S% Y9 u DSP> cycles: 157860  :  11814000
- e: V* I/ \  M! u" ?/ N DSP> times: 346.18 us with CPU 456.9 E7 Q, o, a! |0 f, z8 K; @
DSP> cycles: 3265684  :  11814000
& T/ Z1 t8 Y. ? DSP> times: 7161.59 us with CPU 456.1 W' y. F- h( s' p7 f& `
DSP> cycles: 156344  :  11814000
% c* x3 I( H+ z% s DSP> times: 342.86 us with CPU 456.
5 k6 ^) B+ M- K DSP> cycles: 3304428  :  118140002 }# T1 V" s8 u/ J$ x, O" ~  J
DSP> times: 7246.55 us with CPU 456.2 L4 V) G" x3 Q. J

6 ?2 H9 W3 L2 v设置:相应的表放到IRAM中了
7 B! H1 S! h$ v7 c7 b; U8 I8 LSECTIONS
. ~4 f8 d. W. o9 s2 Z: ?4 Q+ I{
* b. z; ?# V5 v; E" x4 f4 G    .edma_data>IRAM  align = 0x80
. U) W, U3 c' y) n- v    .audio_glb> IRAM align = 0x80
- b$ b2 w8 D5 ^# y        .f_table>  IRAM,  align = 0x80 1 m5 t+ I* S1 M2 f) G1 ?7 C
        .f_text>  DSP_PROG,   align = 0x80 & Q& M$ R* W7 U
        .f_glb> IRAM align = 0x80
" T5 [, ?; i/ i- e3 E        .ref_glb > IRAM align = 0x80
& i  x. _" t9 [6 C, N4 M}5 t/ o* h$ ~3 n7 n' S, ~, q4 F

. X* d' K% v, g& H& G8 }; B- i( Z% S5 \' O# B9 u; u# F5 p% I
编译加了-O3 优化参数) G3 l/ C$ a1 u$ O

2 F! t, H' ~4 \6 U$ `$ {
5 y* z3 H. `0 Z% ^8 N7 a
6 }1 r3 a5 Y) |2 P% q

# L& y. i# }  |- p8 _9 m' g4 @
% ^/ P+ b3 D1 C& |% D

+ d1 L+ Z6 X+ l8 Z% n  Z4 O
作者: 广州创龙莫工    时间: 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的 , 所以开启栈空间地址的缓存就可以解决问题" ^- ?1 C! l* I+ S' c1 Z: s
, _. H6 k' x' d1 ]
2. 相差20倍是算法本身的特性, 偶数帧的计算量比较大




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