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

[擂台] x86上128位二进制乘法最快速算法征解

[复制链接]
发表于 2008-3-5 20:23:45 | 显示全部楼层

代码粘贴方式示例

函数 UInt128x128To256_SSE2_11F() 代码如下(登陆bbs才可见):
游客,本帖隐藏的内容需要积分高于 2 才可浏览,您当前积分为 0
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-5 20:28:55 | 显示全部楼层
总指令数肯定过200的
呵呵
稍微写差点就差好多时钟
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-5 20:34:45 | 显示全部楼层
我心中已经形成了一个较好的方案,是 SSE2 版本的,等调好后再发给大家测试测试。。。
6# 的压缩包中我给出了一个ANSI C版的函数,应该是很高效的了,谁可以再来突破?

大家在发代码之前务必进行一些自测,尤其是算法正确性方面的测试,可对比我给的那版标准C写的函数的结果进行必要的验证。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-5 21:11:37 | 显示全部楼层
我也想到一个
但太复杂
刚才倒来倒去
终于倒乱了
等会重来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-5 21:49:28 | 显示全部楼层
//全部16个乘法, 49条指令
//明天再研究加法
mov esi, left
mov edi, right
mov ebx, result
xor xmm0, xmm0
movd xmm0, [esi]
movq mm0, mm0
xor xmm1, xmm1
movd xmm1, [edi]
movq mm1, xmm1
xor xmm2, xmm2
movd xmm2, [esi+4]
movq mm2, xmm2
xor xmm3, xmm3
movd xmm3, [edi+4]
movq mm3, xmm3
xor xmm4, xmm4
movd xmm4, [esi+8]
movq mm4, xmm4
xor xmm5, xmm5
movd xmm5, [edi+8]
movq mm5, xmm5
xor xmm6, xmm6
movd xmm6, [esi+12]
movq mm6, xmm6
xor xmm7, xmm7
movd xmm7, [edi+12]
movq mm7, xmm7
// mm0:2:4:6=l:0:1:2:3
// mm1:3:5:7=r:0:1:2:3
//xmm0:2:4:6=l:0:1:2:3
//xmm1:3:5:7=r:0:1:2:3
pmuludq mm0, xmm1 //mm0=0:0
movd eax, mm3
pmuludq mm2, xmm3 //mm2=1:1
movd edx, mm6
pmuludq mm4, xmm5 //mm4=2:2
pmuludq mm6, xmm7 //mm6=3:3
pmuludq mm1, xmm2 //mm1=1:0
pmuludq mm3, xmm0 //mm3=0:1
pmuludq mm5, xmm0 //mm5=0:2
pmuludq mm7, xmm2 //mm7=3:0
pmuludq xmm0, xmm7 //xmm0=0:3
pmuludq xmm2, xmm5 //xmm2=1:2
pmuludq xmm1, xmm4 //xmm1=2:0
pmuludq xmm3, xmm4 //xmm3=2:1
pmuludq xmm4, xmm7 //xmm4=2:3
pmuludq xmm6, xmm5 //xmm6=3:2
//xmm5=r2
//xmm7=r3
movd xmm5, [esi+4]
pmuludq xmm5, xmm7 //xmm5=1:3
mul edx
movd xmm7, edx
pshlq xmm7, 32
movd xmm7, eax //xmm7=3:1
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-5 21:54:34 | 显示全部楼层
//一次计算出16个乘法
//全SSE2版本, 40条, 15楼宣布作废
//未做优化, 还存在不完美地方和错误
mov esi, left
mov edi, right
mov ebx, result
movd xmm0, [esi]
movdq2q mm0, xmm0
movd xmm1, [edi]
movdq2q mm1, xmm1
movd xmm2, [esi+4]
movdq2q mm2, xmm2
movd xmm3, [edi+4]
movdq2q mm3, xmm3
movd xmm4, [esi+8]
movdq2q mm4, xmm4
movd xmm5, [edi+8]
movdq2q mm5, xmm5
movd xmm6, [esi+12]
movdq2q mm6, xmm6
movd xmm7, [edi+12]
movdq2q mm7, xmm7
// mm0:2:4:6=l:0:1:2:3
// mm1:3:5:7=r:0:1:2:3
//xmm0:2:4:6=l:0:1:2:3
//xmm1:3:5:7=r:0:1:2:3
pmuludq mm0, [edi] //mm0=0:0
pmuludq mm2, [edi+4] //mm2=1:1
pmuludq mm4, [edi+8] //mm4=2:2
pmuludq mm6, [edi+12] //mm6=3:3
pmuludq mm1, [esi+4] //mm1=1:0
pmuludq mm3, [esi] //mm3=0:1
pmuludq mm5, [esi] //mm5=0:2
pmuludq mm7, [esi+3] //mm7=3:0
pmuludq xmm0, xmm7 //xmm0=0:3
pmuludq xmm2, xmm5 //xmm2=1:2
pmuludq xmm1, xmm4 //xmm1=2:0
pmuludq xmm3, xmm4 //xmm3=2:1
pmuludq xmm4, xmm7 //xmm4=2:3
pmuludq xmm6, xmm5 //xmm6=3:2
//xmm5=r2
//xmm7=r3
movd xmm5, [esi+4]
pmuludq xmm5, xmm7 //xmm5=1:3
movq xmm7, [esi+12]
pmuludq xmm7, [edi+4] //xmm7=3:1
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-6 10:24:54 | 显示全部楼层
//并行调整1, SSE2, 35条指令, 得到全部16个乘法
//是否可以更精简, 有待考虑, 压缩到28条以下?
mov esi, left
mov edi, right
mov ebx, result
movd xmm0, [esi]
movdq2q mm0, xmm0
pmuludq mm0, [edi] //mm0=0:0
pmuludq xmm0, [edi+12] //xmm0=0:3
movd xmm1, [edi]
movdq2q mm1, xmm1
pmuludq mm1, [esi+4] //mm1=1:0
pmuludq xmm1, [edi] //xmm1=2:0
movd xmm2, [esi+4]
movdq2q mm2, xmm2
pmuludq mm2, [edi+4] //mm2=1:1
pmuludq xmm2, [edi+8] //xmm2=1:2
movd xmm3, [edi+4]
movdq2q mm3, xmm3
pmuludq mm3, [esi] //mm3=0:1
pmuludq xmm3, [esi+8] //xmm3=2:1
movd xmm4, [esi+8]
movdq2q mm4, xmm4
pmuludq mm4, [edi+8] //mm4=2:2
pmuludq xmm4, [edi+12] //xmm4=2:3
movd mm5, [edi+8]
pmuludq mm5, [esi] //mm5=0:2
movd xmm5, [esi+4]
pmuludq xmm5, [edi+12] //xmm5=1:3
movd xmm6, [esi+12]
movdq2q mm6, xmm6
pmuludq mm6, [edi+12] //mm6=3:3
pmuludq xmm6, [edi+8] //xmm6=3:2
movd mm7, [edi+12]
pmuludq mm7, [esi+12] //mm7=3:0
movd xmm7, [esi+12]
pmuludq xmm7, [edi+4] //xmm7=3:1
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-6 10:44:19 | 显示全部楼层
PMULUDQ 一次可以计算 2个 32bit * 32bit, 理论上,如果用PMULUDQ计算乘法,最少只需8次。楼上却用了16次PMULUDQ,远远没有发挥 SSE2指令的优势。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-6 11:02:53 | 显示全部楼层

然后陷于解开包装的麻烦里?
等搞清混乱的顺序再考虑那个吧

这16个乘就够麻烦算加法的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-6 11:06:43 | 显示全部楼层
而且, 我仔细查了SSE2指令
并无直接包装两个32位整数到0:31/64:95的
需要自己写多指令
并不能抵消少写乘法的开销

你自己写下看看?

我想到的法子现在暂时没心情写
因为可能不能达到最理想方式
即一次两个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-24 16:14 , Processed in 0.061144 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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