大数运算基选择测试
两个二进制数字, bit位长度是28*30*32分别用28,30,32个bit为一个处理单位
做加法和乘法
测试在不同基选择下的效果
===============================
这么写如果不妥, 你们可提出意见
咱一起商量测试方案 应该加上一些限制,如不得使用高级算法,如分治法,toom-cook 算法等。 28*30*32=26880
除非有贼快的FFT处理器,否则没人敢用FFT
同样Toom-n在这么小,优势也不大
就那个K算法还能加速
如果位数太大
可以考虑做多次测试
28*32, 28*30,30*32各一次 //我先提交我的函数,由旧代码修改成
//终于接近完美了,不过还有几条指令似乎可以省掉
//怎么省想不出来 :)
voidlMul_yaos(uint32*result, uint32*left, uint32*right, uint32 sLeft, uint32 sRight)
{
__asm {
mov edx, sLeft
movesi, dword ptr
movedi, dword ptr
movebx, dword ptr
mbinmul2:
mov eax, ebx
pxor mm0, mm0
mov ecx, sRight
movd mm1, dword ptr
mov ebp, edi
mbinmul3:
movd mm2, dword ptr
lea edi,
movd mm3, dword ptr
pmuludq mm2, mm1
paddq mm0, mm3
paddq mm0, mm2
movd dword ptr , mm0
psrlq mm0, 32
lea ebx,
sub ecx, 1
jnz mbinmul3
mov edi, ebp
movd dword ptr , mm0
mov ebx, eax
lea esi,
lea ebx,
sub edx, 1
jnz mbinmul2
emms
}
} 建议将测试的bit长度缩小为:7*15*32 = 3360
在 28*30*32bits 时早该用更好的算法了。 好
同意你的意见
我只管提交我的标准32位乘法
具体测试你们来
:) 我的代码必须配合一个清零函数
等我写来
:) 我打算 完全用C 编写一个程序,看看你的那个使用 SSE2 指令编写的程序能比我的C版的程序快多少。 :D
有限的很吧
假设我的时间是100
C写的应该在120-160之间 原帖由 无心人 于 2008-4-2 11:24 发表 http://images.5d6d.net/dz60/common/back.gif
:D
有限的很吧
假设我的时间是100
C写的应该在120-160之间
由那个128bit * 128 bit 帖子,得出一个结论,使用MMX寄存器的版本(96楼)最高可比使用ALU指令的版本(102楼)快2.33倍(在我的电脑上,前者运行时间为400.665,或者运行时间为935.273),也就是说 使用 MMX的版本 加速比 可达 2.33倍.
退一步,完全使用c的版本性能可以达到102楼的性能, 我的C版程序运行时间应为 你的4#楼那个版本的2.33倍,你说预计可达你的你的版本的120-160%, 这等于承认了基为2^30的版本速度为基为2^32版本的 146%- 194%.