当前位置: 首页 > 编程日记 > 正文

并行计算圆周率

看到这个题目,俗了,大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。

书上计算PI用的是精确的数值计算方法,我这里再给出一种概率计算方法。

OpenMP和MPI将同时亮相。

计算PI的方法

1.tan(PI/4)=1    =>     PI=4arctan1。知道arctan1转化为定积分的形式是什么吧。

利用arctan(x)的幂级数展开式,可以手工地计算PI

另外也可以采用正式手工计算PI

#include<stdio.h>
#include<time.h>
#define N 1000000
main(){double local,pi=0.0,w;long i;w=1.0/N;clock_t t1=clock();for(i=0;i<N;i++){local=(i+0.5)*w;pi=pi+4.0/(1.0+local*local);}clock_t t2=clock();printf("PI is %.20f\n",pi*w);printf("Time: %.2f seconds\n",(float)(t2-t1)/CLOCKS_PER_SEC);
}

orisun@orisun-desktop:~/Program$ ./PI1

PI is 3.14159265358976336202

Time: 0.02 seconds

2.以坐标原点为形心,作半径为1的圆和边长为2的正方形。正方形与圆的面积之比即为PI

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define N 1000000
main(){long i,sum;double x,y;srand((unsigned)time(NULL));sum=0;clock_t t1=clock();for(i=0;i<N;i++){x=(double)rand()/RAND_MAX;y=(double)rand()/RAND_MAX;if(x*x+y*y<1)sum++;}clock_t t2=clock();printf("PI is %.20f\n",4*(double)sum/N);printf("Time: %.2f\n",(float)(t2-t1)/CLOCKS_PER_SEC);
}

orisun@orisun-desktop:~$ ./PI0

PI is 3.14301599999999980994

Time: 0.16

对比可以看到方法1在计算精度和速度上都具有绝对的优势。在下面的openMP和MPI计算中我们都采用方法1。

OpenMP

OpenMP[OMP]是一个编译器指令和库函数的集合(已包含在gcc中),它用于为共享存储器计算机创建并行程序。OMP组合了C、C++和Fortran。

#include<stdio.h>
#include<time.h>
#include<omp.h>
#define N 1000000
main(){double local,pi=0.0,w;long i;w=1.0/N;clock_t t1=clock();
#pragma omp parallel for private(local) reduction(+:pi)for(i=0;i<N;i++){local=(i+0.5)*w;pi=pi+4.0/(1.0+local*local);}clock_t t2=clock();printf("PI is %.20f\n",pi*w);printf("Time: %.2f seconds\n",(float)(t2-t1)/CLOCKS_PER_SEC);
}

orisun@orisun-desktop:~/Program$ ./PI2

PI is 3.14159265358976336202

Time: 0.02 seconds

跟串行计算结果是一模一样。

#pragma omp parallel表示下面的一行代码或代码块要分配到多个执行单元中并行计算。

 #pragma omp parallel for用在一个for循环的前面

 private(local)默认情况下定义在并行代码之外的变量为各并行的执行单元所共享,使用private限制,表示每个执行单元创建该变量的一个副本

 reduction(+:pi)表示并行代码执行完毕后对各个执行单元中的pi进行相加操作

MPICH2

ubuntu下首先下载mpich.tar.gz,然后按照常规的软件安装方法(configure、make、make install)安装mpi就可以了。

MPI(Message Parsing Interface)消息传递接口是用于分布式存储器并行计算机的标准编程环境。MPI的核心构造是消息传递:一个进程将信息打包成消息,并将该消息发送给其他进程。MPI最常用的两个实现是LAM/MPI[LAM]和MPICH[MPI]。

在MPI中执行单元(UE)指的就是进程。

#include<stdio.h>
#include<mpi.h>
#include<math.h>int main(int argc,char *argv[]){int my_rank,num_procs;int i,n=0;double sum,width,local,mypi,pi;double start=0.0,stop=0.0;int proc_len;char processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);			//初始化环境MPI_Comm_size(MPI_COMM_WORLD,&num_procs);	//获取并行的进程数MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);		//当前进程在所有进程中的序号MPI_Get_processor_name(processor_name,&proc_len);	//获取总的处理机数和各个处理机的名称printf("Processor %d of %d on %s\n",my_rank,num_procs,processor_name);if(my_rank==0){printf("please give n=");scanf("%d",&n);start=MPI_Wtime();				//MPI计时}MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);	//把n广播给本通信环境中的所有进程width=1.0/n;sum=0.0;for(i=my_rank;i<n;i+=num_procs){local=width*((double)i+0.5);sum+=4.0/(1.0+local*local);}mypi=width*sum;MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);	//由进程0进行归约,把每个进程计算出来的mypi进行相加(MPI_SUM),赋给piif(my_rank==0){printf("PI is %.20f\n",pi);stop=MPI_Wtime();printf("Time: %f\n",stop-start);fflush(stdout);}MPI_Finalize();return 0;
}
MPI_REDUCE(sendbuf,recvbuf,count,datatype,op,root,comm)IN   sendbuf   发送消息缓冲区的起始地址(可变)OUT  recvbuf   接收消息缓冲区中的地址(可变,仅对于根进程)IN   count     发送消息缓冲区中的数据个数(整型)IN   datatype  发送消息缓冲区的元素类型(句柄)IN   op        归约操作符(句柄)IN   root      根进程序列号(整型)IN   comm      通信子(句柄)
MPI_BCAST(buffer,count,datatype,root,comm) IN/OUT buffer    通信消息缓冲区的起始地址(可变)IN    count     通信消息缓冲区中的数据个数(整型) IN    datatype  通信消息缓冲区中的数据类型(句柄) IN    root     发送广播的根的序列号(整型) IN    comm     通信子(句柄) 

orisun@orisun-desktop:~/Program$ mpicc -o PI3 PI3.c      %使用mpicc编译

orisun@orisun-desktop:~/Program$ mpirun -np 4 ./PI3      %指定number of processor为4

Processor 0 of 4 on orisun-desktop

please give n=Processor 2 of 4 on orisun-desktop

Processor 1 of 4 on orisun-desktop

Processor 3 of 4 on orisun-desktop

1000000

PI is 3.14159465358887635134

Time: 0.012510

orisun@orisun-desktop:~/Program$ mpdcleanup

时间是0.01251秒,比0.02秒明显减少。

注意输出中有这么一行:please give n=Processor 2 of 4 on orisun-desktop

这说明是我们不能保证代码中的18行和20行的执行顺序。

相关文章:

kafka-manager 的编译和使用(附安装包)

2019独角兽企业重金招聘Python工程师标准>>> kafka-manager是一个非常好用的kafka web管理工具&#xff0c;yahoo开源。 地址&#xff1a;github.com/yahoo/kafka-manager 1、编译过程比较简单&#xff0c;重点是能翻墙&#xff0c;如果网络环境不允许&#xff0c;可…

匿名函数应用-多线程测试代码

多线程测试代码&#xff0c;不用单独再写一个类&#xff0c;比较方面而已。 public class MainThread { static int a0; for (int x 0;x<100;x){ Thread t new Thread(new Runnable() { Override public void run() { while(true){ try { a;System.out.println(a);…

YOLOv4来了,大型调优现场,速度和准确率俱佳

作者 | VincentLee来源 | 晓飞的算法工程笔记简介论文提出YOLOv4&#xff0c;从图1的结果来看&#xff0c;相对于YOLOv3在准确率上提升了近10个点&#xff0c;然而速度并几乎没有下降&#xff0c;论文主要贡献如下&#xff1a;提出速度更快、精度更好的检测模型&#xff0c;仅需…

关于对J2EE几点误解和错误认识的澄清

转自&#xff1a;http://www.jdon.com .Net和J2EE的争论一直没有停止&#xff0c;我也参加过“程序员”杂志主持的“.Net和Java之争”之类的讨论&#xff0c;本来这两种技术都是为用户提供了竞争性的选择&#xff0c;对于用户来说是一件好事&#xff0c;多种选择远胜于单一选择…

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r...

2019独角兽企业重金招聘Python工程师标准>>> Struts Problem Report Struts has detected an unhandled exception: Messages: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or re…

Java的Redis连接池代码性能不错

其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183&#xff0c;有2个版本&#xff0c;差别就是ReentrantLock和synchronized。另外原作者使用了断言&#xff0c;我觉得这个还是不用为好。 ReentrantLock版 import java.util.concurrent.locks.Reent…

降低预测过程计算成本,这些NLP模型压缩方法要知道

编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近年来&#xff0c;基于谷歌Transformer的语言模型在神经机器翻译&#xff0c;自然语言推理和其他自然语言理解任务上取得了长足进展。通过多种语言模型的平均损失进行自我监督预训练&#xff0c;使得在大范…

政府要尽快对应用商店出台管理办法

前两天联想的开发者大会&#xff0c;我和联想的CTO贺志强先生联合接受了一个视频访谈&#xff0c;贺先生谈到联想的乐园软件商店&#xff0c;组织大量的人力对于软件进行检测&#xff0c;以保证软件是合格产品&#xff0c;不会给用户一路带来侵害&#xff0c;对于联想这种负责态…

antlr-2.7.6.jar的作用

项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

junit集成Hamcrest测试集合中某个属性是否包含特定值

junit已经集成Hamcrest但是还是需要引用hamcrest-library&#xff0c;不然只有基本方法&#xff0c;高级的没有 <dependency> <groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

腾讯第100个开源项目:微信开源推理加速工具TurboTransformers

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;4月24日&#xff0c;腾讯正式宣布开源Transformer推理加速工具TurboTransformers。该工具面向自然语言处理领域中Transformers相关模型丰富的线上预测场景&#xff0c;在微信、腾讯云、QQ看点等产品的线上服务中已经广…

程序员:提高编程效率的技巧

本文写给那些认为在项目上所花时间和效率成正比的程序员。我要说的是&#xff0c;事实并非如此。虽然你需要在电脑前敲键盘输入东西&#xff0c;但这只和编程沾上一点边。那么&#xff0c;程序员该如何利用时间呢&#xff1f; 俗话说&#xff0c;磨刀不误砍柴工&#xff0c;拿出…

Qunee for HTML5 V2.5新版本发布

为什么80%的码农都做不了架构师&#xff1f;>>> Qunee for HTMl5 V2.5 beta2版本正式发布,此次版本内核改动较大,采用了新的2D渲染引擎,增加了延迟绘制功能,大幅改善画布的浏览体验,此外重构了鼠标键盘以及触控交互监听处理,增加右键框选功能,改善了多点触控交互,增…

泛型推断类型不符合上限

程序报错推断类型不符合上限 springsecurity需要自定义用户服务 代码 Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(new CustomUserDetailsService());}public class CustomUserDetailsService implemen…

如何通过深度学习,完成计算机视觉中的所有工作?

Mask-RCNN做对象检测和实例分割作者 | George Seif译者 | 天道酬勤&#xff0c;责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;Mask-RCNN做对象检测和实例分割&#xff1a;https://miro.medium.com/max/1200/1*s9raSe9mLeSSuxE3API-ZA.gif你想做计算机视…

Windows PowerShell 2.0语言之字面类型系统

PowerShell语言允许通过一个字面类型&#xff08;type Literals&#xff09;来访问类型&#xff0c;它是用括号抬起的类型名&#xff0c;返回.NET底层的System.Type对象实例&#xff0c;如&#xff1a; PS C:\> [System.Int32]IsPublic IsSerial Name …

建立名称server

一、实验的目的&#xff1a;实现DNSserver功能&#xff0c;提供正向、反向解析二、实验环境装有Linux的Windows系统IP为192.168.6.3的虚拟机三、实验目的建立gr.org域的主名称server。解析&#xff1a;名称 IP 用途ns.gr.org 192.168.…

Java的JSON操作存储List到Redis

使用jackson和json-lib都可以 <dependency> <groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>net.sf.json-li…

关注基于云的下一代应用开发

接受经济和信息化的视频专访专访的主页地址为&#xff1a;http://www.enicn.com/article/2010-08-20/0R064b52010.shtml我的其他视频&#xff0c;请参考土豆空间&#xff0c;地址为http://www.tudou.com/home/larryvmw。

确认了!MySQL 狠甩 Oracle 稳居 Top1!

01几乎所有程序员都会用到的 MySQL稳居 Top 1科技长河&#xff0c;顺之者昌&#xff0c;错失者亡。在2019年&#xff0c;CSDN面向具备超强计算力的数字化世界&#xff0c;我们进行了「大数据技术应用现状分析」&#xff0c;并发布了《2019-2020 年中国开发者调查报告》。发现&a…

[AWK]使用AWK进行分割字符串以及截取字符串

如何split当前的字符串&#xff0c;用$0&#xff0c;例如&#xff1a; cat num.2012032911 | awk {print $2} | awk {split($0,b,".");print b[2]} | cut -c 3- 获取第二列&#xff0c;例如第二列是com.sb3456.you那么在split当前的这个字符串获得sb3456,最后截取sb3…

SpringMVC集成Tiles布局引擎框架

Tiles布局框架&#xff0c; http://tiles.apache.org/ Spring已经对Tiles进行了集成。页头页尾公共模板页要靠这个&#xff0c;不然重复代码太多。 <dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-servlet</artifactId><…

VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

右击项目->属性->字符集&#xff1a;使用多字节字符集。这样可以使用char到CString的转化。char sRead[20] ""; CString strtest sRead; 大气象 //文件查找/*CString strFileTitle;CFileFind finder;BOOL bWorking finder.FindFile(_T("C:\*.sys"…

程序员会懂的冷笑话:各大编程语言的内心独白

作者 | Anupam Chugh译者 | 弯月&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;软件工程领域鱼龙混杂。有些人乐不思蜀&#xff0c;而有些人则饱受打击。然而&#xff0c;构建软件的工作让每个人倍感压力&#xff0c;这点毋庸置疑。在本文…

swift集成alamofire的简单封装

import UIKit import Alamofire enum MethodType{ case GET case POST } class NetworkTool: NSObject { class func request(type : MethodType ,urlString : String , paramters: [String :Any]? nil,finishedCallback : escaping (_ result : Any) -> ()) { //判断是什…

Go后台项目架构思考与重构 | 深度长文

作者 | 腾讯云后台工程师黄雷编辑 | 唐小引来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;引言本文首先介绍了架构的重要性&#xff0c;随后从一个实际项目的重构过程作为主线&#xff0c;逐步引出主流的架构设计思想以及其所解决的实际问题是什么。通过阅读本文&…

前途到底是网络工程还是程序设计

本人89年年底生的&#xff0c;现在快满21了&#xff0c;大二的时候过的国家网络工程师考试&#xff0c;并不是cisco的网络支持工程师&#xff0c;大三也就是现在&#xff0c;在学校花销太大&#xff0c;想自己赚点钱&#xff0c;于是在学校招聘会上应聘了一家通信公司&#xff…

FAIL - Deployed application at context path / but context failed to start

IDE报错&#xff1a;FAIL - Deployed application at context path / but context failed to start 编译通过&#xff0c;这个错误原因是很多地方被误用&#xff0c;导致Spring运行时不能解析某些Class导致&#xff0c; 例如&#xff1a;ModelAndView用错 public ModelAndView…

项目ITP(五) spring4.0 整合 Quartz 实现任务调度

2014-05-16 22:51 by Jeff Li 前言 系列文章&#xff1a;[传送门] 项目需求&#xff1a; 二维码推送到一体机上&#xff0c;给学生签到扫描用。然后须要的是 上课前20分钟 。幸好在帮带我的学长做 p2p 的时候。接触过。自然 quartz 是首选。所以我就配置了下&#xff0c;搞了个…

Spring security防止跨站请求伪造(CSRF防护)

因为使用了spring security 安全性框架 所以spring security 会自动拦截站点所有状态变化的请求&#xff08;非GET,HEAD,OPTIONS和TRACE的请求&#xff09;&#xff0c;防止跨站请求伪造&#xff08;CSRF防护&#xff09;&#xff0c;即防止其他网站或是程序POST等请求本站点。…