MPI(Message Passing Interface),消息传递编程接口,是全球工业、科研和政府部联合建立的一个消息传递编程标准。是目前最为通用的并行编程方式。MPI标准中定了一 组函数接口,用于进程间的消息传递。函数的具体实现由各计算机厂商来完成,然这些都是要付费的;也有一些免费的通用MPI系统,比较著名的就是 MPICH(http://www.mcs.anl.gov/research/projects/mpich2/)和LAM MPI(http://www.lam-pi.org)。
这里使用的MPI lib的下载地址:http://www-unix.mcs.anl.gov/mpi/
并行程序的运行,需要有MPI的运行环境。而PICH几乎支持所有的Linux/Unix和Windows,可以在单台PC或工作站上模拟MPI并行程,也可以在SMP系统或者机群环境上建立实用的并行计算环境。
这里将在2台双核的PC上,构成的一个机群行计算环境。
软硬件准备
硬件: 2台普通PC,当然硬盘和内存越大越好,我是用的是80G的硬盘,1G的内存。
软件:
- Microsoft .NET Framework 2.0:每个节点必须的环境;
- mpich2-1.0.6p1-win32-ia32.msi:MPICH2安装程序,可到http://www.mcs.anl.gov/research/projects/mpich2/的Downloads中下载。
环境搭建
在每台机器上均安装上Microsoft .NET Framework2.0和MPICH2。MPICH2的默认安装路在C:/Program Files/MPICH2,将MPICH2/bin加入系统环境变量的Path中。
每个节点中新建一个用户,该用户应该具有管理员权限,隶属Administrators组。
在每个节点新建相同的目录,来存放并行程序,该目录都应该在相同的位置。比如C:/MPIAPP。
单机测试
首先需要注册一个用户,运行MPICH2的wmpiregister.exe,在开始->所有成程序-MPICH2中可以找到。将上一步中的用户名和密码在这里进行注册即可。
后可以采用MPICH2提供的GUI界面进行测试,可以在在开始->所有成程序->MPICH2中到wmpiexec.exe;在MPICH2的examples下有个测试程序cpi.exe,选择后执行即可。
可以到命令行方式执行命令:mpiexec -n 2 C:/Program Files/MPICH2examples/cpi.exe即可。命令中-n是参数,后面的2表示有两个节点并行计算。
联机测试
这里将在具有2个节点的PC集群上测试。首先将Console Test.exe程序拷贝到每个节点的C:/MPIAPP目录中,然后执行命令(要求两台机器上注册证户名和密码相同的MPICH2用户 ,第一次运行要有耐心等一下):
mpiexec -hosts 2 133.133.133.84 133.133.133.95 “C:/MPIAPP/Console Test.exe”
注意:在联机测试时将XP的防火墙关闭。
也可以用MPICH2自带的界面方式运行,选择“more option”打开下拉对话框,可以设置主机,空格分隔。
与VC++ 6.0集成开发环境
有了MPI的运行环境后,还需要一个MPI的开发环境。MPICH2可以和VC开发环境集成,集的方法很简单,将MPICH2的Include和 lib添加到VC的Directories的Include files和ibary files中即可。同时在Project Settings中将mpi.lib添加到Object/library modules中,然后就可以采用VC++ 6.0开发MPI的并行程序了。
Console Test程序如下:
# include
# include
# include
#define MPICH_SKIP_MPICXX //这句一定要有,否则 错
#include “mpi.h”
void main(int argc, char *argv[] )
{
int my_id, num_procs;
double wtime_start, wtime_end, wtime_interval;
int n = 100000000000;
double sum = 0.0;
MPI_Init ( &argc, &argv );
MPI_Comm_size ( MPI_COMM_WORLD, &num_procs );
MPI_Comm_rank ( MPI_COMM_WORLD, &my_id );
if ( my_id == 0 )
{
sum = 0.0;
wtime_start = MPI_Wtime ( );
}
double sum0 = 0.0;
int begin = my_id * n / num_procs;
int end = (my_id + 1) * n / num_procs;
for(int i = begin; i sum0 += i;
printf ( “/nNow porcessor%d is running, Totally %d processors/n”, my_id, num_procs );
// MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(&sum0 , &sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if ( my_id == 0 )
{
wtime_end = MPI_Wtime ( );
wtime_interval = wtime_end – wtime_start;
printf ( ” Elapsed wall clock seconds = %f/n”,
wtime_interval );
}
// MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize ( );
}
运行脚本:
mpiexec -hosts 2 133.133.133.84 133.133.133.95 “C:/MPIAPP/Console Test.exe”
pause
mpiexec -hosts 4 133.133.133.84 133.133.133.84 133.133.133.84 133.133.133.95 “C:/MPIAPP/Console Test.exe”
pause
联机运行结果:
-2 6.674519s
-4 3.052571s
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!