MPI和OpenMP混合编程

计算pi值

大体思路就是先将计算区域划分成100000 份,然后将计算分成进程数nproc(nproc)份,每一份有nbin个计算。 步长为step = 1.0 / NBIN; ,然后再2每个进程下,开启多线程计算:再将数据划分成线程数块个区域进行计算:for (i = nbin * rank + tid; i < nbin * (rank + 1); i += nthreads),这里是最重要的。理解图如下:

计算完成后将每一个线程块的数据放在sum中,然后再线程求和。最后再进行进程规约求和。
需要注意的就是:
由于intel的超线程技术,所以在获取最大线程数MAX_THREADS的时候,应该 乘上2。否者部分数据会由于没有分配内存而出现计算的错误。


源代码如下:

#include <stdio.h>
#include <iostream>
#include <mpi.h>
#include <omp.h>#define NBIN 100000
#define MAX_THREADS 8using namespace std;void piCpu()
{int nbin;    // step number of each processint rank;     // rank idint nproc;    // process numbersint nthreads; // thread numbersint tid;   // thread iddouble step;  // step lengthdouble sum[MAX_THREADS * 2] = { 0.0 }; //*2 due to hyper-threading technologydouble pi = 0.0, pig;MPI_Init(NULL, NULL);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &nproc);cout << "nproc=" << nproc << "\trank_id=" << rank << endl;nbin = NBIN / nproc;step = 1.0 / NBIN;        // or step = 1.0 / (nbin * nproc);#pragma omp parallel private(tid) /*num_threads(8)*/{// this block will be exec by 8 threads in each processint i;double x;nthreads = omp_get_num_threads();tid = omp_get_thread_num();// 多个OpenMP线程被划分到不同的数据段for (i = nbin * rank + tid; i < nbin * (rank + 1); i += nthreads){x = (i + 0.5) * step;sum[tid] += 4.0 / (1.0 + x * x);}printf("rank: %d threadid: %d, sum =   %e\n", rank, tid, sum[tid]);}for (tid = 0; tid < nthreads; tid++)pi += sum[tid] * step;   // integral sum,sum=dy*dxMPI_Allreduce(&pi, &pig, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);if (rank == 0)printf("cpu: PI = %f\n", pig);MPI_Finalize();
}

MPI和OpenMP混合编程实例相关推荐

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

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

  2. mpi和openmp混合编程的优点_西门子PLC可编程控制器CPU1215C一级总代理

    西门子PLC可编程控制器CPU1215C一级总代理 上海峰萨自动化设备有限公司于2018年03月15日成立.法定代表人苏胜文,公司经营范围包括工业自动化设备,电子元器件,仪器仪表,电线电缆,通信设备及 ...

  3. mpi和openmp混合编程的优点_混合云:拥抱云计算的未来!

    云技术为公共云,私有云和混合云开辟了新的可能性.许多组织正在迁移到混合云以充分利用云计算. 什么是混合云?混合云基础架构是一种IT体系结构,在两个或多个环境中融合了一定程度的管理和工作负载可移植性.混 ...

  4. python和C语言混合编程实例

    转载自:http://www.jb51.net/article/50633.htm 这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可 ...

  5. CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置

    本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...

  6. Mpi与Cuda混合编程(Makefile)

    需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不 ...

  7. vc6.0 matlab混合编程,matlab2010 + vc6.0混合编程实例(调用dll)

    不想解释太多直接上代码吧!!! 在对matlab配置后,上代码mcc -W cpplib:libMyAdd -T link:lib MyAdd -C就可以了,记得加上-C 在对VC6.0进行配置的时候 ...

  8. .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(2)...

    第二节  桁架结构基本信息录入与保存 此节之后会结合一个算例.结构如图,EA = 300000 kN 杆件编号.节点编号.坐标系: 2.1  文本信息 bars.txt 1,1,3,300000 2, ...

  9. .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(3)

    第三节  构造有限元法基本方程 3.1  形成未引入边界的总刚度矩阵.总荷载列阵.总边界列阵 新建类,命名为 ClassCalculation,贴入以下代码: using System; using ...

最新文章

  1. 网站排名优化看技巧!
  2. ASP“.NET研究”.NET中的认证与授权
  3. 操作系统之文件管理:1、初识文件管理
  4. TensorFlow学习笔记03:单变量线性回归
  5. toolchain安装教程支持_Xilinx交叉编译工具链安装步骤
  6. mysql锁表查询_Mysql upate 更新锁表还是锁行测试
  7. 敲了 10000 小时代码,我也没能成为一名高级程序员
  8. matlab2c使用c++实现matlab函数系列教程-sawtooth函数
  9. 459B Pashmak and Flowers
  10. ITIL-IT运维管理-概述
  11. 内存和flash区别
  12. 计算机cpu的定义,CPU是什么?
  13. Godaddy创始人:成就亿万富翁的10条规则
  14. SpringBoot入门(四)Service、Dao
  15. 荣耀畅玩5a android5.0,华为荣耀畅玩5A有几个版本?华为荣耀5A各版本区别对比介绍...
  16. 字节跳动校招内推开始了
  17. Repeated measures ANOVA with R
  18. JS结合PHP瀑布流,JavaScript_原生JS实现响应式瀑布流布局,原生JS实现的瀑布流布局,代 - phpStudy...
  19. 微信小程序——分割线
  20. CentOS7.4下安装Oracle 11gR2

热门文章

  1. 例35:字符串反转,如将字符串 “www.runoob.com“ 反转为 “moc.boonur.www“。
  2. matlab shift 详解,Matlab fftshift 详解
  3. Linux 运行 jar 包命令
  4. 爬虫之 JS(返回非 json 数据)的爬取
  5. java 内存回收参数_JAVA虚拟机内存回收算法与调优参数
  6. 关于c语言期中考试卡在了回文序列递归的这件事
  7. PLC现场安装的注意事项的安装步骤
  8. css3、less实现星空动画案例
  9. 一个很简单的JavaMVC架构的二手车交易系统
  10. git保存用户名和密码,不用每次输入账号