利用矩形规则计算pi

#include<mpi.h>

#include<iostream>

using namespace std;

 

const int INTERVALS = 40000;

 

int main(int argc,char ** argv)

{

         int rank,size;

 

         double area = 0;

         double gl_area = 0;

 

         double runtime;

 

         double x;

 

         MPI_Init(&argc,&argv);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

 

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

         for(int i = rank *(INTERVALS / size); i < (rank+1)*(INTERVALS / size); i++)

         {

                   x = (1.0/INTERVALS) * (i+0.5);

 

                   area += 4.0 /(1.0 + x*x) * (1.0/INTERVALS); //高*底

         }

 

         printf("Proces: %d area: %lf\n",rank,area);

 

         MPI_Reduce(&area,&gl_area,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);

 

         runtime += MPI_Wtime();

 

         printf("runtime %lfms\n",runtime*1000);

 

         MPI_Finalize();

 

         if(rank == 0)

                   printf("gl_area: %.16lf\n",gl_area);

 

         return 0;

}

 



以下是MPI_Reduce() / 

利用MPI_Bcast() /

MPI_Allgather()

将结果都保存到所有进程中


#include<mpi.h>

#include<iostream>

using namespace std;

 

const int maxn = 8;

 

int val[maxn]; 

int VAL[maxn];//用于保存最终的结果

 

int main(int argc,char *argv[])

{

         int rank,size;

 

         double runtime;

 

         int ans=0, gl_ans = 0;

 

         MPI_Init(&argc,&argv);

 

         MPI_Barrier(MPI_COMM_WORLD);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

 

         for(int i = rank * (maxn / size); i< (rank+1) * (maxn / size); i ++)

         {

                   val[i] = i;

                   ans += i;

         }

 

         printf("ProcessID : %d\n",rank);

 

         printf("ans: %d\n",ans);

 

        

         //MPI_Reduce(void *operand,void *result, int count,MPI_Datatype type, MPI_Op operator, int root, MPI_Comm comm);

         MPI_Reduce(&ans,&gl_ans,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

 

         MPI_Barrier(MPI_COMM_WORLD);  //这里的阻塞,保证全部进程已完成归约,进程0得到正确结果后,才可以所这个值广播出去

 

         //MPI_Bcast(void *buffer,int size,MPI_Datatype, int root,MPI_COMM);

         MPI_Bcast(&gl_ans,1,MPI_INT,0,MPI_COMM_WORLD);   //将进程0的gl_ans广播到其它进程

 

         //全收集各进程的val数组的值,使每个进程都含有完整的val数组

 

//MPI_Allgather(void* send_buffer,int sent_size,MPI_Datatype,  void* recv_buffer,int recv_size,MPI_Datatype,MPI_COMM)

         MPI_Allgather(&val[rank * (maxn / size)],(maxn / size),MPI_INT,VAL,(maxn / size),MPI_INT,MPI_COMM_WORLD);

 

 

         runtime += MPI_Wtime();

         printf("runtime: %.1lfms\n",runtime * 1000);

 

         MPI_Finalize();

 

         printf("val:");

         for(int i=0; i<maxn; i++)   //从这里可以看出,这些变量(包括数组),都是每个主机的私有变量,哈哈,这是明显的,因为这个消息传递的,并不是共享内存的

                   printf("%d ",val[i]);

         printf("\n");

        

         printf("VAL:");             //输出全收集后的结果VAL

         for(int i=0; i<maxn; i++) 

                   printf("%d ",VAL[i]);

         printf("\n");

 

         //if(rank == 0)

                   printf("gloal_ans: %d\n\n",gl_ans);

 

         return 0;

}

 


//利用MPI_Reduce()和MPI_Gather()将数据都存放到进程0上

 

#include<mpi.h>

#include<iostream>

using namespace std;

 

const int maxn = 8;

 

int val[maxn]; 

int VAL[maxn];//用于保存最终的结果

 

int main(int argc,char *argv[])

{

         int rank,size;

 

         double runtime;

 

         int ans=0, gl_ans = 0;

 

         MPI_Init(&argc,&argv);

 

         MPI_Barrier(MPI_COMM_WORLD);

 

         runtime = -MPI_Wtime();

 

         MPI_Comm_size(MPI_COMM_WORLD,&size);

         MPI_Comm_rank(MPI_COMM_WORLD,&rank);

 

 

         for(int i = rank * (maxn / size); i< (rank+1) * (maxn / size); i ++)

         {

                   val[i] = i;

                   ans += i;

         }

 

         printf("ProcessID : %d\n",rank);

 

         printf("ans: %d\n",ans);

 

        

         //MPI_Reduce(void *operand,void *result, int count,MPI_Datatype type, MPI_Op operator, int root, MPI_Comm comm);

         MPI_Reduce(&ans,&gl_ans,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

 

         MPI_Barrier(MPI_COMM_WORLD);  //这里的阻塞,保证全部进程已完成部分val数组的计算,可以提供给进程0进行收集

 

//MPI_Gather(void* sentbuf,int sentcnt,MPI_Datatype senttype,  void* recvbuff,int recvcnt,MPI_Datetype recvtype,root,MPI_COMM);  //root进程收集所有进程的数据

         MPI_Gather(&val[rank * (maxn / size)],(maxn / size),MPI_INT,  VAL,(maxn / size),MPI_INT,0,MPI_COMM_WORLD);

 

         runtime += MPI_Wtime();

         printf("runtime: %.1lfms\n",runtime * 1000);

 

         MPI_Finalize();

 

         printf("val:");

         for(int i=0; i<maxn; i++)   //从这里可以看出,这些变量(包括数组),都是每个主机的私有变量,哈哈,这是明显的,因为这个消息传递的,并不是共享内存的

                   printf("%d ",val[i]);

         printf("\n");

        

         printf("VAL:");             //输出全收集后的结果VAL

         for(int i=0; i<maxn; i++) 

                   printf("%d ",VAL[i]);

         printf("\n");

 

         //if(rank == 0)

                   printf("gloal_ans: %d\n\n",gl_ans);

 

         return 0;

}

我的第一个MPI程序:利用矩形规则计算pi相关推荐

  1. 编写一个JSP程序Jiecheng.jsp,计算整数的阶乘,并显示出结果。

    编写一个JSP程序Jiecheng.jsp,计算整数的阶乘,并显示出结果. 要求先声明计算阶乘的方法,再调用该方法,最后在页面上输出结果. 通过表单提交一个正整数,然后计算它的阶乘. 参考代码: ...

  2. python学习之 利用蒙特卡洛方法计算PI值

    使用环境为python IDLE3.5. #利用蒙特卡洛方法计算PI值 from random import random from math import sqrt from time import ...

  3. 程序实现蒙特卡洛算法计算PI值和积分

    蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法.是 ...

  4. 【MPI高性能计算】蒙特卡洛方法计算pi值

    蒙特卡洛方法 就是通过概率模拟来近似计算. 其实算法进度不是很高. 代码 在下面代码中的input文件中的内容是 10000000 运行效果:下面用四个核来做计算 PS D:\C++\VS\repo\ ...

  5. MPI和OpenMP混合编程计算pi π值

    MPI和OpenMP混合编程,π #include "stdio.h" #include "mpi.h" #include "omp.h" ...

  6. 我的第一个Java程序

    开始第一个Java程序 保证你的计算机上有一个文本编辑器 安装JDK[一般JDK在官网下载] JDK.JRE.JVM的关系 JDK目录的介绍 JDK/bin:该目录下存放了很多命令,例如javac.e ...

  7. 搭建MPI并行计算环境并计算pi值[windows 和 Ubuntu]

    文章目录 一. 选在Linux,Ubuntu或者Windows上搭建mpi环境 First of all What's more 二.VS配置mpi 三.计算pi值 (1)基础编译环境的构建 (2)M ...

  8. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  9. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

最新文章

  1. go ...打散切片
  2. SequoiaDB 巨杉数据库
  3. 利用Python绘制中国新型冠状病毒疫情图(国家和省)
  4. 高可用集群技术之corosync应用详解(一)
  5. 数据装载指定一张表或者多张表直接装载到目标表_10
  6. 当打开VS2013卡到吐,并且点一下卡一下
  7. 【图像加密】基于matlab GUI混沌系统灰色图像加密解密(带面板)【含Matlab源码 1240期】
  8. Node.js笔记(0003)---Express框架Router模块学习笔记
  9. html5响应式的插件,Chocolat-jQuery响应式LightBox插件 -HTML5功能
  10. e5服务器cpu性能排行,了解至强cpu!至强cpu性能排行榜及具体参数详解【详解】...
  11. 为什么蓝牙电子产品要做BQB认证
  12. 使用HTML创建表单
  13. 安慰奶牛 问题描述 Farmer John变得非常懒,他不想再继续维
  14. 数据结构13:无序表抽象数据类型(链表)(一)
  15. Anzu.io 进军中国游戏市场,任命曾晨为市场拓展负责人
  16. 中科院计算所培训中心开启课程研发新征程
  17. 大学教务人员管理系统(C++实现)
  18. PostgreSQL 15 preview -:你了解PostgreSQL GUC 参数吗?
  19. charles抓app包教程_抓包工具--charles(青花瓷)及获取AppStore数据包
  20. 一体机性能服务器图片介绍,一体机服务器

热门文章

  1. web html分块加载,javascript – 使用webpack代码拆分,如何加载块和HTML布局?
  2. Java 算法 矩阵乘法
  3. VS2017新建HTML项目,VS2017创建项目模板和项模板(方便实用)
  4. html怎么添加5px高的线,css给div添加0.5px的边框
  5. pytorch使用早停策略
  6. linux结构体大小端,【转】位结构体+大小端模式
  7. 【APIO2009-3】抢掠计划
  8. nginx 配置后网站图片加载出来一半或者不出来
  9. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow
  10. Meteor 加入账户系统