gxqcn 发表于 2008-1-3 16:58:47

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

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

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

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

#include < iostream.h >

#include < gmp.h >

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

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

#if 0
#   define INDEX_MIN   10000000UL /*1e7*/
#else
#   define INDEX_MIN    100000000UL /*1e8*/
#endif
#   define INDEX_MAX    (INDEX_MIN << 2)

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

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

#if 1
            // 测试 GMP
            {
                mpz_t hugeFIB;
                mpz_init( hugeFIB );

                HugeCalc::EnableTimer( TRUE );
                HugeCalc::ResetTimer();
                mpz_fib_ui( hugeFIB, u32Index );
                HugeCalc::EnableTimer( FALSE );

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

                mpz_clear( hugeFIB );
            }
#endif

            // 测试 HI
            {
                CHugeInt hugeFIB;

                HugeCalc::EnableTimer( TRUE );
                HugeCalc::ResetTimer();
                hugeFIB.Fibonacci( u32Index );
                HugeCalc::EnableTimer( FALSE );

                cout << "HIused time: " << HugeCalc::GetTimerStr() << " ( " \
                  << hugeFIB.GetDigits() << " Digits )" << endl;
            }

            // 测试 HX
            {
                CHugeIntX hugeFIB;

                HugeCalc::EnableTimer( TRUE );
                HugeCalc::ResetTimer();
                hugeFIB.Fibonacci( u32Index );
                HugeCalc::EnableTimer( FALSE );

                cout << "HXused time: " << HugeCalc::GetTimerStr() << " ( " \
                  << hugeFIB.GetBits() << " Bits )" << endl;
            }
      }
    }

    cout << endl;
    system( "pause" );

    return 0;
}

gxqcn 发表于 2008-1-3 21:10:17

上贴附件有源代码及编译好的测试程序(为减轻论坛压力,注册本论坛后才可下载)。

可以预见的是,如果在四核上对比测试,HugeCalc 将领先 GMP 更多;
可惜我没有这样的测试环境,哪位热心网友来帮这个忙?:)

gxqcn 发表于 2008-1-4 07:58:07

关闭 SSE2 指令后的测试结果

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

注:CPU 的发展趋势是多核,且一定会支持 SSE2 等超流水线指令集,所以 HugeCalc 具有更好的发展潜力。

liangbch 发表于 2008-1-4 10:29:28

楼主可给出更一般性的功能测试,比如大数乘法。
大数乘法是大数库的核心,是大数除法的基础。不同的实现差异极大。
建议楼主给出不同尺度下大数乘法的性能对比,另外也可以使用多个platform进行测试,比如在单核CPU下的性能对比。

mathe 发表于 2008-1-14 11:49:49

gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib(n)花费的时间等。
然后,用户就可以直接将测试报告发送给你。
要不然,每次产生测试报告都要手动产生,很麻烦,大家都不大会愿意的。

当然跨平台可能比较麻烦,比如在Linux平台,如果不公开源码很难保证预编译的代码在所有版本(或大多数)的Linux上可以运行的

gxqcn 发表于 2008-1-14 21:23:08

原帖由 mathe 于 2008-1-14 11:49 发表 http://bbs.emath.ac.cn/images/common/back.gif
gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib ...

这是个好建议。
不过因为时间精力关系,我申请的是静态虚拟主机,无法让用户自动将数据采集好发送到自己的网站。

mathe 发表于 2008-1-14 21:41:47

不是说让用户自动发送到网站。
比如你在CSDN上发贴让大家做测试,我看到了想做一下测试,结果花费了很长时间去尝试如何使用。
比如如果能够简化成:
按Ctrl+Shift+T,计算机就自动测试,然后将测试结果以文本方式现在在对话框中。
此后,用户只要复制测试结果,贴到BBS上就可以了。
此外还可以让用户通过发Email方式发送测试报告给你也可以,这个可以通过调用MAPI实现。

gxqcn 发表于 2008-1-14 21:46:50

好的,争取在下一版中实现(多核时还自动设定所用不同的核数,是否使用SSE2/SSE5指令集等)。

282842712474 发表于 2008-2-1 19:39:51

这个的确是很令人震惊的结果!据我所知,GMP曾经是很快的计算库

gxqcn 发表于 2008-2-2 09:27:15

原帖由 282842712474 于 2008-2-1 19:39 发表 http://bbs.emath.ac.cn/images/common/back.gif
这个的确是很令人震惊的结果!据我所知,GMP曾经是很快的计算库

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

为追求高效,除了在算法上不断突破改进,还将内核几乎全手工汇编,涉及ALU、SSE2等指令集,工作量非常之大。
页: [1] 2
查看完整版本: 好消息:在双核上测试,我的 HugeCalc 核心算法效率全面超出 GMP!:)