研究一下如何一起使用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联合编程的更多相关文章

  1. OpenMP共享内存并行编程详解

    实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...

  2. 转 Visual C++6.0 与matlab联合编程(2)----Visual C++6.0 环境下编译和调试MEX文件

    我的最初想法是利用matlab的mex命令调用C++程序生成动态链接库的,但是测试程序(文中另附)通过了,自己的实际应用程序却没有过.还是把方法贴在这儿,以便自己以后进行整理. http://shij ...

  3. c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件(转)

    转自:http://www.cnblogs.com/xlw1219/archive/2012/12/25/2832222.html 首先必须知道联合编程需要知道的一些命令解释: mcc 的作用是将 . ...

  4. 方阵行列式并行化计算(OpenMP,MPI),并计算加速比

    00][100].在创建方阵时,方阵的阶数N(N<100)由外部输入.然后用两层"for循环"来给方阵 p左上角 N×N个位置赋值.具体实现如下: /* * 定义矩阵阶数N ...

  5. Halcon C# 联合编程问题(三)

    因为之前遇到的那个halcon处理的图片要转换成ImageSource的问题,迟迟没有找到好的解决方案, 于是决定直接在wpf中使用halcon提供的HWindowControlWPF,用于显示图片. ...

  6. 在CentOS上安装MPI以及MPI入门编程笔记

    一.准备工作 更新yum库 yum update 下载相关依赖包 yum install wget -y yum install gcc gcc-c++ gcc-fortran kernel-deve ...

  7. 学习MPI并行编程记录

    简单的MPI程序示例 首先,我们来看一个简单的MPI程序实例.如同我们学习各种语言的第一个程序一样,对于MPI的第一个程序同样是"Hello Word". /* Case 1 he ...

  8. Win7 32bit + Matlab2013b +Visual Studio 2010联合编程配置

    要建立独立运行的C应用程序,系统中需要安装Matlab.Matlab编译器.C/C++编译器以及Matlab C/C++数学库函数和图形库函数. Matlab编译器使用mbuild命令可以直接将C/C ...

  9. 基于OpenMP的C++并行编程简单示例

    示例要求:在整数A和B之间找到符合条件的值X,使f(X)=C. 示例代码(需要在VS中开启OpenMP支持): #include<iostream> #include<time.h& ...

随机推荐

  1. ●洛谷P3242 [HNOI2015]接水果

    题链: https://www.luogu.org/problemnew/show/P3242 题解: 整体二分,扫描线+树状数组. 详细的题解:http://blog.csdn.net/thy_as ...

  2. ●UVA 11796 Dog Distance

    题链: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. HDU 5412 CRB and Queries 动态整体二分

    Problem Description There are N boys in CodeLand.Boy i has his coding skill Ai.CRB wants to know who ...

  4. UOJ #11. 【UTR #1】ydc的大树

    题目描述: ydc有一棵n个结点的黑白相间的大树,从1到n编号. 这棵黑白树中有m个黑点,其它都是白点. 对于一个黑点我们定义他的好朋友为离他最远的黑点.如果有多个黑点离它最远那么都是它的好朋友.两点 ...

  5. bzoj 2440 (莫比乌斯函数)

    bzoj 2440 完全平方数 题意:找出第k个不是完全平方数的正整数倍的数. 例如 4  9  16  25 36什么的 通过容斥原理,我们减去所有完全数  4有n/4个,但是36这种会被重复减去, ...

  6. Django Class Views

    一.Base views View class django.views.generic.base.View 主要的基于类的基本视图.所有其他基于类的视图都从这个基类继承而来.它不是一个通用的视图,因 ...

  7. Unique-paths (动态规划)

    题目描述 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below) ...

  8. C语言预备作业

    一.关于师生关系 第一种:我认为师生关系不是仅仅的餐馆与食客的关系,因为食客可以给餐馆评分,也可以选择是否继续在这里吃,但是学生却不可以选择老师,因为老师是传授知识的,无法由自己来选择.而学生是需要完 ...

  9. 好久没用IJ写Java 之 《求输入的一个数中包含奇数、偶数、零的个数》

    /** *Created by xuzili at 22:12 on 2018/4/4 */ // 以上注释使用了IntelliJ Idea的File-Settings-Editor-Live Tem ...

  10. centos7 支持中文显示

    http://www.linuxidc.com/Linux/2017-07/145572.htm这篇文章比较全.我印证了一下,没有问题 centos7的与centos6有少许不同: 1.安装中文包: ...