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) 双方的计算机中都关闭了防火墙,并可以通过网上邻居相互读写各自的共享资源。
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();
}