OpenMP+MPI混合并行编程.doc_第1页
OpenMP+MPI混合并行编程.doc_第2页
OpenMP+MPI混合并行编程.doc_第3页
OpenMP+MPI混合并行编程.doc_第4页
OpenMP+MPI混合并行编程.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Harbin Institute of Technology 并行处理与体系结构实验报告实验题目: OpenMP+MPI混合并行编程 院 系: 计算机科学与技术 姓 名: 学 号: 实验日期: 2011-12-25 哈尔滨工业大学实验四:OpenMP+MPI混合并行编程一、实验目的1、复习前几次实验的并行机制,即OpenMP与MPI编程模式。2、掌握OpenMP与MPI混合并行编程模式。二、实验内容1、使用OpenMP+MPI混合编程并与OpenMP、MPI单独编程的比较。在OpenMp并行编程中,主要针对细粒度的循环级并行,主要是在循环中将每次循环分配给各个线程执行,主要应用在一台独立的计算机上;在MPI并行编程中,采用粗粒度级别的并行,主要针对分布式计算机进行的,他将任务分配给集群中的所有电脑,来达到并行计算;OpenMp+MPI混合编程,多台机器间采用MPI分布式内存并行且每台机器上只分配一个MPI进程,而各台机器又利用OpenMP进行多线程共享内存并行。OpenMPMPI并行粒度是线程级并行进程级的并行存储方式共享存储分布式存储数据分配隐式分配显示分配编程复杂度相对简单,充分利用了共享存储体系结构的特点,避免了消息传递的开销。数据的放置策略不当可能会引发其他问题,并行化的循环粒度过小会增加系统开销等。编程模型复杂,需要分析及划分应用程序问题,并将问题映射到分布式进程集合;细粒度的并行会引发大量的通信,需要解决通信延迟大和负载不平衡两个主要问题,调试MPI程序麻烦,MPI程序可靠性差,一个进程出问题,整个程序将错误。可扩展性可扩展性差, OpenMP采用共享存储,意味着它只适应于SMP、DSM机器,不适合于集群。可扩展性好,适合于各种机器。并行化支持粗粒度的并行,但主要还是针对细粒度的循环级并行。将串行程序转换为并行程序时无须对代码作大的改动。并行化改进需要大量的修改原有的串行代码。2、分析影响程序性能的主要因素。在采用OpenMP实现的并行程序中,由于程序受到计算机性能的影响,不能大幅度的提高程序运行速度,采用了集群的MPI并行技术,程序被放到多台电脑上运行,多台计算机协同运行并行程序,但是,在集群中的每台计算机执行程序的过程又是一个执行串行程序的过程,因此提出的OpenMP+MPI技术,在集群内采用MPI技术,减少消息传递的次数以提高速度,在集群的每个成员上又采用OpenMP技术,节省内存的开销,这样综合了两种并行的优势,来提升并行程序的执行效率。三、实验原理OpenMP编程:使用Fork-Join的并行执行模式。开始时由一个主线程执行程序,该线程一直串行的执行,直到遇到第一个并行化制导语句后才开始并行执行。含义如下: Fork:主线程创建一队线程并行执行并行域中的代码;Join:当各线程执行完毕后被同步或中断,最后又只有主线程在执行。MPI编程:消息传递编程模型是使用显式方式控制并行性的分布存储模型,MPI是这一模型的事实标准。MPI可移植到分布和共享存储体系结构上,而且允许静态任务调度。显式并行通常提供了一个更好的性能和可移植性。特别适用于粗粒度的并行,使用MPI实现单程序多数据(SPMD)并行模型时,每个进程只能读写本地内存中的数据,对远程数据的访问则通过进程间显式的消息传递(库函数调用)来完成的。MPI包含了多种优化的组通信库函数,可供编程人员选择使用最佳的通信模式。OpenMP+MPI编程:在OpenMP并行区域内不要通信,这里通信指的是不同节点内的线程间的通信,在节点中多线程公用的代码间的通信会急剧增加带宽竞争;在单个线程中也尽量不要通信,因为通信一般都蕴含着同步操作,这会使得性能大大下降。如果必须在线程中通信,也应把通信次数尽可能的减少,或者把需要进行消息传递的代码改写到线程的外面进行通信;线程中的同步次数也是影响性能的一个重要因素,应该慎重使用同步操作和那些蕴含同步的操作,避免节点内不必要的数据拷贝;四、实验结果和分析1、一个简单的OpenMP+MPI程序“test.c”#include #include #include int main(int argc, char *argv)int ntask,mytask;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&ntask);MPI_Comm_rank(MPI_COMM_WORLD,&mytask);#pragma omp parallelprintf(Thread %d on task %dn, omp_get_thread_num(), mytask();MPI_Finalize();return 0;在程序中,首先进行了一些关于MPI的一些初始化和设置:MPI_Init、MPI_Comm_size、MPI_Comm_rank,之后在循环里面又实现了OpenMP的并行,并加入了#pragma omp parallel并行制导语句。从而实现了OpenMP+MPI的很合并行程序。对程序进行编译: mpicc -fopenmp -o test test.c对程序进行启动: mpdboot -n 2 -f /root/mpd.hosts 运行程序: mpiexec -n 2 ./test可以发现程序在集群中运行成功,而且每个节点也实现了并行的OpenMP。2、Nbody程序性能分析(1)对串行程序nbody-serial.c进行编译、运行:gcc -o nbody-serial nbody-serial.c -lm./nbody-serial sample_input.in 1000 sample_input.out(2)对OpenMP并行程序nbody-openmp.c进行编译、运行:gcc -fopenmp -o nbody-openmp nbody-openmp.c -lm./nbody-openmp sample_input.in 1000 sample_input.out(3)对MPI并行程序nbody-mpi.c进行编译、运行:mpicc -o nbody-mpi nbody-mpi.c -lmmpiexec -n 4 ./nbody-mpi sample_input.in 1000 sample_input.out(4)对OpenMP+MPI混合程序nbody-mixture.c进行编译、运行:mpicc -fopenmp -o nbody-mixture nbody-mixture.c -lmmpiexec -n 4 ./nbody-mixture sample_input.in 1000 sample_input.out由图中可以直观的看出来,各种并行程序之间的执行时间差别是比较大的,采用混合式并行程序大大的提升了程序的运行效率。串行OpenMPMPIOpenMP+MPI执行时间422121.711.53、Homb性能分析Homb是测试多核系统和SMP系统上混合编程的OpenMP与MPI基准。该代码是一个在具有可选的收敛测试的2-D网格上的求解拉普拉斯方程的优化的方法。该代码的设计是用来比较MPI、OpenMP和混合编码的性能的。当每个任务的线程数为1时,它就被看成为一个纯MPI编码方式,当任务数为1时,就可以当成一个纯OpenMP代码。对homb.c 进行编译,并且分别按照下面两种方式来运行程序:mpicc -fopenmp -o homb homb.c lmmpiexec -n 4 ./homb -NRC -NITER 25 -vf homb.out -smpiexec -n 4 ./homb -NR 16384 -NC 16384 -NITER 10 -v 五、结论从实验可以看出,采用了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论