MPI和OpenMP混合编程实例
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混合编程实例相关推荐
- MPI和OpenMP混合编程计算pi π值
MPI和OpenMP混合编程,π #include "stdio.h" #include "mpi.h" #include "omp.h" ...
- mpi和openmp混合编程的优点_西门子PLC可编程控制器CPU1215C一级总代理
西门子PLC可编程控制器CPU1215C一级总代理 上海峰萨自动化设备有限公司于2018年03月15日成立.法定代表人苏胜文,公司经营范围包括工业自动化设备,电子元器件,仪器仪表,电线电缆,通信设备及 ...
- mpi和openmp混合编程的优点_混合云:拥抱云计算的未来!
云技术为公共云,私有云和混合云开辟了新的可能性.许多组织正在迁移到混合云以充分利用云计算. 什么是混合云?混合云基础架构是一种IT体系结构,在两个或多个环境中融合了一定程度的管理和工作负载可移植性.混 ...
- python和C语言混合编程实例
转载自:http://www.jb51.net/article/50633.htm 这篇文章主要介绍了python和C语言混合编程实例,文中开发了一个tcp端口ping程序来介绍混合编程,需要的朋友可 ...
- CUDA、SU、MPI和Madagascar混合编程的Makefile文件配置
本人从事地震勘探的科研工作,在Ubuntu系统中用CUDA.SU.MPI和Madagascar做C语言的混合编程.多语言混合编程,关键之处在于Makefile文件的配置.在此给出一个简单的示例,供大家 ...
- Mpi与Cuda混合编程(Makefile)
需要建立一个.c的MPI程序和一个.cu的CUDA程序,MPI程序中调用CUDA中的函数来完成并行与GPU的混合编程,我查询了很多资料和博客,最终得出结论,还是Google比较强大,百度什么的还是搜不 ...
- vc6.0 matlab混合编程,matlab2010 + vc6.0混合编程实例(调用dll)
不想解释太多直接上代码吧!!! 在对matlab配置后,上代码mcc -W cpplib:libMyAdd -T link:lib MyAdd -C就可以了,记得加上-C 在对VC6.0进行配置的时候 ...
- .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(2)...
第二节 桁架结构基本信息录入与保存 此节之后会结合一个算例.结构如图,EA = 300000 kN 杆件编号.节点编号.坐标系: 2.1 文本信息 bars.txt 1,1,3,300000 2, ...
- .Net ( c# ) 与 Fortran 混合编程实例(二):杆系结构有限元法——平面桁架解答(3)
第三节 构造有限元法基本方程 3.1 形成未引入边界的总刚度矩阵.总荷载列阵.总边界列阵 新建类,命名为 ClassCalculation,贴入以下代码: using System; using ...
最新文章
- 网站排名优化看技巧!
- ASP“.NET研究”.NET中的认证与授权
- 操作系统之文件管理:1、初识文件管理
- TensorFlow学习笔记03:单变量线性回归
- toolchain安装教程支持_Xilinx交叉编译工具链安装步骤
- mysql锁表查询_Mysql upate 更新锁表还是锁行测试
- 敲了 10000 小时代码,我也没能成为一名高级程序员
- matlab2c使用c++实现matlab函数系列教程-sawtooth函数
- 459B Pashmak and Flowers
- ITIL-IT运维管理-概述
- 内存和flash区别
- 计算机cpu的定义,CPU是什么?
- Godaddy创始人:成就亿万富翁的10条规则
- SpringBoot入门(四)Service、Dao
- 荣耀畅玩5a android5.0,华为荣耀畅玩5A有几个版本?华为荣耀5A各版本区别对比介绍...
- 字节跳动校招内推开始了
- Repeated measures ANOVA with R
- JS结合PHP瀑布流,JavaScript_原生JS实现响应式瀑布流布局,原生JS实现的瀑布流布局,代 - phpStudy...
- 微信小程序——分割线
- CentOS7.4下安装Oracle 11gR2
热门文章
- 例35:字符串反转,如将字符串 “www.runoob.com“ 反转为 “moc.boonur.www“。
- matlab shift 详解,Matlab fftshift 详解
- Linux 运行 jar 包命令
- 爬虫之 JS(返回非 json 数据)的爬取
- java 内存回收参数_JAVA虚拟机内存回收算法与调优参数
- 关于c语言期中考试卡在了回文序列递归的这件事
- PLC现场安装的注意事项的安装步骤
- css3、less实现星空动画案例
- 一个很简单的JavaMVC架构的二手车交易系统
- git保存用户名和密码,不用每次输入账号