PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

转载个文章,关于SuperPi的

  [复制链接]
跳转到指定楼层
#
royalk 发表于 2011-5-21 01:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
点击数:24744|回复数:96
很多人都搞不清楚SuperPi到底是整数还是浮点运算,就连许多媒体编辑也是瞎说。我可以肯定的告诉大家,是整数运算。在网上看到了一篇文章,转给大家看看:

如果有人比较精通编程的,欢迎使用其它语言编写,让我们都来跑跑看会有什么结果。

原文链接:http://www.cppblog.com/hktk/archive/2009/09/24/97148.aspx

不可否认,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....

评分

参与人数 1活跃度 +20 收起 理由
jasu30 + 20 我很赞同

查看全部评分

96#
bdzyq 发表于 2013-5-25 16:06 | 只看该作者
本帖最后由 bdzyq 于 2013-5-25 16:14 编辑
硬件哨兵 发表于 2013-3-1 18:19
1. 你百度错了,我见过很多这样的文章,可能就是就10%用到ALU然后就说整数软件 。

2. X4 955 也是3个ALU ...

两种办法表示实数,一种是定点,就是小数点位置是固定的,一种是浮点,就是小数点位置不固定,而不是说小数就是。
95#
无根无相 发表于 2013-5-25 15:12 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
94#
mhsk 发表于 2013-5-25 11:24 | 只看该作者
严重学习!
93#
cnzyan 发表于 2013-3-3 11:47 发自PCEVA移动客户端 | 只看该作者
最早的8086不带fpu不也一样算除法吗
来自:PC绝对领域 Windows Phone 7 客户端
92#
大D来了 发表于 2013-3-2 23:09 发自PCEVA移动客户端 | 只看该作者
评论好看,笑尿了
91#
dxkzy 发表于 2013-3-2 22:59 | 只看该作者
硬盘哨兵 发表于 2013-3-2 22:55
主要是差距太大

一个14秒  一个26秒

我只能说这很正常,CPU执行程序比你想象得复杂的多,如果有兴趣的话可以pm我私聊
90#
dxkzy 发表于 2013-3-2 22:41 | 只看该作者
硬件哨兵 发表于 2013-3-2 22:21
X4 955 有3个ALU   同频率 也慢了一半了

所以了

你是说这个帖子里和intel的比?
http://bbs.pceva.com.cn/thread-82532-1-1.html
实际上不同架构的CPU性能对比的话有很多可能性了,比如流水线不行,分支预测不行等等
我估计是内存控制器或者缓存不给力
就像我最早那帖子里夹带的私货,superpi是个内存密集型的应用
就是说ALU只起到算寄存器里面数据的作用,如果数据来不及从内存放到寄存器中的话,ALU再多都没用
89#
硬件哨兵 发表于 2013-3-2 22:21 | 只看该作者
dxkzy 发表于 2013-3-2 22:13

所以你的下一个问题是为什么AMD整数性能好,但是superpi却不强对吧
我个人理解,AMD模块化之后,每个 ...

X4 955 有3个ALU   同频率 也慢了一半了

所以了

整数浮点都慢了一半了,就说不通了嘛

评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

88#
dxkzy 发表于 2013-3-2 22:13 | 只看该作者
硬件哨兵 发表于 2013-3-2 22:08
好吧,  反正就是99%的整数运算  反正就是用了 99%的ALU

你是这意识吧?



所以你的下一个问题是为什么AMD整数性能好,但是superpi却不强对吧
我个人理解,AMD模块化之后,每个模块整数运算时可以当双核心用
但是superpi软件没有针对多核优化,所以只能用到一个核心也就是半个模块
87#
硬件哨兵 发表于 2013-3-2 22:08 | 只看该作者
dxkzy 发表于 2013-3-2 22:01
建议你去看看什么叫高精度计算,如果不会编程的话,可以学点编程的基础 ...

好吧,  反正就是99%的整数运算  反正就是用了 99%的ALU

你是这意识吧?

我只是靠逻辑和常识判断而已。

评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

86#
dxkzy 发表于 2013-3-2 22:01 | 只看该作者
硬件哨兵 发表于 2013-3-2 21:55
又绕回去了,SUPER PI就是算圆周率哇  

π ≈22/7    这个公式不精确

建议你去看看什么叫高精度计算,如果不会编程的话,可以学点编程的基础
85#
硬件哨兵 发表于 2013-3-2 21:55 | 只看该作者
dxkzy 发表于 2013-3-2 21:43
我一开始就说的很明确了吧,你眼中的浮点数在代码里面是用整数数组表示的... ...

又绕回去了,SUPER PI就是算圆周率哇  

π ≈22/7    这个公式不精确

肯定是以整数开始,然后做除法,最后结果是无限不循环小数


评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

84#
dxkzy 发表于 2013-3-2 21:43 | 只看该作者
硬件哨兵 发表于 2013-3-2 21:24
http://zh.wikipedia.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0%E8%BF%90%E7%AE%97#.E6.B5.AE.E7.82.B9.E6.9 ...

我一开始就说的很明确了吧,你眼中的浮点数在代码里面是用整数数组表示的...
83#
硬件哨兵 发表于 2013-3-2 21:24 | 只看该作者
dxkzy 发表于 2013-3-2 21:20
应该压根就没用除法算吧
除法都是用乘法和减法代替的

http://zh.wikipedia.org/wiki/%E6 ... E.E5.87.BD.E6.95.B0

这么说浮点运算的

还有这个公式

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 )

评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

82#
dxkzy 发表于 2013-3-2 21:20 | 只看该作者
硬件哨兵 发表于 2013-3-2 21:17
先做除法

然后计算PI这样一个无理数的用整数除法

应该压根就没用除法算吧
除法都是用乘法和减法代替的
81#
硬件哨兵 发表于 2013-3-2 21:17 | 只看该作者
dxkzy 发表于 2013-3-2 21:03
整数可以做整数除法的,就是有商和余数那种
至于这个整数除法具体是怎么实现的,是通过FPU变通实现还是用 ...

先做除法

然后计算PI这样一个无理数的用整数除法

最后是你说99%的整数运算完成 ,也就是99%的ALU完成


  是这样么?




评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

80#
dxkzy 发表于 2013-3-2 21:03 | 只看该作者
本帖最后由 dxkzy 于 2013-3-2 21:11 编辑
硬件哨兵 发表于 2013-3-2 20:28
那也是做除法哇。就算不带分号,列竖式计算除法,也是做除法。

http://zh.wikipedia.org/wiki/%E6%B5%AE%E ...

列竖式算除法只用乘法和减法吧...?
另外整数可以做整数除法的,就是有商和余数那种
至于这个整数除法具体是怎么实现的,是通过FPU变通实现还是用一个很强的ALU实现,就要具体问AMD和INTEL了
但是从使用者或者说开发者的角度看,整数除法也算在整数性能内吧
79#
硬件哨兵 发表于 2013-3-2 20:28 | 只看该作者
那也是做除法哇。就算不带分号,列竖式计算除法,也是做除法。

http://zh.wikipedia.org/wiki/%E6 ... E.E5.87.BD.E6.95.B0
浮点数运算

评分

参与人数 1活跃度 -200 收起 理由
James007ss -200 依总版规2013更新一、1项丐化

查看全部评分

78#
dxkzy 发表于 2013-3-2 20:11 | 只看该作者
硬件哨兵 发表于 2013-3-2 19:59
俺的常识告诉俺,PI是一个无理数,算PI用除法。 3.14往下算算算算多少多少位。

简单的说,就是小学学的列竖式计算除法
竖式可以去掉小数点算,算完了再把小数点添上就行了
至于二进制还是十进制,程序编写的时候大多数用十进制,但是编译器会帮程序员变成二进制,CPU只能执行二进制指令(或者更明确的说是导线上的高低电平)
77#
硬件哨兵 发表于 2013-3-2 19:59 | 只看该作者
本帖最后由 硬件哨兵 于 2013-3-2 20:03 编辑
dxkzy 发表于 2013-3-2 05:14
计算机科班出生的来说几句
首先目前冯诺伊曼体系下计算机内所有运算和数据存储都是二进制,不管算什么都 ...



俺的常识告诉俺,PI是一个无理数,算PI用除法。 3.14往下算算算算多少多少位。


俺现又听到“整数运算完成pi计算的.”用0和1 二进制完成pi计算的,  ,


最后总结是 :99%是整数运算为主.     太高端了!算PI不是以除法为主,


这个楼下有没有听懂滴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部