实验六:两机运行实验三和实验四
一.目的:
体会在集群中的并行计算操作方法
二.内容:
实现两台机器的并行计算
三.步骤:
1.在两台机器上安装相同的mpich2,参见实验一
2.将两台机器的注册账号和密码置成相同
3.将两台机器的ip改为同一网关(即前24位相同)(即在一局域网里),否则无法联机,如图,本次实验机器两ip为10.11.74.104,10.11.74.105
4.计算机工作组改成同一个
5.参见实验三实验四编译运行源代码,得到.exe程序
6.将所要执行的exe文件放置在两台机器上同一个位置(同一个路径下的文件夹下),如图所示放在MyProjects\helloword\Debug下
7.命令行模式下进入.exe程序所在的文件夹,输入如图的命令:mpiexec -hosts 2 10.11.74.104 10.11.74.105 helloworld.exe 其中:-hosts表示主机,2代表两台,后面为两台主机的ip,cpi.exe同样如此
Gui方式:
打开bin文件夹下的wmpiconfig
(1)在domain上选择集群分组
(2)点击get hosts获得同一组上的集群
(3)记录绿色机器的机器名
(4)打开wmpiexec
①勾选more options
②在hosts一栏上写下之前记录的主机名
③执行.exe程序,参见实验二
配置文件方式:新建一个txt文件,在里面输入-n n1 -host host1 .exe路径
-n n2 -host host2 .exe路径
n1,n2表示进程数,host1,host2表示主机名,可以是主机名也可以是ip
然后cmd,找到.txt路径,输入mpiexec -configfile .txt命令执行
四.程序:
Cpi:
#include “mpi.h”
#include <stdio.h>
#include <math.h>
double f(double);
double f(double a)
{
return (4.0 / (1.0 + a*a));
}
int main(int argc,char *argv[])
{
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
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);
while (!done) {
if (myid == 0) {
fprintf(stdout, “Enter the number of intervals: (0 quits) “);
fflush(stdout);
if (scanf_s(”%d”,&n) != 1) {
fprintf( stdout, “No number entered; quitting\n” );
n = 0;
}
startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (n == 0)
done = 1;
else {
h = 1.0 / (double) n;
sum = 0.0;
for (i = myid + 1; 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) {
printf("pi is approximately %.16f, Error is %.16f\n",
pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush( stdout );
}
}
}
MPI_Finalize();
return 0;
}
Helloworld:
#include “mpi.h”
#include
int main(int argc, char* argv[])
{
int rank;
int size;
MPI_Init(0, 0);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
std::cout << "Hello world from process " << rank << " of " << size << std::endl;
MPI_Finalize();
return 0;
}
五.结果:
命令行 直接写ip方式:
Gui方式:
配置文件方式:
六.分析与收获:
学会mpich2在集群上如何设置,知道要将集群网关设成一致形式,将集群放置在同一局域网,同一工作组中。
学会使用不同方式运行集群中的程序,推荐配置文件方式,这时只需要运行配置文件即可,其他方式每次启动都需要填写大量信息,过于繁琐。
理解体会并行计算在集群上的优势,集群越大,并行计算优势越明显。