[电子元器件] 测量STC32G的浮点运算时间

[复制链接]
2839|34
coody 发表于 2022-12-18 23:15 | 显示全部楼层
changle11sdo5 发表于 2022-12-17 13:51
带循环不准,
应该这样测:开定时器(1T模式),复制100行fx = fx * 1.01,关定时器,把定时器计数值上传 ...

那样时间会更短。实测循环会增加0.2us。
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
@coody :请你仔细看,已经换算成与频率无关的指令数。 你是原厂工程师? 人如其品。  发表于 2022-12-20 07:34
要用同频下才能比较,否则用160M去跟一个30M比较是不合理的。  发表于 2022-12-19 23:55
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条指令。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
cub_wolf 发表于 2022-12-20 22:24 | 显示全部楼层
别用这种不伦不类的垃圾玩意?   你会栽跟头的
R2D2 发表于 2022-12-25 20:20 | 显示全部楼层
为什么不用现成的dhrystone、whetstone来测试呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部