找回密码
 欢迎注册
查看: 25948|回复: 14

[讨论] 纯C下的长乘法最佳算法讨论

[复制链接]
发表于 2008-9-29 11:07:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
假设纯C语言编程,硬件CPU支持32位整数,如何写长乘法速度最快? 使用 int64还是自己写代码? 请大家讨论 GxQ最近写的程序应该最清楚吧 呵呵 以两个32个双字的整数相乘做例子说明 不使用任何乘法加速算法 仅考虑硬乘法算法,即模拟手算的算法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-29 11:14:12 | 显示全部楼层
我能想到的是 模拟一个通过4个16X16 位的乘法计算32X32位乘法的过程 当然也可以考虑3次乘法的那个算法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-29 13:04:25 | 显示全部楼层
我为了减少内存读写操作,尤其是写操作的次数, 每个段并未用足32bit,而是与HugeCalc内部的一致——仅28bits, 这样最大的好处是:可以完全模拟小学生的计算, 把结果每个位上的乘积全部累加到一个64bit的变量中后再规格化。 (是否最优,因时间紧迫缘故,尚未与其它算法进行比较)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-29 13:34:53 | 显示全部楼层
原帖由 无心人 于 2008-9-29 11:14 发表 我能想到的是 模拟一个通过4个16X16 位的乘法计算32X32位乘法的过程 当然也可以考虑3次乘法的那个算法
我移植的那款DSP型号是BalckFin531,内部居然是16位的, 它的32位乘就是通过4次乘法实现的(是它编译器自动生成的), 我也怀疑是否可用Karatsuba算法减少一次乘法来加速。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-29 14:35:52 | 显示全部楼层
不过 我中午想了 Karatsuba乘法无论哪种写法 中间的那个乘法结果可能存在进位的 如何处理? 倾向于使用 $(X_1-X_0)(Y_0-Y_1) + X_1X_0 + Y_1Y_0$ 这种写法 也许能简化进位的测试 但此写法要提前测试 $(X_1-X_0)(Y_0-Y_1)$ 乘法的符号 呵呵 所以我倾向于 3乘法算法也许并不比4乘法快多少
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-9-29 14:49:36 | 显示全部楼层
机器内部指令对有无符号差别不大, 其中加减法指令是不分有无符号的, 乘法有无符号差别不大, 除法指令才对此要敏感点吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-9-29 15:34:46 | 显示全部楼层
我的意思 3个乘法的需要计算2次加法 如果不区分符号 怎么知道是否产生进位了?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-2 22:00:38 | 显示全部楼层
这方面不是流行用FFT做卷积么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-10-3 10:38:31 | 显示全部楼层
16个双字下,用FFT不合适吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-10-5 11:43:00 | 显示全部楼层

回复 4# gxqcn 的帖子

应该不能提速,只有当n达到一定程度,通过使用3次 n *n 乘法来计算2n * 2n 的乘法才能加速,这个n 应该不会太小,我记得GMP中,对于乘法这个n大于17,对于平方这个n也需要大于11.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 00:05 , Processed in 0.025881 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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