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

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

[复制链接]
发表于 2008-3-27 11:12:32 | 显示全部楼层
我的笔记本是core2的,有没有完整的直接可以编译的工程文件,我可以给你们测试一下看看。
呵呵,我现在对汇编不感兴趣,看不懂你们写的东东,所以工程要弄的容易一些,最好直接编译然后运行就行。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 11:26:27 | 显示全部楼层
那太好了,我在 69# 里的附件:http://emath.5d6d.com/attachment.php?aid=151
已含有除 76# 之外的所有待测函数的源代码及编译好的程序,
麻烦测试一下,最好是添加上 liangbch 76F 的那个版本。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-27 11:40:33 | 显示全部楼层
看到了PMOVZXDQ
可惜是4.1的
而且至今没双字加乘指令
恨啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 12:42:02 | 显示全部楼层
忽然想起一件事情,不知mathe使用的是什么编译器,能否编译SSE2指令。我用的是VC6,需要打上补丁才能编译SSE2指令。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 12:44:35 | 显示全部楼层
用mingw下的 gcc(我的版本3.4.5)
g++ -O2 -msse2
最近发现很多情况下比vc(2008 ,2005 ,6)生成代码速度要好点(10%)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 13:01:05 | 显示全部楼层
Test function: UInt128x128To256_ANSI_C32(..) 10000000 times...
Elapsed time: 556.370 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_40F(..) 10000000 times...
Elapsed time: 572.960 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_42F(..) 10000000 times...
Elapsed time: 337.016 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_54F(..) 10000000 times...
Elapsed time: 469.597 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_56F(..) 10000000 times...
Elapsed time: 414.884 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_58F(..) 10000000 times...
Elapsed time: 424.711 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

Test function: UInt128x128To256_SSE2_69F(..) 10000000 times...
Elapsed time: 432.494 ms
  F948343B 548A79E4 C7747A7F 50B043E3 * 11701FE6 1BB04BEF 90B2210D 9FBE6FE9
= 10FAFA1E 9ABA944F D7D327C7 0A9CF98F   FC7C1B26 10B148C6 BD45C460 3D57369B

42F最快(直接运行下载的附件,没有重新编译)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 13:06:21 | 显示全部楼层
添加了76F,这个最快,只是编译时要报告警告:
warning C4799: function 'UInt128x128To256_SSE2_76F' has no EMMS instruction
这个是什么?

Test function: UInt128x128To256_ANSI_C32(..) 10000000 times...
Elapsed time: 1232.114 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_40F(..) 10000000 times...
Elapsed time: 419.712 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_42F(..) 10000000 times...
Elapsed time: 396.373 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_54F(..) 10000000 times...
Elapsed time: 518.339 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_56F(..) 10000000 times...
Elapsed time: 406.312 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_58F(..) 10000000 times...
Elapsed time: 432.254 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_69F(..) 10000000 times...
Elapsed time: 437.080 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20

Test function: UInt128x128To256_SSE2_76F(..) 10000000 times...
Elapsed time: 293.336 ms
  510273F7 F068776C 608E1B2B FF4C2014 * BC400092 1D501F38 E5E80D2B E9440BE8
= 3B920DF5 4F359701 2EA095F0 E982E5E3   F588D808 7DC09141 948A049E 5BADEE20
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 13:19:15 | 显示全部楼层
原帖由 mathe 于 2008-3-27 13:06 发表
添加了76F,这个最快,只是编译时要报告警告:
warning C4799: function 'UInt128x128To256_SSE2_76F' has no EMMS instruction
这个是什么?
...


因为其中用了 MMX 寄存器,需要执行 EMMS 指令才能正常使用浮点计算单元。

谢谢 mathe 的测试,
结果部分在意料之中:比如 56F 会比 58F 快;
部分在意料之外,比如说 42F 的不俗表现,以及 ANSI_C32 版本不同编译的巨大反差。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 13:30:15 | 显示全部楼层
那没有调用是否结果会不正确,从而测试数据不准?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-27 13:30:53 | 显示全部楼层
我用的VC2005应该没有问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-5-16 08:04 , Processed in 0.044045 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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