打印

DSP OMAP 程序耗时测定 CPU周期 两种方法

[复制链接]
371|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sode|  楼主 | 2017-11-2 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP OMAP 程序耗时测定 CPU周期 两种方法

DSP开发中,测量某个函数或某段代码的cycles消耗是经常要做的事情,常用的profiling和clock()一般在simulation下使用,真正到了板子上做emulation时,因为要考虑到数据和被测code在板子上的存放位置和读取时间,用这种方法测结果就不那么可靠了。其实在c64x+ core上有两个计数寄存器TSCL/TSCH,它们与CPU同频,共同表示一个64-bit数,CPU运行一个cycle,该寄存器就加1,因此可以用它们来准确的测量cpu在某个执行段中消耗的cycles。一般我们只会用到TSCL这个寄存器,594MHz下,32-bit可以测试到7s,而TSCH是高32位,除非测试整个工程,一般用不到它。

具体使用时:
首先将被测函数通过Link指定到L1P,将用到的数据指定到L1D,这样做的目的是消除代码执行时的数据和指令搬移时间(否则测出来的时间包含数据和指令从片外到片内的搬移时间)
然后在被测函数或代码前对TSCL执行写操作,将寄存器A0写入TSCL,对之做初始化,即启动计数;
最后在函数结束处或被测代码段后读取TSCL寄存器的值,读取的值即为该函数或代码段消耗的cpu cycles。

切记每次测试前必须重启CPU,因为计数器只有在两个条件下才会停止计数,不能通过编程来使之停止计数:
a. 退出reset状态,即重启后
b. CPU完全powered down

总的来说,因为这两个寄存器是core内部的寄存器,与cpu同频,用它来测时间,是非常准的,甚至已经考虑到压缩指令包fpread声明的消耗(1cycle),特别是测试手写汇编时更有效,甚至可以清楚的看出一个指令延时了多少个cycles。

使用方法:长时间宽范围时钟测定

unsigned long long t1,t2;t1=_itoll(TSCH,TSCL);code_wait_test;t2=_itoll(TSCH,TSCL);printf(“#cycle=%d”,t2-t1);




短时间(7秒)窄范围时钟测定:

T1=TSCL;…process code …T2=TSCL;Printf(“#cycle=%d”,t2-t1);



方法二,也可以采用biosAPI方式

LgUns time1=CLK_gethtime();…process code …LgUns time2=CLK_gethtime();Cpucycles=(time2-time1)*CLK_cpucyclePerhtime;Prinf(“#cycle=%d”,Cpucycle);



相关帖子

沙发
updownq| | 2017-11-2 22:16 | 只看该作者
这个一般不是可以在编译器里面查看吗?

使用特权

评论回复
板凳
sanfuzi| | 2017-11-2 22:16 | 只看该作者
使用定时器能够测量的。

使用特权

评论回复
地板
gygp| | 2017-11-2 22:18 | 只看该作者
测定 CPU周期有什么用?

使用特权

评论回复
5
gygp| | 2017-11-2 22:19 | 只看该作者
测定 CPU周期有什么用?

使用特权

评论回复
6
updownq| | 2017-11-2 22:24 | 只看该作者
怎么精度测量的?

使用特权

评论回复
7
sanfuzi| | 2017-11-2 22:24 | 只看该作者
在程序前开启定时器,然后程序结束关闭,输出。

使用特权

评论回复
8
gygp| | 2017-11-2 22:24 | 只看该作者
这个CPU周期应该是根据时钟确定的吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1049

主题

1522

帖子

8

粉丝