Labyrinth分享 http://blog.sciencenet.cn/u/majian 致力于行人交通及疏散动力学研究

博文

win7+vs2010+MPICH2

已有 24778 次阅读 2011-11-11 07:57 |个人分类:技术|系统分类:科研笔记| MPICH2, win7, VS2010

64位的win7上安装软件,怎么装都麻烦

花了半天多加一个晚上解决了win7 64+vs2010+MPICH2的安装问题

因为计算量很大,我们想做一个并行计算,找了台机器是8核的,64位的win7,在安装MPICH2的时候出现了问题,后来发现win7中安装软件都需要管理员权限,而在安装MPICH2的时候需要始终以同一个用户以管理员的身份安装。否则, mpiexec在具体执行的时候,会出现要求要求管理员权限的错误。

MPICH2可以从网站上下载:

http://www.mcs.anl.gov/research/projects/mpich2/

这里实际上提供了2个版本的下载,一个是普通的32位的,一个是支持64位的。

最早我们选了下载64位的安装,因为机器和系统都是64位的,所以没多想。不过后来问题就出在这里,无论怎么调试,怎么设置,始终不对,后来终于在一个英文的论坛的纸堆里找到一个人说要装32位的,然后我们下载了32位的安装,配置,一切搞定,郁闷个半死啊。

注意到另外一个问题,两台一样的机器,一台装得时候smpd是自动安装的,另外一台win7下smpd.exe这个组件没有自动运行安装,需要你在管理员的账户下运行,进行安装注册。方法就是:以管理员身份运行cmd,改变路径到到MPICH2的路径下找bin,进入之后,smpd -install -phrase pwd;

后面具体的配置过程在网上可以找到,记录一下:

1)然后用VS创建一个C++的Win32控制台空项目,加入你的资源文件。
2)打开项目属性对话框。
3)进入配置属性
1>配置为Debug和Release的时候,“C/C++”选项卡里面的“代码生成”选项卡,选择“运行时库”为“多线程(/MT)”;
2>配置为所有配置的时候,“C/C++”选项卡里面的“常规”选项卡,为“附加包含目录”加入目录“C:Program FilesMPICH2Include”;
3>配置为所有配置的时候,“链接器”选项卡里面的“常规”选项卡,为“附加库目录”加入目录“C:Program FilesMPICH2Lib”;
4>配置为所有配置的时候,“链接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“mpi.lib,fmpich2.lib”。
5>配置为Debug的时候,“链接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“cxxd.lib”;
6>配置为Release的时候,“链接器”选项卡里面的“命令行”选项卡,为“附加选项”加入“cxx.lib”。
7>上面库文件中mpi.lib是用于C语言库,cxx.lib是用于C++语言库(cxxd.lib是debug版本),fmpich2.lib是用于Fortran语言库,可根据使用情况相应增减。
8>进入常规->(项目默认值)MFC的使用,右边选择->在静态库中使用 MFC,可使生成的.exe文件拷贝到其它电脑也能单独运行。
4)配置完成,可以编译并运行你的并行程序了。

这个过程在官网上也有说明:

http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.3.2-windevguide.pdf

不过需要注意的事,这些IDE都是比较早得版本,和我们用vs2010不太一样,但是设置的东西都一样,位置变了而已。

最后,由于mpiexec执行是通过port进行线程间交换数据的,所以如果遇到问题,还要注意配置防火墙配置。除了一些第三方防火墙,比如360防火墙要设置外,也不要设置windows自身带的防火墙。如果不会设置,最简单的方法就是将防火墙统统关闭。在不使用mpiexec的时候再打开防火墙。

附上网上找的一个简单的测试代码:

#include "mpi.h"
#include <cstdio>
#include <math.h>

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(MPI_COMM_WORLD,&myid);/**//*得到当前进程号*/
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);/**//*得到总的进程数*/
MPI_Get_processor_name(processor_name,&namelen);/**//*得到机器名*/

fprintf(stderr," Process %d of %d SAY HELLO TO MPI on %sn",
myid, numprocs, processor_name);

MPI_Finalize();/**//*结束*/
return 0;

}



https://blog.sciencenet.cn/blog-5422-506796.html

上一篇:MATLAB从图像采集卡读数据
下一篇:圣诞节
收藏 IP: 144.214.29.*| 热度|

2 黄富强 phidiot

该博文允许注册用户评论 请点击登录 评论 (4 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 01:15

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部