OpenMP与MPI联合编程
研究一下如何一起使用mpi和openmp
先上程序:
#include <stdio.h>
#include <stdlib.h>
#ifdef _OPENMP
#include <omp.h>
#endif
#ifdef MPICH_CC
#include <mpi.h>
#endif
#define SIZE 512
#define SIZEM SIZE
#define SIZEN SIZE
#define SIZEK SIZE
#define DISPLAYT 1
double mytic()
{
double result = 0.0;
struct timeval tv;
gettimeofday( &tv, NULL );
result = tv.tv_sec*1e6 + tv.tv_usec;
return result;
}
int main(int argc, char** argv)
{
#ifdef MPICH_CC
int mpirank;
int mpisize;
MPI_Status mpistatus;
#endif
float *ma;
float *mb;
float *mc;
int m, n, k;
int r, s, t;
float tsum;
double tstart, tend;
#ifdef MPICH_CC
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &mpirank);
#endif
#ifdef _OPENMP
omp_set_num_threads(2);
#endif
/*Matrx A, B, C allocation.*/
m = SIZEM; n = SIZEN; k = SIZEK;
ma = (float*)malloc(m*n*sizeof(float));
if (!ma){return -1;}
mb = (float*)malloc(n*k*sizeof(float));
if (!mb){free(ma);return -1;}
mc = (float*)malloc(m*k*sizeof(float));
if (!mc){free(ma);free(mb);return -1;}
/*Matrx A, B, C initialization.*/
srand((unsigned int)time(0));
tstart = mytic();
for (r = 0; r < m; r++)
{
for (s = 0; s < n; s++)
{
ma[r*n+s] = (1.0*rand())/RAND_MAX;
}
}
#if DISPLAYT
printf("[T] ma initialization time : %.3fms\n", 1e-3*(mytic()-tstart));
#endif
tstart = mytic();
for (r = 0; r < n; r++)
{
for (s = 0; s < k; s++)
{
mb[r*k+s] = (1.0*rand())/RAND_MAX;
}
}
#if DISPLAYT
printf("[T] mb initialization time : %.3fms\n", 1e-3*(mytic()-tstart));
#endif
/*Compute matrix C*/
tstart = mytic();
#pragma omp parallel for private(r,t,s,tsum) shared(m,n,k,ma,mb,mc)
for (r = 0; r < m; r++)
{
for (t = 0; t < k; t++)
{
tsum = 0.0f;
for (s = 0; s < n; s++)
{
tsum += ma[r*n+s]*mb[s*k+t];
}
mc[r*m+t] = tsum;
}
}
#if DISPLAYT
printf("[T] mc computation time : %.3fms\n", 1e-3*(mytic()-tstart));
#endif
#ifdef MPICH_CC
printf("[R] rank = %d with ", mpirank);
#pragma omp parallel
{
if (0==omp_get_thread_num())
{
printf("omp_size = %d\n", omp_get_num_threads());
}
}
#endif
#ifdef MPICH_CC
#endif
#ifdef MPICH_CC
printf("MPI -- parallel \n");
MPI_Finalize();
#else
printf(" serial \n");
#endif
free(ma);free(mb);free(mc);
return 0;
}
使用如下命令编译这个代码
gcc -DMPICH_CC -O0 -fopenmp test.c `pkg-config --cflags --libs mpich` -o mpiomp.exe
执行代码(我用的是mpich)
mpiexec -n 2 ./mpiomp.exe
上面启动了两个进程来执行代码。
程序中,每个进程做的是一样的事情,都是计算两个矩阵的乘积,计算矩阵乘积的时候,我用openmp将矩阵乘积的计算分配给几个不同的线程来计算,以增加并行度。
如果你想在执行的时候设置openmp的线程数,可以把代码中第50行注释掉,然后用下面的命令执行。我是在ubuntu12.04上测试的,用的gcc-4.6.3,如果先不注释执行的话,再注释后按下面的命令执行的话,可能会得到跟之前一样的结果。这个原因我不是很清楚。有知道的,烦请告知一下呀。
mpiexec -n 2 -env OMP_NUM_THREADS 4 ./mpiomp.exe
注意几点:
因为有很多新手,可能以上来执行不出来。所以给出一下几个可能出问提的点。
* 是否安装MPICH? 没有安装的话,麻烦先安装。源码安装的看这里 点击打开链接
* pkg-config出问题。 检查下 mpich.pc是否在pkg-config的搜索路径,或者man pkg-config研究下pkg-config
OpenMP与MPI联合编程的更多相关文章
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
- 转 Visual C++6.0 与matlab联合编程(2)----Visual C++6.0 环境下编译和调试MEX文件
我的最初想法是利用matlab的mex命令调用C++程序生成动态链接库的,但是测试程序(文中另附)通过了,自己的实际应用程序却没有过.还是把方法贴在这儿,以便自己以后进行整理. http://shij ...
- c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)
转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...
- 方阵行列式并行化计算(OpenMP,MPI),并计算加速比
00][100].在创建方阵时,方阵的阶数N(N<100)由外部输入.然后用两层"for循环"来给方阵 p左上角 N×N个位置赋值.具体实现如下: /* * 定义矩阵阶数N ...
- Halcon C# 联合编程问题(三)
因为之前遇到的那个halcon处理的图片要转换成ImageSource的问题,迟迟没有找到好的解决方案, 于是决定直接在wpf中使用halcon提供的HWindowControlWPF,用于显示图片. ...
- 在CentOS上安装MPI以及MPI入门编程笔记
一.准备工作 更新yum库 yum update 下载相关依赖包 yum install wget -y yum install gcc gcc-c++ gcc-fortran kernel-deve ...
- 学习MPI并行编程记录
简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 he ...
- Win7 32bit + Matlab2013b +Visual Studio 2010联合编程配置
要建立独立运行的C应用程序,系统中需要安装Matlab.Matlab编译器.C/C++编译器以及Matlab C/C++数学库函数和图形库函数. Matlab编译器使用mbuild命令可以直接将C/C ...
- 基于OpenMP的C++并行编程简单示例
示例要求:在整数A和B之间找到符合条件的值X,使f(X)=C. 示例代码(需要在VS中开启OpenMP支持): #include<iostream> #include<time.h& ...
随机推荐
- [Codeforces 297E]Mystic Carvings
Description 题库链接 题面链接 Solution 这里给出主席树的版本.主席树维护直线的一个端点在前 \(i\) 个端点中,另一个端点在区间内的个数. Code //It is made ...
- [AH/HNOI2017]影魔
题目背景 影魔,奈文摩尔,据说有着一个诗人的灵魂. 事实上,他吞噬的诗人灵魂早已成千上万. 千百年来,他收集了各式各样的灵魂,包括诗人. 牧师. 帝王. 乞丐. 奴隶. 罪人,当然,还有英雄. 题目描 ...
- [LCA模版] Distance Queries
题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道.此题的输入于第一题相同,紧接着下一行输入一个整数K,以后K行为K个"距离问 ...
- Codeforces Round #401 (Div. 2)
和FallDream dalao一起从学长那借了个小号打Div2,他切ABE我做CD,我这里就写下CD题解,剩下的戳这里 AC:All Rank:33 小号Rating:1539+217->17 ...
- ●BZOJ 1853 [Scoi2010]幸运数字
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题解: 容斥原理,暴力搜索,剪枝(这剪枝剪得真玄学) 首先容易发现,幸运号码不超过 2 ...
- [BZOJ]1011 遥远的行星(HNOI2008)
由eps引发的血案. Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=A*J.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) ...
- bzoj3622已经没有什么好害怕的了 dp+组合+容斥(?)
3622: 已经没有什么好害怕的了 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1033 Solved: 480[Submit][Status][ ...
- SpringCloud学习之feign
一.关于feigin feigin是一种模板化,声明式的http客户端,feign可以通过注解绑定到接口上来简化Http请求访问.当然我们也可以在创建Feign对象时定制自定义解码器(xml或者jso ...
- django rest-framework 1.序列化 一
上图为项目完整的目录结构 一.入门 需要先安装需要使用到包 pip install django pip install djangorestframework 先来创建一个新项目 django-ad ...
- 数组的遍历你都会用了,那Promise版本的呢
这里指的遍历方法包括:map.reduce.reduceRight.forEach.filter.some.every因为最近要进行了一些数据汇总,node版本已经是8.11.1了,所以直接写了个as ...