找回密码
 欢迎注册
楼主: gxqcn

[测试] HugeCalc vs. GMP

[复制链接]
发表于 2008-3-3 20:52:49 | 显示全部楼层
不同意以C++做C的内核
无论如何
当需要更高的效率的时候
C还是比C++简洁
至于安全性
应该不是高强度数学运算主要考虑的方向
安全性应该在调试时解决
而不能在运行时解决
况且,只要是命令式语言总存在失败的可能
不是用C++就能避免的
只能减少这种可能,仔细的C代码也能达到这种效果
或者说C++并不比见得C高级,++而已
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-4 07:39:46 | 显示全部楼层
C++对类型检查更严格,可以更早地在代码初期发现bug;
如果仅利用C++易包装的特性,而不涉及到其华丽但有损效率的部分,如虚函数、多态等,
对效率的影响几乎微乎其微的,当然前提是取决于开发者的代码质量。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-4 08:22:17 | 显示全部楼层
gxqcn说的也不是没有道理。不过如果我们查看现在一般存在的各种追求效率项目,通常核心部分都是用C些的,然后在外面加上C++的包装。C++的严格类型检查可以帮助没有经验的用户更加方便的使用软件,而C可以用来开发更加有效率的软件。
不过qxqcn说的不错,如果不使用虚函数,多态等,对效率影响是微乎其微的。其实现在很多人开发过程都非常类似,就是用C++写类似C格式的代码。
不过我还是觉得核心应该用C写更加好,毕竟C++函数从库文件里面输出不是很好的习惯,跨编译器可能会带来问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-4 09:05:35 | 显示全部楼层


套用流行术语
多层架构

汇编--C语言--C++语言--ActiveX或者DLL
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-4 10:24:32 | 显示全部楼层
我个人比较赞同mathe的观点。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-3-12 19:27:24 | 显示全部楼层
测试4核
  1. *** 被乘数与乘数长度之比为:1 ***

  2. 现在计算长度(bits): 256
  3.     GMP     包计算时间(us):0.529
  4.     HugeCalc包计算时间(us):0.429
  5. 现在计算长度(bits): 512
  6.     GMP     包计算时间(us):0.709
  7.     HugeCalc包计算时间(us):1.169
  8. 现在计算长度(bits): 1024
  9.     GMP     包计算时间(us):2.356
  10.     HugeCalc包计算时间(us):3.419
  11. 现在计算长度(bits): 1536
  12.     GMP     包计算时间(us):3.966
  13.     HugeCalc包计算时间(us):6.869
  14. 现在计算长度(bits): 2048
  15.     GMP     包计算时间(us):7.573
  16.     HugeCalc包计算时间(us):11.773
  17. 现在计算长度(bits): 3072
  18.     GMP     包计算时间(us):12.634
  19.     HugeCalc包计算时间(us):30.105
  20. 现在计算长度(bits): 4096
  21.     GMP     包计算时间(us):23.766
  22.     HugeCalc包计算时间(us):45.744
  23. 现在计算长度(bits): 8192
  24.     GMP     包计算时间(us):68.002
  25.     HugeCalc包计算时间(us):175.137
  26. 现在计算长度(bits): 10240
  27.     GMP     包计算时间(us):119.289
  28.     HugeCalc包计算时间(us):276.571
  29. 现在计算长度(bits): 16384
  30.     GMP     包计算时间(us):250.870
  31.     HugeCalc包计算时间(us):602.032
  32. 现在计算长度(bits): 64000
  33.     GMP     包计算时间(us):1556.064
  34.     HugeCalc包计算时间(us):4853.969
  35. 现在计算长度(bits): 65536
  36.     GMP     包计算时间(us):1614.730
  37.     HugeCalc包计算时间(us):4726.858
  38. 现在计算长度(bits): 256000
  39.     GMP     包计算时间(us):8891.074
  40.     HugeCalc包计算时间(us):7878.376
  41. 现在计算长度(bits): 512000
  42.     GMP     包计算时间(us):19552.206
  43.     HugeCalc包计算时间(us):13203.075
  44. 现在计算长度(bits): 1048576
  45.     GMP     包计算时间(us):44776.920
  46.     HugeCalc包计算时间(us):24991.444
  47. 现在计算长度(bits): 33554432
  48.     GMP     包计算时间(us):2635778.011
  49.     HugeCalc包计算时间(us):1115918.364
  50. 现在计算长度(bits): 67108864
  51.     GMP     包计算时间(us):6014331.151
  52.     HugeCalc包计算时间(us):1972429.736
  53. 现在计算长度(bits): 100663296
  54.     GMP     包计算时间(us):8599599.111
  55.     HugeCalc包计算时间(us):2948877.860
  56. 请按任意键继续. . .

  57. *** 被乘数与乘数长度之比为:10 ***

  58. 现在计算长度(bits): 256
  59.     GMP     包计算时间(us):0.044
  60.     HugeCalc包计算时间(us):0.266
  61. 现在计算长度(bits): 512
  62.     GMP     包计算时间(us):0.126
  63.     HugeCalc包计算时间(us):0.318
  64. 现在计算长度(bits): 1024
  65.     GMP     包计算时间(us):0.387
  66.     HugeCalc包计算时间(us):0.585
  67. 现在计算长度(bits): 1536
  68.     GMP     包计算时间(us):0.683
  69.     HugeCalc包计算时间(us):1.003
  70. 现在计算长度(bits): 2048
  71.     GMP     包计算时间(us):1.151
  72.     HugeCalc包计算时间(us):1.597
  73. 现在计算长度(bits): 3072
  74.     GMP     包计算时间(us):2.639
  75.     HugeCalc包计算时间(us):3.092
  76. 现在计算长度(bits): 4096
  77.     GMP     包计算时间(us):3.494
  78.     HugeCalc包计算时间(us):5.956
  79. 现在计算长度(bits): 8192
  80.     GMP     包计算时间(us):17.420
  81.     HugeCalc包计算时间(us):19.828
  82. 现在计算长度(bits): 10240
  83.     GMP     包计算时间(us):36.317
  84.     HugeCalc包计算时间(us):39.670
  85. 现在计算长度(bits): 16384
  86.     GMP     包计算时间(us):64.254
  87.     HugeCalc包计算时间(us):132.419
  88. 现在计算长度(bits): 64000
  89.     GMP     包计算时间(us):515.708
  90.     HugeCalc包计算时间(us):4764.293
  91. 现在计算长度(bits): 65536
  92.     GMP     包计算时间(us):536.660
  93.     HugeCalc包计算时间(us):4800.331
  94. 现在计算长度(bits): 256000
  95.     GMP     包计算时间(us):3766.959
  96.     HugeCalc包计算时间(us):5269.944
  97. 现在计算长度(bits): 512000
  98.     GMP     包计算时间(us):11068.725
  99.     HugeCalc包计算时间(us):6354.718
  100. 现在计算长度(bits): 1048576
  101.     GMP     包计算时间(us):32993.579
  102.     HugeCalc包计算时间(us):8881.855
  103. 现在计算长度(bits): 33554432
  104.     GMP     包计算时间(us):1312180.459
  105.     HugeCalc包计算时间(us):344739.904
  106. 现在计算长度(bits): 67108864
  107.     GMP     包计算时间(us):2920021.399
  108.     HugeCalc包计算时间(us):659620.706
  109. 现在计算长度(bits): 100663296
  110.     GMP     包计算时间(us):4192419.428
  111.     HugeCalc包计算时间(us):1119119.609
  112. 请按任意键继续. . .
复制代码

评分

参与人数 1威望 +1 金币 +8 鲜花 +5 收起 理由
gxqcn + 1 + 8 + 5 谢谢你的测试!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-3-12 20:17:13 | 显示全部楼层

谢谢楼上的测试!

以最后四组数据计算,HugeCalc 与 GMP 的效率比依次为:3.715、3.806、4.427、3.746
可看出 HugeCalc 还是非常充分地发挥了四核的功用。

在小规模计算上,HugeCalc暂输于GMP,
但达到一定规模后,HugeCalc会采用高级算法,且自动运用多核技术,从而远超GMP,
根据80/20原则,HugeCalc当前的侧重点取舍是非常成功的!

感谢 风云剑 朋友的测试结果,这是我首次看到的真正四核上的测试对比数据,谢谢!

另外,想请 风云剑 朋友再帮忙测试一下,大数阶乘使用不同核数时的效率,以全面测试HugeCalc对多核的支持程度,
具体参见:200秒,可以做什么?——测测你的电脑精确计算能力
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-16 12:24:29 | 显示全部楼层
我的基为$2^30$的大数乘法已经完成(仅仅实现了硬乘法,kara 乘尚未实现),测试表明,在PIV2.6,MMX的版本大幅领先GMP,下面给出测试和数据。
说明:GMP 使用mathe在csdn发布的动态链接库。运行时间均为毫秒。

Bits coount
_BIN_BaseMul_ALU(A)
_BIN_BaseMul_MMX(B)
GMP( C )
速度比(B/C)
60
0.00003522
0.00003522
0.0000594
1.686542
120
0.00009646
0.00009646
0.00008316
0.862119
180
0.00021972
0.00009264
0.00012834
1.385363
240
0.00035905
0.00011907
0.00019499
1.637608
300
0.00052825
0.00016233
0.0002728
1.680527
360
0.00073955
0.00020904
0.00035653
1.705559
420
0.0009853
0.00049755
0.00045363
0.911727
480
0.00126933
0.00047479
0.00052395
1.103541
720
0.00345908
0.00182676
0.00133954
0.733287
960
0.00629495
0.00427053
0.00213323
0.499523
1200
0.0098053
0.00611545
0.00324155
0.530059
1440
0.0141623
0.00898395
0.00427993
0.476397
1680
0.01946671
0.01195095
0.00565448
0.473141
1920
0.02569357
0.01597912
0.00693922
0.434268


分析:
可以看到当乘数长度720bit时,我的版本速度将慢于GMP,这是因为当乘数长度较长时,GMP使用 kara_mul, 而我的2个版本都是basecase乘法所致。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-16 12:50:56 | 显示全部楼层


你换我在本论坛发布的dll再测下
=======================
GMP分界点是23*32Bit
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-16 13:13:12 | 显示全部楼层
据我先前的测试,这两个GMP的DLL性能相差无几,
但也可能在某些小规模的计算上存在较大差异。

liangbch 与 无心人 在优化方面作了大量工作,
而这些工作,包括测试等是非常耗神的。

顺带请教一下:64bit下的GMP可曾用到MMX、SIMD系列指令?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-25 16:31 , Processed in 0.048273 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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