找回密码
 欢迎注册
查看: 9841|回复: 3

[擂台] 高难度汇编问题: 64位乘

[复制链接]
发表于 2008-3-31 17:10:56 | 显示全部楼层 |阅读模式

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

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

×
有64位整数保存在xmm0, xmm1低64位 不借助任何其他寄存器,只使用xmm0-xmm7 在20条SSE2指令内计算xmm0 = xmm0 * xmm1 如果达不到20条,24条内也可以
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-1 07:58:06 | 显示全部楼层
pshufd xmm0, xmm0, 11011100b movdqu xmm2, xmm0 pshufd xmm1, xmm1, 11011100b pmuludq xmm0, xmm1 movdq2q mm0, xmm0 psrldq xmm0, 8 movdq2q mm1, xmm0 pshufd xmm1, xmm1, 11001110b pmuludq xmm1, xmm2 movdq2q mm2, xmm1 psrldq xmm1, 8 movdq2q mm3, xmm1 movd eax, mm0 psrlq mm0, 32 paddq mm0, mm2 movd ebx, mm3 movd mm2, ebx psrld mm3, 32 paddq mm0, mm2 paddq mm1, mm3 movd ebx, mm0 psrldq mm0, 32 paddq mm1, mm0 movd mm2, ebx movd mm0, eax psrlq mm2, 32 paddq mm0, mm2 movq2dq xmm1, mm1 movq2dq xmm0, mm0 psrldq xmm1, 8 paddq xmm0, xmm1 31条
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-1 11:19:12 | 显示全部楼层
原帖由 无心人 于 2008-3-31 17:10 发表 有64位整数保存在xmm0, xmm1低64位 不借助任何其他寄存器,只使用xmm0-xmm7 在20条SSE2指令内计算xmm0 = xmm0 * xmm1 如果达不到20条,24条内也可以
楼主出此题 可能是想 找出一个解决长乘 算法的完美算法。这基本是徒劳的。 最根本的解决之道是:大数的表示法不能采用$2^32$进制,而转为采用 $2^31 $或者 $2^30 $进制,即采用每个DWORD存储31位或者30位2进制数,虽然浪费了一点存储空间,也带来乘法次数的增多(增加了大约1/15多一点),但其优点可完全抵消此缺点。并对算法的设计带来实质性的帮助。 对于使用ALU指令来说,可大大降低ADC指令的运行次数。 对于使用SSE2指令来说,可在ALU指令的基础上真正提速2倍,充分发挥SSE2指令 1次可计算2个32bit×32bit 和 64bbit + 64bit的能力。平均而言,每次30 bit × 30bit的运算仅需要使用3条指令。 举例来说,以那个128bit*128bit 的 函数为例,需要 4×4次 32bit × 32bit 的乘法,平均每次 32bit × 32bit 的乘 需要使用 6条以上的指令,以此推算,一个15DWORD( 15×32bit) × 15DWORD 的乘法 需要 15×15×6= 1350次 指令。 而依照本方法,采用2^30进制,一个15×32bit的数需要 16个DWORD 存储,故采用此方式存储,需要16×16次 30bit* 30bit的乘法,所以需要 16*16*3=768条指令,相比前者的1350条指令,单指令数而言,减少至先前的57%,若以指令数和运行时间成反比(即假定每条指令的时间均相同),则此法可提速75%。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-1 13:45:43 | 显示全部楼层
别在这里讨论了 这个题目我自己也失败了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-23 16:02 , Processed in 0.026917 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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