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& ...
随机推荐
- [BZOJ 3456]城市规划
Description 题库链接( bzoj 权限题,可以去 cogs 交♂ 题库链接2 求含有 \(n\) 个点有标号的简单无向联通图的个数.方案数对 \(1004535809(479\times ...
- [Codeforces 940E]Cashback
Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{le ...
- [SDOI2016]硬币游戏
题目描述 Alice 和 Bob 现在在玩的游戏,主角是依次编号为 1 到 n 的 n 枚硬币.每一枚硬币都有两面,我们分别称之为正面和反面.一开始的时候,有些硬币是正面向上的,有些是反面朝上的.Al ...
- [SPOJ 287] Smart Network Administrator 二分答案+网络流
The citizens of a small village are tired of being the only inhabitants around without a connection ...
- 基于vfs实现自己的文件系统
1.Linux 文件系统组成结构 linux文件系统有两个重要的特点:一个是文件系统抽象出了一个通用文件表示层--虚拟文件系统或称做VFS.另外一个重要特点就是它的文件系统支持动态安装(或说挂载等), ...
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- [hdu4694]Important Sisters
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一张图,求每个点到第n个点必须经过的点的编号之和.n<=50000 一道支配树裸题 然后统计答案的时候可以正着推,ans[i]=an ...
- bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 452 Solved: 205[Submit][Status][D ...
- SpringBoot学习之集成mybatis
一.spring boot集成Mybatis gradle配置: //gradle配置: compile("org.springframework.boot:spring-boot-star ...
- Spring学习笔记1——入门
Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是创建对象由以前的程序员自己new 构造方法来调 ...