关于圆周率大家再熟悉不过了:
我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926 到3.1415927 之间…
计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu 看会不会出问题…
另外一些人也想看看这个无限延伸的神秘数字背后是否有规律,能发现一些宇宙的秘密…
提起圆周率,不能不提及Fabrice Bellard,他被认为是一位计算机天才,在业界有着重要的
影响。1996 年他编写了一个简洁但是完整的 C 编译器和一个 Java 虚拟机 Harissa。Fabrice
Bellard 发明的TinyCC 是GNU/Linux 环境下最小的ANSI C 语言编译器,是目前号称编译速度
最快的C 编译器。Fabrice Bellard 杰作众多且涉及广泛,1998 年编写了一个简洁的OpenGL
实现TinyGL , 年开发了 Emacs 克隆QEmacs, 年还设计了一个廉价的数字电视系
统。
Fabrice Bellard 使用一台普通的台式电脑,完成了冲击由超级计
算机保持的圆周率运算记录的壮举,他使用台式机将圆周率计
算到了小数点后2.7 万亿位,超过了由目前排名世界第47 位的
T2K Open 超级计算机于去年8 月份创造的小数点后2.5 万亿位
的记录。
Bellard 使用的电脑是一台基于2.93GHz Core i7 处理器的电脑,
这部电脑的内存容量是6GB,硬盘则使用的是五块RAID-0 配置
的1.5TB 容量的希捷7200.11,系统运行64 位Red Hat Fedora 10
操作系统,文件系统则使用Linux 的ext4.
这次计算出来的圆周率数据占去了1137GB 的硬盘容量,Bellard 花了103 天的时间计算出了
这样的结果。
计算圆周率的方法有很多种:
微积分割圆法求:
或者利用便于计算机计算的丘德诺夫斯基公式法求:
不过这些计算方法都比较复杂,难以让读者理解和使用并行计算来求,所幸数学上的泰勒级
数是个好东西,它将微积分的东西改成用无限级数来表示,这样很容易进行并行计算分解:
π =4* ∑(-1)^n+1/(2n-1) 或者写为: π =4*( 1-1/3+1/5-1/7+…)
也可以得到:π n =π n-1+(-1)^n+1/(2n-1),也就是可以通过迭代前面的π值去求当前π值
我们根据上面公式先写个单机程序来求:
public class PiTest
{
public static void main(String[] args)
{
double pi=0.0;
for(double i=1.0;i<1000000001d;i++){
pi += Math.pow(-1,i+1)/(2*i-1);
}
System.out.println(4*pi);
}
}
运行以上程序,并对照pi 的标准值:3.141592653589793238462643383279…
如果i<10000,得到pi = 3.1416926635905345 (从红色部分以后不精确了)
如果i<1000000 ,得到pi = 3.1415936535907742 (从红色部分以后不精确了)
如果i<1000000000 ,得到pi = 3.1415926525880504 (从红色部分以后不精确了)
……
可以看到,当迭代的轮数越大,求出的π值越精确。
由于是无限累加,我们可以很容易改成并行程序求解,比如i=4n,可以分成4 段并行求解,
再将4 部分和合并起来得到最终π值。假设我们有4 台计算机,并行计算设计如下:
我们这里通过fourinone 提供的各种并行计算模式去设计,第一次使用可以参考分布式计算
上手demo 指南,开发包下载地址:/p/fourinone/
程序实现:
PiWorker:是一个π计算工人实现,我们可以看到它通过命令行输入一个计算π值的起始值
和结束值,我们同时启动4 个PiWorker 实例,启动时指定不同的起始结束参数。
PiCtor:是一个π计算包工头实现,它的实现很简单,获取到线上工人后,通过doTaskBatch
进行阶段计算,等待每个工人计算完成后,将各工人返回的π计算结果合并累加。
运行步骤:
1、启动ParkSer