找回密码
 欢迎注册
楼主: 无心人

[讨论] B计划之长加法最佳算法讨论

[复制链接]
 楼主| 发表于 2008-4-8 16:54:23 | 显示全部楼层
那必须保证数字bit长度是128倍数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-8 17:05:14 | 显示全部楼层
No,循环展开可处理任意长度,加上一个 收尾处理部分 即可。 如长度为 103,使用4路循环展开,则 第1部分:循环步:25,每步 处理 4DWORD, 总共处理 25×4=100 DWORD 第2部分(收尾部分):循环步:3, 每步处理 1 DWORD, 总共处理 3×1=3 DWORD 二者合计,共处理了 103 DWORD。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-8 17:16:03 | 显示全部楼层
movd mm1, [esi] movd mm2, [edi] paddq mm1, mm2 movd mm3, [esi+4] movd mm4, [edi+4] paddq mm3, mm4 movd mm5, [esi+8] movd mm6, [edi+8] paddq mm5, mm6 movd mm7, [esi+12] movd mm2, [edi+12] paddq mm7, mm2 paddq mm0, mm1 movd [ebx], mm0 psrlq mm0, 32 paddq mm0, mm3 movd [ebx+4], mm0 psrlq mm0, 32 paddq mm0, mm5 movd [ebx+8], mm0 psrlq mm0, 32 paddq mm0, mm7 movd [ebx+12], mm0 psrlq mm0, 32 add esi, 16 add edi, 16 add ebx, 16 sub ecx, 1 jne label 29条, 如果使用ecx做地址参数,可到27条 原4次循环是最低36条, 节约的有限, 主要看并行度 [ 本帖最后由 无心人 于 2008-4-16 11:30 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-8 17:38:36 | 显示全部楼层
确实能提高速度 原始的3220ms/100万次*1024DWORD 4个一起2588ms/100万次*1024DWORD 不过这个128bit长度的倍数要提前做好限定 否则只能考虑在程序里处理剩余部分!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-8 17:46:45 | 显示全部楼层
收尾倒好做 mov ecx, [len] mov edx, ecx shr ecx, 2 //ecx 为128单位的数量 je label收尾 //肯定长度不够128 。。。 。。。 //收尾 mov ecx, edx and ecx, 3 //ecx = 尾部双字个数 je 退出 //没有尾部 。。。 。。。 //退出 如果考虑并行,还一个问题,一次加多少合适,最多加的数字是很大的 7个寄存器轮流来,可以无限并行下去, 我想合适的数字在下面中选 2, 4, 8, 16个双字一起加 =================================== 刚计算了,4个一起加, 每个双字消耗约等于5时钟 一个的大概是6, 呵呵,基数太小了 改进1个时钟就造成程序复杂很多啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-8 18:05:22 | 显示全部楼层
对于编写高性能的程序,常常需要权衡程序效率和复杂度之间的平衡。1路->4路,性能提高明显, 4路 -〉8路 则性能提高的就很有限了。从GMP的源代码可以看出,他使用的循环展开一般为4-6路。个人觉得4路循环展开应该是一个不错的选择,兼顾了复杂性和性能。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-8 19:46:56 | 显示全部楼层
恩 回家路上也想了 就在四个加上最合适了 不过,29条指令消耗了大约20个时钟 不知道算不算好 ===================================== 另外,似乎乘法也能一次乘四个吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-10 19:44:25 | 显示全部楼层
我觉得,如果采用基为 $2^30$,使用ALU指令来做,速度应该也很快。有空我给出一个实现。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-10 20:07:42 | 显示全部楼层
你是说加法么? 加法用2^30多一个and操作
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-10 20:49:51 | 显示全部楼层
这次你说对了。但是,AND指令很快,相对于使用$2^32$必须使用ADC 指令,速度也应该快不少,另外使用一些快速的ALU指令,也许比64bit的SSE2加法指令更快。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-15 10:42 , Processed in 0.025494 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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