发新帖我要提问
12
返回列表
打印
[电子元器件]

测量STC32G的浮点运算时间

[复制链接]
楼主: tianxiongweitxw
手机看帖
扫描二维码
随时随地手机跟帖
21
changle11sdo5 发表于 2022-12-17 13:51
带循环不准,
应该这样测:开定时器(1T模式),复制100行fx = fx * 1.01,关定时器,把定时器计数值上传 ...

那样时间会更短。实测循环会增加0.2us。

使用特权

评论回复
22
xch| | 2022-12-19 10:20 | 只看该作者
uint32_t CntComputing=0;
extern TIM_TypeDef *TSLAVE;
void ComputingTestDemo(float inp)
{
  CntComputing = TSLAVE->CNT;
  float x =inp;
  for (uint16_t i=0;i<1000;i++)
  {
    x= sqrtf(1.0+x);
  }
  
  CntComputing = TSLAVE->CNT - CntComputing;
  TSLAVE->CNT  = (uint32_t)x;
  asm("nop");
}

使用160MHZ M4,关闭 FPU 进行编译( 基本上相当于160MHZ 的M3 ):
实测运算1000次使用398.25uS ,相当于每次运算 用了67.3条指令。

原先使用FPU 进行编译时,实测运算1000次使用了37.5us。
使用FPU 能快10倍。

看STC32G的实测数据确实比乌龟还慢。

使用特权

评论回复
评论
xch 2022-12-20 07:34 回复TA
@coody :请你仔细看,已经换算成与频率无关的指令数。 你是原厂工程师? 人如其品。 
coody 2022-12-19 23:55 回复TA
要用同频下才能比较,否则用160M去跟一个30M比较是不合理的。 
23
xch| | 2022-12-19 11:07 | 只看该作者
uint32_t CntComputing=0;
extern TIM_TypeDef *TSLAVE;
void ComputingTestDemo(float inp)
{
  CntComputing = TSLAVE->CNT;
  float x =inp;
  for (uint16_t i=0;i<1000;i++)
  {
    //x= sqrtf(1.0+x);
    x = 0.999089*x;
  }
  
  CntComputing = TSLAVE->CNT - CntComputing;
  TSLAVE->CNT  = (uint32_t)x;
  asm("nop");
}

将开方运算改成乘法后,一共用了169.725us. 说明开方运算复杂些。

平均每次浮点乘法用了27.16条指令。


56251639fd4ebc03dc.png (617 Bytes )

56251639fd4ebc03dc.png

使用特权

评论回复
24
cub_wolf| | 2022-12-20 22:24 | 只看该作者
别用这种不伦不类的垃圾玩意?   你会栽跟头的

使用特权

评论回复
25
R2D2| | 2022-12-25 20:20 | 只看该作者
为什么不用现成的dhrystone、whetstone来测试呢?

使用特权

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

本版积分规则