Microchip
直播中

张立

8年用户 206经验值
私信 关注
[问答]

怎么最快为无符号的32位整数做整数平方根?

作为项目的一部分,我需要最快的方法来为无符号的32位整数做整数平方根。因此,我在网上找到了几个例程(不是StackExchange;-),并决定使用模拟器将编译器与手动优化的汇编器进行比较。经过一番摸索之后,我得到了以下结果:-M1和M2是我找到的两种算法,参见源代码。结果是在由下面的代码片断生成的49.5MHz的cpu锁中,对于试图尽可能消除高速缓存的影响的isqrt(n)平均16个结果。所有看起来都还不错,FPU的速度要快得多(正如我猜想的那样),而且我的手动汇编代码总是比编译器快20%,或者最快算法的速度快10%。然后我在真实的硬件上尝试过(PIC32MX1024EFG064),我发现:-1。FPU在实际硬件2中相当慢。在实际的硬件中,CPU的速度要慢得多。对于第一种方法(M1,M1ASM),我的ASM代码实际上稍慢,而不是模拟器所示的更快的10-20%。编译器代码和我的ASM都是30%慢速的ILL 4。对于第二种方法(M2,M2ASM),模拟器给我的asm提供了相同的优势(2-9%),但是编译器代码和asm都慢了~5-10%的IRLC结论:-模拟器对去bug(显示与实际硬件相同的错误/结果)非常有用。SM/编译器用于EF系列的速度。它可以用于比较算法,但是偏差(30%IRL与10%Sim)使这种情况令人怀疑。在将整数代码与FPU进行速度比较时是没有用的。我认为模拟器需要做更多的工作:-)我将在MX上再试一次,看看模拟器是否给出对于那些感兴趣的人来说(有些评论,如果有人想看看他们是否可以改进我的程序集(非常可能),他们最欢迎在这里发布他们的结果,或者指出我做x而不是y是多么愚蠢,我总是愿意学习!)ISQRT.HISQRT.C

回帖(9)

李子跃

2019-11-1 13:45:08
在MX上几乎相同,但由于某种原因,Sqt()函数的时间匹配?-40MHZPIC32 MX27 0F256D 40MHz
举报

李天竹

2019-11-1 13:55:39
尝试:为了清晰起见,我使用了名称而不是寄存器。
举报

李天竹

2019-11-1 14:25:30
有趣。我不知道MUL指令导致摊位。我只想到给HI/LO写的多指令导致摊位。显然,模拟器有相同的观点:可以重新洗牌:
举报

李子跃

2019-11-1 14:44:18
这使得在模拟器中情况更糟,而在实际硬件中情况更糟(值<0x80000000相同,但值>=0x80000000采用198而不是184个时钟)。实际上我搞砸了(从MZ切换到MX)。在MX上的档位的实际值是2CKS(表2.4),MCU的3CLK用DSP模块(例如MZ,表2.1)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分