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& ...
随机推荐
- [UOJ 282]长度测量鸡
Description
- USACO 2017 US Open
只会做T1,FallDream T2 n^2暴力AC,太强啦. T1.Modern Art 题目大意:有一个n*n的矩阵,一开始都是0,你有n^2种颜色,编号1到n^2,每次可以选出一种颜色涂满一个子 ...
- [POJ2406]字符串的幂
题目描述] 对于给定的两个字符串a,b,我们定义a*b是将把它们连接在一起形成的字符串.例如,若a="abc",b="def",则a*b="abcde ...
- 【Miller-Rabin随机判素数算法】
实用性介绍: #include<bits/stdc++.h> #define go(i,a,b) for(int i=a;i<=b;i++) #define T 5 #define ...
- 2017ACM/ICPC广西邀请赛-重现赛 1004.Covering
Problem Description Bob's school has a big playground, boys and girls always play games here after s ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证
本节内容 models操作 Django的缓存 请求方式 序列化 Form 配合Ajax实现登录认证 上传文件 Ajax csrf_token验证方式 1 models操作 单表查询: curd(增 ...
- day4 liaoxuefeng---函数式编程
一.概述: 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程 ...
- opencv 3.1.0 访问像素值的三种方法(C++)
三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...
- centos 7.X & centos6.X 防火墙基本命令
Centos 7 firewall 命令:查看已经开放的端口: firewall-cmd --list-ports 开启端口 firewall-cmd --zone=public --add-port ...