找回密码
 欢迎注册
查看: 25006|回复: 15

[测试] 好消息:在双核上测试,我的 HugeCalc 核心算法效率全面超出 GMP!:)

[复制链接]
发表于 2008-1-3 16:58:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
好消息,在双核上测试,我的 HugeCalc 核心算法效率全面超出 GMP
GMP:GMP大数库是GNU项目的一部分,诞生于1991年。GMP库的运行速度非常快,它的官方网站上称自己为地球上最快的大数库)
  1.                                        GMP          HugeCalc-HI     HugeCalc-HX
  2. Fib[100000000](  69424191 Bits )     4.349451 s      3.702678 s      3.479291 s
  3. Fib[200000000]( 138848382 Bits )     9.424257 s      7.230688 s      6.871886 s
  4. Fib[400000000]( 277696765 Bits )    20.659469 s     15.330399 s     14.545750 s
复制代码
推荐
所用测试机台参数见:http://www.emath.ac.cn/hugecalc/cpuz.htm

测试代码如下:   Fib.zip (508.36 KB, 下载次数: 33)
  1. // DESCRIPTION for Fib.cpp :
  2. //     Defines the entry point for the console application.
  3. // 目的:测试 GMP 与 HugeCalc 两大高精度算法库核心算法效率
  4. //       因为计算 Fibonacci 本身可优化的地方不多,关键是大数乘法及大数平方,
  5. //       故,通过测试 Fibonacci 效率而检测算法库最核心的大数乘法(平方)效率。
  6. //
  7. // 设计:郭先强 ( gxqcn@163.com; HugeCalc@Gmail.com )
  8. // 日期:2008-01-03
  9. //
  10. // Web: http://www.emath.ac.cn/
  11. // BBS: http://bbs.emath.ac.cn/
  12. //
  13. //////////////////////////////////////////////////////////////////////////

  14. // Project -> Setting -> C/C++ -> Code Generation --> Use run-time library:
  15. //      Win32 Debug:    Debug Multithreaded DLL
  16. //      Win32 Release:  Multithreaded DLL

  17. #include < iostream.h >

  18. #include < gmp.h >

  19. #include < HugeCalc.h > // 公共接口
  20. #include < HugeInt.h >  // 10进制系统
  21. #include < HugeIntX.h > // 16进制系统

  22. #pragma message( "automatic link to .../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
  23. #pragma comment( lib, "gmp.lib" )
  24. #pragma comment( lib, "HugeCalc.lib" )

  25. #if 0
  26. #   define INDEX_MIN     10000000UL /*1e7*/
  27. #else
  28. #   define INDEX_MIN    100000000UL /*1e8*/
  29. #endif
  30. #   define INDEX_MAX    (INDEX_MIN << 2)

  31. int main(int argc, char* argv[])
  32. {
  33.     cout << "Call " << HugeCalc::GetVer() << endl;

  34.     if ( HC_LICENSE_NONE == HugeCalc::GetLicenseLevel() )
  35.     {
  36.         cout << "\r\n警告:您未通过 HugeCalc.dll 的许可认证!\r\n" \
  37.             << "\r\n解决方案可选下列方案之一:" \
  38.             << "\r\n    一、请将本程序移动到“/CopyrightByGuoXianqiang/[../]”目录下运行;" \
  39.             << "\r\n    二、或请在 HugeCalc.chm 中进行注册(一劳永逸)。" \
  40.             << endl;
  41.     }
  42.     else
  43.     {
  44.         for ( UINT32 u32Index = INDEX_MIN; u32Index <= INDEX_MAX; u32Index <<= 1 )
  45.         {
  46.             cout << "\r\n--------------------------------\r\n" << endl;
  47.             cout << "Calculate Fib[" << u32Index << "]:\r\n" << endl;

  48. #if 1
  49.             // 测试 GMP
  50.             {
  51.                 mpz_t hugeFIB;
  52.                 mpz_init( hugeFIB );

  53.                 HugeCalc::EnableTimer( TRUE );
  54.                 HugeCalc::ResetTimer();
  55.                 mpz_fib_ui( hugeFIB, u32Index );
  56.                 HugeCalc::EnableTimer( FALSE );

  57.                 cout << "GMP used time: " << HugeCalc::GetTimerStr() << " ( " \
  58.                     << mpz_sizeinbase( hugeFIB, 2 ) << " Bits )" << endl;

  59.                 mpz_clear( hugeFIB );
  60.             }
  61. #endif

  62.             // 测试 HI
  63.             {
  64.                 CHugeInt hugeFIB;

  65.                 HugeCalc::EnableTimer( TRUE );
  66.                 HugeCalc::ResetTimer();
  67.                 hugeFIB.Fibonacci( u32Index );
  68.                 HugeCalc::EnableTimer( FALSE );

  69.                 cout << "HI  used time: " << HugeCalc::GetTimerStr() << " ( " \
  70.                     << hugeFIB.GetDigits() << " Digits )" << endl;
  71.             }

  72.             // 测试 HX
  73.             {
  74.                 CHugeIntX hugeFIB;

  75.                 HugeCalc::EnableTimer( TRUE );
  76.                 HugeCalc::ResetTimer();
  77.                 hugeFIB.Fibonacci( u32Index );
  78.                 HugeCalc::EnableTimer( FALSE );

  79.                 cout << "HX  used time: " << HugeCalc::GetTimerStr() << " ( " \
  80.                     << hugeFIB.GetBits() << " Bits )" << endl;
  81.             }
  82.         }
  83.     }

  84.     cout << endl;
  85.     system( "pause" );

  86.     return 0;
  87. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-1-3 21:10:17 | 显示全部楼层
上贴附件有源代码及编译好的测试程序(为减轻论坛压力,注册本论坛后才可下载)。

可以预见的是,如果在四核上对比测试,HugeCalc 将领先 GMP 更多;
可惜我没有这样的测试环境,哪位热心网友来帮这个忙?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-1-4 07:58:07 | 显示全部楼层

关闭 SSE2 指令后的测试结果

在 HugeCalc.ini 中设定“SSE2Support = 0”,可将 SSE2 指令支持关闭(仅对 HugeCalc 有效),
在同台机器上测试的数据如下:
  1.                                        GMP          HugeCalc-HI     HugeCalc-HX
  2. Fib[100000000](  69424191 Bits )     4.346209 s      4.287438 s      4.155507 s
  3. Fib[200000000]( 138848382 Bits )     9.420596 s      8.487578 s      8.298355 s
  4. Fib[400000000]( 277696765 Bits )    20.654150 s     18.065711 s     17.668569 s
复制代码
即便在这种不公平的测试条件下,HugeCalc 依然胜出!

注:CPU 的发展趋势是多核,且一定会支持 SSE2 等超流水线指令集,所以 HugeCalc 具有更好的发展潜力。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-1-4 10:29:28 | 显示全部楼层
楼主可给出更一般性的功能测试,比如大数乘法。
大数乘法是大数库的核心,是大数除法的基础。不同的实现差异极大。
建议楼主给出不同尺度下大数乘法的性能对比,另外也可以使用多个platform进行测试,比如在单核CPU下的性能对比。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-1-14 11:49:49 | 显示全部楼层
gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib(n)花费的时间等。
然后,用户就可以直接将测试报告发送给你。
要不然,每次产生测试报告都要手动产生,很麻烦,大家都不大会愿意的。

当然跨平台可能比较麻烦,比如在Linux平台,如果不公开源码很难保证预编译的代码在所有版本(或大多数)的Linux上可以运行的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-1-14 21:23:08 | 显示全部楼层
原帖由 mathe 于 2008-1-14 11:49 发表
gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib ...


这是个好建议。
不过因为时间精力关系,我申请的是静态虚拟主机,无法让用户自动将数据采集好发送到自己的网站。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-1-14 21:41:47 | 显示全部楼层
不是说让用户自动发送到网站。
比如你在CSDN上发贴让大家做测试,我看到了想做一下测试,结果花费了很长时间去尝试如何使用。
比如如果能够简化成:
按Ctrl+Shift+T,计算机就自动测试,然后将测试结果以文本方式现在在对话框中。
此后,用户只要复制测试结果,贴到BBS上就可以了。
此外还可以让用户通过发Email方式发送测试报告给你也可以,这个可以通过调用MAPI实现。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-1-14 21:46:50 | 显示全部楼层
好的,争取在下一版中实现(多核时还自动设定所用不同的核数,是否使用SSE2/SSE5指令集等)。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-2-1 19:39:51 | 显示全部楼层
这个的确是很令人震惊的结果!据我所知,GMP曾经是很快的计算库
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-2-2 09:27:15 | 显示全部楼层
原帖由 282842712474 于 2008-2-1 19:39 发表
这个的确是很令人震惊的结果!据我所知,GMP曾经是很快的计算库


几年前曾有位参与GMP核心算法开发的一位台湾人对我说,GMP速度是HugeCalc的1.7倍,
但HugeCalc经过最近几次核心大提速,内部速度已翻番,且自动支持多核等,所以才能后来居上。

为追求高效,除了在算法上不断突破改进,还将内核几乎全手工汇编,涉及ALU、SSE2等指令集,工作量非常之大。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-12-22 00:14 , Processed in 0.032524 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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