MPI并行程序设计

上传人:san****019 文档编号:21202967 上传时间:2021-04-25 格式:PPT 页数:80 大小:670KB
返回 下载 相关 举报
MPI并行程序设计_第1页
第1页 / 共80页
MPI并行程序设计_第2页
第2页 / 共80页
MPI并行程序设计_第3页
第3页 / 共80页
点击查看更多>>
资源描述
消 息 传 递 并 行 程 序 设 计消息传递并行程序设计:指 用 户 必 须 通 过 显 式 地 发 送 和 接 收 消 息 来 实 现处 理 机 间 的 数 据 交 换 。在 这 种 并 行 编 程 中 , 每 个 并 行 进 程 均 有 自 己 独立 的 地 址 空 间 , 相 互 之 间 访 问 不 能 直 接 进 行 ,必 须 通 过 显 式 的 消 息 传 递 来 实 现 。这 种 编 程 方 式 是 大 规 模 并 行 处 理 机 (MPP)和 机群 (Cluster)采 用 的 主 要 编 程 方 式 。 消 息 传 递 并 行 程 序 设 计并行计算粒度大,特别适合于大规模可扩展并行算法:由 于 消 息 传 递 程 序 设 计 要 求 用 户 很 好 地 分 解 问题 ,组 织 不 同 进 程 间 的 数 据 交 换 , 并 行 计 算 粒度 大 , 特 别 适 合 于 大 规 模 可 扩 展 并 行 算 法 。消息传递是当前并行计算领域的一个非常重要的并行程序设计方式。 什 么 是 MPI?MPI(Massage Passing Interface):是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C。 一 种 新 的 库 描 述 , 不 是 一 种 语 言 。 共 有 上 百 个 函 数 调用 接 口 , 在 Fortran和 C语 言 中 可 以 直 接 对 这 些 函 数 进行 调 用 。 从 语 法 上 , 它 遵 守 所 有 对 库 函 数 /过 程 的 调用 规 则 , 与 一 般 的 函 数 /过 程 没 有 区 别 。MPI是 一 种 标 准 或 规 范 的 代 表 , 而 不 是 特 指 某 一 个 对它 的 具 体 实 现 。 一 个 正 确 的 MPI程 序 , 可 不 加 修 改 在所 有 的 并 行 机 上 运 行 。MPI是 一 种 消 息 传 递 编 程 模 型 , 并 成 为 这 种 编 程 模 型的 代 表 和 事 实 上 的 标 准 。 最 终 目 标 是 服 务 于 进 程 间 通信 。 MPI的 发 展 过 程发展的两个阶段:MPI 1.1: 1995 MPICH: 是 一 种 最 重 要 的 MPI实 现 , 每 当 MPI推 出新 的 版 本 , 就 会 有 相 应 的 MPICH的 实 现 版 本 。 由美 国 Argonne国 家 实 验 室 和 密 西 西 比 州 立 大 学 联合 开 学 , 具 有 更 好 的 可 移 植 性 。MPI 1.22.0: 动 态 进 程 , 并 行 I/O, 支 持 F90和 C+。 为 什 么 要 用 MPI?优 点高可移植性:MPI已 在 IBM PC机 上 、 MS Windows上 、 所 有 主 要的 Unix工 作 站 上 和 所 有 主 流 的 并 行 机 上 得 到 实现 。 使 用 MPI作 消 息 传 递 的 C或 Fortran并 行 程 序可 不 加 改 变 地 运 行 在 IBM PC、 MS Windows、Unix工 作 站 、 以 及 各 种 并 行 机 上 。消 息 传 递 方 式 是 广 泛 应 用 于 多 类 并 行 机 的 一 种模 式 , 特 别 是 分 布 存 储 并 行 机 。 这 种 模 式 在 一些 重 要 的 计 算 应 用 中 已 取 得 了 实 质 性 进 步 。 为 什 么 要 用 MPI?优 点MPI是被正式的详细说明的:它已经成为一个标准。消息传递标准的定义能提供给生产商清晰定义的程序库,以便他们能有效地实现这些库或在某些情况下为库程序提供硬件支持,因此加强了扩展性。MPI有完备的异步通信:使得send,receive能与计算重叠。可以有效的在MPP上或Cluster上用MPI编程。 MPI+C 实 现 的 “ Hello World!”#include #include mpi.h main( int argc, char *argv ) MPI_Init( printf( Hello, world!n ); MPI_Finalize(); MPI+C实 现 的 “ Hello World!”umpi.h是MPI标准规定的,每个MPI实现都要包含。它提供用户MPI程序需要的所有必要的原型和外部变量声明。 MPI函 数 返 回 出 错 代 码 或 MPI_SUCCESS成 功 标 志 。 MPI-前 缀 , 且 只 有 MPI以 及 MPI_标 志 后 的 第 一 个字 母 大 写 , 其 余 小 写 。uMPI函数的参数被标志为以下三种类型: IN: 参 数 在 例 程 的 调 用 中 不 会 被 修 正 。 OUT: 参 数 在 例 程 的 调 用 中 可 能 会 被 修 正 。 INOUT: 参 数 在 一 些 例 程 中 为 IN, 而 在 另 一 些 例程 中 为 OUT. MPI初 始 化 -MPI_Initint MPI_Init(int *argc, char *argv)MPI_INIT(IERROR) MPI_Init是 MPI程 序 的 第 一 个 调 用 , 它 完 成 MPI程 序 的 所 有 初 始 化 工 作 。 所 有 的 MPI程 序 的 第 一条 可 执 行 语 句 都 是 这 条 语 句 。 启 动 MPI环 境 ,标 志 并 行 代 码 的 开 始 。 并 行 代 码 之 前 ,第 一 个 mpi函 数 (除MPI_Initialize()外 )。 要 求 main必 须 带 参 数 运 行 ,否 则 出 错 。 MPI结 束 -MPI_Finalizeint MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_Finalize是 MPI程 序 的 最 后 一 个 调 用 , 它 结束 MPI程 序 的 运 行 , 它 是 MPI程 序 的 最 后 一 条 可执 行 语 句 , 否 则 程 序 的 运 行 结 果 是 不 可 预 知 的 。标 志 并 行 代 码 的 结 束 ,清 理 和 关 闭 除 主 进 程 外的 其 它 进 程 。之 后 串 行 代 码 仍 可 在 主 进 程 (rank = 0)上 运 行(如 果 必 须 )。 MPI程 序 的 的 编 译 与 运 行u mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码。u mpif77 o hello hello.f 或 mpicc o hello hello.c生成hello的可执行代码。u mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定。a.out / hello 要运行的MPI并行程序。输出文件命名 Hello是 如 何 被 执 行 的 ?u SPMD: Single Program Multiple Data(SPMD) 开 始 写 MPI并 行 程 序u在写MPI程序时,我们常需要知道以下两个问题的答案:由 多 少 个 进 程 来 进 行 并 行 计 算 ?我 是 哪 一 个 进 程 ? 两 个 函 数uMPI 提供了下面两个函数来回答上述问题:用 MPI_Comm_size 获 得 进 程 个 数 p int MPI_Comm_size(MPI_Comm comm, int *size); 这一 调 用 返 回 给 定 的 通 信 域 中 所 包 含 的 进 程 的 个 数 , 不同 的 进 程 通 过 这 一 调 用 得 知 在 给 定 的 通 信 域 中 一 共 有多 少 个 进 程 在 并 行 执 行 。用 MPI_Comm_rank 获 得 进 程 的 一 个 叫 rank的 值 , 该 rank值 为 0到 p-1间 的 整 数 ,相 当 于 进 程 的 IDint MPI_Comm_rank(MPI_Comm comm, int *rank); 这一 调 用 返 回 调 用 进 程 在 给 定 的 通 信 域 中 的 进 程 标 识 号 ,有 了 这 个 标 识 号 , 不 同 的 进 程 就 可 以 将 自 身 和 其 它 的进 程 区 分 开 , 实 现 进 程 的 并 行 和 协 作 。 更 新 的 “ Hello World!”#include #include mpi.h int main(int argc, char *argv) int myid, numprocs; MPI_Init( MPI_Comm_size(MPI_COMM_WORLD, MPI_Comm_rank(MPI_COMM_WORLD, printf(“Hello, World! I am %d of %d. /n, myid, numprocs); MPI_Finalize(); return 0; 运 行 结 果dairnode01 $ mpicc o hello1 hello1.cdairnode01 $ mpirun -np 4 hello1Hello, World! I am 0 of 4Hello, World! I am 1 of 4Hello, World! I am 2 of 4Hello, World! I am 3 of 4dairnode01 $计算机打印字符输入的命令 通 信 字 MPI_COMM_WORLD MPI_Comm_size和 MPI_Comm_rank两 个 函 数 都 用 到 了 同 一 个参 数 MPI_COMM_WORLD。 MPI_COMM_WORLD是 一 个预 定 的 通 信 域 ( communicator) ,+ 包 括 进 程 组 和 通 信 上 下 文 , 用 于 描 述 进 程 间 的 通 信 关 系 。+ 进 程 组 是 进 程 的 有 限 , 有 序 集 。+ 通 信 上 下 文 如 同 系 统 设 计 的 超 级 标 签 , 用 于 安 全 地 区 别 不 同的 通 信 , 以 免 互 相 干 扰 。 每 个 通 信 域 的 上 下 文 都 不 同 , 一 个 上下 文 中 的 消 息 发 送 不 能 在 另 一 个 上 下 文 中 被 接 收 , 通 信 上 下 文不 是 显 示 的 MPI对 象 , 它 们 仅 作 为 通 信 域 实 现 的 一 部 分 出 现 。+ 它 在 执 行 MPI_Initb函 数 后 自 动 生 成 。 MPI通 信 操 作 函 数 中 必不 可 少 的 参 数 , 用 于 限 定 参 加 通 信 的 进 程 的 范 围 。 函 数 MPI_Comm_size和 MPI_Comm_rank查 询MPI_COMM_WORLD以 获 得 应 用 中 MPI进 程 的 总 数 并 为 这 些MPI进 程 分 别 获 得 一 个 唯 一 的 编 号 。 获 取 的 值 放 在 变 量 size和rank。 MPI程 序 的 框 架 结 构 消 息 发 送 和 接 收MPI_SEND(buf, count, datatype, dest, tag, comm) IN buf 发 送 缓 冲 区 的 起 始 地 址 ( 可 选 类 型 ) IN count 将 发 送 的 数 据 的 个 数 ( 非 负 整 数 ) IN datatype 发 送 数 据 的 数 据 类 型 IN dest 目 的 进 程 标 识 号 rank( 整 型 ) IN tag 消 息 标 签 , 用 于 识 别 不 同 的 消 息 ( 整 型 ) IN comm 通 信 域 ( 句 柄 )int 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数据 类 型 的 数 据 发 送 到 目 的 进 程 , 目 的 进 程 在 通 信域 的 标 识 号 是 dest, 本 次 发 送 的 消 息 标 志 是 tag,这 一 标 志 的 目 的 是 把 本 次 发 送 的 消 息 和 本 进 程 向同 一 目 的 进 程 发 送 的 其 他 消 息 区 别 开 来 。MPI_Send操 作 指 定 的 发 送 缓 冲 区 是 由 count个 类型 为 datatype的 连 续 数 据 空 间 组 成 , 起 始 地 址 为buf。 注 意 : 不 是 以 字 节 计 数 , 而 是 以 数 据 类 型为 单 位 指 定 消 息 的 长 度 。其 中 datatype数 据 类 型 : MPI的 预 定 义 类 型 或 用户 自 定 义 。 通 过 使 用 不 同 的 数 据 类 型 调 用MPI_Send, 可 以 发 送 不 同 类 型 的 数 据 。 消 息 发 送 和 接 收MPI_RECV(buf, count, datatype, source, tag, comm,status) OUT buf 接 收 缓 冲 区 的 起 始 地 址 ( 可 选 类 型 ) IN count 最 多 可 接 收 的 数 据 的 个 数 ( 非 负 整 数 ) IN datatype 接 收 数 据 的 数 据 类 型 IN source 接 收 数 据 的 来 源 即 发 送 数 据 的 进 程 的 进 程标 识 号 ( 整 型 ) IN tag 消 息 标 志 , 与 相 应 的 发 送 操 作 的 消 息 标 识rank相 匹 配 ( 整 型 ) IN comm 本 进 程 和 发 送 进 程 所 在 的 通 信 域 ( 句 柄 ) OUT status 返 回 状 态 , status对 象 ,包 含 实 际 接 收 到 的消 息 的 有 关 信 息int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) 说 明MPI_Recv从 指 定 的 进 程 source接 收 消 息 , 并 且 该消 息 的 数 据 类 型 和 接 收 进 程 指 定 的 datatype和 tag相 一 致 , 接 收 到 的 消 息 所 包 含 的 数 据 元 素 的 个 数 最多 不 能 超 过 count。接 收 缓 冲 区 是 由 count个 类 型 为 datatype的 连 续 元素 空 间 组 成 , 起 始 地 址 为 buf。 接 收 到 消 息 的 长 度被 确 定 。 如 果 大 小 缓 冲 区 的 长 度 会 发 生 溢 出 ; 如 果一 个 短 于 接 收 缓 冲 区 的 消 息 到 达 , 那 么 只 有 相 应 于这 个 消 息 的 那 些 地 址 被 修 改 。 count可 以 为 零 , 此时 消 息 的 数 据 部 分 是 空 的 。其 中 datatype数 据 类 型 : MPI的 预 定 义 类 型 或 用 户自 定 义 。 通 过 指 定 不 同 的 数 据 类 型 调 用 MPI_Recv,可 以 发 送 不 同 类 型 的 数 据 。 返 回 状 态 status返 回 状 态 变 量 status用 途 很 广 , 它 是 MPI定 义 的 一个 数 据 类 型 , 使 用 之 前 需 要 用 户 为 它 分 配 空 间 。在 C实 现 中 , 状 态 变 量 是 由 至 少 三 个 域 组 成 的 结 构类 型 , 这 三 个 域 分 别 是 :MPI_SOURCE,MPI_TAG,MPI_ERROR。 它 还 可 以 包 括其 他 的 附 加 域 。 通 过 对status.MPI_SOURCE,status.MPI_TAG和 staus. MPI_ERROR的 引 用 就 可 以 得 到 返 回 状 态 中 所 包 含 的发 送 数 据 进 程 的 标 识 、 发 送 数 据 使 用 的 tag标 识 和本 接 收 操 作 返 回 的 错 误 代 码 。除 了 以 上 三 个 信 息 之 外 , 对 status变 量 执 行MPI_GET_COUNT调 用 可 得 到 接 收 到 的 消 息 的 长 度 信息 。 MPI消 息MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。数 据 : 信 封 : MPI消 息一 个 消 息 好 似 一 封 信 。 需 要 定 义 消 息 的 内 容 ,还 需 要 定 义 消 息 的 发 送 者 或 接 收 者 , 前 者 称 为消 息 缓 冲 , 后 者 称 为 消 息 信 封 。 什 么 是 缓 冲 区 ?应 用 程 序 中 说 明 的 变 量 , 在 消 息 传 递 语 句 中 又 用 作缓 冲 区 的 起 始 位 置 。也 可 表 示 由 系 统 (不 同 用 户 )创 建 和 管 理 的 某 一 存 储区 域 , 在 消 息 传 递 过 程 中 用 于 暂 存 放 消 息 .也 被 称 为系 统 缓 冲 区 。用 户 可 设 置 一 定 大 小 的 存 储 区 域 , 用 作 中 间 缓 冲 区以 保 留 可 能 出 现 在 其 应 用 程 序 中 的 任 意 消 息 。进程PA M进程QB 进程PA M S进程QB进程PA MT进程QB系统缓冲区用户指定缓冲区用户缓冲区 一 个 简 单 的 发 送 和 接 收 例 子一 个 进 程 (进 程 0)向 另 一 个 进 程 (进 程 1)发 送 一 条 消 息 ,该 消 息 是 一 个 字 符 串 “ Hello, process 1” 。 进 程 1在接 收 到 该 消 息 后 , 将 这 一 消 息 打 印 到 屏 幕 上 。#include #include main (int agrc, char *argv) char message20; int myrank; MPI_Init( /*MPI程 序 的 初 始 化 */ MPI_Comm_rank(MPI_COMM_WORLD, /*得 到 当 前 进 程 的 标 识 */ if (myrank = 0) /*若 是 0进 程 */ strcpy(message,”Hello, process 1”); 一 个 简 单 的 发 送 和 接 收 例 子MPI_Send(message, strlen(message),MPI_CHAR,1,99,MPI_COMM_WORLD);/*先 将 字 符 串 拷 贝 到 发 送 缓 冲 区 message中 , 然 后 调用 MPI_Send语 句 将 它 发 出 , 用 strlen(message)指 定消 息 的 长 度 , 用 MPI_CHAR指 定 消 息 的 数 据 类 型 ,1指 明 发 往 进 程 1, 使 用 的 消 息 标 识 是 99,MPI_COMM_WORLD是 包 含 是 包 含 本 进 程 0和 接 收消 息 的 进 程 1的 通 信 域 。 发 送 方 和 接 收 方 必 须 在 同一 个 通 信 域 。 由 通 信 域 来 统 一 协 调 和 控 制 消 息 的 发送 和 接 收 */else if (myrank = 1) /*若 是 进 程 1*/ 一 个 简 单 的 发 送 和 接 收 例 子MPI_Recv(message,20,MPI_CHAR,0,99,MPI_COMM_WROLD,printf(“received: %s:”,message);/*进 程 1直 接 执 行 接 收 消 息 的 操 作 , 这 里 它 使 用 message作 为 接 收 缓 冲 区 。 可 见 , 同 一 个 变 量 在 发 送 进 程 和 接收 进 程 中 的 作 用 是 不 同 的 。 它 指 定 接 收 消 息 的 最 大 长度 为 20, 消 息 的 数 据 类 型 为 MPI_CHAR字 符 型 , 接 收的 消 息 来 自 进 程 0, 而 接 收 消 息 携 带 的 标 识 必 须 为 99,使 用 的 通 信 域 也 是 MPI_COMM_WORLD, 接 收 完 成 后的 各 种 状 态 信 息 存 放 在 status中 。 接 收 完 成 后 , 直 接 将接 收 到 的 字 符 串 打 印 在 屏 幕 上 。 */MPI_Finalize() /*MPI程 序 结 束 */ MPI预 定 义 的 数 据 类 型 MPI预 定 义 的 数 据 类 型如 果 宿 主 语 言 有 附 加 的 数 据 类 型 , 那 么 MPI应提 供 附 加 的 相 应 数 据 类 型 , 如 下 表 所 示 : 现 在 您 已 经 能 够用 MPI进 行 并 行编 程 了 ! 点 对 点 通 信点 对 点 通 信 (Point-to-Point Communication)是 MPI中 比 较 复 杂 的 一 部 分 , 它 有 两 种 消 息 传 递 机 制 :阻 塞 的 和 非 阻 塞 的 。通 信 模 式通 信 模 式 指 的 是 缓 冲 管 理 以 及 发 送 方 和 接 收 方之 间 的 同 步 方 式 。 MPI支 持 4种 通 信 模 式 。 即 标 准通 信 模 式 、 缓 冲 通 信 模 式 、 同 步 通 信 模 式 和 就 绪通 信 模 式 。 标 准 通 信 模 式在 标 准 通 信 模 式 中 , 是 否 对 发 送 的 数 据 进 行 缓 冲 由 MPI来 决 定 , 而 不 是 由 用 户 程 序 来 控 制 的 。 如 果 MPI决 定 缓 存将 要 发 出 的 数 据 , 发 送 操 作 不 管 接 收 是 否 已 经 启 动 都 可以 执 行 , 否 则 只 有 等 待 接 收 操 作 启 动 后 才 能 正 确 返 回 。 缓 冲 通 信 模 式在 缓 冲 通 信 模 式 中 , 1) 用 户直 接 对 通 信 缓 冲 区 进 行 申 请 、 使用 和 释 放 。 2) 不 管 接 收 是 否 已经 启 动 , 发 送 操 作 都 可 以 执 行 ,但 是 在 发 送 消 息 之 前 必 须 有 缓 冲区 , 这 由 用 户 保 证 。 3) 消 息 发送 能 否 进 行 及 能 否 正 确 返 回 , 不依 赖 于 接 收 进 程 , 完 全 依 赖 于 是否 有 足 够 的 通 信 缓 冲 区 可 用 。 由MPI_Buffer_attach来 申 请 和MPI_Buffer_detach和 收 回 申 请的 缓 冲 区 。 同 步 通 信 模 式在 同 步 通 信 模 式 中 , 发 送 不 依 赖 于 接 收 进 程 相 应 的 接收 操 作 是 否 已 经 启 动 , 但 是 同 步 发 送 必 须 等 到 相 应 的 接收 进 程 开 始 后 才 可 以 正 确 返 回 。 同 步 发 送 返 回 后 , 发 送缓 冲 区 中 的 数 据 已 经 全 部 被 系 统 缓 冲 区 缓 存 并 且 已 经 开始 发 送 。 就 绪 通 信 模 式在 就 绪 通 信 模 式 中 , 1) 只 有 当 接 收 进 程 的 接 收 操作 已 经 启 动 时 , 才 可 以 在 发 送 进 程 启 动 发 送 操 作 ; 2)对 于 非 阻 塞 发 送 操 作 的 正 确 返 回 , 并 不 意 味 着 发 送已 完 成 , 但 对 于 阻 塞 发 送 的 正 确 返 回 , 则 发 送 缓 冲区 可 重 复 使 用 ; 3) 就 绪 通 信 模 式 的 特 殊 之 处 就 在 于它 要 求 接 收 操 作 先 于 发 送 操 作 而 被 启 动 。 MPI的 几 个 函 数 MPI_Init(int *argc, char *argv) /初 始 化 MPI系统 , 其 参 数 由 main()提 供 MPI_Initialized(int *flag) /检 测 MPI系 统 是 否 已初 始 化 , 唯 一 可 在 MPI_Init()前 使 用 的 函 数 。 如 已调 用 MPI_Init(), 返 回 flag=true,否 则 flag=false。 MPI_Comm_size() /得 到 通 信 域 的 进 程 数 MPI_Comm_rank() /得 到 通 信 域 内 进 程 的 标 号 MPI_Finalize() /退 出 MPI系 统 MPI的 几 个 函 数 MPI_Abort(MPI_Comm comm, int errorcode) /异常 终 止 MPI程 序 。 -在 出 现 致 命 错 误 而 希 望 异 常 终 止 MPI程 序 时 执 行 -MPI系 统 会 设 法 终 止 comm通 信 域 中 所 有 进 程 - 输 出 整 型 参 数 errorcode, 将 被 作 为 进 程 的 退 出码 返 回 给 系 统 。 MPI_Get_processor_name(char *name, int *resultlen) /获 取 处 理 器 名 称 -在 返 回 的 name中 存 储 进 程 所 在 处 理 器 的 名 称 -resultlen存 放 返 回 名 字 所 占 字 节 , 应 提 供 参 数name不 小 于 MPI_MAX_PRCESSOR_NAME个 字 节的 存 储 空 间 。 MPI的 几 个 函 数 MPI_Get_version(int *version, int *subversion) /获 取MPI版 本 号 。 -若 MPI的 版 本 号 为 2.0, 则 返 回 的 version=2,subversion=0 MPI_Wtime(void) /返 回 时 间 -返 回 调 用 时 刻 的 时 间 , 用 浮 点 数 表 示 称 数 -经 常 用 来 计 算 程 序 运 行 时 间 。 rank=MPI_PROC_NULL /空 进 程 -使 用 空 进 程 的 通 信 不 做 任 何 操 作 -向 MPI_PROC_NULL发 送 的 操 作 总 是 成 功 并 立 即 返 回 -从 MPI_PROC_NULL接 收 的 操 作 总 是 成 功 并 立 即 返 回 ,且 接 收 缓 冲 区 内 容 为 随 机 数 。 任 意 源 和 任 意 标 识 一 个 接 收 操 作 对 消 息 的 选 择 是 由 消 息 的 信 封 管 理 的 。如 果 消 息 的 信 封 与 接 收 操 作 所 指 定 的 值 source, tag和comm相 匹 配 , 那 么 这 个 接 收 操 作 能 接 收 这 个 消 息 。此 外 , 接 收 者 可 以 给 source指 定 一 个 任 意 值MPI_ANY_SOURCE, 标 识 任 何 进 程 发 送 的 消 息 都 可接 收 , 即 本 接 收 操 作 可 以 匹 配 任 何 进 程 发 送 的 消 息 ,但 其 它 的 要 求 还 必 须 满 足 , 如 tag的 匹 配 ; 如 果 给 tag一 个 任 意 值 MPI_ANY_TAG, 则 任 何 tag都 是 可 以 接收 的 。 这 类 似 于 统 配 符 的 概 念 。 上 述 两 个 任 意 值 可 以 同 时 使用 或 分 别 单 独 使 用 。 但 是 不 能 给 comm指 定 任 意 值 。 点 对 点 通 信 定 义两 个 进 程 之 间 的 通 信源 进 程 发 送 消 息 到 目 标 进 程目 标 进 程 接 受 消 息通 信 发 生 在 同 一 个 通 信 域 内进 程 通 过 其 在 通 信 域 内 的 标 号 表 示MPI系 统 的 通 信 方 式 都 建 立 在 点 对 点 通 信 之 上 。 四 种 通 信 模 式标 准 通 信 模 式 、 缓 冲 通 信 模 式 、 同 步 通 信 模 式 和 就 绪通 信 模 式 。这 四 种 通 信 模 式 是 根 据 以 下 不 同 的 情 况 来 区 分 的 : 1) 是 否 需 要 对 发 送 的 数 据 进 行 缓 存 ? 2) 是 否 只 有 当 接 收 调 用 执 行 后 才 可 以 执 行 发 送 操 作 ? 3) 什 么 时 候 发 送 调 用 可 以 正 确 返 回 ? 4) 发 送 调 用 正 确 返 回 是 否 , 意 味 着 发 送 已 完 成 ? 即 发 送 缓 冲 区 可 否 被 覆 盖 ? 即 发 送 数 据 是 否 已 到 达 接收 缓 冲 区 ? 针 对 这 些 情 况 , MPI给 出 了 不 同 的 通 信 模 式 。 阻 塞 式 和 非 阻 塞 式 点 对 点 通 信 两 种 消 息 传 递 机 制对 于 阻 塞 的 方 式 , 它 必 须 等 到 消 息 从 本 地 送 出 之后 , 才 可 以 执 行 后 续 的 语 句 , 保 证 了 消 息 缓 冲 区 等资 源 的 可 再 用 性 ; 而 非 阻 塞 的 方 式 不 须 等 到 消 息 从本 地 送 出 , 就 可 以 执 行 后 续 的 语 句 , 从 而 允 许 通 信和 计 算 的 重 叠 , 利 用 合 适 的 硬 件 可 使 得 计 算 和 数 据通 信 同 时 执 行 , 但 是 非 阻 塞 调 用 的 返 回 并 不 保 证 资源 的 可 再 用 性 。 阻 塞 和 非 阻 塞 点 对 点 通 信 阻 塞 式 点 对 点 通 信消 息 传 递 成 功 -发 送 进 程 需 指 定 一 个 有 效 的 目 标 接 收 进 程 -接 收 进 程 需 指 定 一 个 有 效 的 源 发 送 进 程 -接 收 和 发 送 消 息 的 进 程 要 在 同 一 个 通 信 域 内 -接 收 和 发 送 消 息 的 tag要 相 同 -接 收 缓 冲 区 要 足 够 大 编 写 安 全 的 MPI程 序发 送 和 接 收 是 成 对 出 现 的 , 如 果 通 信 调 用 的顺 序 使 用 不 当 , 很 容 易 造 成 死 锁 。 如 下 程 序总 会 死 锁 。 ACBD 编 写 安 全 的 MPI程 序 进 程 0的 第 一 条 接 收 语 句 A能 否完 成 取 决 于 进 程 1的 第 二 条 发送 语 句 , 即 A依 赖 于 D。 从 执行 次 序 上 可 以 明 显 地 看 出 , 进程 0和 进 程 1发 送 消 息 的 语 句 C的 执 行 又 依 赖 于 它 前 面 的 接 收语 句 A的 完 成 , 即 C依 赖 于 A。同 时 , 进 程 1的 第 一 条 接 收 语句 B能 否 完 成 取 决 于 进 程 0的 第二 条 发 送 语 句 C的 执 行 , 即 B依 赖 于 C, 从 执 行 次 序 上 可 以明 显 地 看 出 , 向 进 程 0发 送 消息 的 语 句 D的 执 行 又 依 赖 于 B的 完 成 , 故 有 A依 赖 于 D, D又依 赖 于 B, B依 赖 于 A, 形 成 了一 个 环 , 进 程 0和 进 程 1相 互 等待 , 彼 此 都 无 法 执 行 下 去 , 必导 致 死 锁 。 编 写 安 全 的 MPI程 序若 两 个 进 程 需 要 相 互 交 换 数 据 , 在 两 个 进 程 中首 先 都 进 行 接 收 调 用 显 然 是 不 合 适 的 , 那 么 ,同 时 先 进 行 发 送 调 用 的 结 果 又 是 如 何 的 呢 ? ACB D 编 写 安 全 的 MPI程 序 由 于 进 程 0或 进 程 1的 发送 需 要 系 统 提 供 缓 冲 区 ,如 果 缓 冲 区 不 足 , 则 进程 0或 进 程 1的 发 送 将 无法 完 成 , 相 应 的 , 进 程1和 进 程 0的 接 收 也 无 法正 确 完 成 。 显 然 对 于 需要 相 互 交 换 数 据 的 进 程 ,直 接 将 两 个 发 送 语 句 写在 前 面 也 是 不 安 全 的 。 编 写 安 全 的 MPI程 序一 个 安 全 的 通 信 调 用 次 序 , 要 求 两 个 进 程 相 互 交 换数 据 时 , 一 定 要 将 它 们 的 发 送 和 接 收 操 作 按 照 次 序进 行 匹 配 , 即 一 个 进 程 的 发 送 操 作 在 前 , 接 收 操 作在 后 ; 而 另 一 个 进 程 的 接 收 操 作 在 前 , 发 送 操 作 在后 , 前 后 两 个 发 送 和 接 收 操 作 相 互 匹 配 。 ACDB 编 写 安 全 的 MPI程 序 C的 完 成 只 需 要 A完 成 ,而 A的 完 成 只 要 有 对 应 的D存 在 , 则 不 需 要 系 统 提供 缓 冲 区 也 可 以 进 行 , 因此 , A总 能 够 完 成 , 那 么D也 一 定 能 完 成 。 当 A和 D完 成 后 , B的 完 成 只 需 要相 应 的 C, 不 需 要 缓 冲 区也 能 完 成 , 因 此 B和 C也一 定 能 完 成 , 所 以 这 样 的通 信 形 式 是 安 全 的 。 阻 塞 式 点 对 点 通 信标 准 阻 塞 通 信 -是 否 对 发 送 数 据 进 行 缓 存 , 由 MPI系 统 决 定 , 而 非 程 序 员 。 -阻 塞 : 发 送 成 功 , 意 味 : 1) 消 息 被 接 收 完 毕 ; 2) 或 者 消息 被 缓 存 接 收 成 功 , 消 息 已 被 成 功 接 收 。 阻 塞 式 点 对 点 通 信-MPI_Send-MPI_Recv-MPI_Get_count-MPI_Sendrecv-MPI_Sendrecv_replace 阻 塞 式 点 对 点 通 信查 询 接 收 到 的 消 息 长 度 int MPI_Get_count(MPI_Status status, MPI_Datatype datatype, int *count)IN status 接 收 消 息 时 返 回 的 状 态IN datatype 接 收 消 息 时 返 回 的 类 型OUT Count 接 收 消 息 时 数 组 元 素 的 个 数-该 函 数 在 count中 返 回 数 据 类 型 的 个 数 , 即消 息 长 度 。-count属 于 MPI_Status结 构 的 一 个 域 , 但 不能 被 用 户 直 接 访 问 。 阻 塞 式 点 对 点 通 信发送和接收的捆绑MPI_Sendrecv()。即把发送一个消息到一个目的地和从另一个进行接收一个消息合并到一个调用中,源和目的可以是相同的,它可以有效地避免单独书写发送或接收操作时,由于次序的错误而造成的死锁。这是因为该操作是由通信系统来实现,系统会优化通信次序,从而有效地避免不合理的通信次序,最大限度地避免死锁的产生。函数原型为: int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status) IN sendbuf 所要发送消息数据的首地址IN sendcount 发送消息数组元素的个数IN sendtype 发送消息的数据类型IN dest 接收消息的进程编号 IN sendtag 发送消息标签 阻 塞 式 点 对 点 通 信OUT recvbuf 接收消息数据的首地址IN recvcount 接收消息数组元素的最大个数IN recvtype 接收消息的数据类型IN Source 发送消息的进程编号IN recvtag 接收消息标签IN comm 通信子OUT status 接收消息时返回的状态 阻 塞 式 点 对 点 通 信捆绑发送和接收,收发使用同一缓存区int MPI_Sendrecv_replace(void *sendbuf, int count, MPI_Datatype datatype, int dest, int sendtag, int source, int recving, MPI_Comm comm, MPI_Status *status)OUT buf 发送和接收消息数据的首地址IN count 发送和接收消息数组元素的个数IN dest 接收消息的进程编号IN sendtag 发送消息标签IN source 发送消息的进程编号IN recvtag 接收消息标签IN comm 通信子OUT status 接收消息时返回的状态-该操作等价于当前进程先执行一个发送函数再执行一个接收函数;MPI系统保证其消息发出后再接收消息。-MPI_Sendrecv发收使用不同的缓冲区;该函数使用同一缓存区。 阻 塞 式 消 息 发 送 模 式按 着 发 送 方 式 和 接 收 方 状 态 要 求 的 不 同 分 类-四 个 函 数 拥 有 完 全 一 样 的 入 口 参 数-共 用 一 个 标 准 的 消 息 接 受 函 数-发 送 返 回 后 , 发 送 缓 存 区 可 以 被 释 放 或 者 重 新 使用 。 标 准 消 息 发 送 函 数 MPI_Send -发 送 操 作 不 管 接 收 操 作 是 否 启 动 , 都 可 以 开 始 。 -发 送 返 回 的 条 件 : 1) 当 消 息 小 于 MPI系 统 为 每 个 进 程 设 置的 最 大 消 息 缓 存 区 MPI_BUFFER_SIZE, 发 送 数 据 被 MPI系 统缓 存 , 此 时 不 要 求 接 收 操 作 收 到 发 送 数 据 ; 2) 不 缓 存 , 则 数据 被 接 收 到 接 收 缓 存 区 。 缓 存 消 息 发 送 函 数 MPI_Bsend -发 送 操 作 不 管 接 收 操 作 是 否 启 动 , 都 可 以 开 始 。 -进 程 直 接 对 缓 存 区 进 行 控 制 , 用 户 直 接 对 通 信 缓 存 区 进行 申 请 、 使 用 、 翻 译 。 要 求 : 1) 发 送 消 息 前 必 须 有 足 够的 缓 存 可 用 , 否 则 发 送 失 败 ; 2) 缓 存 发 送 返 回 后 , 不 意味 申 请 的 缓 存 区 可 自 由 使 用 , 须 等 待 消 息 发 送 出 去 方 可 。 -优 势 : 发 送 操 作 在 缓 存 了 发 送 数 据 后 , 可 立 刻 返 回 。 缓 存 消 息 发 送 函 数 MPI_Bsend缓 存 区 申 请 : int MPI_Buffer_attach(void *buffer, int size) - OUT buffer 缓 冲 区 初 始 地 址 ; OUT size 以 字 节 为单 位 的 缓 冲 区 大 小 - 可 调 用 MPI_Type_size函 数 来 确 定 数 据 类 型 所 占 字节 数 。 缓 存 区 大 小 =数 据 长 度 +常 数 , 常 数 用 于 MPI系统 管 理 提 交 的 缓 存 区 , 是 必 须 的 。 - 同 一 时 刻 , 一 个 进 程 只 能 定 义 一 个 缓 存 区 , 即 进程 再 定 义 另 一 个 , 需 要 释 放 已 经 定 义 的 。缓 存 区 释 放 : int MPI_Buffer_detach(void *buffer, int size) - 此 函 数 为 阻 塞 式 调 用 , 等 到 该 缓 存 消 息 发 送 后 才 释放 返 回 。 同 步 消 息 发 送 函 数 MPI_Ssend -发 送 操 作 不 管 接 收 操 作 是 否 启 动 , 都 可 以 开 始 。 -发 送 返 回 条 件 , 需 在 标 准 模 式 上 确 认 接 收 方 已 经 开 始 接收 数 据 。 1) 发 送 数 据 被 存 放 系 统 缓 存 区 , 需 接 收 方 开 始接 收 , 发 送 才 能 返 回 ; 2) 发 送 数 据 没 有 被 系 统 缓 存 , 则需 要 消 息 发 送 完 毕 后 , 发 送 才 能 返 回 。 -优 势 : 这 种 模 式 发 送 和 接 收 最 为 安 全 。 就 绪 消 息 发 送 函 数 MPI_Rsend -发 送 操 作 必 须 要 求 接 收 操 作 启 动 , 才 可 开 始 。 1) 启动 接 受 操 作 , 意 味 着 接 收 进 程 正 等 待 接 收 发 送 的 消 息 ;2) 若 发 送 操 作 启 动 而 相 应 接 收 操 作 没 有 启 动 , 发 送 操作 将 出 错 。 -优 势 : 减 少 消 息 发 送 接 收 时 间 开 销 , 可 能 获 得 好 的计 算 性 能 。 阻 塞 式 消 息 发 送 模 式 阻 塞 和 非 阻 塞 点 对 点 通 信 两 种 消 息 传 递 机 制 非 阻 塞 式 点 对 点 通 信 非 阻 塞 式 点 对 点 通 信-MPI_Isend-MPI_Irecv-MPI_Wait-MPI_Probe / MPI_Iprobe -MPI_Request_free- MPI_Cancel- MPI_Test_cancelled 非 阻 塞 式 点 对 点 通 信Int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm,MPI_Request *request)-该 函 数 启 动 接 收 , 并 立 即 返 回 , 并 不 意 味 着 发 送成 功 。-MPI系 统 会 在 后 台 完 成 消 息 发 送-函 数 为 该 发 送 操 作 创 建 了 一 个 请 求 , 描 述 非 阻 塞通 信 状 况 , 通 过 request变 量 返 回 。-request可 供 之 后 查 询 和 等 待 函 数 使 用非 阻 塞 式 发 送 非 阻 塞 式 点 对 点 通 信Int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm,MPI_Request *request)-该 函 数 仅 提 交 了 一 个 消 息 发 送 请 求 , 并 立 即 返 回 ,并 不 意 味 着 接 收 成 功 。-MPI系 统 会 在 后 台 完 成 消 息 接 收-函 数 为 该 接 收 创 建 了 一 个 请 求 , 通 过 request变 量返 回 。-request可 供 之 后 查 询 和 等 待 函 数 使 用非 阻 塞 式 接 收 非 阻 塞 式 点 对 点 通 信Int MPI_Wait(MPI_Request *request, MPI_Status *status)Int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)-MPI_Wait阻 塞 等 待 通 信 函 数 完 成 后 返 回 ; MPI_Test检 测 某 通 信 , 不 论 其 是 否 完 成 , 都 立 即 返 回 , 如 果 通信 完 成 , 则 flag=true-当 等 待 或 检 测 的 通 信 完 成 时 , 通 信 请 求 request被 设 置成 MPI_REQUEST_NULL-考 察 接 收 请 求 , status返 回 与 MPI_Recv一 样 ; 发 送 请求 , 则 不 确 定-MPI_Test返 回 时 , 当 flag=false, status不 被 赋 值等 待 、 检 测 一 个 通 信 请 求 的 完 成 非 阻 塞 式 点 对 点 通 信MPI_Request request;MPI_Status status;int x,y;if(rank = 0) MPI_Isend(else MPI_Irecv(当 request标 识 的 通 信 结 束 后 , MPI_Wait()才 返 回MPI_Wait()应 用 示 例 非 阻 塞 式 点 对 点 通 信MPI_Request request; MPI_Status status;int x,y,flag;if(rank = 0) MPI_Isend(else MPI_Irecv(MPI_Test()应 用 示 例 非 阻 塞 式 点 对 点 通 信Int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses)Int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)-count表 示 通 信 请 求 的 个 数-array_of_requests是 一 组 非 阻 塞 通 信 的 请 求-array_of_status返 回 该 组 通 信 完 成 的 状 态-flag表 示 全 部 通 信 是 否 完 成 , 若 完 成 flag=true-MPI_Testall返 回 时 , 当 flag=false, array_of_statuses不被 赋 值等 待 、 检 测 一 组 通 信 请 求 的 全 部 完 成 非 阻 塞 式 点 对 点 通 信Int MPI_Waitsome(int incount, MPI_Request *array_of_requests, int outcount, int *array_of_indices, MPI_Status *array_of_statuses)Int MPI_Testsome(int incount, MPI_Request *array_of_requests, int outcount, int *array_of_indices, MPI_Status *array_of_statuses)-MPI_Waitsome等 待 至 少 一 个 通 信 完 成 才 返 回-outcount表 示 通 信 成 功 完 成 的 个 数-array_of_indeices存 储 完 成 的 通 信 在 array_of_requests中 的 位 置- array_of_statuses返 回 完 成 通 信 的 状 态 , 其 他 不 被 赋 值-MPI_Testsome返 回 时 若 没 有 一 个 通 信 完 成 , 则 outcount=0- MPI_Testsome返 回 时 , 当 flag=false,array_of_statuses不 被 赋 值等 待 、 检 测 一 组 通 信 请 求 的 部 分 完 成 非 阻 塞 式 点 对 点
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!