多核多线程技术.ppt
文本预览下载声明
7.2 MPICH的安装和配置 在项目属性的“配置属性” → “链接器” → “输入”项中的“附加依赖项”加入 mpi.lib 7.3 MPI编程基础 简单的MPI程序示例 #include stdafx.h #include mpi.h int _tmain(int argc, _TCHAR* argv[]) { int rank, size; MPI_Init(argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, rank); MPI_Comm_size(MPI_COMM_WORLD, size); printf(Hello World from thread %d of %d\n, rank, size); MPI_Finalize(); return 0; } 7.3 MPI编程基础 使用MPICH2安装目录下的运行工具MPIEXEC wrapper运行用VS 2005生成的exe文件 MPI程序的四个基本函数 MPI_Init和MPI_Finalize MPI_Init初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。而MPI_Finalize则是结束MPI执行环境。 这两个函数用来定义MPI程序的并行区 MPI_Comm_rank 用来标识各个MPI进程,两个函数参数: MPI_Comm类型的通信域,表示参与计算的MPI进程组 rank,返回调用进程在comm中的标识号 MPI_Comm_size 用来标识相应进程组中有多少个进程,有两个参数: MPI_Comm类型的通信域,标尺参与计算的MPI进程组 整型指针,返回相应进程组中的进程数 MPI的点对点通信 MPICH含有三层结构: 最上层是MPI的API,基本是点到点通信,和在点到点通信基础上构造的集群通信(Collective Communication); 中间层是ADI层(Abstract Device Interface),其中device可以简单地理解为某一种底层通信库,ADI就是对各种不同的底层通信库的不同接口的统一标准; 底层是具体的底层通信库 MPI的点对点通信 两个最重要的MPI函数MPI_Send和MPI_Recv。 int MPI_SEND(buf, count, datatype, dest, tag, comm) 这个函数的含义是向通信域comm中的dest进程发送数据。消息数据存放在buf中,类型是datatype,个数是count个。这个消息的标志是tag,用以和本进程向同一目的进程发送的其他消息区别开来。 int MPI_RECV(buf,count,datatype,source,tag,comm,status) MPI_Recv绝大多数的参数和MPI_Send相对应,有相同的意义。唯一的区别就是MPI_Recv里面多了一个参数status。status主要显示接收函数的各种错误状态。 消息管理7要素 MPI最重要的功能是消息传递。MPI_Send和MPI_Recv负责在两个进程间发送和接收消息。总结起来,点对点消息通信的参数主要是由以下7个组成: 发送或者接收缓冲区buf; 数据数量count; 数据类型datatype; 目标进程或者源进程destination/source; 消息标签tag; 通信域comm;. 消息状态status,只在接收的函数中出现。 错误管理 MPI在错误管理方面提供了丰富的接口函数,这里我们介绍其中最简单的部分接口。 用status.MPI_ERROR来获取错误码。 MPI终止MPI程序执行的函数MPI_Abort。 int MPI_Abort(MPI_Comm comm, int errorcode) 它使comm通信域的所有进程退出,返回errorcode给调用的环境。通信域comm中的任一进程调用此函数都能够使该通信域内所有的进程结束运行。 7.4 MPI群集通信 群集通信是包含了一对多、多对一和多对多的进程通信模式。其最大特点是多个进程参与通信。 常用的MPI群集通信函数: 同步 广播 聚集 播撒 7.4 MPI群集通信 同步 函数接口:int MPI_Barrier(MPI_Comm comm) 在操作中,通信子comm中的所有进程相互同步,即它们相互等待,直到所有进程都执行了他们各自的MPI_Barrier函数,然后再各自接着开始执行后续的代码。 OpenMP中的任务调度 静态调度static——使用size参数 #pragma omp parallel for schedule(static, 2) for(i = 0; i 10; i++ )
显示全部