[原创] 更快、更高、更强——Super Prime超级质数机
[ 2007-10-15 12:16:32 ]
引言/提要:更快、更高、更强,是奥林匹克竞赛精神的精髓,而龙之梦工作室的核心成员,作为奥林匹克信息学(计算机)竞赛选手,在技术研发的过程中同样秉承了这种精神,不断地精益求精,力求完美。这决不是由商业利益驱使,而是一种信念,一种奥林匹克的信念。
关键词:Super Prime,性能测试,双核,并行计算,质数,奥林匹克,核心技术
一、更快、更高、更强——奥林匹克精神在软件中的体现
二、参考机的软硬件配置、测试成绩及讲解
三、优化、优化、优化——程序员的基本功训练
四、多个测试程序、测试方法的不同侧重点
一、更快、更高、更强——奥林匹克精神在软件中的体现
更快、更高、更强,是奥林匹克竞赛精神的精髓,而龙之梦工作室的核心成员,作为奥林匹克信息学(计算机)竞赛选手,在技术研发的过程中同样秉承了这种精神,不断地精益求精,力求完美。这决不是由商业利益驱使,而是一种信念,一种奥林匹克的信念。
更快——软件速度更快,把电脑硬件的性能潜力,淋漓尽致地发挥到极限。
更高——软件质量更高,努力杜绝一切缺陷和出错,使软件能够无故障地长期运行。
更强——软件功能更强,尽可能满足用户的各种需要,让强大的软件成为有力的工具。
由龙之梦工作室自主开发出来的Super Prime超级质数机,正是这种奥林匹克精神的一个体现。先进的硬件,赋予电脑强劲的躯壳,龙之梦工作室的软件,则要赋予电脑强悍的灵魂。
要想下载本软件的免费版,请到华军软件园,或者到龙之梦工作室网站的“软件下载”栏目。点击此处下载。
Super Prime超级质数机,既是一个用于测试电脑性能的工具软件,同时又是一个快速求大质数的工具软件。
对于广大电脑用户,Super Prime可以作为一款测试软件,测试一下电脑跑得有多快。而对于一些涉及信息安全核心算法的专业用户,Super Prime则有着更深一层的作用。
在加密算法、数字签名、报文摘要、安全认证等方面,大质数都具有重要的价值。当前版本的Super Prime,能够快速生成大量的64位二进制大质数,供应给各种用途的专业用户。
如果您是信息安全数学算法方面的专家,拥有性能卓越的超级计算机,或许会觉得64位的质数仍然太“小”了,安全性不够。您用超级计算机可以轻松获得千位以上的大质数,并且有基于数学概率的伪质数求解算法,比这个经典求质数算法快速得多。
但请记住,这是用普通的廉价PC电脑求大批量64位质数,能够把指定区间内的所有质数,快速地、一个不漏地搜索出来。而不是求解一个两个很大的数字,那些概率上可能是质数,也可能不是质数的东西。
二、参考机的软硬件配置、测试成绩及讲解
作为一款性能测试软件,Super Prime对电脑硬件的性能具有相当高的宽容度。从最旧的80386电脑,到新的64位双核PC,以至多CPU服务器,只要能够运行Windows 95及以上版本的操作系统,就可以用本软件进行测试。当然,性能越好的电脑运行得越快。
而且,即使同样是最新配置的电脑,1GB内存和2GB内存都能体现出明显的性能差别。这直接表明,快速求大质数运算是非常消耗电脑资源的。
在此,我们给出两台普通PC电脑(A机、B机)作为参考机器,看看它跑Super Prime的速度。您可以作个比较,看看自己的电脑有多快。
参考机的软硬件配置:
A机:
CPU:AMD Athlon XP 2000+
主板:升技 KD7 VIA KT400芯片组
内存:KingMax 1GB DDR 400MHz
硬盘:西数 WD1200JB 120GB 7200转 8MB缓存
显卡:Matrox G400 32MB显存
操作系统:Windows 2003 Server SP1
虚拟内存:2GB
B机:
CPU:AMD Athlon64 X2 3800+
主板:华擎 AM2FN6G-VSTA GeForce6100芯片组
内存:KingMax 512MB DDR2 800MHz ×2条
硬盘:希捷 7200.9 300GB 7200转 8MB缓存
显卡:集成
操作系统:Windows XP Professional SP2
虚拟内存:2GB
参考机的Super Prime测试成绩:
运行SuperPrime.exe,依次点击“典型测试一”、“典型测试二”、“典型测试三”、“综合测试”,生成的prime64.txt文件内容如下,其中“//”后面是加上去的注释。
A机:
prime64h_f.exe (group=20, threads=2) >>> Sun Sep 30 12:27:57 2007
//这是典型测试一的成绩,group=20表示一组质数(最多20个)同时计算,threads=2表示2个线程并行运算
18446744073709551427 , 139547 ms ( thread 1 , +139547 ms )
//第1个质数由线程1求出,耗时139.547秒
18446744073709551437 , 217766 ms ( thread 2 , +78219 ms )
//另外4个质数由线程2同时求出,时间增长78.219秒,累积耗时217.766秒
18446744073709551557 , 217766 ms ( thread 2 , +78219 ms )
18446744073709551533 , 217766 ms ( thread 2 , +78219 ms )
18446744073709551521 , 217766 ms ( thread 2 , +78219 ms )
//5个质数总耗时217.766秒,平均每个质数耗时43.55秒
B机:
prime64h_f.exe (group=20, threads=2) >>> Sun Sep 30 12:40:10 2007
//这是典型测试一的成绩,group=20表示一组质数(最多20个)同时计算,threads=2表示2个线程并行运算
18446744073709551427 , 63562 ms ( thread 1 , +63562 ms )
//第1个质数由线程1求出,耗时63.562秒
18446744073709551437 , 92203 ms ( thread 2 , +28641 ms )
//另外4个质数由线程2同时求出,时间增长28.641秒,累积耗时92.203秒
18446744073709551557 , 92203 ms ( thread 2 , +28641 ms )
18446744073709551533 , 92203 ms ( thread 2 , +28641 ms )
18446744073709551521 , 92203 ms ( thread 2 , +28641 ms )
//5个质数总耗时92.203秒,平均每个质数耗时18.44秒
A机:
prime64l.exe (group=1, threads=2) >>> Tue Feb 13 23:31:12 2007
//这是典型测试二的成绩,group=1表示一个一个质数计算,threads=2表示2个线程并行运算
//由于Athlon XP是单核CPU,实际上是2个线程轮流交替计算
18446744073709551557 , 266110 ms ( thread 2 , +266110 ms )
//第1个质数由线程2求出,耗时266.110秒
18446744073709551427 , 475297 ms ( thread 1 , +209187 ms )
//第2个质数由线程1求出,时间增长209.187秒,累积耗时475.297秒
18446744073709551533 , 499563 ms ( thread 2 , +24266 ms )
//第3个质数由线程2求出,时间增长24.266秒,累积耗时499.563秒,依此类推
18446744073709551521 , 628563 ms ( thread 2 , +129000 ms )
18446744073709551437 , 757547 ms ( thread 2 , +128984 ms )
//5个质数总耗时757.547秒,平均每个质数耗时151.51秒
B机:
prime64l.exe (group=1, threads=2) >>> Wed Feb 14 10:54:57 2007
//这是典型测试二的成绩,group=1表示一个一个质数计算,threads=2表示2个线程并行运算
18446744073709551557 , 103906 ms ( thread 2 , +103906 ms )
//第1个质数由线程2求出,耗时103.906秒
18446744073709551427 , 188391 ms ( thread 1 , +84485 ms )
//第2个质数由线程1求出,时间增长84.485秒,累积耗时188.391秒
18446744073709551533 , 204453 ms ( thread 2 , +16062 ms )
//第3个质数由线程2求出,时间增长16.062秒,累积耗时204.453秒,依此类推
18446744073709551521 , 305016 ms ( thread 2 , +100563 ms )
18446744073709551437 , 406000 ms ( thread 2 , +100984 ms )
//5个质数总耗时406.000秒,平均每个质数耗时81.20秒
A机:
prime64.exe (group=1, threads=2) >>> Tue Feb 13 23:45:04 2007
//这是典型测试三的成绩,group=1表示一个一个质数计算,threads=2表示2个线程并行运算
18446744073709551557 , 25985 ms ( thread 2 , +25985 ms )
//第1个质数由线程2求出,耗时25.985秒
18446744073709551427 , 46782 ms ( thread 1 , +20797 ms )
//第2个质数由线程1求出,时间增长20.797秒,累积耗时46.782秒
18446744073709551533 , 48985 ms ( thread 2 , +2203 ms )
//第3个质数由线程2求出,时间增长2.203秒,累积耗时48.985秒,依此类推
18446744073709551521 , 61532 ms ( thread 2 , +12547 ms )
18446744073709551437 , 74063 ms ( thread 2 , +12531 ms )
//5个质数总耗时74.063秒,平均每个质数耗时14.81秒
B机:
prime64.exe (group=1, threads=2) >>> Wed Feb 14 11:03:35 2007
//这是典型测试三的成绩,group=1表示一个一个质数计算,threads=2表示2个线程并行运算
18446744073709551557 , 10000 ms ( thread 2 , +10000 ms )
//第1个质数由线程2求出,耗时10.000秒
18446744073709551427 , 18016 ms ( thread 1 , +8016 ms )
//第2个质数由线程1求出,时间增长8.016秒,累积耗时18.016秒
18446744073709551533 , 19641 ms ( thread 2 , +1625 ms )
//第3个质数由线程2求出,时间增长1.625秒,累积耗时19.641秒,依此类推
18446744073709551521 , 29313 ms ( thread 2 , +9672 ms )
18446744073709551437 , 38984 ms ( thread 2 , +9671 ms )
//5个质数总耗时38.984秒,平均每个质数耗时7.80秒
//以下都是综合测试的成绩,共分5段,每段时间单独计算
A机:
prime64h_f.exe (group=10, threads=2) >>> Sun Sep 30 12:35:22 2007
18446744073709551521 , 139968 ms ( thread 2 , +139968 ms )
18446744073709551557 , 139968 ms ( thread 2 , +139968 ms )
18446744073709551533 , 139968 ms ( thread 2 , +139968 ms )
//综合测试第1段,总耗时139.968秒,平均每个质数耗时46.66秒
prime64_f.exe (group=10, threads=2) >>> Sun Sep 30 12:41:14 2007
18446744073709551521 , 64719 ms ( thread 2 , +64719 ms )
18446744073709551557 , 64719 ms ( thread 2 , +64719 ms )
18446744073709551533 , 64719 ms ( thread 2 , +64719 ms )
//综合测试第2段,总耗时64.719秒,平均每个质数耗时21.57秒
prime64l.exe (group=1, threads=2) >>> Tue Feb 13 23:51:06 2007
18446744073709551557 , 133234 ms ( thread 2 , +133234 ms )
//综合测试第3段,总耗时133.234秒
prime64.exe (group=20, threads=2) >>> Tue Feb 13 23:53:55 2007
18446744073709551437 , 63204 ms ( thread 2 , +63204 ms )
18446744073709551557 , 63204 ms ( thread 2 , +63204 ms )
18446744073709551533 , 63204 ms ( thread 2 , +63204 ms )
18446744073709551521 , 63204 ms ( thread 2 , +63204 ms )
//综合测试第4段,总耗时63.204秒,平均每个质数耗时15.80秒
prime64h.exe (group=20, threads=2) >>> Tue Feb 13 23:56:50 2007
18446744073709551533 , 257704 ms ( thread 2 , +257704 ms )
18446744073709551557 , 257704 ms ( thread 2 , +257704 ms )
//综合测试第5段,总耗时257.704秒,平均每个质数耗时128.85秒
//5段测试总耗时139.968+64.719+133.234+63.204+257.704=658.829秒
//这个总耗时就是综合测试的总成绩(此处不计算平均耗时,因为无意义)
B机:
prime64h_f.exe (group=10, threads=2) >>> Sun Sep 30 12:18:26 2007
18446744073709551521 , 155187 ms ( thread 2 , +155187 ms )
18446744073709551557 , 155187 ms ( thread 2 , +155187 ms )
18446744073709551533 , 155187 ms ( thread 2 , +155187 ms )
//综合测试第1段,总耗时155.187秒,平均每个质数耗时51.73秒
prime64_f.exe (group=10, threads=2) >>> Sun Sep 30 12:50:46 2007
18446744073709551521 , 68625 ms ( thread 2 , +68625 ms )
18446744073709551557 , 68625 ms ( thread 2 , +68625 ms )
18446744073709551533 , 68625 ms ( thread 2 , +68625 ms )
//综合测试第2段,总耗时68.625秒,平均每个质数耗时22.88秒
prime64l.exe (group=1, threads=2) >>> Wed Feb 14 11:08:16 2007
18446744073709551557 , 103875 ms ( thread 2 , +103875 ms )
//综合测试第3段,总耗时103.875秒
prime64.exe (group=20, threads=2) >>> Wed Feb 14 11:10:25 2007
18446744073709551437 , 39469 ms ( thread 2 , +39469 ms )
18446744073709551557 , 39469 ms ( thread 2 , +39469 ms )
18446744073709551533 , 39469 ms ( thread 2 , +39469 ms )
18446744073709551521 , 39469 ms ( thread 2 , +39469 ms )
//综合测试第4段,总耗时39.469秒,平均每个质数耗时9.88秒
prime64h.exe (group=20, threads=2) >>> Wed Feb 14 11:13:42 2007
18446744073709551533 , 107453 ms ( thread 2 , +107453 ms )
18446744073709551557 , 107453 ms ( thread 2 , +107453 ms )
//综合测试第5段,总耗时107.453秒,平均每个质数耗时53.73秒
//5段测试总耗时155.187+68.625+103.875+39.469+107.453=474.609秒
//这个总耗时就是综合测试的总成绩(此处不计算平均耗时,因为无意义)
三、优化、优化、优化——程序员的基本功训练
Super Prime是由龙之梦工作室自主开发的工具软件,其中快速求大质数的核心算法,经过计算机奥林匹克竞赛选手的设计优化。软件程序用传统C语言编写而成,具有竞赛级别的性能。
求质数的算法,程序实现起来并不复杂,很多学程序设计的人都曾编写过。如果您有兴趣,可以用自己编写的求64位大质数程序,和Super Prime作性能对比,这有助于训练自己的算法优化基本功。
尽管核心算法是一致的,Super Prime仍然提供了多种不同的求质数途径,以适应不同硬件条件下的快速求解要求。例如,批量求解可以减少硬盘读写次数,提高平均求解速度。
Super Prime作为性能测试软件,从不同的角度测量电脑硬件是有意义的。而出现多个不同的程序,正是因为算法优化并非唯一。即使同样是快速求64位质数,“快速”的不同定义也会导致不同的优化方向。
对于求64位质数,什么才叫做“最快”?是找到第一个64位质数的时间最短?还是找出大批量64位质数的总耗时最少?抑或是既要尽快找出第一批(个)64位质数,又要使求每个质数的平均耗时最短?这里的分歧绝对不可忽略。
优化目标就已经有这么明显的差异,再考虑到内存容量、硬盘大小等电脑硬件的差异对软件算法的影响,综合起来,龙之梦工作室最终提供了5个不同的求质数程序。
5个测试程序的特点和性能表现如下:
◆ prime64.exe:标准模式。在物理内存达到1GB或以上的电脑中速度最快,但内存不足1GB时表现较差。
◆ prime64_f.exe:标准节约内存模式。对于内存不足1GB的电脑,此程序速度最快。但对于内存1GB或以上的电脑,它明显比prime64.exe慢。
◆ prime64h.exe:大数据量模式。在内存达到2GB或以上的电脑中,此程序比prime64.exe慢,但比prime64l.exe快得多。从快速求大批量64位质数(而不是测试性能)的角度来讲,此程序的意义在于数据准备时间比prime64.exe短,首次运行不需要等待太久。
◆ prime64h_f.exe:大数据量节约内存模式。类似于prime64_f.exe,对于内存不足2GB的电脑,此程序的速度介于prime64_f.exe和prime64l.exe之间。它存在的价值在于数据准备时间比prime64_f.exe短,首次运行不需要等待太久。
◆ prime64l.exe:小数据量模式。完全不需要数据准备,因此不存在等待时间,直接就开始求64位质数。但是速度远远落后于其它程序,因为运算量大很多。此程序的好处是对硬件要求低,只要能运行Windows 95的电脑,就可以用它来求64位质数。
对于内存不足的电脑,如果纯粹想测试一下prime64.exe和prime64h.exe的性能,未尝不可。但其速度会比prime64_f.exe和prime64h_f.exe慢,原因是读取文件和虚拟内存页面交换相比,少了一次写硬盘的操作。
四、多个测试程序、测试方法的不同侧重点
图形界面下,用户可以根据自己的喜好进行各种不同的测试。我们预设了3个典型测试和1个综合测试,分别是:
◆ 典型测试一:用prime64h_f.exe程序进行测试。此程序的测试结果比较有代表性,对CPU、内存、硬盘的性能都所体现,首次运行的数据准备时间也不长。因此,这是我们推荐的测试。
◆ 典型测试二:用prime64l.exe程序进行测试。此程序对硬件的要求很低,只要能够支持Windows 95的电脑就可以运行,而且不需要数据准备。这个是测试低端电脑的必然选择。
◆ 典型测试三:用prime64.exe程序进行测试。此程序在内存1GB或以上的电脑中速度最快,但是首次运行需要较长的数据准备时间。这个测试能够体现出当前高端电脑的硬件性能。
◆ 综合测试:是把5个不同的测试程序都运行一遍,把总耗时加起来,就是测试的最终成绩。由于多个程序从不同角度对硬件作出测试,因此这也是我们推荐的测试。
除此之外,您还可以自己设置个性化测试,包括独立测试和连续测试。
独立测试是用单个程序进行测试,您可以编辑配置文件(*.ini),修改参数值来决定测试的属性。
连续测试则是以批处理文件(*.bat)的方式,运行一系列的测试程序。
Super Prime超级质数机,无论是作为作为性能测试软件,还是作为快速求64位大质数的工具软件,都有其独特的优势。同时,这也是算法优化,考验程序员基本功的一个典型实例。
可以肯定,龙之梦工作室的软件,将会不断精益求精,把更快、更高、更强的奥林匹克精神发扬光大。
|
|