集群系统与并行计算实验指导书.docx
- 文档编号:27631139
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:29
- 大小:957.93KB
集群系统与并行计算实验指导书.docx
《集群系统与并行计算实验指导书.docx》由会员分享,可在线阅读,更多相关《集群系统与并行计算实验指导书.docx(29页珍藏版)》请在冰豆网上搜索。
集群系统与并行计算实验指导书
《集群系统与并行计算》
实验指导书
计算机科学学院
广东技术师范学院计算机学院编
20131年3月
目录
实验一:
建立并行计算平台
实验二:
并行程序设计
实验三:
提高结点的运算能力
《集群系统与并行计算》实验根据实验室环境,学生的实际情况,可以有选择地进行。
本实验系列涵盖计算机网络的基本知识,加深学生对集群系统与并行计算理论的理解,对实际的并行计算有指导意义。
教师可以根据实际情况掌握评分。
在《集群系统与并行计算》实验过程中,要求学生做到:
(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。
(2)仔细观察上机和上机操作时出现的各种现象,记录主要情况,作出必要说明和分析。
(3)认真书写实验报告。
实验报告包括实验目的和要求,实验情况及其分析。
对需编程的实验,写出程序设计说明,给出源程序框图和清单。
(4)遵守机房纪律,服从指导教师指挥,爱护实验设备。
(5)实验课程不迟到,不早退。
如有事不能出席,需要向指导教师请假,所缺实验一般不补。
实验的验收将分为两个部分。
第一部分是上机操作,包括检查程序运行和即时提问。
第二部分是提交书面的实验报告。
实验将采用阶段检查方式,每个实验都将应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。
以避免集中检查方式产生的诸多不良问题,希望同学们抓紧时间,合理安排,认真完成。
实验一:
建立并行计算平台
参考安竹林的文章:
MPICH并行程序设计环境
安竹林
[摘要]MPI(MessagePassingInterface)是目前一种比较著名的应用于并行环境的消息传递标准。
MPICH是MPI1.2标准的一个完全实现,也是应用范围最广的一种并行及分布式环境。
MPICH除包含MPI函数库之外,还包含了一套程序设计以及运行环境。
本文将简要介绍如何应用MPICH的Windows版本,建立一个基于Windows的并行程序设计及运行环境。
并给出一个C+MPI程序设计实例。
MPICHforMicrosoftWindows的安装与配置
1.1系统要求
安装MPICHforMicrosoftWindows对系统有如下要求:
⍓WindowsNT4/2000/XP的Professional或Server版(不支持Windows95/98)
⍓所有主机必须能够建立TCP/IP连接
MPICH支持的编译器有:
MSVC++6.x,MSVC++.NET,CompaqVisualFortran6.x,IntelFortran,gcc,以及g77。
安装MPICH,必须以管理员的身份登录。
1.2下载
MPICH的下载地址是:
http:
//www-unix.mcs.anl.gov/mpi/mpich/download.htmlWindows版本的mpich.nt.1.2.5.exe的下载地址是:
http:
//www-unix.mcs.anl.gov/~ashton/mpich.nt/
1.3安装
以管理员的身份登录每台主机,在所有主机上建立一个同样的账户(当然也可以每个机器使用不同的用户名和账户,然后建立一个配置文件,使用命令行的方式运行程序),然后,运行下载的安装文件,将MPICH安装到每台主机上。
打开“任务管理器”中的“进程”选项卡,查看是否有一个mpd.exe的进程。
如果有的话说明安装成功。
以后每次启动系统,该进程将自动运行。
1.4注册与配置
安装好MPICH之后还必须对每台计算机进行注册和配置才能使用。
其中注册必须每台计算机都要进行,配置只要在主控的计算机执行就行了。
注册的目的是,将先前在每台计算机上申请的账号与密码注册到MPICH中去,这样MPICH才能在网络环境中访问每台主机。
配置方法:
运行“mpich\mpd\bin\MPIRegister.exe”首先会提示输入用户账号,然后会提示输入两边密码,之后会问你是否保持上面的设定。
如果选择是,则上面的信息将写入硬盘,否则保存在内存中,再重新启动之后就不存在了。
图一MPIRegister
为了让程序在许多主机上执行,而不需建立配置文件来给出相应的各个主机的信息,主控机必须直到当前可用的主机的信息。
这时就需要运行MPICH的配置程序来进行配置了。
MPICH提供的配置程序是一个图形界面的程序,可以从“开始->程序->MPICH->mpd->MPICHConfigurationtool”启动。
启动之后的界面如下图所示:
图二MPICHConfigurationtool整个界面分为三栏,在第一栏中点击Select(1号按钮),然后在跳出的对话框中选择安装了MPICH的主机名。
之后在第一栏的编辑框中会显示出所有选择的主机。
检查无误后,点击第二栏的Apply(2号按钮),这时下方的进度条会显示对各主机核查的情况,如果没问题整个进度条会变为蓝色。
最后点击OK(3号按钮)。
整个配置就完成了。
1.5MPICH与编译环境的整合
MPICH提供了C语言和Fortran语言的接口。
要编译一个MPI+C或MPI+Fortran的程序必须对编译器进行设置。
下面分别对VisualC++6.0、CompaqVisualFortran6.5、和VisualFortran
5.0进行说明。
1.5.1VisualC++6.0
在VisualC++6中编译一个MPI+C的程序的步骤如下:
Page2of15
11.打开VisualC++6的DevelopStudio。
22.新建一个工程,通常为Win32ConsoleApplication。
33.在新的工程的编辑界面下,按Alt+F7打开工程设置对话框。
图三VisualC++设置
(1)
图四VisualC++设置
(2)
4.切换到C/C++选项卡。
(如图三)首先选择“Win32Debug”(①的下拉框),再选择“CodeGeneration”(②的下拉框),再选择“DebugMultithreaded”(③的下拉框)。
这时在“ProjectOptions”的文本框中显示“/MT”表示设置成功。
然后选择“Win32
Release”(①的下拉框)重复上述步骤。
(图四)
5.在C/C++选项卡中,选择“AllConfigurations”。
(①的下拉框)选择“Preprocessor”(②的下拉框),在“Additionalincludedirectories”的文本框中输入MPICH所附带的头文件的目录。
(如图五)
图五VisualC++设置(3)
16.在Link选项卡中,选择“AllConfigurations”。
(①的下拉框)然后再选择“Input”(②的下拉框),在“Additionallibrarypath”的文本框中输入MPICH所附带的库文件的目录。
(如图六)
27.在Link选项卡中,选择“AllConfigurations”。
(①的下拉框)然后再选择“General”然后在(③)
图六VisualC++设置(4)
(②的下拉框),“Object/librarymodules”的文本框中添加“ws2_32.lib”。
点击“OK”。
这时在“CommonOptions”(④)中会出现“ws2_32.lib”。
(如图七)
图七VisualC++设置(5)
18.在Link选项卡中,选择“Win32Debug”。
(①的下拉框)然后再选择“General”(②的下拉框),然后在“Object/librarymodules”(③)的文本框中添加“mpichd.lib”。
点击“OK”。
这时在“ProjectOptions”(④)中会出现“mpichd.lib”。
(如图八)
29.在Link选项卡中,选择“Win32Release”。
(①的下拉框)然后再选择“General”(②的下拉框),然后在“Object/librarymodules”(③)的文本框中添加“mpich.lib”。
点击“OK”。
这时在“ProjectOptions”(④)中会出现“mpich.lib”。
(如图九)
图八VisualC++设置(6)
图九VisualC++设置(7)
10.关闭工程设置对话框。
1.5.2CompaqVisualFortran6.5
CompaqVisualFortran6.5的DevelopStudio跟VisualC++6.0基本一致,所以设置方法也大致相同,在这里不再重复了。
1.5.3VisualFortran5.0
MPICH手册中并没有提到支持VisualFortran5.0。
这时因为VisualFortran5.0所附带的Link.exe是MicrosoftDevelopStudio97里的版本(5.00.7022),如果在VisualFortran5.0中直接编译MPI程序会提示如下错误:
解决方法是:
用新版的Link.exe来代替。
如果有VisualC++6.0以上版本的话可以把新版的Link.exe复制到\DevStudio\VC\BIN中覆盖原来的Link.exe。
如果没有VisualC++6.0,则可以到Microsoft的网站下载WindowsDDK,其中所包含的Microsoft的免费汇编器MASM,其中的Link.exe也可以用来作代替。
修正了Link.exe的版本错误之后,就可以用VisualFortran5.0来编译MPI+Fortran程序了。
由于VisualFortran5.0的DevelopStudio跟VisualC++6.0的有所不同,所以不能使用上述的方法来
Page6of15
设置。
由于对于Fortran程序来说,MPI可以看作一个库,所以只要建立一个工程,并把MPICH所附带的头文件和库文件添加到工程就可以编译了。
具体方法是:
在菜单中选择“Project->Addtoproject->Files…”然后在跳出的对话框选择MPI的头文件和库文件。
(图十)
图十在VisualFortran5.0中添加头文件和库文件
1.6样例程序的运行
在“MPICH\SDK\Examples\nt\Basic”有一个简单的计算π的程序,在VC下编译成可执行程序就可应用来测试并行环境。
在MPICH中运行并行程序有两种方式:
命令行方式和图形方式。
命令行方式可以使用配置文件,功能比较强,但操作复杂易出错。
图形方式简单明了,下面以图形方式说明如何运行一个测试程序来测试并行环境。
在运行一个程序之前,首先要做的事是将待运行的目标程序复制到所有的主机的相同目
图十一MPIRun录下,运行程序的步骤如下:
从“开始->程序->MPICH->mpd->MPIRun”启动图形方式的Page7of15
MPI环境。
(如上图所示)首先,选择待运行的程序,点击右上角的“..”按钮,选择相应的程序;然后选择需要用于计算的主机个数,指定参加运算的主机名;最后点击Run,运行程序。
运行的结果会显示在文本框,不同主机的输出信息会以不同的颜色标出。
3.4如何使用MPI并行化一个已存在的串行程序
串行程序并行化的关键是:
发掘串行程序中的并行成分,合理的分配任务。
其程序结构跟上述的直接构造并行程序类似。
构造方法大致为:
在原来的程序中添加MPI初始化以及终止的调用;明晰串行部分和并行部分的接口关系,尽量简化接口的数据量;在两个接口部分分别编写任务分配和数据收集的代码;最后,寻找程序结构中可以进行优化的部分,提高程序运行的效率。
FAQ
⍓Q:
MPICH有Windows和Linux的版本,那么可以同时在两个环境下运行一个程序吗?
A:
不行。
同一个MPI程序可以分别在Windows和Linux环境下编译和运行,但却不能同时运行。
这是因为MPICH确立和管理主机间的Socket连接的代码是不兼容的。
⍓Q:
为什么得到错误信息“UnhandledexceptioncaughtinRedirectIOThread”?
A:
这是由于向标准输出(屏幕)打印了过多的信息而造成的。
由于在运行MPIRun的时候,所有主机的信息全部输出在0号进程所在的主机的屏幕上,如果每个程序输出了过多的信息,这就会造成上述错误。
解决方法是,减少不必要的调试信息的输出。
⍓Q:
为什么得到错误信息“MPI_RECV:
Messagetruncated”?
A:
这是由于MPI_RECV的接收缓冲区比对应的MPI_SEND的发送缓冲区小造成的,解决办法是,调整MPI_RECV的接收缓冲区尺寸,使其与发送缓冲区的尺寸一致。
⍓Q:
为什么得到错误信息“Error64–GetQueuedCompletenessStatusfailed”?
A:
通常这是由于MPI_RECV与MPI_SEND不匹配造成的。
解决方法是,检查每个MPI_RECV是否都有相应的MPI_SEND与之匹配。
如果都匹配,再查看是否有进程非正常终止。
⍓Q:
为什么得到错误信息“Failedtolaunchtherootprocess:
c:
\cpi.exeLaunchProcess
Failed,登陆失败:
未知的用户名或错误的密码”
A:
这是由于某台运行程序的主机,没有运行MPIRegister进行注册,或者注册的用户名或密码不一致。
实验二:
并行程序设计
要求附有实验数据和源程序。
1.编写一个计算矩阵乘积的并行程序。
统计采用不同优化选项编译该程序生成的代码的运行时间,根据程序的计算量和运行时间计算出程序的实际浮点性能(以MFLOPS为单位)和效率(实际性能/处理器峰值性能),并将结果填写在下表中(根据需要加行)。
提示:
用“time程序名”可以得到程序的运行时间。
优化选项
运行时间/s
性能/MFLOPS
效率/%
程序代码可以参考AxB.f(FORTRAN算法思想)
cg77-oaxbAxB.f
PARAMETER(N=1024)
REAL*8A(N,N),B(N,N),C(N,N)
DOJ=1,N
DOI=1,N
A(I,J)=1.D0
B(I,J)=1.D0
C(I,J)=0.D0
ENDDO
ENDDO
DOJ=1,N
DOK=1,N
DOI=1,N
C(I,J)=C(I,J)+A(I,K)*B(K,J)
ENDDO
ENDDO
ENDDO
STOP
END
2.改变上述并行程序中三重循环的顺序,统计不同循环顺序的运行时间,性能及效率,将结果填写在下表中。
循环顺序
运行时间/s
性能/MFLOPS
效率/%
I,J,K
I,K,J
J,K,I
J,I,K
K,I,J
K,J,I
3.用MPI_Isend和MPI_Irecv代替代码deadlock.c中的MPI_send和MPI_recv来避免出现程序死锁。
程序代码deadlock.c参考如下
#include
#include
#include"mpi.h"
#defineSIZE16
int
main(intargc,char**argv)
{
staticintbuf1[SIZE],buf2[SIZE];
intnprocs,rank,tag,src,dst;
MPI_Statusstatus;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);/*获取总进程数*/
MPI_Comm_rank(MPI_COMM_WORLD,&rank);/*获取本进程的进程号*/
/*初始化buf1*/
memset(buf1,1,SIZE);
tag=123;
dst=(rank>=nprocs-1)?
0:
rank+1;
src=(rank==0)?
nprocs-1:
rank-1;
MPI_Send(buf1,SIZE,MPI_INT,dst,tag,MPI_COMM_WORLD);
MPI_Recv(buf2,SIZE,MPI_INT,src,tag,MPI_COMM_WORLD,&status);
MPI_Finalize();
return0;
}
4.修改代码cpi.c,将任务分配改为按块分配:
假设共有P个进程,将n个计算间顺序分成P块,每个进程负责一块的计算,注意当n不是P的倍数时应该尽量保持负载平衡。
程序代码cpi.c参考如下:
#include"mpi.h"
#include
doublef(doublea){return(4.0/(1.0+a*a));}
intmain(intargc,char*argv[])
{
intn,myid,numprocs,i,namelen;
doublePI25DT=3.141592653589793238462643;
doublemypi,pi,h,sum,x;
doublestartwtime,endwtime;
charprocessor_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);
fprintf(stderr,"Process%don%s\n",myid,processor_name);
if(myid==0){
n=10000;
startwtime=MPI_Wtime();
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
h=1.0/(double)n;
sum=0.0;
for(i=myid;i 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){ endwtime=MPI_Wtime(); printf("piisapproximately%.16f,erroris%.16f\n",pi,pi-PI25DT); printf("wallclocktime=%f\n",endwtime-startwtime); } MPI_Finalize(); return0; } 5.测试conflicts.f程序的运行时间,然后将REAL*8A(N,N)改成REAL*8A(N+1,N),比较修改前后运行时间的差异。 程序代码conflicts.f参考如下: cg77-oconflictsconflicts.f PARAMETER(N=2048) REAL*8A(N,N) DOK=1,100 DOI=1,N DOJ=1,N A(I,J)=1.D0 ENDDO ENDDO ENDDO STOP END 实验三: 提高结点的运算能力 本实验通过使用gcc和icc两种编译器对同一个源程序编译后的运行的时间比较,以及使用SSE2(StreamingSIMDExtensions,单指令多数据流扩展)指令集和Hyper-ThreadingTechnology(超线程技术)后运行时间的比较。 理解编译器、SSE2(StreamingSIMDExtensions,单指令多数据流扩展)指令集和Hyper-ThreadingTechnology(超线程技术)对提高结点的运算能力的重要性。 实验内容 1、gcc和icc两种编译器的比较 源程序如下: #include #include intmain(argc,argv) intargc; char*argv[]; { intn=500000; floatp[200]; /*charp[200]; intp[200]; doublep[200]; */ inti,j,k; FILE*fp; clock_tstart,finish; doubleduration,loop_calc; start=clock(); for(i=1;i for(j=1;j<1000;j++){ for(k=0;k<200;k++)p[k]=p[k]+1.0; /*for(k=1;k<200;k++)p[k]=p[k]+1; for(k=1;k<200;k++)p[k]=p[k]+1; for(k=1;k<200;k++)p[k]=p[k]+1.0; */ } }; finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC; printf("\n%2.3fseconds\n",duration); fp=fopen("testtime","a"); fprintf(fp,"time=%ffile=%s\n",duration,argv[0]); fclose(fp); } 修改以上程序分别产生四个文件分别是对单精度、字符、整数、双精度类型的数组进行运算,然后用两种编译器编译,并运行执行文件,比较运行时间。 例如(编译命令): gcc–ofloatfloat.c icc-O2-oiccfloatfloat.c 2、使用sse2指令集(icc编译器中使用sse2指令集后的变化) 对上面用icc编译的程序使用带sse2指令集的参数编译,然后用两种编译器编译,并运行执行文件,比较运行时间。 例如(编译命令): icc-O2-xW
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集群 系统 并行 计算 实验 指导书