`
cloudtech
  • 浏览: 4815450 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Windows 7系统下搭建MPI(并行计算)环境

 
阅读更多

MPI的全称是Message Passing Interface即标准消息传递界面,可以用于并行计算。MPI的具体实现一般采用MPICH。下面介绍如何在Windows 7系统下VC6中搭建MPI环境来编写MPI程序。

1.安装MPI的SDK——MPICH2

mpich2-1.4.1p1-win-ia32安装程序的下载地址:

http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.4.1p1/mpich2-1.4.1p1-win-ia32.msi

本文以设置安装在C:\Program Files\MPICH2目录下为例。

测试所安装的MPICH2

测试前首先需要注册一个用户,具体操作如下:“开始”按钮-->所有程序-->MPICH2-->wmpiregister.exe。输入用户名、密码。有一点需要说明:该用户名须为有效的操作系统管理员账户,密码对应为系统登录密码。如图所示:


接下来选择开始-->所有程序-->MPICH2-->wmpiexec.exe;

选择Application为 c:\program files\mpich2\examples\cpi.exe (就是自带的一个计算圆周率的例子程序)。在Number of processes的数量选择2表示用二个进程来协同完成。选中“run in separate windw”选项。再点击Excute就可以执行了。

然后在控制台窗口下提示输入number of intervals ,随便输入个大点的数字(4000,4000000)就可以看到求的的圆周率值。如下图:


运行结果如下:


2.在VC6.0中添加MPICH

在VC6.0中加入mpi的include和lib。VC6.0程序菜单中“工具” --> “选项”-->“目录”然后添加,如下图所示:



3.本以为到此就已经安装好了,然后就赶紧写了个Hello World的程序。

#include <mpi.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <conio.h>  
  
#pragma comment (lib, "mpi.lib")   
  
int main(int argc, char* argv[])  
{  
    int myid,numprocs;  
    int namelen;  
    char processor_name[MPI_MAX_PROCESSOR_NAME];  
      
    MPI_Init(&argc, &argv);  
  
    //用MPI_Comm_rank 获得进程的rank,该rank值为0到p-1间的整数,相当于进程的ID  
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);  
    //用MPI_Comm_size 获得进程个数  int MPI_Comm_size(MPI_Comm comm, int *size);  
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);  
  
    MPI_Get_processor_name(processor_name, &namelen);  
      
    printf("Hello World! by MoreWindows\nProcess %d of %d on %s\n", myid, numprocs, processor_name);  
      
    MPI_Finalize();  
      
    if (myid == 1)  
    {  
        printf("\nPress a key and exit.\n");  
        getch();  
    }  
    return 0;  
}  
编译运行之后各种如下错误:
c:\program files\mpich2\include\mpicxx.h(1536) : error C2555: 'MPI::Intercomm::Clone' : overriding virtual function differs from 'MPI::Comm::Clone' only by return type or calling convention
c:\program files\mpich2\include\mpicxx.h(1107) : see declaration of 'Comm'
郁闷,这么个小东西都装不好,还谈什么写程序啊!在网上找了半天终于找到一个不错的解决办法!如下:
细看错误,都是一些函数重载错误,基本上是mpicxx.h文件导致的错误,于是想是否MPI_Init等函数与此文件有关。通过搜索包含文字,发现MPI_Init等函数只在mpi.h中定义,于是想办法不包含mpicxx.h文件以避开问题。在mpi.h中发现代码:
#if !defined(MPICH_SKIP_MPICXX)
#include "mpicxx.h"
#endif
在程序中定义宏MPICH_SKIP_MPICXX,然后重新编译程序(注意在包含mpi.h前定义)果然避开了mpicxx.h文件,OK!

运行结果如下:


终于尝到了一点甜头,然后就写一个计算PI的并行程序:

#define MPICH_SKIP_MPICXX
#include "mpi.h"
#include <stdio.h>

double f( double a ) { return (4.0 / (1.0 + a*a)); }

int main( int argc, char *argv[])
{
	int n, myid, numprocs, i, namelen;
	double PI25DT = 3.141592653589793238462643;
	double mypi, pi, h, sum, x;
	double startwtime, endwtime;
	char processor_name[MPI_MAX_PROCESSOR_NAME];
	
	MPI_Init(&argc,&argv);
	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	MPI_Get_processor_name(processor_name,&namelen);
	fprintf(stderr,"Process %d on %s\n", myid, processor_name);
	if (myid == 0) 
	{
		n=10000;
		startwtime = MPI_Wtime();
	}
	
	MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
	
	h = 1.0 / (double) n;
	sum = 0.0;
	for (i = myid; i < n; i += numprocs) 
	{
		x = h * ((double)i + 0.5);
		sum += f(x);
	}
	mypi = h * sum;
	
	MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
	
	if (myid == 0) 
	{
		endwtime = MPI_Wtime();
		printf("pi is approximately %.16f, error is %.16f\n", pi, pi - PI25DT);
		printf("wall clock time = %f\n", endwtime-startwtime);
	}
	MPI_Finalize();
	return 0;
}
编译没有错误,但是链接时又出现了如下图所示错误:


进入各种抓狂状态,在网上找了半天,要将MPICH的include和lib加入VC6.0,是啊!我不是都已经加了吗?最后在网上找到了一个在Visual Studio 2005里面的配置MPICH的博客,相关内容如下:

新建一个空白“Windows控制台应用程序”项目,假设命名为FFT,在“项目”菜单中选择“FFT属性”,在弹出对话框中依次开左侧树型列表的“配置属性”、“链接器”、“输入”,在“附加依赖项”一栏输入:mpi.lib。选择“配置”下拉列表中的release选项,同样将mpi.lib添加上去。(也可以使用#pragma预处理指令:#pragmacomment(lib,"mpi.lib") )

在VC6.0中找连接器找半天没有找到,所以就试了一下#pragma comment(lib,"mpi.lib")

其实上面那个Hello World的程序中已经有这句话了,只是那个Hello World是我在网上粘贴的一段,就没有意识到那个问题!

#define MPICH_SKIP_MPICXX
#include "mpi.h"
#include <stdio.h>

#pragma comment (lib, "mpi.lib")////////////////////这句话很重要

double f( double a ) { return (4.0 / (1.0 + a*a)); }

int main( int argc, char *argv[])
{
	int n, myid, numprocs, i, namelen;
	double PI25DT = 3.141592653589793238462643;
	double mypi, pi, h, sum, x;
	double startwtime, endwtime;
	char processor_name[MPI_MAX_PROCESSOR_NAME];
	
	MPI_Init(&argc,&argv);
	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	MPI_Get_processor_name(processor_name,&namelen);
	fprintf(stderr,"Process %d on %s\n", myid, processor_name);
	if (myid == 0) 
	{
		n=10000;
		startwtime = MPI_Wtime();
	}
	
	MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
	
	h = 1.0 / (double) n;
	sum = 0.0;
	for (i = myid; i < n; i += numprocs) 
	{
		x = h * ((double)i + 0.5);
		sum += f(x);
	}
	mypi = h * sum;
	
	MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
	
	if (myid == 0) 
	{
		endwtime = MPI_Wtime();
		printf("pi is approximately %.16f, error is %.16f\n", pi, pi - PI25DT);
		printf("wall clock time = %f\n", endwtime-startwtime);
	}
	MPI_Finalize();
	return 0;
}
编译运行通过,结果如下:


小功告成!乘着中秋国庆去北京咯!




分享到:
评论

相关推荐

    并行环境MPI的搭建与使用

    在Windows环境下搭建MPI并行计算环境,你需要确保所有参与计算的主机位于同一局域网内,能够相互访问。首先,你需要以管理员权限登录每台主机,并下载安装MPICH。安装完成后,确保MPI库能够在所有主机上正确运行。 ...

    Windows系统下搭建MPI境

    在Windows系统下搭建MPI环境是一项涉及并行计算技术的关键步骤,尤其对于那些希望在非Linux环境下进行高效并行计算的开发者来说尤为重要。MPI,即Message Passing Interface(消息传递接口),是一种标准化的通信...

    Win7系统下intel visual2012 IVF的安装及mpi并行配置.pdf

    在Windows环境下,可以通过命令行工具cmd.exe来检查smpd(Simple MPI Daemon)的安装状态,它是MPI并行计算环境中的一个关键组件。安装成功后,需要进行简单的测试来验证环境是否搭建成功。 配置IVF以使用MPI时,...

    Windows系统下搭建MPI.pdf

    在Windows环境下搭建MPI环境对于希望在非Linux系统上进行并行计算的开发者来说尤为重要。 本文主要介绍如何在Windows XP系统下使用Visual C++ 6.0(以下简称VC6)构建MPI开发环境,并通过一个简单的例子演示其基本...

    windows下并行环境的搭建

    本文详细介绍了如何在Windows环境下构建并行计算环境,重点在于使用VMware Workstation创建虚拟机以及安装和配置MPICH2的过程。通过这种方式,即使是在资源有限的情况下,也能有效实现并行计算任务。此外,本文还...

    MPI的环境搭建C++编程

    MPI,全称Message Passing Interface,是一种标准通信库,用于编写并行计算程序,特别是在分布式内存系统中。它提供了一组丰富的接口,支持多种进程间通信模式,使得程序员可以方便地实现并行计算。 **一、MPI简介*...

    MPI环境搭建完美集合

    MPI环境的搭建是进行并行计算程序开发的基础,对于初学者来说,可能会遇到许多挑战。以下是一个详尽的MPI环境搭建教程,旨在帮助你快速、顺利地构建MPI开发环境。 首先,我们需要理解MPI的基本概念。MPI提供了一组...

    LINUX系统下PC机局域网并行计算环境的实现与测试.pdf

    本文主要探讨了在Linux系统下,如何在PC机局域网环境中实现并行计算,并对其进行测试验证。 首先,文章针对计算流体力学(CFD)技术对计算资源的需求日益增长的问题,提出了一种基于PC机局域网的并行计算解决方案。...

    64位MPICH2+64位Win7+VS2013并行计算环境的搭建

    为了搭建基于64位MPICH2、64位Windows 7和Visual Studio 2013的并行计算环境,需要满足以下软硬件条件: 1. **硬件需求**: - CPU:至少四核心。 - 内存:至少4GB。 - 硬盘:至少320GB。 - 设备类型:推荐使用...

    在windows下运行MPI配置

    在Windows环境下搭建MPI环境,对于初学者来说是一个很好的实践平台。本文将详细介绍如何在Windows系统中配置和使用MPICH2来实现本地模拟集群。 #### 二、MPICH2的安装与配置 ##### 1. 安装MPICH2 - **安装路径**:...

    MPI并行程序设计初步.ppt

    MPI并行程序设计初步 MPI(Message Passing Interface)是一种常用的并行编程模型,广泛应用于高性能计算领域。MPI程序的运行机制是将同一个程序拷贝N份,给每个进程一份。MPI提供了六个基本库函数,分别是MPI_Init...

    在win7中利用VS2015配置MPI运行FORTRAN

    Microsoft MPI (MS-MPI) 是一个高性能消息传递库,用于在Windows平台上实现分布式内存并行计算。可以从Microsoft官方网站下载MS-MPI SDK和安装程序: - **下载地址**:...

    关文聪 2016060601008 分布式并行计算-MPI实验报告1

    实验环境是Windows 10 x64系统,使用Microsoft MPI(MSMPI)和MinGW-W64 gcc版本8.1.0。 实验内容涵盖了MPI环境配置,基础版埃拉托斯特宁筛法的实现和性能测试,以及根据优化思路改进并行效率。实验器材主要包括C/...

    windows下配置mpi[归纳].pdf

    - 通过详细的安装和配置步骤,可以有效地在 Windows 系统上搭建起并行编程环境。 - 对于开发者来说,掌握 MPICH 的安装和配置流程是进行高效并行编程的关键。 以上是对“Windows 下配置 MPI”的全面总结,涵盖了从 ...

    并行计算课程设计(报告+代码+可执行文件)

    在搭建MPI并行程序这块,学习的知识尤为增加,这些都是在不断的摸索、学习中学会的。 这次的大作业虽然是对以前实验的整合,但它加深了我对并行计算的印象,也使我对并行计算知识的理解更加深刻,也使我认识到了自己...

    基于MPI的层状地层并行可视化技术

    在本研究中,通过利用多台PC机搭建的Windows2000操作系统下的并行计算环境,研究人员实现了对层状地层数据的并行处理和可视化。 具体而言,通过将大型数据集分割成若干子集,并分配给不同的计算节点进行独立处理,...

    并行计算课程设计(代码+执行文件+文档)

    在搭建MPI并行程序这块,学习的知识尤为增加,这些都是在不断的摸索、学习中学会的。 这次的大作业虽然是对以前实验的整合,但它加深了我对并行计算的印象,也使我对并行计算知识的理解更加深刻,也使我认识到了自己...

    基于MPI实现埃拉托斯特尼筛法及性能优化实验报告.docx

    1. **MPI环境配置**: 在不同的操作系统环境下(如Windows和Linux)配置MPI开发环境。 2. **基础MPI版本埃拉托斯特尼筛法实现** (`sieve1`): 使用MPI编程实现埃拉托斯特尼筛法的基础版本,并通过实测数据绘制加速比...

Global site tag (gtag.js) - Google Analytics