好消息:在双核上测试,我的 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;
} 上贴附件有源代码及编译好的测试程序(为减轻论坛压力,注册本论坛后才可下载)。
可以预见的是,如果在四核上对比测试,HugeCalc 将领先 GMP 更多;
可惜我没有这样的测试环境,哪位热心网友来帮这个忙?:)
关闭 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 具有更好的发展潜力。 楼主可给出更一般性的功能测试,比如大数乘法。
大数乘法是大数库的核心,是大数除法的基础。不同的实现差异极大。
建议楼主给出不同尺度下大数乘法的性能对比,另外也可以使用多个platform进行测试,比如在单核CPU下的性能对比。 gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib(n)花费的时间等。
然后,用户就可以直接将测试报告发送给你。
要不然,每次产生测试报告都要手动产生,很麻烦,大家都不大会愿意的。
当然跨平台可能比较麻烦,比如在Linux平台,如果不公开源码很难保证预编译的代码在所有版本(或大多数)的Linux上可以运行的 原帖由 mathe 于 2008-1-14 11:49 发表 http://bbs.emath.ac.cn/images/common/back.gif
gxqcn可以在你的软件上添加一个选项“产生测试报告”(可以做成一个隐含的选项,比如按某个不常用的快捷键才会产生),
选择这个选项以后,就可以自动产生一个关于一些标准测试在用户机器上运行的结果,比如计算Fib ...
这是个好建议。
不过因为时间精力关系,我申请的是静态虚拟主机,无法让用户自动将数据采集好发送到自己的网站。 不是说让用户自动发送到网站。
比如你在CSDN上发贴让大家做测试,我看到了想做一下测试,结果花费了很长时间去尝试如何使用。
比如如果能够简化成:
按Ctrl+Shift+T,计算机就自动测试,然后将测试结果以文本方式现在在对话框中。
此后,用户只要复制测试结果,贴到BBS上就可以了。
此外还可以让用户通过发Email方式发送测试报告给你也可以,这个可以通过调用MAPI实现。 好的,争取在下一版中实现(多核时还自动设定所用不同的核数,是否使用SSE2/SSE5指令集等)。 这个的确是很令人震惊的结果!据我所知,GMP曾经是很快的计算库 原帖由 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