大家好!我现在选用Am5728平台,想用里面的DSP做浮点运算,运算的时间超出预期太多。因此采用简单的浮点乘法测试DSP运行的速度。
Am5728输入CLK=20MHz, DSP主频为20×150/5=600MHz,采用XDS220 USB仿真器运行测试代码,:测试代码段如下:
double dTest1 = 1.7568;
double dTest2= 125773.567
double dResult;
SetGPIO(1);
dResult = dTest1 * dTest2;
SetGPIO(0);
用示波器观测GPIO输出的高电平为620ns,按手册浮点运算应该是单周期,加上GPIO设置、数据存取等代码,反汇编不超过20条,应该不超过34ns才差不多。将浮点运算增加到3次(代码如下),测试GPIO输出时间1.2us,可以看出确实运算的时间比预期的长很多,不知道什么原因。怀疑是DSP的主频不对,但与DSP主频相关的寄存器都正确,且DSP时钟状态是锁定的。
请问Am572X中DSP的浮点处理是单周期的吗?还有哪些地方需要排查,是什么原因导致执行速度这么慢?或者有什么方法可以确定DSP工作的主频? 非常感谢!
dResult = dTest1 * dTest2;
dResult = dResult * dTest2;
dResult = dResult * dTest2;
Shine:
GPIO管脚不是跑CPU主频,速度很慢的,所以用GPIO管脚来测代码运行时间是不精准的。
建议用TSCL, TSCH两个cpu cycles计数器 来测代码运行时间。
使用参考如下:
TSCL=0;//初始化为任意值使能TSC时钟计时
start = TSCL;
FUNC();
end = TSCL;
cycle = end – start;
sfloat s:
回复 Shine:
TSCL计数器是ARM的主频还是DSP的主频?
用这个计数器
start = TSCL;dResult = dTest1*dTest2;end = TSCL;
测试结果是172;
start = TSCL;
for(i = 0; i < 10000; i++)
{
dResult = dTest1*dTest2;
dTest2++;
}
end = TSCL;
测试结果是3460000
感觉这个时间也不应该是浮点处理器该有的速度。
我现在用仿真器跑DSP,是否和Arm核没有程序控制有关? 谢谢!
sfloat s:
回复 Shine:
TSCL是DSP的主频,但为什么一条浮点运算需要执行172个时钟周期呢?按手册不是单周期吗?是哪个地方可能有问题?谢谢!
yongqing wang:
回复 sfloat s:
使用DSP不是应该用DSP的接口函数吗
yongqing wang:
回复 sfloat s:
学习一下