SuperPi的幕后细节

SuperPi的幕后细节
 不可否认,SuperPi历史非常悠久,用的人之多,其他同类软件难以匹敌。但是对其有更多了解的人却很少,下面这些细节你可能都不知道:

1.SuperPi发布日期是平成7年(1996年)

2.[もとのプログラムはFORTRANで書かれていますが、それをC言語に書き直しました。
原计划使用Fortran编写,最后使用C语言编写

3.ガウス・ルジャンドルのアルゴリズムを採用しています
采用Gauss-Legendre算法

4.创造纪录使用的大型机器是HITAC S-3800/480(95年的配置啊,当时看来可是绝对地强悍啊):
 主記憶容量    :1792.75 MB (主内存)
 拡張記憶容量   :25120 MB  (扩展内存)
アルゴリズム   :ボールウェインの 4 次の収束アルゴリズム
使用算法:Borwein四次迭代算法

注意!和SuperPi所用的算法并不相同!!
许多人都知道,开发SuperPi的作者用大型机跑出了42亿位的纪录,且都认为使用是和SuperPI一样的算法,但是事实并非如此!大家都是在以讹传讹!

6.Pentium 66MHz计算104万位需要  1小时13分22秒
HITAC S-3800/480计算104万位大约只需要 5秒!
Pentium 66MHz计算3355万位需要  105小时35分17秒
HITAC S-3800/480计算3355万位大约只需要 4分钟!

注意:由于使用算法和软件环境不同,大型机和PC没有绝对地可比性,况且还是95年的大型机,但是其性能优异在一定程度上是可以肯定的。
硬件和软件的发展都是很惊人的,1986年9月,创造42亿位纪录者之一的金田用HITAC S-810/20计算了3355万Pi值,这在当时就是一个世界记录了!但同年10月他们就把记录提高一倍到6千7百万位。
我用QPI使用SuperPi的AGM算法计算3355万位,花了3分47秒就完成了,就算是体验到当年大型机的速度了吧


7.关于Gauss-Legendre算法和Borwein四次迭代算法,SuperPI也给出了详细的介绍:

SuperPI所采用的Gauss-Legendre算法:(PS:又叫做AGM算法(Arithmetic-Geometric Mean))
1.初值确定
   a = 1
        b = 1 / sqrt( 2 )
        t = 1 / 4
        x = 1

2. a与b都取同样的精度,反复迭代计算下式:
      y = a
        a = ( a + b ) / 2
        b = sqrt( b ・ y ) 
        t = t - x ・ ( y - a )^2
        x = 2 ・ x

3.a和b迭代到足够精度后,根据下式可以计算出PI值
        Pi = ( a + b )^2 / ( 4 ・ t )

这个公式的特点是每迭代一次将得到比前一次迭代高一倍的精度,所以要计算104万位(2的22次方),迭代19次就够了,这就是为什么SuperPi的计算为数都是以2的倍数递增,且计算时会出现一条条的纪录,这就是每一次迭代所花费的时间!理论上每次花费的时间都应该是完全相同的。比较可笑的是 SuperPi MOD版本的汉化翻译,把19次迭代翻译成需要重复计算19次,明显存在着理解上的错误。

计算42亿位的巨型机所使用的Borwein四次迭代式:
1.初值确定:
        a[0] = 6 - 4 ・ sqrt( 2 )
        y[0] = sqrt( 2 ) - 1
   
2. 反复计算下式,提高精度
        y[k+1] = { 1-(1-y[k]^4 )^(1/4) } / { 1+(1-y[k]^4)^(1/4) }
        a[k+1] = a[k]・(1+y[k+1])^4 - 2^(2・k+3)・y[k+1]・(1+y[k+1]+y[k+1]^2)
  
3.当a[n]和b[n]达到足够精度后,可以确定Pi值
        Pi = 1 / a[n]
所以可以看出,该公式首先算出其实是Pi的倒数,算出a[n]后,要做一个“巨型”的除法才能得到真正的Pi值

另一方面必须要认识到,SuperPi的编写年代久远,现在看来实现的效率非常低。Qpi即使用完全同样的算法,在我的E6300机器上只需3.37秒就完成了104万位的计算的19次迭代!
计算过程(QPI4.5版 使用-agm3参数, 和SuperPi完全相同算法 E6300未超频 Vista环境 ):
Starting 1st  iteration, time : 0.13
Starting 2nd  iteration, time : 0.19
Starting 3rd  iteration, time : 0.17
Starting 4th  iteration, time : 0.19
Starting 5th  iteration, time : 0.19
Starting 6th  iteration, time : 0.19
Starting 7th  iteration, time : 0.17
Starting 8th  iteration, time : 0.19
Starting 9th  iteration, time : 0.17
Starting 10th iteration, time : 0.19
Starting 11th iteration, time : 0.17
Starting 12th iteration, time : 0.19
Starting 13th iteration, time : 0.19
Starting 14th iteration, time : 0.17
Starting 15th iteration, time : 0.19
Starting 16th iteration, time : 0.19
Starting 17th iteration, time : 0.17
Starting 18th iteration, time : 0.17
Starting 19th iteration, time : 0.17

Total iteration time : 3.37
Computing final value, time : 0.14

Total time : 3.56 seconds
Total memory used : 12,003,171 (11.45 MB)

Processor utilization : 128.98%

CPU 利用率达到了128.98%说明其利用了第二个核心的28.98%的效率,发挥了了一定的双核优势,但即使是完全单核执行应该也不会慢到哪里去,比起 SuperPi漫长的30秒计算几乎达到了10倍速,而这个成绩也比超频榜上的那些个发烫的成绩要快得多了,如果使用最快的chudnovsky算法,只要1.5秒便结束了104万的战斗....如果换成超频榜上的那些牛机,只需零点几秒便解决了!

不知道用SuperPi的人中有几个人知道Pifast,有几个知道Qpi,还有几个人两个都知道的

SuperPi在历史舞台上的地位是永远存在的,但是考验CPU速度,还是换更先进的算法和程序感觉会更好,更能体验飞速的感觉!看着SuperPi的排行榜,我仿佛看到了喷火的跑车发动机装在了拖拉机上...

你真的老了SuperPi...
别了SuperPi....

你可能感兴趣的:(SuperPi的幕后细节)