找回密码
 立即注册
查看: 548|回复: 13

MDU32D测试, 加速7.47倍,更快的AI8H2K12U-B版本的一些注意事项

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2024-12-28 20:01:46 | 显示全部楼层 |阅读模式

最近,新出来的AI8H2K12U-B版芯片增加了重磅的MDU32D功能,许老师也放出了他提前写好的库,正好我就沾沾许老师的光,来测试一下这个MDU32D。

因为除法对51芯片的时间影响虽大,所以测试就选取32位的除法,对芯片的加速能力进行测试。

以下是测试的部分代码和结果:

unsigned long ul1 = 123456;
/*计算部分测试*/
EA = 0;//避免干扰
P14 = 1;//开始测试,输出为为芯片1脚
for(cnt = 0; cnt<200; cnt++)//循环200次,增加观测时间
{
	r3 = ul1/3;//得数应该为41152,实际测试计算正确
}
P14 = 0;
EA = 1;//结束测试

image.png

image.png

通过计算可以得到,MDU32D对32位除法的加速程度是:

3.25ms/435us=7.47倍

同时,使用MDU32D的时候,还需要注意:

image.png

最后的4个指令,因为其输出是超过原有函数正常定义的宽度的,所以需要在进入计算前对乘数部分的数据进行保护,计算完成后再恢复出来。否则如果连续计算同一个乘数,编译器会优化掉后一个乘数的加载,造成计算结果错误。

image.png

在对16位乘法进行测试的时候,后一个连续运算的数据出现了错误。这里对16位乘法的R4和R5进行保护后,计算结果就正常了。

image.png

不过目前float类型的乘法在复杂小数的情况下出现了一些数值偏差,这部分我就不大会改了,可能要许老师亲自操刀来解决了。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2024-12-28 20:03:35 | 显示全部楼层
以下是目前编译使用的MDU32D Lib库,上传分为源码版本和编译后lib库版本:
浮点数乘法还有点精度问题(但是我不会修),其他测试都是OK的

lib库: STC8_MDU32D_V1.LIB (11.39 KB, 下载次数: 34)
源码压缩包: 许老师版本:STC8_MDU32D_LIB_V1.zip (90.8 KB, 下载次数: 39)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2025-05-01 08:43:07
已绑定手机

2

主题

106

回帖

262

积分

中级会员

积分
262
发表于 2024-12-30 11:21:26 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2025-04-30 13:36:04
已绑定手机

34

主题

171

回帖

1177

积分

金牌会员

积分
1177
发表于 2024-12-30 11:27:45 | 显示全部楼层
牛,向楼主学习.谢谢你的源码.汇编LIB库!看不懂转成C语言多好啊

点评

您好,感谢关注。 MDU32D是使用R0~R7寄存器组进行计算的,为了让计算更加高效,所以必须使用汇编。 包括一些压栈弹栈操作,也是只有汇编才能使用的  详情 回复 发表于 2024-12-30 12:52
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2024-12-30 12:52:55 | 显示全部楼层
East W*** 发表于 2024-12-30 11:27
牛,向楼主学习.谢谢你的源码.汇编LIB库!看不懂转成C语言多好啊

您好,感谢关注。
MDU32D是使用R0~R7寄存器组进行计算的,为了让计算更加高效,所以必须使用汇编。
包括一些压栈弹栈操作,也是只有汇编才能使用的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-30 14:02:51 | 显示全部楼层
应该取随机数来测试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:166
  • 最近打卡:2025-04-30 13:36:04
已绑定手机

34

主题

171

回帖

1177

积分

金牌会员

积分
1177
发表于 2024-12-31 17:16:17 | 显示全部楼层
王*** 发表于 2024-12-30 12:52
您好,感谢关注。
MDU32D是使用R0~R7寄存器组进行计算的,为了让计算更加高效,所以必须使用汇编。
包括 ...

学习了.谢谢王版主的解答
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2025-2-7 07:39:56 | 显示全部楼层
关于 float类型的乘法在复杂小数的情况下出现了一些数值偏差,
===========================================
请举出具体实例(比如 某数*某数 , 应该为 某数, 但实际值不准确),  便于跟踪查找原因

点评

经查看源代码,看到问题是两个float类型的数据相乘,具体代码为: float f1 = 3.141592; float f2 = 9.330303; r42 = f1*f2;//正常为29.312006,异常,输出为26.562006 通过对比不添加数学库和添加数学库可以得到两  详情 回复 发表于 2025-2-9 17:20
计算例如1.5*2这种是准确的,但是计算例如1.23456*5.67892这种长一些的就有问题了。 使用无mdu库情况下是准确的。 我目前在外面,没法给出有问题的准确数值,稍晚一些我用电脑给出验证截图和实际有问题的数值  详情 回复 发表于 2025-2-9 10:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-2-7 08:27:17 | 显示全部楼层
应该不止加速这么点
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:381
  • 最近打卡:2025-05-01 08:27:28
已绑定手机

10

主题

146

回帖

458

积分

中级会员

积分
458
发表于 2025-2-7 08:36:09 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:49 , Processed in 0.148591 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表