《MPI和Intel软件工具.ppt》由会员分享,可在线阅读,更多相关《MPI和Intel软件工具.ppt(34页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、MPI简介lMPI及其历史:消息传递接口(Message Passing Interface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言。由消息传递接口论坛(Message Passing Interface Forum,简称MPIF)发起讨论并进行规范化的。MPI标准如今已经成为事实意义上的消息传递并行编程标准,也是最为流行的并行编程接口。lMPI标准定义了一组具有可移植性的编程接口。l典型的实现包括开源的MPICH、LAM MPI以及不开源的INTEL MPI。MPI实现lMPICH:最重要的MPI实现影响力最大、用户最多的MPI实现。由美国Argonne国家实验室开发,开发
2、源代码。支持单程序多数据、多程序多数据编程。MPICH2(http:/www-unix.mcs.anl.gov/mpi/mpich2/index.htm#download)MPI程序特点 lMPI程序是基于消息传递的并行程序;l消息传递指的是并行执行的各个进程具有自己独立的堆栈和代码段;l各进程作为独立的程序独立执行;l进程间的信息交换完全是通过显示的调用通信函数来完成。MPI程序分类l可分为单程序多数据(Single Program Multiple Data,简称SPMD)、多程序多数据(Multiple Program Multiple Data,简称MPMD)两种形式。SPMD:使用一
3、个程序来处理多个不同数据集达到并行的目的;单程序多数据l串行执行单程序多数据l并行执行多程序多数据 lMPMD使用不同的程序处理多个数据集,合作求解一个问题。MPI程序实例 lLinux系统环境配置安装配置Linux 保证SSH网络服务程序正常启动;给每个节点配置IP;配置/etc/hosts文件,改文件可以实现IP和机器的对应解析,每个节点都要有这个文件,这样各个节点就可以通过节点名字进行访问;配置网络文件系统 NFS,实现各节点和主节点内容同步更新,自动实现目录对应,有共享目录;配置ssh,实现MPI节点间用户的无密码访问;安装MPICH2,各节点MPICH和用户程序要在相同的目录,各节点
4、要有副本。MPI程序实例MPI函数说明l、MPI初始化:MPI_Init函数用法:int MPI_Init(&argc,&argv)每一个MPI进程调用的第一个MPI函数都是MPI_Init。该函数指示系统完成所有的初始化工作,以备对后续MPI库的调用进行处理。l、MPI结束:MPI_Finalize函数用法:int MPI_Finalize()在一个进程执行完其全部MPI库函数调用后,将调用函数 MPI_Finalize,从而让系统释放分配给MPI的资源。它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。MPI程序MPI程序实例获取进程标志和机器名l、确定进程的标识符 用法
5、:int MPI_Comm_rank(MPI_COMM_WORLD,&id)当MPI初始化后,每一个活动进程变成了一个叫做MPI_COMM_WORLD的通信域中的成员。通信域是一个不透明的对象,提供了在进程之间传递消息的环境。在一个通信域内的进程是有序的。在一个有p个进程的通信域中,每一个进程有一个唯一的序号(ID号),取值为0p。进程可以通过调用函数MPI_Comm_rank来确定它在通信域中的序号。l4、确定进程数量 用法:int MPI_Comm_size(MPI_COMM_WORLD,&p)进程通过调用函数MPI_Comm_size来确定一个通信域中 的进程总数。MPI程序实例获取进程
6、标志和机器名MPI的点对点通信l有消息传递功能的并行程序,消息传递是MPI编程的核心功能,掌握了MPI消息传递编程方法就掌握了MPI编程的核心。lint MPI_Send(void*buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)参数说明:buf:发送缓冲区的起始地址count:将要发送的数据的个数datatype:发送数据的数据类型dest:目的进程标识号tag:消息标志comm:通信域MPI_Send将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是de
7、st,本次发送的消息标志是tag,使用这一标志,就可以把本次发送的消息和本进程向同一目的进程发送的其他消息区别开。MPI的点对点通信lint MPI_Recv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status status)参数说明:buf:接收缓冲区的起始地址count:将接收的数据的个数(最多个数)datatype:接收数据的数据类型source:接收数据的来源进程标识号tag:消息标志,与发送标志相匹配comm:通信域 status:返回类型(是由三个域组成的结构类型,
8、这三个域分别是:MPI_SOURCE、MPI_TAG和MPI_ERROR)MPI_ Recv函数是MPI中基本的消息接收函数,MPI_ Recv从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。MPI通信程序实例MPI通信程序实例Monte Carlo法在并行程序设计中的应用l直径1的单位圆,再做一正方形与之相切,在这个正方形内随机产生count个点,判断是否落在圆内,落在院内的点数目m,m与count的比值近似为圆和正方形面积的比值,所以:Monte Carlo法在并行程序设
9、计中的应用MPI预定义数据类型一般的MPI程序设计流程图 MPI_Init()MPI_Comm_rank()MPI_Comm_size()建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:计算控制程序体;进程间通信;MPI_Finalize()退出MPI系统程序参数说明End计算与通信的并行l阻塞发送将发生阻塞,直到通讯完成.l非阻塞可将通讯交由后台处理,通信与计算可重叠.lint MPI_Isend(void*buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm,MPI_Request*request)
10、buf 发送缓冲区的起始地址 count 发送缓冲区的大小(发送元素个数)datatype 发送缓冲区数据的数据类型 dest 目的进程的秩 tag 消息标签 comm 通信空间/通信子 request 非阻塞通信完成对象(句柄)lint MPI_Irecv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Request*request)计算与通信的并行计算与通信的并行l发送的完成:代表发送缓冲区中的数据已送出,发送缓冲区可以重用。它并不代表数据已被接收方接收。数据有可能被缓冲;l接收的
11、完成:代表数据已经写入接收缓冲区。接收者可访问接收缓冲区。l通过MPI_Wait()和MPI_Test()来判断通信是否已经完成;MPI程序的编译l用mpicc编译时,就像用一般的C编译器一样。还可以使用一般的C的编译选项,含义和原来的编译器相同.l例如:./mpicc-c foo.c./mpicc-o foo foo.oMPI程序的运行lMPI程序的执行步骤一般为:编译以得到MPI可执行程序(若在同构的系统上,只需编译一次;若系统异构,则要在每一个异构系统上都对MPI源程序进行编译)l将可执行程序拷贝到各个节点机上l通过mpirun命令并行执行MPI程序mpirun np N 其中:N:同时
12、运行的进程数:可执行MPI程序名例如:mpirun np 6 cpimpirun np 4 helloIntel软件工具lPerformance Analyzer:性能分析,找到软件性能比较热的部分,一般也就是性能瓶颈的关键点,帮助我们收集数据发现问题。lIntel Threading Checker:用于查找线程错误,能够检测资源竞争、线程死锁等问题.大家程序在并行化后,可以通过Threading Checker 检测一下有没有多线程相关的错误。lIntel Threading Profiler:线程性能检测工具,多线程化有可能会有负载比平衡,同步开销过大等等线程相关的性能问题。该工具可以帮
13、你发现每一个线程每一时刻的状态。VTune性能分析器 l性能分析器功能与使用方法 取样功能、调用图功能、计数器监视器以及经过改进的英特尔调优助手;在Windows下同时提供图形化与命令行界面;允许选择是否与Visual Studio.NET 集成;为基于IA-32 与英特尔安腾处理器的Linux 应用程序提供远程支持;可以对基于英特尔 PXA250、PXA255 与 PXA26x 处理器的应用程序进行取样。VTune性能分析器l取样(Sampling):帮助开发者分辨程序中最消耗时间的函数和模块,并给出操作系统和应用程序的详细视图。它能够寻找程序中的热点区域(Hot Spot)最耗时间的模块、
14、函数、代码行和汇编指令,并提供进程、线程、模块、函数以及代码等不同层次的各种视图,并在下方的表格内将具体参数列了出来。低功耗:取样产生的时间开销不到1%。对指令无要求:开发者不必为取样而对程序代码做任何改动。VTune性能分析器l取样主要有两种方式:基于时间取样时间取样(Time-based Sampling-TBS):基于时间取样的方式或者由操作系统的时钟服务触发,或者在每隔n 个处理器时钟周期后自动触发。基于事件取样基于事件取样(Event-based Sampling-EBS):基于事件取样的方式主要由处理器的事件寄存器溢出(overflow)来触发。这样的事件通常是处理器相关的,主要包
15、括如二级缓存缺失、分支转移预测失败、浮点数指令提交等事件。曲线图l调用曲线图通过分析程序运行时函数的入口点和出口点,生成一张调用曲线图并且确定调用顺序和显示关键路径。它显示线程创建,函数执行,以及它们之间的父子继承关系。它分析提供关于程序流程的示意图,帮助开发者快速识别主要功能和调用顺序。l调用曲线图展现了以下几个部分:程序函数级的框架结构某个函数被某特定区域调用的次数每个函数消耗的时间处于关键路径上的函数 Thread Checker线程检查器l快速查找和修复Windows 和OpenMP 线程软件中的bug。l监控程序执行过程中的线程行为,发现其中存在的竞争现象、线程阻塞以及潜在的线程死锁问题,提示同线程错误相关的源代码位置、侵权变量以及堆栈跟踪等。l线程检查器含有一个错误检测引擎,可以在数小时内定位难于发现的线程错误,这些错误有时使用传统的工具或软件根本就发现不了。l在程序执行期间监控其线程行为,能够检测多种类型的线程错误。l可以发现数据竞争现象,另外,它还能发现线程死锁和阻塞问题。l英特尔线程检查器支持Intel 64 与 Microsoft Visual Studio*环境,通常集成到Intel VTune 性能分析器中使用。
限制150内