MPICH并行编程环境的构建

1 MPICH2 在Windows XP下的安装与配置
 
1.1 系统环境
Windows XP + MS VC++6.0
 
1.2 下载与安装
首先,从http://www-unix.mcs.anl.gov/mpi/mpich2/index.htm#download 下载MPICH2的Win32IA32版本(mpich2-1.0.6-win32-ia32.msi)。以管理员的身份登录每台主机,在所有主机上建立一个同样的账户(andy),密码(andy),运行下载的安装文件,提示需要安装Microsoft Visual C++ 2005 SP1 Redistributable Package (x86) Microsoft .NET Framework version 2.0 (x86) 作为支持,安装好这两个后便可以顺利在每台主机上安装MPICH2。(设安装目录为 D:/MPICH2 )
安装成功后,在“任务管理器”中可以查看到有一个smpd.exe的进程。也可以在资源管理器中看到MPICH2的目录层次:
   
1.3 配置环境变量
          将MPICH2的安装路径D:/MPICH2/bin添加到PATH中。每台机子的安装路径是相同的。
                            
1.4 注册与配置
对每台计算机进行注册,将先前在每台计算机上申请的账户和密码注册到MPICH中去,使MPICH能在网络环境中访问每台主机。运行MPICH2/bin目录下的wmpiregister.exe,在注册界面输入前面申请的账户名和密码,点Register保存设定以便mpiexec运行程序。
                          
然后运行MPICH2/bin目录下的wmpiexec.exe进行测试:
至此,在此主机上的MPICH环境搭建结束。
为了让程序在多台主机上执行,而不需建立配置文件来给出相应的各个主机的信息,主控机必须知道当前可用的主机的信息。这时就需要运行MPICH的配置程序来进行配置了。运行MPICH2/bin目录下的wmpiconfig.exe,配置所需要的联接的主机。运行界面如图所示:
在ANDY和CRAY两台机器上都安装注册了MPICH2,如果连接正常的话两台主机都是高亮显示的,但CRAY这台机器无法连接上,至今未能解决。还请哪位朋友指点。
局域网访问条件:
    1) 双方计算机打开,且设置了网络共享资源;
    2) 双方的计算机添加了 "Microsoft 网络文件和打印共享" 服务;
    3) 双方都正确设置了网内IP地址,在一个网段中,且在同一个工作组209中;
    4) 双方的计算机中都关闭了防火墙,并可以通过网上邻居相互读写各自的共享资源。
 
2 MPICH 与MS VC++6.0的整合
 
2.1 工程设置
要在Visual C++6.0中编译一个MPI+C的程序,需进行一定的设置,步骤如下:
a. 打开VC6,新建一个控制台应用程序。
(设工程名为 TestMPICH,放在路径“D:/MPICH2/”下)
b. 在编辑界面下,打开工程设置对话框。(Project Settings)
c. 选择C/C++标签页(如图一),先在左侧选择“Win32 Debug”,再在右侧Category栏选择“Code Generation”,Use run-time library栏选择“Debug Multithreaded”。然后再在左侧选择“Win32 Release”,重复上面的步骤。
(图一)
d. 继续在C/C++标签页下,在左侧选择“All Configurations”,再在右侧Category栏选择“Preprocessor”,在Additional include directories栏下写入MPICH2所附带的头文件的目录“D:/MPICH2/include”。(如图二)
( 图二)
e. 切换到Link标签页下,先在左侧选择“All Configurations”,然后再在右侧Category栏选择“Input”,在Additional library path 栏下写入MPICH2所附带的库文件的目录“D:/MPICH2/lib”。(如图三)
(图三)
f. Link 标签页下,左侧选择“All Configurations”,右侧Category栏选择“General”,然后在Object/library modules 框中添加“ws2_32’lib”。(如图四)
(图四)
g. Link 标签页下,左侧选择“Win32 Debug”,右侧Category栏选择“General”,然后在Object/library modules 框中添加“mpi.lib”。然后再在左侧选择“Win32 Release”,重复上面的步骤。(如图五)
(图五)
           h. 点击“OK”,结束工程设置。
2.2 编写代码和构建
     i. 添加代码文件,编写代码。将“D:/MPICH2/examples”路径下一个简单的计算∏的程序“icpi.c”添加到工程“TestMPICH”中。
     j. 编译并构建程序。
 
2.3 MPI 程序在单机上的执行
运行程序wmpiexec.exe,在“Application”项中选择构建好的MPI程序“D:/MPICH2/TestMPICH/Debug/TestMPICH.exe”,在“Number of”项中设定运行的进程数1,选中run in an separate window,点击Execute按钮执行程序,如下图所示:
2.4 测试多机环境下MPI程序的运行
2.4.1 对参与运行MPI程序的主机进行配置
      1. 在每台主机上共享一个同名的文件夹,将文件夹放置在同样的路径上。(设文件夹路径为“D:/MPICH2/TestMPICH”)
      2. 把MPI程序拷贝到各个共享的文件夹中。
 
2.4.2 在发起运行MPI程序的主机上执行程序wmpiexec.exe
在“Application”项中选择共享文件夹中的构建好的MPI程序“D:/MPICH2/TestMPICH/Debug/TestMPICH.exe”,在“Number of”项中设定运行的进程数2,选中run in an separate window,点击Execute按钮执行程序,如下图所示:
 
        由于在1.4 节中多机环境的配置时CRAY未能正常连接,因此这里出现错误,如下图:
 
    
3 MPI 基本编程
3.1 MPI +C的基本函数
 1 MPI 初始化
   int MPI_Init(int *argc, char ***argv)
 2 MPI 结束
   int MPI_Finalize(void)
 3 当前进程标识,如果有n个进程,进程的标识号从0到1..n
   int MPI_Comm_rank(MPI_Comm comm, int *rank)
 4 通信域包含的进程个数
   int MPI_Comm_size(MPI_Comm comm, int *SIZE)
 5 消息发送,将首地址为buf的count个数据类型为datatype的数据由当前进程发送给dest进程。
   int MPI_Send(void * buf, int count, MPI_Datatype Datatype, int dest, int tag, MPI_Comm comm)
 6 消息接收,从source进程接受count个数据类型为datatype的数据并保存到首地址为buf的内存空间中。
   int MPI_Recv(void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status * status)
 7 消息广播,将首地址为buf的count个数据类型为datatype的数据由root进程广播给指定通信域中的所有进程。
 int MPI_Bcast(void * buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
 8 收集,将通信域中各个进程中的数据收集到根进程root中。
   int MPI_Gather(void * sendbuf, int sendcount, MPI_Datatype, sendtype, void* recvbuf, int recvcount, MPI_Datatype Recvtype, int root, int comm)
 
3.2 MPI+C 并行程序基本流程
#include "mpi.h"
......
main()
{
   程序参数说明;
   MPI_Init();
   MPI_Comm_rank();
   MPI_Comm_size();
   ......
   应用程序实体
   1 计算控制程序体;
   2 进程间通信:MPI_Send();
                MPI_Recv();
   ......
   MPI_Finalize();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值