1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 并行计算求pi值C语言 使用并行计算求圆周率π.pdf

并行计算求pi值C语言 使用并行计算求圆周率π.pdf

时间:2019-12-17 06:30:09

相关推荐

并行计算求pi值C语言 使用并行计算求圆周率π.pdf

关于圆周率大家再熟悉不过了:

我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。