7

我尝试测量在 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() 运行不正常,但我不确定这是因为我做错了什么,还是因为我拥有的硬件不支持这种类型的事情。任何想法为什么会发生这种情况?

4

6 回答 6

2

从到目前为止阅读的问题来看,我想说原始海报比迄今为止的贡献者对此事的了解要多得多,并且怀疑 clock() 已损坏(或不受支持,并返回未定义的结果) DSP似乎很有可能。

于 2009-07-14T07:30:25.610 回答
0

奇怪的是,为什么需要以前分配的共享内存。为什么不尝试使用普通的堆栈变量?有什么我想念的吗?

于 2009-07-08T08:13:12.560 回答
0

也许您需要先初始化时钟。

于 2009-07-08T13:46:38.777 回答
0

你是怎么打印出来的?也许问题实际上在于显示结果?

在大多数平台上,clock_t 很长。如果您将 printf 与 %d 一起使用,您可能会得到不同的结果,这就是您所看到的。

于 2009-07-09T00:12:21.650 回答
0

假设 start 和 end 变量的类型为“clock_t”,并且您的共享内存假定另一端对传递的数字的解释相同,那么您的问题不在于对时钟的调用,以及您对 start 之间差异的处理结束时间。

我相信您的问题出在两者之间的共享内存中。您能否发布代码以显示您如何在两个独立的处理器之间共享内存?

于 2009-07-10T12:53:48.273 回答
0

也许您可以使用一些内联汇编直接访问 CPU 的计数器寄存器。

TMS320C64x+ 在 TSCL、TSCH 中有一个 64 位时间戳寄存器。 计数器在复位时未启用,您必须先写入寄存器以启动计数器(也许这是问题clock?)。从寄存器读取并不是很简单,因为必须使用单独的指令读取每一半(并且您可以获得中断......)。

于 2011-08-22T21:27:31.690 回答