demon 发表于 2025-1-12 14:11:45

【求助】关于long型右移时间非常长的问题

使用AI8051U单片机,在写一条32位乘法运算发现时间特别长的问题

图中右移12位相当于除以4096,但是用>>12时耗时3us,用/4096耗时1.多us(使用了MDU32库),很奇怪(两者得数都一样)。

按道理来说应该是右移更快呀
补充一下,重新写了一下代码,防止是我自己代码产生的干扰
得到的结果是:
还有一个问题,技术手册里面的DPU是怎么用的呀,还是说已经是用上了

demon 发表于 2025-1-12 22:00:46

没有人吗

health 发表于 2025-1-12 23:06:48

正常情况就是这样的。

health 发表于 2025-1-12 23:31:59

和ARM具有桶形移位器不同,51和251每次只能移位一位。251最大只能对16位寄存器移位。
例子中是long型,右移12位,只能一位一位的移,循环12次。
且每移一位也不能硬件单次完成,需要高位低位分别完成再拼接,一大堆指令的。
long移位12位,消耗100多个周期,是比较合理的。
对于ARM来说,一个指令周期就可以完成了。
对于51系列,移位代替算术运算要慎重。

额外提一点:
(aaa>>12) 用 (aaa>>8) >> 4 代替有奇效,速度提升3倍。
(>>8)的时间相比 (>>4)几乎可以忽略不计。

一笔长空 发表于 2025-1-13 00:04:34

health 发表于 2025-1-12 23:31
和ARM具有桶形移位器不同,51和251每次只能移位一位。251最大只能对16位寄存器移位。
例子中是long型,右移 ...

这是什么原理,为什么都是右移12位,后面这样写速度提升3倍

health 发表于 2025-1-13 00:17:25

一笔长空 发表于 2025-1-13 00:04
这是什么原理,为什么都是右移12位,后面这样写速度提升3倍

一个是右移12位,一个是右移4位,时间不就是3倍吗?

demon 发表于 2025-1-13 00:46:01

health 发表于 2025-1-13 00:17
一个是右移12位,一个是右移4位,时间不就是3倍吗?

好的,非常感谢,明天我尝试一下。另外我在技术手册中看到DPU章节中有32位右移n位的指令,耗时3个指令周期。但是没有看到具体使用方法,不知道您是否有了解呢

health 发表于 2025-1-13 01:27:08

demon 发表于 2025-1-13 00:46
好的,非常感谢,明天我尝试一下。另外我在技术手册中看到DPU章节中有32位右移n位的指令,耗时3个指令周 ...

8051没有DPU

demon 发表于 2025-1-13 15:22:40

health 发表于 2025-1-13 01:27
8051没有DPU

好的
刚刚实验了一下,用>>8再>>4确实要快一些,差不多快200ns

Ayb_ice 发表于 2025-1-13 15:58:32

MDU就是加速乘除的,所以/4096还快些
页: [1] 2
查看完整版本: 【求助】关于long型右移时间非常长的问题