我尝试测量在OMAP ZOOM 3430 MDK附带的TMS32064x + DSP上执行一段代码所需的时钟周期。我看一下DSP芯片的“程序员指南”,它说DSP支持clock()函数。
我做的很简单,我只是做
start = clock();
for (i=0;i<100;i++){
/* do something here */
}
stop = clock();
total = stop - start;
然后将“start”,“stop”和“total”的值放入先前为ARM处理器分配的共享内存中。然后我只需将其打印到ARM端的屏幕上。
问题是,在我第一次执行时,我总是得到相同的“总”值,然后在我的下一次运行中,我总是得到0! “开始”和“停止”值与“总”值一起显示。
最奇怪的是他们似乎遵循了一点点模式!我把输出结果放在下面:
# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop clock() value = 0x0000f9f9
# ./sampleapp
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop clock() value = 0xf9f9f9f9
显然,clock()运行不正常,但我不确定这是因为我做错了什么,还是因为我的硬件不支持这种类型的东西。有什么想法可能会发生这种情况吗?
答案 0 :(得分:2)
从阅读到目前为止的问题,我会说原始海报比目前的贡献者有更多的知识,并且怀疑时钟()被破坏(或不支持,并返回未定义)似乎很可能在DSP上。
答案 1 :(得分:0)
奇怪的是,为什么需要以前分配的共享内存 。为什么不尝试使用普通的堆栈变量?有什么我想念的吗?
答案 2 :(得分:0)
也许你需要先初始化时钟。
答案 3 :(得分:0)
你是如何打印出来的?也许问题实际上是显示结果?
在大多数平台上,clock_t很长。如果您使用带有%d的printf,您可能会得到可变结果,这就是您所看到的。
答案 4 :(得分:0)
假设start和end变量的类型为'clock_t',并且你的共享内存假设在另一端对传递的数字的解释相同,那么你的问题不在于调用时钟,而是你处理差异在开始结束时间之间。
我相信你的问题在于两者之间的共享内存。您能否发布代码以显示您如何在两个独立的处理器之间共享内存?
答案 5 :(得分:0)
也许你可以使用一些内联汇编来直接访问CPU的计数器寄存器。
TMS320C64x +在TSCL,TSCH中有一个64位时间戳寄存器。 重置时计数器未启用您必须先写入寄存器才能启动计数器(这可能是clock
的问题?)。从寄存器中读取并不是很简单,因为必须使用单独的指令读取每一半(并且您可以获得中断......)。