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

我们从课本上学习到早在一千多年前,祖冲之将圆周率计算到3.1415926到3.1415927之间…计算机诞生后,计算圆周率被用来检测计算机的硬件性能,昼夜燃烧cpu看会不会出问题…另外一些人也想看看这个无限延伸的神秘数字背后是否有规律,能发现一些宇宙的秘密…

提起圆周率,不能不提及Fabrice Bellard,他被认为是一位计算机天才,在业界有着重要的影响。1996年他编写了一个简洁但是完整的C编译器和一个Java虚拟机Harissa。Fabrice Bellard发明的TinyCC是GNU/Linux环境下最小的ANSI C语言编译器,是目前号称编译速度最快的C编译器。Fabrice Bellard杰作众多且涉及广泛,1998年编写了一个简洁的OpenGL实现TinyGL,2003年开发了Emacs克隆QEmacs,2005年还设计了一个廉价的数字电视系统。

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.141

6926635905345 (从红色部分以后不精确了)

如果i<1000000,得到pi = 3.14159

36535907742 (从红色部分以后不精确了)

如果i<1000000000,得到pi = 3.14159265

25880504(从红色部分以后不精确了)

……

可以看到,当迭代的轮数越大,求出的π值越精确。

由于是无限累加,我们可以很容易改成并行程序求解,比如i=4n,可以分成4段并行求解,再将4部分和合并起来得到最终π值。假设我们有4台计算机,并行计算设计如下:

我们这里通过fourinone提供的各种并行计算模式去设计,第一次使用可以参考

分布式计算上手demo指南,开发包下载地址:

http://code.google.com/p/fourinone/

程序实现:

PiWorker:是一个π计算工人实现,我们可以看到它通过命令行输入一个计算π值的起始值和结束值,我们同时启动4个PiWorker实例,启动时指定不同的起始结束参数。

PiCtor:是一个π计算包工头实现,它的实现很简单,获取到线上工人后,通过doTaskBatch进行阶段计算,等待每个工人计算完成后,将各工人返回的π计算结果合并累加。

运行步骤:

1、启动ParkServerDemo(它的IP端口已经在配置文件指定)

java -cp fourinone.jar; ParkServerDemo

2、运行4个PiWorker,将迭代100,000,000轮的计算拆分到4个工人并行完成,这里方便演示是在同一台机器上,现实应用中可以在多台计算机上完成。

java  -cp fourinone.jar; PiWorker localhost 2008 1 250000000

java  -cp fourinone.jar; PiWorker localhost 2009 250000000 500000000

java  -cp fourinone.jar; PiWorker localhost 2010 500000000 750000000

java  -cp fourinone.jar; PiWorker localhost 2011 750000000 100000000

3、运行PiCtor

java  -cp fourinone.jar; PiCtor

可以看到,4个工人实例在同台机器并行完成计算π值的时间为29秒,如果是运行单机程序PiTest完成的时间在45秒,精准度都是到小数点后8位“3.14159265”,但是耗时上有明显差距,如果多机多实例,效率还会进一步提升,并行计算性能提升分析可以参考“使用并行计算大幅提升递归算法效率”。

完整demo源码如下:

// ParkServerDemo

import com.fourinone.BeanContext;

public class ParkServerDemo

{

public static void main(String[] args)

{

BeanContext.startPark();

}

}

//PiWorker

import com.fourinone.MigrantWorker;

import com.fourinone.WareHouse;

public class PiWorker extends MigrantWorker

{

public double m=0.0,n=0.0;

public PiWorker(double m, double n){

this.m = m;

this.n = n;

}

public WareHouse doTask(WareHouse inhouse)

{

double pi=0.0;

for(double i=m;i

pi += Math.pow(-1,i+1)/(2*i-1);

}

System.out.println(4*pi);

inhouse.setObj("pi",4*pi);

return inhouse;

}

public static void main(String[] args)

{

PiWorker mw = new PiWorker(Double.parseDouble(args[2]),Double.parseDouble(args[3]));

mw.waitWorking(args[0],Integer.parseInt(args[1]),"PiWorker");

}

}

//PiCtor

import com.fourinone.Contractor;

import com.fourinone.WareHouse;

import com.fourinone.WorkerLocal;

import java.util.Date;

public class PiCtor extends Contractor

{

public WareHouse giveTask(WareHouse inhouse)

{

WorkerLocal[] wks = getWaitingWorkers("PiWorker");

System.out.println("wks.length:"+wks.length);

WareHouse[] hmarr = doTaskBatch(wks, inhouse);

double pi=0.0;

for(WareHouse result:hmarr){

pi = pi + (Double)result.getObj("pi");

}

System.out.println("pi:"+pi);

return inhouse;

}

public static void main(String[] args)

{

PiCtor a = new PiCtor();

long begin = (new Date()).getTime();

a.giveTask(new WareHouse());

long end = (new Date()).getTime();

System.out.println("time:"+(end-begin)/1000+"s");

a.exit();

}

}

java并行计算π_3月14日圆周率日—使用并行计算求圆周率π相关推荐

  1. c语言求圆周率 . 4,C语言求圆周率π(三种方法)(4页)-原创力文档

    C语言求圆周率π(三种方法) 题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止.题目2) 根据公式②,用前100项之积计算π的值.题目1)提供了一种解法,题目2)提供了两种 ...

  2. 【matlab 圆周率计算】matlab 求圆周率的两种算法实现比较

    %author:laidefa %data:2014-09-19 %丘德诺夫斯基公式求圆周率 function mpi=qdnfsj(m) i=m; s=13591409; for n=1:i A=( ...

  3. matlab圆周率计算,matlab代码求圆周率的简单算法

    说起圆周率的算法很多人都会想起一大堆的无穷级数等各种表达式,但是这样的算法需要比较高的数学推理水品,而且对于很多初学者而言很难理解.程序员不能仅仅是机械的写程序,必须要真正的理解程序中每个代码的意义, ...

  4. 4月14日~15日,2021慕尼黑上海电子展,我等你来!

    关注+星标公众号,不错过精彩内容 转自 | 达尔闻说 4月14日~15日,2021慕尼黑上海电子展,有小伙伴要去吗?(我要去,但我不告诉你) 3分钟快速了解得捷时刻,片尾有惊喜 4月14与4月15日, ...

  5. 【历史上的今天】3 月 14 日:微软发布 IE9;黑莓创始人出生;圆周率计算创造新纪录

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 3 月 14 日,在 143 年前的今天,1879 年 3 月 14 日,爱因斯坦诞辰.阿尔伯特·爱 ...

  6. 【Java利器之】 IntelliJ IDEA 最新激活码(截止到2018年10月14日)

    IntelliJ IDEA 注册码: 亲测可用日期:2018-4-9 EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIj ...

  7. 灵山奇缘服务器维护,灵山奇缘3月14日每周维护公告_3.14每周维护公告_3DM网游

    灵山奇缘3月14日每周维护公告,3.14每周维护公告,缘起灵山,以爱相生,<灵山奇缘>"奇珍现世"版本即将到来,三只精品珍兽横空出世,灵兽系统再升级;门派迎来重大调整, ...

  8. s00devs_Devs @ Home –实时网络研讨会– 5月14日,13:00 CEST:高效应用程序的7个JVM参数

    s00devs 我们正处于大流行之中,越来越多的开发人员正在孤立的环境中或在家中工作. 通过我们的网络研讨会系列Devs @ Home,我们希望通过将困在家里的开发人员与技术讲座(由专业人员为专业人员 ...

  9. 22年5月14日面试随笔

    22年5月14日面试随笔 面试公司:某省某纶软件科技有限公司 面试岗位:Java实习生 面试内容:自我介绍,个人项目 面试方式:腾讯会议面试 薪资待遇:2-3k无食宿 面试心得 虽面试方式较电话面试较 ...

  10. 【历史上的今天】12 月 14 日:计算复杂性理论先驱出生;雅虎群组被关闭;W3C 召开第一次会议

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 14 日,在 1906 年的今天,马克斯·普朗克在柏林的物理学会上发表了题为<论正常 ...

最新文章

  1. 千人千面,撩拨你的个性化广告
  2. HashMap的实现原理-----哈希讲解
  3. JAVA面试整理之——JAVA基础
  4. win10删除开机密码_新版WIN10 如何取消开机密码的操作
  5. 电脑剪贴板在哪里打开_这个小玩意让手机的推送无缝显示在电脑上_办公软件...
  6. Node mysql
  7. 从JSP WEB页面往数据库写入出现乱码的一种解决方法
  8. 什么舱位_把“订舱位”说成book warehouse position,外企不会要你
  9. conda 环境迁移
  10. Linux内核模块静态加载的顺序
  11. 芒果移动广告优化平台
  12. easyrecovery免费数据恢复工具操作简单一键恢复数据
  13. 网页百度网盘上传显示服务器错误,win7系统下登陆百度浏览器提示连接服务器错误的方案?...
  14. 数据结构-二叉树入门Go语言实现
  15. MicroPython中I2C模块的设计与实现(1) - machine_i2c框架的机制
  16. UML图绘制-----时序图的画法
  17. Python基于time库对时间分钟等级进行运算
  18. 两个手机靠近,唤起应用如微信(需打开NFC)
  19. 百汇BCR:为什么要使用外汇模拟交易软件?有什么好处?
  20. 【java初学】面向对象多态

热门文章

  1. 疾病自动编码任务的调研(二)——相关比赛及数据集
  2. easyui及eova下select:option、find无法直接取值的解决办法
  3. 倍福plc控制器修改地址
  4. 可以做mysql题的网站_牛客网MySQL练习题
  5. Java 文本内容差异对比实现介绍
  6. 宋宝华:当Linux内核遭遇鲨鱼—kernelshark
  7. 如何查看这本书有没有PDF版
  8. mobi文件怎么转化为PDF
  9. 2022-2027年中国电动汽车充电站及充电桩行业市场深度分析及投资战略规划报告
  10. 校招大学生简历制作模板(ps:程序员简历)