mathe 发表于 2008-3-27 11:12:32

我的笔记本是core2的,有没有完整的直接可以编译的工程文件,我可以给你们测试一下看看。
呵呵,我现在对汇编不感兴趣,看不懂你们写的东东,所以工程要弄的容易一些,最好直接编译然后运行就行。:lol

gxqcn 发表于 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的
而且至今没双字加乘指令
恨啊

liangbch 发表于 2008-3-27 12:42:02

忽然想起一件事情,不知mathe使用的是什么编译器,能否编译SSE2指令。我用的是VC6,需要打上补丁才能编译SSE2指令。

tprime 发表于 2008-3-27 12:44:35

用mingw下的 gcc(我的版本3.4.5)
g++ -O2 -msse2
最近发现很多情况下比vc(2008 ,2005 ,6)生成代码速度要好点(10%)

mathe 发表于 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最快(直接运行下载的附件,没有重新编译)

mathe 发表于 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

gxqcn 发表于 2008-3-27 13:19:15

原帖由 mathe 于 2008-3-27 13:06 发表 http://images.5d6d.net/dz60/common/back.gif
添加了76F,这个最快,只是编译时要报告警告:
warning C4799: function 'UInt128x128To256_SSE2_76F' has no EMMS instruction
这个是什么?
...

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

谢谢 mathe 的测试,
结果部分在意料之中:比如 56F 会比 58F 快;
部分在意料之外,比如说 42F 的不俗表现,以及 ANSI_C32 版本不同编译的巨大反差。。。

mathe 发表于 2008-3-27 13:30:15

那没有调用是否结果会不正确,从而测试数据不准?

mathe 发表于 2008-3-27 13:30:53

我用的VC2005应该没有问题
页: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15
查看完整版本: x86上128位二进制乘法最快速算法征解